From 77f103fca54cb86c334e2da904614d7cc55c8eb5 Mon Sep 17 00:00:00 2001 From: Andreas Lauser Date: Mon, 8 Aug 2016 14:31:32 +0200 Subject: [PATCH] instantiate the ebos Simulator object in SimulatorFullyImplicitBlackoilEbos this gets rid of some ugly hacks with static variables... --- opm/autodiff/BlackoilModelEbos.hpp | 72 +++++++------------ .../SimulatorFullyImplicitBlackoilEbos.hpp | 19 ++++- 2 files changed, 45 insertions(+), 46 deletions(-) diff --git a/opm/autodiff/BlackoilModelEbos.hpp b/opm/autodiff/BlackoilModelEbos.hpp index be4a928cf..f2522c58e 100644 --- a/opm/autodiff/BlackoilModelEbos.hpp +++ b/opm/autodiff/BlackoilModelEbos.hpp @@ -138,7 +138,8 @@ namespace Opm { /// \param[in] has_disgas turn on dissolved gas /// \param[in] has_vapoil turn on vaporized oil feature /// \param[in] terminal_output request output to cout/cerr - BlackoilModelEbos(const ModelParameters& param, + BlackoilModelEbos(Simulator& ebosSimulator, + const ModelParameters& param, const Grid& grid , const BlackoilPropsAdInterface& fluid, const DerivedGeology& geo , @@ -149,7 +150,8 @@ namespace Opm { const bool has_disgas, const bool has_vapoil, const bool terminal_output) - : grid_ (grid) + : ebosSimulator_(ebosSimulator) + , grid_ (grid) , fluid_ (fluid) , geo_ (geo) , rock_comp_props_(rock_comp_props) @@ -178,7 +180,6 @@ namespace Opm { false } ) , terminal_output_ (terminal_output) , current_relaxation_(1.0) - , ebosSimulator_( 0 ) { const double gravity = detail::getGravity(geo_.gravity(), UgGridHelpers::dimensions(grid_)); const V depth = Opm::AutoDiffGrid::cellCentroidsZToEigen(grid_); @@ -187,22 +188,6 @@ namespace Opm { wellModel().setWellsActive( localWellsActive() ); 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. @@ -891,6 +876,7 @@ namespace Opm { // --------- Data members --------- + Simulator& ebosSimulator_; const Grid& grid_; const BlackoilPropsAdInterface& fluid_; const DerivedGeology& geo_; @@ -931,8 +917,6 @@ namespace Opm { double current_relaxation_; V dx_old_; - Simulator* ebosSimulator_; - // --------- Protected methods --------- public: @@ -1328,7 +1312,7 @@ namespace Opm { /////// 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(); poVal[cellIdx] = fs.pressure(FluidSystem::oilPhaseIdx).value; @@ -1460,15 +1444,13 @@ namespace Opm { const ReservoirState& reservoirState, SolutionState& state) { - assert( ebosSimulator_ ); + convertInput( iterationIdx, reservoirState, ebosSimulator_ ); - convertInput( iterationIdx, reservoirState, *ebosSimulator_ ); - - ebosSimulator_->startNextEpisode( timer.currentStepLength() ); - ebosSimulator_->setEpisodeIndex( timer.reportStepNum() ); - ebosSimulator_->setTimeStepIndex( timer.reportStepNum() ); - ebosSimulator_->model().invalidateIntensiveQuantitiesCache(/*timeIdx=*/0); - ebosSimulator_->model().newtonMethod().setIterationIndex(iterationIdx); + ebosSimulator_.startNextEpisode( timer.currentStepLength() ); + ebosSimulator_.setEpisodeIndex( timer.reportStepNum() ); + ebosSimulator_.setTimeStepIndex( timer.reportStepNum() ); + ebosSimulator_.model().invalidateIntensiveQuantitiesCache(/*timeIdx=*/0); + ebosSimulator_.model().newtonMethod().setIterationIndex(iterationIdx); static int prevEpisodeIdx = 10000; @@ -1477,24 +1459,24 @@ namespace Opm { // doing the notifactions here is conceptually wrong and also causes the // endTimeStep() and endEpisode() methods to be not called for the // simulation's last time step and episode. - if (ebosSimulator_->model().newtonMethod().numIterations() == 0 && prevEpisodeIdx >= 0) - ebosSimulator_->problem().endTimeStep(); - if (ebosSimulator_->episodeIndex() != prevEpisodeIdx && prevEpisodeIdx >= 0) - ebosSimulator_->problem().endEpisode(); + if (ebosSimulator_.model().newtonMethod().numIterations() == 0 && prevEpisodeIdx >= 0) + ebosSimulator_.problem().endTimeStep(); + if (ebosSimulator_.episodeIndex() != prevEpisodeIdx && prevEpisodeIdx >= 0) + ebosSimulator_.problem().endEpisode(); - if (ebosSimulator_->episodeIndex() != prevEpisodeIdx) - ebosSimulator_->problem().beginEpisode(); - ebosSimulator_->setTimeStepSize( timer.currentStepLength() ); - if (ebosSimulator_->model().newtonMethod().numIterations() == 0) - ebosSimulator_->problem().beginTimeStep(); - ebosSimulator_->problem().beginIteration(); + if (ebosSimulator_.episodeIndex() != prevEpisodeIdx) + ebosSimulator_.problem().beginEpisode(); + ebosSimulator_.setTimeStepSize( timer.currentStepLength() ); + if (ebosSimulator_.model().newtonMethod().numIterations() == 0) + ebosSimulator_.problem().beginTimeStep(); + ebosSimulator_.problem().beginIteration(); - ebosSimulator_->model().linearizer().linearize(); + ebosSimulator_.model().linearizer().linearize(); - ebosSimulator_->problem().endIteration(); - prevEpisodeIdx = ebosSimulator_->episodeIndex(); - convertResults(*ebosSimulator_, /*sparsityPattern=*/state.saturation[0]); - updateLegacyState(*ebosSimulator_, state); + ebosSimulator_.problem().endIteration(); + prevEpisodeIdx = ebosSimulator_.episodeIndex(); + convertResults(ebosSimulator_, /*sparsityPattern=*/state.saturation[0]); + updateLegacyState(ebosSimulator_, state); if (param_.update_equations_scaling_) { updateEquationsScaling(); diff --git a/opm/autodiff/SimulatorFullyImplicitBlackoilEbos.hpp b/opm/autodiff/SimulatorFullyImplicitBlackoilEbos.hpp index 956328a75..caf24c6be 100644 --- a/opm/autodiff/SimulatorFullyImplicitBlackoilEbos.hpp +++ b/opm/autodiff/SimulatorFullyImplicitBlackoilEbos.hpp @@ -37,6 +37,8 @@ template class SimulatorFullyImplicitBlackoilEbos { public: + typedef typename TTAG(EclFlowProblem) TypeTag; + typedef typename GET_PROP_TYPE(TypeTag, Simulator) Simulator ; typedef WellStateFullyImplicitBlackoil WellState; typedef BlackoilState ReservoirState; typedef BlackoilOutputWriter OutputWriter; @@ -110,6 +112,18 @@ public: for (int cell = 0; cell < num_cells; ++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 ( solver_.parallelInformation().type() == typeid(ParallelISTLInformation) ) { @@ -338,7 +352,8 @@ protected: std::unique_ptr createSolver(const WellModel& well_model) { - auto model = std::unique_ptr(new Model(model_param_, + auto model = std::unique_ptr(new Model(*ebosSimulator_, + model_param_, grid_, props_, geo_, @@ -551,6 +566,8 @@ protected: // Data. + Simulator* ebosSimulator_; + typedef RateConverter:: SurfaceToReservoirVoidage< BlackoilPropsAdInterface, std::vector > RateConverterType;