include/meltpooldg/level_set/signed_distance_solver.hpp Source File

Developer Documentation: include/meltpooldg/level_set/signed_distance_solver.hpp Source File
Developer Documentation
signed_distance_solver.hpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) 2025-2026 The Lethe Authors
2// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception OR LGPL-2.1-or-later
3
4#pragma once
5#include <deal.II/base/bounding_box.h>
6#include <deal.II/base/conditional_ostream.h>
7#include <deal.II/base/function.h>
8#include <deal.II/base/point.h>
9#include <deal.II/base/quadrature_lib.h>
10#include <deal.II/base/table_handler.h>
11#include <deal.II/base/tensor.h>
12#include <deal.II/base/utilities.h>
13
14#include <deal.II/dofs/dof_handler.h>
15#include <deal.II/dofs/dof_tools.h>
16
17#include <deal.II/fe/fe.h>
18#include <deal.II/fe/fe_q.h>
19#include <deal.II/fe/fe_tools.h>
20#include <deal.II/fe/mapping_q.h>
21
22#include <deal.II/grid/grid_tools.h>
23#include <deal.II/grid/tria.h>
24
25#include <deal.II/hp/fe_collection.h>
26#include <deal.II/hp/q_collection.h>
27
28#include <deal.II/lac/affine_constraints.h>
29#include <deal.II/lac/la_parallel_vector.h>
30#include <deal.II/lac/lapack_full_matrix.h>
31#include <deal.II/lac/vector.h>
32
33#include <deal.II/matrix_free/fe_point_evaluation.h>
34
35#include <deal.II/non_matching/fe_immersed_values.h>
36#include <deal.II/non_matching/fe_values.h>
37#include <deal.II/non_matching/mesh_classifier.h>
38#include <deal.II/non_matching/quadrature_generator.h>
39
40#include <deal.II/numerics/data_out.h>
41#include <deal.II/numerics/vector_tools.h>
42
43#include <algorithm>
44#include <cmath>
45#include <fstream>
46#include <iostream>
47#include <map>
48#include <memory>
49#include <optional>
50#include <set>
51#include <string>
52#include <vector>
53
55{
59 enum class Verbosity
60 {
61 quiet,
63 };
64
74 template <typename T>
75 [[nodiscard]] constexpr int
76 sgn(const T val) noexcept
77 {
78 return (static_cast<T>(0) < val) - (val < static_cast<T>(0));
79 }
80
88 inline void
89 announce_string(const dealii::ConditionalOStream &pcout,
90 const std::string &expression,
91 const char delimiter = '-')
92 {
93 pcout << std::string(expression.size() + 1, delimiter) << std::endl;
94 pcout << expression << std::endl;
95 pcout << std::string(expression.size() + 1, delimiter) << std::endl;
96 }
97
112 template <int dim>
113 inline double
114 compute_cell_diameter(const double cell_measure, const unsigned int fe_degree)
115 {
116 if constexpr (dim == 2)
117 return std::sqrt(4. * cell_measure / dealii::numbers::PI) / fe_degree;
118 else if constexpr (dim == 3)
119 return std::cbrt(6. * cell_measure / dealii::numbers::PI) / fe_degree;
120 else
121 AssertThrow(false, dealii::ExcMessage("Only dim=2 and dim=3 are supported."));
122 return 0.0;
123 }
124
138 template <int dim>
139 void
141 const dealii::DoFHandler<dim> &dof_handler,
142 std::map<unsigned int, std::set<typename dealii::DoFHandler<dim>::active_cell_iterator>>
143 &vertices_cell_map)
144 {
145 vertices_cell_map.clear();
146 for (const auto &cell : dof_handler.active_cell_iterators())
147 if (cell->is_locally_owned() || cell->is_ghost())
148 for (unsigned int i = 0; i < dealii::GeometryInfo<dim>::vertices_per_cell; ++i)
149 vertices_cell_map[cell->vertex_index(i)].insert(cell);
150 }
151
163 template <int dim>
164 std::vector<typename dealii::DoFHandler<dim>::active_cell_iterator>
166 std::map<unsigned int, std::set<typename dealii::DoFHandler<dim>::active_cell_iterator>>
167 &vertices_cell_map,
168 const typename dealii::DoFHandler<dim>::active_cell_iterator &cell)
169 {
170 std::set<typename dealii::DoFHandler<dim>::active_cell_iterator> neighbors_cells;
171 for (unsigned int i = 0; i < dealii::GeometryInfo<dim>::vertices_per_cell; ++i)
172 {
173 const unsigned int v_index = cell->vertex_index(i);
174 neighbors_cells.insert(vertices_cell_map[v_index].begin(),
175 vertices_cell_map[v_index].end());
176 }
177
178 return {neighbors_cells.begin(), neighbors_cells.end()};
179 }
180
198 template <int dim>
199 double
200 find_point_triangle_distance(const std::vector<dealii::Point<dim>> &triangle,
201 const dealii::Point<dim> &point)
202 {
203 double distance = 0.0;
204
205 const dealii::Point<dim> &point_0 = triangle[0];
206 const dealii::Point<dim> &point_1 = triangle[1];
207
208 if constexpr (dim == 3)
209 {
210 const dealii::Point<dim> &point_2 = triangle[2];
211
212 const dealii::Tensor<1, dim> e_0 = point_1 - point_0;
213 const dealii::Tensor<1, dim> e_1 = point_2 - point_0;
214
215 const double a = e_0.norm_square();
216 const double b = scalar_product(e_0, e_1);
217 const double c = e_1.norm_square();
218 const double det = a * c - b * b;
219
220 const dealii::Tensor<1, dim> vector_to_plane = point_0 - point;
221
222 const double d = scalar_product(e_0, vector_to_plane);
223 const double e = scalar_product(e_1, vector_to_plane);
224
225 double s = b * e - c * d;
226 double t = b * d - a * e;
227
228 if (s + t <= det)
229 {
230 if (s < 0)
231 {
232 if (t < 0)
233 {
234 if (d < 0)
235 {
236 t = 0;
237 if (-d >= a)
238 s = 1;
239 else
240 s = -d / a;
241 }
242 else
243 {
244 s = 0;
245 if (e >= 0)
246 t = 0;
247 else if (-e >= c)
248 t = 1;
249 else
250 t = e / c;
251 }
252 }
253 else
254 {
255 s = 0;
256 if (e >= 0)
257 t = 0;
258 else if (-e >= c)
259 t = 1;
260 else
261 t = -e / c;
262 }
263 }
264 else if (t < 0)
265 {
266 t = 0;
267 if (d >= 0)
268 s = 0;
269 else if (-d >= a)
270 s = 1;
271 else
272 s = -d / a;
273 }
274 else
275 {
276 const double inv_det = 1. / det;
277 s *= inv_det;
278 t *= inv_det;
279 }
280 }
281 else
282 {
283 if (s < 0)
284 {
285 const double tmp0 = b + d;
286 const double tmp1 = c + e;
287 if (tmp1 > tmp0)
288 {
289 const double numer = tmp1 - tmp0;
290 const double denom = a - 2 * b + c;
291 if (numer >= denom)
292 s = 1;
293 else
294 s = numer / denom;
295 t = 1 - s;
296 }
297 else
298 {
299 s = 0;
300 if (tmp1 <= 0)
301 t = 1;
302 else if (e >= 0)
303 t = 0;
304 else
305 t = -e / c;
306 }
307 }
308 else if (t < 0)
309 {
310 const double tmp0 = b + e;
311 const double tmp1 = a + d;
312 if (tmp1 > tmp0)
313 {
314 const double numer = tmp1 - tmp0;
315 const double denom = a - 2 * b + c;
316 if (numer >= denom)
317 t = 1;
318 else
319 t = numer / denom;
320 s = 1 - t;
321 }
322 else
323 {
324 t = 0;
325 if (tmp1 <= 0)
326 s = 1;
327 else if (d >= 0)
328 s = 0;
329 else
330 s = -d / a;
331 }
332 }
333 else
334 {
335 const double numer = (c + e) - (b + d);
336 if (numer <= 0)
337 s = 0;
338 else
339 {
340 const double denom = a - 2 * b + c;
341 if (numer >= denom)
342 s = 1;
343 else
344 s = numer / denom;
345 }
346 t = 1 - s;
347 }
348 }
349
350 const dealii::Point<dim> pt_in_triangle = point_0 + s * e_0 + t * e_1;
351 distance = pt_in_triangle.distance(point);
352 }
353
354 if constexpr (dim == 2)
355 {
356 const dealii::Tensor<1, dim> d = point_1 - point_0;
357 const double t_bar = d * (point - point_0) / (d.norm() * d.norm() + 1e-12);
358
359 if (t_bar <= 0.0)
360 distance = (point - point_0).norm();
361 else if (t_bar >= 1.0)
362 distance = (point - point_1).norm();
363 else
364 distance = (point - (point_0 + t_bar * d)).norm();
365 }
366
367 return distance;
368 }
369
380 template <int dim,
381 typename VectorType = dealii::Vector<double>,
382 typename FEType = dealii::FE_Q<dim>>
383 class CellWiseFunction : public dealii::Function<dim>
384 {
385 public:
392 CellWiseFunction(const unsigned int p_fe_degree)
393 : fe(p_fe_degree)
394 , n_cell_wise_dofs(fe.dofs_per_cell)
395 {}
396
402 void
403 set_active_cell(const VectorType &in_local_dof_values)
404 {
405 cell_dof_values = in_local_dof_values;
406 }
407
416 double
417 value(const dealii::Point<dim> &point, const unsigned int component = 0) const override
418 {
419 double value = 0.;
420 for (unsigned int i = 0; i < n_cell_wise_dofs; ++i)
421 value += cell_dof_values[i] * fe.shape_value_component(i, point, component);
422 return value;
423 }
424
435 dealii::Tensor<1, dim>
436 gradient(const dealii::Point<dim> &point, const unsigned int component = 0) const override
437 {
438 dealii::Tensor<1, dim> gradient;
439 for (unsigned int i = 0; i < n_cell_wise_dofs; ++i)
440 gradient += cell_dof_values[i] * fe.shape_grad_component(i, point, component);
441 return gradient;
442 }
443
454 dealii::SymmetricTensor<2, dim>
455 hessian(const dealii::Point<dim> &point, const unsigned int component = 0) const override
456 {
457 dealii::Tensor<2, dim> hessian;
458 for (unsigned int i = 0; i < n_cell_wise_dofs; ++i)
459 hessian += cell_dof_values[i] * fe.shape_grad_grad_component(i, point, component);
460 return symmetrize(hessian);
461 }
462
463 private:
465 FEType fe;
467 unsigned int n_cell_wise_dofs;
469 VectorType cell_dof_values;
470 };
471
491 template <int dim>
492 double
493 compute_cell_wise_volume(dealii::FEPointEvaluation<1, dim> &fe_point_evaluation,
494 const typename dealii::DoFHandler<dim>::active_cell_iterator &cell,
495 dealii::Vector<double> cell_dof_level_set_values,
496 const double corr,
497 const unsigned int n_quad_points);
498
517 template <int dim, typename VectorType>
518 std::pair<double, double>
519 integrate_volume_and_surface(const dealii::DoFHandler<dim> &dof_handler,
520 const dealii::FiniteElement<dim> &fe,
521 const VectorType &level_set_vector_relevant_copy);
522
544 template <int dim, typename VectorType>
545 std::pair<double, double>
546 integrate_volume_and_surface(const dealii::DoFHandler<dim> &dof_handler,
547 const dealii::FiniteElement<dim> &fe,
548 const VectorType &level_set_vector,
549 const double iso_level);
550
573 template <int dim, typename VectorType>
574 void
576 const dealii::Mapping<dim> &mapping,
577 const dealii::DoFHandler<dim> &dof_handler,
578 const dealii::FiniteElement<dim> &fe,
579 const VectorType &level_set_vector,
580 const double iso_level,
581 const int mca_n_subdivisions,
582 std::map<dealii::types::global_cell_index, std::vector<dealii::Point<dim>>>
583 &interface_reconstruction_vertices,
584 std::map<dealii::types::global_cell_index,
585 std::vector<dealii::CellData<dim == 1 ? 1 : dim - 1>>> &interface_reconstruction_cells,
586 std::set<dealii::types::global_dof_index> &intersected_dofs);
587
596 template <int dim>
597 class InterfaceReconstructionDataOut : public dealii::DataOutInterface<0, dim>
598 {
599 public:
607 void
608 build_patches(const std::map<dealii::types::global_cell_index, std::vector<dealii::Point<dim>>>
609 &interface_reconstruction_vertices)
610 {
611 for (const auto &cell : interface_reconstruction_vertices)
612 for (const dealii::Point<dim> &vertex : cell.second)
613 {
614 dealii::DataOutBase::Patch<0, dim> patch;
615 patch.vertices[0] = vertex;
616 patches.push_back(patch);
617 }
618 }
619
620 private:
624 const std::vector<dealii::DataOutBase::Patch<0, dim>> &
625 get_patches() const override
626 {
627 return patches;
628 }
629
633 std::vector<std::string>
634 get_dataset_names() const override
635 {
636 return dataset_names;
637 }
638
640 std::vector<dealii::DataOutBase::Patch<0, dim>> patches;
642 std::vector<std::string> dataset_names;
643 };
644
656 template <int dim, typename VectorType = dealii::LinearAlgebra::distributed::Vector<double>>
658 {
659 public:
674 std::shared_ptr<dealii::parallel::DistributedTriangulationBase<dim>> background_triangulation,
675 const dealii::FiniteElement<dim> &background_fe,
676 const double p_max_distance,
677 const double p_iso_level,
678 const double p_scaling = 1.0,
679 const Verbosity p_verbosity = Verbosity::quiet);
680
692 SignedDistanceSolver(const dealii::DoFHandler<dim> &background_dof_handler,
693 const double p_max_distance,
694 const double p_iso_level,
695 const double p_scaling = 1.0,
696 const Verbosity p_verbosity = Verbosity::quiet);
697
701 void
702 setup_dofs();
703
712 void
713 set_level_set_from_background_mesh(const dealii::DoFHandler<dim> &background_dof_handler,
714 const VectorType &background_level_set_vector);
715
720 void
721 solve();
722
729 VectorType &
731
738 const VectorType &
739 get_signed_distance() const;
740
746 const dealii::DoFHandler<dim> &
748 {
749 return *dof_handler;
750 }
751
758 void
759 output_interface_reconstruction(const std::string &filename) const;
760
761 private:
766 void
767 zero_out_ghost_values() const;
768
773 void
774 update_ghost_values() const;
775
780 void
782
786 void
788
793 void
795
800 void
802
807 void
809
814 void
816
821 void
823
827 inline void
829
833 inline void
835
843 inline void
844 get_face_opposite_dofs(unsigned int local_face_id,
845 std::vector<unsigned int> &local_opposite_dofs) const;
846
853 inline void
854 get_face_local_dofs(unsigned int local_face_id, std::vector<unsigned int> &local_dofs) const;
855
866 inline void
868 const dealii::DerivativeForm<1, dim, dim> &cell_transformation_jac,
869 const unsigned int local_face_id,
870 dealii::LAPACKFullMatrix<double> &face_transformation_jac) const;
871
880 inline dealii::Point<dim>
881 transform_ref_face_point_to_ref_cell(const dealii::Point<dim - 1> &x_ref_face,
882 const unsigned int local_face_id) const;
883
893 inline void
894 compute_residual(const dealii::Tensor<1, dim> &x_n_to_x_I_real,
895 const dealii::Tensor<1, dim> &distance_gradient,
896 const dealii::LAPACKFullMatrix<double> &transformation_jac,
897 dealii::Tensor<1, dim - 1> &residual_ref) const;
898
908 inline dealii::Tensor<1, dim>
909 transform_ref_face_correction_to_ref_cell(const dealii::Vector<double> &correction_ref_face,
910 const unsigned int local_face_id) const;
911
922 inline void
923 compute_analytical_jacobian(const dealii::Tensor<1, dim> &x_n_to_x_I_real_p1,
924 const dealii::LAPACKFullMatrix<double> &transformation_jacobian,
925 const std::vector<double> &face_local_dof_values,
926 dealii::LAPACKFullMatrix<double> &jacobian_matrix);
927
936 inline double
937 compute_distance(const dealii::Tensor<1, dim> &x_n_to_x_I_real, const double distance) const
938 {
939 return distance + x_n_to_x_I_real.norm();
940 }
945 std::unique_ptr<dealii::FiniteElement<dim>> fe;
947 std::unique_ptr<dealii::DoFHandler<dim>> owned_dof_handler;
948
950 const dealii::DoFHandler<dim> *dof_handler = nullptr;
952 std::unique_ptr<dealii::MappingQ<dim>> mapping;
953
955 const double max_distance;
957 const double iso_level;
959 const double scaling;
962
964 dealii::ConditionalOStream pcout;
966 dealii::IndexSet locally_owned_dofs;
968 dealii::IndexSet locally_relevant_dofs;
970 dealii::IndexSet locally_active_dofs;
971
973 VectorType level_set;
975 VectorType signed_distance;
979 VectorType distance;
984
985 std::map<dealii::types::global_cell_index, std::vector<dealii::Point<dim>>>
987 std::map<dealii::types::global_cell_index,
988 std::vector<dealii::CellData<dim == 1 ? 1 : dim - 1>>>
991 std::set<dealii::types::global_dof_index> intersected_dofs;
992
994 std::map<unsigned int, std::vector<unsigned int>> face_opposite_dofs_map;
996 std::map<unsigned int, std::vector<unsigned int>> face_dofs_map;
997
999 std::unique_ptr<dealii::AffineConstraints<double>> constraints;
1000 };
1001} // namespace MeltPoolDG::LevelSet
Scalar function defined by the DoF values of a single cell.
Definition signed_distance_solver.hpp:384
unsigned int n_cell_wise_dofs
Number of DoFs per element.
Definition signed_distance_solver.hpp:467
double value(const dealii::Point< dim > &point, const unsigned int component=0) const override
Return the value of the function at a point in the reference cell.
Definition signed_distance_solver.hpp:417
dealii::Tensor< 1, dim > gradient(const dealii::Point< dim > &point, const unsigned int component=0) const override
Return the gradient of the specified component at a point in the reference cell.
Definition signed_distance_solver.hpp:436
VectorType cell_dof_values
Value of the field at the DoFs of the active cell.
Definition signed_distance_solver.hpp:469
dealii::SymmetricTensor< 2, dim > hessian(const dealii::Point< dim > &point, const unsigned int component=0) const override
Return the Hessian of the specified component at a point in the reference cell.
Definition signed_distance_solver.hpp:455
void set_active_cell(const VectorType &in_local_dof_values)
Set the active cell values used for subsequent evaluations.
Definition signed_distance_solver.hpp:403
FEType fe
Finite element discretizing the field of interest.
Definition signed_distance_solver.hpp:465
CellWiseFunction(const unsigned int p_fe_degree)
Constructor.
Definition signed_distance_solver.hpp:392
Interface to build patches of the interface reconstruction vertices for visualization.
Definition signed_distance_solver.hpp:598
void build_patches(const std::map< dealii::types::global_cell_index, std::vector< dealii::Point< dim > > > &interface_reconstruction_vertices)
Build patches from interface reconstruction vertices for visualization.
Definition signed_distance_solver.hpp:608
const std::vector< dealii::DataOutBase::Patch< 0, dim > > & get_patches() const override
Implementation of the corresponding function of the base class.
Definition signed_distance_solver.hpp:625
std::vector< dealii::DataOutBase::Patch< 0, dim > > patches
Output information filled by build_patches() and written by the base class.
Definition signed_distance_solver.hpp:640
std::vector< std::string > dataset_names
List of field names for all data components stored in patches.
Definition signed_distance_solver.hpp:642
std::vector< std::string > get_dataset_names() const override
Implementation of the corresponding function of the base class.
Definition signed_distance_solver.hpp:634
Solver to compute the signed distance from a given level of a level-set field.
Definition signed_distance_solver.hpp:658
void setup_dofs()
Initialize the degrees of freedom and associated memory.
Definition signed_distance_solver.cpp:224
bool is_external_dof_handler
Definition signed_distance_solver.hpp:943
dealii::Tensor< 1, dim > transform_ref_face_correction_to_ref_cell(const dealii::Vector< double > &correction_ref_face, const unsigned int local_face_id) const
Transform a Newton correction from the reference face to the reference cell.
Definition signed_distance_solver.cpp:510
void set_face_opposite_dofs_map()
Set the map of local ids of opposite DoFs for each face.
Definition signed_distance_solver.cpp:388
SignedDistanceSolver(const dealii::DoFHandler< dim > &background_dof_handler, const double p_max_distance, const double p_iso_level, const double p_scaling=1.0, const Verbosity p_verbosity=Verbosity::quiet)
Constructor.
std::map< unsigned int, std::vector< unsigned int > > face_dofs_map
Map from face ids to local ids of face DoFs.
Definition signed_distance_solver.hpp:996
void get_face_transformation_jacobian(const dealii::DerivativeForm< 1, dim, dim > &cell_transformation_jac, const unsigned int local_face_id, dealii::LAPACKFullMatrix< double > &face_transformation_jac) const
Return the face transformation Jacobian.
Definition signed_distance_solver.cpp:452
const double scaling
Scaling factor applied to the input level-set field.
Definition signed_distance_solver.hpp:959
void set_face_dofs_map()
Set the map of local ids of face DoFs for each face.
Definition signed_distance_solver.cpp:411
std::set< dealii::types::global_dof_index > intersected_dofs
Set of DoFs belonging to intersected cells.
Definition signed_distance_solver.hpp:991
std::map< dealii::types::global_cell_index, std::vector< dealii::CellData< dim==1 ? 1 :dim - 1 > > > interface_reconstruction_cells
Definition signed_distance_solver.hpp:989
VectorType distance
Solution vector of the unsigned distance without ghost values.
Definition signed_distance_solver.hpp:979
void conserve_global_volume()
Correct the global volume to match the volume enclosed by the given level of the level-set field.
Definition signed_distance_solver.cpp:1096
void update_ghost_values() const
Update ghost DoF entries of solution vectors to gain read access to ghost elements.
Definition signed_distance_solver.cpp:362
void compute_signed_distance_from_distance()
Compute signed_distance from the unsigned distance and the sign of the signed-distance entries.
Definition signed_distance_solver.cpp:978
void compute_first_neighbors_distance()
Compute brute-force geometric distances between the reconstructed interface and DoFs of intersected c...
Definition signed_distance_solver.cpp:587
void get_face_local_dofs(unsigned int local_face_id, std::vector< unsigned int > &local_dofs) const
Return the local ids of the DoFs located on a given face.
Definition signed_distance_solver.cpp:443
std::unique_ptr< dealii::FiniteElement< dim > > fe
Finite element discretizing the signed distance problem.
Definition signed_distance_solver.hpp:945
void output_interface_reconstruction(const std::string &filename) const
Output the interface reconstruction used for signed distance computations.
Definition signed_distance_solver.cpp:1189
VectorType volume_correction
Correction applied to match the cell-wise volume enclosed by the level set.
Definition signed_distance_solver.hpp:983
void initialize_distance()
Initialize the distance vectors to the maximum distance.
Definition signed_distance_solver.cpp:312
dealii::IndexSet locally_active_dofs
Set of locally active DoFs.
Definition signed_distance_solver.hpp:970
std::unique_ptr< dealii::DoFHandler< dim > > owned_dof_handler
DoFHandler describing the signed distance problem.
Definition signed_distance_solver.hpp:947
void set_level_set_from_background_mesh(const dealii::DoFHandler< dim > &background_dof_handler, const VectorType &background_level_set_vector)
Set the level-set field from the background mesh solver.
Definition signed_distance_solver.cpp:255
const double max_distance
Maximum redistancing distance.
Definition signed_distance_solver.hpp:955
VectorType signed_distance_with_ghost
Solution vector of the signed distance with ghost values.
Definition signed_distance_solver.hpp:977
void compute_second_neighbors_distance()
Compute marching-method geometric distances between the reconstructed interface and remaining DoFs.
Definition signed_distance_solver.cpp:628
VectorType signed_distance
Solution vector of the signed distance without ghost values.
Definition signed_distance_solver.hpp:975
void solve()
Solve for the signed distance from the given level of the level-set vector.
Definition signed_distance_solver.cpp:275
VectorType & get_signed_distance()
Get the computed signed distance field.
Definition signed_distance_solver.cpp:327
VectorType level_set
Level-set field coming from the background solver.
Definition signed_distance_solver.hpp:973
std::map< unsigned int, std::vector< unsigned int > > face_opposite_dofs_map
Map from face ids to local ids of opposite DoFs.
Definition signed_distance_solver.hpp:994
void compute_residual(const dealii::Tensor< 1, dim > &x_n_to_x_I_real, const dealii::Tensor< 1, dim > &distance_gradient, const dealii::LAPACKFullMatrix< double > &transformation_jac, dealii::Tensor< 1, dim - 1 > &residual_ref) const
Compute the residual of the distance minimization problem in the reference face space.
Definition signed_distance_solver.cpp:493
void compute_analytical_jacobian(const dealii::Tensor< 1, dim > &x_n_to_x_I_real_p1, const dealii::LAPACKFullMatrix< double > &transformation_jacobian, const std::vector< double > &face_local_dof_values, dealii::LAPACKFullMatrix< double > &jacobian_matrix)
Compute the analytical Jacobian of the distance minimization problem in the reference face space.
Definition signed_distance_solver.cpp:531
void zero_out_ghost_values() const
Zero the ghost DoF entries of solution vectors to gain write access to ghost elements.
Definition signed_distance_solver.cpp:351
void get_face_opposite_dofs(unsigned int local_face_id, std::vector< unsigned int > &local_opposite_dofs) const
Return the local ids of DoFs opposite to a given face.
Definition signed_distance_solver.cpp:434
SignedDistanceSolver(std::shared_ptr< dealii::parallel::DistributedTriangulationBase< dim > > background_triangulation, const dealii::FiniteElement< dim > &background_fe, const double p_max_distance, const double p_iso_level, const double p_scaling=1.0, const Verbosity p_verbosity=Verbosity::quiet)
Constructor.
std::unique_ptr< dealii::AffineConstraints< double > > constraints
Hanging node constraints.
Definition signed_distance_solver.hpp:999
void compute_cell_wise_volume_correction()
Compute the cell-wise volume correction matching the volume enclosed by the given level of the level-...
Definition signed_distance_solver.cpp:993
double compute_distance(const dealii::Tensor< 1, dim > &x_n_to_x_I_real, const double distance) const
Compute the propagated distance d(x_I) = d(x_n) + ||x_I - x_n||.
Definition signed_distance_solver.hpp:937
const dealii::DoFHandler< dim > * dof_handler
Pointer to the DoFHandler describing the signed distance problem (can be fed from external)
Definition signed_distance_solver.hpp:950
const double iso_level
Iso-level describing the interface from which the signed distance is computed.
Definition signed_distance_solver.hpp:957
void exchange_distance()
Exchange the distance field and keep the minimum value across processors with compress(VectorOperatio...
Definition signed_distance_solver.cpp:373
Verbosity verbosity
Verbosity level.
Definition signed_distance_solver.hpp:961
dealii::ConditionalOStream pcout
Parallel output stream.
Definition signed_distance_solver.hpp:964
dealii::IndexSet locally_owned_dofs
Set of locally owned DoFs.
Definition signed_distance_solver.hpp:966
VectorType distance_with_ghost
Solution vector of the unsigned distance with ghost values.
Definition signed_distance_solver.hpp:981
std::unique_ptr< dealii::MappingQ< dim > > mapping
dealii::Mapping between the real and reference spaces.
Definition signed_distance_solver.hpp:952
dealii::IndexSet locally_relevant_dofs
Set of locally relevant DoFs.
Definition signed_distance_solver.hpp:968
std::map< dealii::types::global_cell_index, std::vector< dealii::Point< dim > > > interface_reconstruction_vertices
Definition signed_distance_solver.hpp:986
const dealii::DoFHandler< dim > & get_dof_handler() const
Get the DoFHandler used by the signed distance solver.
Definition signed_distance_solver.hpp:747
dealii::Point< dim > transform_ref_face_point_to_ref_cell(const dealii::Point< dim - 1 > &x_ref_face, const unsigned int local_face_id) const
Transform a point from a reference face to the reference cell.
Definition signed_distance_solver.cpp:473
This operation solves the reinitialization problem for a CG- or DG-FEM-based discrete level-set field...
Definition advection_DG_operation.hpp:20
std::vector< typename dealii::DoFHandler< dim >::active_cell_iterator > find_cells_around_cell(std::map< unsigned int, std::set< typename dealii::DoFHandler< dim >::active_cell_iterator > > &vertices_cell_map, const typename dealii::DoFHandler< dim >::active_cell_iterator &cell)
Find all active cells sharing at least one vertex with a given cell.
Definition signed_distance_solver.hpp:165
double compute_cell_wise_volume(dealii::FEPointEvaluation< 1, dim > &fe_point_evaluation, const typename dealii::DoFHandler< dim >::active_cell_iterator &cell, dealii::Vector< double > cell_dof_level_set_values, const double corr, const unsigned int n_quad_points)
Compute the volume enclosed by the zero level of a level-set field inside a cell.
std::pair< double, double > integrate_volume_and_surface(const dealii::DoFHandler< dim > &dof_handler, const dealii::FiniteElement< dim > &fe, const VectorType &level_set_vector_relevant_copy)
Integrate the surface area of the zero level of a level-set field and the volume enclosed by it.
double compute_cell_diameter(const double cell_measure, const unsigned int fe_degree)
Compute an equivalent cell diameter from a cell measure.
Definition signed_distance_solver.hpp:114
void vertices_cell_mapping(const dealii::DoFHandler< dim > &dof_handler, std::map< unsigned int, std::set< typename dealii::DoFHandler< dim >::active_cell_iterator > > &vertices_cell_map)
Build a map from mesh vertex indices to the active cells that contain them.
Definition signed_distance_solver.hpp:140
Verbosity
Verbosity levels used to control console output.
Definition signed_distance_solver.hpp:60
constexpr int sgn(const T val) noexcept
Return the sign of a value.
Definition signed_distance_solver.hpp:76
double find_point_triangle_distance(const std::vector< dealii::Point< dim > > &triangle, const dealii::Point< dim > &point)
Compute the shortest distance between a point and an interface segment or triangle.
Definition signed_distance_solver.hpp:200
void reconstruct_interface(const dealii::Mapping< dim > &mapping, const dealii::DoFHandler< dim > &dof_handler, const dealii::FiniteElement< dim > &fe, const VectorType &level_set_vector, const double iso_level, const int mca_n_subdivisions, std::map< dealii::types::global_cell_index, std::vector< dealii::Point< dim > > > &interface_reconstruction_vertices, std::map< dealii::types::global_cell_index, std::vector< dealii::CellData< dim==1 ? 1 :dim - 1 > > > &interface_reconstruction_cells, std::set< dealii::types::global_dof_index > &intersected_dofs)
Reconstruct the interface defined by a given level of a level-set field in the domain.
void announce_string(const dealii::ConditionalOStream &pcout, const std::string &expression, const char delimiter='-')
Print a string surrounded by delimiter lines.
Definition signed_distance_solver.hpp:89
dealii::VectorizedArray< number, N > scalar_product(const dealii::VectorizedArray< number, N > &scalar, const dealii::Tensor< 1, 1, dealii::VectorizedArray< number, N > > &vec)
Definition dealii_tensor.hpp:60