87 static int setupParameters_(
int argc,
char**
argv, Parallel::Communication comm)
89 if (!Parameters::IsRegistrationOpen()) {
100 Parameters::Register<Parameters::OutputInterval>
101 (
"Specify the number of report steps between two consecutive writes of restart data");
102 Parameters::Register<Parameters::EnableLoggingFalloutWarning>
103 (
"Developer option to see whether logging was on non-root processors. "
104 "In that case it will be appended to the *.DBG or *.PRT files");
109 Simulator::registerParameters();
111 detail::hideUnusedParameters<Scalar>();
113 Parameters::endRegistration();
115 int mpiRank = comm.rank();
119 const_cast<const char**
>(
argv),
137 std::string
msg =
"Aborting simulation due to unknown "
138 "parameters. Please query \"flow --help\" for "
139 "supported command line parameters.";
140 if (OpmLog::hasBackend(
"STREAMLOG"))
145 std::cerr <<
msg << std::endl;
152 if (Parameters::Get<Parameters::PrintParameters>() == 1) {
154 Parameters::printValues(std::cout);
171 return execute_(&FlowMain::runSimulator,
true);
174 int executeInitStep()
176 return execute_(&FlowMain::runSimulatorInit,
false);
183 return simulator_->runStep(*simtimer_);
188 int executeStepsCleanup()
190 SimulatorReport report = simulator_->finalize();
191 runSimulatorAfterSim_(report);
192 return report.success.exit_status;
195 ModelSimulator* getSimulatorPtr()
197 return modelSimulator_.get();
200 SimulatorTimer* getSimTimer()
202 return simtimer_.get();
208 return simtimer_->stepLengthTaken();
216 std::ostringstream message;
219 if (this->output_cout_) {
222 if (OpmLog::hasBackend(
"STREAMLOG")) {
223 OpmLog::error(message.str());
226 std::cout << message.str() <<
"\n";
229 detail::checkAllMPIProcesses();
245 setupModelSimulator();
248 this->deck_read_time_ = modelSimulator_->vanguard().setupTime();
263 catch (
const std::exception&
e) {
264 auto exitCode =
logger(
e,
"Simulation aborted as program threw an unexpected exception: ");
270 void executeCleanup_() {
272 mergeParallelLogFiles();
276 void setupParallelism()
282 mpi_rank_ = comm.rank();
283 mpi_size_ = comm.size();
288 static void setMaxThreads()
296 const bool isSet = Parameters::IsSet<Parameters::ThreadsPerProcess>();
308 OpmLog::warning(
"Environment variable OMP_NUM_THREADS takes precedence over the --threads-per-process cmdline argument.");
311 OpmLog::warning(
"Invalid value for OMP_NUM_THREADS environment variable.");
326 void mergeParallelLogFiles()
329 OpmLog::removeAllBackends();
336 Parameters::Get<Parameters::EclDeckFileName>(),
337 Parameters::Get<Parameters::EnableLoggingFalloutWarning>());
340 void setupModelSimulator()
343 modelSimulator_->executionTimer().start();
344 modelSimulator_->model().applyInitialSolution();
347 const EclipseState& eclState()
const
348 {
return modelSimulator_->vanguard().eclState(); }
350 EclipseState& eclState()
351 {
return modelSimulator_->vanguard().eclState(); }
354 {
return modelSimulator_->vanguard().schedule(); }
359 return runSimulatorInitOrRun_(&FlowMain::runSimulatorRunCallback_);
362 int runSimulatorInit()
364 return runSimulatorInitOrRun_(&FlowMain::runSimulatorInitCallback_);
369 int runSimulatorRunCallback_()
371#ifdef RESERVOIR_COUPLING_ENABLED
372 SimulatorReport report = simulator_->run(*simtimer_, this->argc_, this->argv_);
374 SimulatorReport report = simulator_->run(*simtimer_);
376 runSimulatorAfterSim_(report);
377 return report.success.exit_status;
381 int runSimulatorInitCallback_()
383#ifdef RESERVOIR_COUPLING_ENABLED
384 simulator_->init(*simtimer_, this->argc_, this->argv_);
386 simulator_->init(*simtimer_);
392 void runSimulatorAfterSim_(SimulatorReport &report)
394 if (! this->output_cout_) {
399#if !defined(_OPENMP) || !_OPENMP
405 printFlowTrailer(mpi_size_,
threads, total_setup_time_, deck_read_time_, report, simulator_->model().localAccumulatedReports());
407 detail::handleExtraConvergenceOutput(report,
408 Parameters::Get<Parameters::OutputExtraConvergenceInfo>(),
409 R
"(OutputExtraConvergenceInfo (--output-extra-convergence-info))",
415 int runSimulatorInitOrRun_(
int (FlowMain::*
initOrRunFunc)())
418 const auto& schedule = this->schedule();
419 auto&
ioConfig = eclState().getIOConfig();
420 simtimer_ = std::make_unique<SimulatorTimer>();
423 const auto&
initConfig = eclState().getInitConfig();
424 simtimer_->init(schedule,
static_cast<std::size_t
>(
initConfig.getRestartStep()));
426 if (this->output_cout_) {
427 std::ostringstream
oss;
431 if (Parameters::printUnused(
oss)) {
432 std::cout <<
"----------------- Unrecognized parameters: -----------------\n";
433 std::cout <<
oss.str();
434 std::cout <<
"----------------------------------------------------------------" << std::endl;
439 if (this->output_cout_) {
441 msg =
"\n\n================ Starting main simulation loop ===============\n";
448 if (this->output_cout_) {
449 std::cout <<
"\n\n================ Simulation turned off ===============\n" << std::flush;
464 simulator_ = std::make_unique<Simulator>(*modelSimulator_);
468 {
return modelSimulator_->vanguard().grid(); }
471 std::unique_ptr<ModelSimulator> modelSimulator_;
474 std::any parallel_information_;
475 std::unique_ptr<Simulator> simulator_;
476 std::unique_ptr<SimulatorTimer> simtimer_;
481 double total_setup_time_ = 0.0;
482 double deck_read_time_ = 0.0;
Definition FlowMain.hpp:67
double getPreviousReportStepSize()
Get the size of the previous report step.
Definition FlowMain.hpp:206
int execute()
This is the main function of Flow.
Definition FlowMain.hpp:169
void createSimulator()
This is the main function of Flow.
Definition FlowMain.hpp:461