From f9d47b7c6849ba4f49efb4a4e8f5623628b03327 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5kon=20H=C3=A6gland?= Date: Thu, 25 Jun 2020 20:04:19 +0200 Subject: [PATCH 1/2] Capture some variables in FlowMainEbos. Make Opm::FlowMainEbos capture the variables argc, argv, outputCout, and outputFiles. Passing the variables to the constructor and saving them as class variables in Opm::FlowMainEbos makes the implementation of the Python interface simpler. For example, the step_init() method does not need to ask Opm::Main about the values of the variables when it needs to run execute() in FlowMainEbos. Another advantage of this refactoring could be that less variables needs to be passed around from Opm::Main, to flow_ebos_xxx.cpp, and then again to FlowMainEbos. --- flow/flow_ebos_blackoil.cpp | 9 +-- flow/flow_ebos_brine.cpp | 5 +- flow/flow_ebos_energy.cpp | 5 +- flow/flow_ebos_foam.cpp | 5 +- flow/flow_ebos_gasoil.cpp | 5 +- flow/flow_ebos_oilwater.cpp | 5 +- flow/flow_ebos_oilwater_polymer.cpp | 5 +- ...flow_ebos_oilwater_polymer_injectivity.cpp | 5 +- flow/flow_ebos_polymer.cpp | 5 +- flow/flow_ebos_solvent.cpp | 5 +- opm/simulators/flow/FlowMainEbos.hpp | 64 +++++++++++-------- opm/simulators/flow/Main.hpp | 4 +- 12 files changed, 70 insertions(+), 52 deletions(-) diff --git a/flow/flow_ebos_blackoil.cpp b/flow/flow_ebos_blackoil.cpp index ecaf2dd34..c12b18eb3 100644 --- a/flow/flow_ebos_blackoil.cpp +++ b/flow/flow_ebos_blackoil.cpp @@ -47,7 +47,7 @@ void flowEbosBlackoilSetDeck(double setupTime, Deck *deck, EclipseState& eclStat } std::unique_ptr> -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>(); + return std::make_unique>( + 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(); } } diff --git a/flow/flow_ebos_brine.cpp b/flow/flow_ebos_brine.cpp index c39379d49..5c6c0d13c 100644 --- a/flow/flow_ebos_brine.cpp +++ b/flow/flow_ebos_brine.cpp @@ -63,8 +63,9 @@ int flowEbosBrineMain(int argc, char** argv, bool outputCout, bool outputFiles) Dune::MPIHelper::instance(argc, argv).rank(); #endif - Opm::FlowMainEbos mainfunc; - return mainfunc.execute(argc, argv, outputCout, outputFiles); + Opm::FlowMainEbos + mainfunc {argc, argv, outputCout, outputFiles}; + return mainfunc.execute(); } } diff --git a/flow/flow_ebos_energy.cpp b/flow/flow_ebos_energy.cpp index 30f2506f7..5d82791ee 100644 --- a/flow/flow_ebos_energy.cpp +++ b/flow/flow_ebos_energy.cpp @@ -62,8 +62,9 @@ int flowEbosEnergyMain(int argc, char** argv, bool outputCout, bool outputFiles) Dune::MPIHelper::instance(argc, argv).rank(); #endif - Opm::FlowMainEbos mainfunc; - return mainfunc.execute(argc, argv, outputCout, outputFiles); + Opm::FlowMainEbos + mainfunc {argc, argv, outputCout, outputFiles}; + return mainfunc.execute(); } } diff --git a/flow/flow_ebos_foam.cpp b/flow/flow_ebos_foam.cpp index 973617666..be9a4da60 100644 --- a/flow/flow_ebos_foam.cpp +++ b/flow/flow_ebos_foam.cpp @@ -63,8 +63,9 @@ int flowEbosFoamMain(int argc, char** argv, bool outputCout, bool outputFiles) Dune::MPIHelper::instance(argc, argv).rank(); #endif - Opm::FlowMainEbos mainfunc; - return mainfunc.execute(argc, argv, outputCout, outputFiles); + Opm::FlowMainEbos + mainfunc {argc, argv, outputCout, outputFiles}; + return mainfunc.execute(); } } diff --git a/flow/flow_ebos_gasoil.cpp b/flow/flow_ebos_gasoil.cpp index 989f889db..c17395239 100644 --- a/flow/flow_ebos_gasoil.cpp +++ b/flow/flow_ebos_gasoil.cpp @@ -86,8 +86,9 @@ int flowEbosGasOilMain(int argc, char** argv, bool outputCout, bool outputFiles) Dune::MPIHelper::instance(argc, argv); #endif - Opm::FlowMainEbos mainfunc; - return mainfunc.execute(argc, argv, outputCout, outputFiles); + Opm::FlowMainEbos + mainfunc {argc, argv, outputCout, outputFiles} ; + return mainfunc.execute(); } } diff --git a/flow/flow_ebos_oilwater.cpp b/flow/flow_ebos_oilwater.cpp index c2d000379..d1b9a6d6c 100644 --- a/flow/flow_ebos_oilwater.cpp +++ b/flow/flow_ebos_oilwater.cpp @@ -85,8 +85,9 @@ int flowEbosOilWaterMain(int argc, char** argv, bool outputCout, bool outputFile Dune::MPIHelper::instance(argc, argv); #endif - Opm::FlowMainEbos mainfunc; - return mainfunc.execute(argc, argv, outputCout, outputFiles); + Opm::FlowMainEbos + mainfunc {argc, argv, outputCout, outputFiles}; + return mainfunc.execute(); } } diff --git a/flow/flow_ebos_oilwater_polymer.cpp b/flow/flow_ebos_oilwater_polymer.cpp index 104af11fc..251385d16 100644 --- a/flow/flow_ebos_oilwater_polymer.cpp +++ b/flow/flow_ebos_oilwater_polymer.cpp @@ -86,8 +86,9 @@ int flowEbosOilWaterPolymerMain(int argc, char** argv, bool outputCout, bool out Dune::MPIHelper::instance(argc, argv); #endif - Opm::FlowMainEbos mainfunc; - return mainfunc.execute(argc, argv, outputCout, outputFiles); + Opm::FlowMainEbos + mainfunc {argc, argv, outputCout, outputFiles}; + return mainfunc.execute(); } } diff --git a/flow/flow_ebos_oilwater_polymer_injectivity.cpp b/flow/flow_ebos_oilwater_polymer_injectivity.cpp index 04b0e0899..dc2dadb71 100644 --- a/flow/flow_ebos_oilwater_polymer_injectivity.cpp +++ b/flow/flow_ebos_oilwater_polymer_injectivity.cpp @@ -84,8 +84,9 @@ int flowEbosOilWaterPolymerInjectivityMain(int argc, char** argv, bool outputCou Dune::MPIHelper::instance(argc, argv); #endif - Opm::FlowMainEbos mainfunc; - return mainfunc.execute(argc, argv, outputCout, outputFiles); + Opm::FlowMainEbos + mainfunc {argc, argv, outputCout, outputFiles}; + return mainfunc.execute(); } } diff --git a/flow/flow_ebos_polymer.cpp b/flow/flow_ebos_polymer.cpp index f03448e77..157e75b1a 100644 --- a/flow/flow_ebos_polymer.cpp +++ b/flow/flow_ebos_polymer.cpp @@ -62,8 +62,9 @@ int flowEbosPolymerMain(int argc, char** argv, bool outputCout, bool outputFiles Dune::MPIHelper::instance(argc, argv).rank(); #endif - Opm::FlowMainEbos mainfunc; - return mainfunc.execute(argc, argv, outputCout, outputFiles); + Opm::FlowMainEbos + mainfunc {argc, argv, outputCout, outputFiles}; + return mainfunc.execute(); } } diff --git a/flow/flow_ebos_solvent.cpp b/flow/flow_ebos_solvent.cpp index 0beb3c43a..65c008fe1 100644 --- a/flow/flow_ebos_solvent.cpp +++ b/flow/flow_ebos_solvent.cpp @@ -63,8 +63,9 @@ int flowEbosSolventMain(int argc, char** argv, bool outputCout, bool outputFiles Dune::MPIHelper::instance(argc, argv).rank(); #endif - Opm::FlowMainEbos mainfunc; - return mainfunc.execute(argc, argv, outputCout, outputFiles); + Opm::FlowMainEbos + mainfunc {argc, argv, outputCout, outputFiles}; + return mainfunc.execute(); } } diff --git a/opm/simulators/flow/FlowMainEbos.hpp b/opm/simulators/flow/FlowMainEbos.hpp index b2d713873..654bffba1 100644 --- a/opm/simulators/flow/FlowMainEbos.hpp +++ b/opm/simulators/flow/FlowMainEbos.hpp @@ -79,6 +79,13 @@ namespace Opm typedef Opm::SimulatorFullyImplicitBlackoilEbos 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_(argc_, 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 (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 || !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 (!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 (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 (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 (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 (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_; std::unique_ptr simtimer_; + int argc_; + char **argv_; + bool output_cout_; + bool output_files_; }; } // namespace Opm diff --git a/opm/simulators/flow/Main.hpp b/opm/simulators/flow/Main.hpp index a295df93e..6ed97b5e2 100644 --- a/opm/simulators/flow/Main.hpp +++ b/opm/simulators/flow/Main.hpp @@ -100,8 +100,8 @@ namespace Opm { # else Dune::MPIHelper::instance(argc, argv); # endif - Opm::FlowMainEbos mainfunc; - return mainfunc.execute(argc, argv, outputCout, outputFiles); + Opm::FlowMainEbos mainfunc(argc, argv, outputCout, outputFiles); + return mainfunc.execute(); } } From c6752c1e0e58f08b619be0136ccd722f4846d3a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5kon=20H=C3=A6gland?= Date: Mon, 24 Aug 2020 08:35:04 +0200 Subject: [PATCH 2/2] Clarify by using this-> Clarify usage of member variables in FlowMainEbos.hpp by prefixing with this->. Also rebased PR on the current master, and updated flow_ebos_oilwater_brine.cpp according to the PR. --- flow/flow_ebos_oilwater_brine.cpp | 5 +++-- opm/simulators/flow/FlowMainEbos.hpp | 16 ++++++++-------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/flow/flow_ebos_oilwater_brine.cpp b/flow/flow_ebos_oilwater_brine.cpp index 6a743de3a..33f8becbb 100644 --- a/flow/flow_ebos_oilwater_brine.cpp +++ b/flow/flow_ebos_oilwater_brine.cpp @@ -85,8 +85,9 @@ int flowEbosOilWaterBrineMain(int argc, char** argv, bool outputCout, bool outpu Dune::MPIHelper::instance(argc, argv); #endif - Opm::FlowMainEbos mainfunc; - return mainfunc.execute(argc, argv, outputCout, outputFiles); + Opm::FlowMainEbos + mainfunc {argc, argv, outputCout, outputFiles}; + return mainfunc.execute(); } } diff --git a/opm/simulators/flow/FlowMainEbos.hpp b/opm/simulators/flow/FlowMainEbos.hpp index 654bffba1..713ff2dbc 100644 --- a/opm/simulators/flow/FlowMainEbos.hpp +++ b/opm/simulators/flow/FlowMainEbos.hpp @@ -354,7 +354,7 @@ namespace Opm try { // deal with some administrative boilerplate - int status = setupParameters_(argc_, argv_); + int status = setupParameters_(this->argc_, this->argv_); if (status) return status; @@ -374,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")) { @@ -425,7 +425,7 @@ namespace Opm // force closing of all log files. OpmLog::removeAllBackends(); - if (mpi_rank_ != 0 || mpi_size_ < 2 || !output_files_) { + if (mpi_rank_ != 0 || mpi_size_ < 2 || !this->output_files_) { return; } @@ -504,7 +504,7 @@ namespace Opm // OpmLog singleton. void runDiagnostics() { - if (!output_cout_) { + if (!this->output_cout_) { return; } @@ -545,7 +545,7 @@ namespace Opm // Output summary after simulation has completed 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"; @@ -582,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 @@ -595,7 +595,7 @@ 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); @@ -604,7 +604,7 @@ namespace Opm return (this->*initOrRunFunc)(); } else { - if (output_cout_) { + if (this->output_cout_) { std::cout << "\n\n================ Simulation turned off ===============\n" << std::flush; } return EXIT_SUCCESS;