include/meltpooldg/level_set/advection_diffusion_operator.hpp Source File

Developer Documentation: include/meltpooldg/level_set/advection_diffusion_operator.hpp Source File
Developer Documentation
advection_diffusion_operator.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <deal.II/base/aligned_vector.h>
4#include <deal.II/base/tensor.h>
5#include <deal.II/base/vectorization.h>
6
7#include <deal.II/lac/la_parallel_block_vector.h>
8#include <deal.II/lac/la_parallel_vector.h>
9#include <deal.II/lac/trilinos_sparse_matrix.h>
10
16
17#include <map>
18#include <string>
19#include <vector>
20
21
23{
24 static std::map<std::string, double> get_generalized_theta = {
25 {"explicit_euler", 0.0},
26 {"implicit_euler", 1.0},
27 {"crank_nicolson", 0.5},
28 };
29
30 template <int dim, typename number>
32 public OperatorMatrixBased<dim, number>
33 {
34 //@todo: to avoid compiler warnings regarding hidden overriden functions
36 using OperatorMatrixFree<dim, number>::vmult;
37 using OperatorMatrixFree<dim, number>::create_rhs;
39
40 private:
41 using VectorType = dealii::LinearAlgebra::distributed::Vector<number>;
42 using BlockVectorType = dealii::LinearAlgebra::distributed::BlockVector<number>;
43 using SparseMatrixType = dealii::TrilinosWrappers::SparseMatrix;
44 using VectorizedArrayType = dealii::VectorizedArray<number>;
45 using vector = dealii::Tensor<1, dim, dealii::VectorizedArray<number>>;
46 using scalar = dealii::VectorizedArray<number>;
47
48 public:
51 const AdvectionDiffusionData<number> &data_in,
52 unsigned int dof_idx_in,
53 unsigned int quad_idx_in);
54
60 void
62 const std::shared_ptr<dealii::Function<dim>> &advection_velocity_function_in);
63
70 void
71 set_advection_velocity(const VectorType &advection_velocity_in,
72 const unsigned int velocity_dof_idx_in);
73
74 /*
75 * this is the matrix-based implementation of the rhs and the matrix
76 * @todo: this could be improved by using the WorkStream functionality of deal.II
77 */
78
79 void
80 compute_system_matrix_and_rhs(const VectorType &advected_field_old,
81 VectorType &rhs) const final;
82 /*
83 * matrix-free implementation
84 */
85 void
86 vmult(VectorType &dst, const VectorType &src) const final;
87
88 void
89 create_rhs(VectorType &dst, const VectorType &src) const final;
90
91 void
93 dealii::TrilinosWrappers::SparseMatrix &system_matrix) const final;
94
95 void
97
98 void
99 reinit() final;
100
101 void
102 pre() final;
103
104 void
105 post() final;
106
110 void
111 set_inflow_outflow_bc(std::vector<unsigned int> inflow_outflow_bc_local_indices_);
112
113 void
114 do_pre_vmult([[maybe_unused]] VectorType &dst, const VectorType &src_in) const;
115
116 void
117 do_post_vmult(VectorType &dst, [[maybe_unused]] const VectorType &src_in) const;
118
119 void
120 post_system_matrix_compute(dealii::TrilinosWrappers::SparseMatrix &system_matrix) const;
121
122 void
124
125 private:
126 void
127 tangent_local_cell_operation(FECellIntegrator<dim, 1, number> &advected_field,
128 FECellIntegrator<dim, dim, number> *velocity_vals,
129 const bool do_reinit_cells) const;
130
131 void
132 compute_stabilization_parameter(const FECellIntegrator<dim, 1, number> &advected_field_vals,
133 const FECellIntegrator<dim, dim, number> *velocity_vals) const;
134
135 const ScratchData<dim, dim, number> &scratch_data;
136 const TimeIntegration::TimeIterator<number> &time_iterator;
137 const AdvectionDiffusionData<number> &data;
138 const unsigned int advec_diff_dof_idx;
139 const unsigned int advec_diff_quad_idx;
140 number theta;
141
142 // SUPG stabilization aprameter
143 mutable dealii::AlignedVector<dealii::VectorizedArray<number>> stab_param;
144 mutable bool do_update_stab_param = true;
145
148
150 unsigned int velocity_dof_idx = dealii::numbers::invalid_unsigned_int;
151
152 std::shared_ptr<dealii::Function<dim>> advection_velocity_function = nullptr;
155 };
156} // namespace MeltPoolDG::LevelSet
Definition advection_diffusion_operator.hpp:33
std::shared_ptr< dealii::Function< dim > > advection_velocity_function
Definition advection_diffusion_operator.hpp:152
number theta
Definition advection_diffusion_operator.hpp:140
void set_advection_velocity_function(const std::shared_ptr< dealii::Function< dim > > &advection_velocity_function_in)
Assigns a time-dependent advection velocity function.
Definition advection_diffusion_operator.cpp:63
void do_pre_vmult(VectorType &dst, const VectorType &src_in) const
Definition advection_diffusion_operator.cpp:545
const ScratchData< dim, dim, number > & scratch_data
Definition advection_diffusion_operator.hpp:135
void create_rhs(VectorType &dst, const VectorType &src) const final
Compute the right-hand side vector.
Definition advection_diffusion_operator.cpp:276
void set_apply_inflow_outflow_constraints_pre_post_matrix_free(bool enable)
Definition advection_diffusion_operator.cpp:608
std::vector< unsigned int > inflow_outflow_bc_local_indices
Definition advection_diffusion_operator.hpp:146
const VectorType * advection_velocity
Definition advection_diffusion_operator.hpp:149
const TimeIntegration::TimeIterator< number > & time_iterator
Definition advection_diffusion_operator.hpp:136
bool do_update_stab_param
Definition advection_diffusion_operator.hpp:144
dealii::LinearAlgebra::distributed::Vector< number > VectorType
Definition advection_diffusion_operator.hpp:41
unsigned int velocity_dof_idx
Definition advection_diffusion_operator.hpp:150
std::vector< number > inflow_outflow_constraints_values_temp
Definition advection_diffusion_operator.hpp:147
void vmult(VectorType &dst, const VectorType &src) const final
Definition advection_diffusion_operator.cpp:238
void set_inflow_outflow_bc(std::vector< unsigned int > inflow_outflow_bc_local_indices_)
Definition advection_diffusion_operator.cpp:537
void set_advection_velocity(const VectorType &advection_velocity_in, const unsigned int velocity_dof_idx_in)
Sets the discrete advection velocity vector and its DoF index.
Definition advection_diffusion_operator.cpp:46
void compute_stabilization_parameter(const FECellIntegrator< dim, 1, number > &advected_field_vals, const FECellIntegrator< dim, dim, number > *velocity_vals) const
Definition advection_diffusion_operator.cpp:499
void post() final
Finalize for computations (e.g. zero out ghost values). Can be overridden by derived classes.
Definition advection_diffusion_operator.cpp:582
void post_system_matrix_compute(dealii::TrilinosWrappers::SparseMatrix &system_matrix) const
Definition advection_diffusion_operator.cpp:590
void do_post_vmult(VectorType &dst, const VectorType &src_in) const
Definition advection_diffusion_operator.cpp:565
bool velocity_update_ghosts
Definition advection_diffusion_operator.hpp:153
void tangent_local_cell_operation(FECellIntegrator< dim, 1, number > &advected_field, FECellIntegrator< dim, dim, number > *velocity_vals, const bool do_reinit_cells) const
Definition advection_diffusion_operator.cpp:450
dealii::VectorizedArray< number > scalar
Definition advection_diffusion_operator.hpp:46
const unsigned int advec_diff_dof_idx
Definition advection_diffusion_operator.hpp:138
dealii::TrilinosWrappers::SparseMatrix SparseMatrixType
Definition advection_diffusion_operator.hpp:43
void reinit() final
Reinitialize data structures. Can be overridden by derived classes.
Definition advection_diffusion_operator.cpp:210
void compute_inverse_diagonal_from_matrixfree(VectorType &diagonal) const final
Compute the inverse diagonal using matrix-free techniques.
Definition advection_diffusion_operator.cpp:401
dealii::AlignedVector< dealii::VectorizedArray< number > > stab_param
Definition advection_diffusion_operator.hpp:143
const AdvectionDiffusionData< number > & data
Definition advection_diffusion_operator.hpp:137
void compute_system_matrix_and_rhs(const VectorType &advected_field_old, VectorType &rhs) const final
Compute the system matrix and right-hand side vector.
Definition advection_diffusion_operator.cpp:78
void compute_system_matrix_from_matrixfree(dealii::TrilinosWrappers::SparseMatrix &system_matrix) const final
Compute a sparse matrix using matrix-free techniques.
Definition advection_diffusion_operator.cpp:362
dealii::LinearAlgebra::distributed::BlockVector< number > BlockVectorType
Definition advection_diffusion_operator.hpp:42
dealii::VectorizedArray< number > VectorizedArrayType
Definition advection_diffusion_operator.hpp:44
void pre() final
Prepare for computations (e.g. update ghost values). Can be overridden by derived classes.
Definition advection_diffusion_operator.cpp:220
const unsigned int advec_diff_quad_idx
Definition advection_diffusion_operator.hpp:139
bool do_apply_inflow_outflow_constraints_pre_post
Definition advection_diffusion_operator.hpp:154
dealii::Tensor< 1, dim, dealii::VectorizedArray< number > > vector
Definition advection_diffusion_operator.hpp:45
Operator handling matrix-based computations.
Definition operator_base.hpp:94
SparseMatrixType system_matrix
Definition operator_base.hpp:176
Operator handling matrix-free computations.
Definition operator_base.hpp:190
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
static std::map< std::string, double > get_generalized_theta
Definition advection_diffusion_operator.hpp:24
dealii::FEEvaluation< dim, -1, 0, n_components, number, VectorizedArrayType > FECellIntegrator
Definition fe_integrator.hpp:14
Definition dealii_tensor.hpp:10