include/meltpooldg/level_set/level_set_tools.hpp Source File

Developer Documentation: include/meltpooldg/level_set/level_set_tools.hpp Source File
Developer Documentation
level_set_tools.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <deal.II/base/point.h>
4#include <deal.II/base/vectorization.h>
5
6#include <deal.II/dofs/dof_handler.h>
7
8#include <deal.II/fe/fe_system.h>
9#include <deal.II/fe/mapping.h>
10
11#include <deal.II/grid/tria.h>
12
13#include <deal.II/lac/la_parallel_block_vector.h>
14#include <deal.II/lac/la_parallel_vector.h>
15
17
18#include <functional>
19#include <tuple>
20#include <utility>
21#include <vector>
22
23
25{
32
38 template <typename value_type1, typename value_type2, typename value_type3>
39 inline value_type1
40 interpolate(const value_type1 &ls, const value_type2 &val1, const value_type3 &val2)
41 {
42 return (1. - ls) * val1 + ls * val2;
43 }
44
54 template <typename value_type1, typename value_type2, typename value_type3>
55 inline value_type1
56 interpolate_reciprocal(const value_type1 &ls, const value_type2 &val1, const value_type3 &val2)
57 {
58 // clang-format off
59 return 1.
60 / // --------------------------------
61 ((1. - ls) / val1 + ls / val2);
62 // clang-format on
63 }
64
70 template <typename value_type1, typename value_type2, typename value_type3>
71 inline value_type1
72 interpolate_cubic(const value_type1 &ls, const value_type2 &val1, const value_type3 &val2)
73 {
74 return val1 + (val2 - val1) * (-2. * ls * ls * ls + 3. * ls * ls);
75 }
76
82 template <typename value_type1, typename value_type2, typename value_type3>
83 inline value_type1
84 interpolate_cubic_derivative(const value_type1 &ls,
85 const value_type2 &val1,
86 const value_type3 &val2)
87 {
88 return (val2 - val1) * (-6. * ls * ls + 6. * ls);
89 }
90
116 template <typename number>
117 inline number
118 approximate_distance_from_tanh_level_set(const number phi, const number eps, const number cutoff)
119 {
120 if (std::abs(phi) < cutoff)
121 return eps * std::log((1. + phi) / (1. - phi));
122 else if (phi >= cutoff)
123 return eps * std::log((1. + cutoff) / (1. - cutoff));
124 else /*( phi <= -cutoff )*/
125 return -eps * std::log((1. + cutoff) / (1. - cutoff));
126 }
127
128
134 template <typename number>
135 dealii::LinearAlgebra::distributed::Vector<number>
136 merge_two_indicator_fields(const dealii::LinearAlgebra::distributed::Vector<number> &indicator_1,
137 const dealii::LinearAlgebra::distributed::Vector<number> &indicator_2,
139 const number indicator_value_interior = 1.0,
140 const number indicator_value_exterior = -1.0);
141
179 template <int dim, typename number>
180 void
182 std::vector<std::pair<std::pair<unsigned int, unsigned int>, std::vector<dealii::Point<dim>>>>
183 &surface_cells_and_unit_points,
184 std::vector<dealii::Point<dim>> &surface_points,
185 const dealii::DoFHandler<dim> &dof_handler,
186 const dealii::Mapping<dim> &mapping,
187 const dealii::LinearAlgebra::distributed::Vector<number> &level_set_vector,
188 const number contour_value = 0.0,
189 const unsigned int n_subdivisions = 1,
190 const number tolerance = 1e-10);
191
247 template <int dim, typename number>
248 void
249 evaluate_at_interface(const dealii::DoFHandler<dim> &dof_handler,
250 const dealii::Mapping<dim> &mapping,
251 const dealii::LinearAlgebra::distributed::Vector<number> &level_set_vector,
252 const std::function<void(
253 const typename dealii::DoFHandler<dim>::active_cell_iterator & /*cell*/,
254 const std::vector<dealii::Point<dim>> & /*quadrature_points_real*/,
255 const std::vector<dealii::Point<dim>> & /*quadrature_points_reference*/,
256 const std::vector<number> & /*JxW*/)> &evaluate_at_interface_points,
257 const number contour_value = 0.0,
258 const unsigned int n_subdivisions = 1,
259 const number tolerance = 1e-10,
260 const bool use_mca = true);
261
300 template <int dim, typename number>
301 std::vector<std::tuple<const typename dealii::Triangulation<dim, dim>::cell_iterator /*cell*/,
302 std::vector<dealii::Point<dim>> /*unit_points*/,
303 std::vector<number> /*weights*/
304 >>
305 generate_surface_mesh_info(const dealii::DoFHandler<dim> &dof_handler,
306 const dealii::Mapping<dim> &mapping,
307 const dealii::LinearAlgebra::distributed::Vector<number> &level_set,
308 const number contour_value = 0.0,
309 const unsigned int n_subdivisions = 1,
310 const number tolerance = 1e-10,
311 const bool use_mca = true);
312
323 template <int dim, typename number>
324 void
326 std::vector<dealii::Point<dim>> &global_points_normal_to_interface,
327 std::vector<unsigned int> &global_points_normal_to_interface_pointer,
328 const dealii::DoFHandler<dim> &dof_handler_ls,
329 const dealii::FESystem<dim> &fe_normal,
330 const dealii::Mapping<dim> &mapping,
331 const dealii::LinearAlgebra::distributed::Vector<number> &level_set_vector,
332 const dealii::LinearAlgebra::distributed::BlockVector<number> &normal_vector,
333 const number max_distance_per_side,
334 const unsigned int n_inc_per_side,
335 const bool bidirectional = true,
336 const number contour_value = 0.0,
337 const unsigned int n_subdivisions_MCA = 1);
338
349 template <int dim, typename number>
350 void
352 const ScratchData<dim, dim, number> &scratch_data,
353 const unsigned int ls_dof_idx,
354 const dealii::LinearAlgebra::distributed::Vector<number> &level_set_heaviside,
355 const number lower_threshold = 0.5);
356
357 template <typename number>
358 dealii::VectorizedArray<number>
359 compute_mask_narrow_band(const dealii::VectorizedArray<number> &val,
360 const number narrow_band_threshold)
361 {
362 dealii::VectorizedArray<number> indicator = 1.0;
363 for (unsigned int v = 0; v < dealii::VectorizedArray<number>::size(); ++v)
364 if (std::abs(val[v]) >= narrow_band_threshold)
365 indicator[v] = 0.0;
366
367 return indicator;
368 }
369} // namespace MeltPoolDG::LevelSet::Tools
Container for shared scratch data between operations/operators.
Definition scratch_data.hpp:61
Definition level_set_tools.hpp:25
value_type1 interpolate_reciprocal(const value_type1 &ls, const value_type2 &val1, const value_type3 &val2)
Definition level_set_tools.hpp:56
value_type1 interpolate_cubic_derivative(const value_type1 &ls, const value_type2 &val1, const value_type3 &val2)
Definition level_set_tools.hpp:84
void collect_interface_cells_and_intersection_points(std::vector< std::pair< std::pair< unsigned int, unsigned int >, std::vector< dealii::Point< dim > > > > &surface_cells_and_unit_points, std::vector< dealii::Point< dim > > &surface_points, const dealii::DoFHandler< dim > &dof_handler, const dealii::Mapping< dim > &mapping, const dealii::LinearAlgebra::distributed::Vector< number > &level_set_vector, const number contour_value=0.0, const unsigned int n_subdivisions=1, const number tolerance=1e-10)
Identifies volume cells intersected by a level set and extracts the corresponding quadrature points a...
Definition level_set_tools.cpp:113
dealii::LinearAlgebra::distributed::Vector< number > merge_two_indicator_fields(const dealii::LinearAlgebra::distributed::Vector< number > &indicator_1, const dealii::LinearAlgebra::distributed::Vector< number > &indicator_2, BooleanType type=BooleanType::Union, const number indicator_value_interior=1.0, const number indicator_value_exterior=-1.0)
Definition level_set_tools.cpp:54
dealii::VectorizedArray< number > compute_mask_narrow_band(const dealii::VectorizedArray< number > &val, const number narrow_band_threshold)
Definition level_set_tools.hpp:359
number approximate_distance_from_tanh_level_set(const number phi, const number eps, const number cutoff)
Computes an approximate signed distance from a hyperbolic tangent level-set value.
Definition level_set_tools.hpp:118
value_type1 interpolate(const value_type1 &ls, const value_type2 &val1, const value_type3 &val2)
Definition level_set_tools.hpp:40
void set_material_id_from_level_set(const ScratchData< dim, dim, number > &scratch_data, const unsigned int ls_dof_idx, const dealii::LinearAlgebra::distributed::Vector< number > &level_set_heaviside, const number lower_threshold=0.5)
Definition level_set_tools.cpp:610
BooleanType
Definition level_set_tools.hpp:27
@ Subtraction
Definition level_set_tools.hpp:30
@ Intersection
Definition level_set_tools.hpp:29
@ Union
Definition level_set_tools.hpp:28
std::vector< std::tuple< const typename dealii::Triangulation< dim, dim >::cell_iterator, std::vector< dealii::Point< dim > >, std::vector< number > > > generate_surface_mesh_info(const dealii::DoFHandler< dim > &dof_handler, const dealii::Mapping< dim > &mapping, const dealii::LinearAlgebra::distributed::Vector< number > &level_set, const number contour_value=0.0, const unsigned int n_subdivisions=1, const number tolerance=1e-10, const bool use_mca=true)
Generates surface mesh data corresponding to an implicit interface.
Definition level_set_tools.cpp:426
void evaluate_at_interface(const dealii::DoFHandler< dim > &dof_handler, const dealii::Mapping< dim > &mapping, const dealii::LinearAlgebra::distributed::Vector< number > &level_set_vector, const std::function< void(const typename dealii::DoFHandler< dim >::active_cell_iterator &, const std::vector< dealii::Point< dim > > &, const std::vector< dealii::Point< dim > > &, const std::vector< number > &)> &evaluate_at_interface_points, const number contour_value=0.0, const unsigned int n_subdivisions=1, const number tolerance=1e-10, const bool use_mca=true)
Evaluates user-defined quantities at an implicitly defined interface.
Definition level_set_tools.cpp:209
value_type1 interpolate_cubic(const value_type1 &ls, const value_type2 &val1, const value_type3 &val2)
Definition level_set_tools.hpp:72
void generate_points_along_normal(std::vector< dealii::Point< dim > > &global_points_normal_to_interface, std::vector< unsigned int > &global_points_normal_to_interface_pointer, const dealii::DoFHandler< dim > &dof_handler_ls, const dealii::FESystem< dim > &fe_normal, const dealii::Mapping< dim > &mapping, const dealii::LinearAlgebra::distributed::Vector< number > &level_set_vector, const dealii::LinearAlgebra::distributed::BlockVector< number > &normal_vector, const number max_distance_per_side, const unsigned int n_inc_per_side, const bool bidirectional=true, const number contour_value=0.0, const unsigned int n_subdivisions_MCA=1)
Definition level_set_tools.cpp:458