include/meltpooldg/level_set/advection_diffusion_adaflo_wrapper.hpp Source File

Developer Documentation: include/meltpooldg/level_set/advection_diffusion_adaflo_wrapper.hpp Source File
Developer Documentation
advection_diffusion_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
13
14# include <adaflo/diagonal_preconditioner.h>
15# include <adaflo/level_set_okz_advance_concentration.h>
16# include <adaflo/level_set_okz_preconditioner.h>
17
19{
20 template <int dim, typename number>
21 class AdvectionDiffusionOperationAdaflo : public AdvectionDiffusionOperationBase<dim, number>
22 {
23 private:
24 using VectorType = dealii::LinearAlgebra::distributed::Vector<number>;
25 using BlockVectorType = dealii::LinearAlgebra::distributed::BlockVector<number>;
26
27 public:
31 AdvectionDiffusionOperationAdaflo(
32 const ScratchData<dim, dim, number> &scratch_data,
33 const TimeIntegration::TimeIterator<number> &time_iterator,
34 const int advec_diff_zero_dirichlet_dof_idx,
35 const int advec_diff_dirichlet_dof_idx,
36 const int advec_diff_hanging_nodes_dof_idx,
37 const int advec_diff_quad_idx,
38 const TimeIntegration::TimeSteppingData<number> &time_stepping,
39 const AdvectionDiffusionData<number> &ls,
40 const BoundaryConditionManager<dim, number> &bc);
41
42 void
43 reinit() final;
44
48 void
49 set_initial_condition(const dealii::Function<dim> &initial_field_function) final;
50
51 void
52 set_advection_velocity(const VectorType &advection_velocity_in,
53 const unsigned int velocity_dof_idx_in) final;
54
55 void
56 set_advection_velocity_function(
57 const std::shared_ptr<dealii::Function<dim>> &advection_velocity) final;
58
59 void
60 setup_constraints(
61 ScratchData<dim, dim, number> &mutable_scratch_data,
62 const PeriodicBoundaryConditions<dim> & /*pbc*/,
63 const std::map<dealii::types::boundary_id, std::shared_ptr<dealii::Function<dim>>>
64 &dirichlet_bc_in) final;
65
66 void
67 init_time_advance() final;
68
72 void
73 solve(const bool do_finish_time_step = true) final;
74
75 const dealii::LinearAlgebra::distributed::Vector<number> &
76 get_advected_field() const final;
77
78 dealii::LinearAlgebra::distributed::Vector<number> &
79 get_advected_field() final;
80
81 dealii::LinearAlgebra::distributed::Vector<number> &
82 get_user_rhs() final;
83
84 const dealii::LinearAlgebra::distributed::Vector<number> &
85 get_user_rhs() const final;
86
87 void
88 attach_vectors(
89 std::vector<dealii::LinearAlgebra::distributed::Vector<number> *> &vectors) final;
90
91 void
92 attach_output_vectors(GenericDataOut<dim, number> &data_out) const final;
93
94 const dealii::LinearAlgebra::distributed::Vector<number> &
95 get_advected_field_old() const final;
96
97 dealii::LinearAlgebra::distributed::Vector<number> &
98 get_advected_field_old() final;
99
100 const dealii::LinearAlgebra::distributed::Vector<number> &
101 get_advected_field_old_old() const;
102
103 private:
104 void
105 set_adaflo_parameters(const TimeIntegration::TimeSteppingData<number> &time_stepping,
106 const AdvectionDiffusionData<number> &ls,
107 int advec_diff_dof_idx,
108 int advec_diff_quad_idx);
109
110 void
111 create_operator();
112
113 void
114 update_velocity_history(bool initial_step = false);
115
116 void
117 initialize_vectors();
118
119 const ScratchData<dim, dim, number> &scratch_data;
120 const TimeIntegration::TimeIterator<number> &time_iterator;
124 VectorType advected_field;
125 VectorType advected_field_old;
126 VectorType advected_field_old_old;
130 VectorType increment;
131 VectorType rhs;
132
136 const dealii::LinearAlgebra::distributed::Vector<number> *advection_velocity = nullptr;
137 VectorType velocity_vec;
138 VectorType velocity_vec_old;
139 VectorType velocity_vec_old_old;
143 adaflo::LevelSetOKZSolverAdvanceConcentrationBoundaryDescriptor<dim> bcs;
147 adaflo::LevelSetOKZSolverAdvanceConcentrationParameter adaflo_params;
148
152 std::shared_ptr<adaflo::LevelSetOKZSolverAdvanceConcentration<dim>> advec_diff_operation;
153
157 number global_max_velocity;
161 adaflo::DiagonalPreconditioner<number> preconditioner;
162 const ConditionalOStream pcout;
166 const unsigned int dirichlet_dof_idx = dealii::numbers::invalid_unsigned_int;
167 const unsigned int hanging_nodes_dof_idx = dealii::numbers::invalid_unsigned_int;
168 };
169
170} // namespace MeltPoolDG::LevelSet
171
172#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