opm-simulators
CollectDataOnIORank.hpp
1 // -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2 // vi: set et ts=4 sw=4 sts=4:
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 2 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  Consult the COPYING file in the top-level source directory of this
20  module for the precise wording of the license and the list of
21  copyright holders.
22 */
23 #ifndef OPM_COLLECT_DATA_ON_IO_RANK_HPP
24 #define OPM_COLLECT_DATA_ON_IO_RANK_HPP
25 
26 #include <opm/grid/common/p2pcommunicator.hh>
27 
28 #include <opm/input/eclipse/Schedule/Well/WellTestState.hpp>
29 
30 #include <opm/output/data/Aquifer.hpp>
31 #include <opm/output/data/Cells.hpp>
32 #include <opm/output/data/Groups.hpp>
33 #include <opm/output/data/Solution.hpp>
34 #include <opm/output/data/Wells.hpp>
35 
36 #include <opm/simulators/flow/FlowsData.hpp>
38 
39 #include <array>
40 #include <cstddef>
41 #include <map>
42 #include <set>
43 #include <string>
44 #include <type_traits>
45 #include <utility>
46 #include <vector>
47 
48 namespace Dune {
49 template<class Grid> class CartesianIndexMapper;
50 }
51 
52 namespace Opm {
53 
54 template <class Grid, class EquilGrid, class GridView>
56 {
57 public:
58  using CollectiveCommunication = typename Grid::Communication;
59  using P2PCommunicatorType = Dune::Point2PointCommunicator<Dune::SimpleMessageBuffer>;
60  using IndexMapType = std::vector<int>;
61  using IndexMapStorageType = std::vector<IndexMapType>;
62 
63  static constexpr int dimension = Grid::dimension;
64 
65  enum { ioRank = 0 };
66 
67  static const bool needsReordering =
68  !std::is_same<Grid, EquilGrid>::value;
69 
70  CollectDataOnIORank(const Grid& grid,
71  const EquilGrid* equilGrid,
72  const GridView& gridView,
73  const Dune::CartesianIndexMapper<Grid>& cartMapper,
74  const Dune::CartesianIndexMapper<EquilGrid>* equilCartMapper,
75  const std::set<std::string>& fipRegionsInterregFlow = {});
76 
77  // gather solution to rank 0 for EclipseWriter
78  void collect(const data::Solution& localCellData,
79  const std::map<std::pair<std::string, int>, double>& localBlockData,
80  std::map<std::pair<std::string, int>, double>& localExtraBlockData,
81  const data::Wells& localWellData,
82  const data::WellBlockAveragePressures& localWBPData,
83  const data::GroupAndNetworkValues& localGroupAndNetworkData,
84  const data::Aquifers& localAquiferData,
85  const WellTestState& localWellTestState,
86  const InterRegFlowMap& interRegFlows,
87  const std::array<FlowsData<double>, 3>& localFlowsn,
88  const std::array<FlowsData<double>, 3>& localFloresn);
89 
90  const std::map<std::pair<std::string, int>, double>& globalBlockData() const
91  { return globalBlockData_; }
92 
93  const data::Solution& globalCellData() const
94  { return globalCellData_; }
95 
96  data::Solution& globalCellData()
97  { return globalCellData_; }
98 
99  const data::Wells& globalWellData() const
100  { return globalWellData_; }
101 
102  const data::WellBlockAveragePressures& globalWBPData() const
103  { return this->globalWBPData_; }
104 
105  const data::GroupAndNetworkValues& globalGroupAndNetworkData() const
106  { return globalGroupAndNetworkData_; }
107 
108  const data::Aquifers& globalAquiferData() const
109  { return globalAquiferData_; }
110 
111  const WellTestState& globalWellTestState() const
112  { return this->globalWellTestState_; }
113 
114  InterRegFlowMap& globalInterRegFlows()
115  { return this->globalInterRegFlows_; }
116 
117  const InterRegFlowMap& globalInterRegFlows() const
118  { return this->globalInterRegFlows_; }
119 
120  const std::array<FlowsData<double>, 3>& globalFlowsn() const
121  { return globalFlowsn_; }
122 
123  const std::array<FlowsData<double>, 3>& globalFloresn() const
124  { return globalFloresn_; }
125 
126  bool isIORank() const
127  { return toIORankComm_.rank() == ioRank; }
128 
129  bool isParallel() const
130  { return toIORankComm_.size() > 1; }
131 
132  int localIdxToGlobalIdx(unsigned localIdx) const;
133 
134  const std::vector<int>& localIdxToGlobalIdxMapping() const
135  {
136  return localIdxToGlobalIdx_;
137  }
138 
139  bool doesNeedReordering() const
140  { return needsReordering;}
141 
142  std::size_t numCells () const
143  { return globalCartesianIndex_.size(); }
144 
145  const std::vector<int>& globalRanks() const
146  { return globalRanks_; }
147 
148  bool isCartIdxOnThisRank(int cartIdx) const;
149 
150 protected:
151  P2PCommunicatorType toIORankComm_;
152  InterRegFlowMap globalInterRegFlows_;
153  IndexMapType globalCartesianIndex_;
154  IndexMapType localIndexMap_;
155  IndexMapStorageType indexMaps_;
156  std::vector<int> globalRanks_;
157  data::Solution globalCellData_;
158  std::map<std::pair<std::string, int>, double> globalBlockData_;
159  data::Wells globalWellData_;
160  data::WellBlockAveragePressures globalWBPData_;
161  data::GroupAndNetworkValues globalGroupAndNetworkData_;
162  data::Aquifers globalAquiferData_;
163  WellTestState globalWellTestState_;
164  std::vector<int> localIdxToGlobalIdx_;
165  std::array<FlowsData<double>, 3> globalFlowsn_;
166  std::array<FlowsData<double>, 3> globalFloresn_;
170  std::vector<int> sortedCartesianIdx_;
171 };
172 
173 } // end namespace Opm
174 
175 #endif // OPM_COLLECT_DATA_ON_IO_RANK_HPP
Definition: CollectDataOnIORank.hpp:55
Definition: fvbaseprimaryvariables.hh:161
std::vector< int > sortedCartesianIdx_
sorted list of cartesian indices present-
Definition: CollectDataOnIORank.hpp:170
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition: blackoilbioeffectsmodules.hh:45
Inter-region flow accumulation maps for all region definition arrays.
Definition: InterRegFlows.hpp:178
MPI-aware facility for converting collection of tuples of region ID pairs and associate flow rates in...
Simple container for FLOWS data.
Definition: FlowsData.hpp:31
Definition: CollectDataOnIORank.hpp:49