From f01addc41042ea1a29abc8a04d54bd8dcf242143 Mon Sep 17 00:00:00 2001 From: Wolfgang Bangerth Date: Thu, 5 May 2022 14:59:55 -0600 Subject: [PATCH] Add tests. --- tests/grid/reference_cell_type_02_midpoint.cc | 87 ++++++++++++++++++ .../reference_cell_type_02_midpoint.output | 22 +++++ tests/grid/reference_cell_type_03_midpoint.cc | 92 +++++++++++++++++++ .../reference_cell_type_03_midpoint.output | 22 +++++ 4 files changed, 223 insertions(+) create mode 100644 tests/grid/reference_cell_type_02_midpoint.cc create mode 100644 tests/grid/reference_cell_type_02_midpoint.output create mode 100644 tests/grid/reference_cell_type_03_midpoint.cc create mode 100644 tests/grid/reference_cell_type_03_midpoint.output diff --git a/tests/grid/reference_cell_type_02_midpoint.cc b/tests/grid/reference_cell_type_02_midpoint.cc new file mode 100644 index 0000000000..e47cd30811 --- /dev/null +++ b/tests/grid/reference_cell_type_02_midpoint.cc @@ -0,0 +1,87 @@ +// --------------------------------------------------------------------- +// +// Copyright (C) 2020 - 2021 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. +// +// --------------------------------------------------------------------- + + +// Test ReferenceCell::volume() with +// ReferenceCell::get_midpoint_quadrature() + +#include + +#include +#include + +#include +#include + +#include "../tests.h" + +using namespace dealii; + +template +void +test(const ReferenceCell &reference_cell) +{ + Triangulation triangulation; + GridGenerator::reference_cell(triangulation, reference_cell); + + const Quadrature q = reference_cell.get_midpoint_quadrature(); + Assert(q.size() == 1, ExcInternalError()); + + FE_Nothing fe(reference_cell); + + // Set up the objects to compute an integral on the reference cell + FEValues fe_values(fe, q, update_JxW_values); + fe_values.reinit(triangulation.begin_active()); + + double volume = 0; + for (unsigned int i = 0; i < q.size(); ++i) + volume += fe_values.JxW(i); + + deallog << "ReferenceCell: " << reference_cell.to_string() << std::endl; + deallog << " computed volume = " << volume << std::endl; + deallog << " self-reported volume = " << reference_cell.volume() + << std::endl; + + Assert(std::fabs(volume - reference_cell.volume()) < 1e-12, + ExcInternalError()); +} + +int +main() +{ + initlog(); + + { + deallog.push("1D"); + test<1>(ReferenceCells::Line); + deallog.pop(); + } + + { + deallog.push("2D"); + test<2>(ReferenceCells::Quadrilateral); + test<2>(ReferenceCells::Triangle); + deallog.pop(); + } + + { + deallog.push("3D"); + test<3>(ReferenceCells::Tetrahedron); + test<3>(ReferenceCells::Pyramid); + test<3>(ReferenceCells::Wedge); + test<3>(ReferenceCells::Hexahedron); + deallog.pop(); + } +} diff --git a/tests/grid/reference_cell_type_02_midpoint.output b/tests/grid/reference_cell_type_02_midpoint.output new file mode 100644 index 0000000000..6bda28a242 --- /dev/null +++ b/tests/grid/reference_cell_type_02_midpoint.output @@ -0,0 +1,22 @@ + +DEAL:1D::ReferenceCell: Line +DEAL:1D:: computed volume = 1.00000 +DEAL:1D:: self-reported volume = 1.00000 +DEAL:2D::ReferenceCell: Quad +DEAL:2D:: computed volume = 1.00000 +DEAL:2D:: self-reported volume = 1.00000 +DEAL:2D::ReferenceCell: Tri +DEAL:2D:: computed volume = 0.500000 +DEAL:2D:: self-reported volume = 0.500000 +DEAL:3D::ReferenceCell: Tet +DEAL:3D:: computed volume = 0.166667 +DEAL:3D:: self-reported volume = 0.166667 +DEAL:3D::ReferenceCell: Pyramid +DEAL:3D:: computed volume = 1.33333 +DEAL:3D:: self-reported volume = 1.33333 +DEAL:3D::ReferenceCell: Wedge +DEAL:3D:: computed volume = 0.500000 +DEAL:3D:: self-reported volume = 0.500000 +DEAL:3D::ReferenceCell: Hex +DEAL:3D:: computed volume = 1.00000 +DEAL:3D:: self-reported volume = 1.00000 diff --git a/tests/grid/reference_cell_type_03_midpoint.cc b/tests/grid/reference_cell_type_03_midpoint.cc new file mode 100644 index 0000000000..1b5bcf18d3 --- /dev/null +++ b/tests/grid/reference_cell_type_03_midpoint.cc @@ -0,0 +1,92 @@ +// --------------------------------------------------------------------- +// +// Copyright (C) 2020 - 2021 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. +// +// --------------------------------------------------------------------- + + +// Test ReferenceCell::barycenter() with +// ReferenceCell::get_midpoint_quadrature() + +#include + +#include +#include + +#include +#include + +#include "../tests.h" + +using namespace dealii; + +template +void +test(const ReferenceCell &reference_cell) +{ + Triangulation triangulation; + GridGenerator::reference_cell(triangulation, reference_cell); + + const Quadrature q = reference_cell.get_midpoint_quadrature(); + Assert(q.size() == 1, ExcInternalError()); + + FE_Nothing fe(reference_cell); + + // Set up the objects to compute an integral on the reference cell + FEValues fe_values(fe, q, update_JxW_values | update_quadrature_points); + fe_values.reinit(triangulation.begin_active()); + + double volume = 0; + Point barycenter; + for (unsigned int i = 0; i < q.size(); ++i) + { + volume += fe_values.JxW(i); + barycenter += fe_values.quadrature_point(i) * fe_values.JxW(i); + } + barycenter /= volume; + + deallog << "ReferenceCell: " << reference_cell.to_string() << std::endl; + deallog << " computed barycenter = " << barycenter << std::endl; + deallog << " self-reported barycenter = " << reference_cell.barycenter() + << std::endl; + + Assert((barycenter - reference_cell.barycenter()).norm() <= 1e-12, + ExcInternalError()); +} + +int +main() +{ + initlog(); + + { + deallog.push("1D"); + test<1>(ReferenceCells::Line); + deallog.pop(); + } + + { + deallog.push("2D"); + test<2>(ReferenceCells::Quadrilateral); + test<2>(ReferenceCells::Triangle); + deallog.pop(); + } + + { + deallog.push("3D"); + test<3>(ReferenceCells::Tetrahedron); + test<3>(ReferenceCells::Pyramid); + test<3>(ReferenceCells::Wedge); + test<3>(ReferenceCells::Hexahedron); + deallog.pop(); + } +} diff --git a/tests/grid/reference_cell_type_03_midpoint.output b/tests/grid/reference_cell_type_03_midpoint.output new file mode 100644 index 0000000000..42bbf99968 --- /dev/null +++ b/tests/grid/reference_cell_type_03_midpoint.output @@ -0,0 +1,22 @@ + +DEAL:1D::ReferenceCell: Line +DEAL:1D:: computed barycenter = 0.500000 +DEAL:1D:: self-reported barycenter = 0.500000 +DEAL:2D::ReferenceCell: Quad +DEAL:2D:: computed barycenter = 0.500000 0.500000 +DEAL:2D:: self-reported barycenter = 0.500000 0.500000 +DEAL:2D::ReferenceCell: Tri +DEAL:2D:: computed barycenter = 0.333333 0.333333 +DEAL:2D:: self-reported barycenter = 0.333333 0.333333 +DEAL:3D::ReferenceCell: Tet +DEAL:3D:: computed barycenter = 0.250000 0.250000 0.250000 +DEAL:3D:: self-reported barycenter = 0.250000 0.250000 0.250000 +DEAL:3D::ReferenceCell: Pyramid +DEAL:3D:: computed barycenter = 0 0 0.250000 +DEAL:3D:: self-reported barycenter = 0.00000 0.00000 0.250000 +DEAL:3D::ReferenceCell: Wedge +DEAL:3D:: computed barycenter = 0.333333 0.333333 0.500000 +DEAL:3D:: self-reported barycenter = 0.333333 0.333333 0.500000 +DEAL:3D::ReferenceCell: Hex +DEAL:3D:: computed barycenter = 0.500000 0.500000 0.500000 +DEAL:3D:: self-reported barycenter = 0.500000 0.500000 0.500000 -- 2.39.5