diff --git a/dumux/discretization/staggered/freeflow/subcontrolvolumeface.hh b/dumux/discretization/staggered/freeflow/subcontrolvolumeface.hh index 5caf10a4e67d368336885a8be6f793abcd08d954..46603e72d8eb48c299c37d453465f14384ae2f39 100644 --- a/dumux/discretization/staggered/freeflow/subcontrolvolumeface.hh +++ b/dumux/discretization/staggered/freeflow/subcontrolvolumeface.hh @@ -146,7 +146,6 @@ public: const std::vector<GridIndexType>& scvIndices, const typename T::GeometryHelper& geometryHelper) : ParentType(), - geomType_(isGeometry.type()), area_(isGeometry.volume()), center_(isGeometry.center()), unitOuterNormal_(is.centerUnitOuterNormal()), @@ -222,13 +221,6 @@ public: return scvfIndex_; } - //! The geometry of the sub control volume face - [[deprecated("Will be removed after 3.7. Use fvGeometry.geometry(scvf).")]] - const Geometry geometry() const - { - return Geometry(geomType_, corners_); - } - //! The local index of this sub control volume face LocalIndexType localFaceIdx() const { @@ -442,7 +434,6 @@ public: { isGhostFace_ = isGhostFaceFlag; } private: - Dune::GeometryType geomType_; CornerStorage corners_; Scalar area_; GlobalPosition center_; diff --git a/dumux/discretization/staggered/fvelementgeometry.hh b/dumux/discretization/staggered/fvelementgeometry.hh index ee9ec9747ea74296c8a387ec142085998a89acff..0bd81fdd5b068e214f77e6ff53c9302d96bbb0e5 100644 --- a/dumux/discretization/staggered/fvelementgeometry.hh +++ b/dumux/discretization/staggered/fvelementgeometry.hh @@ -15,6 +15,7 @@ #include <optional> #include <dumux/common/indextraits.hh> #include <dumux/discretization/cellcentered/tpfa/fvelementgeometry.hh> +#include <dumux/discretization/staggered/freeflow/subcontrolvolumeface.hh> namespace Dumux { @@ -207,20 +208,41 @@ public: bool hasBoundaryScvf() const { return hasBoundaryScvf_; } - // suppress warnings due to current implementation - // these interfaces should be used! - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wdeprecated-declarations" - //! Create the geometry of a given sub control volume typename SubControlVolume::Traits::Geometry geometry(const SubControlVolume& scv) const - { return scv.geometry(); } + { return gridGeometryPtr_->element(scv.dofIndex()).geometry(); } //! Create the geometry of a given sub control volume face typename SubControlVolumeFace::Traits::Geometry geometry(const SubControlVolumeFace& scvf) const - { return scvf.geometry(); } + { + const auto element = gridGeometryPtr_->element(scvf.insideScvIdx()); + const auto& scvfIndices = gridGeometryPtr_->scvfIndicesOfScv(scvf.insideScvIdx()); + const LocalIndexType localScvfIdx = Detail::Tpfa::findLocalIndex(scvf.index(), scvfIndices); + LocalIndexType localIdx = 0; + using FaceCornerStorage = typename SubControlVolumeFace::Traits::CornerStorage; + for (const auto& intersection : intersections(gridGeometryPtr_->gridView(), element)) + { + if (intersection.neighbor() || intersection.boundary()) + { + if (localIdx == localScvfIdx) + { + FaceCornerStorage corners{}; + const auto& isGeometry = intersection.geometry(); + if constexpr (Detail::hasResize<FaceCornerStorage>()) + corners.resize(isGeometry.corners()); - #pragma GCC diagnostic pop + for (int i = 0; i < isGeometry.corners(); ++i) + corners[i] = isGeometry.corner(i); + + return {intersection.type(), corners}; + } + else + ++localIdx; + } + } + + DUNE_THROW(Dune::InvalidStateException, "Could not find scvf geometry"); + } private: //! Binding of an element preparing the geometries only inside the element diff --git a/dumux/discretization/staggered/subcontrolvolumeface.hh b/dumux/discretization/staggered/subcontrolvolumeface.hh index 6adf5ef48044914edb3a56eea382d3f08ec799e9..99f2d61dcd098be39fccb7fb0159a90dbc283e58 100644 --- a/dumux/discretization/staggered/subcontrolvolumeface.hh +++ b/dumux/discretization/staggered/subcontrolvolumeface.hh @@ -90,6 +90,7 @@ struct StaggeredDefaultScvfGeometryTraits using LocalIndexType = typename IndexTraits<GridView>::LocalIndex; using Scalar = typename GridView::ctype; using GlobalPosition = Dune::FieldVector<Scalar, GridView::dimensionworld>; + using CornerStorage = std::vector<GlobalPosition>; }; /*! @@ -129,7 +130,6 @@ public: const std::vector<GridIndexType>& scvIndices, const GeometryHelper& geometryHelper) : ParentType() - , geomType_(isGeometry.type()) , area_(isGeometry.volume()) , center_(isGeometry.center()) , unitOuterNormal_(is.centerUnitOuterNormal()) @@ -137,10 +137,6 @@ public: , scvIndices_(scvIndices) , boundary_(is.boundary()) { - corners_.resize(isGeometry.corners()); - for (int i = 0; i < isGeometry.corners(); ++i) - corners_[i] = isGeometry.corner(i); - dofIdx_ = geometryHelper.dofIndex(); localFaceIdx_ = geometryHelper.localFaceIndex(); } @@ -200,13 +196,6 @@ public: return scvfIndex_; } - //! The geometry of the sub control volume face - [[deprecated("Will be removed after 3.7. Use fvGeometry.geometry(scvf).")]] - const Geometry geometry() const - { - return Geometry(geomType_, corners_); - } - //! The global index of the dof living on this face GridIndexType dofIndex() const { @@ -220,8 +209,6 @@ public: } private: - Dune::GeometryType geomType_; - std::vector<GlobalPosition> corners_; Scalar area_; GlobalPosition center_; GlobalPosition unitOuterNormal_;