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 <unordered_map>
43#include <vector>
44
45namespace Opm {
46
47class KeywordLocation;
48class EclipseState;
49struct NNCdata;
50class TransMult;
51
52
53template<class Grid, class GridView, class ElementMapper, class CartesianIndexMapper, class Scalar>
55 // Grid and world dimension
56 enum { dimWorld = GridView::dimensionworld };
57public:
58
59 using DimMatrix = Dune::FieldMatrix<Scalar, dimWorld, dimWorld>;
60 using DimVector = Dune::FieldVector<Scalar, dimWorld>;
61
62 Transmissibility(const EclipseState& eclState,
63 const GridView& gridView,
64 const CartesianIndexMapper& cartMapper,
65 const Grid& grid,
66 std::function<std::array<double,dimWorld>(int)> centroids,
67 bool enableEnergy,
68 bool enableDiffusivity,
69 bool enableDispersivity);
70
74 const DimMatrix& permeability(unsigned elemIdx) const
75 { return permeability_[elemIdx]; }
76
80 Scalar transmissibility(unsigned elemIdx1, unsigned elemIdx2) const;
81
85 Scalar transmissibilityBoundary(unsigned elemIdx, unsigned boundaryFaceIdx) const;
86
101 Scalar thermalHalfTrans(unsigned insideElemIdx, unsigned outsideElemIdx) const;
102
111 Scalar halfTransmissibility(unsigned insideElemIdx, unsigned outsideElemIdx) const;
112
115 void setStoreHalfTrans(bool yesno)
116 { storeHalfTrans_ = yesno; }
117
118 bool storeHalfTrans() const
119 { return storeHalfTrans_; }
120
121 Scalar thermalHalfTransBoundary(unsigned insideElemIdx, unsigned boundaryFaceIdx) const;
122
123 const std::map<std::pair<unsigned, unsigned>, Scalar>& getThermalHalfTransBoundary() const;
124
128 Scalar diffusivity(unsigned elemIdx1, unsigned elemIdx2) const;
129
133 Scalar dispersivity(unsigned elemIdx1, unsigned elemIdx2) const;
134
149 void finishInit(const std::function<unsigned int(unsigned int)>& map = {})
150 {
151 this->update(true, TransUpdateQuantities::All, map, /*applyNncMultRegT = */ true);
152 }
153
177 enum class TransUpdateQuantities { Trans, All };
178 void update(bool global, TransUpdateQuantities update_quantities = TransUpdateQuantities::All,
179 const std::function<unsigned int(unsigned int)>& map = {}, bool applyNncMultRegT = false);
180
181protected:
182 void updateFromEclState_(bool global);
183
184 void removeNonCartesianTransmissibilities_(bool removeAll);
185
186 struct FaceInfo
187 {
190 unsigned elemIdx;
191 unsigned cartElemIdx;
192 };
193
201 void applyAllZMultipliers_(Scalar& trans,
202 const FaceInfo& inside,
203 const FaceInfo& outside,
204 const TransMult& transMult,
205 const std::array<int, dimWorld>& cartDims);
206
211 std::array<std::vector<double>,3>
212 createTransmissibilityArrays_(const std::array<bool,3>& is_tran);
213
218 void resetTransmissibilityFromArrays_(const std::array<bool,3>& is_tran,
219 const std::array<std::vector<double>,3>& trans);
220
221 template <class Intersection>
222 void computeFaceProperties(const Intersection& intersection,
223 FaceInfo& inside,
224 FaceInfo& outside,
225 DimVector& faceAreaNormal,
226 /*isCpGrid=*/std::false_type) const;
227
228 template <class Intersection>
229 void computeFaceProperties(const Intersection& intersection,
230 FaceInfo& inside,
231 FaceInfo& outside,
232 DimVector& faceAreaNormal,
233 /*isCpGrid=*/std::true_type) const;
234
235 /*
236 * \brief Applies additional transmissibilities specified via NNC keyword.
237 *
238 * Applies only those NNC that are actually represented by the grid. These may
239 * NNCs due to faults or NNCs that are actually neighbours. In both cases that
240 * specified transmissibilities (scaled by EDITNNC) will be added to the already
241 * existing models.
242 *
243 * \param cartesianToCompressed Vector containing the compressed index (or -1 for inactive
244 * cells) as the element at the cartesian index.
245 * \return Nothing.
246 */
247 void applyNncToGridTrans_(const std::unordered_map<std::size_t,int>& cartesianToCompressed);
248
254 void applyPinchNncToGridTrans_(const std::unordered_map<std::size_t,int>& cartesianToCompressed,
255 bool applyNncMultregT);
256
258 void applyEditNncToGridTrans_(const std::unordered_map<std::size_t,int>& globalToLocal);
259
261 void applyEditNncrToGridTrans_(const std::unordered_map<std::size_t,int>& globalToLocal);
262
263 void applyNncMultreg_(const std::unordered_map<std::size_t,int>& globalToLocal);
264
265 void applyEditNncToGridTransHelper_(const std::unordered_map<std::size_t,int>& globalToLocal,
266 const std::string& keyword, const std::vector<NNCdata>& nncs,
267 const std::function<KeywordLocation(const NNCdata&)>& getLocation,
268 const std::function<void(Scalar&, const Scalar&)>& apply);
269
271
272 void extractPermeability_(const std::function<unsigned int(unsigned int)>& map);
273
274 void extractPorosity_();
275
276 void extractDispersion_();
277
278 static Scalar computeHalfTrans_(const DimVector& areaNormal,
279 int faceIdx, // in the reference element that contains the intersection
280 const DimVector& distance,
281 const DimMatrix& perm);
282
283 static Scalar computeHalfDiffusivity_(const DimVector& areaNormal,
284 const DimVector& distance,
285 const Scalar poro);
286
287 DimVector distanceVector_(const DimVector& faceCenter,
288 const unsigned& cellIdx) const;
289
290 void applyMultipliers_(Scalar& trans,
291 unsigned faceIdx,
292 unsigned cartElemIdx,
293 const TransMult& transMult) const;
294
295 static void applyNtg_(Scalar& trans,
296 const FaceInfo& face,
297 const std::vector<double>& ntg);
298
299 std::vector<DimMatrix> permeability_;
300 std::vector<Scalar> porosity_;
301 std::vector<Scalar> dispersion_;
302 std::unordered_map<std::uint64_t, Scalar> trans_;
303 const EclipseState& eclState_;
304 const GridView& gridView_;
305 const CartesianIndexMapper& cartMapper_;
306 const Grid& grid_;
307 std::function<std::array<double,dimWorld>(int)> centroids_;
308 std::vector<std::array<double,dimWorld>> centroids_cache_;
310 std::map<std::pair<unsigned, unsigned>, Scalar> transBoundary_;
311 std::map<std::pair<unsigned, unsigned>, Scalar> thermalHalfTransBoundary_;
315 bool warnEditNNC_ = true;
316 std::unordered_map<std::uint64_t, Scalar> thermalHalfTrans_; //NB this is based on direction map size is ca 2*trans_ (diffusivity_)
317 std::unordered_map<std::uint64_t, Scalar> halfTrans_; // directional, only filled when storeHalfTrans_
318 bool storeHalfTrans_ = false;
319 std::unordered_map<std::uint64_t, Scalar> diffusivity_;
320 std::unordered_map<std::uint64_t, Scalar> dispersivity_;
321
324};
325
326namespace details {
327 std::uint64_t isId(std::uint32_t elemIdx1, std::uint32_t elemIdx2);
328 std::pair<std::uint32_t, std::uint32_t> isIdReverse(const std::uint64_t& id);
329 std::uint64_t directionalIsId(std::uint32_t elemIdx1, std::uint32_t elemIdx2);
330}
331
332} // namespace Opm
333
334#endif // OPM_TRANSMISSIBILITY_HPP
Definition: GenericThresholdPressure.hpp:40
Definition: FlowGenericProblem.hpp:51
Definition: Transmissibility.hpp:54
void applyMultipliers_(Scalar &trans, unsigned faceIdx, unsigned cartElemIdx, const TransMult &transMult) const
Definition: Transmissibility_impl.hpp:1443
std::function< std::array< double, dimWorld >(int)> centroids_
Definition: Transmissibility.hpp:307
Scalar diffusivity(unsigned elemIdx1, unsigned elemIdx2) const
Return the diffusivity for the intersection between two elements.
Definition: Transmissibility_impl.hpp:175
const CartesianIndexMapper & cartMapper_
Definition: Transmissibility.hpp:305
bool enableDispersivity_
Definition: Transmissibility.hpp:314
bool enableDiffusivity_
Definition: Transmissibility.hpp:313
std::unordered_map< std::uint64_t, Scalar > dispersivity_
Definition: Transmissibility.hpp:320
std::vector< Scalar > dispersion_
Definition: Transmissibility.hpp:301
bool warnEditNNC_
Definition: Transmissibility.hpp:315
void applyEditNncToGridTrans_(const std::unordered_map< std::size_t, int > &globalToLocal)
Multiplies the grid transmissibilities according to EDITNNC.
Definition: Transmissibility_impl.hpp:1238
void computeFaceProperties(const Intersection &intersection, FaceInfo &inside, FaceInfo &outside, DimVector &faceAreaNormal, std::false_type) const
Definition: Transmissibility_impl.hpp:1041
std::map< std::pair< unsigned, unsigned >, Scalar > transBoundary_
Definition: Transmissibility.hpp:310
Dune::FieldMatrix< Scalar, dimWorld, dimWorld > DimMatrix
Definition: Transmissibility.hpp:59
const LookUpCartesianData< Grid, GridView > lookUpCartesianData_
Definition: Transmissibility.hpp:323
void update(bool global, TransUpdateQuantities update_quantities=TransUpdateQuantities::All, const std::function< unsigned int(unsigned int)> &map={}, bool applyNncMultRegT=false)
Definition: Transmissibility_impl.hpp:195
DimVector distanceVector_(const DimVector &faceCenter, const unsigned &cellIdx) const
Definition: Transmissibility_impl.hpp:1428
bool enableEnergy_
Definition: Transmissibility.hpp:312
void applyNncMultreg_(const std::unordered_map< std::size_t, int > &globalToLocal)
Definition: Transmissibility_impl.hpp:1347
void applyEditNncrToGridTrans_(const std::unordered_map< std::size_t, int > &globalToLocal)
Resets the grid transmissibilities according to EDITNNCR.
Definition: Transmissibility_impl.hpp:1251
void extractDispersion_()
Definition: Transmissibility_impl.hpp:762
bool storeHalfTrans_
Definition: Transmissibility.hpp:318
const std::map< std::pair< unsigned, unsigned >, Scalar > & getThermalHalfTransBoundary() const
Definition: Transmissibility_impl.hpp:168
Scalar thermalHalfTrans(unsigned insideElemIdx, unsigned outsideElemIdx) const
Return the thermal "half transmissibility" for the intersection between two elements.
Definition: Transmissibility_impl.hpp:136
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:149
Scalar transmissibilityBoundary(unsigned elemIdx, unsigned boundaryFaceIdx) const
Return the transmissibility for a given boundary segment.
Definition: Transmissibility_impl.hpp:129
std::vector< Scalar > porosity_
Definition: Transmissibility.hpp:300
const GridView & gridView_
Definition: Transmissibility.hpp:304
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:884
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:1264
std::unordered_map< std::uint64_t, Scalar > diffusivity_
Definition: Transmissibility.hpp:319
void updateFromEclState_(bool global)
Definition: Transmissibility_impl.hpp:849
std::map< std::pair< unsigned, unsigned >, Scalar > thermalHalfTransBoundary_
Definition: Transmissibility.hpp:311
void extractPermeability_()
Definition: Transmissibility_impl.hpp:647
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:806
TransUpdateQuantities
Compute all transmissibilities.
Definition: Transmissibility.hpp:177
void resetTransmissibilityFromArrays_(const std::array< bool, 3 > &is_tran, const std::array< std::vector< double >, 3 > &trans)
overwrites calculated transmissibilities
Definition: Transmissibility_impl.hpp:966
Dune::FieldVector< Scalar, dimWorld > DimVector
Definition: Transmissibility.hpp:60
const DimMatrix & permeability(unsigned elemIdx) const
Return the permeability for an element.
Definition: Transmissibility.hpp:74
static Scalar computeHalfDiffusivity_(const DimVector &areaNormal, const DimVector &distance, const Scalar poro)
Definition: Transmissibility_impl.hpp:1414
bool storeHalfTrans() const
Definition: Transmissibility.hpp:118
Scalar transmissibilityThreshold_
Definition: Transmissibility.hpp:309
std::vector< std::array< double, dimWorld > > centroids_cache_
Definition: Transmissibility.hpp:308
Scalar transmissibility(unsigned elemIdx1, unsigned elemIdx2) const
Return the transmissibility for the intersection between two elements.
Definition: Transmissibility_impl.hpp:122
static void applyNtg_(Scalar &trans, const FaceInfo &face, const std::vector< double > &ntg)
Definition: Transmissibility_impl.hpp:1457
const EclipseState & eclState_
Definition: Transmissibility.hpp:303
Scalar dispersivity(unsigned elemIdx1, unsigned elemIdx2) const
Return the dispersivity for the intersection between two elements.
Definition: Transmissibility_impl.hpp:185
std::unordered_map< std::uint64_t, Scalar > trans_
Definition: Transmissibility.hpp:302
const Grid & grid_
Definition: Transmissibility.hpp:306
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:97
const LookUpData< Grid, GridView > lookUpData_
Definition: Transmissibility.hpp:322
void applyNncToGridTrans_(const std::unordered_map< std::size_t, int > &cartesianToCompressed)
Definition: Transmissibility_impl.hpp:1171
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:143
std::unordered_map< std::uint64_t, Scalar > halfTrans_
Definition: Transmissibility.hpp:317
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:1122
void extractPorosity_()
Definition: Transmissibility_impl.hpp:737
void removeNonCartesianTransmissibilities_(bool removeAll)
Definition: Transmissibility_impl.hpp:781
std::vector< DimMatrix > permeability_
Definition: Transmissibility.hpp:299
static Scalar computeHalfTrans_(const DimVector &areaNormal, int faceIdx, const DimVector &distance, const DimMatrix &perm)
Definition: Transmissibility_impl.hpp:1396
void setStoreHalfTrans(bool yesno)
Enable storage of the one-sided half transmissibilities (call before update()).
Definition: Transmissibility.hpp:115
Scalar thermalHalfTransBoundary(unsigned insideElemIdx, unsigned boundaryFaceIdx) const
Definition: Transmissibility_impl.hpp:161
std::unordered_map< std::uint64_t, Scalar > thermalHalfTrans_
Definition: Transmissibility.hpp:316
std::pair< std::uint32_t, std::uint32_t > isIdReverse(const std::uint64_t &id)
Definition: Transmissibility_impl.hpp:78
std::uint64_t directionalIsId(std::uint32_t elemIdx1, std::uint32_t elemIdx2)
Definition: Transmissibility_impl.hpp:89
std::uint64_t isId(std::uint32_t elemIdx1, std::uint32_t elemIdx2)
Definition: Transmissibility_impl.hpp:70
Definition: blackoilbioeffectsmodules.hh:45
Definition: Transmissibility.hpp:187
unsigned cartElemIdx
Definition: Transmissibility.hpp:191
DimVector faceCenter
Definition: Transmissibility.hpp:188
unsigned elemIdx
Definition: Transmissibility.hpp:190
int faceIdx
Definition: Transmissibility.hpp:189