21#ifndef DUNE_CPGRID_ZOLTAN_GRAPH_FUNCTIONS_HEADER
22#define DUNE_CPGRID_ZOLTAN_GRAPH_FUNCTIONS_HEADER
24#include <opm/grid/utility/OpmWellType.hpp>
26#include <opm/grid/CpGrid.hpp>
27#include <opm/grid/common/WellConnections.hpp>
29#if defined(HAVE_ZOLTAN) && defined(HAVE_MPI)
48inline int getCpGridNumCells(
void* cpGridPointer,
int* err)
56void getCpGridVertexList(
void* cpGridPointer,
int numGlobalIds,
57 int numLocalIds, ZOLTAN_ID_PTR gids,
58 ZOLTAN_ID_PTR lids,
int wgtDim,
59 float *objWgts,
int *err);
62int getNumberOfEdgesForSpecificCell(
const Dune::CpGrid& grid,
int localCellId);
65void getCpGridNumEdgesList(
void *cpGridPointer,
int sizeGID,
int sizeLID,
67 ZOLTAN_ID_PTR globalID, ZOLTAN_ID_PTR localID,
68 int *numEdges,
int *err);
72void fillNBORGIDForSpecificCellAndIncrementNeighborCounter(
const Dune::CpGrid& grid,
int localCellId, ID globalID,
int& neighborCounter, ID& nborGID);
75void getCpGridEdgeList(
void *cpGridPointer,
int sizeGID,
int sizeLID,
76 int numCells, ZOLTAN_ID_PTR globalID, ZOLTAN_ID_PTR localID,
78 ZOLTAN_ID_PTR nborGID,
int *nborProc,
79 int wgt_dim,
float *ewgts,
int *err);
82void getNullVertexList(
void* cpGridPointer,
int numGlobalIds,
83 int numLocalIds, ZOLTAN_ID_PTR gids,
84 ZOLTAN_ID_PTR lids,
int wgtDim,
85 float *objWgts,
int *err);
88void getNullNumEdgesList(
void *cpGridPointer,
int sizeGID,
int sizeLID,
90 ZOLTAN_ID_PTR globalID, ZOLTAN_ID_PTR localID,
91 int *numEdges,
int *err);
94void getNullEdgeList(
void *cpGridPointer,
int sizeGID,
int sizeLID,
95 int numCells, ZOLTAN_ID_PTR globalID, ZOLTAN_ID_PTR localID,
97 ZOLTAN_ID_PTR nborGID,
int *nborProc,
98 int wgt_dim,
float *ewgts,
int *err);
103inline int getNullNumCells(
void* cpGridPointer,
int* err)
105 (void) cpGridPointer;
111void getCpGridWellsNumEdgesList(
void *cpGridWellsPointer,
int sizeGID,
int sizeLID,
113 ZOLTAN_ID_PTR globalID, ZOLTAN_ID_PTR localID,
114 int *numEdges,
int *err);
117void getCpGridWellsEdgeList(
void *cpGridWellsPointer,
int sizeGID,
int sizeLID,
118 int numCells, ZOLTAN_ID_PTR globalID, ZOLTAN_ID_PTR localID,
120 ZOLTAN_ID_PTR nborGID,
int *nborProc,
121 int wgt_dim,
float *ewgts,
int *err);
140 typedef std::vector<std::set<int> > GraphType;
152 const std::vector<OpmWellType> * wells,
153 const std::unordered_map<std::string, std::set<int>>& possibleFutureConnections,
154 const double* transmissibilities,
155 bool pretendEmptyGrid,
164 const GraphType& getWellsGraph()
const
169 double transmissibility(
int face_index)
const
171 return transmissibilities_ ? (1.0e18*transmissibilities_[face_index]) : 1;
174 double logTransmissibilityWeights(
int face_index)
const
176 double trans = transmissibilities_ ? transmissibilities_[face_index] : 1;
177 return trans == 0.0 ? 0.0 : 1.0 + std::log(trans) - log_min_;
180 const WellConnections& getWellConnections()
const
182 return well_indices_;
185 double edgeWeight(
int face_index)
const
190 return transmissibility(face_index);
192 return logTransmissibilityWeights(face_index);
198 void addCompletionSetToGraph()
200 for(
const auto& well_indices: well_indices_)
202 for(
auto well_idx = well_indices.begin(); well_idx != well_indices.end();
205 auto well_idx2 = well_idx;
206 for( ++well_idx2; well_idx2 != well_indices.end();
209 wellsGraph_[*well_idx].insert(*well_idx2);
210 wellsGraph_[*well_idx2].insert(*well_idx);
216 void findMaxMinTrans()
218 double min_val = std::numeric_limits<float>::max();
220 if (transmissibilities_) {
223 double trans = transmissibilities_[face];
230 log_min_ = std::log(min_val);
238 GraphType wellsGraph_;
239 const double* transmissibilities_;
240 int edgeWeightsMethod_;
241 WellConnections well_indices_;
246int getNumberOfEdgesForSpecificCellForGridWithWells(
const CombinedGridWellGraph& graph,
int localCellId);
249template<
typename ID,
typename weightType>
250void fillNBORGIDAndWeightsForSpecificCellAndIncrementNeighborCounterForGridWithWells(
const CombinedGridWellGraph& graph,
const int localCellId, ID globalID,
int& neighborCounter, ID& nborGID, weightType *ewgts);
257void setCpGridZoltanGraphFunctions(Zoltan_Struct *zz,
const Dune::CpGrid& grid,
258 bool pretendNull=
false);
260void setCpGridZoltanGraphFunctions(Zoltan_Struct *zz,
261 const CombinedGridWellGraph& graph,
[ provides Dune::Grid ]
Definition CpGrid.hpp:201
int numCells() const
Get the number of cells.
Definition CpGrid.cpp:1083
int numFaces() const
Get the number of faces.
Definition CpGrid.cpp:1088
A graph repesenting a grid together with the well completions.
Definition ZoltanGraphFunctions.hpp:138
CombinedGridWellGraph(const Dune::CpGrid &grid, const std::vector< OpmWellType > *wells, const std::unordered_map< std::string, std::set< int > > &possibleFutureConnections, const double *transmissibilities, bool pretendEmptyGrid, EdgeWeightMethod edgeWeightsMethod)
Create a graph representing a grid together with the wells.
const Dune::CpGrid & getGrid() const
Access the grid.
Definition ZoltanGraphFunctions.hpp:159
Copyright 2019 Equinor AS.
Definition CartesianIndexMapper.hpp:10
EdgeWeightMethod
enum for choosing Methods for weighting graph-edges correspoding to cell interfaces in Zoltan's or Me...
Definition GridEnums.hpp:34
@ defaultTransEdgeWgt
Use the transmissibilities as edge weights.
Definition GridEnums.hpp:38
@ logTransEdgeWgt
Use the log of the transmissibilities as edge weights.
Definition GridEnums.hpp:40
@ uniformEdgeWgt
All edge have a uniform weight of 1.
Definition GridEnums.hpp:36