Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion flowexperimental/comp/wells/CompWellModel.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,13 @@

#include <opm/simulators/timestepping/SimulatorReport.hpp>


#include <cstddef>
#include <map>
#include <vector>

namespace Opm {

class RegionVariableCollection;
class Schedule;
struct NewtonIterationContext;

Expand Down Expand Up @@ -126,6 +127,11 @@ class CompWellModel : public WellConnectionAuxiliaryModule<TypeTag, CompWellMode
return WellTestState{};
}

void reportIntervalConnectionOilProduction([[maybe_unused]] const double dt,
[[maybe_unused]] const std::size_t conn_opt_ix,
[[maybe_unused]] RegionVariableCollection& regVars) const
{}

// using the solution x to recover the solution xw for wells and applying
// xw to update Well State
void recoverWellSolutionAndUpdateWellState(const BVector& x);
Expand Down
11 changes: 9 additions & 2 deletions opm/simulators/flow/EclGenericWriter.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,16 +51,21 @@ class InterRegFlowMap;
class Inplace;
template <class Grid> class LevelCartesianIndexMapper;
struct NNCdata;
class RegionVariableCollection;
class Schedule;
class SummaryConfig;
class SummaryState;
class UDQState;

} // namespace Opm

namespace Opm { namespace Action {
namespace Opm::Action {
class State;
}} // namespace Opm::Action
} // namespace Opm::Action

namespace Opm::data {
class RegionVariableMapping;
} // namespace Opm::data

