3#ifdef MPDG_ENABLE_ADAFLO
5# include <deal.II/lac/generic_linear_algebra.h>
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>
23 template <
int dim,
typename number>
24 class ReinitializationOlssonOperationAdaflo
25 :
public ReinitializationOperationBase<dim, number>,
26 public ReinitializationHyperbolicOperationCapable<dim, number>
29 using VectorType = dealii::LinearAlgebra::distributed::Vector<number>;
30 using BlockVectorType = dealii::LinearAlgebra::distributed::BlockVector<number>;
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);
56 const dealii::LinearAlgebra::distributed::Vector<number> &
57 get_level_set()
const override;
59 dealii::LinearAlgebra::distributed::Vector<number> &
60 get_level_set()
override;
63 get_max_change_level_set() const final;
65 const
dealii::LinearAlgebra::distributed::BlockVector<number> &
66 get_normal_vector() const;
68 dealii::LinearAlgebra::distributed::BlockVector<number> &
73 std::vector<
dealii::LinearAlgebra::distributed::Vector<number> *> &vectors) override;
76 attach_output_vectors(GenericDataOut<dim, number> &data_out) const override;
79 set_initial_condition(const VectorType &level_set_in) override;
85 set_initial_condition(const
dealii::Function<dim> &initial_field_function) override;
88 compute_CFL_based_timestep()
const override
92 "CFL based time stepping is not implemented for continous elements!"));
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);
103 initialize_vectors();
110 create_normal_vector_operator();
112 const ScratchData<dim, dim, number> &scratch_data;
114 const TimeIntegration::TimeIterator<number> &time_iterator;
128 adaflo::LevelSetOKZSolverReinitializationParameter reinit_params_adaflo;
133 std::shared_ptr<NormalVectorOperationAdaflo<dim, number>> normal_vector_operation_adaflo;
134 std::shared_ptr<adaflo::LevelSetOKZSolverReinitialization<dim>> reinit_operation_adaflo;
139 adaflo::DiagonalPreconditioner<number> preconditioner;
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;
146 bool first_reinit_step =
true;
147 bool force_compute_normal =
true;
148 std::function<void(
bool)> compute_normal;
149 const ConditionalOStream pcout;
151 const NormalVectorData<number> &normal_vector_data;
152 const number eps_cell_factor;
155 number max_change_level_set = std::numeric_limits<number>::max();
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