Merge pull request #5419 from GitPaean/only_trans_2

trying to release global transmissibility earlier to flatten the peak memory usage in the function finishInit()
This commit is contained in:
Bård Skaflestad 2024-06-10 18:13:53 +02:00 committed by GitHub
commit b0ee6b9c94
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 75 additions and 43 deletions

View File

@ -85,7 +85,7 @@ public:
const EclipseIO& eclIO() const;
void writeInit(const std::function<unsigned int(unsigned int)>& map);
void writeInit();
void setTransmissibilities(const TransmissibilityType* globalTrans)
{
@ -111,6 +111,8 @@ public:
return collectOnIORank_;
}
void extractOutputTransAndNNC(const std::function<unsigned int(unsigned int)>& map);
protected:
const TransmissibilityType& globalTrans() const;
unsigned int gridEquilIdxToGridIdx(unsigned int elemIndex) const;
@ -164,9 +166,10 @@ protected:
SimulatorReportSingle sub_step_report_;
SimulatorReport simulation_report_;
mutable std::vector<NNCdata> outputNnc_;
mutable std::unique_ptr<data::Solution> outputTrans_;
private:
data::Solution computeTrans_(const std::unordered_map<int,int>& cartesianToActive, const std::function<unsigned int(unsigned int)>& map) const;
void computeTrans_(const std::unordered_map<int,int>& cartesianToActive, const std::function<unsigned int(unsigned int)>& map) const;
std::vector<NNCdata> exportNncStructure_(const std::unordered_map<int,int>& cartesianToActive, const std::function<unsigned int(unsigned int)>& map) const;
};

View File

@ -241,7 +241,7 @@ eclIO() const
template<class Grid, class EquilGrid, class GridView, class ElementMapper, class Scalar>
void EclGenericWriter<Grid,EquilGrid,GridView,ElementMapper,Scalar>::
writeInit(const std::function<unsigned int(unsigned int)>& map)
writeInit()
{
if (collectOnIORank_.isIORank()) {
std::map<std::string, std::vector<int>> integerVectors;
@ -249,11 +249,21 @@ writeInit(const std::function<unsigned int(unsigned int)>& map)
integerVectors.emplace("MPI_RANK", collectOnIORank_.globalRanks());
}
auto cartMap = cartesianToCompressed(equilGrid_->size(0), UgGridHelpers::globalCell(*equilGrid_));
eclIO_->writeInitial(computeTrans_(cartMap, map),
eclIO_->writeInitial(*this->outputTrans_,
integerVectors,
exportNncStructure_(cartMap, map));
this->outputNnc_);
this->outputTrans_.reset();
}
}
template<class Grid, class EquilGrid, class GridView, class ElementMapper, class Scalar>
void
EclGenericWriter<Grid,EquilGrid,GridView,ElementMapper,Scalar>::
extractOutputTransAndNNC(const std::function<unsigned int(unsigned int)>& map)
{
if (collectOnIORank_.isIORank()) {
auto cartMap = cartesianToCompressed(equilGrid_->size(0), UgGridHelpers::globalCell(*equilGrid_));
computeTrans_(cartMap, map);
exportNncStructure_(cartMap, map);
}
#if HAVE_MPI
@ -266,22 +276,34 @@ writeInit(const std::function<unsigned int(unsigned int)>& map)
}
template<class Grid, class EquilGrid, class GridView, class ElementMapper, class Scalar>
data::Solution
void
EclGenericWriter<Grid,EquilGrid,GridView,ElementMapper,Scalar>::
computeTrans_(const std::unordered_map<int,int>& cartesianToActive,
const std::function<unsigned int(unsigned int)>& map) const
{
if (!outputTrans_) {
outputTrans_ = std::make_unique<data::Solution>();
}
const auto& cartMapper = *equilCartMapper_;
const auto& cartDims = cartMapper.cartesianDimensions();
auto tranx = data::CellData {
UnitSystem::measure::transmissibility,
std::vector<double>(cartDims[0] * cartDims[1] * cartDims[2], 0.0),
data::TargetType::INIT
auto createCellData = [&cartDims]() {
return data::CellData{
UnitSystem::measure::transmissibility,
std::vector<double>(cartDims[0] * cartDims[1] * cartDims[2], 0.0),
data::TargetType::INIT
};
};
auto trany = tranx;
auto tranz = tranx;
outputTrans_->clear();
outputTrans_->emplace("TRANX", createCellData());
outputTrans_->emplace("TRANY", createCellData());
outputTrans_->emplace("TRANZ", createCellData());
auto& tranx = this->outputTrans_->at("TRANX");
auto& trany = this->outputTrans_->at("TRANY");
auto& tranz = this->outputTrans_->at("TRANZ");
using GlobalGridView = typename EquilGrid::LeafGridView;
using GlobElementMapper = Dune::MultipleCodimMultipleGeomTypeMapper<GlobalGridView>;
@ -346,12 +368,6 @@ computeTrans_(const std::unordered_map<int,int>& cartesianToActive,
tranz.data<double>()[gc1] = globalTrans().transmissibility(c1, c2);
}
}
return {
{"TRANX", tranx},
{"TRANY", trany},
{"TRANZ", tranz},
};
}
template<class Grid, class EquilGrid, class GridView, class ElementMapper, class Scalar>

