opm-grid
CpGrid.hpp
1 //===========================================================================
2 //
3 // File: CpGrid.hpp
4 //
5 // Created: Fri May 29 20:26:36 2009
6 //
7 // Author(s): Atgeirr F Rasmussen <atgeirr@sintef.no>
8 // B�rd Skaflestad <bard.skaflestad@sintef.no>
9 // Antonella Ritorto <antonella.ritorto@opm-op.com>
10 //
11 // $Date$
12 //
13 // $Revision$
14 //
15 //===========================================================================
16 
17 /*
18  Copyright 2009, 2010 SINTEF ICT, Applied Mathematics.
19  Copyright 2009, 2010, 2014, 2022-2023 Equinor ASA.
20  Copyright 2014, 2015 Dr. Blatt - HPC-Simulartion-Software & Services
21  Copyright 2015 NTNU
22 
23  This file is part of The Open Porous Media project (OPM).
24 
25  OPM is free software: you can redistribute it and/or modify
26  it under the terms of the GNU General Public License as published by
27  the Free Software Foundation, either version 3 of the License, or
28  (at your option) any later version.
29 
30  OPM is distributed in the hope that it will be useful,
31  but WITHOUT ANY WARRANTY; without even the implied warranty of
32  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
33  GNU General Public License for more details.
34 
35  You should have received a copy of the GNU General Public License
36  along with OPM. If not, see <http://www.gnu.org/licenses/>.
37 */
38 
39 #ifndef OPM_CPGRID_HEADER
40 #define OPM_CPGRID_HEADER
41 
42 // Warning suppression for Dune includes.
43 #include <opm/grid/utility/platform_dependent/disable_warnings.h>
44 
45 #include <dune/grid/common/grid.hh>
46 
47 #include <opm/grid/utility/platform_dependent/reenable_warnings.h>
48 
49 #include <opm/grid/common/GridEnums.hpp>
50 
51 #include <opm/grid/cpgrid/CpGridDataTraits.hpp>
52 #include <opm/grid/cpgrid/DefaultGeometryPolicy.hpp>
53 #include <opm/grid/cpgrid/OrientedEntityTable.hpp>
54 
56 
57 #include <opm/grid/utility/OpmWellType.hpp>
58 
59 #include <set>
60 
61 namespace Opm
62 {
63 struct NNCdata;
64 class EclipseGrid;
65 class EclipseState;
66 }
67 
68 namespace Dune
69 {
70  class CpGrid;
71 
72  namespace cpgrid
73  {
74  class CpGridData;
75  template <int> class Entity;
76  template<int,int> class Geometry;
77  class HierarchicIterator;
78  class IntersectionIterator;
79  template<int, PartitionIteratorType> class Iterator;
80  class LevelGlobalIdSet;
81  class GlobalIdSet;
82  class Intersection;
83  class IntersectionIterator;
84  class IndexSet;
85  class IdSet;
86 
87  }
88 }
89 
90 namespace Dune
91 {
92 
94  //
95  // CpGridTraits
96  //
98 
99  struct CpGridTraits
100  {
102  typedef CpGrid Grid;
103 
112 
115 
118  template <int cd>
119  struct Codim
120  {
123  typedef cpgrid::Geometry<3-cd, 3> Geometry;
124  //typedef Dune::Geometry<3-cd, 3, CpGrid, cpgrid::Geometry> Geometry;
126  typedef cpgrid::Geometry<3-cd, 3> LocalGeometry;
127  //typedef Dune::Geometry<3-cd, 3, CpGrid, cpgrid::Geometry> LocalGeometry;
130 
133 
136 
139 
142  template <PartitionIteratorType pitype>
143  struct Partition
144  {
149  };
150  };
151 
154  template <PartitionIteratorType pitype>
155  struct Partition
156  {
158  typedef Dune::GridView<DefaultLevelGridViewTraits<CpGrid> > LevelGridView;
160  typedef Dune::GridView<DefaultLeafGridViewTraits<CpGrid> > LeafGridView;
161 
162  };
163 
165  typedef Dune::GridView<DefaultLevelGridViewTraits<CpGrid>> LevelGridView;
167  typedef Dune::GridView<DefaultLeafGridViewTraits<CpGrid>> LeafGridView;
168 
177 
179  using Communication = cpgrid::CpGridDataTraits::Communication;
180  using CollectiveCommunication = cpgrid::CpGridDataTraits::CollectiveCommunication;
181  };
182 
184  //
185  // CpGridFamily
186  //
188 
190  {
191  typedef CpGridTraits Traits;
192  };
193 
195  //
196  // CpGrid
197  //
199 
201  class CpGrid
202  : public GridDefaultImplementation<3, 3, double, CpGridFamily>
203  {
204  friend class cpgrid::CpGridData;
205  friend class cpgrid::Entity<0>;
206  friend class cpgrid::Entity<1>;
207  friend class cpgrid::Entity<2>;
208  friend class cpgrid::Entity<3>;
209  template<int dim>
210  friend cpgrid::Entity<dim> createEntity(const CpGrid&,int,bool);
211 
212  public:
213 
214  // --- Typedefs ---
215 
216 
219 
220 
221  // --- Methods ---
222 
223 
225  CpGrid();
226 
227  explicit CpGrid(MPIHelper::MPICommunicator comm);
228 
229 #if HAVE_OPM_COMMON
230  std::vector<std::size_t>
267  processEclipseFormat(const Opm::EclipseGrid* ecl_grid,
268  Opm::EclipseState* ecl_state,
269  bool periodic_extension,
270  bool turn_normals,
271  bool clip_z,
272  bool pinchActive,
273  bool edge_conformal);
274 
312  std::vector<std::size_t>
313  processEclipseFormat(const Opm::EclipseGrid* ecl_grid,
314  Opm::EclipseState* ecl_state,
315  bool periodic_extension,
316  bool turn_normals = false,
317  bool clip_z = false,
318  bool edge_conformal = false);
319 #endif // HAVE_OPM_COMMON
320 
335  void processEclipseFormat(const grdecl& input_data,
336  bool remove_ij_boundary,
337  bool turn_normals = false,
338  bool edge_conformal = false);
339 
341 
347 
348  void createCartesian(const std::array<int, 3>& dims,
356  const std::array<double, 3>& cellsize,
357  const std::array<int, 3>& shift = {0,0,0});
358 
362  const std::array<int, 3>& logicalCartesianSize() const;
363 
371  const std::vector<int>& globalCell() const;
372 
374  const std::vector<std::shared_ptr<Dune::cpgrid::CpGridData>>& currentData() const;
375 
377  std::vector<std::shared_ptr<Dune::cpgrid::CpGridData>>& currentData();
378 
381 
384 
392  void getIJK(const int c, std::array<int,3>& ijk) const;
394 
398  bool uniqueBoundaryIds() const;
399 
402  void setUniqueBoundaryIds(bool uids);
403 
404 
405  // --- Dune interface below ---
406 
408  // \@{
413  std::string name() const;
414 
416  int maxLevel() const;
417 
419  template<int codim>
420  typename Traits::template Codim<codim>::LevelIterator lbegin (int level) const;
422  template<int codim>
423  typename Traits::template Codim<codim>::LevelIterator lend (int level) const;
424 
426  template<int codim, PartitionIteratorType PiType>
427  typename Traits::template Codim<codim>::template Partition<PiType>::LevelIterator lbegin (int level) const;
429  template<int codim, PartitionIteratorType PiType>
430  typename Traits::template Codim<codim>::template Partition<PiType>::LevelIterator lend (int level) const;
431 
433  template<int codim>
434  typename Traits::template Codim<codim>::LeafIterator leafbegin() const;
436  template<int codim>
437  typename Traits::template Codim<codim>::LeafIterator leafend() const;
438 
440  template<int codim, PartitionIteratorType PiType>
441  typename Traits::template Codim<codim>::template Partition<PiType>::LeafIterator leafbegin() const;
443  template<int codim, PartitionIteratorType PiType>
444  typename Traits::template Codim<codim>::template Partition<PiType>::LeafIterator leafend() const;
445 
447  int size (int level, int codim) const;
448 
450  int size (int codim) const;
451 
453  int size (int level, GeometryType type) const;
454 
456  int size (GeometryType type) const;
457 
459  const Traits::GlobalIdSet& globalIdSet() const;
460 
462  const Traits::LocalIdSet& localIdSet() const;
463 
465  const Traits::LevelIndexSet& levelIndexSet(int level) const;
466 
468  const Traits::LeafIndexSet& leafIndexSet() const;
469 
475  void globalRefine (int refCount, bool throwOnFailure = false);
476 
477  const std::vector<Dune::GeometryType>& geomTypes(const int) const;
478 
480  template <int codim>
482 
501  void addLgrsUpdateLeafView(const std::vector<std::array<int,3>>& cells_per_dim_vec,
502  const std::vector<std::array<int,3>>& startIJK_vec,
503  const std::vector<std::array<int,3>>& endIJK_vec,
504  const std::vector<std::string>& lgr_name_vec,
505  const std::vector<std::string>& lgr_parent_grid_name_vec = std::vector<std::string>{});
506 
513  void autoRefine(const std::array<int,3>& nxnynz);
514 
515  // @brief TO BE DONE
516  const std::map<std::string,int>& getLgrNameToLevel() const;
517 
518  // @breif Compute center of an entity/element/cell in the Eclipse way:
519  // - Average of the 4 corners of the bottom face.
520  // - Average of the 4 corners of the top face.
521  // Return average of the previous computations.
522  // @param [in] int Index of a cell.
523  // @return 'eclipse centroid'
524  std::array<double,3> getEclCentroid(const int& idx) const;
525 
526  // @breif Compute center of an entity/element/cell in the Eclipse way:
527  // - Average of the 4 corners of the bottom face.
528  // - Average of the 4 corners of the top face.
529  // Return average of the previous computations.
530  // @param [in] Entity<0> Entity
531  // @return 'eclipse centroid'
532  std::array<double,3> getEclCentroid(const cpgrid::Entity<0>& elem) const;
533 
544 
565  bool mark(int refCount, const cpgrid::Entity<0>& element, bool throwOnFailure = false);
566 
570  int getMark(const cpgrid::Entity<0>& element) const;
571 
574  bool preAdapt();
575 
578  bool adapt();
579 
598  bool refineAndUpdateGrid(bool throwOnFailure,
599  const std::vector<std::array<int,3>>& cells_per_dim_vec,
600  const std::vector<int>& assignRefinedLevel,
601  const std::vector<std::string>& lgr_name_vec,
602  const std::vector<std::array<int,3>>& startIJK_vec = std::vector<std::array<int,3>>{},
603  const std::vector<std::array<int,3>>& endIJK_vec = std::vector<std::array<int,3>>{});
604 
606  void postAdapt();
608 
609  private:
610  void updateCornerHistoryLevels(const std::vector<std::vector<std::array<int,2>>>& cornerInMarkedElemWithEquivRefinedCorner,
611  const std::map<std::array<int,2>,std::array<int,2>>& elemLgrAndElemLgrCorner_to_refinedLevelAndRefinedCorner,
612  const std::unordered_map<int,std::array<int,2>>& adaptedCorner_to_elemLgrAndElemLgrCorner,
613  const int& corner_count,
614  const std::vector<std::array<int,2>>& preAdaptGrid_corner_history,
615  const int& preAdaptMaxLevel,
616  const int& newLevels);
617 
618  void globalIdsPartitionTypesLgrAndLeafGrids(const std::vector<int>& assignRefinedLevel,
619  const std::vector<std::array<int,3>>& cells_per_dim_vec,
620  const std::vector<int>& lgr_with_at_least_one_active_cell);
621 
628  void getFirstChildGlobalIds([[maybe_unused]] std::vector<int>& parentToFirstChildGlobalIds);
629  public:
636  private:
637 
650  void computeGlobalCellLgr(const int& level, const std::array<int,3>& startIJK, std::vector<int>& global_cell_lgr);
651 
655  void computeGlobalCellLeafGridViewWithLgrs(std::vector<int>& global_cell_leaf);
656 
657  private:
671  void markElemAssignLevelDetectActiveLgrs(const std::vector<std::array<int,3>>& startIJK_vec,
672  const std::vector<std::array<int,3>>& endIJK_vec,
673  std::vector<int>& assignRefinedLevel,
674  std::vector<int>& lgr_with_at_least_one_active_cell);
675 
677  void populateCellIndexSetRefinedGrid(int level);
678 
680  void populateCellIndexSetLeafGridView();
681 
683  void populateLeafGlobalIdSet();
684 
685  public:
686 
691  std::vector<std::unordered_map<std::size_t, std::size_t>> mapLocalCartesianIndexSetsToLeafIndexSet() const;
692 
694  std::vector<std::array<int,2>> mapLeafIndexSetToLocalCartesianIndexSets() const;
695 
697  unsigned int overlapSize(int) const;
698 
699 
701  unsigned int ghostSize(int) const;
702 
704  unsigned int overlapSize(int, int) const;
705 
707  unsigned int ghostSize(int, int) const;
708 
710  unsigned int numBoundarySegments() const;
711 
712  void setPartitioningParams(const std::map<std::string,std::string>& params);
713 
714  // loadbalance is not part of the grid interface therefore we skip it.
715 
725  bool loadBalance(int overlapLayers=1,
726  int partitionMethod = Dune::PartitionMethod::zoltan,
727  double imbalanceTol = 1.1,
728  int level =-1)
729  {
730  using std::get;
731  return get<0>(scatterGrid(/* edgeWeightMethod = */ defaultTransEdgeWgt,
732  /* ownersFirst = */ false,
733  /* wells = */ nullptr,
734  /* possibleFutureConnections = */ {},
735  /* serialPartitioning = */ false,
736  /* transmissibilities = */ nullptr,
737  /* addCornerCells = */ true,
738  overlapLayers,
739  partitionMethod,
740  imbalanceTol,
741  /* allowDistributedWells = */ false,
742  /* input_cell_part = */ {},
743  level));
744  }
745 
746  // loadbalance is not part of the grid interface therefore we skip it.
747 
758  bool loadBalanceSerial(int overlapLayers=1,
759  int partitionMethod = Dune::PartitionMethod::zoltan,
760  int edgeWeightMethod = Dune::EdgeWeightMethod::defaultTransEdgeWgt,
761  double imbalanceTol = 1.1,
762  int level = -1)
763  {
764  using std::get;
765  return get<0>(scatterGrid(EdgeWeightMethod(edgeWeightMethod),
766  /* ownersFirst = */ false,
767  /* wells = */ nullptr,
768  /* possibleFutureConnections = */ {},
769  /* serialPartitioning = */ true,
770  /* transmissibilities = */ nullptr,
771  /* addCornerCells = */ true,
772  overlapLayers,
773  partitionMethod,
774  imbalanceTol,
775  /* allowDistributedWells = */ false,
776  /* input_cell_part = */ {},
777  level));
778  }
779 
780  // loadbalance is not part of the grid interface therefore we skip it.
781 
810  std::pair<bool,std::vector<std::pair<std::string,bool>>>
811  loadBalance(const std::vector<cpgrid::OpmWellType> * wells,
812  const std::unordered_map<std::string, std::set<int>>& possibleFutureConnections = {},
813  const double* transmissibilities = nullptr,
814  int overlapLayers=1, int partitionMethod=Dune::PartitionMethod::zoltanGoG,
815  int level = -1)
816  {
817  return scatterGrid(defaultTransEdgeWgt, /* ownersFirst = */ false, wells, possibleFutureConnections,
818  /* serialPartitioning = */ false, transmissibilities, /* addCornerCells = */ false,
819  overlapLayers, partitionMethod, /* imbalanceTol = */ 1.1, /* allowDistributeWells = */ false,
820  /* input_cell_part = */ {}, level);
821  }
822 
823  // loadbalance is not part of the grid interface therefore we skip it.
824 
858  std::pair<bool,std::vector<std::pair<std::string,bool>>>
859  loadBalance(EdgeWeightMethod method, const std::vector<cpgrid::OpmWellType> * wells,
860  const std::unordered_map<std::string, std::set<int>>& possibleFutureConnections = {},
861  const double* transmissibilities = nullptr, bool ownersFirst=false,
862  bool addCornerCells=false, int overlapLayers=1,
863  int partitionMethod = Dune::PartitionMethod::zoltanGoG,
864  double imbalanceTol = 1.1,
865  int level = -1)
866  {
867  return scatterGrid(method, ownersFirst, wells, possibleFutureConnections, /* serialPartitioning = */ false,
868  transmissibilities, addCornerCells, overlapLayers, partitionMethod, imbalanceTol,
869  /* allowDistributeWells = */ false, /* input_cell_part = */ {}, level);
870  }
871 
900  template<class DataHandle>
901  std::pair<bool, std::vector<std::pair<std::string,bool> > >
902  loadBalance(DataHandle& data,
903  const std::vector<cpgrid::OpmWellType> * wells,
904  const std::unordered_map<std::string, std::set<int>>& possibleFutureConnections = {},
905  const double* transmissibilities = nullptr,
906  int overlapLayers=1, int partitionMethod = 1, int level =-1)
907  {
908  auto ret = loadBalance(wells, possibleFutureConnections, transmissibilities, overlapLayers, partitionMethod, level);
909  using std::get;
910  if (get<0>(ret))
911  {
912  scatterData(data);
913  }
914  return ret;
915  }
916 
951  template<class DataHandle>
952  std::pair<bool, std::vector<std::pair<std::string,bool> > >
953  loadBalance(DataHandle& data, EdgeWeightMethod method,
954  const std::vector<cpgrid::OpmWellType> * wells,
955  const std::unordered_map<std::string, std::set<int>>& possibleFutureConnections,
956  bool serialPartitioning,
957  const double* transmissibilities = nullptr, bool ownersFirst=false,
958  bool addCornerCells=false, int overlapLayers=1, int partitionMethod = Dune::PartitionMethod::zoltanGoG,
959  double imbalanceTol = 1.1,
960  bool allowDistributedWells = false,
961  bool useTransToFilterOverlap = true)
962  {
963  auto ret = scatterGrid(method, ownersFirst, wells, possibleFutureConnections, serialPartitioning, transmissibilities,
964  addCornerCells, overlapLayers, partitionMethod, imbalanceTol, allowDistributedWells,
965  /* input_cell_parts = */ std::vector<int>{}, /* level = */ 0,
966  useTransToFilterOverlap);
967  using std::get;
968  if (get<0>(ret))
969  {
970  scatterData(data);
971  }
972  return ret;
973  }
974 
999  template<class DataHandle>
1000  std::pair<bool, std::vector<std::pair<std::string,bool> > >
1001  loadBalance(DataHandle& data, const std::vector<int>& parts,
1002  const std::vector<cpgrid::OpmWellType> * wells,
1003  const std::unordered_map<std::string, std::set<int>>& possibleFutureConnections = {},
1004  bool ownersFirst=false,
1005  bool addCornerCells=false, int overlapLayers=1)
1006  {
1007  using std::get;
1008  auto ret = scatterGrid(defaultTransEdgeWgt, ownersFirst, wells,
1009  possibleFutureConnections,
1010  /* serialPartitioning = */ false,
1011  /* transmissibilities = */ {},
1012  addCornerCells, overlapLayers, /* partitionMethod =*/ Dune::PartitionMethod::simple,
1013  /* imbalanceTol (ignored) = */ 0.0,
1014  /* allowDistributedWells = */ true, parts, /* level = */ 0);
1015  using std::get;
1016  if (get<0>(ret))
1017  {
1018  scatterData(data);
1019  }
1020  return ret;
1021  }
1022 
1030  template<class DataHandle>
1031  bool loadBalance(DataHandle& data,
1032  decltype(data.fixedSize(0,0)) overlapLayers=1, int partitionMethod = Dune::PartitionMethod::zoltan)
1033  {
1034  // decltype usage needed to tell the compiler not to use this function if first
1035  // argument is std::vector but rather loadbalance by parts
1036  bool ret = loadBalance(overlapLayers, partitionMethod);
1037  if (ret)
1038  {
1039  scatterData(data);
1040  }
1041  return ret;
1042  }
1043 
1055  bool loadBalance(const std::vector<int>& parts, bool ownersFirst=false,
1056  bool addCornerCells=false, int overlapLayers=1)
1057  {
1058  using std::get;
1059  return get<0>(scatterGrid(defaultTransEdgeWgt, ownersFirst, /* wells = */ {},
1060  {},
1061  /* serialPartitioning = */ false,
1062  /* trabsmissibilities = */ {},
1063  addCornerCells, overlapLayers, /* partitionMethod =*/ Dune::PartitionMethod::simple,
1064  /* imbalanceTol (ignored) = */ 0.0,
1065  /* allowDistributedWells = */ true, parts));
1066  }
1067 
1080  template<class DataHandle>
1081  bool loadBalance(DataHandle& data, const std::vector<int>& parts, bool ownersFirst=false,
1082  bool addCornerCells=false, int overlapLayers=1)
1083  {
1084  bool ret = loadBalance(parts, ownersFirst, addCornerCells, overlapLayers);
1085  if (ret)
1086  {
1087  scatterData(data);
1088  }
1089  return ret;
1090  }
1091 
1105  std::vector<int>
1106  zoltanPartitionWithoutScatter(const std::vector<cpgrid::OpmWellType>* wells,
1107  const std::unordered_map<std::string, std::set<int>>& possibleFutureConnections,
1108  const double* transmissibilities,
1109  const int numParts,
1110  const double imbalanceTol) const;
1111 
1119  template<class DataHandle>
1120  void communicate (DataHandle& data, InterfaceType iftype, CommunicationDirection dir, int /*level*/) const
1121  {
1122  communicate(data, iftype, dir);
1123  }
1124 
1132  template<class DataHandle>
1133  void communicate (DataHandle& data, InterfaceType iftype, CommunicationDirection dir) const;
1134 
1136  const typename CpGridTraits::Communication& comm () const;
1138 
1139  // ------------ End of Dune interface, start of simplified interface --------------
1140 
1146 
1147  // enum { dimension = 3 }; // already defined
1148 
1149  typedef Dune::FieldVector<double, 3> Vector;
1150 
1151 
1152  const std::vector<double>& zcornData() const;
1153 
1154 
1155  // Topology
1160  int numCells(int level = -1) const;
1161 
1166  int numFaces(int level = -1) const;
1167 
1169  int numVertices() const;
1170 
1171 
1180  int numCellFaces(int cell, int level = -1) const;
1181 
1188  int cellFace(int cell, int local_index, int level = -1) const;
1189 
1193 
1213  int faceCell(int face, int local_index, int level = -1) const;
1214 
1221  int numCellFaces() const;
1222 
1223  int numFaceVertices(int face) const;
1224 
1229  int faceVertex(int face, int local_index) const;
1230 
1233  double cellCenterDepth(int cell_index) const;
1234 
1235 
1236  const Vector faceCenterEcl(int cell_index, int face, const Dune::cpgrid::Intersection& intersection) const;
1237 
1238  const Vector faceAreaNormalEcl(int face) const;
1239 
1240 
1241  // Geometry
1245  const Vector& vertexPosition(int vertex) const;
1246 
1249  double faceArea(int face) const;
1250 
1253  const Vector& faceCentroid(int face) const;
1254 
1258  const Vector& faceNormal(int face) const;
1259 
1262  double cellVolume(int cell) const;
1263 
1266  const Vector& cellCentroid(int cell) const;
1267 
1270  template<int codim>
1272  : public RandomAccessIteratorFacade<CentroidIterator<codim>,
1273  FieldVector<double, 3>,
1274  const FieldVector<double, 3>&, int>
1275  {
1276  public:
1278  typedef typename std::vector<cpgrid::Geometry<3-codim, 3> >::const_iterator
1283  : iter_(iter)
1284  {}
1285 
1286  const FieldVector<double,3>& dereference() const
1287  {
1288  return iter_->center();
1289  }
1290  void increment()
1291  {
1292  ++iter_;
1293  }
1294  const FieldVector<double,3>& elementAt(int n)
1295  {
1296  return iter_[n]->center();
1297  }
1298  void advance(int n){
1299  iter_+=n;
1300  }
1301  void decrement()
1302  {
1303  --iter_;
1304  }
1305  int distanceTo(const CentroidIterator& o)
1306  {
1307  return o-iter_;
1308  }
1309  bool equals(const CentroidIterator& o) const{
1310  return o==iter_;
1311  }
1312  private:
1314  GeometryIterator iter_;
1315  };
1316 
1318  CentroidIterator<0> beginCellCentroids() const;
1319 
1321  CentroidIterator<1> beginFaceCentroids() const;
1322 
1323  // Extra
1324  int boundaryId(int face) const;
1325 
1332  template<class Cell2FacesRowIterator>
1333  int
1334  faceTag(const Cell2FacesRowIterator& cell_face) const;
1335 
1337 
1338  // ------------ End of simplified interface --------------
1339 
1340  //------------- methods not in the DUNE grid interface.
1341 
1346 
1347  template<class DataHandle>
1357  void scatterData(DataHandle& handle) const;
1358 
1365  template<class DataHandle>
1366  void gatherData(DataHandle& handle) const;
1367 
1369  using InterfaceMap = cpgrid::CpGridDataTraits::InterfaceMap;
1370 
1400 
1404 
1406  void switchToGlobalView();
1407 
1409  void switchToDistributedView();
1411 
1412 #if HAVE_MPI
1413  using ParallelIndexSet = cpgrid::CpGridDataTraits::ParallelIndexSet;
1416  using RemoteIndices = cpgrid::CpGridDataTraits::RemoteIndices;
1417 
1419  using CommunicationType = cpgrid::CpGridDataTraits::CommunicationType;
1420 
1424  const CommunicationType& cellCommunication() const;
1425 
1426  ParallelIndexSet& getCellIndexSet();
1427 
1428  RemoteIndices& getCellRemoteIndices();
1429 
1430  const ParallelIndexSet& getCellIndexSet() const;
1431 
1432  const RemoteIndices& getCellRemoteIndices() const;
1433 #endif
1434 
1436  const std::vector<int>& sortedNumAquiferCells() const;
1437 
1438  private:
1470  std::pair<bool, std::vector<std::pair<std::string,bool> > >
1471  scatterGrid(EdgeWeightMethod method,
1472  bool ownersFirst,
1473  const std::vector<cpgrid::OpmWellType> * wells,
1474  const std::unordered_map<std::string, std::set<int>>& possibleFutureConnections,
1475  bool serialPartitioning,
1476  const double* transmissibilities,
1477  bool addCornerCells,
1478  int overlapLayers,
1479  int partitionMethod = Dune::PartitionMethod::zoltanGoG,
1480  double imbalanceTol = 1.1,
1481  bool allowDistributedWells = true,
1482  const std::vector<int>& input_cell_part = {},
1483  int level = -1,
1484  bool useTransToFilterOverlap = true);
1485 
1490  std::vector<std::shared_ptr<cpgrid::CpGridData>> data_;
1492  std::vector<std::shared_ptr<cpgrid::CpGridData>> distributed_data_;
1494  std::vector<std::shared_ptr<cpgrid::CpGridData>>* current_data_;
1496  std::map<std::string,int> lgr_names_ = {{"GLOBAL", 0}};
1502  std::shared_ptr<InterfaceMap> cell_scatter_gather_interfaces_;
1503  /*
1504  * @brief Interface for scattering and gathering point data.
1505  *
1506  * @warning Will only update owner cells
1507  */
1508  std::shared_ptr<InterfaceMap> point_scatter_gather_interfaces_;
1512  std::shared_ptr<cpgrid::GlobalIdSet> global_id_set_ptr_;
1513 
1514 
1518  std::map<std::string,std::string> partitioningParams;
1519 
1520  }; // end Class CpGrid
1521 
1522 } // end namespace Dune
1523 
1524 #include <opm/grid/cpgrid/Entity.hpp>
1525 #include <opm/grid/cpgrid/Iterators.hpp>
1526 #include <opm/grid/cpgrid/CpGridData.hpp>
1527 
1528 
1529 namespace Dune
1530 {
1531 
1532  namespace Capabilities
1533  {
1535  template <>
1536  struct hasEntity<CpGrid, 0>
1537  {
1538  static const bool v = true;
1539  };
1540 
1542  template <>
1543  struct hasEntity<CpGrid, 3>
1544  {
1545  static const bool v = true;
1546  };
1547 
1548  template<>
1549  struct canCommunicate<CpGrid,0>
1550  {
1551  static const bool v = true;
1552  };
1553 
1554  template<>
1555  struct canCommunicate<CpGrid,3>
1556  {
1557  static const bool v = true;
1558  };
1559 
1561  template <>
1562  struct hasBackupRestoreFacilities<CpGrid>
1563  {
1564  static const bool v = false;
1565  };
1566 
1567  }
1568 
1569  template<class DataHandle>
1570  void CpGrid::communicate (DataHandle& data, InterfaceType iftype, CommunicationDirection dir) const
1571  {
1572  current_data_->back()->communicate(data, iftype, dir);
1573  }
1574 
1575 
1576  template<class DataHandle>
1577  void CpGrid::scatterData([[maybe_unused]] DataHandle& handle) const
1578  {
1579 #if HAVE_MPI
1580  if (distributed_data_.empty()) {
1581  OPM_THROW(std::runtime_error, "Moving Data only allowed with a load balanced grid!");
1582  } else {
1583  distributed_data_[0]->scatterData(handle, data_[0].get(),
1584  distributed_data_[0].get(),
1587  }
1588 #endif
1589  }
1590 
1591  template<class DataHandle>
1592  void CpGrid::gatherData([[maybe_unused]] DataHandle& handle) const
1593  {
1594 #if HAVE_MPI
1595  if (distributed_data_.empty()) {
1596  OPM_THROW(std::runtime_error, "Moving Data only allowed with a load balance grid!");
1597  } else {
1598  distributed_data_[0]->gatherData(handle, data_[0].get(), distributed_data_[0].get());
1599  }
1600 #endif
1601  }
1602 
1603 
1604  template<class Cell2FacesRowIterator>
1605  int
1606  CpGrid::faceTag(const Cell2FacesRowIterator& cell_face) const
1607  {
1608  // Note that this relies on the following implementation detail:
1609  // The grid is always constructed such that the interior faces constructed
1610  // with orientation set to true are
1611  // oriented along the positive IJK direction. Oriented means that
1612  // the first cell attached to face has the lower index.
1613  // For faces along the boundary (only one cell, always attached at index 0)
1614  // the orientation has to be determined by the orientation of the cell.
1615  // If it is true then in UnstructuredGrid it would be stored at index 0,
1616  // otherwise at index 1.
1617  const int cell = cell_face.getCellIndex();
1618  const int face = *cell_face;
1619  assert (0 <= cell); assert (cell < numCells());
1620  assert (0 <= face); assert (face < numFaces());
1621 
1623 
1624  const cpgrid::EntityRep<1> f(face, true);
1625  const F2C& f2c = current_data_->back()->face_to_cell_[f];
1626  const face_tag tag = current_data_->back()->face_tag_[f];
1627 
1628  assert ((f2c.size() == 1) || (f2c.size() == 2));
1629 
1630  int inside_cell = 0;
1631 
1632  if ( f2c.size() == 2 ) // Two cells => interior
1633  {
1634  if ( f2c[1].index() == cell )
1635  {
1636  inside_cell = 1;
1637  }
1638  }
1639  const bool normal_is_in = ! f2c[inside_cell].orientation();
1640 
1641  switch (tag) {
1642  case I_FACE:
1643  // LEFT : RIGHT
1644  return normal_is_in ? 0 : 1; // min(I) : max(I)
1645  case J_FACE:
1646  // BACK : FRONT
1647  return normal_is_in ? 2 : 3; // min(J) : max(J)
1648  case K_FACE:
1649  // Note: TOP at min(K) as 'z' measures *depth*.
1650  // TOP : BOTTOM
1651  return normal_is_in ? 4 : 5; // min(K) : max(K)
1652  case NNC_FACE:
1653  // For nnc faces we return the otherwise unused value -1.
1654  return -1;
1655  default:
1656  OPM_THROW(std::logic_error, "Unhandled face tag. This should never happen!");
1657  }
1658  }
1659 
1660  template<int dim>
1661  cpgrid::Entity<dim> createEntity(const CpGrid&, int, bool);
1662 
1663 } // namespace Dune
1664 
1665 #include <opm/grid/cpgrid/PersistentContainer.hpp>
1666 #include <opm/grid/cpgrid/CartesianIndexMapper.hpp>
1667 #include "cpgrid/Intersection.hpp"
1668 #include "cpgrid/Geometry.hpp"
1669 #include "cpgrid/Indexsets.hpp"
1670 
1671 #endif // OPM_CPGRID_HEADER
Traits::template Codim< codim >::LevelIterator lbegin(int level) const
Iterator to first entity of given codim on level.
bool refineAndUpdateGrid(bool throwOnFailure, const std::vector< std::array< int, 3 >> &cells_per_dim_vec, const std::vector< int > &assignRefinedLevel, const std::vector< std::string > &lgr_name_vec, const std::vector< std::array< int, 3 >> &startIJK_vec=std::vector< std::array< int, 3 >>{}, const std::vector< std::array< int, 3 >> &endIJK_vec=std::vector< std::array< int, 3 >>{})
Triggers the grid refinement process, allowing to select diffrent refined level grids.
Definition: CpGrid.cpp:1847
Definition: CpGrid.hpp:189
std::vector< cpgrid::Geometry< 3-codim, 3 > >::const_iterator GeometryIterator
The type of the iterator over the codim geometries.
Definition: CpGrid.hpp:1279
Traits associated with a specific grid partition type.
Definition: CpGrid.hpp:143
void switchToGlobalView()
Switch to the global view.
Definition: CpGrid.cpp:1662
double faceArea(int face) const
Get the area of a face.
Definition: CpGrid.cpp:1571
unsigned int numBoundarySegments() const
returns the number of boundary segments within the macro grid
Definition: CpGrid.cpp:1114
const std::vector< std::shared_ptr< Dune::cpgrid::CpGridData > > & currentData() const
Returns either data_ or distributed_data_(if non empty).
Definition: CpGrid.cpp:664
const Traits::LocalIdSet & localIdSet() const
Access to the LocalIdSet.
Definition: CpGrid.cpp:1021
const Traits::LeafIndexSet & leafIndexSet() const
Access to the LeafIndexSet.
Definition: CpGrid.cpp:1033
cpgrid::HierarchicIterator HierarchicIterator
The type of the hierarchic iterator.
Definition: CpGrid.hpp:114
GlobalIdSet LocalIdSet
The type of the local id set.
Definition: CpGrid.hpp:176
Raw corner-point specification of a particular geological model.
Definition: preprocess.h:56
cpgrid::IndexSet LeafIndexSet
The type of the leaf index set.
Definition: CpGrid.hpp:172
const Traits::LevelIndexSet & levelIndexSet(int level) const
Access to the LevelIndexSets.
Definition: CpGrid.cpp:1026
std::pair< bool, std::vector< std::pair< std::string, bool > > > loadBalance(DataHandle &data, EdgeWeightMethod method, const std::vector< cpgrid::OpmWellType > *wells, const std::unordered_map< std::string, std::set< int >> &possibleFutureConnections, bool serialPartitioning, const double *transmissibilities=nullptr, bool ownersFirst=false, bool addCornerCells=false, int overlapLayers=1, int partitionMethod=Dune::PartitionMethod::zoltanGoG, double imbalanceTol=1.1, bool allowDistributedWells=false, bool useTransToFilterOverlap=true)
Distributes this grid over the available nodes in a distributed machine.
Definition: CpGrid.hpp:953
cpgrid::GlobalIdSet GlobalIdSet
The type of the global id set.
Definition: CpGrid.hpp:174
Definition: CpGrid.hpp:99
int faceTag(const Cell2FacesRowIterator &cell_face) const
Get the cartesian tag associated with a face tag.
Definition: CpGrid.hpp:1606
int faceCell(int face, int local_index, int level=-1) const
Get the index identifying a cell attached to a face.
Definition: CpGrid.cpp:1186
The namespace Dune is the main namespace for all Dune code.
Definition: CartesianIndexMapper.hpp:9
int getMark(const cpgrid::Entity< 0 > &element) const
Return refinement mark for entity.
Definition: CpGrid.cpp:1795
Connection topologically normal to I-J plane.
Definition: preprocess.h:69
cpgrid::CpGridDataTraits::InterfaceMap InterfaceMap
The type of the map describing communication interfaces.
Definition: CpGrid.hpp:1369
const std::vector< int > & globalCell() const
Retrieve mapping from internal ("compressed") active grid cells to external ("uncompressed") cells...
Definition: CpGrid.cpp:683
Definition: Intersection.hpp:62
cpgrid::Intersection LeafIntersection
The type of the intersection at the leafs of the grid.
Definition: CpGrid.hpp:105
const std::vector< int > & sortedNumAquiferCells() const
Get sorted active cell indices of numerical aquifer.
Definition: CpGrid.cpp:1606
int size(int level, int codim) const
Number of grid entities per level and codim.
Definition: CpGrid.cpp:992
void setUniqueBoundaryIds(bool uids)
Set whether we want to have unique boundary ids.
Definition: CpGrid.cpp:759
Arbitrary non-neighbouring connection.
Definition: preprocess.h:70
Dune::GridView< DefaultLeafGridViewTraits< CpGrid > > LeafGridView
The type of the leaf grid view associated with this partition type.
Definition: CpGrid.hpp:160
const InterfaceMap & cellScatterGatherInterface() const
Get an interface for gathering/scattering data attached to cells with communication.
Definition: CpGrid.cpp:1652
bool uniqueBoundaryIds() const
Is the grid currently using unique boundary ids?
Definition: CpGrid.cpp:754
[ provides Dune::Grid ]
Definition: CpGrid.hpp:201
Traits associated with a specific grid partition type.
Definition: CpGrid.hpp:155
cpgrid::IntersectionIterator LevelIntersectionIterator
The type of the intersection iterator at the levels of the grid.
Definition: CpGrid.hpp:111
This class encapsulates geometry for vertices, intersections, and cells.
Definition: CpGridData.hpp:94
bool mark(int refCount, const cpgrid::Entity< 0 > &element, bool throwOnFailure=false)
------------— Adaptivity (begin) ------------—
Definition: CpGrid.cpp:1776
std::vector< std::unordered_map< std::size_t, std::size_t > > mapLocalCartesianIndexSetsToLeafIndexSet() const
Compute for each level grid, a map from the global_cell_[ cell index in level grid ] to the leaf inde...
Definition: CpGrid.cpp:729
Holds the implementation of the CpGrid as a pimple.
Definition: CellQuadrature.cpp:71
Struct that hods all the data needed to represent a Cpgrid.
Definition: CpGridData.hpp:117
Iterator intended to be used as LeafIterator and LevelIterator (no difference due to no adaptivity) f...
Definition: Entity.hpp:96
bool loadBalance(DataHandle &data, decltype(data.fixedSize(0, 0)) overlapLayers=1, int partitionMethod=Dune::PartitionMethod::zoltan)
Distributes this grid and data over the available nodes in a distributed machine. ...
Definition: CpGrid.hpp:1031
bool loadBalance(int overlapLayers=1, int partitionMethod=Dune::PartitionMethod::zoltan, double imbalanceTol=1.1, int level=-1)
Distributes this grid over the available nodes in a distributed machine.
Definition: CpGrid.hpp:725
const Vector & cellCentroid(int cell) const
Get the coordinates of the center of a cell.
Definition: CpGrid.cpp:1591
cpgrid::Entity< cd > Entity
The type of the entity.
Definition: CpGrid.hpp:129
Traits::template Codim< codim >::LevelIterator lend(int level) const
one past the end on this level
Use the transmissibilities as edge weights.
Definition: GridEnums.hpp:38
const Traits::GlobalIdSet & globalIdSet() const
Access to the GlobalIdSet.
Definition: CpGrid.cpp:1016
std::vector< std::array< int, 2 > > mapLeafIndexSetToLocalCartesianIndexSets() const
Reverse map: from leaf index cell to { level, local/level Cartesian index of the cell }...
Definition: CpGrid.cpp:739
int numCells(int level=-1) const
Get the number of cells.
Definition: CpGrid.cpp:1150
unsigned int overlapSize(int) const
Size of the overlap on the leaf level.
Definition: CpGrid.cpp:1092
int numVertices() const
Get The number of vertices.
Definition: CpGrid.cpp:1162
bool loadBalance(DataHandle &data, const std::vector< int > &parts, bool ownersFirst=false, bool addCornerCells=false, int overlapLayers=1)
Distributes this grid and data over the available nodes in a distributed machine. ...
Definition: CpGrid.hpp:1081
double cellCenterDepth(int cell_index) const
Get vertical position of cell center ("zcorn" average).
Definition: CpGrid.cpp:1424
CpGrid Grid
The type that implements the grid.
Definition: CpGrid.hpp:102
Traits::template Codim< codim >::LeafIterator leafbegin() const
Iterator to first leaf entity of given codim.
cpgrid::Iterator< cd, pitype > LevelIterator
The type of the iterator over the level entities of this codim on this partition. ...
Definition: CpGrid.hpp:146
Connection topologically normal to I-K plane.
Definition: preprocess.h:68
void switchToDistributedView()
Switch to the distributed view.
Definition: CpGrid.cpp:1667
CentroidIterator< 0 > beginCellCentroids() const
Get an iterator over the cell centroids positioned at the first one.
Definition: CpGrid.cpp:1596
cpgrid::IntersectionIterator LeafIntersectionIterator
The type of the intersection iterator at the leafs of the grid.
Definition: CpGrid.hpp:109
void scatterData(DataHandle &handle) const
Moves data from the global (all data on process) view to the distributed view.
Dune::cpgrid::Intersection getParentIntersectionFromLgrBoundaryFace(const Dune::cpgrid::Intersection &intersection) const
Returns the coarse-level-zero ("parent/origin") intersection of a refined intersection (face) in the ...
Definition: CpGrid.cpp:1239
CpGrid()
Default constructor.
Definition: CpGrid.cpp:166
double cellVolume(int cell) const
Get the volume of the cell.
Definition: CpGrid.cpp:1586
Traits associated with a specific codim.
Definition: CpGrid.hpp:119
void communicate(DataHandle &data, InterfaceType iftype, CommunicationDirection dir, int) const
The new communication interface.
Definition: CpGrid.hpp:1120
const InterfaceMap & pointScatterGatherInterface() const
Get an interface for gathering/scattering data attached to points with communication.
Definition: CpGrid.cpp:1657
int numFaces(int level=-1) const
Get the number of faces.
Definition: CpGrid.cpp:1156
unsigned int ghostSize(int) const
Size of the ghost cell layer on the leaf level.
Definition: CpGrid.cpp:1098
Connection topologically normal to J-K plane.
Definition: preprocess.h:67
void gatherData(DataHandle &handle) const
Moves data from the distributed view to the global (all data on process) view.
bool adapt()
Triggers the grid refinement process.
Definition: CpGrid.cpp:1812
int maxLevel() const
Return maximum level defined in this grid. Levels are 0 and 1, maxlevel = 1 (not counting leafview)...
Definition: CpGrid.cpp:769
bool loadBalanceSerial(int overlapLayers=1, int partitionMethod=Dune::PartitionMethod::zoltan, int edgeWeightMethod=Dune::EdgeWeightMethod::defaultTransEdgeWgt, double imbalanceTol=1.1, int level=-1)
Distributes this grid over the available nodes in a distributed machine.
Definition: CpGrid.hpp:758
cpgrid::Iterator< cd, All_Partition > LeafIterator
The type of the iterator over all leaf entities of this codim.
Definition: CpGrid.hpp:135
const Vector & vertexPosition(int vertex) const
Get the Position of a vertex.
Definition: CpGrid.cpp:1566
cpgrid::Entity< codim > entity(const cpgrid::Entity< codim > &seed) const
given an EntitySeed (or EntityPointer) return an entity object
Definition: CpGrid.cpp:1082
std::pair< bool, std::vector< std::pair< std::string, bool > > > loadBalance(EdgeWeightMethod method, const std::vector< cpgrid::OpmWellType > *wells, const std::unordered_map< std::string, std::set< int >> &possibleFutureConnections={}, const double *transmissibilities=nullptr, bool ownersFirst=false, bool addCornerCells=false, int overlapLayers=1, int partitionMethod=Dune::PartitionMethod::zoltanGoG, double imbalanceTol=1.1, int level=-1)
Distributes this grid over the available nodes in a distributed machine.
Definition: CpGrid.hpp:859
std::pair< bool, std::vector< std::pair< std::string, bool > > > loadBalance(const std::vector< cpgrid::OpmWellType > *wells, const std::unordered_map< std::string, std::set< int >> &possibleFutureConnections={}, const double *transmissibilities=nullptr, int overlapLayers=1, int partitionMethod=Dune::PartitionMethod::zoltanGoG, int level=-1)
Distributes this grid over the available nodes in a distributed machine.
Definition: CpGrid.hpp:811
const std::array< int, 3 > & logicalCartesianSize() const
The logical cartesian size of the global grid.
Definition: CpGrid.cpp:657
void postAdapt()
Clean up refinement markers - set every element to the mark 0 which represents &#39;doing nothing&#39;...
Definition: CpGrid.cpp:2385
Dune::GridView< DefaultLevelGridViewTraits< CpGrid > > LevelGridView
The type of the level grid view associated with this partition type.
Definition: CpGrid.hpp:158
An iterator over the centroids of the geometry of the entities.
Definition: CpGrid.hpp:1271
Only needs to provide interface for doing nothing.
Definition: Iterators.hpp:117
The global id set for Dune.
Definition: Indexsets.hpp:482
const Vector & faceNormal(int face) const
Get the unit normal of a face.
Definition: CpGrid.cpp:1581
void autoRefine(const std::array< int, 3 > &nxnynz)
Global refine the grid with different refinement factors in each direction.
Definition: CpGrid.cpp:2750
cpgrid::Iterator< cd, pitype > LeafIterator
The type of the iterator over the leaf entities of this codim on this partition.
Definition: CpGrid.hpp:148
int faceVertex(int face, int local_index) const
Get the index identifying a vertex of a face.
Definition: CpGrid.cpp:1234
const Vector & faceCentroid(int face) const
Get the coordinates of the center of a face.
Definition: CpGrid.cpp:1576
cpgrid::Geometry< 3-cd, 3 > LocalGeometry
The type of the local geometry associated with the entity.
Definition: CpGrid.hpp:126
face_tag
Connection taxonomy.
Definition: preprocess.h:66
CpGridFamily GridFamily
Family typedef, why is this not defined by Grid<>?
Definition: CpGrid.hpp:218
void syncDistributedGlobalCellIds()
Synchronizes cell global ids across processes after load balancing.
Definition: CpGrid.cpp:2530
const Dune::cpgrid::CpGridData & currentLeafData() const
Returns current view data (the leaf grid)
Definition: CpGrid.cpp:673
CentroidIterator< 1 > beginFaceCentroids() const
Get an iterator over the face centroids positioned at the first one.
Definition: CpGrid.cpp:1601
cpgrid::IndexSet LevelIndexSet
The type of the level index set.
Definition: CpGrid.hpp:170
Traits::template Codim< codim >::LeafIterator leafend() const
one past the end of the sequence of leaf entities
CentroidIterator(GeometryIterator iter)
Constructs a new iterator from an iterator over the geometries.
Definition: CpGrid.hpp:1282
cpgrid::Geometry< 3-cd, 3 > Geometry
The type of the geometry associated with the entity.
Definition: CpGrid.hpp:123
Low-level corner-point processing routines and supporting data structures.
std::pair< bool, std::vector< std::pair< std::string, bool > > > loadBalance(DataHandle &data, const std::vector< cpgrid::OpmWellType > *wells, const std::unordered_map< std::string, std::set< int >> &possibleFutureConnections={}, const double *transmissibilities=nullptr, int overlapLayers=1, int partitionMethod=1, int level=-1)
Distributes this grid and data over the available nodes in a distributed machine. ...
Definition: CpGrid.hpp:902
Represents an entity of a given codim, with positive or negative orientation.
Definition: CpGridData.hpp:96
int cellFace(int cell, int local_index, int level=-1) const
Get a specific face of a cell.
Definition: CpGrid.cpp:1174
Definition: Indexsets.hpp:56
cpgrid::Intersection LevelIntersection
The type of the intersection at the levels of the grid.
Definition: CpGrid.hpp:107
int numCellFaces() const
Get the sum of all faces attached to all cells.
Definition: CpGrid.cpp:1224
void globalRefine(int refCount, bool throwOnFailure=false)
Refine the grid refCount times using the default refinement rule.
Definition: CpGrid.cpp:1038
const CpGridTraits::Communication & comm() const
Get the collective communication object.
Definition: CpGrid.cpp:1139
bool loadBalance(const std::vector< int > &parts, bool ownersFirst=false, bool addCornerCells=false, int overlapLayers=1)
Distributes this grid over the available nodes in a distributed machine.
Definition: CpGrid.hpp:1055
void createCartesian(const std::array< int, 3 > &dims, const std::array< double, 3 > &cellsize, const std::array< int, 3 > &shift={0, 0, 0})
Create a cartesian grid.
Definition: CpGrid.cpp:585
cpgrid::CpGridDataTraits::Communication Communication
The type of the collective communication.
Definition: CpGrid.hpp:179
Definition: Intersection.hpp:275
Dune::GridView< DefaultLevelGridViewTraits< CpGrid > > LevelGridView
The type of the level grid view associated with this partition type.
Definition: CpGrid.hpp:165
std::pair< bool, std::vector< std::pair< std::string, bool > > > loadBalance(DataHandle &data, const std::vector< int > &parts, const std::vector< cpgrid::OpmWellType > *wells, const std::unordered_map< std::string, std::set< int >> &possibleFutureConnections={}, bool ownersFirst=false, bool addCornerCells=false, int overlapLayers=1)
Distributes this grid over the available nodes in a distributed machine.
Definition: CpGrid.hpp:1001
std::string name() const
Get the grid name.
Definition: CpGrid.cpp:764
std::vector< int > zoltanPartitionWithoutScatter(const std::vector< cpgrid::OpmWellType > *wells, const std::unordered_map< std::string, std::set< int >> &possibleFutureConnections, const double *transmissibilities, const int numParts, const double imbalanceTol) const
Partitions the grid using Zoltan without decomposing and distributing it among processes.
Definition: CpGrid.cpp:189
bool preAdapt()
Set mightVanish flags for elements that will be refined in the next adapt() call Need to be called af...
Definition: CpGrid.cpp:1800
A class used as a row type for OrientedEntityTable.
Definition: OrientedEntityTable.hpp:54
void processEclipseFormat(const grdecl &input_data, bool remove_ij_boundary, bool turn_normals=false, bool edge_conformal=false)
Read the Eclipse grid format (&#39;grdecl&#39;).
Definition: CpGrid.cpp:1743
void getIJK(const int c, std::array< int, 3 > &ijk) const
Extract Cartesian index triplet (i,j,k) of an active cell.
Definition: CpGrid.cpp:749
const cpgrid::OrientedEntityTable< 0, 1 >::row_type cellFaceRow(int cell) const
Get a list of indices identifying all faces of a cell.
Definition: CpGrid.cpp:1181
cpgrid::Entity< cd > EntitySeed
The type of the entity pointer for entities of this codim.
Definition: CpGrid.hpp:138
Dune::GridView< DefaultLeafGridViewTraits< CpGrid > > LeafGridView
The type of the leaf grid view associated with this partition type.
Definition: CpGrid.hpp:167
void addLgrsUpdateLeafView(const std::vector< std::array< int, 3 >> &cells_per_dim_vec, const std::vector< std::array< int, 3 >> &startIJK_vec, const std::vector< std::array< int, 3 >> &endIJK_vec, const std::vector< std::string > &lgr_name_vec, const std::vector< std::string > &lgr_parent_grid_name_vec=std::vector< std::string >{})
Create a grid out of a coarse one and (at most) 2 refinements(LGRs) of selected block-shaped disjoint...
Definition: CpGrid.cpp:2593
cpgrid::Iterator< cd, All_Partition > LevelIterator
The type of the iterator over all level entities of this codim.
Definition: CpGrid.hpp:132
EdgeWeightMethod
enum for choosing Methods for weighting graph-edges correspoding to cell interfaces in Zoltan&#39;s or Me...
Definition: GridEnums.hpp:34