6#include <deal.II/base/config.h>
7#include <deal.II/base/exceptions.h>
8#include <deal.II/base/point.h>
9#include <deal.II/base/symmetric_tensor.h>
10#include <deal.II/base/tensor.h>
11#include <deal.II/lac/vector.h>
12#include <deal.II/matrix_free/evaluation_flags.h>
13#include <deal.II/matrix_free/fe_evaluation.h>
14#include <deal.II/matrix_free/matrix_free.h>
24#include <prismspf/config.h>
48template <
unsigned int dim,
unsigned int degree,
typename number>
62 template <TensorRank Rank>
67 template <TensorRank Rank>
70 template <TensorRank Rank>
73 template <TensorRank Rank>
75 dealii::FEEvaluation<dim,
78 dealii::Tensor<int(Rank), dim>::n_independent_components,
85 template <
typename ValType>
88 if constexpr (std::is_same_v<ValType, ScalarValue>)
92 else if constexpr (std::is_same_v<ValType, ScalarValue::value_type>)
105 template <
typename GradType>
108 if constexpr (std::is_same_v<GradType, ScalarValue>)
122 template <TensorRank Rank>
184 template <DependencyType type>
188 template <DependencyType type>
199 reinit(
unsigned int cell);
229 FieldContainer(
const std::vector<FieldAttributes> &_field_attributes,
231 unsigned int _relative_level,
234 const MatrixFree<dim, number> &matrix_free);
240 reinit(
unsigned int cell);
287 template <TensorRank Rank, DependencyType type>
294 template <TensorRank Rank>
301 template <TensorRank Rank, DependencyType type>
308 template <TensorRank Rank>
315 template <TensorRank Rank, DependencyType type>
322 template <TensorRank Rank>
329 template <TensorRank Rank, DependencyType type>
336 template <TensorRank Rank>
343 template <TensorRank Rank, DependencyType type>
350 template <TensorRank Rank>
357 template <TensorRank Rank, DependencyType type>
364 template <TensorRank Rank>
371 template <TensorRank Rank, DependencyType type>
372 [[nodiscard]] dealii::SymmetricTensor<2, dim, ScalarValue>
378 template <TensorRank Rank>
379 [[nodiscard]] dealii::SymmetricTensor<2, dim, ScalarValue>
385 template <TensorRank Rank, DependencyType type>
386 [[nodiscard]] dealii::Tensor<1, (dim == 2 ? 1 : dim),
ScalarValue>
392 template <TensorRank Rank>
393 [[nodiscard]] dealii::Tensor<1, (dim == 2 ? 1 : dim),
ScalarValue>
399 [[nodiscard]] dealii::Point<dim, ScalarValue>
411 [[nodiscard]]
unsigned int
417 template <
typename ValType>
424 template <
typename GradType>
429 template <TensorRank Rank>
430 std::vector<FEEValuationDeps<Rank>> &
433 template <TensorRank Rank>
434 const std::vector<FEEValuationDeps<Rank>> &
458 dealii::EvaluationFlags::EvaluationFlags flag)
const;
513template <
unsigned int dim,
unsigned int degree,
typename number>
514template <TensorRank Rank>
519 : solution_level(mf_id_pair.first)
520 , block_index(mf_id_pair.second)
531 for (
unsigned int age = 0; age < dependency.
old_flags.size(); ++age)
550template <
unsigned int dim,
unsigned int degree,
typename number>
551template <TensorRank Rank>
552template <DependencyType Type>
560 return fe_eval_src_dst->first;
564 return fe_eval->first;
568 return fe_eval_old[int(
Type) - 1]->first;
572template <
unsigned int dim,
unsigned int degree,
typename number>
573template <TensorRank Rank>
574template <DependencyType Type>
575inline DEAL_II_ALWAYS_INLINE
582 return fe_eval_src_dst->first;
586 return fe_eval->first;
590 return fe_eval_old[int(
Type) - 1]->first;
594template <
unsigned int dim,
unsigned int degree,
typename number>
595template <TensorRank Rank>
604 return fe_eval_src_dst->first;
608 return fe_eval->first;
611 return fe_eval_old[type - 1]->first;
615template <
unsigned int dim,
unsigned int degree,
typename number>
616template <TensorRank Rank>
617inline DEAL_II_ALWAYS_INLINE
624 return fe_eval_src_dst->first;
628 return fe_eval->first;
631 return fe_eval_old[type - 1]->first;
635template <
unsigned int dim,
unsigned int degree,
typename number>
636template <TensorRank Rank>
642 fe_eval->first.
reinit(cell);
644 for (
auto &old_fe_eval : fe_eval_old)
648 old_fe_eval->first.reinit(cell);
653 fe_eval_src_dst->first.reinit(cell);
657template <
unsigned int dim,
unsigned int degree,
typename number>
658template <TensorRank Rank>
667 fe_eval->first.read_dof_values_plain(solution_level->solutions.block(block_index));
668 fe_eval->first.evaluate(fe_eval->second);
670 for (
unsigned int age = 0; age < fe_eval_old.size(); ++age)
674 old_fe_eval->first.read_dof_values_plain(
675 solution_level->old_solutions[age].block(block_index));
676 old_fe_eval->first.evaluate(old_fe_eval->second);
679 if (fe_eval_src_dst && fe_eval_src_dst->second != EvalFlags::nothing)
681 fe_eval_src_dst->first.read_dof_values_plain(_src_solutions->block(block_index));
682 fe_eval_src_dst->first.evaluate(fe_eval_src_dst->second);
686template <
unsigned int dim,
unsigned int degree,
typename number>
687template <TensorRank Rank>
697 fe_eval->first.reinit(cell);
698 fe_eval->first.read_dof_values_plain(solution_level->solutions.block(block_index));
699 fe_eval->first.evaluate(fe_eval->second);
701 for (
unsigned int age = 0; age < fe_eval_old.size(); ++age)
705 old_fe_eval->first.reinit(cell);
706 old_fe_eval->first.read_dof_values_plain(
707 solution_level->old_solutions[age].block(block_index));
708 old_fe_eval->first.evaluate(old_fe_eval->second);
713 fe_eval_src_dst->first.reinit(cell);
714 if (fe_eval_src_dst->second != EvalFlags::nothing)
716 fe_eval_src_dst->first.read_dof_values_plain(
717 _src_solutions->block(block_index));
718 fe_eval_src_dst->first.evaluate(fe_eval_src_dst->second);
723template <
unsigned int dim,
unsigned int degree,
typename number>
724template <TensorRank Rank>
730 fe_eval_src_dst->first.integrate(integration_flags);
734template <
unsigned int dim,
unsigned int degree,
typename number>
735template <TensorRank Rank>
742 fe_eval_src_dst->first.distribute_local_to_global(
743 dst_solutions->block(block_index));
747template <
unsigned int dim,
unsigned int degree,
typename number>
748template <TensorRank Rank>
755 fe_eval_src_dst->first.integrate_scatter(integration_flags,
756 dst_solutions->block(block_index));
760template <
unsigned int dim,
unsigned int degree,
typename number>
766 fe_eval.reinit(cell);
770 fe_eval.reinit(cell);
775template <
unsigned int dim,
unsigned int degree,
typename number>
781 fe_eval.eval(src_solutions);
785 fe_eval.eval(src_solutions);
790template <
unsigned int dim,
unsigned int degree,
typename number>
798 fe_eval.reinit_and_eval(cell, src_solutions);
802 fe_eval.reinit_and_eval(cell, src_solutions);
808template <
unsigned int dim,
unsigned int degree,
typename number>
827template <
unsigned int dim,
unsigned int degree,
typename number>
846template <
unsigned int dim,
unsigned int degree,
typename number>
867template <
unsigned int dim,
unsigned int degree,
typename number>
868inline DEAL_II_ALWAYS_INLINE
void
874template <
unsigned int dim,
unsigned int degree,
typename number>
875template <TensorRank Rank, DependencyType type>
876inline DEAL_II_ALWAYS_INLINE
885template <
unsigned int dim,
unsigned int degree,
typename number>
886template <TensorRank Rank>
896template <
unsigned int dim,
unsigned int degree,
typename number>
897template <TensorRank Rank, DependencyType type>
908template <
unsigned int dim,
unsigned int degree,
typename number>
909template <TensorRank Rank>
919template <
unsigned int dim,
unsigned int degree,
typename number>
920template <TensorRank Rank, DependencyType type>
931template <
unsigned int dim,
unsigned int degree,
typename number>
932template <TensorRank Rank>
942template <
unsigned int dim,
unsigned int degree,
typename number>
943template <TensorRank Rank, DependencyType type>
951 .get_hessian_diagonal(
q_point);
954template <
unsigned int dim,
unsigned int degree,
typename number>
955template <TensorRank Rank>
964 .get_hessian_diagonal(
q_point);
967template <
unsigned int dim,
unsigned int degree,
typename number>
968template <TensorRank Rank, DependencyType type>
979template <
unsigned int dim,
unsigned int degree,
typename number>
980template <TensorRank Rank>
991template <
unsigned int dim,
unsigned int degree,
typename number>
992template <TensorRank Rank, DependencyType type>
997 static_assert(
Rank == 1,
"Divergences are only available for vector fields");
1003template <
unsigned int dim,
unsigned int degree,
typename number>
1004template <TensorRank Rank>
1009 static_assert(
Rank == 1,
"Divergences are only available for vector fields");
1015template <
unsigned int dim,
unsigned int degree,
typename number>
1016template <TensorRank Rank, DependencyType type>
1018 SymmetricTensor<2, dim, typename FieldContainer<dim, degree, number>::ScalarValue>
1022 static_assert(
Rank == 1,
"Symmetric gradients are only available for vector fields");
1025 .get_symmetric_gradient(
q_point);
1028template <
unsigned int dim,
unsigned int degree,
typename number>
1029template <TensorRank Rank>
1031 SymmetricTensor<2, dim, typename FieldContainer<dim, degree, number>::ScalarValue>
1036 static_assert(
Rank == 1,
"Symmetric gradients are only available for vector fields");
1039 .get_symmetric_gradient(
q_point);
1042template <
unsigned int dim,
unsigned int degree,
typename number>
1043template <TensorRank Rank, DependencyType type>
1050 static_assert(
Rank == 1,
"Curl is only available for vector fields");
1053 "Curl is only available for vector fields with dimension greater than 1."));
1059template <
unsigned int dim,
unsigned int degree,
typename number>
1060template <TensorRank Rank>
1068 static_assert(
Rank == 1,
"Curl is only available for vector fields");
1071 "Curl is only available for vector fields with dimension greater than 1."));
1076template <
unsigned int dim,
unsigned int degree,
typename number>
1078 dealii::Point<dim, typename FieldContainer<dim, degree, number>::ScalarValue>
1084template <
unsigned int dim,
unsigned int degree,
typename number>
1092template <
unsigned int dim,
unsigned int degree,
typename number>
1099template <
unsigned int dim,
unsigned int degree,
typename number>
1100template <
typename ValType>
1111template <
unsigned int dim,
unsigned int degree,
typename number>
1112template <
typename GradType>
1124template <
unsigned int dim,
unsigned int degree,
typename number>
1125template <TensorRank Rank>
1140template <
unsigned int dim,
unsigned int degree,
typename number>
1141template <TensorRank Rank>
1156template <
unsigned int dim,
unsigned int degree,
typename number>
1164template <
unsigned int dim,
unsigned int degree,
typename number>
1173template <
unsigned int dim,
unsigned int degree,
typename number>
1178 [[
maybe_unused]] dealii::EvaluationFlags::EvaluationFlags flag)
const
1183template <
unsigned int dim,
unsigned int degree,
typename number>
This class permits the access of a subset of indexed fields and gives an error if any non-allowed fie...
Definition field_container.h:50
dealii::SymmetricTensor< 2, dim, ScalarValue > get_symmetric_gradient(Types::Index global_variable_index, DependencyType type) const
Return the symmetric gradient of the specified field.
std::vector< FEEValuationDeps< Rank > > & get_relevant_feeval_vector()
dealii::Tensor< int(Rank)+2, dim, ScalarValue > Hessian
Definition field_container.h:71
void reinit_and_eval(unsigned int cell, const BlockVector< number > *src_solutions)
Initialize based on cell, read solution vector, and evaluate based on dependency flags for all depend...
Definition field_container.h:792
void access_valid(Types::Index field_index, DependencyType dependency_type, dealii::EvaluationFlags::EvaluationFlags flag) const
Check that a variable value/gradient/hessians was marked as needed and thus properly initialized.
Definition field_container.h:1175
Gradient< Rank > get_hessian_diagonal(Types::Index global_variable_index) const
Return the diagonal of the hessian of the specified field.
Value< Rank > get_laplacian(Types::Index global_variable_index, DependencyType type) const
Return the laplacian of the specified field.
ScalarValue get_divergence(Types::Index global_variable_index) const
Return the divergence of the specified field.
Gradient< Rank > get_hessian_diagonal(Types::Index global_variable_index, DependencyType type) const
Return the diagonal of the hessian of the specified field.
void eval(const BlockVector< number > *src_solutions)
Read solution vector, and evaluate based on dependency flags for all dependencies.
Definition field_container.h:777
FEEval< TensorRank::Scalar > shared_feeval_scalar
FEEvaluation object for generic cell operations.
Definition field_container.h:500
dealii::Tensor< 1, dim, ScalarValue > VectorValue
Typedef for the basic vector that the user manipulates.
Definition field_container.h:60
unsigned int relative_level
Multigrid level.
Definition field_container.h:505
dealii::Tensor< 1,(dim==2 ? 1 :dim), ScalarValue > get_curl(Types::Index global_variable_index, DependencyType type) const
Return the curl of the specified field.
void set_q_point(unsigned int q)
Set the current quadrature point.
Definition field_container.h:869
void submission_valid(Types::Index field_index, DependencyType dependency_type) const
Check that a value is valid for submission.
Definition field_container.h:1185
unsigned int q_point
The quadrature point.
Definition field_container.h:510
Value< Rank > get_value(Types::Index global_variable_index, DependencyType type) const
Return the value of the specified field.
dealii::Tensor< int(Rank)+1, dim, ScalarValue > Gradient
Definition field_container.h:68
dealii::VectorizedArray< number > ScalarValue
Typedef for the basic value that the user manipulates.
Definition field_container.h:55
void integrate()
Integrate the residuals.
Definition field_container.h:810
ScalarValue get_divergence(Types::Index global_variable_index, DependencyType type) const
Return the divergence of the specified field.
std::vector< FEEValuationDeps< TensorRank::Vector > > feeval_deps_vector
Collection of FEEvaluation dependencies for vector fields.
Definition field_container.h:484
const std::vector< FEEValuationDeps< Rank > > & get_relevant_feeval_vector() const
Hessian< Rank > get_hessian(Types::Index global_variable_index, DependencyType type) const
Return the hessian of the specified field.
static constexpr TensorRank RankFromVal
Return the tensor rank from the specified template value.
Definition field_container.h:86
void distribute(BlockVector< number > *dst_solutions)
Distribute the integrated residuals.
Definition field_container.h:829
void reinit(unsigned int cell)
Initialize based on cell for all dependencies.
Definition field_container.h:762
Value< Rank > get_value(Types::Index global_variable_index) const
Return the value of the specified field.
std::vector< FEEValuationDeps< TensorRank::Scalar > > feeval_deps_scalar
Collection of FEEvaluation dependencies for scalar fields.
Definition field_container.h:479
void feevaluation_exists(Types::Index field_index, Types::Index dependency_index) const
Check whether the entry for the FEEvaluation is within the bounds of the vector and not a nullptr.
Definition field_container.h:1166
void integrate_and_distribute(BlockVector< number > *dst_solutions)
Integrate the residuals and distribute from local to global.
Definition field_container.h:848
const std::vector< FieldAttributes > * field_attributes_ptr
Pointer to the vector of field attributes.
Definition field_container.h:469
dealii::SymmetricTensor< 2, dim, ScalarValue > get_symmetric_gradient(Types::Index global_variable_index) const
Return the symmetric gradient of the specified field.
const SolveGroup * solve_group
Solve group information.
Definition field_container.h:489
unsigned int get_n_q_points() const
Return the number of quadrature points.
Definition field_container.h:1094
void set_value_term(Types::Index global_variable_index, const ValType &val)
Set the residual value of the specified scalar/vector field.
dealii::Point< dim, ScalarValue > get_q_point_location() const
Return the quadrature point location.
Definition field_container.h:1079
Hessian< Rank > get_hessian(Types::Index global_variable_index) const
Return the hessian of the specified field.
ScalarValue get_element_volume() const
Return the quadrature point location.
Definition field_container.h:1086
static constexpr TensorRank RankFromGrad
Return the tensor rank from the specified template gradient.
Definition field_container.h:106
Gradient< Rank > get_gradient(Types::Index global_variable_index) const
Return the gradient of the specified field.
void set_gradient_term(Types::Index global_variable_index, const GradType &val)
Set the residual gradient of the specified scalar/vector field.
std::conditional_t< Rank==TensorRank::Scalar, ScalarValue, dealii::Tensor< int(Rank), dim, ScalarValue > > Value
Definition field_container.h:65
const SolutionIndexer< dim, number > * solution_indexer
Pointer to the solution indexer.
Definition field_container.h:474
Value< Rank > get_laplacian(Types::Index global_variable_index) const
Return the laplacian of the specified field.
Gradient< Rank > get_gradient(Types::Index global_variable_index, DependencyType type) const
Return the gradient of the specified field.
dealii::Tensor< 1,(dim==2 ? 1 :dim), ScalarValue > get_curl(Types::Index global_variable_index) const
Return the curl of the specified field.
dealii::FEEvaluation< dim, degree, degree+1, dealii::Tensor< int(Rank), dim >::n_independent_components, number, ScalarValue > FEEval
Definition field_container.h:80
void feevaluation_size_valid(Types::Index field_index) const
Check whether the entry for the FEEvaluation is within the bounds of the vector.
Definition field_container.h:1158
Class that provides access to solution vectors spread across different groups.
Definition solution_indexer.h:20
Structure to hold the attributes of a solve-group.
Definition solve_group.h:59
std::set< Types::Index > field_indices
Indices of the fields to be solved in this group.
Definition solve_group.h:98
This is the main class that handles the construction and solving of user-specified PDEs.
Definition system_wide.h:24
std::map< Types::Index, Dependency > DependencyMap
Definition dependencies.h:129
dealii::LinearAlgebra::distributed::BlockVector< number > BlockVector
Typedef for solution block vector.
Definition group_solution_handler.h:29
Definition conditional_ostreams.cc:20
unsigned int Index
Type for field indices.
Definition types.h:19
Type
Factory function to create appropriate reader based on input file type not a member of ReadFieldBase ...
Definition read_field_factory.h:30
Dependency struct containing evaluation flags for each field.
Definition dependencies.h:30
EvalFlags src_flag
Evaluation flags for the DependencyType::SRC solution.
Definition dependencies.h:42
std::vector< EvalFlags > old_flags
Collection of evaluation flags for the old solutions.
Definition dependencies.h:47
EvalFlags flag
Evaluation flags for the current solution.
Definition dependencies.h:36
Struct to hold the relevant dealii::FEEvaluation for a given solution block index.
Definition field_container.h:124
FEEDepPairPtr fe_eval_src_dst
FEEvaluation for the src and dst solutions.
Definition field_container.h:144
void eval(const BlockVector< number > *_src_solutions)
Definition field_container.h:660
void reinit_and_eval(unsigned int cell, const BlockVector< number > *_src_solutions)
Definition field_container.h:689
void integrate()
Definition field_container.h:726
std::shared_ptr< FEEDepPair > FEEDepPairPtr
Pointer the the FEEDepPair. We have to use ptrs because we don't want to construct fields we don't ne...
Definition field_container.h:134
const FEEval< Rank > & get() const
EvalFlags integration_flags
Destination integration flags. We use this to integrate value and gradient terms, if they exist.
Definition field_container.h:155
void distribute(BlockVector< number > *dst_solutions)
Definition field_container.h:737
void reinit(unsigned int cell)
Definition field_container.h:638
FEEDepPairPtr fe_eval
FEEvaluation for the current solution.
Definition field_container.h:139
FEEValuationDeps()=default
Default constructor.
std::vector< FEEDepPairPtr > fe_eval_old
Collection of FEEvaluation for old solutions (< n -1 state).
Definition field_container.h:149
void integrate_and_distribute(BlockVector< number > *dst_solutions)
Definition field_container.h:750
const SolutionLevel< dim, number > * solution_level
The solution group.
Definition field_container.h:163
std::pair< FEEval< Rank >, EvalFlags > FEEDepPair
dealii::FEEvaluation object and the evaluation flags.
Definition field_container.h:128
unsigned int block_index
The solution block index.
Definition field_container.h:172
The solution vectors and their corresponding matrix free object with respect to some multigrid level.
Definition group_solution_handler.h:61
DependencyType
Internal classification for types of variable dependencies.
Definition type_enums.h:51
@ Current
Definition type_enums.h:58
@ DST
Definition type_enums.h:52
@ SRC
Definition type_enums.h:53
TensorRank
Tensor rank of the field.
Definition type_enums.h:30
@ Vector
Definition type_enums.h:33
@ Scalar
Definition type_enums.h:32
dealii::EvaluationFlags::EvaluationFlags EvalFlags
Definition types.h:86