opm-simulators
ReservoirCouplingSpawnSlaves.hpp
1 /*
2  Copyright 2024 Equinor ASA
3 
4  This file is part of the Open Porous Media project (OPM).
5 
6  OPM is free software: you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10 
11  OPM is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with OPM. If not, see <http://www.gnu.org/licenses/>.
18 */
19 
20 #ifndef OPM_RESERVOIR_COUPLING_SPAWN_SLAVES_HPP
21 #define OPM_RESERVOIR_COUPLING_SPAWN_SLAVES_HPP
22 
23 #include <opm/simulators/utils/ParallelCommunication.hpp>
24 #include <opm/simulators/flow/rescoup/ReservoirCoupling.hpp>
25 #include <opm/simulators/flow/rescoup/ReservoirCouplingMaster.hpp>
26 
27 #include <opm/input/eclipse/Schedule/ResCoup/ReservoirCouplingInfo.hpp>
28 #include <opm/input/eclipse/Schedule/Schedule.hpp>
29 #include <opm/common/OpmLog/OpmLog.hpp>
30 
31 #include <mpi.h>
32 
33 #include <filesystem>
34 #include <vector>
35 
36 namespace Opm {
37 
38 template <class Scalar>
40 public:
41  using MessageTag = ReservoirCoupling::MessageTag;
42 
45  const ReservoirCoupling::CouplingInfo &rescoup
46  );
47 
48  void spawn();
49 
50 private:
51  void createMasterGroupNameOrder_();
52  void createMasterGroupToSlaveNameMap_();
53  void createSlaveNameToMasterGroupsMap_();
54  std::pair<std::vector<char>, std::size_t>
55  getMasterGroupNamesForSlave_(std::size_t slave_idx) const;
56  std::vector<char *> getSlaveArgv_(
57  const std::filesystem::path &data_file,
58  const std::string &slave_name,
59  std::string &log_filename) const;
60  void receiveActivationDateFromSlaves_();
61  void receiveSimulationStartDateFromSlaves_();
62  void sendMasterGroupNamesToSlaves_();
63  void sendSlaveNamesToSlaves_();
64  void spawnSlaveProcesses_();
65  ReservoirCoupling::Logger& logger() { return this->logger_; }
66  ReservoirCoupling::Logger& logger() const { return this->logger_; }
67 
69  const ReservoirCoupling::CouplingInfo &rescoup_;
70  const Parallel::Communication &comm_;
71  mutable ReservoirCoupling::Logger logger_;
72 };
73 
74 } // namespace Opm
75 #endif // OPM_RESERVOIR_COUPLING_SPAWN_SLAVES_HPP
Definition: ReservoirCouplingSpawnSlaves.hpp:39
Definition: ReservoirCoupling.hpp:42
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition: blackoilbioeffectsmodules.hh:45
Definition: ReservoirCouplingMaster.hpp:38