View File

@ -343,8 +343,37 @@ public:
void finishInit()
{
ParentType::finishInit();
auto& simulator = this->simulator();
auto finishTransmissibilities = [updated = false, this]() mutable
{
if (updated) { return; }
this->transmissibilities_.finishInit([&vg = this->simulator().vanguard()](const unsigned int it) {
return vg.gridIdxToEquilGridIdx(it);
});
updated = true;
};
// calculating the TRANX, TRANY, TRANZ and NNC for output purpose
// for parallel running, it is based on global trans_
// for serial running, it is based on the transmissibilities_
// we try to avoid for the parallel running, has both global trans_ and transmissibilities_ allocated at the same time
if (enableEclOutput_) {
if (simulator.vanguard().grid().comm().size() > 1) {
if (simulator.vanguard().grid().comm().rank() == 0)
eclWriter_->setTransmissibilities(&simulator.vanguard().globalTransmissibility());
} else {
finishTransmissibilities();
eclWriter_->setTransmissibilities(&simulator.problem().eclTransmissibilities());
}
std::function<unsigned int(unsigned int)> equilGridToGrid = [&simulator](unsigned int i) {
return simulator.vanguard().gridEquilIdxToGridIdx(i);
};
eclWriter_->extractOutputTransAndNNC(equilGridToGrid);
}
simulator.vanguard().releaseGlobalTransmissibilities();
const auto& eclState = simulator.vanguard().eclState();
const auto& schedule = simulator.vanguard().schedule();
@ -401,11 +430,12 @@ public:
readMaterialParameters_();
readThermalParameters_();
// Re-ordering in case of ALUGrid
std::function<unsigned int(unsigned int)> gridToEquilGrid = [&simulator](unsigned int i) {
return simulator.vanguard().gridIdxToEquilGridIdx(i);
};
transmissibilities_.finishInit(gridToEquilGrid);
// write the static output files (EGRID, INIT)
if (enableEclOutput_) {
eclWriter_->writeInit();
}
finishTransmissibilities();
const auto& initconfig = eclState.getInitConfig();
tracerModel_.init(initconfig.restartRequested());
@ -435,23 +465,6 @@ public:
drift_ = 0.0;
}
// write the static output files (EGRID, INIT, SMSPEC, etc.)
if (enableEclOutput_) {
if (simulator.vanguard().grid().comm().size() > 1) {
if (simulator.vanguard().grid().comm().rank() == 0)
eclWriter_->setTransmissibilities(&simulator.vanguard().globalTransmissibility());
} else
eclWriter_->setTransmissibilities(&simulator.problem().eclTransmissibilities());
// Re-ordering in case of ALUGrid
std::function<unsigned int(unsigned int)> equilGridToGrid = [&simulator](unsigned int i) {
return simulator.vanguard().gridEquilIdxToGridIdx(i);
};
eclWriter_->writeInit(equilGridToGrid);
}
simulator.vanguard().releaseGlobalTransmissibilities();
// after finishing the initialization and writing the initial solution, we move
// to the first "real" episode/report step
// for restart the episode index and start is already set