diff --git a/dumux/common/CMakeLists.txt b/dumux/common/CMakeLists.txt index c0d33e16a691ea3175f5b928e5d60c9136e3f2f9..203c6367569ec9512a373f46efa6439aeaca8d3a 100644 --- a/dumux/common/CMakeLists.txt +++ b/dumux/common/CMakeLists.txt @@ -9,6 +9,7 @@ exceptions.hh fixedlengthspline_.hh intersectionmapper.hh math.hh +optional.hh parameters.hh propertysystem.hh quad.hh diff --git a/dumux/discretization/cellcentered/subcontrolvolume.hh b/dumux/discretization/cellcentered/subcontrolvolume.hh index a9d1dc4db8e2d4b269b7a45acb732de9fa098889..f8875526ff5f8602001239761db6aeaff233d797 100644 --- a/dumux/discretization/cellcentered/subcontrolvolume.hh +++ b/dumux/discretization/cellcentered/subcontrolvolume.hh @@ -48,7 +48,11 @@ public: // the contructor in the cc case CCSubControlVolume(Geometry&& geometry, GridIndexType elementIndex) - : ParentType(), geometry_(std::forward(geometry)), elementIndex_(elementIndex) {} + : ParentType() + , geometry_(std::move(geometry)) + , center_(geometry_.value().center()) + , elementIndex_(elementIndex) + {} //! The copy constrcutor CCSubControlVolume(const CCSubControlVolume& other) = default; @@ -64,26 +68,28 @@ public: // have to construct it again geometry_.release(); geometry_.emplace(other.geometry_.value()); + center_ = other.center_; elementIndex_ = other.elementIndex_; return *this; } //! The move assignment operator - CCSubControlVolume& operator=(CCSubControlVolume&& other) + CCSubControlVolume& operator=(CCSubControlVolume&& other) noexcept { // We want to use the default copy/move assignment. // But since geometry is not copy assignable :( we // have to construct it again geometry_.release(); - geometry_.emplace(other.geometry_.value()); + geometry_.emplace(std::move(other.geometry_.value())); + center_ = std::move(other.center_); elementIndex_ = std::move(other.elementIndex_); return *this; } //! The center of the sub control volume - GlobalPosition center() const + const GlobalPosition& center() const { - return geometry().center(); + return center_; } //! The volume of the sub control volume @@ -113,9 +119,9 @@ public: } // The position of the dof this scv is embedded in - GlobalPosition dofPosition() const + const GlobalPosition& dofPosition() const { - return geometry().center(); + return center_; } //! The global index of the element this scv is embedded in @@ -134,6 +140,7 @@ public: private: // Work around the fact that geometry is not default constructible Optional geometry_; + GlobalPosition center_; GridIndexType elementIndex_; }; diff --git a/dumux/discretization/cellcentered/tpfa/fvelementgeometry.hh b/dumux/discretization/cellcentered/tpfa/fvelementgeometry.hh index 679ddc663a4f4376e1739361aa59d39776a24482..a79239e690c8e86c68a9c9b58819228b000429aa 100644 --- a/dumux/discretization/cellcentered/tpfa/fvelementgeometry.hh +++ b/dumux/discretization/cellcentered/tpfa/fvelementgeometry.hh @@ -252,13 +252,27 @@ public: void bind(const Element& element) { bindElement(element); + + neighborScvs_.reserve(element.subEntities(1)); + neighborScvfIndices_.reserve(element.subEntities(1)); + neighborScvfs_.reserve(element.subEntities(1)); + + std::vector handledNeighbors; + handledNeighbors.reserve(element.subEntities(1)); for (const auto& intersection : intersections(fvGridGeometry().gridView(), element)) { - neighborScvs_.reserve(element.subEntities(1)); - neighborScvfIndices_.reserve(element.subEntities(1)); - neighborScvfs_.reserve(element.subEntities(1)); if (intersection.neighbor()) - makeNeighborGeometries(intersection.outside()); + { + const auto outside = intersection.outside(); + const auto outsideIdx = fvGridGeometry().elementMapper().index(outside); + + // make outside geometries only if not done yet (could happen on non-conforming grids) + if ( std::find(handledNeighbors.begin(), handledNeighbors.end(), outsideIdx) == handledNeighbors.end() ) + { + makeNeighborGeometries(outside, outsideIdx); + handledNeighbors.push_back(outsideIdx); + } + } } if (dim < dimWorld) @@ -402,10 +416,9 @@ private: } //! create the necessary scvs and scvfs of the neighbor elements to the bound elements - void makeNeighborGeometries(const Element& element) + void makeNeighborGeometries(const Element& element, const IndexType eIdx) { // create the neighbor scv - const auto eIdx = fvGridGeometry().elementMapper().index(element); neighborScvs_.emplace_back(element.geometry(), eIdx); neighborScvIndices_.push_back(eIdx); diff --git a/dumux/discretization/cellcentered/tpfa/subcontrolvolumeface.hh b/dumux/discretization/cellcentered/tpfa/subcontrolvolumeface.hh index e71d5b43151ba8b3cec7528d94df7de0b9cc24ea..a2e800d988c92787cec35c52c17cf766028a62dc 100644 --- a/dumux/discretization/cellcentered/tpfa/subcontrolvolumeface.hh +++ b/dumux/discretization/cellcentered/tpfa/subcontrolvolumeface.hh @@ -81,13 +81,13 @@ public: } //! The center of the sub control volume face - GlobalPosition center() const + const GlobalPosition& center() const { return center_; } //! The integration point for flux evaluations in global coordinates - GlobalPosition ipGlobal() const + const GlobalPosition& ipGlobal() const { // Return center for now return center_; @@ -106,7 +106,7 @@ public: } //! The unit outer normal of the sub control volume face - GlobalPosition unitOuterNormal() const + const GlobalPosition& unitOuterNormal() const { return unitOuterNormal_; } @@ -136,10 +136,11 @@ public: return scvfIndex_; } - GlobalPosition corner(unsigned int localIdx) const + //! return the i-th corner of this sub control volume face + const GlobalPosition& corner(int i) const { - assert(localIdx < corners_.size() && "provided index exceeds the number of corners"); - return corners_[localIdx]; + assert(i < corners_.size() && "provided index exceeds the number of corners"); + return corners_[i]; } //! The geometry of the sub control volume face diff --git a/dumux/discretization/staggered/freeflow/subcontrolvolumeface.hh b/dumux/discretization/staggered/freeflow/subcontrolvolumeface.hh index 6dd9cc52b9c5e29d8782ebac484eb4ad7fec5bc5..d4a27f09208b59742e31f03583e1ac2129bbef8d 100644 --- a/dumux/discretization/staggered/freeflow/subcontrolvolumeface.hh +++ b/dumux/discretization/staggered/freeflow/subcontrolvolumeface.hh @@ -27,7 +27,6 @@ #include #include #include -#include #include