Transmissibility.hpp
Go to the documentation of this file.
1// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2// vi: set et ts=4 sw=4 sts=4:
3/*
4 This file is part of the Open Porous Media project (OPM).
5
6 OPM is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 2 of the License, or
9 (at your option) any later version.
10
11 OPM is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with OPM. If not, see <http://www.gnu.org/licenses/>.
18
19 Consult the COPYING file in the top-level source directory of this
20 module for the precise wording of the license and the list of
21 copyright holders.
22*/
28#ifndef OPM_TRANSMISSIBILITY_HPP
29#define OPM_TRANSMISSIBILITY_HPP
30
31#include <dune/common/fvector.hh>
32#include <dune/common/fmatrix.hh>
33
34#include <opm/grid/common/CartesianIndexMapper.hpp>
35#include <opm/grid/LookUpData.hh>
36
37
38#include <array>
39#include <functional>
40#include <map>
41#include <cstdint>
42#include <string>
43#include <unordered_map>
44#include <vector>
45
46namespace Opm {
47
48class KeywordLocation;
49class EclipseState;
50struct NNCdata;
51class TransMult;
52
53
54template<class Grid, class GridView, class ElementMapper, class CartesianIndexMapper, class Scalar>
56 // Grid and world dimension
57 enum { dimWorld = GridView::dimensionworld };
58public:
59
60 using DimMatrix = Dune::FieldMatrix<Scalar, dimWorld, dimWorld>;
61 using DimVector = Dune::FieldVector<Scalar, dimWorld>;
62
63 Transmissibility(const EclipseState& eclState,
64 const GridView& gridView,
65 const CartesianIndexMapper& cartMapper,
66 const Grid& grid,
67 std::function<std::array<double,dimWorld>(int)> centroids,
68 bool enableEnergy,
69 bool enableDiffusivity,
70 bool enableDispersivity);
71
75 const DimMatrix& permeability(unsigned elemIdx) const
76 { return permeability_[elemIdx]; }
77
81 Scalar transmissibility(unsigned elemIdx1, unsigned elemIdx2) const;
82
86 Scalar transmissibilityBoundary(unsigned elemIdx, unsigned boundaryFaceIdx) const;
87
102 Scalar thermalHalfTrans(unsigned insideElemIdx, unsigned outsideElemIdx) const;
103
112 Scalar halfTransmissibility(unsigned insideElemIdx, unsigned outsideElemIdx) const;
113
116 void setStoreHalfTrans(bool yesno)
117 { storeHalfTrans_ = yesno; }
118
119 bool storeHalfTrans() const
120 { return storeHalfTrans_; }
121
122 Scalar thermalHalfTransBoundary(unsigned insideElemIdx, unsigned boundaryFaceIdx) const;
123
124 const std::map<std::pair<unsigned, unsigned>, Scalar>& getThermalHalfTransBoundary() const;
125
129 Scalar diffusivity(unsigned elemIdx1, unsigned elemIdx2) const;
130
134 Scalar dispersivity(unsigned elemIdx1, unsigned elemIdx2) const;
135
150 void finishInit(const std::function<unsigned int(unsigned int)>& map = {})
151 {
152 this->update(true, TransUpdateQuantities::All, map, /*applyNncMultRegT = */ true);
153 }
154
178 enum class TransUpdateQuantities { Trans, All };
179 void update(bool global, TransUpdateQuantities update_quantities = TransUpdateQuantities::All,
180 const std::function<unsigned int(unsigned int)>& map = {}, bool applyNncMultRegT = false);
181
182protected:
183 void updateFromEclState_(bool global);
184
185 void removeNonCartesianTransmissibilities_(bool removeAll);
186
187 struct FaceInfo
188 {
191 unsigned elemIdx;
192 unsigned cartElemIdx;
193 };
194
202 void applyAllZMultipliers_(Scalar& trans,
203 const FaceInfo& inside,
204 const FaceInfo& outside,
205 const TransMult& transMult,
206 const std::array<int, dimWorld>& cartDims);
207
212 std::array<std::vector<double>,3>
213 createTransmissibilityArrays_(const std::array<bool,3>& is_tran);
214
219 void resetTransmissibilityFromArrays_(const std::array<bool,3>& is_tran,
220 const std::array<std::vector<double>,3>& trans);
221
222 template <class Intersection>
223 void computeFaceProperties(const Intersection& intersection,
224 FaceInfo& inside,
225 FaceInfo& outside,
226 DimVector& faceAreaNormal,
227 /*isCpGrid=*/std::false_type) const;
228
229 template <class Intersection>
230 void computeFaceProperties(const Intersection& intersection,
231 FaceInfo& inside,
232 FaceInfo& outside,
233 DimVector& faceAreaNormal,
234 /*isCpGrid=*/std::true_type) const;
235
236 /*
237 * \brief Applies additional transmissibilities specified via NNC keyword.
238 *
239 * Applies only those NNC that are actually represented by the grid. These may
240 * NNCs due to faults or NNCs that are actually neighbours. In both cases that
241 * specified transmissibilities (scaled by EDITNNC) will be added to the already
242 * existing models.
243 *
244 * \param cartesianToCompressed Vector containing the compressed index (or -1 for inactive
245 * cells) as the element at the cartesian index.
246 * \return Nothing.
247 */
248 void applyNncToGridTrans_(const std::unordered_map<std::size_t,int>& cartesianToCompressed);
249
255 void applyPinchNncToGridTrans_(const std::unordered_map<std::size_t,int>& cartesianToCompressed,
256 bool applyNncMultregT);
257
259 void applyEditNncToGridTrans_(const std::unordered_map<std::size_t,int>& globalToLocal);
260
262 void applyEditNncrToGridTrans_(const std::unordered_map<std::size_t,int>& globalToLocal);
263
264 void applyNncMultreg_(const std::unordered_map<std::size_t,int>& globalToLocal);
265
266 void applyEditNncToGridTransHelper_(const std::unordered_map<std::size_t,int>& globalToLocal,
267 const std::string& keyword, const std::vector<NNCdata>& nncs,
268 const std::function<KeywordLocation(const NNCdata&)>& getLocation,
269 const std::function<void(Scalar&, const Scalar&)>& apply);
270
272
273 void extractPermeability_(const std::function<unsigned int(unsigned int)>& map);
274
275 void extractPorosity_();
276
277 void extractDispersion_();
278
279 static Scalar computeHalfTrans_(const DimVector& areaNormal,
280 int faceIdx, // in the reference element that contains the intersection
281 const DimVector& distance,
282 const DimMatrix& perm);
283
284 static Scalar computeHalfDiffusivity_(const DimVector& areaNormal,
285 const DimVector& distance,
286 const Scalar poro);
287
288 DimVector distanceVector_(const DimVector& faceCenter,
289 const unsigned& cellIdx) const;
290
291 void applyMultipliers_(Scalar& trans,
292 unsigned faceIdx,
293 unsigned cartElemIdx,
294 const TransMult& transMult) const;
295
296 static void applyNtg_(Scalar& trans,
297 const FaceInfo& face,
298 const std::vector<double>& ntg);
299
302 Scalar lookupTrans_(const std::unordered_map<std::uint64_t, Scalar>& map,
303 unsigned elemIdx1, unsigned elemIdx2,
304 std::string_view what) const;
305
307 std::string describeCell_(unsigned elemIdx) const;
308
310 bool gridJoins_(unsigned elemIdx1, unsigned elemIdx2) const;
311
312 std::vector<DimMatrix> permeability_;
313 std::vector<Scalar> porosity_;
314 std::vector<Scalar> dispersion_;
315 std::unordered_map<std::uint64_t, Scalar> trans_;
316 const EclipseState& eclState_;
317 const GridView& gridView_;
318 const CartesianIndexMapper& cartMapper_;
319 const Grid& grid_;
320 std::function<std::array<double,dimWorld>(int)> centroids_;
321 std::vector<std::array<double,dimWorld>> centroids_cache_;
323 std::map<std::pair<unsigned, unsigned>, Scalar> transBoundary_;
324 std::map<std::pair<unsigned, unsigned>, Scalar> thermalHalfTransBoundary_;
328 bool warnEditNNC_ = true;
329 std::unordered_map<std::uint64_t, Scalar> thermalHalfTrans_; //NB this is based on direction map size is ca 2*trans_ (diffusivity_)
330 std::unordered_map<std::uint64_t, Scalar> halfTrans_; // directional, only filled when storeHalfTrans_
331 bool storeHalfTrans_ = false;
332 std::unordered_map<std::uint64_t, Scalar> diffusivity_;
333 std::unordered_map<std::uint64_t, Scalar> dispersivity_;
334
337};
338
339namespace details {
340 std::uint64_t isId(std::uint32_t elemIdx1, std::uint32_t elemIdx2);
341 std::pair<std::uint32_t, std::uint32_t> isIdReverse(const std::uint64_t& id);
342 std::uint64_t directionalIsId(std::uint32_t elemIdx1, std::uint32_t elemIdx2);
343}
344
345} // namespace Opm
346
347#endif // OPM_TRANSMISSIBILITY_HPP
Definition: GenericThresholdPressure.hpp:40
Definition: FlowGenericProblem.hpp:51
Definition: Transmissibility.hpp:55
void applyMultipliers_(Scalar &trans, unsigned faceIdx, unsigned cartElemIdx, const TransMult &transMult) const
Definition: Transmissibility_impl.hpp:1551
std::function< std::array< double, dimWorld >(int)> centroids_
Definition: Transmissibility.hpp:320
Scalar diffusivity(unsigned elemIdx1, unsigned elemIdx2) const
Return the diffusivity for the intersection between two elements.
Definition: Transmissibility_impl.hpp:283
const CartesianIndexMapper & cartMapper_
Definition: Transmissibility.hpp:318
bool enableDispersivity_
Definition: Transmissibility.hpp:327
bool enableDiffusivity_
Definition: Transmissibility.hpp:326
std::unordered_map< std::uint64_t, Scalar > dispersivity_
Definition: Transmissibility.hpp:333
std::vector< Scalar > dispersion_
Definition: Transmissibility.hpp:314
bool warnEditNNC_
Definition: Transmissibility.hpp:328
void applyEditNncToGridTrans_(const std::unordered_map< std::size_t, int > &globalToLocal)
Multiplies the grid transmissibilities according to EDITNNC.
Definition: Transmissibility_impl.hpp:1346
void computeFaceProperties(const Intersection &intersection, FaceInfo &inside, FaceInfo &outside, DimVector &faceAreaNormal, std::false_type) const
Definition: Transmissibility_impl.hpp:1149
std::map< std::pair< unsigned, unsigned >, Scalar > transBoundary_
Definition: Transmissibility.hpp:323
Dune::FieldMatrix< Scalar, dimWorld, dimWorld > DimMatrix
Definition: Transmissibility.hpp:60
const LookUpCartesianData< Grid, GridView > lookUpCartesianData_
Definition: Transmissibility.hpp:336
void update(bool global, TransUpdateQuantities update_quantities=TransUpdateQuantities::All, const std::function< unsigned int(unsigned int)> &map={}, bool applyNncMultRegT=false)
Definition: Transmissibility_impl.hpp:303
DimVector distanceVector_(const DimVector &faceCenter, const unsigned &cellIdx) const
Definition: Transmissibility_impl.hpp:1536
bool enableEnergy_
Definition: Transmissibility.hpp:325
void applyNncMultreg_(const std::unordered_map< std::size_t, int > &globalToLocal)
Definition: Transmissibility_impl.hpp:1455
void applyEditNncrToGridTrans_(const std::unordered_map< std::size_t, int > &globalToLocal)
Resets the grid transmissibilities according to EDITNNCR.
Definition: Transmissibility_impl.hpp:1359
void extractDispersion_()
Definition: Transmissibility_impl.hpp:870
bool storeHalfTrans_
Definition: Transmissibility.hpp:331
const std::map< std::pair< unsigned, unsigned >, Scalar > & getThermalHalfTransBoundary() const
Definition: Transmissibility_impl.hpp:276
Scalar thermalHalfTrans(unsigned insideElemIdx, unsigned outsideElemIdx) const
Return the thermal "half transmissibility" for the intersection between two elements.
Definition: Transmissibility_impl.hpp:244
void finishInit(const std::function< unsigned int(unsigned int)> &map={})
Actually compute the transmissibility over a face as a pre-compute step.
Definition: Transmissibility.hpp:150
Scalar transmissibilityBoundary(unsigned elemIdx, unsigned boundaryFaceIdx) const
Return the transmissibility for a given boundary segment.
Definition: Transmissibility_impl.hpp:237
std::vector< Scalar > porosity_
Definition: Transmissibility.hpp:313
const GridView & gridView_
Definition: Transmissibility.hpp:317
std::array< std::vector< double >, 3 > createTransmissibilityArrays_(const std::array< bool, 3 > &is_tran)
Creates TRANS{XYZ} arrays for modification by FieldProps data.
Definition: Transmissibility_impl.hpp:992
void applyEditNncToGridTransHelper_(const std::unordered_map< std::size_t, int > &globalToLocal, const std::string &keyword, const std::vector< NNCdata > &nncs, const std::function< KeywordLocation(const NNCdata &)> &getLocation, const std::function< void(Scalar &, const Scalar &)> &apply)
Definition: Transmissibility_impl.hpp:1372
std::unordered_map< std::uint64_t, Scalar > diffusivity_
Definition: Transmissibility.hpp:332
void updateFromEclState_(bool global)
Definition: Transmissibility_impl.hpp:957
std::map< std::pair< unsigned, unsigned >, Scalar > thermalHalfTransBoundary_
Definition: Transmissibility.hpp:324
void extractPermeability_()
Definition: Transmissibility_impl.hpp:755
void applyAllZMultipliers_(Scalar &trans, const FaceInfo &inside, const FaceInfo &outside, const TransMult &transMult, const std::array< int, dimWorld > &cartDims)
Apply the Multipliers for the case PINCH(4)==TOPBOT.
Definition: Transmissibility_impl.hpp:914
Scalar lookupTrans_(const std::unordered_map< std::uint64_t, Scalar > &map, unsigned elemIdx1, unsigned elemIdx2, std::string_view what) const
Definition: Transmissibility_impl.hpp:188
TransUpdateQuantities
Compute all transmissibilities.
Definition: Transmissibility.hpp:178
void resetTransmissibilityFromArrays_(const std::array< bool, 3 > &is_tran, const std::array< std::vector< double >, 3 > &trans)
overwrites calculated transmissibilities
Definition: Transmissibility_impl.hpp:1074
Dune::FieldVector< Scalar, dimWorld > DimVector
Definition: Transmissibility.hpp:61
const DimMatrix & permeability(unsigned elemIdx) const
Return the permeability for an element.
Definition: Transmissibility.hpp:75
static Scalar computeHalfDiffusivity_(const DimVector &areaNormal, const DimVector &distance, const Scalar poro)
Definition: Transmissibility_impl.hpp:1522
bool storeHalfTrans() const
Definition: Transmissibility.hpp:119
Scalar transmissibilityThreshold_
Definition: Transmissibility.hpp:322
std::vector< std::array< double, dimWorld > > centroids_cache_
Definition: Transmissibility.hpp:321
Scalar transmissibility(unsigned elemIdx1, unsigned elemIdx2) const
Return the transmissibility for the intersection between two elements.
Definition: Transmissibility_impl.hpp:230
std::string describeCell_(unsigned elemIdx) const
Cell index, its Cartesian index, and on a refined grid its level.
Definition: Transmissibility_impl.hpp:151
static void applyNtg_(Scalar &trans, const FaceInfo &face, const std::vector< double > &ntg)
Definition: Transmissibility_impl.hpp:1565
const EclipseState & eclState_
Definition: Transmissibility.hpp:316
Scalar dispersivity(unsigned elemIdx1, unsigned elemIdx2) const
Return the dispersivity for the intersection between two elements.
Definition: Transmissibility_impl.hpp:293
std::unordered_map< std::uint64_t, Scalar > trans_
Definition: Transmissibility.hpp:315
const Grid & grid_
Definition: Transmissibility.hpp:319
Transmissibility(const EclipseState &eclState, const GridView &gridView, const CartesianIndexMapper &cartMapper, const Grid &grid, std::function< std::array< double, dimWorld >(int)> centroids, bool enableEnergy, bool enableDiffusivity, bool enableDispersivity)
Definition: Transmissibility_impl.hpp:99
const LookUpData< Grid, GridView > lookUpData_
Definition: Transmissibility.hpp:335
void applyNncToGridTrans_(const std::unordered_map< std::size_t, int > &cartesianToCompressed)
Definition: Transmissibility_impl.hpp:1279
Scalar halfTransmissibility(unsigned insideElemIdx, unsigned outsideElemIdx) const
One-sided (half) transmissibility of the face between two cells, seen from the inside cell (NTG appli...
Definition: Transmissibility_impl.hpp:251
std::unordered_map< std::uint64_t, Scalar > halfTrans_
Definition: Transmissibility.hpp:330
void applyPinchNncToGridTrans_(const std::unordered_map< std::size_t, int > &cartesianToCompressed, bool applyNncMultregT)
Applies the previous calculate transmissibilities to the NNCs created via PINCH.
Definition: Transmissibility_impl.hpp:1230
bool gridJoins_(unsigned elemIdx1, unsigned elemIdx2) const
Whether the grid has an intersection between the two cells.
Definition: Transmissibility_impl.hpp:124
void extractPorosity_()
Definition: Transmissibility_impl.hpp:845
void removeNonCartesianTransmissibilities_(bool removeAll)
Definition: Transmissibility_impl.hpp:889
std::vector< DimMatrix > permeability_
Definition: Transmissibility.hpp:312
static Scalar computeHalfTrans_(const DimVector &areaNormal, int faceIdx, const DimVector &distance, const DimMatrix &perm)
Definition: Transmissibility_impl.hpp:1504
void setStoreHalfTrans(bool yesno)
Enable storage of the one-sided half transmissibilities (call before update()).
Definition: Transmissibility.hpp:116
Scalar thermalHalfTransBoundary(unsigned insideElemIdx, unsigned boundaryFaceIdx) const
Definition: Transmissibility_impl.hpp:269
std::unordered_map< std::uint64_t, Scalar > thermalHalfTrans_
Definition: Transmissibility.hpp:329
std::pair< std::uint32_t, std::uint32_t > isIdReverse(const std::uint64_t &id)
Definition: Transmissibility_impl.hpp:80
std::uint64_t directionalIsId(std::uint32_t elemIdx1, std::uint32_t elemIdx2)
Definition: Transmissibility_impl.hpp:91
std::uint64_t isId(std::uint32_t elemIdx1, std::uint32_t elemIdx2)
Definition: Transmissibility_impl.hpp:72
Definition: blackoilbioeffectsmodules.hh:45
Definition: Transmissibility.hpp:188
unsigned cartElemIdx
Definition: Transmissibility.hpp:192
DimVector faceCenter
Definition: Transmissibility.hpp:189
unsigned elemIdx
Definition: Transmissibility.hpp:191
int faceIdx
Definition: Transmissibility.hpp:190