include/meltpooldg/level_set/level_set_DG_operation.hpp Source File

Developer Documentation: include/meltpooldg/level_set/level_set_DG_operation.hpp Source File
Developer Documentation
level_set_DG_operation.hpp
Go to the documentation of this file.
1#pragma once
2// for parallelization
3#include <deal.II/base/exceptions.h>
4#include <deal.II/base/function.h>
5#include <deal.II/base/point.h>
6
7#include <deal.II/grid/tria.h>
8
9#include <deal.II/lac/generic_linear_algebra.h>
10
21
22#include <limits>
23#include <map>
24#include <memory>
25#include <vector>
26
27
29{
30 /*
31 * Level set model including advection, reinitialization and curvature computation
32 * of the level set function.
33 */
34 template <int dim, typename number>
35 class LevelSetDGOperation : public LevelSetOperationBase<dim, number>
36 {
37 private:
38 using VectorType = dealii::LinearAlgebra::distributed::Vector<number>;
39 using BlockVectorType = dealii::LinearAlgebra::distributed::BlockVector<number>;
40
42
43 // Time stepping of the overall problem
45 /*
46 * The following objects are the operations, which are performed for solving the
47 * level set equation.
48 */
49 std::shared_ptr<AdvectionDGOperation<dim, number>> advec_operation;
50 std::shared_ptr<ReinitializationHyperbolicDGOperation<dim, number>> reinit_operation;
51
52 // Is used to track the unreinitialized interface movement
53 std::shared_ptr<AdvectionDGOperation<dim, number>> advec_smoothed_signum_operation;
54
55 /*
56 * Computation of the normal vectors
57 */
58 std::shared_ptr<NormalVectorOperationBase<dim, number>> normal_vector_operation;
59 /*
60 * Computation of the curvature
61 */
62 std::shared_ptr<CurvatureDGOperation<dim, number>> curvature_operation;
63 /*
64 * necessary parameters
65 */
67 /*
68 * select the relevant DoFHandler
69 */
70 const unsigned int ls_dof_idx;
71 const unsigned int ls_quad_idx;
72 const unsigned int reinit_dof_idx;
73 /*
74 * The reinitialization of the level set function is a "pseudo"-time-dependent
75 * equation, which is solved up to quasi-steady state. Thus a time iterator is
76 * needed.
77 */
79
81 /*
82 * This is the surface_tension vector calculated after level set and reinitialization
83 * update
84 */
86
87 number max_d_level_set_since_last_reinit = std::numeric_limits<number>::max();
88
89
90 // triangulation info on surface mesh of zero level set contour
92 std::vector<std::tuple<const typename dealii::Triangulation<dim, dim>::cell_iterator /*cell*/,
93 std::vector<dealii::Point<dim>> /*quad_points*/,
94 std::vector<number> /*weights*/
95 >>;
97
98 int iter = 0;
99
100 public:
102 const ScratchData<dim, dim, number> &scratch_data_in,
104 const LevelSetData<number> &ls_data,
105 const std::shared_ptr<BoundaryConditionManager<dim, number>> &boundary_conditions_in,
106 const std::shared_ptr<dealii::Function<dim, number>> &prescribed_velocity_function,
107 VectorType &advection_velocity,
108 const unsigned int ls_dof_idx_in,
109 const unsigned int ls_quad_idx_in,
110 const unsigned int reinit_dof_idx_in,
111 const unsigned int vel_dof_idx);
115 void
116 set_initial_condition(const dealii::Function<dim> &initial_field_function_level_set,
117 const bool is_signed_distance_initial_field_function = false) override;
118
119 void
121 ScratchData<dim, dim, number> & /*mutable_scratch_data*/,
122 const PeriodicBoundaryConditions<dim> & /*pbc*/,
123 const std::map<dealii::types::boundary_id, std::shared_ptr<dealii::Function<dim>>>
124 & /*ls_dirichlet_bc_in*/,
125 const std::map<dealii::types::boundary_id, std::shared_ptr<dealii::Function<dim>>>
126 & /*normal_x_dirichlet_bc_in*/,
127 const std::map<dealii::types::boundary_id, std::shared_ptr<dealii::Function<dim>>>
128 & /*normal_y_dirichlet_bc_in*/,
129 const std::map<dealii::types::boundary_id, std::shared_ptr<dealii::Function<dim>>>
130 & /*normal_z_dirichlet_bc_in*/) final
131 {
132 // nothing to be done in the DG case
133 }
134
135 void
136 set_inflow_outflow_bc([[maybe_unused]] const std::map<dealii::types::boundary_id,
137 std::shared_ptr<dealii::Function<dim>>>
138 inflow_outflow_bc) override
139 { // Not needed in the DG case sinde BCs are applied weakly within the operator
140 DEAL_II_NOT_IMPLEMENTED();
141 }
142
143 void
144 reinit() override;
145
146 void
148 {
149 // Not needed in the DG case since constraints are applied in a weak sense
150 DEAL_II_NOT_IMPLEMENTED();
151 };
152
153 void
154 init_time_advance() override;
155
156 void
157 solve(const bool do_finish_time_step = true) override;
158
159 void
160 finish_time_advance() override;
161
162 void
163 set_level_set_user_rhs([[maybe_unused]] const VectorType &level_set_user_rhs) override
164 {
165 AssertThrow(
166 false,
167 dealii::ExcMessage(
168 "The function set_level_set_user_rhs function is not implemented for DG level set."));
169 }
170
171 void
173 {
174 AssertThrow(
175 false,
176 dealii::ExcMessage(
177 "The function update_normal_vector function is not implemented for DG level set."));
178 }
179
180 /*
181 * getter functions for solution vectors
182 */
183 const dealii::LinearAlgebra::distributed::Vector<number> &
184 get_curvature() const override;
185
186 dealii::LinearAlgebra::distributed::Vector<number> &
187 get_curvature() override;
188
189 const dealii::LinearAlgebra::distributed::BlockVector<number> &
190 get_normal_vector() const override;
191
192 dealii::LinearAlgebra::distributed::BlockVector<number> &
193 get_normal_vector() override;
194
195 const dealii::LinearAlgebra::distributed::Vector<number> &
196 get_level_set() const override;
197
198 dealii::LinearAlgebra::distributed::Vector<number> &
199 get_level_set() override;
200
201 const dealii::LinearAlgebra::distributed::Vector<number> &
202 get_level_set_as_heaviside() const override;
203
204 dealii::LinearAlgebra::distributed::Vector<number> &
206
207 const dealii::LinearAlgebra::distributed::Vector<number> &
208 get_distance_to_level_set() const override;
209
210 const SurfaceMeshInfo &
211 get_surface_mesh_info() const override;
212
216 void
218 std::vector<dealii::LinearAlgebra::distributed::Vector<number> *> &vectors) override;
219
220 void
221 attach_output_vectors(GenericDataOut<dim, number> &data_out) const override;
222
223 void
224 update_surface_mesh() override;
225
226 void
228
229 private:
230 void
231 do_reinitialization(const bool update_normal_vector_in_every_cycle = false);
232
233 // Computes a given error norm of the level set field
234 number
236
237 std::shared_ptr<dealii::Function<dim, number>> prescribed_velocity_function;
238 };
239} // 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_DG_operation.hpp:36
const dealii::LinearAlgebra::distributed::Vector< number > & get_level_set() const override
Definition level_set_DG_operation.cpp:273
const TimeIntegration::TimeIterator< number > & time_stepping
Definition level_set_DG_operation.hpp:44
const unsigned int ls_quad_idx
Definition level_set_DG_operation.hpp:71
dealii::LinearAlgebra::distributed::Vector< number > VectorType
Definition level_set_DG_operation.hpp:38
std::vector< std::tuple< const typename dealii::Triangulation< dim, dim >::cell_iterator, std::vector< dealii::Point< dim > >, std::vector< number > > > SurfaceMeshInfo
Definition level_set_DG_operation.hpp:95
const dealii::LinearAlgebra::distributed::BlockVector< number > & get_normal_vector() const override
Definition level_set_DG_operation.cpp:259
std::shared_ptr< CurvatureDGOperation< dim, number > > curvature_operation
Definition level_set_DG_operation.hpp:62
void update_surface_mesh() override
Definition level_set_DG_operation.cpp:507
const ScratchData< dim, dim, number > & scratch_data
Definition level_set_DG_operation.hpp:41
void transform_level_set_to_smooth_heaviside() override
Definition level_set_DG_operation.cpp:471
void set_level_set_user_rhs(const VectorType &level_set_user_rhs) override
Definition level_set_DG_operation.hpp:163
std::shared_ptr< dealii::Function< dim, number > > prescribed_velocity_function
Definition level_set_DG_operation.hpp:237
const unsigned int ls_dof_idx
Definition level_set_DG_operation.hpp:70
const unsigned int reinit_dof_idx
Definition level_set_DG_operation.hpp:72
std::shared_ptr< AdvectionDGOperation< dim, number > > advec_operation
Definition level_set_DG_operation.hpp:49
number compute_level_set_gradient_error(const VectorType &solution)
Definition level_set_DG_operation.cpp:526
std::shared_ptr< AdvectionDGOperation< dim, number > > advec_smoothed_signum_operation
Definition level_set_DG_operation.hpp:53
const dealii::LinearAlgebra::distributed::Vector< number > & get_level_set_as_heaviside() const override
Definition level_set_DG_operation.cpp:287
TimeIntegration::TimeIterator< number > reinit_time_iterator
Definition level_set_DG_operation.hpp:78
SurfaceMeshInfo surface_mesh_info
Definition level_set_DG_operation.hpp:96
bool ready_for_time_advance
Definition level_set_DG_operation.hpp:80
void finish_time_advance() override
Definition level_set_DG_operation.cpp:215
VectorType level_set_as_heaviside
Definition level_set_DG_operation.hpp:85
void attach_output_vectors(GenericDataOut< dim, number > &data_out) const override
Definition level_set_DG_operation.cpp:338
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_DG_operation.cpp:120
void init_time_advance() override
Definition level_set_DG_operation.cpp:185
const LevelSetData< number > & level_set_data
Definition level_set_DG_operation.hpp:66
void solve(const bool do_finish_time_step=true) override
Definition level_set_DG_operation.cpp:195
std::shared_ptr< ReinitializationHyperbolicDGOperation< dim, number > > reinit_operation
Definition level_set_DG_operation.hpp:50
void setup_constraints(ScratchData< dim, dim, number > &, const PeriodicBoundaryConditions< dim > &, const std::map< dealii::types::boundary_id, std::shared_ptr< dealii::Function< dim > > > &, const std::map< dealii::types::boundary_id, std::shared_ptr< dealii::Function< dim > > > &, const std::map< dealii::types::boundary_id, std::shared_ptr< dealii::Function< dim > > > &, const std::map< dealii::types::boundary_id, std::shared_ptr< dealii::Function< dim > > > &) final
Definition level_set_DG_operation.hpp:120
void reinit() override
Definition level_set_DG_operation.cpp:169
void distribute_constraints() override
Definition level_set_DG_operation.hpp:147
dealii::LinearAlgebra::distributed::BlockVector< number > BlockVectorType
Definition level_set_DG_operation.hpp:39
number max_d_level_set_since_last_reinit
Definition level_set_DG_operation.hpp:87
const dealii::LinearAlgebra::distributed::Vector< number > & get_distance_to_level_set() const override
Definition level_set_DG_operation.cpp:301
void do_reinitialization(const bool update_normal_vector_in_every_cycle=false)
Definition level_set_DG_operation.cpp:385
int iter
Definition level_set_DG_operation.hpp:98
void update_normal_vector() override
Definition level_set_DG_operation.hpp:172
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_DG_operation.hpp:136
const SurfaceMeshInfo & get_surface_mesh_info() const override
Definition level_set_DG_operation.cpp:308
const dealii::LinearAlgebra::distributed::Vector< number > & get_curvature() const override
Definition level_set_DG_operation.cpp:245
void attach_vectors(std::vector< dealii::LinearAlgebra::distributed::Vector< number > * > &vectors) override
Definition level_set_DG_operation.cpp:317
std::shared_ptr< NormalVectorOperationBase< dim, number > > normal_vector_operation
Definition level_set_DG_operation.hpp:58
Definition level_set_operation_base.hpp:24
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 level_set_data.hpp:16
Definition periodic_boundary_conditions.hpp:11