diff --git a/opm/autodiff/ParallelDebugOutput.hpp b/opm/autodiff/ParallelDebugOutput.hpp index 0af81939b..1f1f9d504 100644 --- a/opm/autodiff/ParallelDebugOutput.hpp +++ b/opm/autodiff/ParallelDebugOutput.hpp @@ -45,10 +45,12 @@ namespace Opm public: virtual ~ParallelDebugOutputInterface() {} - // gather solution to rank 0 for EclipseWriter + //! \brief gather solution to rank 0 for EclipseWriter + //! \param localWellState The well state + //! \param wellStateStepNumber The step number of the well state. virtual bool collectToIORank( const SimulationDataContainer& localReservoirState, const WellState& localWellState, - const int reportStep ) = 0; + const int wellStateStepNumber ) = 0; virtual const SimulationDataContainer& globalReservoirState() const = 0 ; virtual const WellState& globalWellState() const = 0 ; @@ -77,7 +79,7 @@ namespace Opm // gather solution to rank 0 for EclipseWriter virtual bool collectToIORank( const SimulationDataContainer& localReservoirState, const WellState& localWellState, - const int /* reportStep */) + const int /* wellStateStepNumber */) { globalState_ = &localReservoirState; wellState_ = &localWellState; @@ -521,7 +523,7 @@ namespace Opm // gather solution to rank 0 for EclipseWriter bool collectToIORank( const SimulationDataContainer& localReservoirState, const WellState& localWellState, - const int reportStep ) + const int wellStateStepNumber ) { if( isIORank() ) { @@ -532,7 +534,7 @@ namespace Opm const DynamicListEconLimited dynamic_list_econ_limited; // Create wells and well state. WellsManager wells_manager(eclipseState_, - reportStep, + wellStateStepNumber, Opm::UgGridHelpers::numCells( globalGrid ), Opm::UgGridHelpers::globalCell( globalGrid ), Opm::UgGridHelpers::cartDims( globalGrid ), diff --git a/opm/autodiff/SimulatorFullyImplicitBlackoilOutput.cpp b/opm/autodiff/SimulatorFullyImplicitBlackoilOutput.cpp index 02e5a17e7..f999bfd6e 100644 --- a/opm/autodiff/SimulatorFullyImplicitBlackoilOutput.cpp +++ b/opm/autodiff/SimulatorFullyImplicitBlackoilOutput.cpp @@ -295,8 +295,15 @@ namespace Opm bool isIORank = output_ ; if( parallelOutput_ && parallelOutput_->isParallel() ) { + // If this is not the initial write and no substep, then the well + // state used in the computation is actually the one of the last + // step. We need that well state for the gathering. Otherwise + // It an exception with a message like "global state does not + // contain well ..." might be thrown. + int wellStateStepNumber = ( ! substep && timer.reportStepNum() > 0) ? + (timer.reportStepNum() - 1) : timer.reportStepNum(); // collect all solutions to I/O rank - isIORank = parallelOutput_->collectToIORank( localState, localWellState, timer.reportStepNum() ); + isIORank = parallelOutput_->collectToIORank( localState, localWellState, wellStateStepNumber ); } const SimulationDataContainer& state = (parallelOutput_ && parallelOutput_->isParallel() ) ? parallelOutput_->globalReservoirState() : localState; @@ -361,7 +368,7 @@ namespace Opm */ - eclWriter_->writeTimeStep(timer.currentStepNum(), + eclWriter_->writeTimeStep(timer.reportStepNum(), substep, timer.simulationTimeElapsed(), simToSolution( state, phaseUsage_ ),