Make BlackoilMultisegmentModel constructured from MultisegmentWells

Instead of being coustructed based StandardWells and having a
MultisegmentWells member.
This commit is contained in:
Kai Bao 2016-05-09 17:44:59 +02:00
parent 4254b48b57
commit 06775ee02c
22 changed files with 87 additions and 68 deletions

View File

@ -65,13 +65,13 @@ namespace Opm {
const BlackoilPropsAdInterface& fluid,
const DerivedGeology& geo,
const RockCompressibility* rock_comp_props,
const Wells* wells_arg,
const StandardWells& std_wells,
const NewtonIterationBlackoilInterface& linsolver,
Opm::EclipseStateConstPtr eclState,
const bool has_disgas,
const bool has_vapoil,
const bool terminal_output)
: Base(param, grid, fluid, geo, rock_comp_props, wells_arg, linsolver,
: Base(param, grid, fluid, geo, rock_comp_props, std_wells, linsolver,
eclState, has_disgas, has_vapoil, terminal_output)
{
}

View File

@ -142,7 +142,7 @@ namespace Opm {
const BlackoilPropsAdInterface& fluid,
const DerivedGeology& geo ,
const RockCompressibility* rock_comp_props,
const Wells* wells,
const WellModel& well_model,
const NewtonIterationBlackoilInterface& linsolver,
Opm::EclipseStateConstPtr eclState,
const bool has_disgas,

View File

@ -167,7 +167,7 @@ namespace detail {
const BlackoilPropsAdInterface& fluid,
const DerivedGeology& geo ,
const RockCompressibility* rock_comp_props,
const Wells* wells_arg,
const WellModel& well_model,
const NewtonIterationBlackoilInterface& linsolver,
Opm::EclipseStateConstPtr eclState,
const bool has_disgas,
@ -191,7 +191,7 @@ namespace detail {
, use_threshold_pressure_(false)
, rq_ (fluid.numPhases())
, phaseCondition_(AutoDiffGrid::numCells(grid))
, std_wells_ (wells_arg)
, std_wells_ (well_model)
, isRs_(V::Zero(AutoDiffGrid::numCells(grid)))
, isRv_(V::Zero(AutoDiffGrid::numCells(grid)))
, isSg_(V::Zero(AutoDiffGrid::numCells(grid)))
@ -221,6 +221,10 @@ namespace detail {
std_wells_.init(&fluid_, &active_, &phaseCondition_, &vfp_properties_, gravity, depth);
// TODO: put this for now to avoid modify the following code.
// TODO: this code is fragile.
const Wells* wells_arg = &(asImpl().std_wells_.wells());
#if HAVE_MPI
if ( linsolver_.parallelInformation().type() == typeid(ParallelISTLInformation) )
{

View File

@ -51,11 +51,11 @@ namespace Opm {
/// \tparam Grid UnstructuredGrid or CpGrid.
/// \tparam Implementation Provides concrete state types.
template<class Grid>
class BlackoilMultiSegmentModel : public BlackoilModelBase<Grid, StandardWells, BlackoilMultiSegmentModel<Grid> >
class BlackoilMultiSegmentModel : public BlackoilModelBase<Grid, MultisegmentWells, BlackoilMultiSegmentModel<Grid> >
{
public:
typedef BlackoilModelBase<Grid, StandardWells, BlackoilMultiSegmentModel<Grid> > Base; // base class
typedef BlackoilModelBase<Grid, MultisegmentWells, BlackoilMultiSegmentModel<Grid> > Base; // base class
typedef typename Base::ReservoirState ReservoirState;
typedef typename Base::WellState WellState;
typedef BlackoilMultiSegmentSolutionState SolutionState;
@ -85,13 +85,12 @@ namespace Opm {
const BlackoilPropsAdInterface& fluid,
const DerivedGeology& geo ,
const RockCompressibility* rock_comp_props,
const Wells* wells,
const MultisegmentWells& well_model,
const NewtonIterationBlackoilInterface& linsolver,
Opm::EclipseStateConstPtr eclState,
const bool has_disgas,
const bool has_vapoil,
const bool terminal_output,
const MultisegmentWells& multisegment_wells);
const bool terminal_output);
/// Called once before each time step.
/// \param[in] dt time step size
@ -165,7 +164,7 @@ namespace Opm {
const MultisegmentWells& msWells() const { return ms_wells_; }
MultisegmentWells& msWells() { return ms_wells_; }
const std::vector<WellMultiSegmentConstPtr>& wellsMultiSegment() const { return msWells().wells(); }
const std::vector<WellMultiSegmentConstPtr>& wellsMultiSegment() const { return msWells().msWells(); }
const MultisegmentWells::MultisegmentWellOps& msWellOps() const { return msWells().wellOps(); }

View File

@ -62,16 +62,15 @@ namespace Opm {
const BlackoilPropsAdInterface& fluid,
const DerivedGeology& geo ,
const RockCompressibility* rock_comp_props,
const Wells* wells_arg,
const MultisegmentWells& well_model,
const NewtonIterationBlackoilInterface& linsolver,
Opm::EclipseStateConstPtr eclState,
const bool has_disgas,
const bool has_vapoil,
const bool terminal_output,
const MultisegmentWells& multisegment_wells)
: Base(param, grid, fluid, geo, rock_comp_props, wells_arg, linsolver,
const bool terminal_output)
: Base(param, grid, fluid, geo, rock_comp_props, well_model, linsolver,
eclState, has_disgas, has_vapoil, terminal_output)
, ms_wells_(multisegment_wells)
, ms_wells_(well_model)
{
const double gravity = detail::getGravity(geo_.gravity(), UgGridHelpers::dimensions(grid_));
const V depth = Opm::AutoDiffGrid::cellCentroidsZToEigen(grid_);

View File

@ -71,7 +71,7 @@ namespace Opm {
const DerivedGeology& geo,
const RockCompressibility* rock_comp_props,
const SolventPropsAdFromDeck& solvent_props,
const Wells* wells,
const StandardWellsSolvent& well_model,
const NewtonIterationBlackoilInterface& linsolver,
const EclipseStateConstPtr eclState,
const bool has_disgas,

View File

@ -76,7 +76,7 @@ namespace Opm {
const DerivedGeology& geo,
const RockCompressibility* rock_comp_props,
const SolventPropsAdFromDeck& solvent_props,
const Wells* wells_arg,
const StandardWellsSolvent& well_model,
const NewtonIterationBlackoilInterface& linsolver,
const EclipseStateConstPtr eclState,
const bool has_disgas,
@ -84,7 +84,7 @@ namespace Opm {
const bool terminal_output,
const bool has_solvent,
const bool is_miscible)
: Base(param, grid, fluid, geo, rock_comp_props, wells_arg, linsolver,
: Base(param, grid, fluid, geo, rock_comp_props, well_model, linsolver,
eclState, has_disgas, has_vapoil, terminal_output),
has_solvent_(has_solvent),
solvent_pos_(detail::solventPos(fluid.phaseUsage())),

View File

@ -236,7 +236,7 @@ namespace Opm {
const std::vector<WellMultiSegmentConstPtr>&
MultisegmentWells::wells() const
MultisegmentWells::msWells() const
{
return wells_multisegment_;
}
@ -246,7 +246,7 @@ namespace Opm {
const Wells&
MultisegmentWells::wellsStruct() const
MultisegmentWells::wells() const
{
assert(wells_ != nullptr);
return *(wells_);
@ -270,7 +270,7 @@ namespace Opm {
MultisegmentWells::
computeSegmentPressuresDelta(const double grav)
{
const int nw = wells().size();
const int nw = msWells().size();
const int nseg_total = nseg_total_;
if ( !wellOps().has_multisegment_wells ) {
@ -284,7 +284,7 @@ namespace Opm {
Vector segment_depth_delta = Vector::Zero(nseg_total);
int start_segment = 0;
for (int w = 0; w < nw; ++w) {
WellMultiSegmentConstPtr well = wells()[w];
WellMultiSegmentConstPtr well = msWells()[w];
const int nseg = well->numberOfSegments();
for (int s = 1; s < nseg; ++s) {
const int s_outlet = well->outletSegment()[s];

View File

@ -97,10 +97,10 @@ namespace Opm {
const double gravity_arg,
const Vector& depth_arg);
const std::vector<WellMultiSegmentConstPtr>& wells() const;
const std::vector<WellMultiSegmentConstPtr>& msWells() const;
const MultisegmentWellOps& wellOps() const;
const Wells& wellsStruct() const;
const Wells& wells() const;
int numPhases() const { return num_phases_; };

View File

@ -85,9 +85,9 @@ namespace Opm
const double dpmaxrel,
WellState& well_state) const
{
if (!wells().empty())
if (!msWells().empty())
{
const int nw = wells().size();
const int nw = msWells().size();
const int nseg_total = nseg_total_;
const int np = numPhases();
@ -133,7 +133,7 @@ namespace Opm
wr[p + np * w] = well_state.segPhaseRates()[p + np * start_segment];
}
const int nseg = wells()[w]->numberOfSegments();
const int nseg = msWells()[w]->numberOfSegments();
start_segment += nseg;
}
@ -158,10 +158,10 @@ namespace Opm
Vector& aliveWells,
std::vector<ADB>& cq_s) const
{
if (wells().size() == 0) return;
if (msWells().size() == 0) return;
const int np = numPhases();
const int nw = wells().size();
const int nw = msWells().size();
aliveWells = Vector::Constant(nw, 1.0);
@ -189,7 +189,7 @@ namespace Opm
// Create selector for perforations of multi-segment vs. regular wells.
Vector is_multisegment_well(nw);
for (int w = 0; w < nw; ++w) {
is_multisegment_well[w] = double(wells()[w]->isMultiSegmented());
is_multisegment_well[w] = double(msWells()[w]->isMultiSegmented());
}
// Take one flag per well and expand to one flag per perforation.
Vector is_multisegment_perf = wellOps().w2p * is_multisegment_well.matrix();
@ -263,11 +263,11 @@ namespace Opm
// TODO: involves one operations that are not valid now. (i.e. how to transverse from the leaves to the root,
// TODO: although we can begin from the brutal force way)
// TODO: stop using wells() here.
// TODO: stop using msWells() here.
std::vector<ADB> wbq(np, ADB::null());
ADB wbqt = ADB::constant(Vector::Zero(nseg));
const DataBlock compi = Eigen::Map<const DataBlock>(wellsStruct().comp_frac, nw, np);
const DataBlock compi = Eigen::Map<const DataBlock>(wells().comp_frac, nw, np);
for (int phase = 0; phase < np; ++phase) {
const ADB& q_ps = wellOps().p2s * cq_ps[phase];
@ -294,7 +294,7 @@ namespace Opm
if (wbqt.value()[topseg] == 0.0) { // yes we really mean == here, no fuzzyness
aliveWells[w] = 0.0;
}
topseg += wells()[w]->numberOfSegments();
topseg += msWells()[w]->numberOfSegments();
}
}
@ -397,7 +397,7 @@ namespace Opm
computeSegmentFluidProperties(const SolutionState& state)
{
const int np = numPhases();
const int nw = wells().size();
const int nw = msWells().size();
const int nseg_total = nseg_total_;
if ( !wellOps().has_multisegment_wells ){
@ -425,7 +425,7 @@ namespace Opm
std::vector<int> segment_cells;
segment_cells.reserve(nseg_total);
for (int w = 0; w < nw; ++w) {
const std::vector<int>& segment_cells_well = wells()[w]->segmentCells();
const std::vector<int>& segment_cells_well = msWells()[w]->segmentCells();
segment_cells.insert(segment_cells.end(), segment_cells_well.begin(), segment_cells_well.end());
}
assert(int(segment_cells.size()) == nseg_total);
@ -484,7 +484,7 @@ namespace Opm
std::vector<std::vector<double>> comp_frac(np, std::vector<double>(nseg_total, 0.0));
int start_segment = 0;
for (int w = 0; w < nw; ++w) {
WellMultiSegmentConstPtr well = wells()[w];
WellMultiSegmentConstPtr well = msWells()[w];
const int nseg = well->numberOfSegments();
const std::vector<double>& comp_frac_well = well->compFrac();
for (int phase = 0; phase < np; ++phase) {
@ -663,10 +663,10 @@ namespace Opm
// the name of the function is a a little misleading.
// Basically it is the function for the pressure equation.
// And also, it work as the control equation when it is the segment
if( wells().empty() ) return;
if( msWells().empty() ) return;
const int np = numPhases();
const int nw = wells().size();
const int nw = msWells().size();
const int nseg_total = nseg_total_;
ADB aqua = ADB::constant(Vector::Zero(nseg_total));
@ -708,14 +708,14 @@ namespace Opm
//and gather info about current control
int start_segment = 0;
for (int w = 0; w < nw; ++w) {
const struct WellControls* wc = wells()[w]->wellControls();
const struct WellControls* wc = msWells()[w]->wellControls();
// The current control in the well state overrides
// the current control set in the Wells struct, which
// is instead treated as a default.
const int current = xw.currentControls()[w];
const int nseg = wells()[w]->numberOfSegments();
const int nseg = msWells()[w]->numberOfSegments();
switch (well_controls_iget_type(wc, current)) {
case BHP:
@ -825,15 +825,15 @@ namespace Opm
updateWellControls(const bool terminal_output,
WellState& xw) const
{
if( wells().empty() ) return ;
if( msWells().empty() ) return ;
std::string modestring[4] = { "BHP", "THP", "RESERVOIR_RATE", "SURFACE_RATE" };
// Find, for each well, if any constraints are broken. If so,
// switch control to first broken constraint.
const int np = numPhases();
const int nw = wells().size();
const int nw = msWells().size();
for (int w = 0; w < nw; ++w) {
const WellControls* wc = wells()[w]->wellControls();
const WellControls* wc = msWells()[w]->wellControls();
// The current control in the well state overrides
// the current control set in the Wells struct, which
// is instead treated as a default.
@ -852,7 +852,7 @@ namespace Opm
}
if (wellhelpers::constraintBroken(
xw.bhp(), xw.thp(), xw.wellRates(),
w, np, wells()[w]->wellType(), wc, ctrl_index)) {
w, np, msWells()[w]->wellType(), wc, ctrl_index)) {
// ctrl_index will be the index of the broken constraint after the loop.
break;
}
@ -862,7 +862,7 @@ namespace Opm
// Constraint number ctrl_index was broken, switch to it.
if (terminal_output)
{
std::cout << "Switching control mode for well " << wells()[w]->name()
std::cout << "Switching control mode for well " << msWells()[w]->name()
<< " from " << modestring[well_controls_iget_type(wc, current)]
<< " to " << modestring[well_controls_iget_type(wc, ctrl_index)] << std::endl;
}
@ -1022,13 +1022,13 @@ namespace Opm
// 2. Compute densities
std::vector<double> cd =
WellDensitySegmented::computeConnectionDensities(
wellsStruct(), xw, fluid_->phaseUsage(),
wells(), xw, fluid_->phaseUsage(),
b_perf, rsmax_perf, rvmax_perf, surf_dens_perf);
// 3. Compute pressure deltas
std::vector<double> cdp =
WellDensitySegmented::computeConnectionPressureDelta(
wellsStruct(), perf_cell_depth, cd, gravity_);
wells(), perf_cell_depth, cd, gravity_);
// 4. Store the results
well_perforation_densities_ = Eigen::Map<const Vector>(cd.data(), nperf_total); // This one is not useful for segmented wells at all

View File

@ -90,6 +90,7 @@ namespace Opm
typedef typename Traits::OutputWriter OutputWriter;
typedef typename Traits::Grid Grid;
typedef typename Traits::Solver Solver;
typedef typename Traits::WellModel WellModel;
/// Initialise from parameters and objects to observe.
/// \param[in] param parameters, this class accepts the following:
@ -149,7 +150,7 @@ namespace Opm
WellState& well_state,
const Wells* wells);
std::unique_ptr<Solver> createSolver(const Wells* wells);
std::unique_ptr<Solver> createSolver(const WellModel& well_model);
void
computeRESV(const std::size_t step,

View File

@ -169,7 +169,9 @@ namespace Opm
// Run a multiple steps of the solver depending on the time step control.
solver_timer.start();
auto solver = asImpl().createSolver(wells);
const WellModel well_model(wells);
auto solver = asImpl().createSolver(well_model);
// If sub stepping is enabled allow the solver to sub cycle
// in case the report steps are too large for the solver to converge
@ -373,7 +375,7 @@ namespace Opm
{ }
template <class Implementation>
auto SimulatorBase<Implementation>::createSolver(const Wells* wells)
auto SimulatorBase<Implementation>::createSolver(const WellModel& well_model)
-> std::unique_ptr<Solver>
{
auto model = std::unique_ptr<Model>(new Model(model_param_,
@ -381,7 +383,7 @@ namespace Opm
props_,
geo_,
rock_comp_props_,
wells,
well_model,
solver_,
eclipse_state_,
has_disgas_,

View File

@ -28,6 +28,7 @@ namespace Opm {
template <class GridT>
class SimulatorFullyImplicitBlackoil;
class StandardWells;
template <class GridT>
struct SimulatorTraits<SimulatorFullyImplicitBlackoil<GridT> >
@ -38,6 +39,7 @@ struct SimulatorTraits<SimulatorFullyImplicitBlackoil<GridT> >
typedef GridT Grid;
typedef BlackoilModel<Grid> Model;
typedef NonlinearSolver<Model> Solver;
typedef StandardWells WellModel;
};
/// a simulator for the blackoil model

View File

@ -33,6 +33,8 @@ namespace Opm {
template <class GridT>
class SimulatorFullyImplicitBlackoilMultiSegment;
class MultisegmentWells;
template <class GridT>
struct SimulatorTraits<SimulatorFullyImplicitBlackoilMultiSegment<GridT> >
{
@ -42,6 +44,7 @@ struct SimulatorTraits<SimulatorFullyImplicitBlackoilMultiSegment<GridT> >
typedef GridT Grid;
typedef BlackoilMultiSegmentModel<Grid> Model;
typedef NonlinearSolver<Model> Solver;
typedef MultisegmentWells WellModel;
};
/// a simulator for the blackoil model
@ -56,6 +59,7 @@ public:
typedef typename Traits::ReservoirState ReservoirState;
typedef typename Traits::WellState WellState;
typedef typename Traits::Solver Solver;
typedef typename Traits::WellModel WellModel;
// forward the constructor to the base class
SimulatorFullyImplicitBlackoilMultiSegment(const parameter::ParameterGroup& param,
@ -80,7 +84,7 @@ public:
protected:
std::unique_ptr<Solver> createSolver(const Wells* wells, const MultisegmentWells& multisegment_wells);
std::unique_ptr<Solver> createSolver(const WellModel& well_model);
using Base::output_writer_;
using Base::param_;

View File

@ -25,7 +25,7 @@ namespace Opm
template <class GridT>
auto SimulatorFullyImplicitBlackoilMultiSegment<GridT>::
createSolver(const Wells* wells, const MultisegmentWells& multisegment_wells)
createSolver(const WellModel& well_model)
-> std::unique_ptr<Solver>
{
typedef typename Traits::Model Model;
@ -35,13 +35,12 @@ namespace Opm
props_,
geo_,
rock_comp_props_,
wells,
well_model,
solver_,
eclipse_state_,
has_disgas_,
has_vapoil_,
terminal_output_,
multisegment_wells));
terminal_output_));
if (!Base::threshold_pressures_by_face_.empty()) {
model->setThresholdPressures(Base::threshold_pressures_by_face_);
@ -134,7 +133,7 @@ namespace Opm
// Run a multiple steps of the solver depending on the time step control.
solver_timer.start();
auto solver = createSolver(wells, multisegment_wells);
auto solver = createSolver(multisegment_wells);
// If sub stepping is enabled allow the solver to sub cycle
// in case the report steps are too large for the solver to converge

View File

@ -80,6 +80,8 @@ namespace Opm
template <class GridT>
class SimulatorFullyImplicitBlackoilSolvent;
class StandardWellsSolvent;
template<class GridT>
struct SimulatorTraits<SimulatorFullyImplicitBlackoilSolvent<GridT> >
{
@ -89,6 +91,8 @@ namespace Opm
typedef GridT Grid;
typedef BlackoilSolventModel<Grid> Model;
typedef NonlinearSolver<Model> Solver;
typedef StandardWellsSolvent WellModel;
};
/// Class collecting all necessary components for a blackoil simulation with polymer
@ -102,6 +106,7 @@ namespace Opm
typedef SimulatorTraits<ThisType> Traits;
typedef typename Traits::Solver Solver;
typedef typename Traits::WellModel WellModel;
public:
SimulatorFullyImplicitBlackoilSolvent(const parameter::ParameterGroup& param,
@ -120,7 +125,7 @@ namespace Opm
const std::vector<double>& threshold_pressures_by_face,
const bool solvent);
std::unique_ptr<Solver> createSolver(const Wells* wells);
std::unique_ptr<Solver> createSolver(const WellModel& well_model);
void handleAdditionalWellInflow(SimulatorTimer& timer,
WellsManager& wells_manager,

View File

@ -63,7 +63,7 @@ namespace Opm
template <class GridT>
auto SimulatorFullyImplicitBlackoilSolvent<GridT>::
createSolver(const Wells* wells)
createSolver(const WellModel& well_model)
-> std::unique_ptr<Solver>
{
typedef typename Traits::Model Model;
@ -75,7 +75,7 @@ namespace Opm
BaseType::geo_,
BaseType::rock_comp_props_,
solvent_props_,
wells,
well_model,
BaseType::solver_,
BaseType::eclipse_state_,
BaseType::has_disgas_,

View File

@ -67,7 +67,7 @@ namespace Opm
template <class ReservoirState, class PrevWellState>
void init(const MultisegmentWells& ms_wells, const ReservoirState& state, const PrevWellState& prevState)
{
const std::vector<WellMultiSegmentConstPtr>& wells = ms_wells.wells();
const std::vector<WellMultiSegmentConstPtr>& wells = ms_wells.msWells();
const int nw = wells.size();
nseg_ = 0;
nperf_ = 0;

View File

@ -79,7 +79,7 @@ namespace Opm {
const DerivedGeology& geo,
const RockCompressibility* rock_comp_props,
const PolymerPropsAd& polymer_props_ad,
const Wells* wells,
const StandardWells& well_model,
const NewtonIterationBlackoilInterface& linsolver,
EclipseStateConstPtr eclipse_state,
const bool has_disgas,

View File

@ -80,7 +80,7 @@ namespace Opm {
const DerivedGeology& geo,
const RockCompressibility* rock_comp_props,
const PolymerPropsAd& polymer_props_ad,
const Wells* wells_arg,
const StandardWells& well_model,
const NewtonIterationBlackoilInterface& linsolver,
EclipseStateConstPtr eclipse_state,
const bool has_disgas,
@ -92,7 +92,7 @@ namespace Opm {
const std::vector<double>& wells_perf_length,
const std::vector<double>& wells_bore_diameter,
const bool terminal_output)
: Base(param, grid, fluid, geo, rock_comp_props, wells_arg, linsolver, eclipse_state,
: Base(param, grid, fluid, geo, rock_comp_props, well_model, linsolver, eclipse_state,
has_disgas, has_vapoil, terminal_output),
polymer_props_ad_(polymer_props_ad),
has_polymer_(has_polymer),

View File

@ -81,6 +81,8 @@ namespace Opm
template <class GridT>
class SimulatorFullyImplicitBlackoilPolymer;
class StandardWells;
template<class GridT>
struct SimulatorTraits<SimulatorFullyImplicitBlackoilPolymer<GridT> >
{
@ -90,6 +92,7 @@ namespace Opm
typedef GridT Grid;
typedef BlackoilPolymerModel<Grid> Model;
typedef NonlinearSolver<Model> Solver;
typedef StandardWells WellModel;
};
/// Class collecting all necessary components for a blackoil simulation with polymer
@ -103,6 +106,7 @@ namespace Opm
typedef SimulatorTraits<ThisType> Traits;
typedef typename Traits::Solver Solver;
typedef typename Traits::WellModel WellModel;
public:
SimulatorFullyImplicitBlackoilPolymer(const parameter::ParameterGroup& param,
@ -123,7 +127,7 @@ namespace Opm
Opm::DeckConstPtr& deck,
const std::vector<double>& threshold_pressures_by_face);
std::unique_ptr<Solver> createSolver(const Wells* wells);
std::unique_ptr<Solver> createSolver(const WellModel& well_model);
void handleAdditionalWellInflow(SimulatorTimer& timer,

View File

@ -62,7 +62,7 @@ namespace Opm
template <class GridT>
auto SimulatorFullyImplicitBlackoilPolymer<GridT>::
createSolver(const Wells* wells)
createSolver(const WellModel& well_model)
-> std::unique_ptr<Solver>
{
typedef typename Traits::Model Model;
@ -74,7 +74,7 @@ namespace Opm
BaseType::geo_,
BaseType::rock_comp_props_,
polymer_props_,
wells,
well_model,
BaseType::solver_,
BaseType::eclipse_state_,
BaseType::has_disgas_,