diff --git a/opm/simulators/flow/Main.hpp b/opm/simulators/flow/Main.hpp index 014886c6b..f32906e52 100644 --- a/opm/simulators/flow/Main.hpp +++ b/opm/simulators/flow/Main.hpp @@ -174,26 +174,6 @@ public: return exitCode; } - using FlowMainType = FlowMain; - // To be called from the Python interface code. Only do the - // initialization and then return a pointer to the FlowMain - // object that can later be accessed directly from the Python interface - // to e.g. advance the simulator one report step - std::unique_ptr initFlowBlackoil(int& exitCode) - { - exitCode = EXIT_SUCCESS; - if (initialize_(exitCode)) { - // TODO: check that this deck really represents a blackoil - // case. E.g. check that number of phases == 3 - this->setupVanguard(); - return flowBlackoilTpfaMainInit( - argc_, argv_, outputCout_, outputFiles_); - } else { - //NOTE: exitCode was set by initialize_() above; - return std::unique_ptr(); // nullptr - } - } - //! \brief Used for test_outputdir. int justInitialize() { @@ -289,6 +269,7 @@ private: return flowMain(argc_, argv_, outputCout_, outputFiles_); } +protected: /// \brief Initialize /// \param exitCode The exitCode of the program. /// @@ -447,6 +428,9 @@ private: return true; } + void setupVanguard(); + +private: // This function is an extreme special case, if the program has been invoked // *exactly* as: // @@ -705,8 +689,6 @@ private: std::string_view moduleVersion, std::string_view compileTimestamp); - void setupVanguard(); - static int getNumThreads() { @@ -751,11 +733,14 @@ private: void setupDamaris(const std::string& outputDir); #endif +protected: int argc_{0}; char** argv_{nullptr}; - bool ownMPI_{true}; //!< True if we "own" MPI and should init / finalize bool outputCout_{false}; bool outputFiles_{false}; + +private: + bool ownMPI_{true}; //!< True if we "own" MPI and should init / finalize double setupTime_{0.0}; std::string deckFilename_{}; std::string flowProgName_{}; diff --git a/opm/simulators/flow/python/PyBlackOilSimulator.hpp b/opm/simulators/flow/python/PyBlackOilSimulator.hpp index 47db13716..c5c60e3b3 100644 --- a/opm/simulators/flow/python/PyBlackOilSimulator.hpp +++ b/opm/simulators/flow/python/PyBlackOilSimulator.hpp @@ -20,7 +20,7 @@ #ifndef OPM_PY_BLACKOIL_SIMULATOR_HEADER_INCLUDED #define OPM_PY_BLACKOIL_SIMULATOR_HEADER_INCLUDED -#include +#include #include #include #include @@ -82,7 +82,7 @@ private: // This *must* be declared before other pointers // to simulator objects. This in order to deinitialize // MPI at the correct time (ie after the other objects). - std::unique_ptr main_; + std::unique_ptr main_; std::unique_ptr> flow_main_; Simulator* simulator_; diff --git a/python/simulators/PyBlackOilSimulator.cpp b/python/simulators/PyBlackOilSimulator.cpp index b5259776f..8428fe14a 100644 --- a/python/simulators/PyBlackOilSimulator.cpp +++ b/python/simulators/PyBlackOilSimulator.cpp @@ -22,7 +22,6 @@ #include #include #include -#include #include //#include #include @@ -216,7 +215,7 @@ int PyBlackOilSimulator::stepInit() } } if (this->deck_) { - this->main_ = std::make_unique( + this->main_ = std::make_unique( this->deck_->getDataFile(), this->eclipse_state_, this->schedule_, @@ -226,7 +225,7 @@ int PyBlackOilSimulator::stepInit() ); } else { - this->main_ = std::make_unique( + this->main_ = std::make_unique( this->deck_filename_, this->mpi_init_, this->mpi_finalize_ diff --git a/python/simulators/PyMain.hpp b/python/simulators/PyMain.hpp new file mode 100644 index 000000000..fdf547515 --- /dev/null +++ b/python/simulators/PyMain.hpp @@ -0,0 +1,60 @@ +/* + Copyright 2013, 2014, 2015 SINTEF ICT, Applied Mathematics. + Copyright 2014 Dr. Blatt - HPC-Simulation-Software & Services + Copyright 2015 IRIS AS + Copyright 2014 STATOIL ASA. + Copyright 2023 Inria + + This file is part of the Open Porous Media project (OPM). + + OPM is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OPM is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with OPM. If not, see . +*/ +#ifndef OPM_PYMAIN_HEADER_INCLUDED +#define OPM_PYMAIN_HEADER_INCLUDED + +#include + +namespace Opm { + +// ----------------- Python Main class ----------------- +// Adds a python-only initialization method +class PyMain : public Main +{ +public: + using Main::Main; + + using FlowMainType = FlowMain; + // To be called from the Python interface code. Only do the + // initialization and then return a pointer to the FlowMain + // object that can later be accessed directly from the Python interface + // to e.g. advance the simulator one report step + std::unique_ptr initFlowBlackoil(int& exitCode) + { + exitCode = EXIT_SUCCESS; + if (initialize_(exitCode)) { + // TODO: check that this deck really represents a blackoil + // case. E.g. check that number of phases == 3 + this->setupVanguard(); + return flowBlackoilTpfaMainInit( + argc_, argv_, outputCout_, outputFiles_); + } else { + //NOTE: exitCode was set by initialize_() above; + return std::unique_ptr(); // nullptr + } + } +}; + +} // namespace Opm + +#endif // OPM_PYMAIN_HEADER_INCLUDED