struct FEEvaluationImplEvaluateSelector
{
template <int fe_degree, int n_q_points_1d>
- static void
+ static bool
run(const unsigned int n_components,
const EvaluationFlags::EvaluationFlags evaluation_flag,
const internal::MatrixFreeFunctions::ShapeInfo<Number> &shape_info,
}
else
AssertThrow(false, ExcNotImplemented());
+
+ return false;
}
};
struct FEEvaluationImplIntegrateSelector
{
template <int fe_degree, int n_q_points_1d>
- static void
+ static bool
run(const unsigned int n_components,
const EvaluationFlags::EvaluationFlags integration_flag,
const internal::MatrixFreeFunctions::ShapeInfo<Number> &shape_info,
}
else
AssertThrow(false, ExcNotImplemented());
+
+ return false;
}
};
struct FEFaceEvaluationImplEvaluateSelector
{
template <int fe_degree, int n_q_points_1d>
- static void
+ static bool
run(const unsigned int n_components,
const MatrixFreeFunctions::ShapeInfo<VectorizedArrayType> &data,
const VectorizedArrayType * values_array,
scratch_data,
values_quad,
gradients_quad);
+
+ return false;
}
};
struct FEFaceEvaluationImplIntegrateSelector
{
template <int fe_degree, int n_q_points_1d>
- static void
+ static bool
run(const unsigned int n_components,
const MatrixFreeFunctions::ShapeInfo<VectorizedArrayType> &data,
VectorizedArrayType * values_array,
values_array,
integrate_gradients,
face_no);
+ return false;
}
};
/**
* This struct implements the action of the inverse mass matrix operation
+ * using an FEEvaluationBaseData argument.
*/
- template <int dim, int fe_degree, typename Number>
- struct CellwiseInverseMassMatrixImpl
+ template <int dim, typename Number>
+ struct CellwiseInverseMassMatrixImplBasic
{
- static void
- apply(const unsigned int n_components,
- const FEEvaluationBaseData<dim,
- typename Number::value_type,
- false,
- Number> &fe_eval,
- const Number * in_array,
- Number * out_array)
+ template <int fe_degree, int = 0>
+ static bool
+ run(const unsigned int n_components,
+ const FEEvaluationBaseData<dim,
+ typename Number::value_type,
+ false,
+ Number> &fe_eval,
+ const Number * in_array,
+ Number * out_array)
{
constexpr unsigned int dofs_per_component =
Utilities::pow(fe_degree + 1, dim);
evaluator.template hessians<1, false, false>(out, out);
evaluator.template hessians<0, false, false>(out, out);
}
+ return false;
}
+ };
- static void
- apply(const unsigned int n_desired_components,
- const AlignedVector<Number> &inverse_shape,
- const AlignedVector<Number> &inverse_coefficients,
- const Number * in_array,
- Number * out_array)
+
+
+ /**
+ * This struct implements the action of the inverse mass matrix operation
+ * using an FEEvaluationBaseData argument.
+ */
+ template <int dim, typename Number>
+ struct CellwiseInverseMassMatrixImplFlexible
+ {
+ template <int fe_degree, int = 0>
+ static bool
+ run(const unsigned int n_desired_components,
+ const AlignedVector<Number> &inverse_shape,
+ const AlignedVector<Number> &inverse_coefficients,
+ const Number * in_array,
+ Number * out_array)
{
constexpr unsigned int dofs_per_component =
Utilities::pow(fe_degree + 1, dim);
inv_coefficient += shift_coefficient;
}
+ return false;
}
+ };
- static void
- transform_from_q_points_to_basis(const unsigned int n_desired_components,
- const AlignedVector<Number> &inverse_shape,
- const Number * in_array,
- Number * out_array)
+
+
+ /**
+ * This struct implements the action of the inverse mass matrix operation
+ * using an FEEvaluationBaseData argument.
+ */
+ template <int dim, typename Number>
+ struct CellwiseInverseMassMatrixImplTransformFromQPoints
+ {
+ template <int fe_degree, int = 0>
+ static bool
+ run(const unsigned int n_desired_components,
+ const AlignedVector<Number> &inverse_shape,
+ const Number * in_array,
+ Number * out_array)
{
constexpr unsigned int dofs_per_cell = Utilities::pow(fe_degree + 1, dim);
internal::EvaluatorTensorProduct<internal::evaluate_evenodd,
if (dim == 1)
evaluator.template hessians<0, false, false>(in, out);
}
+ return false;
}
};
VectorizedArrayType>::apply(const VectorizedArrayType *in_array,
VectorizedArrayType * out_array) const
{
- internal::
- CellwiseInverseMassMatrixImpl<dim, fe_degree, VectorizedArrayType>::apply(
- n_components, fe_eval, in_array, out_array);
+ internal::CellwiseInverseMassMatrixImplBasic<dim, VectorizedArrayType>::
+ template run<fe_degree>(n_components, fe_eval, in_array, out_array);
}
const VectorizedArrayType * in_array,
VectorizedArrayType * out_array) const
{
- internal::
- CellwiseInverseMassMatrixImpl<dim, fe_degree, VectorizedArrayType>::apply(
+ internal::CellwiseInverseMassMatrixImplFlexible<dim, VectorizedArrayType>::
+ template run<fe_degree>(
n_actual_components,
fe_eval.get_shape_info().data.front().inverse_shape_values_eo,
inverse_coefficients,
const VectorizedArrayType *in_array,
VectorizedArrayType * out_array) const
{
- internal::
- CellwiseInverseMassMatrixImpl<dim, fe_degree, VectorizedArrayType>::
- transform_from_q_points_to_basis(
- n_actual_components,
- fe_eval.get_shape_info().data.front().inverse_shape_values_eo,
- in_array,
- out_array);
+ internal::CellwiseInverseMassMatrixImplTransformFromQPoints<
+ dim,
+ VectorizedArrayType>::template run<fe_degree>(n_actual_components,
+ fe_eval.get_shape_info()
+ .data.front()
+ .inverse_shape_values_eo,
+ in_array,
+ out_array);
}