43struct InverseMassOperatorData
45 InverseMassOperatorData()
48 coefficient_is_variable(
false),
49 consider_inverse_coefficient(
false),
50 variable_coefficients(
nullptr)
57 static InverseMassType
58 get_optimal_inverse_mass_type(dealii::FiniteElement<dim>
const & fe,
59 bool const use_affine_mapping)
61 if(fe.conforms(dealii::FiniteElementData<dim>::L2))
63 if(fe.reference_cell().is_hyper_cube() || use_affine_mapping)
65 return InverseMassType::MatrixfreeOperator;
69 return InverseMassType::ElementwiseKrylovSolver;
74 return InverseMassType::GlobalKrylovSolver;
79 unsigned int dof_index;
80 unsigned int quad_index;
85 bool coefficient_is_variable;
90 bool consider_inverse_coefficient;
96class InverseMassOperator
99 typedef dealii::LinearAlgebra::distributed::Vector<Number> VectorType;
101 typedef InverseMassOperator<dim, n_components, Number> This;
103 typedef CellIntegrator<dim, n_components, Number> Integrator;
106 typedef dealii::MatrixFreeOperators::CellwiseInverseMassMatrix<dim, -1, n_components, Number>
107 InverseMassAsMatrixFreeOperator;
109 typedef std::pair<unsigned int, unsigned int> Range;
112 InverseMassOperator();
115 get_n_iter_global_last()
const;
118 initialize(dealii::MatrixFree<dim, Number>
const & matrix_free_in,
120 dealii::AffineConstraints<Number>
const * constraints =
nullptr);
131 apply(VectorType & dst, VectorType
const & src)
const;
135 apply_scale(VectorType & dst,
double const scaling_factor, VectorType
const & src)
const;
140 cell_loop_matrix_free_operator(dealii::MatrixFree<dim, Number>
const &,
142 VectorType
const & src,
143 Range
const & cell_range)
const;
146 cell_loop_matrix_free_operator_simplex(dealii::MatrixFree<dim, Number>
const &,
148 VectorType
const & src,
149 Range
const & cell_range)
const;
151 dealii::MatrixFree<dim, Number>
const * matrix_free;
153 unsigned int dof_index, quad_index;
155 bool is_hypercube_element;
156 std::vector<Number> inverse_mass_matrix;
162 bool coefficient_is_variable;
163 bool consider_inverse_coefficient;
169 std::shared_ptr<PreconditionerBase<Number>> global_preconditioner;
170 std::shared_ptr<Krylov::SolverBase<VectorType>> global_solver;
173 mutable unsigned int n_iter_global_last = dealii::numbers::invalid_unsigned_int;
179 std::shared_ptr<BlockJacobiPreconditioner<MassOperator<dim, n_components, Number>>>
180 block_jacobi_preconditioner;