added timing blocks to most important parts

This commit is contained in:
hnil 2023-02-15 09:41:37 +01:00
parent 3dc13c234c
commit fd98d8ea27
4 changed files with 50 additions and 9 deletions

View File

@ -29,7 +29,7 @@
#define EWOMS_ECL_GENERIC_TRACER_MODEL_HH #define EWOMS_ECL_GENERIC_TRACER_MODEL_HH
#include <opm/grid/common/CartesianIndexMapper.hpp> #include <opm/grid/common/CartesianIndexMapper.hpp>
#include <opm/common/ErrorMacros.hpp>
#include <opm/models/blackoil/blackoilmodel.hh> #include <opm/models/blackoil/blackoilmodel.hh>
#include <opm/simulators/linalg/matrixblock.hh> #include <opm/simulators/linalg/matrixblock.hh>

View File

@ -972,6 +972,7 @@ public:
*/ */
void beginEpisode() void beginEpisode()
{ {
OPM_TIMEBLOCK(beginEpisode);
// Proceed to the next report step // Proceed to the next report step
auto& simulator = this->simulator(); auto& simulator = this->simulator();
int episodeIdx = simulator.episodeIndex(); int episodeIdx = simulator.episodeIndex();
@ -1035,6 +1036,7 @@ public:
*/ */
void beginTimeStep() void beginTimeStep()
{ {
OPM_TIMEBLOCK(beginTimeStep);
int episodeIdx = this->episodeIndex(); int episodeIdx = this->episodeIndex();
this->beginTimeStep_(enableExperiments, this->beginTimeStep_(enableExperiments,
@ -1056,9 +1058,11 @@ public:
// the derivatives may have change // the derivatives may have change
bool invalidateIntensiveQuantities = invalidateFromMaxWaterSat || invalidateFromMinPressure || invalidateFromHyst || invalidateFromMaxOilSat; bool invalidateIntensiveQuantities = invalidateFromMaxWaterSat || invalidateFromMinPressure || invalidateFromHyst || invalidateFromMaxOilSat;
if (invalidateIntensiveQuantities) if (invalidateIntensiveQuantities){
OPM_TIMEBLOCK(beginTimeStepInvalidateIntensiveQuantities);
this->model().invalidateAndUpdateIntensiveQuantities(/*timeIdx=*/0); this->model().invalidateAndUpdateIntensiveQuantities(/*timeIdx=*/0);
}
if constexpr (getPropValue<TypeTag, Properties::EnablePolymer>()) if constexpr (getPropValue<TypeTag, Properties::EnablePolymer>())
updateMaxPolymerAdsorption_(); updateMaxPolymerAdsorption_();
@ -1074,6 +1078,7 @@ public:
*/ */
void beginIteration() void beginIteration()
{ {
OPM_TIMEBLOCK(beginIteration);
wellModel_.beginIteration(); wellModel_.beginIteration();
if (enableAquifers_) if (enableAquifers_)
aquiferModel_.beginIteration(); aquiferModel_.beginIteration();
@ -1084,6 +1089,7 @@ public:
*/ */
void endIteration() void endIteration()
{ {
OPM_TIMEBLOCK(endIteration);
wellModel_.endIteration(); wellModel_.endIteration();
if (enableAquifers_) if (enableAquifers_)
aquiferModel_.endIteration(); aquiferModel_.endIteration();
@ -1094,6 +1100,7 @@ public:
*/ */
void endTimeStep() void endTimeStep()
{ {
OPM_TIMEBLOCK(endTimeStep);
#ifndef NDEBUG #ifndef NDEBUG
if constexpr (getPropValue<TypeTag, Properties::EnableDebuggingChecks>()) { if constexpr (getPropValue<TypeTag, Properties::EnableDebuggingChecks>()) {
// in debug mode, we don't care about performance, so we check if the model does // in debug mode, we don't care about performance, so we check if the model does
@ -1166,6 +1173,7 @@ public:
*/ */
void endEpisode() void endEpisode()
{ {
OPM_TIMEBLOCK(endEpisode);
auto& simulator = this->simulator(); auto& simulator = this->simulator();
auto& schedule = simulator.vanguard().schedule(); auto& schedule = simulator.vanguard().schedule();
@ -1190,6 +1198,7 @@ public:
*/ */
void writeOutput(bool verbose = true) void writeOutput(bool verbose = true)
{ {
OPM_TIMEBLOCK(writeOutput);
// use the generic code to prepare the output fields and to // use the generic code to prepare the output fields and to
// write the desired VTK files. // write the desired VTK files.
ParentType::writeOutput(verbose); ParentType::writeOutput(verbose);
@ -1200,6 +1209,7 @@ public:
} }
void finalizeOutput() { void finalizeOutput() {
OPM_TIMEBLOCK(finalizeOutput);
// this will write all pending output to disk // this will write all pending output to disk
// to avoid corruption of output files // to avoid corruption of output files
eclWriter_.reset(); eclWriter_.reset();
@ -1460,6 +1470,7 @@ public:
FluidState &fluidState, FluidState &fluidState,
unsigned globalSpaceIdx) const unsigned globalSpaceIdx) const
{ {
OPM_TIMEBLOCK_LOCAL(updateRelperms);
{ {
// calculate relative permeabilities. note that we store the result into the // calculate relative permeabilities. note that we store the result into the
// mobility_ class attribute. the division by the phase viscosity happens later. // mobility_ class attribute. the division by the phase viscosity happens later.
@ -1557,6 +1568,7 @@ public:
unsigned spaceIdx, unsigned spaceIdx,
unsigned timeIdx) const unsigned timeIdx) const
{ {
OPM_TIMEBLOCK(eclProblemBoundary);
if (!context.intersection(spaceIdx).boundary()) if (!context.intersection(spaceIdx).boundary())
return; return;
@ -1766,6 +1778,7 @@ public:
unsigned globalDofIdx, unsigned globalDofIdx,
unsigned timeIdx) const unsigned timeIdx) const
{ {
OPM_TIMEBLOCK(eclProblemSource);
rate = 0.0; rate = 0.0;
wellModel_.computeTotalRatesForDof(rate, globalDofIdx); wellModel_.computeTotalRatesForDof(rate, globalDofIdx);
@ -1847,6 +1860,7 @@ public:
const InitialFluidState boundaryFluidState(unsigned globalDofIdx, const int directionId) const const InitialFluidState boundaryFluidState(unsigned globalDofIdx, const int directionId) const
{ {
OPM_TIMEBLOCK_LOCAL(boundaryFluidState);
FaceDir::DirEnum dir = FaceDir::FromIntersectionIndex(directionId); FaceDir::DirEnum dir = FaceDir::FromIntersectionIndex(directionId);
const auto& dirichlet = dirichlet_(dir)[globalDofIdx]; const auto& dirichlet = dirichlet_(dir)[globalDofIdx];
if(std::get<0>(dirichlet) == BCComponent::NONE) if(std::get<0>(dirichlet) == BCComponent::NONE)
@ -1936,6 +1950,7 @@ public:
*/ */
Scalar nextTimeStepSize() const Scalar nextTimeStepSize() const
{ {
OPM_TIMEBLOCK(nexTimeStepSize);
// allow external code to do the timestepping // allow external code to do the timestepping
if (this->nextTimeStepSize_ > 0.0) if (this->nextTimeStepSize_ > 0.0)
return this->nextTimeStepSize_; return this->nextTimeStepSize_;
@ -1962,7 +1977,7 @@ public:
template <class LhsEval> template <class LhsEval>
LhsEval rockCompPoroMultiplier(const IntensiveQuantities& intQuants, unsigned elementIdx) const LhsEval rockCompPoroMultiplier(const IntensiveQuantities& intQuants, unsigned elementIdx) const
{ {
OPM_TIMEBLOCK_LOCAL(rockCompPoroMultiplier);
if (this->rockCompPoroMult_.empty() && this->rockCompPoroMultWc_.empty()) if (this->rockCompPoroMult_.empty() && this->rockCompPoroMultWc_.empty())
return 1.0; return 1.0;
@ -2002,6 +2017,7 @@ public:
template <class LhsEval> template <class LhsEval>
LhsEval rockCompTransMultiplier(const IntensiveQuantities& intQuants, unsigned elementIdx) const LhsEval rockCompTransMultiplier(const IntensiveQuantities& intQuants, unsigned elementIdx) const
{ {
OPM_TIMEBLOCK_LOCAL(rockCompTransMultiplier);
if (this->rockCompTransMult_.empty() && this->rockCompTransMultWc_.empty()) if (this->rockCompTransMult_.empty() && this->rockCompTransMultWc_.empty())
return 1.0; return 1.0;
@ -2034,6 +2050,7 @@ public:
std::pair<bool, RateVector> boundaryCondition(const unsigned int globalSpaceIdx, const int directionId) std::pair<bool, RateVector> boundaryCondition(const unsigned int globalSpaceIdx, const int directionId)
{ {
OPM_TIMEBLOCK_LOCAL(boundaryCondition);
if (!nonTrivialBoundaryConditions_) { if (!nonTrivialBoundaryConditions_) {
return { false, RateVector(0.0) }; return { false, RateVector(0.0) };
} }
@ -2053,6 +2070,7 @@ private:
void updateProperty_(const std::string& failureMsg, void updateProperty_(const std::string& failureMsg,
UpdateFunc func) UpdateFunc func)
{ {
OPM_TIMEBLOCK(updateProperty);
ElementContext elemCtx(this->simulator()); ElementContext elemCtx(this->simulator());
const auto& vanguard = this->simulator().vanguard(); const auto& vanguard = this->simulator().vanguard();
OPM_BEGIN_PARALLEL_TRY_CATCH(); OPM_BEGIN_PARALLEL_TRY_CATCH();
@ -2070,6 +2088,7 @@ private:
// update the parameters needed for DRSDT and DRVDT // update the parameters needed for DRSDT and DRVDT
void updateCompositionChangeLimits_() void updateCompositionChangeLimits_()
{ {
OPM_TIMEBLOCK(updateCompositionChangeLimits);
// update the "last Rs" values for all elements, including the ones in the ghost // update the "last Rs" values for all elements, including the ones in the ghost
// and overlap regions // and overlap regions
int episodeIdx = this->episodeIndex(); int episodeIdx = this->episodeIndex();
@ -2140,6 +2159,7 @@ private:
bool updateMaxOilSaturation_() bool updateMaxOilSaturation_()
{ {
OPM_TIMEBLOCK(updateMaxOilSaturation);
int episodeIdx = this->episodeIndex(); int episodeIdx = this->episodeIndex();
// we use VAPPARS // we use VAPPARS
@ -2160,6 +2180,7 @@ private:
bool updateMaxWaterSaturation_() bool updateMaxWaterSaturation_()
{ {
OPM_TIMEBLOCK(updateMaxWaterSaturation);
// water compaction is activated in ROCKCOMP // water compaction is activated in ROCKCOMP
if (this->maxWaterSaturation_.empty()) if (this->maxWaterSaturation_.empty())
return false; return false;
@ -2178,6 +2199,7 @@ private:
bool updateMinPressure_() bool updateMinPressure_()
{ {
OPM_TIMEBLOCK(updateMinPressure);
// IRREVERS option is used in ROCKCOMP // IRREVERS option is used in ROCKCOMP
if (this->minOilPressure_.empty()) if (this->minOilPressure_.empty())
return false; return false;
@ -2195,6 +2217,7 @@ private:
void readMaterialParameters_() void readMaterialParameters_()
{ {
OPM_TIMEBLOCK(readMaterialParameters);
const auto& simulator = this->simulator(); const auto& simulator = this->simulator();
const auto& vanguard = simulator.vanguard(); const auto& vanguard = simulator.vanguard();
const auto& eclState = vanguard.eclState(); const auto& eclState = vanguard.eclState();

View File

@ -631,6 +631,7 @@ namespace Opm {
/// Apply an update to the primary variables. /// Apply an update to the primary variables.
void updateSolution(const BVector& dx) void updateSolution(const BVector& dx)
{ {
OPM_TIMEBLOCK(updateSolution);
auto& ebosNewtonMethod = ebosSimulator_.model().newtonMethod(); auto& ebosNewtonMethod = ebosSimulator_.model().newtonMethod();
SolutionVector& solution = ebosSimulator_.model().solution(/*timeIdx=*/0); SolutionVector& solution = ebosSimulator_.model().solution(/*timeIdx=*/0);
@ -642,7 +643,10 @@ namespace Opm {
// residual // residual
// if the solution is updated, the intensive quantities need to be recalculated // if the solution is updated, the intensive quantities need to be recalculated
ebosSimulator_.model().invalidateAndUpdateIntensiveQuantities(/*timeIdx=*/0); {
OPM_TIMEBLOCK(invalidateAndUpdateIntensiveQuantities);
ebosSimulator_.model().invalidateAndUpdateIntensiveQuantities(/*timeIdx=*/0);
}
} }
/// Return true if output to cout is wanted. /// Return true if output to cout is wanted.
@ -659,6 +663,7 @@ namespace Opm {
std::vector< Scalar >& maxCoeff, std::vector< Scalar >& maxCoeff,
std::vector< Scalar >& B_avg) std::vector< Scalar >& B_avg)
{ {
OPM_TIMEBLOCK(convergenceReduction);
// Compute total pore volume (use only owned entries) // Compute total pore volume (use only owned entries)
double pvSum = pvSumLocal; double pvSum = pvSumLocal;
double numAquiferPvSum = numAquiferPvSumLocal; double numAquiferPvSum = numAquiferPvSumLocal;
@ -718,6 +723,7 @@ namespace Opm {
std::vector<Scalar>& maxCoeff, std::vector<Scalar>& maxCoeff,
std::vector<Scalar>& B_avg) std::vector<Scalar>& B_avg)
{ {
OPM_TIMEBLOCK(localConvergenceData);
double pvSumLocal = 0.0; double pvSumLocal = 0.0;
double numAquiferPvSumLocal = 0.0; double numAquiferPvSumLocal = 0.0;
const auto& ebosModel = ebosSimulator_.model(); const auto& ebosModel = ebosSimulator_.model();
@ -848,6 +854,7 @@ namespace Opm {
/// of a numerical aquifer. /// of a numerical aquifer.
double computeCnvErrorPv(const std::vector<Scalar>& B_avg, double dt) double computeCnvErrorPv(const std::vector<Scalar>& B_avg, double dt)
{ {
OPM_TIMEBLOCK(computeCnvErrorPv);
double errorPV{}; double errorPV{};
const auto& ebosModel = ebosSimulator_.model(); const auto& ebosModel = ebosSimulator_.model();
const auto& ebosProblem = ebosSimulator_.problem(); const auto& ebosProblem = ebosSimulator_.problem();
@ -895,6 +902,7 @@ namespace Opm {
std::vector<Scalar>& B_avg, std::vector<Scalar>& B_avg,
std::vector<Scalar>& residual_norms) std::vector<Scalar>& residual_norms)
{ {
OPM_TIMEBLOCK(getReservoirConvergence);
typedef std::vector< Scalar > Vector; typedef std::vector< Scalar > Vector;
const int numComp = numEq; const int numComp = numEq;
@ -1004,13 +1012,16 @@ namespace Opm {
const int iteration, const int iteration,
std::vector<double>& residual_norms) std::vector<double>& residual_norms)
{ {
OPM_TIMEBLOCK(getConvergence);
// Get convergence reports for reservoir and wells. // Get convergence reports for reservoir and wells.
std::vector<Scalar> B_avg(numEq, 0.0); std::vector<Scalar> B_avg(numEq, 0.0);
auto report = getReservoirConvergence(timer.simulationTimeElapsed(), auto report = getReservoirConvergence(timer.simulationTimeElapsed(),
timer.currentStepLength(), timer.currentStepLength(),
iteration, B_avg, residual_norms); iteration, B_avg, residual_norms);
report += wellModel().getWellConvergence(B_avg, /*checkWellGroupControls*/report.converged()); {
OPM_TIMEBLOCK(getWellConvergence);
report += wellModel().getWellConvergence(B_avg, /*checkWellGroupControls*/report.converged());
}
return report; return report;
} }
@ -1033,6 +1044,7 @@ namespace Opm {
std::vector<std::vector<double> > std::vector<std::vector<double> >
computeFluidInPlace(const std::vector<int>& /*fipnum*/) const computeFluidInPlace(const std::vector<int>& /*fipnum*/) const
{ {
OPM_TIMEBLOCK(computeFluidInPlace);
//assert(true) //assert(true)
//return an empty vector //return an empty vector
std::vector<std::vector<double> > regionValues(0, std::vector<double>(0,0.0)); std::vector<std::vector<double> > regionValues(0, std::vector<double>(0,0.0));

View File

@ -237,6 +237,7 @@ std::unique_ptr<Matrix> blockJacobiAdjacency(const Grid& grid,
converged_(false), converged_(false),
matrix_() matrix_()
{ {
OPM_TIMEBLOCK(istlSolverEbos);
const bool on_io_rank = (simulator.gridView().comm().rank() == 0); const bool on_io_rank = (simulator.gridView().comm().rank() == 0);
#if HAVE_MPI #if HAVE_MPI
comm_.reset( new CommunicationType( simulator_.vanguard().grid().comm() ) ); comm_.reset( new CommunicationType( simulator_.vanguard().grid().comm() ) );
@ -311,6 +312,7 @@ std::unique_ptr<Matrix> blockJacobiAdjacency(const Grid& grid,
void prepare(const SparseMatrixAdapter& M, Vector& b) void prepare(const SparseMatrixAdapter& M, Vector& b)
{ {
OPM_TIMEBLOCK(istlSolverEbosPrepare);
static bool firstcall = true; static bool firstcall = true;
#if HAVE_MPI #if HAVE_MPI
if (firstcall) { if (firstcall) {
@ -370,6 +372,7 @@ std::unique_ptr<Matrix> blockJacobiAdjacency(const Grid& grid,
bool solve(Vector& x) bool solve(Vector& x)
{ {
OPM_TIMEBLOCK(istlSolverEbosSolve);
calls_ += 1; calls_ += 1;
// Write linear system if asked for. // Write linear system if asked for.
const int verbosity = prm_.get<int>("verbosity", 0); const int verbosity = prm_.get<int>("verbosity", 0);
@ -396,6 +399,7 @@ std::unique_ptr<Matrix> blockJacobiAdjacency(const Grid& grid,
x, result)) x, result))
#endif #endif
{ {
OPM_TIMEBLOCK(flexibleSolverApply);
assert(flexibleSolver_.solver_); assert(flexibleSolver_.solver_);
flexibleSolver_.solver_->apply(x, *rhs_, result); flexibleSolver_.solver_->apply(x, *rhs_, result);
} }
@ -448,7 +452,7 @@ std::unique_ptr<Matrix> blockJacobiAdjacency(const Grid& grid,
void prepareFlexibleSolver() void prepareFlexibleSolver()
{ {
OPM_TIMEBLOCK(prepareFlexibleSolver);
if (shouldCreateSolver()) { if (shouldCreateSolver()) {
std::function<Vector()> trueFunc = std::function<Vector()> trueFunc =
[this] [this]
@ -460,7 +464,7 @@ std::unique_ptr<Matrix> blockJacobiAdjacency(const Grid& grid,
auto wellOp = std::make_unique<WellModelOperator>(simulator_.problem().wellModel()); auto wellOp = std::make_unique<WellModelOperator>(simulator_.problem().wellModel());
flexibleSolver_.wellOperator_ = std::move(wellOp); flexibleSolver_.wellOperator_ = std::move(wellOp);
} }
OPM_TIMEBLOCK(flexibleSolverCreate);
flexibleSolver_.create(getMatrix(), flexibleSolver_.create(getMatrix(),
isParallel(), isParallel(),
prm_, prm_,
@ -470,6 +474,7 @@ std::unique_ptr<Matrix> blockJacobiAdjacency(const Grid& grid,
} }
else else
{ {
OPM_TIMEBLOCK(flexibleSolverUpdate);
flexibleSolver_.pre_->update(); flexibleSolver_.pre_->update();
} }
} }
@ -527,6 +532,7 @@ std::unique_ptr<Matrix> blockJacobiAdjacency(const Grid& grid,
// conservation equations, ignoring all other terms. // conservation equations, ignoring all other terms.
Vector getTrueImpesWeights(int pressureVarIndex) const Vector getTrueImpesWeights(int pressureVarIndex) const
{ {
OPM_TIMEBLOCK(getTrueImpesWeights);
Vector weights(rhs_->size()); Vector weights(rhs_->size());
ElementContext elemCtx(simulator_); ElementContext elemCtx(simulator_);
Amg::getTrueImpesWeights(pressureVarIndex, weights, Amg::getTrueImpesWeights(pressureVarIndex, weights,