include/meltpooldg/core/operator_base.hpp Source File

Developer Documentation: include/meltpooldg/core/operator_base.hpp Source File
Developer Documentation
operator_base.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <deal.II/base/exceptions.h>
4#include <deal.II/base/mpi.h>
5#include <deal.II/base/types.h>
6
7#include <deal.II/dofs/dof_tools.h>
8
9#include <deal.II/lac/la_parallel_block_vector.h>
10#include <deal.II/lac/la_parallel_vector.h>
11#include <deal.II/lac/trilinos_sparse_matrix.h>
12#include <deal.II/lac/trilinos_sparsity_pattern.h>
13
16
17
18namespace MeltPoolDG
19{
20 // Base class for both MatrixFree and MatrixBased operators
21 template <typename number>
23 {
24 public:
25 virtual ~OperatorBase() = default;
26
31 inline void
32 reset_dof_index(const unsigned int dof_idx_in)
33 {
34 this->dof_idx = dof_idx_in;
35 }
36
41 inline void
42 reset_time_increment(const number dt)
43 {
44 time_increment = dt;
46 }
47
51 virtual void
53 {
54 DEAL_II_NOT_IMPLEMENTED();
55 }
56
60 virtual void
62 {
63 DEAL_II_NOT_IMPLEMENTED();
64 }
65
69 virtual void
71 {
72 DEAL_II_NOT_IMPLEMENTED();
73 }
74
75 protected:
76 // DoF index assigned to the operator
77 unsigned int dof_idx = dealii::numbers::invalid_unsigned_int;
78
79 // time increment value
81
82 // inverse of time increment
84 };
85
92 template <int dim, typename number>
93 class OperatorMatrixBased : public virtual OperatorBase<number>
94 {
95 public:
96 using SparseMatrixType = dealii::TrilinosWrappers::SparseMatrix;
97 using SparsityPatternType = dealii::TrilinosWrappers::SparsityPattern;
98 using VectorType = dealii::LinearAlgebra::distributed::Vector<number>;
99 using BlockVectorType = dealii::LinearAlgebra::distributed::BlockVector<number>;
100
101 virtual ~OperatorMatrixBased() = default;
102
108 virtual void
110 {
111 DEAL_II_NOT_IMPLEMENTED();
112 }
113
119 virtual void
121 {
122 DEAL_II_NOT_IMPLEMENTED();
123 }
124
130 virtual void
132 {
133 DEAL_II_NOT_IMPLEMENTED();
134 }
135
140 virtual void
142 {
143 AssertThrow(this->dof_idx < dealii::numbers::invalid_unsigned_int,
144 dealii::ExcMessage("reset_dof_index() must be called."));
145 const MPI_Comm mpi_communicator = scratch_data.get_mpi_comm(this->dof_idx);
146 dsp.reinit(scratch_data.get_locally_owned_dofs(this->dof_idx),
147 scratch_data.get_locally_owned_dofs(this->dof_idx),
148 scratch_data.get_locally_relevant_dofs(this->dof_idx),
149 mpi_communicator);
150
151 dealii::DoFTools::make_sparsity_pattern(scratch_data.get_dof_handler(this->dof_idx),
152 this->dsp,
153 scratch_data.get_constraint(this->dof_idx),
154 true,
155 dealii::Utilities::MPI::this_mpi_process(
156 mpi_communicator));
157 dsp.compress();
158
159 system_matrix.reinit(dsp);
160 }
161
162 const SparseMatrixType &
164 {
165 return system_matrix;
166 }
167
170 {
171 return system_matrix;
172 }
173
174 protected:
175 // Sparse system matrx.
177
178 // Sparsity pattern for the system matrix
180 };
181
188 template <int dim, typename number>
189 class OperatorMatrixFree : public virtual OperatorBase<number>
190 {
191 public:
192 using VectorType = dealii::LinearAlgebra::distributed::Vector<number>;
193 using BlockVectorType = dealii::LinearAlgebra::distributed::BlockVector<number>;
194 using SparseMatrixType = dealii::TrilinosWrappers::SparseMatrix;
195
196 virtual ~OperatorMatrixFree() = default;
197
207 virtual void
209 {
210 DEAL_II_NOT_IMPLEMENTED();
211 }
212
216 virtual void
218 {
219 DEAL_II_NOT_IMPLEMENTED();
220 }
221
225 virtual void
227 {
228 DEAL_II_NOT_IMPLEMENTED();
229 }
230
238 virtual void
239 vmult(VectorType &, const VectorType &) const
240 {
241 DEAL_II_NOT_IMPLEMENTED();
242 }
243
247 virtual void
249 {
250 DEAL_II_NOT_IMPLEMENTED();
251 }
252
257 virtual void
258 compute_system_matrix_from_matrixfree(dealii::TrilinosWrappers::SparseMatrix & /*matrix*/) const
259 {
260 DEAL_II_NOT_IMPLEMENTED();
261 }
262
267 virtual void
269 {
270 DEAL_II_NOT_IMPLEMENTED();
271 }
272
277 virtual void
279 {
280 DEAL_II_NOT_IMPLEMENTED();
281 }
282 };
283
284} // namespace MeltPoolDG
Definition operator_base.hpp:23
number time_increment_inv
Definition operator_base.hpp:83
number time_increment
Definition operator_base.hpp:80
virtual void pre()
Prepare for computations (e.g. update ghost values). Can be overridden by derived classes.
Definition operator_base.hpp:52
void reset_dof_index(const unsigned int dof_idx_in)
Set the index for the current degrees of freedom (DoF).
Definition operator_base.hpp:32
unsigned int dof_idx
Definition operator_base.hpp:77
virtual void post()
Finalize for computations (e.g. zero out ghost values). Can be overridden by derived classes.
Definition operator_base.hpp:61
void reset_time_increment(const number dt)
Set the time increment for the operator.
Definition operator_base.hpp:42
virtual void reinit()
Reinitialize data structures. Can be overridden by derived classes.
Definition operator_base.hpp:70
virtual ~OperatorBase()=default
Operator handling matrix-based computations.
Definition operator_base.hpp:94
virtual ~OperatorMatrixBased()=default
SparseMatrixType system_matrix
Definition operator_base.hpp:176
virtual void compute_system_matrix_and_rhs(const VectorType &, BlockVectorType &) const
Compute the system matrix and right-hand side block vector.
Definition operator_base.hpp:131
virtual void compute_system_matrix_and_rhs(const BlockVectorType &, VectorType &) const
Compute the system matrix and right-hand side vector for block vectors.
Definition operator_base.hpp:120
dealii::LinearAlgebra::distributed::Vector< number > VectorType
Definition operator_base.hpp:98
dealii::TrilinosWrappers::SparseMatrix SparseMatrixType
Definition operator_base.hpp:96
const SparseMatrixType & get_system_matrix() const
Definition operator_base.hpp:163
dealii::TrilinosWrappers::SparsityPattern SparsityPatternType
Definition operator_base.hpp:97
virtual void compute_system_matrix_and_rhs(const VectorType &, VectorType &) const
Compute the system matrix and right-hand side vector.
Definition operator_base.hpp:109
virtual void reinit_sparsity_pattern(const ScratchData< dim, dim, number > &scratch_data)
Reinitialize the sparsity pattern of the system matrix.
Definition operator_base.hpp:141
SparseMatrixType & get_system_matrix()
Definition operator_base.hpp:169
dealii::LinearAlgebra::distributed::BlockVector< number > BlockVectorType
Definition operator_base.hpp:99
SparsityPatternType dsp
Definition operator_base.hpp:179
Operator handling matrix-free computations.
Definition operator_base.hpp:190
virtual void create_rhs(VectorType &, const VectorType &) const
Compute the right-hand side vector.
Definition operator_base.hpp:208
virtual void create_rhs(VectorType &, const BlockVectorType &) const
Compute the right-hand side vector for block vectors src.
Definition operator_base.hpp:226
dealii::TrilinosWrappers::SparseMatrix SparseMatrixType
Definition operator_base.hpp:194
virtual void compute_inverse_diagonal_from_matrixfree(BlockVectorType &) const
Compute the inverse diagonal using matrix-free techniques for block vectors.
Definition operator_base.hpp:278
virtual void vmult(VectorType &, const VectorType &) const
Definition operator_base.hpp:239
virtual void compute_system_matrix_from_matrixfree(dealii::TrilinosWrappers::SparseMatrix &) const
Compute a sparse matrix using matrix-free techniques.
Definition operator_base.hpp:258
dealii::LinearAlgebra::distributed::BlockVector< number > BlockVectorType
Definition operator_base.hpp:193
dealii::LinearAlgebra::distributed::Vector< number > VectorType
Definition operator_base.hpp:192
virtual void create_rhs(BlockVectorType &, const VectorType &) const
Compute the right-hand side vector for block vectors dst.
Definition operator_base.hpp:217
virtual void compute_inverse_diagonal_from_matrixfree(VectorType &) const
Compute the inverse diagonal using matrix-free techniques.
Definition operator_base.hpp:268
virtual void vmult(BlockVectorType &, const BlockVectorType &) const
Definition operator_base.hpp:248
virtual ~OperatorMatrixFree()=default
Container for shared scratch data between operations/operators.
Definition scratch_data.hpp:61
MPI_Comm get_mpi_comm(const unsigned int dof_idx=0) const
Get the MPI communicator for a given DoFHandler.
Definition scratch_data.cpp:522
const dealii::IndexSet & get_locally_owned_dofs(const unsigned int dof_idx) const
Get the set of locally owned DoFs for a given DoFHandler index.
Definition scratch_data.cpp:529
const dealii::DoFHandler< dim, spacedim > & get_dof_handler(const unsigned int dof_idx) const
Get a DoFHandler by index (const overload).
Definition scratch_data.cpp:438
const dealii::AffineConstraints< number > & get_constraint(const unsigned int constraint_index) const
Get a constraint object by index (const overload).
Definition scratch_data.cpp:375
const dealii::IndexSet & get_locally_relevant_dofs(const unsigned int dof_idx) const
Get the set of locally relevant DoFs for a given DoFHandler index.
Definition scratch_data.cpp:536
constexpr double invalid_double
Definition numbers.hpp:11
Interface for a general preconditioner.
Definition boundary_condition_functions.hpp:17