mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
flow_ebos: only instantiate a single deck and a single EclipseState
This commit is contained in:
parent
17c1e1083e
commit
626d3e1da5
@ -139,7 +139,6 @@ namespace Opm {
|
|||||||
const RockCompressibility* rock_comp_props,
|
const RockCompressibility* rock_comp_props,
|
||||||
const StandardWells& well_model,
|
const StandardWells& well_model,
|
||||||
const NewtonIterationBlackoilInterface& linsolver,
|
const NewtonIterationBlackoilInterface& linsolver,
|
||||||
Opm::EclipseStateConstPtr eclState,
|
|
||||||
const bool has_disgas,
|
const bool has_disgas,
|
||||||
const bool has_vapoil,
|
const bool has_vapoil,
|
||||||
const bool terminal_output)
|
const bool terminal_output)
|
||||||
@ -149,8 +148,8 @@ namespace Opm {
|
|||||||
, geo_ (geo)
|
, geo_ (geo)
|
||||||
, rock_comp_props_(rock_comp_props)
|
, rock_comp_props_(rock_comp_props)
|
||||||
, vfp_properties_(
|
, vfp_properties_(
|
||||||
eclState->getTableManager().getVFPInjTables(),
|
eclState().getTableManager().getVFPInjTables(),
|
||||||
eclState->getTableManager().getVFPProdTables())
|
eclState().getTableManager().getVFPProdTables())
|
||||||
, linsolver_ (linsolver)
|
, linsolver_ (linsolver)
|
||||||
, active_(detail::activePhases(fluid.phaseUsage()))
|
, active_(detail::activePhases(fluid.phaseUsage()))
|
||||||
, canph_ (detail::active2Canonical(fluid.phaseUsage()))
|
, canph_ (detail::active2Canonical(fluid.phaseUsage()))
|
||||||
@ -184,6 +183,9 @@ namespace Opm {
|
|||||||
global_nc_ = Opm::AutoDiffGrid::numCells(grid_);
|
global_nc_ = Opm::AutoDiffGrid::numCells(grid_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const EclipseState& eclState() const
|
||||||
|
{ return *ebosSimulator_.gridManager().eclState(); }
|
||||||
|
|
||||||
/// Called once before each time step.
|
/// Called once before each time step.
|
||||||
/// \param[in] timer simulation timer
|
/// \param[in] timer simulation timer
|
||||||
/// \param[in, out] reservoir_state reservoir state variables
|
/// \param[in, out] reservoir_state reservoir state variables
|
||||||
|
@ -37,13 +37,54 @@ namespace Opm
|
|||||||
typedef FlowMainBase<FlowMainEbos, Dune::CpGrid, Simulator> Base;
|
typedef FlowMainBase<FlowMainEbos, Dune::CpGrid, Simulator> Base;
|
||||||
friend Base;
|
friend Base;
|
||||||
|
|
||||||
|
typedef typename TTAG(EclFlowProblem) TypeTag;
|
||||||
|
typedef typename GET_PROP_TYPE(TypeTag, Simulator) EbosSimulator;
|
||||||
|
|
||||||
|
// Parser the input and creates the Deck and EclipseState objects.
|
||||||
|
// Writes to:
|
||||||
|
// deck_
|
||||||
|
// eclipse_state_
|
||||||
|
// May throw if errors are encountered, here configured to be somewhat tolerant.
|
||||||
|
void readDeckInput()
|
||||||
|
{
|
||||||
|
std::string progName("flow_ebos");
|
||||||
|
std::string deckFile("--ecl-deck-file-name=");
|
||||||
|
deckFile += param_.get<std::string>("deck_filename");
|
||||||
|
char* ptr[2];
|
||||||
|
ptr[ 0 ] = const_cast< char * > (progName.c_str());
|
||||||
|
ptr[ 1 ] = const_cast< char * > (deckFile.c_str());
|
||||||
|
EbosSimulator::registerParameters();
|
||||||
|
Ewoms::setupParameters_< TypeTag > ( 2, ptr );
|
||||||
|
ebosSimulator_.reset(new EbosSimulator());
|
||||||
|
ebosSimulator_->model().applyInitialSolution();
|
||||||
|
|
||||||
|
Base::deck_ = ebosSimulator_->gridManager().deck();
|
||||||
|
Base::eclipse_state_ = ebosSimulator_->gridManager().eclState();
|
||||||
|
|
||||||
|
// Possibly override IOConfig setting (from deck) for how often RESTART files should get written to disk (every N report step)
|
||||||
|
if (Base::param_.has("output_interval")) {
|
||||||
|
const int output_interval = Base::param_.get<int>("output_interval");
|
||||||
|
IOConfigPtr ioConfig = Base::eclipse_state_->getIOConfig();
|
||||||
|
ioConfig->overrideRestartWriteInterval(static_cast<size_t>(output_interval));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Possible to force initialization only behavior (NOSIM).
|
||||||
|
if (Base::param_.has("nosim")) {
|
||||||
|
const bool nosim = Base::param_.get<bool>("nosim");
|
||||||
|
IOConfigPtr ioConfig = Base::eclipse_state_->getIOConfig();
|
||||||
|
ioConfig->overrideNOSIM( nosim );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// This is the main function of Flow.
|
||||||
// Create simulator instance.
|
// Create simulator instance.
|
||||||
// Writes to:
|
// Writes to:
|
||||||
// simulator_
|
// simulator_
|
||||||
void createSimulator()
|
void createSimulator()
|
||||||
{
|
{
|
||||||
// Create the simulator instance.
|
// Create the simulator instance.
|
||||||
Base::simulator_.reset(new Simulator(Base::param_,
|
Base::simulator_.reset(new Simulator(*ebosSimulator_,
|
||||||
|
Base::param_,
|
||||||
*Base::geoprops_,
|
*Base::geoprops_,
|
||||||
*Base::fluidprops_,
|
*Base::fluidprops_,
|
||||||
Base::rock_comp_->isActive() ? Base::rock_comp_.get() : nullptr,
|
Base::rock_comp_->isActive() ? Base::rock_comp_.get() : nullptr,
|
||||||
@ -55,6 +96,9 @@ namespace Opm
|
|||||||
*Base::output_writer_,
|
*Base::output_writer_,
|
||||||
Base::threshold_pressures_));
|
Base::threshold_pressures_));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::unique_ptr<EbosSimulator> ebosSimulator_;
|
||||||
};
|
};
|
||||||
} // namespace Opm
|
} // namespace Opm
|
||||||
|
|
||||||
|
@ -73,7 +73,8 @@ public:
|
|||||||
/// \param[in] eclipse_state the object which represents an internalized ECL deck
|
/// \param[in] eclipse_state the object which represents an internalized ECL deck
|
||||||
/// \param[in] output_writer
|
/// \param[in] output_writer
|
||||||
/// \param[in] threshold_pressures_by_face if nonempty, threshold pressures that inhibit flow
|
/// \param[in] threshold_pressures_by_face if nonempty, threshold pressures that inhibit flow
|
||||||
SimulatorFullyImplicitBlackoilEbos(const parameter::ParameterGroup& param,
|
SimulatorFullyImplicitBlackoilEbos(Simulator& ebosSimulator,
|
||||||
|
const parameter::ParameterGroup& param,
|
||||||
DerivedGeology& geo,
|
DerivedGeology& geo,
|
||||||
BlackoilPropsAdInterface& props,
|
BlackoilPropsAdInterface& props,
|
||||||
const RockCompressibility* rock_comp_props,
|
const RockCompressibility* rock_comp_props,
|
||||||
@ -84,7 +85,8 @@ public:
|
|||||||
std::shared_ptr<EclipseState> eclipse_state,
|
std::shared_ptr<EclipseState> eclipse_state,
|
||||||
BlackoilOutputWriter& output_writer,
|
BlackoilOutputWriter& output_writer,
|
||||||
const std::vector<double>& threshold_pressures_by_face)
|
const std::vector<double>& threshold_pressures_by_face)
|
||||||
: param_(param),
|
: ebosSimulator_(ebosSimulator),
|
||||||
|
param_(param),
|
||||||
model_param_(param),
|
model_param_(param),
|
||||||
solver_param_(param),
|
solver_param_(param),
|
||||||
props_(props),
|
props_(props),
|
||||||
@ -95,21 +97,10 @@ public:
|
|||||||
has_disgas_(has_disgas),
|
has_disgas_(has_disgas),
|
||||||
has_vapoil_(has_vapoil),
|
has_vapoil_(has_vapoil),
|
||||||
terminal_output_(param.getDefault("output_terminal", true)),
|
terminal_output_(param.getDefault("output_terminal", true)),
|
||||||
eclipse_state_(eclipse_state),
|
|
||||||
output_writer_(output_writer),
|
output_writer_(output_writer),
|
||||||
threshold_pressures_by_face_(threshold_pressures_by_face),
|
threshold_pressures_by_face_(threshold_pressures_by_face),
|
||||||
is_parallel_run_( false )
|
is_parallel_run_( false )
|
||||||
{
|
{
|
||||||
std::string progName("flow_ebos");
|
|
||||||
std::string deckFile("--ecl-deck-file-name=");
|
|
||||||
deckFile += model_param_.deck_file_name_;
|
|
||||||
char* ptr[2];
|
|
||||||
ptr[ 0 ] = const_cast< char * > (progName.c_str());
|
|
||||||
ptr[ 1 ] = const_cast< char * > (deckFile.c_str());
|
|
||||||
Simulator::registerParameters();
|
|
||||||
Ewoms::setupParameters_< TypeTag > ( 2, ptr );
|
|
||||||
ebosSimulator_ = new Simulator();
|
|
||||||
ebosSimulator_->model().applyInitialSolution();
|
|
||||||
|
|
||||||
// Misc init.
|
// Misc init.
|
||||||
const int num_cells = AutoDiffGrid::numCells(grid());
|
const int num_cells = AutoDiffGrid::numCells(grid());
|
||||||
@ -158,7 +149,7 @@ public:
|
|||||||
std::string tstep_filename = output_writer_.outputDirectory() + "/step_timing.txt";
|
std::string tstep_filename = output_writer_.outputDirectory() + "/step_timing.txt";
|
||||||
std::ofstream tstep_os(tstep_filename.c_str());
|
std::ofstream tstep_os(tstep_filename.c_str());
|
||||||
|
|
||||||
const auto& schedule = eclipse_state_->getSchedule();
|
const auto& schedule = eclState()->getSchedule();
|
||||||
const auto& events = schedule->getEvents();
|
const auto& events = schedule->getEvents();
|
||||||
|
|
||||||
// adaptive time stepping
|
// adaptive time stepping
|
||||||
@ -204,7 +195,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create wells and well state.
|
// Create wells and well state.
|
||||||
WellsManager wells_manager(eclipse_state_,
|
WellsManager wells_manager(eclState(),
|
||||||
timer.currentStepNum(),
|
timer.currentStepNum(),
|
||||||
Opm::UgGridHelpers::numCells(grid()),
|
Opm::UgGridHelpers::numCells(grid()),
|
||||||
Opm::UgGridHelpers::globalCell(grid()),
|
Opm::UgGridHelpers::globalCell(grid()),
|
||||||
@ -283,7 +274,7 @@ public:
|
|||||||
// TODO (?): handle the parallel case (maybe this works out of the box)
|
// TODO (?): handle the parallel case (maybe this works out of the box)
|
||||||
DeckConstPtr miniDeck = schedule->getModifierDeck(nextTimeStepIdx);
|
DeckConstPtr miniDeck = schedule->getModifierDeck(nextTimeStepIdx);
|
||||||
eclState()->applyModifierDeck(*miniDeck);
|
eclState()->applyModifierDeck(*miniDeck);
|
||||||
geo_.update(grid(), props_, eclipse_state_, gravity_);
|
geo_.update(grid(), props_, eclState(), gravity_);
|
||||||
}
|
}
|
||||||
|
|
||||||
// take time that was used to solve system for this reportStep
|
// take time that was used to solve system for this reportStep
|
||||||
@ -327,7 +318,7 @@ public:
|
|||||||
computeWellPotentials(wells, well_state, well_potentials);
|
computeWellPotentials(wells, well_state, well_potentials);
|
||||||
}
|
}
|
||||||
|
|
||||||
updateListEconLimited(solver, eclipse_state_->getSchedule(), timer.currentStepNum(), wells,
|
updateListEconLimited(solver, eclState()->getSchedule(), timer.currentStepNum(), wells,
|
||||||
well_state, dynamic_list_econ_limited);
|
well_state, dynamic_list_econ_limited);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -344,7 +335,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
const Grid& grid() const
|
const Grid& grid() const
|
||||||
{ return ebosSimulator_->gridManager().grid(); }
|
{ return ebosSimulator_.gridManager().grid(); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void handleAdditionalWellInflow(SimulatorTimer& timer,
|
void handleAdditionalWellInflow(SimulatorTimer& timer,
|
||||||
@ -355,14 +346,13 @@ protected:
|
|||||||
|
|
||||||
std::unique_ptr<Solver> createSolver(const WellModel& well_model)
|
std::unique_ptr<Solver> createSolver(const WellModel& well_model)
|
||||||
{
|
{
|
||||||
auto model = std::unique_ptr<Model>(new Model(*ebosSimulator_,
|
auto model = std::unique_ptr<Model>(new Model(ebosSimulator_,
|
||||||
model_param_,
|
model_param_,
|
||||||
props_,
|
props_,
|
||||||
geo_,
|
geo_,
|
||||||
rock_comp_props_,
|
rock_comp_props_,
|
||||||
well_model,
|
well_model,
|
||||||
solver_,
|
solver_,
|
||||||
eclipse_state_,
|
|
||||||
has_disgas_,
|
has_disgas_,
|
||||||
has_vapoil_,
|
has_vapoil_,
|
||||||
terminal_output_));
|
terminal_output_));
|
||||||
@ -377,7 +367,7 @@ protected:
|
|||||||
{
|
{
|
||||||
typedef SimFIBODetails::WellMap WellMap;
|
typedef SimFIBODetails::WellMap WellMap;
|
||||||
|
|
||||||
const auto w_ecl = eclipse_state_->getSchedule()->getWells(step);
|
const auto w_ecl = eclState()->getSchedule()->getWells(step);
|
||||||
const WellMap& wmap = SimFIBODetails::mapWells(w_ecl);
|
const WellMap& wmap = SimFIBODetails::mapWells(w_ecl);
|
||||||
|
|
||||||
const std::vector<int>& resv_wells = SimFIBODetails::resvWells(wells, step, wmap);
|
const std::vector<int>& resv_wells = SimFIBODetails::resvWells(wells, step, wmap);
|
||||||
@ -565,10 +555,14 @@ protected:
|
|||||||
well_state, list_econ_limited);
|
well_state, list_econ_limited);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EclipseStateConstPtr eclState() const
|
||||||
|
{ return ebosSimulator_.gridManager().eclState(); }
|
||||||
|
|
||||||
|
EclipseStatePtr eclState()
|
||||||
|
{ return ebosSimulator_.gridManager().eclState(); }
|
||||||
|
|
||||||
// Data.
|
// Data.
|
||||||
Simulator* ebosSimulator_;
|
Simulator& ebosSimulator_;
|
||||||
|
|
||||||
typedef RateConverter::
|
typedef RateConverter::
|
||||||
SurfaceToReservoirVoidage< BlackoilPropsAdInterface,
|
SurfaceToReservoirVoidage< BlackoilPropsAdInterface,
|
||||||
@ -591,8 +585,6 @@ protected:
|
|||||||
const bool has_disgas_;
|
const bool has_disgas_;
|
||||||
const bool has_vapoil_;
|
const bool has_vapoil_;
|
||||||
bool terminal_output_;
|
bool terminal_output_;
|
||||||
// eclipse_state
|
|
||||||
std::shared_ptr<EclipseState> eclipse_state_;
|
|
||||||
// output_writer
|
// output_writer
|
||||||
OutputWriter& output_writer_;
|
OutputWriter& output_writer_;
|
||||||
std::unique_ptr<RateConverterType> rateConverter_;
|
std::unique_ptr<RateConverterType> rateConverter_;
|
||||||
|
Loading…
Reference in New Issue
Block a user