6#include <deal.II/base/vectorization.h>
7#include <deal.II/dofs/dof_handler.h>
8#include <deal.II/fe/fe_system.h>
9#include <deal.II/lac/affine_constraints.h>
10#include <deal.II/lac/la_parallel_vector.h>
11#include <deal.II/matrix_free/fe_evaluation.h>
12#include <deal.II/matrix_free/matrix_free.h>
19#include <prismspf/config.h>
26template <
unsigned int dim,
unsigned int degree,
typename number>
41 bool _calculate_scalar,
42 bool _calculate_vector)
43 :
num_levels(dof_manager.get_dof_handlers_levels().size())
54 reinit(dof_manager, constraint_manager);
61 const std::vector<std::array<dealii::DoFHandler<dim>, 2>> &dof_handlers =
63 const std::vector<std::array<dealii::AffineConstraints<number>, 2>> &constraints =
65 for (
unsigned int i = 0; i <
data.size(); ++i)
68 std::vector<
const dealii::DoFHandler<dim> *>(
69 {&dof_handlers[i][0], &dof_handlers[i][1]}),
70 std::vector<const dealii::AffineConstraints<number> *>(
71 {&constraints[i][0], &constraints[i][1]}),
104 dealii::ExcInternalError(
"Requested invm that was not calculated"));
126 dealii::ExcInternalError(
"Requested invm that was not calculated"));
148 dealii::ExcInternalError(
"Requested invm that was not calculated"));
159 std::vector<const SolutionVector<number> *>
160 get_invm(
const std::vector<FieldAttributes> &field_container,
161 const std::set<unsigned int> &field_indices,
162 unsigned int relative_level)
const
164 const unsigned int num_blocks = field_indices.size();
165 std::vector<const SolutionVector<number> *> out;
166 out.reserve(num_blocks);
167 for (
unsigned int field_index : field_indices)
169 out.push_back(&
get_invm(field_container[field_index].field_type, relative_level));
174 std::vector<const SolutionVector<number> *>
175 get_jxw(
const std::vector<FieldAttributes> &field_container,
176 const std::set<unsigned int> &field_indices,
177 unsigned int relative_level)
const
179 const unsigned int num_blocks = field_indices.size();
180 std::vector<const SolutionVector<number> *> out;
181 out.reserve(num_blocks);
182 for (
unsigned int field_index : field_indices)
184 out.push_back(&
get_jxw(field_container[field_index].field_type, relative_level));
189 std::vector<const SolutionVector<number> *>
191 const std::set<unsigned int> &field_indices,
192 unsigned int relative_level)
const
194 const unsigned int num_blocks = field_indices.size();
195 std::vector<const SolutionVector<number> *> out;
196 out.reserve(num_blocks);
197 for (
unsigned int field_index : field_indices)
200 &
get_invm_sqrt(field_container[field_index].field_type, relative_level));
235 for (
unsigned int i = 0; i <
data.size(); ++i)
250 for (
unsigned int i = 0; i <
data.size(); ++i)
265 [[maybe_unused]]
const int &src,
266 const std::pair<unsigned int, unsigned int> &cell_range)
const
268 dealii::FEEvaluation<dim, degree, degree + 1, 1, number> fe_eval(_data, 0);
269 for (
unsigned int cell = cell_range.first; cell < cell_range.second; ++cell)
271 fe_eval.reinit(cell);
272 for (
unsigned int quad = 0; quad < SystemWide<dim, degree>::quadrature.size();
275 fe_eval.submit_value(dealii::make_vectorized_array<number>(1.0), quad);
277 fe_eval.integrate_scatter(dealii::EvaluationFlags::values, dst);
284 [[maybe_unused]]
const int &src,
285 const std::pair<unsigned int, unsigned int> &cell_range)
const
287 dealii::FEEvaluation<dim, degree, degree + 1, dim, number> fe_eval(_data, 1);
288 for (
unsigned int cell = cell_range.first; cell < cell_range.second; ++cell)
290 fe_eval.reinit(cell);
291 for (
unsigned int quad = 0; quad < SystemWide<dim, degree>::quadrature.size();
294 fe_eval.submit_value(
one, quad);
296 fe_eval.integrate_scatter(dealii::EvaluationFlags::values, dst);
303 src.update_ghost_values();
304 dst.update_ghost_values();
305 Assert(dst.size() == src.size(), dealii::ExcInternalError());
306 for (
unsigned int i = 0; i < src.locally_owned_size(); ++i)
308 number src_el = src.local_element(i);
310 dst.local_element(i) = src_el == 0 ? 0.0 : 1.0 / src_el;
317 src.update_ghost_values();
318 dst.update_ghost_values();
319 Assert(dst.size() == src.size(), dealii::ExcInternalError());
320 for (
unsigned int i = 0; i < src.locally_owned_size(); ++i)
322 dst.local_element(i) = std::sqrt(src.local_element(i));
329 std::vector<MatrixFree<dim, number>>
data;
349 for (
unsigned int i = 0; i < dim; ++i)
357PRISMS_PF_END_NAMESPACE
The class handles the generation and application of boundary conditions based on the user-inputs.
Definition constraint_manager.h:50
const std::vector< std::array< dealii::AffineConstraints< number >, 2 > > & get_generic_constraints_levels() const
Getter function for the constraints.
Definition constraint_manager.cc:88
Class that manages the deal.II DoFHandlers.
Definition dof_manager.h:25
const std::vector< std::array< dealii::DoFHandler< dim >, 2 > > & get_dof_handlers_levels() const
Getter function for the scalar and vector DoFHandlers.
Definition dof_manager.cc:93
InvMManager(const DoFManager< dim, degree > &dof_manager, const ConstraintManager< dim, degree, number > &constraint_manager, bool _calculate_scalar, bool _calculate_vector)
Constructor.
Definition invm_manager.h:39
std::vector< const SolutionVector< number > * > get_invm(const std::vector< FieldAttributes > &field_container, const std::set< unsigned int > &field_indices, unsigned int relative_level) const
Definition invm_manager.h:160
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:282
static const VectorValue one
Definition invm_manager.h:346
std::vector< SolutionVector< number > > jxw_scalar
Vector that stores element volumes.
Definition invm_manager.h:339
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:263
dealii::VectorizedArray< number > ScalarValue
Definition invm_manager.h:30
unsigned int num_levels
Definition invm_manager.h:331
std::vector< SolutionVector< number > > invm_sqrt_vector
Definition invm_manager.h:344
bool calculate_vector
Definition invm_manager.h:334
std::vector< SolutionVector< number > > invm_sqrt_scalar
Definition invm_manager.h:343
std::vector< SolutionVector< number > > invm_vector
Definition invm_manager.h:342
void compute_invm()
Recompute the invm vectors.
Definition invm_manager.h:80
bool calculate_scalar
Definition invm_manager.h:333
const SolutionVector< number > & get_invm(TensorRank rank, unsigned int relative_level) const
Get the invm vector for a given rank and level.
Definition invm_manager.h:100
std::vector< SolutionVector< number > > invm_scalar
Definition invm_manager.h:341
dealii::Tensor< 1, dim, ScalarValue > VectorValue
Definition invm_manager.h:31
std::vector< SolutionVector< number > > jxw_vector
Definition invm_manager.h:340
std::vector< const SolutionVector< number > * > get_jxw(const std::vector< FieldAttributes > &field_container, const std::set< unsigned int > &field_indices, unsigned int relative_level) const
Definition invm_manager.h:175
void sqrt(SolutionVector< number > &dst, const SolutionVector< number > &src) const
Definition invm_manager.h:315
void compute_vector_invm()
Definition invm_manager.h:248
void compute_scalar_invm()
Compute element volume for the triangulation.
Definition invm_manager.h:233
std::vector< MatrixFree< dim, number > > data
Matrix-free object.
Definition invm_manager.h:329
const SolutionVector< number > & get_jxw(TensorRank rank, unsigned int relative_level) const
Get the integrated jxw vector for a given rank and level.
Definition invm_manager.h:122
std::vector< const SolutionVector< number > * > get_invm_sqrt(const std::vector< FieldAttributes > &field_container, const std::set< unsigned int > &field_indices, unsigned int relative_level) const
Definition invm_manager.h:190
void invert(SolutionVector< number > &dst, const SolutionVector< number > &src) const
Definition invm_manager.h:301
const SolutionVector< number > & get_invm_sqrt(TensorRank rank, unsigned int relative_level) const
Get the integrated jxw vector for a given rank and level.
Definition invm_manager.h:144
void initialize()
Initialize.
Definition invm_manager.h:210
void reinit(const DoFManager< dim, degree > &dof_manager, const ConstraintManager< dim, degree, number > &constraint_manager)
Definition invm_manager.h:58
static const dealii::QGaussLobatto< dim > quadrature
Quadrature rule.
Definition system_wide.h:41
static const dealii::MappingQ1< dim > mapping
Mappings to and from reference cell.
Definition system_wide.h:36
typename BlockVector< number >::BlockType SolutionVector
Typedef for solution vector.
Definition group_solution_handler.h:35
Definition conditional_ostreams.cc:20
TensorRank
Tensor rank of the field.
Definition type_enums.h:52
@ Vector
Definition type_enums.h:55
@ Scalar
Definition type_enums.h:54