mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
Merge pull request #2689 from hakonhagland/main_ebos_constr
Capture the variables argc, argv, outputCout, and outputFiles in Opm::FlowMainEbos
This commit is contained in:
commit
f9ac56b31c
@ -47,7 +47,7 @@ void flowEbosBlackoilSetDeck(double setupTime, Deck *deck, EclipseState& eclStat
|
||||
}
|
||||
|
||||
std::unique_ptr<Opm::FlowMainEbos<TTAG(EclFlowProblem)>>
|
||||
flowEbosBlackoilMainInit(int argc, char** argv)
|
||||
flowEbosBlackoilMainInit(int argc, char** argv, bool outputCout, bool outputFiles)
|
||||
{
|
||||
// we always want to use the default locale, and thus spare us the trouble
|
||||
// with incorrect locale settings.
|
||||
@ -59,14 +59,15 @@ flowEbosBlackoilMainInit(int argc, char** argv)
|
||||
Dune::MPIHelper::instance(argc, argv);
|
||||
#endif
|
||||
|
||||
return std::make_unique<Opm::FlowMainEbos<TTAG(EclFlowProblem)>>();
|
||||
return std::make_unique<Opm::FlowMainEbos<TTAG(EclFlowProblem)>>(
|
||||
argc, argv, outputCout, outputFiles);
|
||||
}
|
||||
|
||||
// ----------------- Main program -----------------
|
||||
int flowEbosBlackoilMain(int argc, char** argv, bool outputCout, bool outputFiles)
|
||||
{
|
||||
auto mainfunc = flowEbosBlackoilMainInit(argc, argv);
|
||||
return mainfunc->execute(argc, argv, outputCout, outputFiles);
|
||||
auto mainfunc = flowEbosBlackoilMainInit(argc, argv, outputCout, outputFiles);
|
||||
return mainfunc->execute();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -63,8 +63,9 @@ int flowEbosBrineMain(int argc, char** argv, bool outputCout, bool outputFiles)
|
||||
Dune::MPIHelper::instance(argc, argv).rank();
|
||||
#endif
|
||||
|
||||
Opm::FlowMainEbos<TTAG(EclFlowBrineProblem)> mainfunc;
|
||||
return mainfunc.execute(argc, argv, outputCout, outputFiles);
|
||||
Opm::FlowMainEbos<TTAG(EclFlowBrineProblem)>
|
||||
mainfunc {argc, argv, outputCout, outputFiles};
|
||||
return mainfunc.execute();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -62,8 +62,9 @@ int flowEbosEnergyMain(int argc, char** argv, bool outputCout, bool outputFiles)
|
||||
Dune::MPIHelper::instance(argc, argv).rank();
|
||||
#endif
|
||||
|
||||
Opm::FlowMainEbos<TTAG(EclFlowEnergyProblem)> mainfunc;
|
||||
return mainfunc.execute(argc, argv, outputCout, outputFiles);
|
||||
Opm::FlowMainEbos<TTAG(EclFlowEnergyProblem)>
|
||||
mainfunc {argc, argv, outputCout, outputFiles};
|
||||
return mainfunc.execute();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -63,8 +63,9 @@ int flowEbosFoamMain(int argc, char** argv, bool outputCout, bool outputFiles)
|
||||
Dune::MPIHelper::instance(argc, argv).rank();
|
||||
#endif
|
||||
|
||||
Opm::FlowMainEbos<TTAG(EclFlowFoamProblem)> mainfunc;
|
||||
return mainfunc.execute(argc, argv, outputCout, outputFiles);
|
||||
Opm::FlowMainEbos<TTAG(EclFlowFoamProblem)>
|
||||
mainfunc {argc, argv, outputCout, outputFiles};
|
||||
return mainfunc.execute();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -86,8 +86,9 @@ int flowEbosGasOilMain(int argc, char** argv, bool outputCout, bool outputFiles)
|
||||
Dune::MPIHelper::instance(argc, argv);
|
||||
#endif
|
||||
|
||||
Opm::FlowMainEbos<TTAG(EclFlowGasOilProblem)> mainfunc;
|
||||
return mainfunc.execute(argc, argv, outputCout, outputFiles);
|
||||
Opm::FlowMainEbos<TTAG(EclFlowGasOilProblem)>
|
||||
mainfunc {argc, argv, outputCout, outputFiles} ;
|
||||
return mainfunc.execute();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -85,8 +85,9 @@ int flowEbosOilWaterMain(int argc, char** argv, bool outputCout, bool outputFile
|
||||
Dune::MPIHelper::instance(argc, argv);
|
||||
#endif
|
||||
|
||||
Opm::FlowMainEbos<TTAG(EclFlowOilWaterProblem)> mainfunc;
|
||||
return mainfunc.execute(argc, argv, outputCout, outputFiles);
|
||||
Opm::FlowMainEbos<TTAG(EclFlowOilWaterProblem)>
|
||||
mainfunc {argc, argv, outputCout, outputFiles};
|
||||
return mainfunc.execute();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -85,8 +85,9 @@ int flowEbosOilWaterBrineMain(int argc, char** argv, bool outputCout, bool outpu
|
||||
Dune::MPIHelper::instance(argc, argv);
|
||||
#endif
|
||||
|
||||
Opm::FlowMainEbos<TTAG(EclFlowOilWaterBrineProblem)> mainfunc;
|
||||
return mainfunc.execute(argc, argv, outputCout, outputFiles);
|
||||
Opm::FlowMainEbos<TTAG(EclFlowOilWaterBrineProblem)>
|
||||
mainfunc {argc, argv, outputCout, outputFiles};
|
||||
return mainfunc.execute();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -86,8 +86,9 @@ int flowEbosOilWaterPolymerMain(int argc, char** argv, bool outputCout, bool out
|
||||
Dune::MPIHelper::instance(argc, argv);
|
||||
#endif
|
||||
|
||||
Opm::FlowMainEbos<TTAG(EclFlowOilWaterPolymerProblem)> mainfunc;
|
||||
return mainfunc.execute(argc, argv, outputCout, outputFiles);
|
||||
Opm::FlowMainEbos<TTAG(EclFlowOilWaterPolymerProblem)>
|
||||
mainfunc {argc, argv, outputCout, outputFiles};
|
||||
return mainfunc.execute();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -84,8 +84,9 @@ int flowEbosOilWaterPolymerInjectivityMain(int argc, char** argv, bool outputCou
|
||||
Dune::MPIHelper::instance(argc, argv);
|
||||
#endif
|
||||
|
||||
Opm::FlowMainEbos<TTAG(EclFlowOilWaterPolymerInjectivityProblem)> mainfunc;
|
||||
return mainfunc.execute(argc, argv, outputCout, outputFiles);
|
||||
Opm::FlowMainEbos<TTAG(EclFlowOilWaterPolymerInjectivityProblem)>
|
||||
mainfunc {argc, argv, outputCout, outputFiles};
|
||||
return mainfunc.execute();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -62,8 +62,9 @@ int flowEbosPolymerMain(int argc, char** argv, bool outputCout, bool outputFiles
|
||||
Dune::MPIHelper::instance(argc, argv).rank();
|
||||
#endif
|
||||
|
||||
Opm::FlowMainEbos<TTAG(EclFlowPolymerProblem)> mainfunc;
|
||||
return mainfunc.execute(argc, argv, outputCout, outputFiles);
|
||||
Opm::FlowMainEbos<TTAG(EclFlowPolymerProblem)>
|
||||
mainfunc {argc, argv, outputCout, outputFiles};
|
||||
return mainfunc.execute();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -63,8 +63,9 @@ int flowEbosSolventMain(int argc, char** argv, bool outputCout, bool outputFiles
|
||||
Dune::MPIHelper::instance(argc, argv).rank();
|
||||
#endif
|
||||
|
||||
Opm::FlowMainEbos<TTAG(EclFlowSolventProblem)> mainfunc;
|
||||
return mainfunc.execute(argc, argv, outputCout, outputFiles);
|
||||
Opm::FlowMainEbos<TTAG(EclFlowSolventProblem)>
|
||||
mainfunc {argc, argv, outputCout, outputFiles};
|
||||
return mainfunc.execute();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -79,6 +79,13 @@ namespace Opm
|
||||
|
||||
typedef Opm::SimulatorFullyImplicitBlackoilEbos<TypeTag> Simulator;
|
||||
|
||||
FlowMainEbos(int argc, char **argv, bool output_cout, bool output_files )
|
||||
: argc_{argc}, argv_{argv},
|
||||
output_cout_{output_cout}, output_files_{output_files}
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
// Read the command line parameters. Throws an exception if something goes wrong.
|
||||
static int setupParameters_(int argc, char** argv)
|
||||
{
|
||||
@ -291,10 +298,9 @@ namespace Opm
|
||||
/// This is the main function of Flow. It runs a complete simulation with the
|
||||
/// given grid and simulator classes, based on the user-specified command-line
|
||||
/// input.
|
||||
int execute(int argc, char** argv, bool output_cout, bool output_to_files)
|
||||
int execute()
|
||||
{
|
||||
return execute_(argc, argv, output_cout, output_to_files,
|
||||
&FlowMainEbos::runSimulator, /*cleanup=*/true);
|
||||
return execute_(&FlowMainEbos::runSimulator, /*cleanup=*/true);
|
||||
}
|
||||
|
||||
// Print an ASCII-art header to the PRT and DEBUG files.
|
||||
@ -343,25 +349,24 @@ namespace Opm
|
||||
}
|
||||
private:
|
||||
// called by execute() or executeInitStep()
|
||||
int execute_(int argc, char** argv, bool output_cout, bool output_to_files,
|
||||
int (FlowMainEbos::* runOrInitFunc)(bool), bool cleanup)
|
||||
int execute_(int (FlowMainEbos::* runOrInitFunc)(), bool cleanup)
|
||||
{
|
||||
try {
|
||||
// deal with some administrative boilerplate
|
||||
|
||||
int status = setupParameters_(argc, argv);
|
||||
int status = setupParameters_(this->argc_, this->argv_);
|
||||
if (status)
|
||||
return status;
|
||||
|
||||
setupParallelism();
|
||||
setupEbosSimulator();
|
||||
runDiagnostics(output_cout);
|
||||
runDiagnostics();
|
||||
createSimulator();
|
||||
|
||||
// if run, do the actual work, else just initialize
|
||||
int exitCode = (this->*runOrInitFunc)(output_cout);
|
||||
int exitCode = (this->*runOrInitFunc)();
|
||||
if (cleanup) {
|
||||
executeCleanup_(output_to_files);
|
||||
executeCleanup_();
|
||||
}
|
||||
return exitCode;
|
||||
}
|
||||
@ -369,7 +374,7 @@ namespace Opm
|
||||
std::ostringstream message;
|
||||
message << "Program threw an exception: " << e.what();
|
||||
|
||||
if (output_cout) {
|
||||
if (this->output_cout_) {
|
||||
// in some cases exceptions are thrown before the logging system is set
|
||||
// up.
|
||||
if (OpmLog::hasBackend("STREAMLOG")) {
|
||||
@ -384,9 +389,9 @@ namespace Opm
|
||||
}
|
||||
}
|
||||
|
||||
void executeCleanup_(bool output_to_files) {
|
||||
void executeCleanup_() {
|
||||
// clean up
|
||||
mergeParallelLogFiles(output_to_files);
|
||||
mergeParallelLogFiles();
|
||||
}
|
||||
|
||||
protected:
|
||||
@ -415,12 +420,12 @@ namespace Opm
|
||||
|
||||
|
||||
|
||||
void mergeParallelLogFiles(bool output_to_files)
|
||||
void mergeParallelLogFiles()
|
||||
{
|
||||
// force closing of all log files.
|
||||
OpmLog::removeAllBackends();
|
||||
|
||||
if (mpi_rank_ != 0 || mpi_size_ < 2 || !output_to_files) {
|
||||
if (mpi_rank_ != 0 || mpi_size_ < 2 || !this->output_files_) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -497,9 +502,9 @@ namespace Opm
|
||||
// Run diagnostics.
|
||||
// Writes to:
|
||||
// OpmLog singleton.
|
||||
void runDiagnostics(bool output_cout)
|
||||
void runDiagnostics()
|
||||
{
|
||||
if (!output_cout) {
|
||||
if (!this->output_cout_) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -523,24 +528,24 @@ namespace Opm
|
||||
}
|
||||
|
||||
// Run the simulator.
|
||||
int runSimulator(bool output_cout)
|
||||
int runSimulator()
|
||||
{
|
||||
return runSimulatorInitOrRun_(output_cout, &FlowMainEbos::runSimulatorRunCallback_);
|
||||
return runSimulatorInitOrRun_(&FlowMainEbos::runSimulatorRunCallback_);
|
||||
}
|
||||
|
||||
private:
|
||||
// Callback that will be called from runSimulatorInitOrRun_().
|
||||
int runSimulatorRunCallback_(bool output_cout)
|
||||
int runSimulatorRunCallback_()
|
||||
{
|
||||
SimulatorReport report = simulator_->run(*simtimer_);
|
||||
runSimulatorAfterSim_(output_cout, report);
|
||||
runSimulatorAfterSim_(report);
|
||||
return report.success.exit_status;
|
||||
}
|
||||
|
||||
// Output summary after simulation has completed
|
||||
void runSimulatorAfterSim_(bool output_cout, SimulatorReport &report)
|
||||
void runSimulatorAfterSim_(SimulatorReport &report)
|
||||
{
|
||||
if (output_cout) {
|
||||
if (this->output_cout_) {
|
||||
std::ostringstream ss;
|
||||
ss << "\n\n================ End of simulation ===============\n\n";
|
||||
ss << "Number of MPI processes: " << std::setw(6) << mpi_size_ << "\n";
|
||||
@ -565,8 +570,7 @@ namespace Opm
|
||||
}
|
||||
|
||||
// Run the simulator.
|
||||
int runSimulatorInitOrRun_(
|
||||
bool output_cout, int (FlowMainEbos::* initOrRunFunc)(bool))
|
||||
int runSimulatorInitOrRun_(int (FlowMainEbos::* initOrRunFunc)())
|
||||
{
|
||||
|
||||
const auto& schedule = this->schedule();
|
||||
@ -578,7 +582,7 @@ namespace Opm
|
||||
const auto& initConfig = eclState().getInitConfig();
|
||||
simtimer_->init(timeMap, (size_t)initConfig.getRestartStep());
|
||||
|
||||
if (output_cout) {
|
||||
if (this->output_cout_) {
|
||||
std::ostringstream oss;
|
||||
|
||||
// This allows a user to catch typos and misunderstandings in the
|
||||
@ -591,16 +595,16 @@ namespace Opm
|
||||
}
|
||||
|
||||
if (!ioConfig.initOnly()) {
|
||||
if (output_cout) {
|
||||
if (this->output_cout_) {
|
||||
std::string msg;
|
||||
msg = "\n\n================ Starting main simulation loop ===============\n";
|
||||
OpmLog::info(msg);
|
||||
}
|
||||
|
||||
return (this->*initOrRunFunc)(output_cout);
|
||||
return (this->*initOrRunFunc)();
|
||||
}
|
||||
else {
|
||||
if (output_cout) {
|
||||
if (this->output_cout_) {
|
||||
std::cout << "\n\n================ Simulation turned off ===============\n" << std::flush;
|
||||
}
|
||||
return EXIT_SUCCESS;
|
||||
@ -637,6 +641,10 @@ namespace Opm
|
||||
std::any parallel_information_;
|
||||
std::unique_ptr<Simulator> simulator_;
|
||||
std::unique_ptr<SimulatorTimer> simtimer_;
|
||||
int argc_;
|
||||
char **argv_;
|
||||
bool output_cout_;
|
||||
bool output_files_;
|
||||
};
|
||||
} // namespace Opm
|
||||
|
||||
|
@ -100,8 +100,8 @@ namespace Opm {
|
||||
# else
|
||||
Dune::MPIHelper::instance(argc, argv);
|
||||
# endif
|
||||
Opm::FlowMainEbos<TypeTag> mainfunc;
|
||||
return mainfunc.execute(argc, argv, outputCout, outputFiles);
|
||||
Opm::FlowMainEbos<TypeTag> mainfunc(argc, argv, outputCout, outputFiles);
|
||||
return mainfunc.execute();
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user