6#include <deal.II/base/exceptions.h>
7#include <deal.II/base/vectorization.h>
8#include <deal.II/matrix_free/fe_evaluation.h>
13#include <prismspf/config.h>
20template <
unsigned int dim,
unsigned int degree,
typename number>
68 std::vector<const SolutionVector<number> *>
69 get_invm(
const std::vector<FieldAttributes> &field_container,
70 const std::set<unsigned int> &field_indices,
71 unsigned int relative_level = -1)
const;
73 std::vector<const SolutionVector<number> *>
74 get_jxw(
const std::vector<FieldAttributes> &field_container,
75 const std::set<unsigned int> &field_indices,
76 unsigned int relative_level = -1)
const;
78 std::vector<const SolutionVector<number> *>
79 get_invm_sqrt(
const std::vector<FieldAttributes> &field_container,
80 const std::set<unsigned int> &field_indices,
81 unsigned int relative_level = -1)
const;
97 const MatrixFree<dim, number> &matrix_free =
mf_manager().get_generic_matrix_free();
98 jxw_scalar.reinit(matrix_free.get_vector_partitioner(0));
99 invm_scalar.reinit(matrix_free.get_vector_partitioner(0));
102 jxw_vector.reinit(matrix_free.get_vector_partitioner(1));
103 invm_vector.reinit(matrix_free.get_vector_partitioner(1));
107 const MatrixFree<dim, number> &mg_matrix_free =
109 mg_jxw_scalar[i].reinit(mg_matrix_free.get_vector_partitioner(0));
110 mg_invm_scalar[i].reinit(mg_matrix_free.get_vector_partitioner(0));
113 mg_jxw_vector[i].reinit(mg_matrix_free.get_vector_partitioner(1));
114 mg_invm_vector[i].reinit(mg_matrix_free.get_vector_partitioner(1));
125 const MatrixFree<dim, number> &matrix_free =
mf_manager().get_generic_matrix_free();
135 const MatrixFree<dim, number> &mg_matrix_free =
153 const MatrixFree<dim, number> &matrix_free =
mf_manager().get_generic_matrix_free();
163 const MatrixFree<dim, number> &mg_matrix_free =
181 [[maybe_unused]]
const int &src,
182 const std::pair<unsigned int, unsigned int> &cell_range)
const
184 dealii::FEEvaluation<dim, degree, degree + 1, 1, number> fe_eval(_data, 0);
185 for (
unsigned int cell = cell_range.first; cell < cell_range.second; ++cell)
187 fe_eval.reinit(cell);
188 for (
unsigned int quad = 0; quad < SystemWide<dim, degree>::quadrature.size();
191 fe_eval.submit_value(dealii::make_vectorized_array<number>(1.0), quad);
193 fe_eval.integrate_scatter(dealii::EvaluationFlags::values, dst);
200 [[maybe_unused]]
const int &src,
201 const std::pair<unsigned int, unsigned int> &cell_range)
const
203 dealii::FEEvaluation<dim, degree, degree + 1, dim, number> fe_eval(_data, 1);
204 for (
unsigned int cell = cell_range.first; cell < cell_range.second; ++cell)
206 fe_eval.reinit(cell);
207 for (
unsigned int quad = 0; quad < SystemWide<dim, degree>::quadrature.size();
210 fe_eval.submit_value(
one, quad);
212 fe_eval.integrate_scatter(dealii::EvaluationFlags::values, dst);
219 src.update_ghost_values();
220 dst.update_ghost_values();
221 Assert(dst.size() == src.size(), dealii::ExcInternalError());
222 for (
unsigned int i = 0; i < src.locally_owned_size(); ++i)
224 number src_el = src.local_element(i);
226 dst.local_element(i) = src_el == 0 ? 0.0 : 1.0 / src_el;
233 src.update_ghost_values();
234 dst.update_ghost_values();
235 Assert(dst.size() == src.size(), dealii::ExcInternalError());
236 for (
unsigned int i = 0; i < src.locally_owned_size(); ++i)
238 dst.local_element(i) = std::sqrt(src.local_element(i));
265 for (
unsigned int i = 0; i < dim; ++i)
273template <
unsigned int dim,
unsigned int degree,
typename number>
289template <
unsigned int dim,
unsigned int degree,
typename number>
297template <
unsigned int dim,
unsigned int degree,
typename number>
300 unsigned int relative_level)
const
302 if (relative_level == -1)
323template <
unsigned int dim,
unsigned int degree,
typename number>
326 unsigned int relative_level)
const
328 if (relative_level == -1)
349template <
unsigned int dim,
unsigned int degree,
typename number>
352 unsigned int relative_level)
const
354 if (relative_level == -1)
375template <
unsigned int dim,
unsigned int degree,
typename number>
376inline std::vector<const SolutionVector<number> *>
378 const std::vector<FieldAttributes> &field_container,
379 const std::set<unsigned int> &field_indices,
380 unsigned int relative_level)
const
382 const unsigned int num_blocks = field_indices.size();
383 std::vector<const SolutionVector<number> *> out;
384 out.reserve(num_blocks);
385 for (
unsigned int field_index : field_indices)
387 out.push_back(&
get_invm(field_container[field_index].field_type, relative_level));
392template <
unsigned int dim,
unsigned int degree,
typename number>
393inline std::vector<const SolutionVector<number> *>
395 const std::vector<FieldAttributes> &field_container,
396 const std::set<unsigned int> &field_indices,
397 unsigned int relative_level)
const
399 const unsigned int num_blocks = field_indices.size();
400 std::vector<const SolutionVector<number> *> out;
401 out.reserve(num_blocks);
402 for (
unsigned int field_index : field_indices)
404 out.push_back(&
get_jxw(field_container[field_index].field_type, relative_level));
409template <
unsigned int dim,
unsigned int degree,
typename number>
410inline std::vector<const SolutionVector<number> *>
412 const std::vector<FieldAttributes> &field_container,
413 const std::set<unsigned int> &field_indices,
414 unsigned int relative_level)
const
416 const unsigned int num_blocks = field_indices.size();
417 std::vector<const SolutionVector<number> *> out;
418 out.reserve(num_blocks);
419 for (
unsigned int field_index : field_indices)
422 &
get_invm_sqrt(field_container[field_index].field_type, relative_level));
427PRISMS_PF_END_NAMESPACE
void compute_local_vector(const MatrixFree< dim, number > &_data, SolutionVector< number > &dst, const int &src, const std::pair< unsigned int, unsigned int > &cell_range) const
Definition invm_manager.h:198
const SolutionVector< number > & get_jxw(TensorRank rank, unsigned int relative_level=-1) const
Get the integrated jxw vector for a given rank and level.
Definition invm_manager.h:325
std::vector< SolutionVector< number > > mg_invm_vector
Definition invm_manager.h:256
static const VectorValue one
Definition invm_manager.h:262
std::vector< SolutionVector< number > > mg_invm_scalar
Definition invm_manager.h:255
void compute_local_scalar(const MatrixFree< dim, number > &_data, SolutionVector< number > &dst, const int &src, const std::pair< unsigned int, unsigned int > &cell_range) const
Definition invm_manager.h:179
std::vector< SolutionVector< number > > mg_jxw_vector
Definition invm_manager.h:254
dealii::VectorizedArray< number > ScalarValue
Definition invm_manager.h:24
unsigned int num_levels
Definition invm_manager.h:242
SolutionVector< number > invm_vector
Definition invm_manager.h:250
std::vector< SolutionVector< number > > mg_invm_sqrt_vector
Definition invm_manager.h:258
std::vector< SolutionVector< number > > mg_jxw_scalar
Definition invm_manager.h:253
SolutionVector< number > jxw_vector
Definition invm_manager.h:248
const MatrixFreeManager< dim, number > & mf_manager()
Definition invm_manager.h:85
void reinit(const MatrixFreeManager< dim, number > &matrix_free_manager)
Reserve space.
Definition invm_manager.h:275
SolutionVector< number > invm_sqrt_vector
Definition invm_manager.h:252
InvMManager()=default
Constructor.
SolutionVector< number > invm_sqrt_scalar
Definition invm_manager.h:251
void compute_invm()
Recompute the invm vectors.
Definition invm_manager.h:291
const SolutionVector< number > & get_invm_sqrt(TensorRank rank, unsigned int relative_level=-1) const
Get the integrated jxw vector for a given rank.
Definition invm_manager.h:351
dealii::Tensor< 1, dim, ScalarValue > VectorValue
Definition invm_manager.h:25
const MatrixFreeManager< dim, number > * mf_manager_ptr
Definition invm_manager.h:260
void sqrt(SolutionVector< number > &dst, const SolutionVector< number > &src) const
Definition invm_manager.h:231
std::vector< SolutionVector< number > > mg_invm_sqrt_scalar
Definition invm_manager.h:257
void compute_vector_invm()
Definition invm_manager.h:151
void compute_scalar_invm()
Compute element volume for the triangulation.
Definition invm_manager.h:123
SolutionVector< number > jxw_scalar
Vector that stores element volumes.
Definition invm_manager.h:247
void invert(SolutionVector< number > &dst, const SolutionVector< number > &src) const
Definition invm_manager.h:217
void initialize()
Initialize.
Definition invm_manager.h:95
const SolutionVector< number > & get_invm(TensorRank rank, unsigned int relative_level=-1) const
Get the invm vector for a given rank and level.
Definition invm_manager.h:299
SolutionVector< number > invm_scalar
Definition invm_manager.h:249
Containers for matrix free objects.
Definition matrix_free_manager.h:45
const std::vector< MatrixFree< dim, number > > & get_generic_matrix_free_levels() const
Definition matrix_free_manager.h:232
typename BlockVector< number >::BlockType SolutionVector
Typedef for solution vector.
Definition matrix_free_manager.h:38
Definition conditional_ostreams.cc:20
TensorRank
Tensor rank of the field.
Definition type_enums.h:52
@ Scalar
Definition type_enums.h:54