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
103 Scalar thermalHalfTransBoundary(unsigned insideElemIdx, unsigned boundaryFaceIdx) const;
104
108 Scalar diffusivity(unsigned elemIdx1, unsigned elemIdx2) const;
109
113 Scalar dispersivity(unsigned elemIdx1, unsigned elemIdx2) const;
114
129 void finishInit(const std::function<unsigned int(unsigned int)>& map = {})
130 {
131 this->update(true, map, /*applyNncMultRegT = */ true);
132 }
133
150 void update(bool global, const std::function<unsigned int(unsigned int)>& map = {}, bool applyNncMultRegT = false);
151
152protected:
153 void updateFromEclState_(bool global);
154
155 void removeNonCartesianTransmissibilities_(bool removeAll);
156
160 void applyAllZMultipliers_(Scalar& trans,
161 unsigned insideFaceIdx,
162 unsigned outsideFaceIdx,
163 unsigned insideCartElemIdx,
164 unsigned outsideCartElemIdx,
165 const TransMult& transMult,
166 const std::array<int, dimWorld>& cartDims,
167 bool pinchTop);
168
173 std::array<std::vector<double>,3>
174 createTransmissibilityArrays_(const std::array<bool,3>& is_tran);
175
180 void resetTransmissibilityFromArrays_(const std::array<bool,3>& is_tran,
181 const std::array<std::vector<double>,3>& trans);
182
183 template <class Intersection>
184 void computeFaceProperties(const Intersection& intersection,
185 const int,
186 const int,
187 const int,
188 const int,
189 DimVector& faceCenterInside,
190 DimVector& faceCenterOutside,
191 DimVector& faceAreaNormal,
192 /*isCpGrid=*/std::false_type) const;
193
194 template <class Intersection>
195 void computeFaceProperties(const Intersection& intersection,
196 const int insideElemIdx,
197 const int insideFaceIdx,
198 const int outsideElemIdx,
199 const int outsideFaceIdx,
200 DimVector& faceCenterInside,
201 DimVector& faceCenterOutside,
202 DimVector& faceAreaNormal,
203 /*isCpGrid=*/std::true_type) const;
204
205 /*
206 * \brief Applies additional transmissibilities specified via NNC keyword.
207 *
208 * Applies only those NNC that are actually represented by the grid. These may
209 * NNCs due to faults or NNCs that are actually neighbours. In both cases that
210 * specified transmissibilities (scaled by EDITNNC) will be added to the already
211 * existing models.
212 *
213 * \param cartesianToCompressed Vector containing the compressed index (or -1 for inactive
214 * cells) as the element at the cartesian index.
215 * \return Nothing.
216 */
217 void applyNncToGridTrans_(const std::unordered_map<std::size_t,int>& cartesianToCompressed);
218
220 void applyEditNncToGridTrans_(const std::unordered_map<std::size_t,int>& globalToLocal);
221
223 void applyEditNncrToGridTrans_(const std::unordered_map<std::size_t,int>& globalToLocal);
224
225 void applyNncMultreg_(const std::unordered_map<std::size_t,int>& globalToLocal);
226
227 void applyEditNncToGridTransHelper_(const std::unordered_map<std::size_t,int>& globalToLocal,
228 const std::string& keyword, const std::vector<NNCdata>& nncs,
229 const std::function<KeywordLocation(const NNCdata&)>& getLocation,
230 const std::function<void(double&, const double&)>& apply);
231
233
234 void extractPermeability_(const std::function<unsigned int(unsigned int)>& map);
235
236 void extractPorosity_();
237
238 void extractDispersion_();
239
240 void computeHalfTrans_(Scalar& halfTrans,
241 const DimVector& areaNormal,
242 int faceIdx, // in the reference element that contains the intersection
243 const DimVector& distance,
244 const DimMatrix& perm) const;
245
246 void computeHalfDiffusivity_(Scalar& halfDiff,
247 const DimVector& areaNormal,
248 const DimVector& distance,
249 const Scalar& poro) const;
250
251 DimVector distanceVector_(const DimVector& center,
252 int faceIdx, // in the reference element that contains the intersection
253 unsigned elemIdx,
254 const std::array<std::vector<DimVector>, dimWorld>& axisCentroids) const;
255
256 void applyMultipliers_(Scalar& trans,
257 unsigned faceIdx,
258 unsigned cartElemIdx,
259 const TransMult& transMult) const;
260
261 void applyNtg_(Scalar& trans,
262 unsigned faceIdx,
263 unsigned elemIdx,
264 const std::vector<double>& ntg) const;
265
266 std::vector<DimMatrix> permeability_;
267 std::vector<Scalar> porosity_;
268 std::vector<Scalar> dispersion_;
269 std::unordered_map<std::uint64_t, Scalar> trans_;
270 const EclipseState& eclState_;
271 const GridView& gridView_;
272 const CartesianIndexMapper& cartMapper_;
273 const Grid& grid_;
274 std::function<std::array<double,dimWorld>(int)> centroids_;
276 std::map<std::pair<unsigned, unsigned>, Scalar> transBoundary_;
277 std::map<std::pair<unsigned, unsigned>, Scalar> thermalHalfTransBoundary_;
281 std::unordered_map<std::uint64_t, Scalar> thermalHalfTrans_; //NB this is based on direction map size is ca 2*trans_ (diffusivity_)
282 std::unordered_map<std::uint64_t, Scalar> diffusivity_;
283 std::unordered_map<std::uint64_t, Scalar> dispersivity_;
284
287};
288
289namespace details {
290 std::uint64_t isId(std::uint32_t elemIdx1, std::uint32_t elemIdx2);
291 std::pair<std::uint32_t, std::uint32_t> isIdReverse(const std::uint64_t& id);
292 std::uint64_t directionalIsId(std::uint32_t elemIdx1, std::uint32_t elemIdx2);
293}
294
295} // namespace Opm
296
297#endif // OPM_TRANSMISSIBILITY_HPP
Definition: GenericThresholdPressure.hpp:40
Definition: FlowGenericProblem.hpp:54
Definition: Transmissibility.hpp:54
void applyMultipliers_(Scalar &trans, unsigned faceIdx, unsigned cartElemIdx, const TransMult &transMult) const
Definition: Transmissibility_impl.hpp:1304
std::function< std::array< double, dimWorld >(int)> centroids_
Definition: Transmissibility.hpp:274
Scalar diffusivity(unsigned elemIdx1, unsigned elemIdx2) const
Return the diffusivity for the intersection between two elements.
Definition: Transmissibility_impl.hpp:142
const CartesianIndexMapper & cartMapper_
Definition: Transmissibility.hpp:272
bool enableDispersivity_
Definition: Transmissibility.hpp:280
void computeFaceProperties(const Intersection &intersection, const int, const int, const int, const int, DimVector &faceCenterInside, DimVector &faceCenterOutside, DimVector &faceAreaNormal, std::false_type) const
Definition: Transmissibility_impl.hpp:944
bool enableDiffusivity_
Definition: Transmissibility.hpp:279
std::unordered_map< std::uint64_t, Scalar > dispersivity_
Definition: Transmissibility.hpp:283
std::vector< Scalar > dispersion_
Definition: Transmissibility.hpp:268
void applyEditNncToGridTrans_(const std::unordered_map< std::size_t, int > &globalToLocal)
Multiplies the grid transmissibilities according to EDITNNC.
Definition: Transmissibility_impl.hpp:1100
std::map< std::pair< unsigned, unsigned >, Scalar > transBoundary_
Definition: Transmissibility.hpp:276
Dune::FieldMatrix< Scalar, dimWorld, dimWorld > DimMatrix
Definition: Transmissibility.hpp:59
const LookUpCartesianData< Grid, GridView > lookUpCartesianData_
Definition: Transmissibility.hpp:286
bool enableEnergy_
Definition: Transmissibility.hpp:278
void applyNncMultreg_(const std::unordered_map< std::size_t, int > &globalToLocal)
Definition: Transmissibility_impl.hpp:1202
void applyEditNncrToGridTrans_(const std::unordered_map< std::size_t, int > &globalToLocal)
Resets the grid transmissibilities according to EDITNNCR.
Definition: Transmissibility_impl.hpp:1113
void extractDispersion_()
Definition: Transmissibility_impl.hpp:691
Scalar thermalHalfTrans(unsigned insideElemIdx, unsigned outsideElemIdx) const
Return the thermal "half transmissibility" for the intersection between two elements.
Definition: Transmissibility_impl.hpp:128
void computeHalfDiffusivity_(Scalar &halfDiff, const DimVector &areaNormal, const DimVector &distance, const Scalar &poro) const
Definition: Transmissibility_impl.hpp:1271
void applyAllZMultipliers_(Scalar &trans, unsigned insideFaceIdx, unsigned outsideFaceIdx, unsigned insideCartElemIdx, unsigned outsideCartElemIdx, const TransMult &transMult, const std::array< int, dimWorld > &cartDims, bool pinchTop)
Apply the Multipliers for the case PINCH(4)==TOPBOT.
Definition: Transmissibility_impl.hpp:727
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:129
Scalar transmissibilityBoundary(unsigned elemIdx, unsigned boundaryFaceIdx) const
Return the transmissibility for a given boundary segment.
Definition: Transmissibility_impl.hpp:121
std::vector< Scalar > porosity_
Definition: Transmissibility.hpp:267
const GridView & gridView_
Definition: Transmissibility.hpp:271
void computeHalfTrans_(Scalar &halfTrans, const DimVector &areaNormal, int faceIdx, const DimVector &distance, const DimMatrix &perm) const
Definition: Transmissibility_impl.hpp:1250
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:815
std::unordered_map< std::uint64_t, Scalar > diffusivity_
Definition: Transmissibility.hpp:282
void updateFromEclState_(bool global)
Definition: Transmissibility_impl.hpp:778
std::map< std::pair< unsigned, unsigned >, Scalar > thermalHalfTransBoundary_
Definition: Transmissibility.hpp:277
void update(bool global, const std::function< unsigned int(unsigned int)> &map={}, bool applyNncMultRegT=false)
Compute all transmissibilities.
Definition: Transmissibility_impl.hpp:162
void extractPermeability_()
Definition: Transmissibility_impl.hpp:589
void resetTransmissibilityFromArrays_(const std::array< bool, 3 > &is_tran, const std::array< std::vector< double >, 3 > &trans)
overwrites calculated transmissibilities
Definition: Transmissibility_impl.hpp:882
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
Scalar transmissibilityThreshold_
Definition: Transmissibility.hpp:275
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(double &, const double &)> &apply)
Definition: Transmissibility_impl.hpp:1126
Scalar transmissibility(unsigned elemIdx1, unsigned elemIdx2) const
Return the transmissibility for the intersection between two elements.
Definition: Transmissibility_impl.hpp:114
const EclipseState & eclState_
Definition: Transmissibility.hpp:270
Scalar dispersivity(unsigned elemIdx1, unsigned elemIdx2) const
Return the dispersivity for the intersection between two elements.
Definition: Transmissibility_impl.hpp:152
std::unordered_map< std::uint64_t, Scalar > trans_
Definition: Transmissibility.hpp:269
const Grid & grid_
Definition: Transmissibility.hpp:273
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:89
const LookUpData< Grid, GridView > lookUpData_
Definition: Transmissibility.hpp:285
void applyNncToGridTrans_(const std::unordered_map< std::size_t, int > &cartesianToCompressed)
Definition: Transmissibility_impl.hpp:1032
void applyNtg_(Scalar &trans, unsigned faceIdx, unsigned elemIdx, const std::vector< double > &ntg) const
Definition: Transmissibility_impl.hpp:1338
DimVector distanceVector_(const DimVector &center, int faceIdx, unsigned elemIdx, const std::array< std::vector< DimVector >, dimWorld > &axisCentroids) const
Definition: Transmissibility_impl.hpp:1288
void extractPorosity_()
Definition: Transmissibility_impl.hpp:674
void removeNonCartesianTransmissibilities_(bool removeAll)
Definition: Transmissibility_impl.hpp:703
std::vector< DimMatrix > permeability_
Definition: Transmissibility.hpp:266
Scalar thermalHalfTransBoundary(unsigned insideElemIdx, unsigned boundaryFaceIdx) const
Definition: Transmissibility_impl.hpp:135
std::unordered_map< std::uint64_t, Scalar > thermalHalfTrans_
Definition: Transmissibility.hpp:281
std::pair< std::uint32_t, std::uint32_t > isIdReverse(const std::uint64_t &id)
Definition: Transmissibility_impl.hpp:70
std::uint64_t directionalIsId(std::uint32_t elemIdx1, std::uint32_t elemIdx2)
Definition: Transmissibility_impl.hpp:81
std::uint64_t isId(std::uint32_t elemIdx1, std::uint32_t elemIdx2)
Definition: Transmissibility_impl.hpp:62
Definition: BlackoilPhases.hpp:27