include/meltpooldg/level_set/reinitialization_olsson_operation_adaflo_wrapper.hpp Source File

Developer Documentation: include/meltpooldg/level_set/reinitialization_olsson_operation_adaflo_wrapper.hpp Source File
Developer Documentation
reinitialization_olsson_operation_adaflo_wrapper.hpp
Go to the documentation of this file.
1#pragma once
2
3#ifdef MPDG_ENABLE_ADAFLO
4
5# include <deal.II/lac/generic_linear_algebra.h>
6
15
16# include <adaflo/diagonal_preconditioner.h>
17# include <adaflo/level_set_okz_compute_normal.h>
18# include <adaflo/level_set_okz_preconditioner.h>
19# include <adaflo/level_set_okz_reinitialization.h>
20
22{
23 template <int dim, typename number>
24 class ReinitializationOlssonOperationAdaflo
25 : public ReinitializationOperationBase<dim, number>,
26 public ReinitializationHyperbolicOperationCapable<dim, number>
27 {
28 private:
29 using VectorType = dealii::LinearAlgebra::distributed::Vector<number>;
30 using BlockVectorType = dealii::LinearAlgebra::distributed::BlockVector<number>;
31
32 public:
36 ReinitializationOlssonOperationAdaflo(
37 const ScratchData<dim, dim, number> &scratch_data,
38 const TimeIntegration::TimeIterator<number> &time_iterator,
39 const int reinit_dof_idx,
40 const int reinit_quad_idx,
41 const int normal_dof_idx,
42 const TimeIntegration::TimeSteppingData<number> &time_stepping,
43 const NormalVectorData<number> &normal_vec_data,
44 const number interface_thickness_parameter_value,
45 const unsigned int n_subdivisions);
46
47 void
48 reinit() override;
49
53 void
54 solve() override;
55
56 const dealii::LinearAlgebra::distributed::Vector<number> &
57 get_level_set() const override;
58
59 dealii::LinearAlgebra::distributed::Vector<number> &
60 get_level_set() override;
61
62 number
63 get_max_change_level_set() const final;
64
65 const dealii::LinearAlgebra::distributed::BlockVector<number> &
66 get_normal_vector() const;
67
68 dealii::LinearAlgebra::distributed::BlockVector<number> &
69 get_normal_vector();
70
71 void
72 attach_vectors(
73 std::vector<dealii::LinearAlgebra::distributed::Vector<number> *> &vectors) override;
74
75 void
76 attach_output_vectors(GenericDataOut<dim, number> &data_out) const override;
77
78 void
79 set_initial_condition(const VectorType &level_set_in) override;
80
84 void
85 set_initial_condition(const dealii::Function<dim> &initial_field_function) override;
86
87 number
88 compute_CFL_based_timestep() const override
89 {
90 AssertThrow(false,
91 dealii::ExcMessage(
92 "CFL based time stepping is not implemented for continous elements!"));
93 }
94
95 private:
96 void
97 set_adaflo_parameters(const TimeIntegration::TimeSteppingData<number> &time_stepping,
98 const int reinit_dof_idx,
99 const int reinit_quad_idx,
100 const int normal_dof_idx);
101
102 void
103 initialize_vectors();
104
105 private:
106 void
107 create_operator();
108
109 void
110 create_normal_vector_operator();
111
112 const ScratchData<dim, dim, number> &scratch_data;
113
114 const TimeIntegration::TimeIterator<number> &time_iterator;
118 VectorType level_set;
122 VectorType increment;
123 VectorType rhs;
124
128 adaflo::LevelSetOKZSolverReinitializationParameter reinit_params_adaflo;
129
133 std::shared_ptr<NormalVectorOperationAdaflo<dim, number>> normal_vector_operation_adaflo;
134 std::shared_ptr<adaflo::LevelSetOKZSolverReinitialization<dim>> reinit_operation_adaflo;
135
139 adaflo::DiagonalPreconditioner<number> preconditioner;
140
141 std::pair<number, number> last_concentration_range = {-1.0, 1.0};
142 dealii::AlignedVector<dealii::VectorizedArray<number>> cell_diameters;
143 number cell_diameter_min;
144 number cell_diameter_max;
145 number epsilon_used;
146 bool first_reinit_step = true;
147 bool force_compute_normal = true;
148 std::function<void(bool)> compute_normal;
149 const ConditionalOStream pcout;
150
151 const NormalVectorData<number> &normal_vector_data;
152 const number eps_cell_factor;
153
154 // maximum change of the level set due to the current reinitialization step
155 number max_change_level_set = std::numeric_limits<number>::max();
156 };
157} // namespace MeltPoolDG::LevelSet
158
159#endif
This operation solves the reinitialization problem for a CG- or DG-FEM-based discrete level-set field...
Definition advection_DG_operation.hpp:20
dealii::LinearAlgebra::distributed::BlockVector< number > BlockVectorType
Definition utilities_matrixfree.hpp:17
dealii::LinearAlgebra::distributed::Vector< number > VectorType
Definition utilities_matrixfree.hpp:15
Definition dealii_tensor.hpp:10