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 if (transmissibilities_) {
219 double min_val = std::numeric_limits<float>::max();
222 double trans = transmissibilities_[face];
229 log_min_ = std::log(min_val);
237 GraphType wellsGraph_;
238 const double* transmissibilities_;
239 int edgeWeightsMethod_;
240 WellConnections well_indices_;
248template<
typename ID,
typename weightType>
256void setCpGridZoltanGraphFunctions(Zoltan_Struct *zz,
const Dune::CpGrid& grid,
257 bool pretendNull=
false);
259void setCpGridZoltanGraphFunctions(Zoltan_Struct *zz,
[ provides Dune::Grid ]
Definition CpGrid.hpp:198
int numFaces(int level=-1) const
Get the number of faces.
Definition CpGrid.cpp:1154
int numCells(int level=-1) const
Get the number of cells.
Definition CpGrid.cpp:1148
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
void fillNBORGIDAndWeightsForSpecificCellAndIncrementNeighborCounterForGridWithWells(const CombinedGridWellGraph &graph, const int localCellId, ID globalID, int &neighborCounter, ID &nborGID, weightType *ewgts)
Get the list of edges and weights for one cell of a grid with wells.
int getNumberOfEdgesForSpecificCellForGridWithWells(const CombinedGridWellGraph &graph, int localCellId)
Get the number of edges of the graph of the grid and the wells for one cell.
The namespace Dune is the main namespace for all Dune code.
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