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, TransUpdateQuantities::All, map, /*applyNncMultRegT = */ true);
132 }
133
157 enum class TransUpdateQuantities { Trans, All };
158 void update(bool global, TransUpdateQuantities update_quantities = TransUpdateQuantities::All,
159 const std::function<unsigned int(unsigned int)>& map = {}, bool applyNncMultRegT = false);
160
161protected:
162 void updateFromEclState_(bool global);
163
164 void removeNonCartesianTransmissibilities_(bool removeAll);
165
169 void applyAllZMultipliers_(Scalar& trans,
170 unsigned insideFaceIdx,
171 unsigned outsideFaceIdx,
172 unsigned insideCartElemIdx,
173 unsigned outsideCartElemIdx,
174 const TransMult& transMult,
175 const std::array<int, dimWorld>& cartDims,
176 bool pinchTop);
177
182 std::array<std::vector<double>,3>
183 createTransmissibilityArrays_(const std::array<bool,3>& is_tran);
184
189 void resetTransmissibilityFromArrays_(const std::array<bool,3>& is_tran,
190 const std::array<std::vector<double>,3>& trans);
191
192 template <class Intersection>
193 void computeFaceProperties(const Intersection& intersection,
194 const int,
195 const int,
196 const int,
197 const int,
198 DimVector& faceCenterInside,
199 DimVector& faceCenterOutside,
200 DimVector& faceAreaNormal,
201 /*isCpGrid=*/std::false_type) const;
202
203 template <class Intersection>
204 void computeFaceProperties(const Intersection& intersection,
205 const int insideElemIdx,
206 const int insideFaceIdx,
207 const int outsideElemIdx,
208 const int outsideFaceIdx,
209 DimVector& faceCenterInside,
210 DimVector& faceCenterOutside,
211 DimVector& faceAreaNormal,
212 /*isCpGrid=*/std::true_type) const;
213
214 /*
215 * \brief Applies additional transmissibilities specified via NNC keyword.
216 *
217 * Applies only those NNC that are actually represented by the grid. These may
218 * NNCs due to faults or NNCs that are actually neighbours. In both cases that
219 * specified transmissibilities (scaled by EDITNNC) will be added to the already
220 * existing models.
221 *
222 * \param cartesianToCompressed Vector containing the compressed index (or -1 for inactive
223 * cells) as the element at the cartesian index.
224 * \return Nothing.
225 */
226 void applyNncToGridTrans_(const std::unordered_map<std::size_t,int>& cartesianToCompressed);
227
229 void applyEditNncToGridTrans_(const std::unordered_map<std::size_t,int>& globalToLocal);
230
232 void applyEditNncrToGridTrans_(const std::unordered_map<std::size_t,int>& globalToLocal);
233
234 void applyNncMultreg_(const std::unordered_map<std::size_t,int>& globalToLocal);
235
236 void applyEditNncToGridTransHelper_(const std::unordered_map<std::size_t,int>& globalToLocal,
237 const std::string& keyword, const std::vector<NNCdata>& nncs,
238 const std::function<KeywordLocation(const NNCdata&)>& getLocation,
239 const std::function<void(Scalar&, const Scalar&)>& apply);
240
242
243 void extractPermeability_(const std::function<unsigned int(unsigned int)>& map);
244
245 void extractPorosity_();
246
247 void extractDispersion_();
248
249 void computeHalfTrans_(Scalar& halfTrans,
250 const DimVector& areaNormal,
251 int faceIdx, // in the reference element that contains the intersection
252 const DimVector& distance,
253 const DimMatrix& perm) const;
254
255 void computeHalfDiffusivity_(Scalar& halfDiff,
256 const DimVector& areaNormal,
257 const DimVector& distance,
258 const Scalar& poro) const;
259
260 DimVector distanceVector_(const DimVector& faceCenter,
261 const unsigned& cellIdx) const;
262
263 void applyMultipliers_(Scalar& trans,
264 unsigned faceIdx,
265 unsigned cartElemIdx,
266 const TransMult& transMult) const;
267
268 void applyNtg_(Scalar& trans,
269 unsigned faceIdx,
270 unsigned elemIdx,
271 const std::vector<double>& ntg) const;
272
273 std::vector<DimMatrix> permeability_;
274 std::vector<Scalar> porosity_;
275 std::vector<Scalar> dispersion_;
276 std::unordered_map<std::uint64_t, Scalar> trans_;
277 const EclipseState& eclState_;
278 const GridView& gridView_;
279 const CartesianIndexMapper& cartMapper_;
280 const Grid& grid_;
281 std::function<std::array<double,dimWorld>(int)> centroids_;
283 std::map<std::pair<unsigned, unsigned>, Scalar> transBoundary_;
284 std::map<std::pair<unsigned, unsigned>, Scalar> thermalHalfTransBoundary_;
288 bool warnEditNNC_ = true;
289 std::unordered_map<std::uint64_t, Scalar> thermalHalfTrans_; //NB this is based on direction map size is ca 2*trans_ (diffusivity_)
290 std::unordered_map<std::uint64_t, Scalar> diffusivity_;
291 std::unordered_map<std::uint64_t, Scalar> dispersivity_;
292
295};
296
297namespace details {
298 std::uint64_t isId(std::uint32_t elemIdx1, std::uint32_t elemIdx2);
299 std::pair<std::uint32_t, std::uint32_t> isIdReverse(const std::uint64_t& id);
300 std::uint64_t directionalIsId(std::uint32_t elemIdx1, std::uint32_t elemIdx2);
301}
302
303} // namespace Opm
304
305#endif // OPM_TRANSMISSIBILITY_HPP
Definition: GenericThresholdPressure.hpp:40
Definition: FlowGenericProblem.hpp:53
Definition: Transmissibility.hpp:54
void applyMultipliers_(Scalar &trans, unsigned faceIdx, unsigned cartElemIdx, const TransMult &transMult) const
Definition: Transmissibility_impl.hpp:1289
std::function< std::array< double, dimWorld >(int)> centroids_
Definition: Transmissibility.hpp:281
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:279
bool enableDispersivity_
Definition: Transmissibility.hpp:287
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:938
bool enableDiffusivity_
Definition: Transmissibility.hpp:286
std::unordered_map< std::uint64_t, Scalar > dispersivity_
Definition: Transmissibility.hpp:291
std::vector< Scalar > dispersion_
Definition: Transmissibility.hpp:275
bool warnEditNNC_
Definition: Transmissibility.hpp:288
void applyEditNncToGridTrans_(const std::unordered_map< std::size_t, int > &globalToLocal)
Multiplies the grid transmissibilities according to EDITNNC.
Definition: Transmissibility_impl.hpp:1094
std::map< std::pair< unsigned, unsigned >, Scalar > transBoundary_
Definition: Transmissibility.hpp:283
Dune::FieldMatrix< Scalar, dimWorld, dimWorld > DimMatrix
Definition: Transmissibility.hpp:59
const LookUpCartesianData< Grid, GridView > lookUpCartesianData_
Definition: Transmissibility.hpp:294
void update(bool global, TransUpdateQuantities update_quantities=TransUpdateQuantities::All, const std::function< unsigned int(unsigned int)> &map={}, bool applyNncMultRegT=false)
Definition: Transmissibility_impl.hpp:162
DimVector distanceVector_(const DimVector &faceCenter, const unsigned &cellIdx) const
Definition: Transmissibility_impl.hpp:1276
bool enableEnergy_
Definition: Transmissibility.hpp:285
void applyNncMultreg_(const std::unordered_map< std::size_t, int > &globalToLocal)
Definition: Transmissibility_impl.hpp:1199
void applyEditNncrToGridTrans_(const std::unordered_map< std::size_t, int > &globalToLocal)
Resets the grid transmissibilities according to EDITNNCR.
Definition: Transmissibility_impl.hpp:1107
void extractDispersion_()
Definition: Transmissibility_impl.hpp:667
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:1263
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:709
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:274
const GridView & gridView_
Definition: Transmissibility.hpp:278
void computeHalfTrans_(Scalar &halfTrans, const DimVector &areaNormal, int faceIdx, const DimVector &distance, const DimMatrix &perm) const
Definition: Transmissibility_impl.hpp:1247
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:797
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:1120
std::unordered_map< std::uint64_t, Scalar > diffusivity_
Definition: Transmissibility.hpp:290
void updateFromEclState_(bool global)
Definition: Transmissibility_impl.hpp:760
std::map< std::pair< unsigned, unsigned >, Scalar > thermalHalfTransBoundary_
Definition: Transmissibility.hpp:284
void extractPermeability_()
Definition: Transmissibility_impl.hpp:559
TransUpdateQuantities
Compute all transmissibilities.
Definition: Transmissibility.hpp:157
void resetTransmissibilityFromArrays_(const std::array< bool, 3 > &is_tran, const std::array< std::vector< double >, 3 > &trans)
overwrites calculated transmissibilities
Definition: Transmissibility_impl.hpp:871
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:282
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:277
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:276
const Grid & grid_
Definition: Transmissibility.hpp:280
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:293
void applyNncToGridTrans_(const std::unordered_map< std::size_t, int > &cartesianToCompressed)
Definition: Transmissibility_impl.hpp:1026
void applyNtg_(Scalar &trans, unsigned faceIdx, unsigned elemIdx, const std::vector< double > &ntg) const
Definition: Transmissibility_impl.hpp:1323
void extractPorosity_()
Definition: Transmissibility_impl.hpp:644
void removeNonCartesianTransmissibilities_(bool removeAll)
Definition: Transmissibility_impl.hpp:685
std::vector< DimMatrix > permeability_
Definition: Transmissibility.hpp:273
Scalar thermalHalfTransBoundary(unsigned insideElemIdx, unsigned boundaryFaceIdx) const
Definition: Transmissibility_impl.hpp:135
std::unordered_map< std::uint64_t, Scalar > thermalHalfTrans_
Definition: Transmissibility.hpp:289
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: blackoilboundaryratevector.hh:37