mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
instantiate the ebos Simulator object in SimulatorFullyImplicitBlackoilEbos
this gets rid of some ugly hacks with static variables...
This commit is contained in:
parent
3027e1f39d
commit
77f103fca5
@ -138,7 +138,8 @@ namespace Opm {
|
|||||||
/// \param[in] has_disgas turn on dissolved gas
|
/// \param[in] has_disgas turn on dissolved gas
|
||||||
/// \param[in] has_vapoil turn on vaporized oil feature
|
/// \param[in] has_vapoil turn on vaporized oil feature
|
||||||
/// \param[in] terminal_output request output to cout/cerr
|
/// \param[in] terminal_output request output to cout/cerr
|
||||||
BlackoilModelEbos(const ModelParameters& param,
|
BlackoilModelEbos(Simulator& ebosSimulator,
|
||||||
|
const ModelParameters& param,
|
||||||
const Grid& grid ,
|
const Grid& grid ,
|
||||||
const BlackoilPropsAdInterface& fluid,
|
const BlackoilPropsAdInterface& fluid,
|
||||||
const DerivedGeology& geo ,
|
const DerivedGeology& geo ,
|
||||||
@ -149,7 +150,8 @@ namespace Opm {
|
|||||||
const bool has_disgas,
|
const bool has_disgas,
|
||||||
const bool has_vapoil,
|
const bool has_vapoil,
|
||||||
const bool terminal_output)
|
const bool terminal_output)
|
||||||
: grid_ (grid)
|
: ebosSimulator_(ebosSimulator)
|
||||||
|
, grid_ (grid)
|
||||||
, fluid_ (fluid)
|
, fluid_ (fluid)
|
||||||
, geo_ (geo)
|
, geo_ (geo)
|
||||||
, rock_comp_props_(rock_comp_props)
|
, rock_comp_props_(rock_comp_props)
|
||||||
@ -178,7 +180,6 @@ namespace Opm {
|
|||||||
false } )
|
false } )
|
||||||
, terminal_output_ (terminal_output)
|
, terminal_output_ (terminal_output)
|
||||||
, current_relaxation_(1.0)
|
, current_relaxation_(1.0)
|
||||||
, ebosSimulator_( 0 )
|
|
||||||
{
|
{
|
||||||
const double gravity = detail::getGravity(geo_.gravity(), UgGridHelpers::dimensions(grid_));
|
const double gravity = detail::getGravity(geo_.gravity(), UgGridHelpers::dimensions(grid_));
|
||||||
const V depth = Opm::AutoDiffGrid::cellCentroidsZToEigen(grid_);
|
const V depth = Opm::AutoDiffGrid::cellCentroidsZToEigen(grid_);
|
||||||
@ -187,22 +188,6 @@ namespace Opm {
|
|||||||
|
|
||||||
wellModel().setWellsActive( localWellsActive() );
|
wellModel().setWellsActive( localWellsActive() );
|
||||||
global_nc_ = Opm::AutoDiffGrid::numCells(grid_);
|
global_nc_ = Opm::AutoDiffGrid::numCells(grid_);
|
||||||
|
|
||||||
static Simulator* ebosPtr = 0;
|
|
||||||
if( ! ebosPtr )
|
|
||||||
{
|
|
||||||
std::string progName("./ebos");
|
|
||||||
std::string deckFile("--ecl-deck-file-name=");
|
|
||||||
deckFile += 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 );
|
|
||||||
ebosPtr = new Simulator();
|
|
||||||
ebosPtr->model().applyInitialSolution();
|
|
||||||
}
|
|
||||||
ebosSimulator_ = ebosPtr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Called once before each time step.
|
/// Called once before each time step.
|
||||||
@ -891,6 +876,7 @@ namespace Opm {
|
|||||||
|
|
||||||
// --------- Data members ---------
|
// --------- Data members ---------
|
||||||
|
|
||||||
|
Simulator& ebosSimulator_;
|
||||||
const Grid& grid_;
|
const Grid& grid_;
|
||||||
const BlackoilPropsAdInterface& fluid_;
|
const BlackoilPropsAdInterface& fluid_;
|
||||||
const DerivedGeology& geo_;
|
const DerivedGeology& geo_;
|
||||||
@ -931,8 +917,6 @@ namespace Opm {
|
|||||||
double current_relaxation_;
|
double current_relaxation_;
|
||||||
V dx_old_;
|
V dx_old_;
|
||||||
|
|
||||||
Simulator* ebosSimulator_;
|
|
||||||
|
|
||||||
// --------- Protected methods ---------
|
// --------- Protected methods ---------
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -1328,7 +1312,7 @@ namespace Opm {
|
|||||||
///////
|
///////
|
||||||
for( int cellIdx = 0; cellIdx < numCells; ++cellIdx )
|
for( int cellIdx = 0; cellIdx < numCells; ++cellIdx )
|
||||||
{
|
{
|
||||||
const auto& intQuants = *(ebosSimulator_->model().cachedIntensiveQuantities(cellIdx, /*timeIdx=*/0));
|
const auto& intQuants = *(ebosSimulator_.model().cachedIntensiveQuantities(cellIdx, /*timeIdx=*/0));
|
||||||
const auto& fs = intQuants.fluidState();
|
const auto& fs = intQuants.fluidState();
|
||||||
|
|
||||||
poVal[cellIdx] = fs.pressure(FluidSystem::oilPhaseIdx).value;
|
poVal[cellIdx] = fs.pressure(FluidSystem::oilPhaseIdx).value;
|
||||||
@ -1460,15 +1444,13 @@ namespace Opm {
|
|||||||
const ReservoirState& reservoirState,
|
const ReservoirState& reservoirState,
|
||||||
SolutionState& state)
|
SolutionState& state)
|
||||||
{
|
{
|
||||||
assert( ebosSimulator_ );
|
convertInput( iterationIdx, reservoirState, ebosSimulator_ );
|
||||||
|
|
||||||
convertInput( iterationIdx, reservoirState, *ebosSimulator_ );
|
ebosSimulator_.startNextEpisode( timer.currentStepLength() );
|
||||||
|
ebosSimulator_.setEpisodeIndex( timer.reportStepNum() );
|
||||||
ebosSimulator_->startNextEpisode( timer.currentStepLength() );
|
ebosSimulator_.setTimeStepIndex( timer.reportStepNum() );
|
||||||
ebosSimulator_->setEpisodeIndex( timer.reportStepNum() );
|
ebosSimulator_.model().invalidateIntensiveQuantitiesCache(/*timeIdx=*/0);
|
||||||
ebosSimulator_->setTimeStepIndex( timer.reportStepNum() );
|
ebosSimulator_.model().newtonMethod().setIterationIndex(iterationIdx);
|
||||||
ebosSimulator_->model().invalidateIntensiveQuantitiesCache(/*timeIdx=*/0);
|
|
||||||
ebosSimulator_->model().newtonMethod().setIterationIndex(iterationIdx);
|
|
||||||
|
|
||||||
static int prevEpisodeIdx = 10000;
|
static int prevEpisodeIdx = 10000;
|
||||||
|
|
||||||
@ -1477,24 +1459,24 @@ namespace Opm {
|
|||||||
// doing the notifactions here is conceptually wrong and also causes the
|
// doing the notifactions here is conceptually wrong and also causes the
|
||||||
// endTimeStep() and endEpisode() methods to be not called for the
|
// endTimeStep() and endEpisode() methods to be not called for the
|
||||||
// simulation's last time step and episode.
|
// simulation's last time step and episode.
|
||||||
if (ebosSimulator_->model().newtonMethod().numIterations() == 0 && prevEpisodeIdx >= 0)
|
if (ebosSimulator_.model().newtonMethod().numIterations() == 0 && prevEpisodeIdx >= 0)
|
||||||
ebosSimulator_->problem().endTimeStep();
|
ebosSimulator_.problem().endTimeStep();
|
||||||
if (ebosSimulator_->episodeIndex() != prevEpisodeIdx && prevEpisodeIdx >= 0)
|
if (ebosSimulator_.episodeIndex() != prevEpisodeIdx && prevEpisodeIdx >= 0)
|
||||||
ebosSimulator_->problem().endEpisode();
|
ebosSimulator_.problem().endEpisode();
|
||||||
|
|
||||||
if (ebosSimulator_->episodeIndex() != prevEpisodeIdx)
|
if (ebosSimulator_.episodeIndex() != prevEpisodeIdx)
|
||||||
ebosSimulator_->problem().beginEpisode();
|
ebosSimulator_.problem().beginEpisode();
|
||||||
ebosSimulator_->setTimeStepSize( timer.currentStepLength() );
|
ebosSimulator_.setTimeStepSize( timer.currentStepLength() );
|
||||||
if (ebosSimulator_->model().newtonMethod().numIterations() == 0)
|
if (ebosSimulator_.model().newtonMethod().numIterations() == 0)
|
||||||
ebosSimulator_->problem().beginTimeStep();
|
ebosSimulator_.problem().beginTimeStep();
|
||||||
ebosSimulator_->problem().beginIteration();
|
ebosSimulator_.problem().beginIteration();
|
||||||
|
|
||||||
ebosSimulator_->model().linearizer().linearize();
|
ebosSimulator_.model().linearizer().linearize();
|
||||||
|
|
||||||
ebosSimulator_->problem().endIteration();
|
ebosSimulator_.problem().endIteration();
|
||||||
prevEpisodeIdx = ebosSimulator_->episodeIndex();
|
prevEpisodeIdx = ebosSimulator_.episodeIndex();
|
||||||
convertResults(*ebosSimulator_, /*sparsityPattern=*/state.saturation[0]);
|
convertResults(ebosSimulator_, /*sparsityPattern=*/state.saturation[0]);
|
||||||
updateLegacyState(*ebosSimulator_, state);
|
updateLegacyState(ebosSimulator_, state);
|
||||||
|
|
||||||
if (param_.update_equations_scaling_) {
|
if (param_.update_equations_scaling_) {
|
||||||
updateEquationsScaling();
|
updateEquationsScaling();
|
||||||
|
@ -37,6 +37,8 @@ template <class GridT>
|
|||||||
class SimulatorFullyImplicitBlackoilEbos
|
class SimulatorFullyImplicitBlackoilEbos
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
typedef typename TTAG(EclFlowProblem) TypeTag;
|
||||||
|
typedef typename GET_PROP_TYPE(TypeTag, Simulator) Simulator ;
|
||||||
typedef WellStateFullyImplicitBlackoil WellState;
|
typedef WellStateFullyImplicitBlackoil WellState;
|
||||||
typedef BlackoilState ReservoirState;
|
typedef BlackoilState ReservoirState;
|
||||||
typedef BlackoilOutputWriter OutputWriter;
|
typedef BlackoilOutputWriter OutputWriter;
|
||||||
@ -110,6 +112,18 @@ public:
|
|||||||
for (int cell = 0; cell < num_cells; ++cell) {
|
for (int cell = 0; cell < num_cells; ++cell) {
|
||||||
allcells_[cell] = cell;
|
allcells_[cell] = cell;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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();
|
||||||
|
|
||||||
#if HAVE_MPI
|
#if HAVE_MPI
|
||||||
if ( solver_.parallelInformation().type() == typeid(ParallelISTLInformation) )
|
if ( solver_.parallelInformation().type() == typeid(ParallelISTLInformation) )
|
||||||
{
|
{
|
||||||
@ -338,7 +352,8 @@ 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(model_param_,
|
auto model = std::unique_ptr<Model>(new Model(*ebosSimulator_,
|
||||||
|
model_param_,
|
||||||
grid_,
|
grid_,
|
||||||
props_,
|
props_,
|
||||||
geo_,
|
geo_,
|
||||||
@ -551,6 +566,8 @@ protected:
|
|||||||
|
|
||||||
|
|
||||||
// Data.
|
// Data.
|
||||||
|
Simulator* ebosSimulator_;
|
||||||
|
|
||||||
typedef RateConverter::
|
typedef RateConverter::
|
||||||
SurfaceToReservoirVoidage< BlackoilPropsAdInterface,
|
SurfaceToReservoirVoidage< BlackoilPropsAdInterface,
|
||||||
std::vector<int> > RateConverterType;
|
std::vector<int> > RateConverterType;
|
||||||
|
Loading…
Reference in New Issue
Block a user