From 2899ede610362b50cd6e28d74c03cf6eed54e445 Mon Sep 17 00:00:00 2001 From: Timo Koch <timokoch@math.uio.no> Date: Fri, 12 Aug 2022 09:39:17 +0000 Subject: [PATCH] [diamond] Fix and test fvGeometry.geometry(scv,scvf) interface --- .../facecentered/diamond/fvelementgeometry.hh | 29 +++++++++++++++++-- .../diamond/test_diamondgridgeometry.cc | 7 +++++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/dumux/discretization/facecentered/diamond/fvelementgeometry.hh b/dumux/discretization/facecentered/diamond/fvelementgeometry.hh index 507c0b1e27..03eed2cb39 100644 --- a/dumux/discretization/facecentered/diamond/fvelementgeometry.hh +++ b/dumux/discretization/facecentered/diamond/fvelementgeometry.hh @@ -178,16 +178,39 @@ public: { return eIdx_; } //! Geometry of a sub control volume - typename SubControlVolume::Traits::Geometry geometry(const Element& element, const SubControlVolume& scv) const + typename SubControlVolume::Traits::Geometry geometry(const SubControlVolume& scv) const { assert(isBound()); - const auto geo = element.geometry(); + const auto geo = element().geometry(); return { - SubControlVolume::Traits::geometryType(), + SubControlVolume::Traits::geometryType(geo.type()), GeometryHelper(geo).getScvCorners(scv.indexInElement()) }; } + //! Geometry of a sub control volume face + typename SubControlVolumeFace::Traits::Geometry geometry(const SubControlVolumeFace& scvf) const + { + assert(isBound()); + const auto geo = element().geometry(); + if (scvf.boundary()) + { + // use the information that each boundary scvf corresponds to one scv constructed around the same facet + const auto localFacetIndex = scvf.insideScvIdx(); + return { + referenceElement(geo).type(localFacetIndex, 1), + GeometryHelper(geo).getBoundaryScvfCorners(localFacetIndex) + }; + } + else + { + return { + SubControlVolumeFace::Traits::interiorGeometryType(geo.type()), + GeometryHelper(geo).getScvfCorners(scvf.index()) + }; + } + } + private: std::optional<Element> element_; GridIndexType eIdx_; diff --git a/test/discretization/facecentered/diamond/test_diamondgridgeometry.cc b/test/discretization/facecentered/diamond/test_diamondgridgeometry.cc index 43815b8853..f992d83998 100644 --- a/test/discretization/facecentered/diamond/test_diamondgridgeometry.cc +++ b/test/discretization/facecentered/diamond/test_diamondgridgeometry.cc @@ -100,6 +100,9 @@ int main (int argc, char *argv[]) for (auto&& scv : scvs(fvGeometry)) { std::cout << "-- scv " << scv.localDofIndex() << " center at: " << scv.center() << " , volume: " << scv.volume() << std::endl; + const auto geo = fvGeometry.geometry(scv); + if ((geo.center()-scv.center()).two_norm() > 1e-14) + DUNE_THROW(Dune::Exception, "Center of scv-geometry and scv do not match! " << geo.center() << ", " << scv.center()); } auto range2 = scvfs(fvGeometry); @@ -111,6 +114,10 @@ int main (int argc, char *argv[]) for (auto&& scvf : scvfs(fvGeometry)) { std::cout << "-- scvf " << scvf.index() << " ip at: " << scvf.ipGlobal() << " normal: " << scvf.unitOuterNormal(); + const auto geo = fvGeometry.geometry(scvf); + if ((geo.center()-scvf.center()).two_norm() > 1e-14) + DUNE_THROW(Dune::Exception, "Center of scvf-geometry and scvf do not match! " << geo.center() << ", " << scvf.center()); + if (scvf.boundary()) { ++boundaryCount; -- GitLab