From 58aef1c3141f73dae2058398e898fd23d4a05646 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dennis=20Gl=C3=A4ser?= <dennis.glaeser@iws.uni-stuttgart.de> Date: Fri, 27 Oct 2023 13:32:38 +0200 Subject: [PATCH] [mpfa][fvelemgeom] expose vertex/facet corners --- .../cellcentered/mpfa/fvelementgeometry.hh | 41 +++++++++++++++++++ .../mpfa/omethod/scvgeometryhelper.hh | 6 +-- .../cellcentered/mpfa/subcontrolvolumeface.hh | 3 ++ .../facet/cellcentered/mpfa/couplingmapper.hh | 2 +- 4 files changed, 48 insertions(+), 4 deletions(-) diff --git a/dumux/discretization/cellcentered/mpfa/fvelementgeometry.hh b/dumux/discretization/cellcentered/mpfa/fvelementgeometry.hh index 1f02570882..e1c7531bcd 100644 --- a/dumux/discretization/cellcentered/mpfa/fvelementgeometry.hh +++ b/dumux/discretization/cellcentered/mpfa/fvelementgeometry.hh @@ -59,6 +59,31 @@ typename SubControlVolumeFace::Traits::Geometry makeScvfGeometry(const GridGeome DUNE_THROW(Dune::InvalidStateException, "Could not construct scvf geometry"); } +template<typename GridGeometry, typename SubControlVolumeFace> +auto getVertexCorner(const GridGeometry& gridGeometry, const SubControlVolumeFace& scvf) +{ + static constexpr int dim = GridGeometry::GridView::dimension; + + const auto& facetInfo = scvf.facetInfo(); + const auto element = gridGeometry.element(facetInfo.elementIndex); + const auto elemGeo = element.geometry(); + const auto refElement = referenceElement(elemGeo); + return elemGeo.global(refElement.position( + refElement.subEntity(facetInfo.facetIndex, 1, facetInfo.facetCornerIndex, dim), + dim + )); +} + +template<typename GridGeometry, typename SubControlVolumeFace> +auto getFacetCorner(const GridGeometry& gridGeometry, const SubControlVolumeFace& scvf) +{ + const auto& facetInfo = scvf.facetInfo(); + const auto element = gridGeometry.element(facetInfo.elementIndex); + const auto elemGeo = element.geometry(); + const auto refElement = referenceElement(elemGeo); + return elemGeo.global(refElement.position(facetInfo.facetIndex, 1)); +} + } // namespace Detail::Mpfa #endif // DOXYGEN @@ -225,6 +250,14 @@ public: typename SubControlVolumeFace::Traits::Geometry geometry(const SubControlVolumeFace& scvf) const { return Detail::Mpfa::makeScvfGeometry(gridGeometry(), scvf); } + //! Return the position of the scvf corner that coincides with an element vertex + typename SubControlVolumeFace::Traits::GlobalPosition vertexCorner(const SubControlVolumeFace& scvf) const + { return Detail::Mpfa::getVertexCorner(gridGeometry(), scvf); } + + //! Return the corner of the scvf that is inside the facet the scvf is embedded in + typename SubControlVolumeFace::Traits::GlobalPosition facetCorner(const SubControlVolumeFace& scvf) const + { return Detail::Mpfa::getFacetCorner(gridGeometry(), scvf); } + private: std::optional<Element> element_; @@ -383,6 +416,14 @@ public: typename SubControlVolumeFace::Traits::Geometry geometry(const SubControlVolumeFace& scvf) const { return Detail::Mpfa::makeScvfGeometry(gridGeometry(), scvf); } + //! Return the position of the scvf corner that coincides with an element vertex + typename SubControlVolumeFace::Traits::GlobalPosition vertexCorner(const SubControlVolumeFace& scvf) const + { return Detail::Mpfa::getVertexCorner(gridGeometry(), scvf); } + + //! Return the corner of the scvf that is inside the facet the scvf is embedded in + typename SubControlVolumeFace::Traits::GlobalPosition facetCorner(const SubControlVolumeFace& scvf) const + { return Detail::Mpfa::getFacetCorner(gridGeometry(), scvf); } + private: //! Binding of an element preparing the geometries of the whole stencil diff --git a/dumux/discretization/cellcentered/mpfa/omethod/scvgeometryhelper.hh b/dumux/discretization/cellcentered/mpfa/omethod/scvgeometryhelper.hh index 4d772a3982..4db457755c 100644 --- a/dumux/discretization/cellcentered/mpfa/omethod/scvgeometryhelper.hh +++ b/dumux/discretization/cellcentered/mpfa/omethod/scvgeometryhelper.hh @@ -71,9 +71,9 @@ public: typename MLGTraits::template CornerStorage<dim, dimWorld>::Type corners; corners[0] = fvGeometry.scv( scv.gridScvIndex() ).center(); - corners[1] = firstGridScvf.facetCorner(); - corners[2] = secondGridScvf.facetCorner(); - corners[3] = secondGridScvf.vertexCorner(); + corners[1] = fvGeometry.facetCorner(firstGridScvf); + corners[2] = fvGeometry.facetCorner(secondGridScvf); + corners[3] = fvGeometry.vertexCorner(secondGridScvf); using std::swap; typename LocalScvType::LocalBasis basis; diff --git a/dumux/discretization/cellcentered/mpfa/subcontrolvolumeface.hh b/dumux/discretization/cellcentered/mpfa/subcontrolvolumeface.hh index 427617e4ae..7249250cad 100644 --- a/dumux/discretization/cellcentered/mpfa/subcontrolvolumeface.hh +++ b/dumux/discretization/cellcentered/mpfa/subcontrolvolumeface.hh @@ -194,14 +194,17 @@ public: { return outsideScvIndices_; } //! Returns the number of corners + [[deprecated("Will be removed after 3.8. Use fvGeometry.geometry(scvf).corners().")]] std::size_t corners() const { return corners_.size(); } //! Returns the global position of the vertex the scvf is connected to + [[deprecated("Will be removed after 3.8. Use fvGeometry.vertexCorner(scvf)")]] const GlobalPosition& vertexCorner() const { return corners_.back(); } //! Returns the global position of the center of the element facet this scvf is embedded in + [[deprecated("Will be removed after 3.8. Use fvGeometry.facetCorner(scvf)")]] const GlobalPosition& facetCorner() const { return corners_[0]; } diff --git a/dumux/multidomain/facet/cellcentered/mpfa/couplingmapper.hh b/dumux/multidomain/facet/cellcentered/mpfa/couplingmapper.hh index 9c9d612d1d..54fc7ca8de 100644 --- a/dumux/multidomain/facet/cellcentered/mpfa/couplingmapper.hh +++ b/dumux/multidomain/facet/cellcentered/mpfa/couplingmapper.hh @@ -127,7 +127,7 @@ public: else { const auto eps = lowDimGeometry.volume()*1e-8; - const auto diffVec = lowDimGeometry.center()-scvf.facetCorner(); + const auto diffVec = lowDimGeometry.center()-fvGeometry.facetCorner(scvf); if ( Dune::FloatCmp::eq<GlobalPosition, Dune::FloatCmp::CmpStyle::absolute>(diffVec, GlobalPosition(0.0), eps) ) embeddedScvfIndices.push_back(scvf.index()); -- GitLab