From a883247e0b96bfdcd1aa1fc4e1396a7470d6ab94 Mon Sep 17 00:00:00 2001 From: Andreas Lauser Date: Thu, 14 Aug 2014 19:23:07 +0200 Subject: [PATCH] wells: slightly optimize it this is done by only calculating intensive quantities for elements which actually are pierced by wells. on SPE1 this lead to a performance improvement of about 2% on my machine. (3.50 vs 3.57 seconds.) --- ewoms/wells/eclwellmanager.hh | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/ewoms/wells/eclwellmanager.hh b/ewoms/wells/eclwellmanager.hh index 15320b343..9763d63ec 100644 --- a/ewoms/wells/eclwellmanager.hh +++ b/ewoms/wells/eclwellmanager.hh @@ -77,6 +77,9 @@ public: const Grid &grid = simulator_.gridManager().grid(); const GridView gridView = simulator_.gridManager().gridView(); + elemIsInAWell_.resize(simulator_.model().elementMapper().size()); + std::fill(elemIsInAWell_.begin(), elemIsInAWell_.end(), false); + // create the wells for (size_t deckWellIdx = 0; deckWellIdx < deckSchedule->numWells(); ++deckWellIdx) { Opm::WellConstPtr deckWell = deckSchedule->getWells()[deckWellIdx]; @@ -120,6 +123,9 @@ public: && ijk[1] == completion->getJ() && ijk[2] == completion->getK()) { + int globalElemIdx = simulator_.model().elementMapper().map(*elemIt); + elemIsInAWell_[globalElemIdx] = true; + well->addDof(elemCtx, dofIdx); well->setRadius(elemCtx, dofIdx, 0.5*completion->getDiameter()); } @@ -384,6 +390,10 @@ public: if (elemIt->partitionType() != Dune::InteriorEntity) continue; + int globalElemIdx = simulator_.model().elementMapper().map(*elemIt); + if (!elemIsInAWell_[globalElemIdx]) + continue; + elemCtx.updateStencil(*elemIt); elemCtx.updatePrimaryIntensiveQuantities(/*timeIdx=*/0); @@ -480,6 +490,7 @@ protected: const Simulator &simulator_; std::vector > wells_; + std::vector elemIsInAWell_; std::map wellNameToIndex_; }; } // namespace Ewoms