/// Called once before each time step. /// \param[in] timer simulation timer void prepareStep(const SimulatorTimerInterface& timer) { // update the solution variables in ebos if ( timer.lastStepFailed() ) { ebosSimulator_.model().updateFailed(); } else { ebosSimulator_.model().advanceTimeLevel(); } // set the timestep size and episode index for ebos explicitly. ebos needs to // know the report step/episode index because of timing dependend data // despide the fact that flow uses its own time stepper. (The length of the // episode does not matter, though.) ebosSimulator_.setTime(timer.simulationTimeElapsed()); ebosSimulator_.setTimeStepSize(timer.currentStepLength()); ebosSimulator_.problem().beginTimeStep(); unsigned numDof = ebosSimulator_.model().numGridDof(); wasSwitched_.resize(numDof); std::fill(wasSwitched_.begin(), wasSwitched_.end(), false); if (param_.update_equations_scaling_) { std::cout << "equation scaling not suported yet" << std::endl; //updateEquationsScaling(); } }
void BlackoilOutputWriter:: writeTimeStepSerial(const SimulatorTimerInterface& timer, const SimulationDataContainer& state, const WellState& wellState, const data::Solution& simProps, bool substep) { // Matlab output if( matlabWriter_ ) { matlabWriter_->writeTimeStep( timer, state, wellState, substep ); } // ECL output if ( eclWriter_ ) { const auto& initConfig = eclipseState_.getInitConfig(); if (initConfig.restartRequested() && ((initConfig.getRestartStep()) == (timer.currentStepNum()))) { std::cout << "Skipping restart write in start of step " << timer.currentStepNum() << std::endl; } else { data::Solution combined_sol = simToSolution(state, phaseUsage_); // Get "normal" data (SWAT, PRESSURE, ...) combined_sol.insert(simProps.begin(), simProps.end()); // ... insert "extra" data (KR, VISC, ...) eclWriter_->writeTimeStep(timer.reportStepNum(), substep, timer.simulationTimeElapsed(), combined_sol, wellState.report(phaseUsage_)); } } // write backup file if( backupfile_.is_open() ) { int reportStep = timer.reportStepNum(); int currentTimeStep = timer.currentStepNum(); if( (reportStep == currentTimeStep || // true for SimulatorTimer currentTimeStep == 0 || // true for AdaptiveSimulatorTimer at reportStep timer.done() ) // true for AdaptiveSimulatorTimer at reportStep && lastBackupReportStep_ != reportStep ) // only backup report step once { // store report step lastBackupReportStep_ = reportStep; // write resport step number backupfile_.write( (const char *) &reportStep, sizeof(int) ); try { backupfile_ << state; const WellStateFullyImplicitBlackoil& boWellState = static_cast< const WellStateFullyImplicitBlackoil& > (wellState); backupfile_ << boWellState; } catch ( const std::bad_cast& e ) { } backupfile_ << std::flush; } } // end backup }
AdaptiveSimulatorTimer:: AdaptiveSimulatorTimer( const SimulatorTimerInterface& timer, const double lastStepTaken, const double maxTimeStep ) : start_date_time_( timer.startDateTime() ) , start_time_( timer.simulationTimeElapsed() ) , total_time_( start_time_ + timer.currentStepLength() ) , report_step_( timer.reportStepNum() ) , max_time_step_( maxTimeStep ) , current_time_( start_time_ ) , dt_( 0.0 ) , current_step_( 0 ) , steps_() { // reserve memory for sub steps steps_.reserve( 10 ); // set appropriate value for dt_ provideTimeStepEstimate( lastStepTaken ); }
void BlackoilOutputWriter:: restore(SimulatorTimerInterface& timer, BlackoilState& state, WellStateFullyImplicitBlackoil& wellState, const std::string& filename, const int desiredResportStep ) { std::ifstream restorefile( filename.c_str() ); if( restorefile ) { std::cout << "============================================================================"<<std::endl; std::cout << "Restoring from "; if( desiredResportStep < 0 ) { std::cout << "last"; } else { std::cout << desiredResportStep; } std::cout << " report step! filename = " << filename << std::endl << std::endl; int reportStep; restorefile.read( (char *) &reportStep, sizeof(int) ); const int readReportStep = (desiredResportStep < 0) ? std::numeric_limits<int>::max() : desiredResportStep; while( reportStep <= readReportStep && ! timer.done() && restorefile ) { restorefile >> state; restorefile >> wellState; // No per cell data is written for restore steps, but will be // for subsequent steps, when we have started simulating writeTimeStepWithoutCellProperties( timer, state, wellState ); // some output std::cout << "Restored step " << timer.reportStepNum() << " at day " << unit::convert::to(timer.simulationTimeElapsed(),unit::day) << std::endl; if( readReportStep == reportStep ) { break; } // if the stream is not valid anymore we just use the last state read if( ! restorefile ) { std::cerr << "Reached EOF, using last state read!" << std::endl; break; } // try to read next report step restorefile.read( (char *) &reportStep, sizeof(int) ); // if read failed, exit loop if( ! restorefile ) { break; } // next step timer.advance(); if( timer.reportStepNum() != reportStep ) { break; } } } else {