/* Copyright 2020 Equinor ASA. 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_PY_BASE_SIMULATOR_HEADER_INCLUDED #define OPM_PY_BASE_SIMULATOR_HEADER_INCLUDED #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace Opm::Pybind { template class PyBaseSimulator { private: using Simulator = GetPropType; public: PyBaseSimulator(const std::string& deckFilename, const std::vector& args); PyBaseSimulator(std::shared_ptr deck, std::shared_ptr state, std::shared_ptr schedule, std::shared_ptr summary_config, const std::vector& args); void advance(int report_step); bool checkSimulationFinished(); int currentStep(); py::array_t getFluidStateVariable(const std::string& name) const; py::array_t getCellVolumes(); double getDT(); py::array_t getPorosity(); py::array_t getPrimaryVariable(const std::string& variable) const; py::array_t getPrimaryVarMeaning(const std::string& variable) const; std::map getPrimaryVarMeaningMap(const std::string& variable) const; int run(); using PyCArray = py::array_t; void setPorosity(PyCArray array); void setPrimaryVariable(const std::string& idx_name, PyCArray array); void setupMpi(bool init_mpi, bool finalize_mpi); int step(); int stepCleanup(); int stepInit(); protected: FlowMain& getFlowMain() const; PyFluidState& getFluidState() const; PyMaterialState& getMaterialState() const; const std::string deck_filename_{}; bool has_run_init_{false}; bool has_run_cleanup_{false}; bool mpi_init_{true}; bool mpi_finalize_{true}; // NOTE: the main_ pointer *must* be declared before the flow_main_ pointer // to ensure that it is destroyed before the main object since the main object // destructor will call MPI_Finalize() and flow_main_ object destructor will call // MPI_Comm_free(). std::unique_ptr> main_{}; std::unique_ptr> flow_main_{}; Simulator* simulator_{nullptr}; std::unique_ptr> fluid_state_{}; std::unique_ptr> material_state_{}; std::shared_ptr deck_{}; std::shared_ptr eclipse_state_{}; std::shared_ptr schedule_{}; std::shared_ptr summary_config_{}; std::vector args_{}; }; // class PyBaseSimulator } // namespace Opm::Pybind #include #endif // OPM_PY_BASE_SIMULATOR_HEADER_INCLUDED