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
2 changes: 2 additions & 0 deletions CMakeLists_files.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,7 @@ list (APPEND MAIN_SOURCE_FILES
opm/simulators/utils/FullySupportedFlowKeywords.cpp
opm/simulators/utils/ParallelFileMerger.cpp
opm/simulators/utils/ParallelRegionsetVariableDescriptor.cpp
opm/simulators/utils/ParallelRegionVariableValues.cpp
opm/simulators/utils/ParallelRestart.cpp
opm/simulators/utils/PartiallySupportedFlowKeywords.cpp
opm/simulators/utils/PressureAverage.cpp
Expand Down Expand Up @@ -1209,6 +1210,7 @@ list (APPEND PUBLIC_HEADER_FILES
opm/simulators/utils/moduleVersion.hpp
opm/simulators/utils/ParallelCommunication.hpp
opm/simulators/utils/ParallelRegionsetVariableDescriptor.hpp
opm/simulators/utils/ParallelRegionVariableValues.hpp
opm/simulators/utils/ParallelSerialization.hpp
opm/simulators/utils/readDeck.hpp
opm/simulators/utils/satfunc/GasPhaseConsistencyChecks.hpp
Expand Down
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
Loading