diff --git a/CHANGELOG.md b/CHANGELOG.md index 88060895e173d69068a3d51c989364505ab6f527..e963353581819d81121848f8fc9c34d06e59cb46 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ Furthermore, flags for either shared library or position independent code needs to be used. +- The class `AxisAlignedCubeGeometry` has always had a constructor taking + two arguments `FieldVector<ctype,coorddim> lower` and `FieldVector<ctype,coorddim> upper`. + This constructor was always to be used in the case `dim==coorddim` only, + but this was never enforced. Starting with version 2.8, compilation + fails with an error message if this constructor is used with `dim!=coorddim`. + ## Deprecations and removals - Remove code needed to use reference elements by reference. diff --git a/dune/geometry/axisalignedcubegeometry.hh b/dune/geometry/axisalignedcubegeometry.hh index b4d6ca09d28ccadd625af7f782b6ffc8c361bbad..65df510e09220911b98d4c19777464877cbb5e8d 100644 --- a/dune/geometry/axisalignedcubegeometry.hh +++ b/dune/geometry/axisalignedcubegeometry.hh @@ -99,6 +99,7 @@ namespace Dune { upper_(upper), axes_() { + static_assert(dim==coorddim, "Use this constructor only if dim==coorddim!"); // all 'true', but is never actually used axes_ = (1<<coorddim)-1; } diff --git a/dune/geometry/refinement/hcube.cc b/dune/geometry/refinement/hcube.cc index 27855e7ccb2c9f9acd8ea202e44f3b94c5423caa..9c92fc9a91333d8d5cc0f33fb6d53b4d3c6f3af7 100644 --- a/dune/geometry/refinement/hcube.cc +++ b/dune/geometry/refinement/hcube.cc @@ -397,19 +397,22 @@ namespace Dune assert(codimension == 0 or codimension == dimension); - if (codimension == 0) { + if constexpr (codimension == 0) { for (size_t j = 0; j < dimension; j++) { lower[j] = double(intCoords[j]) / double(_nIntervals); upper[j] = double(intCoords[j] + 1) / double(_nIntervals); } + + return typename RefinementImp<dimension, + CoordType>::template Codim<codimension>::Geometry(lower,upper); } else { for (size_t j = 0; j < dimension; j++) lower[j] = upper[j] = double(intCoords[j]) / double(_nIntervals); - } - return typename RefinementImp<dimension, - CoordType>::template Codim<codimension>::Geometry(lower,upper); + return typename RefinementImp<dimension, + CoordType>::template Codim<codimension>::Geometry(lower,upper,std::bitset<dimension>(0)); + } } #endif // DOXYGEN diff --git a/dune/geometry/test/test-axisalignedcubegeometry.cc b/dune/geometry/test/test-axisalignedcubegeometry.cc index ec932545caaed10c99705c04e8d109d70f4d5d64..2ec10cd9c011bfb23defda47a03230d11eec0db2 100644 --- a/dune/geometry/test/test-axisalignedcubegeometry.cc +++ b/dune/geometry/test/test-axisalignedcubegeometry.cc @@ -58,8 +58,11 @@ void testCodimZero(int& result) FieldVector<double,coorddim> lower(0); FieldVector<double,coorddim> upper(1); + std::bitset<coorddim> axes(0); + for (int i=0; i<dim; i++) + axes[i] = true; - ElementGeometry geometry( lower, upper ); + ElementGeometry geometry( lower, upper, axes ); if (checkGeometry(geometry)) pass(result); @@ -69,7 +72,7 @@ void testCodimZero(int& result) testBasicGeometryAffine(geometry, result); // test assignability - ElementGeometry geometry2( lower, upper ); + ElementGeometry geometry2( lower, upper, axes ); geometry2 = geometry; }