namespace Opm {

Expand Down Expand Up @@ -149,6 +154,8 @@ class EclGenericWriter
const std::map<std::tuple<std::string, int, int>, double>& lgrBlockData,
const std::map<std::string, double>& miscSummaryData,
const std::map<std::string, std::vector<double>>& regionData,
const data::RegionVariableMapping& regVarMap,
const RegionVariableCollection& regVars,
const Inplace& inplace,
const Inplace* initialInPlace,
const InterRegFlowMap& interRegFlows,
Expand Down
38 changes: 22 additions & 16 deletions opm/simulators/flow/EclGenericWriter_impl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,10 @@

#include <opm/input/eclipse/Units/UnitSystem.hpp>

#include <opm/output/data/RegionVariableMapping.hpp>

#include <opm/output/eclipse/EclipseIO.hpp>
#include <opm/output/eclipse/RegionVariableCollection.hpp>
#include <opm/output/eclipse/RestartValue.hpp>
#include <opm/output/eclipse/Summary.hpp>

Expand Down Expand Up @@ -1028,6 +1031,8 @@ evalSummary(const int reportStepNum,
const std::map<std::tuple<std::string, int, int>, double>& lgrBlockData,
const std::map<std::string, double>& miscSummaryData,
const std::map<std::string, std::vector<double>>& regionData,
const data::RegionVariableMapping& regVarMap,
const RegionVariableCollection& regVars,
const Inplace& inplace,
const Inplace* initialInPlace,
const InterRegFlowMap& interRegFlows,
Expand All @@ -1036,8 +1041,6 @@ evalSummary(const int reportStepNum,
const data::ReservoirCouplingGroupRates* rcGroupRates)
{
if (collectOnIORank_.isIORank()) {
const auto& summary = eclIO_->summary();

const auto& wellData = this->collectOnIORank_.isParallel()
? this->collectOnIORank_.globalWellData()
: localWellData;
Expand All @@ -1057,23 +1060,26 @@ evalSummary(const int reportStepNum,
const auto interreg_flows = getInterRegFlowsAsMap(interRegFlows);

const auto values = out::Summary::DynamicSimulatorState {
/* well_solution = */ &wellData,
/* wbp = */ &wbpData,
/* group_and_nwrk_solution = */ &groupAndNetworkData,
/* single_values = */ &miscSummaryData,
/* region_values = */ &regionData,
/* block_values = */ &blockData,
/* aquifer_values = */ &aquiferData,
/* interreg_flows = */ &interreg_flows,
/* rc_group_rates = */ rcGroupRates,
/* inplace = */ {
/* current = */ &inplace,
/* initial = */ initialInPlace
.well_solution = &wellData,
.wbp = &wbpData,
.group_and_nwrk_solution = &groupAndNetworkData,
.single_values = &miscSummaryData,
.region_values = &regionData,
.reg_var_map = &regVarMap,
.reg_var_coll = &regVars,
.block_values = &blockData,
.aquifer_values = &aquiferData,
.interreg_flows = &interreg_flows,
.rc_group_rates = rcGroupRates,
.inplace = {
.current = &inplace,
.initial = initialInPlace
},
/* lgr_block_values = */ &lgrBlockData
.lgr_block_values = &lgrBlockData
};

summary.eval(reportStepNum, curTime, values, summaryState);
this->eclIO_->summary()
.eval(reportStepNum, curTime, values, summaryState);

// Off-by-one-fun: The reportStepNum argument corresponds to the
// report step these results will be written to, whereas the
Expand Down
23 changes: 23 additions & 0 deletions opm/simulators/flow/EclWriter.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
#include <opm/input/eclipse/EclipseState/SummaryConfig/SummaryConfig.hpp>

#include <opm/output/eclipse/Inplace.hpp>
#include <opm/output/eclipse/RegionVariableCollection.hpp>
#include <opm/output/eclipse/RestartValue.hpp>

#include <opm/models/blackoil/blackoilproperties.hh> // Properties::EnableMech, EnableSolvent
Expand All @@ -59,6 +60,8 @@

#include <boost/date_time/posix_time/posix_time.hpp>

#include <cstddef>
#include <functional>
#include <limits>
#include <map>
#include <memory>
Expand Down Expand Up @@ -238,6 +241,19 @@ class EclWriter : public EclGenericWriter<GetPropType<TypeTag, Properties::Grid>
simulator_.setupTimer().realTimeElapsed() +
simulator_.vanguard().setupTime();

auto& regVars = this->outputModule_->regionVariables();

regVars.prepareValueAccumulation();

if (const auto conn_opt_ix = regVars
.variableIndex(this->outputModule_->regVarMapping(), "ConnOPT");
conn_opt_ix.has_value())
{
this->simulator_.problem()
.wellModel().reportIntervalConnectionOilProduction
(this->simulator_.timeStepSize(), *conn_opt_ix, regVars);
}

const auto localWellData = simulator_.problem().wellModel().wellData();
const auto localWBP = simulator_.problem().wellModel().wellBlockAveragePressures();
const auto localGroupAndNetworkData = simulator_.problem().wellModel()
Expand Down Expand Up @@ -333,6 +349,11 @@ class EclWriter : public EclGenericWriter<GetPropType<TypeTag, Properties::Grid>
{
OPM_TIMEBLOCK(evalSummary);

// Note: This statement sums one value per registered region
// variable per region per registered region set across all MPI
// ranks.
regVars.commitValues();

const auto& blockData = this->collectOnIORank_.isParallel()
? this->collectOnIORank_.globalBlockData()
: this->outputModule_->getBlockData();
Expand All @@ -355,6 +376,8 @@ class EclWriter : public EclGenericWriter<GetPropType<TypeTag, Properties::Grid>
lgrBlockData,
miscSummaryData,
regionData,
this->outputModule_->regVarMapping(),
regVars,
inplace,
this->outputModule_->initialInplace(),
interRegFlows,
Expand Down
75 changes: 58 additions & 17 deletions opm/simulators/flow/GenericOutputModule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@

#include <opm/input/eclipse/EclipseState/EclipseState.hpp>
#include <opm/input/eclipse/EclipseState/Runspec.hpp>
#include <opm/input/eclipse/EclipseState/SummaryConfig/RegionVariableSupport.hpp>
#include <opm/input/eclipse/EclipseState/SummaryConfig/SummaryConfig.hpp>

#include <opm/input/eclipse/Schedule/RFTConfig.hpp>
Expand All @@ -49,15 +50,23 @@

#include <opm/models/utils/parametersystem.hpp>

#include <opm/output/data/RegionVariableValues.hpp>
#include <opm/output/data/RegionsetVariableDescriptor.hpp>
#include <opm/output/data/Solution.hpp>

#include <opm/output/eclipse/RegionVariableCollection.hpp>

#include <opm/simulators/utils/ParallelCommunication.hpp>
#include <opm/simulators/utils/ParallelRegionVariableValues.hpp>
#include <opm/simulators/utils/ParallelRegionsetVariableDescriptor.hpp>
#include <opm/simulators/utils/PressureAverage.hpp>

#include <algorithm>
#include <cassert>
#include <cstddef>
#include <functional>
#include <initializer_list>
#include <memory>
#include <string>
#include <string_view>
#include <tuple>
Expand Down Expand Up @@ -157,32 +166,22 @@ GenericOutputModule(const EclipseState& eclState,
, enableExtbo_(enableExtbo)
, enableBioeffects_(enableBioeffects)
, enableGeochemistry_(enableGeochemistry)
, regionVars_ { std::make_unique<ParallelRegionsetVariableDescriptor>(comm),
std::make_unique<ParallelRegionVariableValues>(comm) }
, flowsC_(schedule, summaryConfig, isInterior)
, rftC_(eclState_, schedule_,
[this](const std::string& wname) { return this->isOwnedByCurrentRank(wname); },
[this](const std::string& wname) { return this->isOnCurrentRank(wname); })
, rst_conv_(std::move(globalCell), comm)
, local_data_valid_(false)
{
const auto& fp = eclState_.fieldProps();

this->regions_["FIPNUM"] = fp.get_int("FIPNUM");
for (const auto& region : fp.fip_regions()) {
this->regions_[region] = fp.get_int(region);
}

this->RPRNodes_ = summaryConfig_.keywords("RPR*");
this->RPRPNodes_ = summaryConfig_.keywords("RPRP*");

for (const auto& phase : Inplace::phases()) {
std::string key_pattern = "R" + Inplace::EclString(phase) + "*";
this->regionNodes_[phase] = summaryConfig_.keywords(key_pattern);
}

forceDisableFipOutput_ =
this->forceDisableFipOutput_ =
Parameters::Get<Parameters::ForceDisableFluidInPlaceOutput>();
forceDisableFipresvOutput_ =

this->forceDisableFipresvOutput_ =
Parameters::Get<Parameters::ForceDisableResvFluidInPlaceOutput>();

this->initialiseRegionVariableSupport();
}

template<class FluidSystem>
Expand Down Expand Up @@ -1274,6 +1273,48 @@ assignGlobalFieldsToSolution(data::Solution& sol)
this->rst_conv_.outputRestart(sol);
}

template<class FluidSystem>
void GenericOutputModule<FluidSystem>::
initialiseRegionVariableSupport()
{
const auto& fp = this->eclState_.fieldProps();

this->regions_.insert_or_assign("FIPNUM", fp.get_int("FIPNUM"));
for (const auto& region : fp.fip_regions()) {
this->regions_.insert_or_assign(region, fp.get_int(region));
}

this->RPRNodes_ = this->summaryConfig_.keywords("RPR*");
this->RPRPNodes_ = this->summaryConfig_.keywords("RPRP*");

for (const auto& phase : Inplace::phases()) {
const auto key_pattern = fmt::format("R{}*", Inplace::EclString(phase));
this->regionNodes_.insert_or_assign(phase, this->summaryConfig_.keywords(key_pattern));
}

// -----------------------------------------------------------------------

this->regVarMap_.prepareRegistration();

populateRegVarMapping(this->summaryConfig_, this->regVarMap_);

this->regVarMap_.commitStructure();

{
const auto declaredMaxRegID =
declaredMaxRegionID(this->eclState_.runspec());

this->regionVars_.initialise(static_cast<int>(declaredMaxRegID),
fp, this->regVarMap_);
}
}

// ===========================================================================
// Explicit template specialisations below separator
//
// No other code permitted here.
// ===========================================================================

template<class T> using FS = BlackOilFluidSystem<T, BlackOilDefaultFluidSystemIndices>;

#define INSTANTIATE_TYPE(T) \
Expand Down
34 changes: 34 additions & 0 deletions opm/simulators/flow/GenericOutputModule.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,11 @@
#include <opm/input/eclipse/EclipseState/SummaryConfig/SummaryConfig.hpp>
#include <opm/input/eclipse/Units/UnitSystem.hpp>

#include <opm/output/data/RegionVariableMapping.hpp>
#include <opm/output/data/Wells.hpp>

#include <opm/output/eclipse/Inplace.hpp>
#include <opm/output/eclipse/RegionVariableCollection.hpp>

#include <opm/simulators/flow/BioeffectsContainer.hpp>
#include <opm/simulators/flow/CO2H2Container.hpp>
Expand All @@ -54,6 +57,7 @@
#include <cstddef>
#include <functional>
#include <map>
#include <memory>
#include <optional>
#include <string_view>
#include <tuple>
Expand Down Expand Up @@ -294,6 +298,16 @@ class GenericOutputModule {
const RSTConv& getConv() const
{ return this->rst_conv_; }

const data::RegionVariableMapping& regVarMapping() const
{
return this->regVarMap_;
}

RegionVariableCollection& regionVariables()
{
return this->regionVars_;
}

//! \brief Assign fields that are in global numbering to the solution.
//! \detail This is used to add fields that for some reason cannot be collected
//! using the regular collect mechanism to the solution. In particular this
Expand Down Expand Up @@ -468,13 +482,27 @@ class GenericOutputModule {
bool forceDisableFipresvOutput_{false};
bool computeFip_{false};

/// Current values of input data for region-level summary vectors.
///
/// Acceleration structure for region-level summary vector calculations,
/// aimed at minimising MPI overhead for calculating these vectors.
/// Contents depend on runtime configuration in summaryConfig_.
///
/// Populated by initialiseRegionVariableSupport().
RegionVariableCollection regionVars_;

FIPContainer<FluidSystem> fipC_;
std::unordered_map<std::string, std::vector<int>> regions_;
std::unordered_map<Inplace::Phase, std::vector<SummaryConfigNode>> regionNodes_;

std::vector<SummaryConfigNode> RPRNodes_;
std::vector<SummaryConfigNode> RPRPNodes_;

/// Map region variable names and region set names to numeric indices.
///
/// Populated by initialiseRegionVariableSupport().
data::RegionVariableMapping regVarMap_{};

std::vector<int> failedCellsPb_;
std::vector<int> failedCellsPd_;

Expand Down Expand Up @@ -554,6 +582,12 @@ class GenericOutputModule {
bool local_data_valid_{false};

std::optional<RegionPhasePoreVolAverage> regionAvgDensity_;

private:
/// Initialise acceleration structures for region-level summary vector calculations.
///
/// Populates regionVars_ and regVarMap_.
void initialiseRegionVariableSupport();
};

} // namespace Opm
Expand Down
3 changes: 3 additions & 0 deletions opm/simulators/flow/OutputBlackoilModule.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,11 @@
#include <opm/models/utils/propertysystem.hh>

#include <opm/output/data/Cells.hpp>
#include <opm/output/data/RegionVariableMapping.hpp>

#include <opm/output/eclipse/EclipseIO.hpp>
#include <opm/output/eclipse/Inplace.hpp>
#include <opm/output/eclipse/RegionVariableCollection.hpp>

#include <opm/simulators/flow/CollectDataOnIORank.hpp>
#include <opm/simulators/flow/FlowBaseVanguard.hpp>
Expand Down
Loading