From 1195dbbee9e40b56a0f7f1b1f5dd12b904b45e49 Mon Sep 17 00:00:00 2001 From: Peter Munch Date: Wed, 20 Jul 2022 20:52:03 +0200 Subject: [PATCH] Make all template specialization of FPE compile for float --- include/deal.II/base/derivative_form.h | 14 ++-- .../deal.II/matrix_free/fe_point_evaluation.h | 18 ++--- tests/matrix_free/point_evaluation_18.cc | 76 +++++++++++++++++++ tests/matrix_free/point_evaluation_18.output | 2 + 4 files changed, 93 insertions(+), 17 deletions(-) create mode 100644 tests/matrix_free/point_evaluation_18.cc create mode 100644 tests/matrix_free/point_evaluation_18.output diff --git a/include/deal.II/base/derivative_form.h b/include/deal.II/base/derivative_form.h index 10d6545ed1..bb4fa64e3c 100644 --- a/include/deal.II/base/derivative_form.h +++ b/include/deal.II/base/derivative_form.h @@ -108,12 +108,14 @@ public: * Number>. In particular, if order == 1 and the derivative is the Jacobian of * $\mathbf F(\mathbf x)$, then Tensor[i] = $\nabla F_i(\mathbf x)$. */ - operator Tensor() const; + template + operator Tensor() const; /** * Converts a DerivativeForm<1, dim, 1, Number> to Tensor<1, dim, Number>. */ - operator Tensor<1, dim, Number>() const; + template + operator Tensor<1, dim, Number2>() const; /** * Return the transpose of a rectangular DerivativeForm, @@ -273,8 +275,9 @@ DerivativeForm::operator[]( template +template inline DerivativeForm:: -operator Tensor<1, dim, Number>() const +operator Tensor<1, dim, Number2>() const { Assert((1 == spacedim) && (order == 1), ExcMessage("Only allowed for spacedim==1.")); @@ -285,12 +288,13 @@ operator Tensor<1, dim, Number>() const template +template inline DerivativeForm:: -operator Tensor() const +operator Tensor() const { Assert((dim == spacedim), ExcMessage("Only allowed when dim==spacedim.")); - Tensor t; + Tensor t; if (dim == spacedim) for (unsigned int j = 0; j < dim; ++j) diff --git a/include/deal.II/matrix_free/fe_point_evaluation.h b/include/deal.II/matrix_free/fe_point_evaluation.h index f8e3269b24..4e64cfc2df 100644 --- a/include/deal.II/matrix_free/fe_point_evaluation.h +++ b/include/deal.II/matrix_free/fe_point_evaluation.h @@ -947,15 +947,11 @@ FEPointEvaluation::evaluate( Number>::set_gradient(val_and_grad.second, j, unit_gradients[i + j]); - gradients[i + j] = - static_cast::gradient_type>( - apply_transformation(mapping_info->get_mapping_data() - .inverse_jacobians[i + j] - .transpose(), - unit_gradients[i + j])); + gradients[i + j] = static_cast( + apply_transformation(mapping_info->get_mapping_data() + .inverse_jacobians[i + j] + .transpose(), + unit_gradients[i + j])); } } } @@ -1092,9 +1088,7 @@ FEPointEvaluation::integrate( for (unsigned int j = 0; j < n_lanes && i + j < n_points; ++j) { gradients[i + j] = - static_cast:: - gradient_type>(apply_transformation( + static_cast(apply_transformation( mapping_info->get_mapping_data().inverse_jacobians[i + j], gradients[i + j])); internal::FEPointEvaluation:: diff --git a/tests/matrix_free/point_evaluation_18.cc b/tests/matrix_free/point_evaluation_18.cc new file mode 100644 index 0000000000..ab9666760f --- /dev/null +++ b/tests/matrix_free/point_evaluation_18.cc @@ -0,0 +1,76 @@ +// --------------------------------------------------------------------- +// +// Copyright (C) 2022 by the deal.II authors +// +// This file is part of the deal.II library. +// +// The deal.II library is free software; you can use it, redistribute +// it, and/or modify it under the terms of the GNU Lesser General +// Public License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// The full text of the license can be found in the file LICENSE.md at +// the top level directory of deal.II. +// +// --------------------------------------------------------------------- + + +// Check that all template specializations of FEPointEvaluation are +// compiling. + +#include + +#include "../tests.h" + +template +void +test() +{ + return; // nothing to do, since we are only interested if the code + // compiles + + std::unique_ptr> mapping; + std::unique_ptr> fe; + + FEPointEvaluation fpe( + *mapping, *fe, UpdateFlags::update_default); + + Triangulation tria; + + fpe.reinit(tria.begin(), ArrayView>()); + + fpe.evaluate(ArrayView(), EvaluationFlags::values); + + fpe.integrate(ArrayView(), EvaluationFlags::values); +} + +int +main() +{ + initlog(); + + test<1, 1, 1, double>(); + test<2, 1, 1, double>(); + + test<1, 2, 2, double>(); + test<2, 2, 2, double>(); + test<3, 2, 2, double>(); + + test<1, 3, 3, double>(); + test<2, 3, 3, double>(); + test<3, 3, 3, double>(); + test<4, 3, 3, double>(); + + test<1, 1, 1, float>(); + test<2, 1, 1, float>(); + + test<1, 2, 2, float>(); + test<2, 2, 2, float>(); + test<3, 2, 2, float>(); + + test<1, 3, 3, float>(); + test<2, 3, 3, float>(); + test<3, 3, 3, float>(); + test<4, 3, 3, float>(); + + deallog << "OK!" << std::endl; +} diff --git a/tests/matrix_free/point_evaluation_18.output b/tests/matrix_free/point_evaluation_18.output new file mode 100644 index 0000000000..5cfb783b8f --- /dev/null +++ b/tests/matrix_free/point_evaluation_18.output @@ -0,0 +1,2 @@ + +DEAL::OK! -- 2.39.5