88 static int setupParameters_(
int argc,
char**
argv, Parallel::Communication comm)
90 if (!Parameters::IsRegistrationOpen()) {
101 Parameters::Register<Parameters::OutputInterval>
102 (
"Specify the number of report steps between two consecutive writes of restart data");
103 Parameters::Register<Parameters::EnableLoggingFalloutWarning>
104 (
"Developer option to see whether logging was on non-root processors. "
105 "In that case it will be appended to the *.DBG or *.PRT files");
110 Simulator::registerParameters();
112 detail::hideUnusedParameters<Scalar>();
114 Parameters::endRegistration();
116 int mpiRank = comm.rank();
120 const_cast<const char**
>(
argv),
138 std::string
msg =
"Aborting simulation due to unknown "
139 "parameters. Please query \"flow --help\" for "
140 "supported command line parameters.";
141 if (OpmLog::hasBackend(
"STREAMLOG"))
146 std::cerr <<
msg << std::endl;
153 if (Parameters::Get<Parameters::PrintParameters>() == 1) {
155 Parameters::printValues(std::cout);
172 return execute_(&FlowMain::runSimulator,
true);
175 int executeInitStep()
177 return execute_(&FlowMain::runSimulatorInit,
false);
184 return simulator_->runStep(*simtimer_);
189 int executeStepsCleanup()
191 SimulatorReport report = simulator_->finalize();
192 runSimulatorAfterSim_(report);
193 return report.success.exit_status;
196 ModelSimulator* getSimulatorPtr()
198 return modelSimulator_.get();
201 SimulatorTimer* getSimTimer()
203 return simtimer_.get();
209 return simtimer_->stepLengthTaken();
217 std::ostringstream message;
220 if (this->output_cout_) {
223 if (OpmLog::hasBackend(
"STREAMLOG")) {
224 OpmLog::error(message.str());
227 std::cout << message.str() <<
"\n";
230 detail::checkAllMPIProcesses();
246 setupModelSimulator();
249 this->deck_read_time_ = modelSimulator_->vanguard().setupTime();
264 catch (
const std::exception&
e) {
265 auto exitCode =
logger(
e,
"Simulation aborted as program threw an unexpected exception: ");
271 void executeCleanup_() {
273 mergeParallelLogFiles();
277 void setupParallelism()
283 mpi_rank_ = comm.rank();
284 mpi_size_ = comm.size();
289 static void setMaxThreads()
297 const bool isSet = Parameters::IsSet<Parameters::ThreadsPerProcess>();
309 OpmLog::warning(
"Environment variable OMP_NUM_THREADS takes precedence over the --threads-per-process cmdline argument.");
312 OpmLog::warning(
"Invalid value for OMP_NUM_THREADS environment variable.");
327 void mergeParallelLogFiles()
330 OpmLog::removeAllBackends();
337 Parameters::Get<Parameters::EclDeckFileName>(),
338 Parameters::Get<Parameters::EnableLoggingFalloutWarning>());
341 void setupModelSimulator()
344 modelSimulator_->executionTimer().start();
345 modelSimulator_->model().applyInitialSolution();
348 const EclipseState& eclState()
const
349 {
return modelSimulator_->vanguard().eclState(); }
351 EclipseState& eclState()
352 {
return modelSimulator_->vanguard().eclState(); }
355 {
return modelSimulator_->vanguard().schedule(); }
360 return runSimulatorInitOrRun_(&FlowMain::runSimulatorRunCallback_);
363 int runSimulatorInit()
365 return runSimulatorInitOrRun_(&FlowMain::runSimulatorInitCallback_);
370 int runSimulatorRunCallback_()
372#ifdef RESERVOIR_COUPLING_ENABLED
373 SimulatorReport report = simulator_->run(*simtimer_, this->argc_, this->argv_);
375 SimulatorReport report = simulator_->run(*simtimer_);
377 runSimulatorAfterSim_(report);
378 return report.success.exit_status;
382 int runSimulatorInitCallback_()
384#ifdef RESERVOIR_COUPLING_ENABLED
385 simulator_->init(*simtimer_, this->argc_, this->argv_);
387 simulator_->init(*simtimer_);
393 void runSimulatorAfterSim_(SimulatorReport &report)
395 if (simulator_->model().hasNlddSolver()) {
396 const auto&
odir = eclState().getIOConfig().getOutputDir();
398 simulator_->model().writeNonlinearIterationsPerCell(
odir);
401 simulator_->model().localAccumulatedReports(),
406 if (! this->output_cout_) {
411#if !defined(_OPENMP) || !_OPENMP
417 printFlowTrailer(mpi_size_,
threads, total_setup_time_, deck_read_time_, report);
419 detail::handleExtraConvergenceOutput(report,
420 Parameters::Get<Parameters::OutputExtraConvergenceInfo>(),
421 R
"(OutputExtraConvergenceInfo (--output-extra-convergence-info))",
427 int runSimulatorInitOrRun_(
int (FlowMain::*
initOrRunFunc)())
430 const auto& schedule = this->schedule();
431 auto&
ioConfig = eclState().getIOConfig();
432 simtimer_ = std::make_unique<SimulatorTimer>();
435 const auto&
initConfig = eclState().getInitConfig();
436 simtimer_->init(schedule,
static_cast<std::size_t
>(
initConfig.getRestartStep()));
438 if (this->output_cout_) {
439 std::ostringstream
oss;
443 if (Parameters::printUnused(
oss)) {
444 std::cout <<
"----------------- Unrecognized parameters: -----------------\n";
445 std::cout <<
oss.str();
446 std::cout <<
"----------------------------------------------------------------" << std::endl;
451 if (this->output_cout_) {
453 msg =
"\n\n================ Starting main simulation loop ===============\n";
460 if (this->output_cout_) {
461 std::cout <<
"\n\n================ Simulation turned off ===============\n" << std::flush;
476 simulator_ = std::make_unique<Simulator>(*modelSimulator_);
480 {
return modelSimulator_->vanguard().grid(); }
483 std::unique_ptr<ModelSimulator> modelSimulator_;
486 std::any parallel_information_;
487 std::unique_ptr<Simulator> simulator_;
488 std::unique_ptr<SimulatorTimer> simtimer_;
493 double total_setup_time_ = 0.0;
494 double deck_read_time_ = 0.0;
Definition FlowMain.hpp:68
double getPreviousReportStepSize()
Get the size of the previous report step.
Definition FlowMain.hpp:207
int execute()
This is the main function of Flow.
Definition FlowMain.hpp:170
void createSimulator()
This is the main function of Flow.
Definition FlowMain.hpp:473