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>
43 :
num_levels(dof_manager.get_dof_handlers().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)
70 dof_handlers[
i][
rank],
105 dealii::ExcInternalError(
"Requested invm that was not calculated"));
127 dealii::ExcInternalError(
"Requested invm that was not calculated"));
149 dealii::ExcInternalError(
"Requested invm that was not calculated"));
160 std::vector<const SolutionVector<number> *>
162 const std::set<unsigned int> &field_indices,
163 unsigned int relative_level)
const
165 const unsigned int num_blocks = field_indices.size();
166 std::vector<const SolutionVector<number> *>
out;
168 for (
unsigned int field_index : field_indices)
175 std::vector<const SolutionVector<number> *>
177 const std::set<unsigned int> &field_indices,
178 unsigned int relative_level)
const
180 const unsigned int num_blocks = field_indices.size();
181 std::vector<const SolutionVector<number> *>
out;
183 for (
unsigned int field_index : field_indices)
190 std::vector<const SolutionVector<number> *>
192 const std::set<unsigned int> &field_indices,
193 unsigned int relative_level)
const
195 const unsigned int num_blocks = field_indices.size();
196 std::vector<const SolutionVector<number> *>
out;
198 for (
unsigned int field_index : field_indices)
236 for (
unsigned int i = 0;
i <
data.size(); ++
i)
251 for (
unsigned int i = 0;
i <
data.size(); ++
i)
267 const std::pair<unsigned int, unsigned int> &
cell_range)
const
269 dealii::FEEvaluation<dim, degree, degree + 1, 1, number, ScalarValue> fe_eval(
_data);
272 fe_eval.reinit(
cell);
276 fe_eval.submit_value(dealii::make_vectorized_array<number>(1.0),
quad);
278 fe_eval.integrate_scatter(dealii::EvaluationFlags::values,
dst);
286 const std::pair<unsigned int, unsigned int> &
cell_range)
const
288 dealii::FEEvaluation<dim, degree, degree + 1, dim, number> fe_eval(
_data);
291 fe_eval.reinit(
cell);
295 fe_eval.submit_value(
one,
quad);
297 fe_eval.integrate_scatter(dealii::EvaluationFlags::values,
dst);
304 src.update_ghost_values();
305 dst.update_ghost_values();
306 Assert(
dst.size() ==
src.size(), dealii::ExcInternalError());
307 for (
unsigned int i = 0;
i <
src.locally_owned_size(); ++
i)
319 src.update_ghost_values();
320 dst.update_ghost_values();
321 Assert(
dst.size() ==
src.size(), dealii::ExcInternalError());
322 for (
unsigned int i = 0;
i <
src.locally_owned_size(); ++
i)
331 std::vector<std::array<MatrixFree<dim, number>, 2>>
data;
351 for (
unsigned int i = 0;
i <
dim; ++
i)
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() const
Getter function for the constraints.
Definition constraint_manager.cc:82
Class that manages the deal.II DoFHandlers.
Definition dof_manager.h:27
const std::vector< std::array< dealii::DoFHandler< dim >, 2 > > & get_dof_handlers() const
Getter function for the scalar and vector DoFHandlers.
Definition dof_manager.h:72
A little class that computes the element volume for our triangulation.
Definition invm_manager.h:28
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:161
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:283
static const VectorValue one
Definition invm_manager.h:348
std::vector< SolutionVector< number > > jxw_scalar
Vector that stores element volumes.
Definition invm_manager.h:341
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:264
dealii::VectorizedArray< number > ScalarValue
Definition invm_manager.h:30
unsigned int num_levels
Definition invm_manager.h:333
std::vector< SolutionVector< number > > invm_sqrt_vector
Definition invm_manager.h:346
bool calculate_vector
Definition invm_manager.h:336
std::vector< SolutionVector< number > > invm_sqrt_scalar
Definition invm_manager.h:345
std::vector< SolutionVector< number > > invm_vector
Definition invm_manager.h:344
void compute_invm()
Recompute the invm vectors.
Definition invm_manager.h:81
bool calculate_scalar
Definition invm_manager.h:335
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:101
std::vector< SolutionVector< number > > invm_scalar
Definition invm_manager.h:343
dealii::Tensor< 1, dim, ScalarValue > VectorValue
Definition invm_manager.h:31
std::vector< SolutionVector< number > > jxw_vector
Definition invm_manager.h:342
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:176
void sqrt(SolutionVector< number > &dst, const SolutionVector< number > &src) const
Definition invm_manager.h:316
void compute_vector_invm()
Definition invm_manager.h:249
void compute_scalar_invm()
Compute element volume for the triangulation.
Definition invm_manager.h:234
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:123
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:191
void invert(SolutionVector< number > &dst, const SolutionVector< number > &src) const
Definition invm_manager.h:302
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:145
void initialize()
Initialize.
Definition invm_manager.h:211
std::vector< std::array< MatrixFree< dim, number >, 2 > > data
Matrix-free object.
Definition invm_manager.h:331
void reinit(const DoFManager< dim, degree > &dof_manager, const ConstraintManager< dim, degree, number > &constraint_manager)
Definition invm_manager.h:58
This is the main class that handles the construction and solving of user-specified PDEs.
Definition system_wide.h:24
@ Value
Use value of the variable as a criterion for refinement.
Definition grid_refiner_criterion.h:31
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:30
@ Vector
Definition type_enums.h:33
@ Scalar
Definition type_enums.h:32