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 
534  // @brief Return parent (coarse) intersection (face) of a refined face on the leaf grid view, whose neighboring cells
535  // are two: one coarse cell (equivalent to its origin cell from level 0), and one refined cell
536  // from certain LGR.
537  // Used in Transmissibility_impl.hpp
539 
560  bool mark(int refCount, const cpgrid::Entity<0>& element, bool throwOnFailure = false);
561 
565  int getMark(const cpgrid::Entity<0>& element) const;
566 
569  bool preAdapt();
570 
573  bool adapt();
574 
593  bool refineAndUpdateGrid(bool throwOnFailure,
594  const std::vector<std::array<int,3>>& cells_per_dim_vec,
595  const std::vector<int>& assignRefinedLevel,
596  const std::vector<std::string>& lgr_name_vec,
597  const std::vector<std::array<int,3>>& startIJK_vec = std::vector<std::array<int,3>>{},
598  const std::vector<std::array<int,3>>& endIJK_vec = std::vector<std::array<int,3>>{});
599 
601  void postAdapt();
603 
604  private:
605  void updateCornerHistoryLevels(const std::vector<std::vector<std::array<int,2>>>& cornerInMarkedElemWithEquivRefinedCorner,
606  const std::map<std::array<int,2>,std::array<int,2>>& elemLgrAndElemLgrCorner_to_refinedLevelAndRefinedCorner,
607  const std::unordered_map<int,std::array<int,2>>& adaptedCorner_to_elemLgrAndElemLgrCorner,
608  const int& corner_count,
609  const std::vector<std::array<int,2>>& preAdaptGrid_corner_history,
610  const int& preAdaptMaxLevel,
611  const int& newLevels);
612 
613  void globalIdsPartitionTypesLgrAndLeafGrids(const std::vector<int>& assignRefinedLevel,
614  const std::vector<std::array<int,3>>& cells_per_dim_vec,
615  const std::vector<int>& lgr_with_at_least_one_active_cell);
616 
623  void getFirstChildGlobalIds([[maybe_unused]] std::vector<int>& parentToFirstChildGlobalIds);
624  public:
631  private:
632 
645  void computeGlobalCellLgr(const int& level, const std::array<int,3>& startIJK, std::vector<int>& global_cell_lgr);
646 
650  void computeGlobalCellLeafGridViewWithLgrs(std::vector<int>& global_cell_leaf);
651 
652  private:
666  void markElemAssignLevelDetectActiveLgrs(const std::vector<std::array<int,3>>& startIJK_vec,
667  const std::vector<std::array<int,3>>& endIJK_vec,
668  std::vector<int>& assignRefinedLevel,
669  std::vector<int>& lgr_with_at_least_one_active_cell);
670 
672  void populateCellIndexSetRefinedGrid(int level);
673 
675  void populateCellIndexSetLeafGridView();
676 
678  void populateLeafGlobalIdSet();
679 
680  public:
681 
686  std::vector<std::unordered_map<std::size_t, std::size_t>> mapLocalCartesianIndexSetsToLeafIndexSet() const;
687 
689  std::vector<std::array<int,2>> mapLeafIndexSetToLocalCartesianIndexSets() const;
690 
692  unsigned int overlapSize(int) const;
693 
694 
696  unsigned int ghostSize(int) const;
697 
699  unsigned int overlapSize(int, int) const;
700 
702  unsigned int ghostSize(int, int) const;
703 
705  unsigned int numBoundarySegments() const;
706 
707  void setPartitioningParams(const std::map<std::string,std::string>& params);
708 
709  // loadbalance is not part of the grid interface therefore we skip it.
710 
720  bool loadBalance(int overlapLayers=1,
721  int partitionMethod = Dune::PartitionMethod::zoltan,
722  double imbalanceTol = 1.1,
723  int level =-1)
724  {
725  using std::get;
726  return get<0>(scatterGrid(/* edgeWeightMethod = */ defaultTransEdgeWgt,
727  /* ownersFirst = */ false,
728  /* wells = */ nullptr,
729  /* possibleFutureConnections = */ {},
730  /* serialPartitioning = */ false,
731  /* transmissibilities = */ nullptr,
732  /* addCornerCells = */ true,
733  overlapLayers,
734  partitionMethod,
735  imbalanceTol,
736  /* allowDistributedWells = */ false,
737  /* input_cell_part = */ {},
738  level));
739  }
740 
741  // loadbalance is not part of the grid interface therefore we skip it.
742 
753  bool loadBalanceSerial(int overlapLayers=1,
754  int partitionMethod = Dune::PartitionMethod::zoltan,
755  int edgeWeightMethod = Dune::EdgeWeightMethod::defaultTransEdgeWgt,
756  double imbalanceTol = 1.1,
757  int level = -1)
758  {
759  using std::get;
760  return get<0>(scatterGrid(EdgeWeightMethod(edgeWeightMethod),
761  /* ownersFirst = */ false,
762  /* wells = */ nullptr,
763  /* possibleFutureConnections = */ {},
764  /* serialPartitioning = */ true,
765  /* transmissibilities = */ nullptr,
766  /* addCornerCells = */ true,
767  overlapLayers,
768  partitionMethod,
769  imbalanceTol,
770  /* allowDistributedWells = */ false,
771  /* input_cell_part = */ {},
772  level));
773  }
774 
775  // loadbalance is not part of the grid interface therefore we skip it.
776 
805  std::pair<bool,std::vector<std::pair<std::string,bool>>>
806  loadBalance(const std::vector<cpgrid::OpmWellType> * wells,
807  const std::unordered_map<std::string, std::set<int>>& possibleFutureConnections = {},
808  const double* transmissibilities = nullptr,
809  int overlapLayers=1, int partitionMethod=Dune::PartitionMethod::zoltanGoG,
810  int level = -1)
811  {
812  return scatterGrid(defaultTransEdgeWgt, /* ownersFirst = */ false, wells, possibleFutureConnections,
813  /* serialPartitioning = */ false, transmissibilities, /* addCornerCells = */ false,
814  overlapLayers, partitionMethod, /* imbalanceTol = */ 1.1, /* allowDistributeWells = */ false,
815  /* input_cell_part = */ {}, level);
816  }
817 
818  // loadbalance is not part of the grid interface therefore we skip it.
819 
853  std::pair<bool,std::vector<std::pair<std::string,bool>>>
854  loadBalance(EdgeWeightMethod method, const std::vector<cpgrid::OpmWellType> * wells,
855  const std::unordered_map<std::string, std::set<int>>& possibleFutureConnections = {},
856  const double* transmissibilities = nullptr, bool ownersFirst=false,
857  bool addCornerCells=false, int overlapLayers=1,
858  int partitionMethod = Dune::PartitionMethod::zoltanGoG,
859  double imbalanceTol = 1.1,
860  int level = -1)
861  {
862  return scatterGrid(method, ownersFirst, wells, possibleFutureConnections, /* serialPartitioning = */ false,
863  transmissibilities, addCornerCells, overlapLayers, partitionMethod, imbalanceTol,
864  /* allowDistributeWells = */ false, /* input_cell_part = */ {}, level);
865  }
866 
895  template<class DataHandle>
896  std::pair<bool, std::vector<std::pair<std::string,bool> > >
897  loadBalance(DataHandle& data,
898  const std::vector<cpgrid::OpmWellType> * wells,
899  const std::unordered_map<std::string, std::set<int>>& possibleFutureConnections = {},
900  const double* transmissibilities = nullptr,
901  int overlapLayers=1, int partitionMethod = 1, int level =-1)
902  {
903  auto ret = loadBalance(wells, possibleFutureConnections, transmissibilities, overlapLayers, partitionMethod, level);
904  using std::get;
905  if (get<0>(ret))
906  {
907  scatterData(data);
908  }
909  return ret;
910  }
911 
946  template<class DataHandle>
947  std::pair<bool, std::vector<std::pair<std::string,bool> > >
948  loadBalance(DataHandle& data, EdgeWeightMethod method,
949  const std::vector<cpgrid::OpmWellType> * wells,
950  const std::unordered_map<std::string, std::set<int>>& possibleFutureConnections,
951  bool serialPartitioning,
952  const double* transmissibilities = nullptr, bool ownersFirst=false,
953  bool addCornerCells=false, int overlapLayers=1, int partitionMethod = Dune::PartitionMethod::zoltanGoG,
954  double imbalanceTol = 1.1,
955  bool allowDistributedWells = false)
956  {
957  auto ret = scatterGrid(method, ownersFirst, wells, possibleFutureConnections, serialPartitioning, transmissibilities,
958  addCornerCells, overlapLayers, partitionMethod, imbalanceTol, allowDistributedWells,
959  /* input_cell_parts = */ std::vector<int>{}, /* level = */ 0);
960  using std::get;
961  if (get<0>(ret))
962  {
963  scatterData(data);
964  }
965  return ret;
966  }
967 
992  template<class DataHandle>
993  std::pair<bool, std::vector<std::pair<std::string,bool> > >
994  loadBalance(DataHandle& data, const std::vector<int>& parts,
995  const std::vector<cpgrid::OpmWellType> * wells,
996  const std::unordered_map<std::string, std::set<int>>& possibleFutureConnections = {},
997  bool ownersFirst=false,
998  bool addCornerCells=false, int overlapLayers=1)
999  {
1000  using std::get;
1001  auto ret = scatterGrid(defaultTransEdgeWgt, ownersFirst, wells,
1002  possibleFutureConnections,
1003  /* serialPartitioning = */ false,
1004  /* transmissibilities = */ {},
1005  addCornerCells, overlapLayers, /* partitionMethod =*/ Dune::PartitionMethod::simple,
1006  /* imbalanceTol (ignored) = */ 0.0,
1007  /* allowDistributedWells = */ true, parts, /* level = */ 0);
1008  using std::get;
1009  if (get<0>(ret))
1010  {
1011  scatterData(data);
1012  }
1013  return ret;
1014  }
1015 
1023  template<class DataHandle>
1024  bool loadBalance(DataHandle& data,
1025  decltype(data.fixedSize(0,0)) overlapLayers=1, int partitionMethod = Dune::PartitionMethod::zoltan)
1026  {
1027  // decltype usage needed to tell the compiler not to use this function if first
1028  // argument is std::vector but rather loadbalance by parts
1029  bool ret = loadBalance(overlapLayers, partitionMethod);
1030  if (ret)
1031  {
1032  scatterData(data);
1033  }
1034  return ret;
1035  }
1036 
1048  bool loadBalance(const std::vector<int>& parts, bool ownersFirst=false,
1049  bool addCornerCells=false, int overlapLayers=1)
1050  {
1051  using std::get;
1052  return get<0>(scatterGrid(defaultTransEdgeWgt, ownersFirst, /* wells = */ {},
1053  {},
1054  /* serialPartitioning = */ false,
1055  /* trabsmissibilities = */ {},
1056  addCornerCells, overlapLayers, /* partitionMethod =*/ Dune::PartitionMethod::simple,
1057  /* imbalanceTol (ignored) = */ 0.0,
1058  /* allowDistributedWells = */ true, parts));
1059  }
1060 
1073  template<class DataHandle>
1074  bool loadBalance(DataHandle& data, const std::vector<int>& parts, bool ownersFirst=false,
1075  bool addCornerCells=false, int overlapLayers=1)
1076  {
1077  bool ret = loadBalance(parts, ownersFirst, addCornerCells, overlapLayers);
1078  if (ret)
1079  {
1080  scatterData(data);
1081  }
1082  return ret;
1083  }
1084 
1098  std::vector<int>
1099  zoltanPartitionWithoutScatter(const std::vector<cpgrid::OpmWellType>* wells,
1100  const std::unordered_map<std::string, std::set<int>>& possibleFutureConnections,
1101  const double* transmissibilities,
1102  const int numParts,
1103  const double imbalanceTol) const;
1104 
1112  template<class DataHandle>
1113  void communicate (DataHandle& data, InterfaceType iftype, CommunicationDirection dir, int /*level*/) const
1114  {
1115  communicate(data, iftype, dir);
1116  }
1117 
1125  template<class DataHandle>
1126  void communicate (DataHandle& data, InterfaceType iftype, CommunicationDirection dir) const;
1127 
1129  const typename CpGridTraits::Communication& comm () const;
1131 
1132  // ------------ End of Dune interface, start of simplified interface --------------
1133 
1139 
1140  // enum { dimension = 3 }; // already defined
1141 
1142  typedef Dune::FieldVector<double, 3> Vector;
1143 
1144 
1145  const std::vector<double>& zcornData() const;
1146 
1147 
1148  // Topology
1153  int numCells(int level = -1) const;
1154 
1159  int numFaces(int level = -1) const;
1160 
1162  int numVertices() const;
1163 
1164 
1173  int numCellFaces(int cell, int level = -1) const;
1174 
1181  int cellFace(int cell, int local_index, int level = -1) const;
1182 
1186 
1206  int faceCell(int face, int local_index, int level = -1) const;
1207 
1214  int numCellFaces() const;
1215 
1216  int numFaceVertices(int face) const;
1217 
1222  int faceVertex(int face, int local_index) const;
1223 
1226  double cellCenterDepth(int cell_index) const;
1227 
1228 
1229  const Vector faceCenterEcl(int cell_index, int face, const Dune::cpgrid::Intersection& intersection) const;
1230 
1231  const Vector faceAreaNormalEcl(int face) const;
1232 
1233 
1234  // Geometry
1238  const Vector& vertexPosition(int vertex) const;
1239 
1242  double faceArea(int face) const;
1243 
1246  const Vector& faceCentroid(int face) const;
1247 
1251  const Vector& faceNormal(int face) const;
1252 
1255  double cellVolume(int cell) const;
1256 
1259  const Vector& cellCentroid(int cell) const;
1260 
1263  template<int codim>
1265  : public RandomAccessIteratorFacade<CentroidIterator<codim>,
1266  FieldVector<double, 3>,
1267  const FieldVector<double, 3>&, int>
1268  {
1269  public:
1271  typedef typename std::vector<cpgrid::Geometry<3-codim, 3> >::const_iterator
1276  : iter_(iter)
1277  {}
1278 
1279  const FieldVector<double,3>& dereference() const
1280  {
1281  return iter_->center();
1282  }
1283  void increment()
1284  {
1285  ++iter_;
1286  }
1287  const FieldVector<double,3>& elementAt(int n)
1288  {
1289  return iter_[n]->center();
1290  }
1291  void advance(int n){
1292  iter_+=n;
1293  }
1294  void decrement()
1295  {
1296  --iter_;
1297  }
1298  int distanceTo(const CentroidIterator& o)
1299  {
1300  return o-iter_;
1301  }
1302  bool equals(const CentroidIterator& o) const{
1303  return o==iter_;
1304  }
1305  private:
1307  GeometryIterator iter_;
1308  };
1309 
1311  CentroidIterator<0> beginCellCentroids() const;
1312 
1314  CentroidIterator<1> beginFaceCentroids() const;
1315 
1316  // Extra
1317  int boundaryId(int face) const;
1318 
1325  template<class Cell2FacesRowIterator>
1326  int
1327  faceTag(const Cell2FacesRowIterator& cell_face) const;
1328 
1330 
1331  // ------------ End of simplified interface --------------
1332 
1333  //------------- methods not in the DUNE grid interface.
1334 
1339 
1340  template<class DataHandle>
1350  void scatterData(DataHandle& handle) const;
1351 
1358  template<class DataHandle>
1359  void gatherData(DataHandle& handle) const;
1360 
1362  using InterfaceMap = cpgrid::CpGridDataTraits::InterfaceMap;
1363 
1393 
1397 
1399  void switchToGlobalView();
1400 
1402  void switchToDistributedView();
1404 
1405 #if HAVE_MPI
1406  using ParallelIndexSet = cpgrid::CpGridDataTraits::ParallelIndexSet;
1409  using RemoteIndices = cpgrid::CpGridDataTraits::RemoteIndices;
1410 
1412  using CommunicationType = cpgrid::CpGridDataTraits::CommunicationType;
1413 
1417  const CommunicationType& cellCommunication() const;
1418 
1419  ParallelIndexSet& getCellIndexSet();
1420 
1421  RemoteIndices& getCellRemoteIndices();
1422 
1423  const ParallelIndexSet& getCellIndexSet() const;
1424 
1425  const RemoteIndices& getCellRemoteIndices() const;
1426 #endif
1427 
1429  const std::vector<int>& sortedNumAquiferCells() const;
1430 
1431  private:
1463  std::pair<bool, std::vector<std::pair<std::string,bool> > >
1464  scatterGrid(EdgeWeightMethod method,
1465  bool ownersFirst,
1466  const std::vector<cpgrid::OpmWellType> * wells,
1467  const std::unordered_map<std::string, std::set<int>>& possibleFutureConnections,
1468  bool serialPartitioning,
1469  const double* transmissibilities,
1470  bool addCornerCells,
1471  int overlapLayers,
1472  int partitionMethod = Dune::PartitionMethod::zoltanGoG,
1473  double imbalanceTol = 1.1,
1474  bool allowDistributedWells = true,
1475  const std::vector<int>& input_cell_part = {},
1476  int level = -1);
1477 
1482  std::vector<std::shared_ptr<cpgrid::CpGridData>> data_;
1484  std::vector<std::shared_ptr<cpgrid::CpGridData>> distributed_data_;
1486  std::vector<std::shared_ptr<cpgrid::CpGridData>>* current_data_;
1488  std::map<std::string,int> lgr_names_ = {{"GLOBAL", 0}};
1494  std::shared_ptr<InterfaceMap> cell_scatter_gather_interfaces_;
1495  /*
1496  * @brief Interface for scattering and gathering point data.
1497  *
1498  * @warning Will only update owner cells
1499  */
1500  std::shared_ptr<InterfaceMap> point_scatter_gather_interfaces_;
1504  std::shared_ptr<cpgrid::GlobalIdSet> global_id_set_ptr_;
1505 
1506 
1510  std::map<std::string,std::string> partitioningParams;
1511 
1512  }; // end Class CpGrid
1513 
1514 } // end namespace Dune
1515 
1516 #include <opm/grid/cpgrid/Entity.hpp>
1517 #include <opm/grid/cpgrid/Iterators.hpp>
1518 #include <opm/grid/cpgrid/CpGridData.hpp>
1519 
1520 
1521 namespace Dune
1522 {
1523 
1524  namespace Capabilities
1525  {
1527  template <>
1528  struct hasEntity<CpGrid, 0>
1529  {
1530  static const bool v = true;
1531  };
1532 
1534  template <>
1535  struct hasEntity<CpGrid, 3>
1536  {
1537  static const bool v = true;
1538  };
1539 
1540  template<>
1541  struct canCommunicate<CpGrid,0>
1542  {
1543  static const bool v = true;
1544  };
1545 
1546  template<>
1547  struct canCommunicate<CpGrid,3>
1548  {
1549  static const bool v = true;
1550  };
1551 
1553  template <>
1554  struct hasBackupRestoreFacilities<CpGrid>
1555  {
1556  static const bool v = false;
1557  };
1558 
1559  }
1560 
1561  template<class DataHandle>
1562  void CpGrid::communicate (DataHandle& data, InterfaceType iftype, CommunicationDirection dir) const
1563  {
1564  current_data_->back()->communicate(data, iftype, dir);
1565  }
1566 
1567 
1568  template<class DataHandle>
1569  void CpGrid::scatterData([[maybe_unused]] DataHandle& handle) const
1570  {
1571 #if HAVE_MPI
1572  if (distributed_data_.empty()) {
1573  OPM_THROW(std::runtime_error, "Moving Data only allowed with a load balanced grid!");
1574  } else {
1575  distributed_data_[0]->scatterData(handle, data_[0].get(),
1576  distributed_data_[0].get(),
1579  }
1580 #endif
1581  }
1582 
1583  template<class DataHandle>
1584  void CpGrid::gatherData([[maybe_unused]] DataHandle& handle) const
1585  {
1586 #if HAVE_MPI
1587  if (distributed_data_.empty()) {
1588  OPM_THROW(std::runtime_error, "Moving Data only allowed with a load balance grid!");
1589  } else {
1590  distributed_data_[0]->gatherData(handle, data_[0].get(), distributed_data_[0].get());
1591  }
1592 #endif
1593  }
1594 
1595 
1596  template<class Cell2FacesRowIterator>
1597  int
1598  CpGrid::faceTag(const Cell2FacesRowIterator& cell_face) const
1599  {
1600  // Note that this relies on the following implementation detail:
1601  // The grid is always constructed such that the interior faces constructed
1602  // with orientation set to true are
1603  // oriented along the positive IJK direction. Oriented means that
1604  // the first cell attached to face has the lower index.
1605  // For faces along the boundary (only one cell, always attached at index 0)
1606  // the orientation has to be determined by the orientation of the cell.
1607  // If it is true then in UnstructuredGrid it would be stored at index 0,
1608  // otherwise at index 1.
1609  const int cell = cell_face.getCellIndex();
1610  const int face = *cell_face;
1611  assert (0 <= cell); assert (cell < numCells());
1612  assert (0 <= face); assert (face < numFaces());
1613 
1615 
1616  const cpgrid::EntityRep<1> f(face, true);
1617  const F2C& f2c = current_data_->back()->face_to_cell_[f];
1618  const face_tag tag = current_data_->back()->face_tag_[f];
1619 
1620  assert ((f2c.size() == 1) || (f2c.size() == 2));
1621 
1622  int inside_cell = 0;
1623 
1624  if ( f2c.size() == 2 ) // Two cells => interior
1625  {
1626  if ( f2c[1].index() == cell )
1627  {
1628  inside_cell = 1;
1629  }
1630  }
1631  const bool normal_is_in = ! f2c[inside_cell].orientation();
1632 
1633  switch (tag) {
1634  case I_FACE:
1635  // LEFT : RIGHT
1636  return normal_is_in ? 0 : 1; // min(I) : max(I)
1637  case J_FACE:
1638  // BACK : FRONT
1639  return normal_is_in ? 2 : 3; // min(J) : max(J)
1640  case K_FACE:
1641  // Note: TOP at min(K) as 'z' measures *depth*.
1642  // TOP : BOTTOM
1643  return normal_is_in ? 4 : 5; // min(K) : max(K)
1644  case NNC_FACE:
1645  // For nnc faces we return the otherwise unused value -1.
1646  return -1;
1647  default:
1648  OPM_THROW(std::logic_error, "Unhandled face tag. This should never happen!");
1649  }
1650  }
1651 
1652  template<int dim>
1653  cpgrid::Entity<dim> createEntity(const CpGrid&, int, bool);
1654 
1655 } // namespace Dune
1656 
1657 #include <opm/grid/cpgrid/PersistentContainer.hpp>
1658 #include <opm/grid/cpgrid/CartesianIndexMapper.hpp>
1659 #include "cpgrid/Intersection.hpp"
1660 #include "cpgrid/Geometry.hpp"
1661 #include "cpgrid/Indexsets.hpp"
1662 
1663 #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:1845
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:1272
Traits associated with a specific grid partition type.
Definition: CpGrid.hpp:143
void switchToGlobalView()
Switch to the global view.
Definition: CpGrid.cpp:1660
double faceArea(int face) const
Get the area of a face.
Definition: CpGrid.cpp:1569
unsigned int numBoundarySegments() const
returns the number of boundary segments within the macro grid
Definition: CpGrid.cpp:1112
const std::vector< std::shared_ptr< Dune::cpgrid::CpGridData > > & currentData() const
Returns either data_ or distributed_data_(if non empty).
Definition: CpGrid.cpp:662
const Traits::LocalIdSet & localIdSet() const
Access to the LocalIdSet.
Definition: CpGrid.cpp:1019
const Traits::LeafIndexSet & leafIndexSet() const
Access to the LeafIndexSet.
Definition: CpGrid.cpp:1031
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:1024
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:1598
int faceCell(int face, int local_index, int level=-1) const
Get the index identifying a cell attached to a face.
Definition: CpGrid.cpp:1184
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:1793
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:1362
const std::vector< int > & globalCell() const
Retrieve mapping from internal ("compressed") active grid cells to external ("uncompressed") cells...
Definition: CpGrid.cpp:681
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:1604
int size(int level, int codim) const
Number of grid entities per level and codim.
Definition: CpGrid.cpp:990
void setUniqueBoundaryIds(bool uids)
Set whether we want to have unique boundary ids.
Definition: CpGrid.cpp:757
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:1650
bool uniqueBoundaryIds() const
Is the grid currently using unique boundary ids?
Definition: CpGrid.cpp:752
[ 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:1774
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:727
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:1024
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:720
const Vector & cellCentroid(int cell) const
Get the coordinates of the center of a cell.
Definition: CpGrid.cpp:1589
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:1014
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:737
int numCells(int level=-1) const
Get the number of cells.
Definition: CpGrid.cpp:1148
unsigned int overlapSize(int) const
Size of the overlap on the leaf level.
Definition: CpGrid.cpp:1090
int numVertices() const
Get The number of vertices.
Definition: CpGrid.cpp:1160
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:1074
double cellCenterDepth(int cell_index) const
Get vertical position of cell center ("zcorn" average).
Definition: CpGrid.cpp:1422
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:1665
CentroidIterator< 0 > beginCellCentroids() const
Get an iterator over the cell centroids positioned at the first one.
Definition: CpGrid.cpp:1594
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
Definition: CpGrid.cpp:1237
CpGrid()
Default constructor.
Definition: CpGrid.cpp:166
double cellVolume(int cell) const
Get the volume of the cell.
Definition: CpGrid.cpp:1584
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:1113
const InterfaceMap & pointScatterGatherInterface() const
Get an interface for gathering/scattering data attached to points with communication.
Definition: CpGrid.cpp:1655
int numFaces(int level=-1) const
Get the number of faces.
Definition: CpGrid.cpp:1154
unsigned int ghostSize(int) const
Size of the ghost cell layer on the leaf level.
Definition: CpGrid.cpp:1096
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)
Distributes this grid over the available nodes in a distributed machine.
Definition: CpGrid.hpp:948
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:1810
int maxLevel() const
Return maximum level defined in this grid. Levels are 0 and 1, maxlevel = 1 (not counting leafview)...
Definition: CpGrid.cpp:767
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:753
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:1564
cpgrid::Entity< codim > entity(const cpgrid::Entity< codim > &seed) const
given an EntitySeed (or EntityPointer) return an entity object
Definition: CpGrid.cpp:1080
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:854
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:806
const std::array< int, 3 > & logicalCartesianSize() const
The logical cartesian size of the global grid.
Definition: CpGrid.cpp:655
void postAdapt()
Clean up refinement markers - set every element to the mark 0 which represents &#39;doing nothing&#39;...
Definition: CpGrid.cpp:2383
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:1264
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:1579
void autoRefine(const std::array< int, 3 > &nxnynz)
Global refine the grid with different refinement factors in each direction.
Definition: CpGrid.cpp:2748
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:1232
const Vector & faceCentroid(int face) const
Get the coordinates of the center of a face.
Definition: CpGrid.cpp:1574
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:2528
const Dune::cpgrid::CpGridData & currentLeafData() const
Returns current view data (the leaf grid)
Definition: CpGrid.cpp:671
CentroidIterator< 1 > beginFaceCentroids() const
Get an iterator over the face centroids positioned at the first one.
Definition: CpGrid.cpp:1599
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:1275
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:897
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:1172
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:1222
void globalRefine(int refCount, bool throwOnFailure=false)
Refine the grid refCount times using the default refinement rule.
Definition: CpGrid.cpp:1036
const CpGridTraits::Communication & comm() const
Get the collective communication object.
Definition: CpGrid.cpp:1137
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:1048
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:583
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:994
std::string name() const
Get the grid name.
Definition: CpGrid.cpp:762
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:1798
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:1741
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:747
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:1179
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:2591
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