include/meltpooldg/level_set/level_set_operation.hpp Source File

Developer Documentation: include/meltpooldg/level_set/level_set_operation.hpp Source File
Developer Documentation
level_set_operation.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <deal.II/grid/tria_iterator.h>
4
5#include <deal.II/lac/generic_linear_algebra.h>
6
16
17
19{
20 /*
21 * Level set model including advection, reinitialization and curvature computation
22 * of the level set function.
23 */
24 template <int dim, typename number>
25 class LevelSetOperation : public LevelSetOperationBase<dim, number>
26 {
27 private:
28 using VectorType = dealii::LinearAlgebra::distributed::Vector<number>;
29 using BlockVectorType = dealii::LinearAlgebra::distributed::BlockVector<number>;
30
32
33 // Time stepping of the overall problem
35 /*
36 * The following objects are the operations, which are performed for solving the
37 * level set equation.
38 */
39 std::shared_ptr<AdvectionDiffusionOperationBase<dim, number>> advec_diff_operation;
40 std::shared_ptr<ReinitializationOperationBase<dim, number>> reinit_operation;
41 std::shared_ptr<CurvatureOperationBase<dim, number>> curvature_operation;
42 /*
43 * necessary parameters
44 */
46 /*
47 * select the relevant DoFHandler
48 */
49 const unsigned int ls_dof_idx;
50 const unsigned int ls_hanging_nodes_dof_idx;
51 const unsigned int ls_quad_idx;
52 const unsigned int curv_dof_idx;
53 const unsigned int reinit_dof_idx;
54 const unsigned int normal_no_bc_dof_idx;
55 const std::array<unsigned int, dim> normal_dof_indices_per_block;
56 /*
57 * The reinitialization of the level set function is a "pseudo"-time-dependent
58 * equation, which is solved up to quasi-steady state. Thus a time iterator is
59 * needed.
60 */
62
64 /*
65 * This is the surface_tension vector calculated after level set and reinitialization
66 * update
67 */
70
71 number max_d_level_set_since_last_reinit = std::numeric_limits<number>::max();
72
73
74 // triangulation info on surface mesh of zero level set contour
76 std::vector<std::tuple<const typename dealii::Triangulation<dim, dim>::cell_iterator /*cell*/,
77 std::vector<dealii::Point<dim>> /*quad_points*/,
78 std::vector<number> /*weights*/
79 >>;
81
82 std::unique_ptr<Tools::NearestPoint<dim, number>> nearest_point_search;
83
84 public:
86 const ScratchData<dim, dim, number> &scratch_data_in,
89 [[maybe_unused]] const TimeIntegration::TimeSteppingData<number> &time_stepping_data,
90 const LevelSetData<number> &ls,
91 const VectorType &advection_velocity,
92 const unsigned int ls_dof_idx_in,
93 const unsigned int ls_hanging_nodes_dof_idx_in,
94 const unsigned int ls_quad_idx_in,
95 const unsigned int reinit_dof_idx_in,
96 const unsigned int curv_dof_idx_in,
97 const std::array<unsigned int, dim> normal_dof_indices_per_block_in,
98 const unsigned int normal_no_bc_dof_idx_in,
99 const unsigned int vel_dof_idx,
100 const unsigned int ls_zero_bc_idx);
101
102 void
104 ScratchData<dim, dim, number> &mutable_scratch_data,
106 const std::map<dealii::types::boundary_id, std::shared_ptr<dealii::Function<dim>>>
107 &ls_dirichlet_bc_in,
108 const std::map<dealii::types::boundary_id, std::shared_ptr<dealii::Function<dim>>>
109 &normal_x_dirichlet_bc_in,
110 const std::map<dealii::types::boundary_id, std::shared_ptr<dealii::Function<dim>>>
111 &normal_y_dirichlet_bc_in,
112 const std::map<dealii::types::boundary_id, std::shared_ptr<dealii::Function<dim>>>
113 &normal_z_dirichlet_bc_in) final;
114
118 void
119 set_initial_condition(const dealii::Function<dim> &initial_field_function_level_set,
120 const bool is_signed_distance_initial_field_function = false) override;
121
122 void
124 const std::map<dealii::types::boundary_id, std::shared_ptr<dealii::Function<dim>>>
125 inflow_outflow_bc) override;
126
138 void
139 set_level_set_user_rhs(const VectorType &level_set_user_rhs) override;
140
149 void
151 std::vector<dealii::types::boundary_id> && /*wetting_bc_ids*/) final;
152
153 void
154 reinit() override;
155
156 void
157 distribute_constraints() override;
158
159 void
160 init_time_advance() override;
161
162 void
163 solve(const bool do_finish_time_step = true) override;
164
165 void
166 finish_time_advance() override;
167
168 void
169 update_normal_vector() override;
170
171 /*
172 * getter functions for solution vectors
173 */
174 const dealii::LinearAlgebra::distributed::Vector<number> &
175 get_curvature() const override;
176
177 dealii::LinearAlgebra::distributed::Vector<number> &
178 get_curvature() override;
179
180 const dealii::LinearAlgebra::distributed::BlockVector<number> &
181 get_normal_vector() const override;
182
183 dealii::LinearAlgebra::distributed::BlockVector<number> &
184 get_normal_vector() override;
185
186 const dealii::LinearAlgebra::distributed::Vector<number> &
187 get_level_set() const override;
188
189 dealii::LinearAlgebra::distributed::Vector<number> &
190 get_level_set() override;
191
192 const dealii::LinearAlgebra::distributed::Vector<number> &
193 get_level_set_as_heaviside() const override;
194
195 dealii::LinearAlgebra::distributed::Vector<number> &
197
198 const dealii::LinearAlgebra::distributed::Vector<number> &
199 get_distance_to_level_set() const override;
200
201 const SurfaceMeshInfo &
202 get_surface_mesh_info() const override;
206 void
208 std::vector<dealii::LinearAlgebra::distributed::Vector<number> *> &vectors) override;
209
210 void
211 attach_output_vectors(GenericDataOut<dim, number> &data_out) const override;
212
213 void
214 update_surface_mesh() override;
215
216 void
218
219 private:
220 void
221 do_reinitialization(const bool update_normal_vector_in_every_cycle = false);
222
223 inline number
224 approximate_distance_from_level_set(const number phi, const number eps, const number cutoff)
225 {
226 if (std::abs(phi) < cutoff)
227 return eps * std::log((1. + phi) / (1. - phi));
228 else if (phi >= cutoff)
229 return eps * std::log((1. + cutoff) / (1. - cutoff));
230 else /*( phi <= -cutoff )*/
231 return -eps * std::log((1. + cutoff) / (1. - cutoff));
232 }
233
238 void
240
246 //
247 // ******
248 // **** ****
249 // ** **
250 // * Φ=+ * Φ=-
251 // * sgn(d)=+ * sgn(d)=-
252 // * *
253 // ** **
254 // **** ****
255 // ******
256 //
257 void
259
260 void
262
263 std::vector<dealii::Point<dim>> all_marked_vertices;
264 };
265} // namespace MeltPoolDG::LevelSet
Definition boundary_conditions.hpp:17
A generic utility for managing simulation output data in the MeltPoolDG context.
Definition generic_data_out.hpp:32
Definition level_set_operation_base.hpp:24
Definition level_set_operation.hpp:26
void set_level_set_user_rhs(const VectorType &level_set_user_rhs) override
Sets the user-defined right-hand side (RHS) vector for the level set equation.
Definition level_set_operation.cpp:326
void transform_distance_to_level_set()
Definition level_set_operation.cpp:586
bool ready_for_time_advance
Definition level_set_operation.hpp:63
const dealii::LinearAlgebra::distributed::Vector< number > & get_level_set() const override
Definition level_set_operation.cpp:410
void update_normal_vector() override
Definition level_set_operation.cpp:333
number max_d_level_set_since_last_reinit
Definition level_set_operation.hpp:71
const unsigned int curv_dof_idx
Definition level_set_operation.hpp:52
const dealii::LinearAlgebra::distributed::Vector< number > & get_level_set_as_heaviside() const override
Definition level_set_operation.cpp:424
void solve(const bool do_finish_time_step=true) override
Definition level_set_operation.cpp:349
void transform_level_set_to_smooth_heaviside() override
Definition level_set_operation.cpp:661
const unsigned int ls_dof_idx
Definition level_set_operation.hpp:49
dealii::LinearAlgebra::distributed::Vector< number > VectorType
Definition level_set_operation.hpp:28
std::unique_ptr< Tools::NearestPoint< dim, number > > nearest_point_search
Definition level_set_operation.hpp:82
const ScratchData< dim, dim, number > & scratch_data
Definition level_set_operation.hpp:31
const dealii::LinearAlgebra::distributed::Vector< number > & get_distance_to_level_set() const override
Definition level_set_operation.cpp:438
const dealii::LinearAlgebra::distributed::Vector< number > & get_curvature() const override
Definition level_set_operation.cpp:382
void setup_constraints(ScratchData< dim, dim, number > &mutable_scratch_data, const PeriodicBoundaryConditions< dim > &pbc, const std::map< dealii::types::boundary_id, std::shared_ptr< dealii::Function< dim > > > &ls_dirichlet_bc_in, const std::map< dealii::types::boundary_id, std::shared_ptr< dealii::Function< dim > > > &normal_x_dirichlet_bc_in, const std::map< dealii::types::boundary_id, std::shared_ptr< dealii::Function< dim > > > &normal_y_dirichlet_bc_in, const std::map< dealii::types::boundary_id, std::shared_ptr< dealii::Function< dim > > > &normal_z_dirichlet_bc_in) final
Definition level_set_operation.cpp:177
void attach_output_vectors(GenericDataOut< dim, number > &data_out) const override
Definition level_set_operation.cpp:467
void attach_vectors(std::vector< dealii::LinearAlgebra::distributed::Vector< number > * > &vectors) override
Definition level_set_operation.cpp:452
const unsigned int normal_no_bc_dof_idx
Definition level_set_operation.hpp:54
void update_surface_mesh() override
Definition level_set_operation.cpp:807
const TimeIntegration::TimeIterator< number > & time_stepping
Definition level_set_operation.hpp:34
std::vector< std::tuple< const typename dealii::Triangulation< dim, dim >::cell_iterator, std::vector< dealii::Point< dim > >, std::vector< number > > > SurfaceMeshInfo
Definition level_set_operation.hpp:79
const SurfaceMeshInfo & get_surface_mesh_info() const override
Definition level_set_operation.cpp:445
TimeIntegration::TimeIterator< number > reinit_time_iterator
Definition level_set_operation.hpp:61
std::shared_ptr< CurvatureOperationBase< dim, number > > curvature_operation
Definition level_set_operation.hpp:41
std::shared_ptr< AdvectionDiffusionOperationBase< dim, number > > advec_diff_operation
Definition level_set_operation.hpp:39
number approximate_distance_from_level_set(const number phi, const number eps, const number cutoff)
Definition level_set_operation.hpp:224
dealii::LinearAlgebra::distributed::BlockVector< number > BlockVectorType
Definition level_set_operation.hpp:29
const unsigned int ls_hanging_nodes_dof_idx
Definition level_set_operation.hpp:50
std::shared_ptr< ReinitializationOperationBase< dim, number > > reinit_operation
Definition level_set_operation.hpp:40
const dealii::LinearAlgebra::distributed::BlockVector< number > & get_normal_vector() const override
Definition level_set_operation.cpp:396
void correct_curvature_values()
Definition level_set_operation.cpp:709
std::vector< dealii::Point< dim > > all_marked_vertices
Definition level_set_operation.hpp:263
const unsigned int reinit_dof_idx
Definition level_set_operation.hpp:53
SurfaceMeshInfo surface_mesh_info
Definition level_set_operation.hpp:80
void distribute_constraints() override
Definition level_set_operation.cpp:306
void reinit() override
Definition level_set_operation.cpp:291
void set_inflow_outflow_bc(const std::map< dealii::types::boundary_id, std::shared_ptr< dealii::Function< dim > > > inflow_outflow_bc) override
Definition level_set_operation.cpp:272
void set_initial_condition(const dealii::Function< dim > &initial_field_function_level_set, const bool is_signed_distance_initial_field_function=false) override
Definition level_set_operation.cpp:224
VectorType level_set_as_heaviside
Definition level_set_operation.hpp:68
void init_time_advance() override
Definition level_set_operation.cpp:340
void finish_time_advance() override
Definition level_set_operation.cpp:362
const std::array< unsigned int, dim > normal_dof_indices_per_block
Definition level_set_operation.hpp:55
const LevelSetData< number > level_set_data
Definition level_set_operation.hpp:45
void set_wetting_boundary_condition_ids(std::vector< dealii::types::boundary_id > &&) final
Sets the boundary IDs where wetting boundary conditions should be applied.
Definition level_set_operation.cpp:282
VectorType distance_to_level_set
Definition level_set_operation.hpp:69
const unsigned int ls_quad_idx
Definition level_set_operation.hpp:51
void do_reinitialization(const bool update_normal_vector_in_every_cycle=false)
Definition level_set_operation.cpp:492
Container for shared scratch data between operations/operators.
Definition scratch_data.hpp:61
Definition time_iterator.hpp:15
This operation solves the reinitialization problem for a CG- or DG-FEM-based discrete level-set field...
Definition advection_DG_operation.hpp:20
Definition dealii_tensor.hpp:10
Definition level_set_data.hpp:16
Definition periodic_boundary_conditions.hpp:11
Definition time_stepping_data.hpp:11