diff --git a/opm/simulators/flow/Transmissibility.hpp b/opm/simulators/flow/Transmissibility.hpp index 18bc1b191..a7735c522 100644 --- a/opm/simulators/flow/Transmissibility.hpp +++ b/opm/simulators/flow/Transmissibility.hpp @@ -284,6 +284,7 @@ protected: const CartesianIndexMapper& cartMapper_; const Grid& grid_; std::function(int)> centroids_; + std::vector> centroids_cache_; Scalar transmissibilityThreshold_; std::map, Scalar> transBoundary_; std::map, Scalar> thermalHalfTransBoundary_; diff --git a/opm/simulators/flow/Transmissibility_impl.hpp b/opm/simulators/flow/Transmissibility_impl.hpp index 63cd04923..f2e07fb89 100644 --- a/opm/simulators/flow/Transmissibility_impl.hpp +++ b/opm/simulators/flow/Transmissibility_impl.hpp @@ -236,6 +236,13 @@ update(bool global, const TransUpdateQuantities update_quantities, comm.broadcast(&pinchActive, 1, 0); } + // fill the centroids cache to avoid repeated calculations in loops below + centroids_cache_.resize(gridView_.size(0)); + for (const auto& elem : elements(gridView_)) { + const unsigned elemIdx = elemMapper.index(elem); + centroids_cache_[elemIdx] = centroids_(elemIdx); + } + // compute the transmissibilities for all intersections for (const auto& elem : elements(gridView_)) { unsigned elemIdx = elemMapper.index(elem); @@ -529,6 +536,8 @@ update(bool global, const TransUpdateQuantities update_quantities, } } + centroids_cache_.clear(); + // Potentially overwrite and/or modify transmissibilities based on input from deck this->updateFromEclState_(global); @@ -1321,7 +1330,8 @@ Transmissibility:: distanceVector_(const DimVector& faceCenter, const unsigned& cellIdx) const { - const auto& cellCenter = centroids_(cellIdx); + const auto& cellCenter = centroids_cache_.empty() ? centroids_(cellIdx) + : centroids_cache_[cellIdx]; DimVector x = faceCenter; for (unsigned dimIdx = 0; dimIdx < dimWorld; ++dimIdx) x[dimIdx] -= cellCenter[dimIdx];