include/meltpooldg/linear_algebra/preconditioner_trilinos_wrapper.hpp Source File

Developer Documentation: include/meltpooldg/linear_algebra/preconditioner_trilinos_wrapper.hpp Source File
Developer Documentation
preconditioner_trilinos_wrapper.hpp
Go to the documentation of this file.
1
5#pragma once
6
7#include <deal.II/base/exceptions.h>
8
9#include <deal.II/dofs/dof_tools.h>
10
11#include <deal.II/lac/dynamic_sparsity_pattern.h>
12#include <deal.II/lac/la_parallel_block_vector.h>
13#include <deal.II/lac/sparsity_tools.h>
14#include <deal.II/lac/trilinos_sparse_matrix.h>
15
17
18#include <any>
19#include <type_traits>
20
21namespace MeltPoolDG
22{
28 template <typename OperatorType, typename VectorType>
30 requires(const OperatorType op, dealii::TrilinosWrappers::SparseMatrix &matrix) {
34 op.compute_system_matrix_from_matrixfree(matrix);
35 };
36
40 template <int dim,
41 typename number,
42 typename VectorType,
43 typename DealiiPreconditionerType,
44 typename OperatorType>
46 {
47 public:
56 explicit DealiiPreconditionerWrapper(const OperatorType *operator_in,
57 const ScratchData<dim, dim, number> &scratch_data_in,
58 const unsigned dof_idx_in,
59 const bool do_matrix_free = true)
60 : eq_operator(operator_in)
61 , scratch_data(scratch_data_in)
62 , dof_idx(dof_idx_in)
64 {}
65
72 void
73 vmult(VectorType &dst, const VectorType &src) const
74 {
75 // deal.II trilinos preconditioner do not support vmult(BlockVectorType& BlockVectorType&).
76 // This is done manually if required.
77 // TODO: Can this be done more elegant?
78 if constexpr (std::is_same_v<dealii::LinearAlgebra::distributed::BlockVector<
79 typename VectorType::value_type>,
80 VectorType>)
81 for (unsigned int b = 0; b < dst.n_blocks(); ++b)
82 preconditioner.vmult(dst.block(b), src.block(b));
83 else
84 preconditioner.vmult(dst, src);
85 }
86
98 void
99 update(const std::any &external_preconditioner_matrix = std::any())
100 {
101 dealii::TrilinosWrappers::SparseMatrix *preconditioner_matrix_ptr;
102 if (not external_preconditioner_matrix.has_value())
103 {
105 {
106 Assert(eq_operator != nullptr,
107 dealii::ExcMessage("The provided operator has no valid address (nullptr)."));
108 eq_operator->compute_system_matrix_from_matrixfree(preconditioner_system_matrix);
109 preconditioner_matrix_ptr = &preconditioner_system_matrix;
110 }
111 else
112 {
113 AssertThrow(false,
114 dealii::ExcMessage(
115 "Neither a rule to compute the preconditioner matrix nor an external"
116 " preconditioner matrix are provided."));
117 }
118 }
119 else
120 {
121 Assert(external_preconditioner_matrix.has_value(),
122 dealii::ExcMessage(
123 "No external system matrix has been passed to the preconditioner!"));
124 preconditioner_matrix_ptr =
125 std::any_cast<dealii::TrilinosWrappers::SparseMatrix *>(external_preconditioner_matrix);
126 }
127 preconditioner.initialize(*preconditioner_matrix_ptr,
128 typename DealiiPreconditionerType::AdditionalData());
129 }
130
136 void
138 {
139 if (eq_operator != nullptr && do_matrix_free)
140 {
141 dsp.reinit(scratch_data.get_dof_handler(dof_idx).n_dofs(),
145 not scratch_data.get_cut_type(dof_idx) == CutUtil::CutPhaseType::not_cut)
146 {
147 dealii::DoFTools::make_flux_sparsity_pattern(scratch_data.get_dof_handler(dof_idx),
148 dsp,
150 false);
151 }
152 else
153 {
154 dealii::DoFTools::make_sparsity_pattern(scratch_data.get_dof_handler(dof_idx),
155 dsp,
157 }
158 dealii::SparsityTools::distribute_sparsity_pattern(
159 dsp,
165 dsp,
167 }
168 }
169
170 private:
171 DealiiPreconditionerType preconditioner;
172 dealii::TrilinosWrappers::SparseMatrix preconditioner_system_matrix;
173 dealii::DynamicSparsityPattern dsp;
174
175 const OperatorType *eq_operator;
176
178
179 const unsigned int dof_idx;
180
181 const bool do_matrix_free;
182 };
183
188 template <int dim, typename VectorType, typename number>
190 {
191 public:
192 void
193 vmult(VectorType &dst, const VectorType &src) const
194 {
195 dst = src;
196 }
197
198 void
199 update(const std::any &) const
200 {}
201
202 void
203 reinit() const
204 {}
205 };
206} // namespace MeltPoolDG
Definition preconditioner_trilinos_wrapper.hpp:46
DealiiPreconditionerType preconditioner
Definition preconditioner_trilinos_wrapper.hpp:171
const unsigned int dof_idx
Definition preconditioner_trilinos_wrapper.hpp:179
const bool do_matrix_free
Definition preconditioner_trilinos_wrapper.hpp:181
const ScratchData< dim, dim, number > & scratch_data
Definition preconditioner_trilinos_wrapper.hpp:177
void vmult(VectorType &dst, const VectorType &src) const
Definition preconditioner_trilinos_wrapper.hpp:73
dealii::DynamicSparsityPattern dsp
Definition preconditioner_trilinos_wrapper.hpp:173
const OperatorType * eq_operator
Definition preconditioner_trilinos_wrapper.hpp:175
DealiiPreconditionerWrapper(const OperatorType *operator_in, const ScratchData< dim, dim, number > &scratch_data_in, const unsigned dof_idx_in, const bool do_matrix_free=true)
Definition preconditioner_trilinos_wrapper.hpp:56
void reinit()
Definition preconditioner_trilinos_wrapper.hpp:137
void update(const std::any &external_preconditioner_matrix=std::any())
Definition preconditioner_trilinos_wrapper.hpp:99
dealii::TrilinosWrappers::SparseMatrix preconditioner_system_matrix
Definition preconditioner_trilinos_wrapper.hpp:172
Definition preconditioner_trilinos_wrapper.hpp:190
void reinit() const
Definition preconditioner_trilinos_wrapper.hpp:203
void update(const std::any &) const
Definition preconditioner_trilinos_wrapper.hpp:199
void vmult(VectorType &dst, const VectorType &src) const
Definition preconditioner_trilinos_wrapper.hpp:193
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
CutUtil::CutPhaseType get_cut_type(const unsigned int dof_idx) const
Get the cut-cell phase type for a given DoFHandler.
Definition scratch_data.cpp:600
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
bool is_FE_DGQ(const unsigned int dof_idx, const unsigned int component=0) const
Check whether a given component uses FE_DGQ.
Definition scratch_data.cpp:591
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
Definition preconditioner_trilinos_wrapper.hpp:29
Interface for a general preconditioner.
Definition boundary_condition_functions.hpp:17