My Project
Loading...
Searching...
No Matches
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
181 std::array<std::vector<double>,3>
182 createTransmissibilityArrays_(const std::array<bool,3>& is_tran);
183
188 void resetTransmissibilityFromArrays_(const std::array<bool,3>& is_tran,
189 const std::array<std::vector<double>,3>& trans);
190
191 template <class Intersection>
192 void computeFaceProperties(const Intersection& intersection,
193 const int,
194 const int,
195 const int,
196 const int,
197 DimVector& faceCenterInside,
198 DimVector& faceCenterOutside,
199 DimVector& faceAreaNormal,
200 /*isCpGrid=*/std::false_type) const;
201
202 template <class Intersection>
203 void computeFaceProperties(const Intersection& intersection,
204 const int insideElemIdx,
205 const int insideFaceIdx,
206 const int outsideElemIdx,
207 const int outsideFaceIdx,
208 DimVector& faceCenterInside,
209 DimVector& faceCenterOutside,
210 DimVector& faceAreaNormal,
211 /*isCpGrid=*/std::true_type) const;
212
213 /*
214 * \brief Applies additional transmissibilities specified via NNC keyword.
215 *
216 * Applies only those NNC that are actually represented by the grid. These may
217 * NNCs due to faults or NNCs that are actually neighbours. In both cases that
218 * specified transmissibilities (scaled by EDITNNC) will be added to the already
219 * existing models.
220 *
221 * \param cartesianToCompressed Vector containing the compressed index (or -1 for inactive
222 * cells) as the element at the cartesian index.
223 * \return Nothing.
224 */
225 void applyNncToGridTrans_(const std::unordered_map<std::size_t,int>& cartesianToCompressed);
226
231 void applyPinchNncToGridTrans_(const std::unordered_map<std::size_t,int>& cartesianToCompressed);
232
234 void applyEditNncToGridTrans_(const std::unordered_map<std::size_t,int>& globalToLocal);
235
237 void applyEditNncrToGridTrans_(const std::unordered_map<std::size_t,int>& globalToLocal);
238
239 void applyNncMultreg_(const std::unordered_map<std::size_t,int>& globalToLocal);
240
241 void applyEditNncToGridTransHelper_(const std::unordered_map<std::size_t,int>& globalToLocal,
242 const std::string& keyword, const std::vector<NNCdata>& nncs,
243 const std::function<KeywordLocation(const NNCdata&)>& getLocation,
244 const std::function<void(Scalar&, const Scalar&)>& apply);
245
246 void extractPermeability_();
247
248 void extractPermeability_(const std::function<unsigned int(unsigned int)>& map);
249
250 void extractPorosity_();
251
252 void extractDispersion_();
253
254 void computeHalfTrans_(Scalar& halfTrans,
255 const DimVector& areaNormal,
256 int faceIdx, // in the reference element that contains the intersection
257 const DimVector& distance,
258 const DimMatrix& perm) const;
259
260 void computeHalfDiffusivity_(Scalar& halfDiff,
261 const DimVector& areaNormal,
262 const DimVector& distance,
263 const Scalar& poro) const;
264
265 DimVector distanceVector_(const DimVector& faceCenter,
266 const unsigned& cellIdx) const;
267
268 void applyMultipliers_(Scalar& trans,
269 unsigned faceIdx,
270 unsigned cartElemIdx,
271 const TransMult& transMult) const;
272
273 void applyNtg_(Scalar& trans,
274 unsigned faceIdx,
275 unsigned elemIdx,
276 const std::vector<double>& ntg) const;
277
278 std::vector<DimMatrix> permeability_;
279 std::vector<Scalar> porosity_;
280 std::vector<Scalar> dispersion_;
281 std::unordered_map<std::uint64_t, Scalar> trans_;
282 const EclipseState& eclState_;
283 const GridView& gridView_;
284 const CartesianIndexMapper& cartMapper_;
285 const Grid& grid_;
286 std::function<std::array<double,dimWorld>(int)> centroids_;
287 Scalar transmissibilityThreshold_;
288 std::map<std::pair<unsigned, unsigned>, Scalar> transBoundary_;
289 std::map<std::pair<unsigned, unsigned>, Scalar> thermalHalfTransBoundary_;
290 bool enableEnergy_;
291 bool enableDiffusivity_;
292 bool enableDispersivity_;
293 bool warnEditNNC_ = true;
294 std::unordered_map<std::uint64_t, Scalar> thermalHalfTrans_; //NB this is based on direction map size is ca 2*trans_ (diffusivity_)
295 std::unordered_map<std::uint64_t, Scalar> diffusivity_;
296 std::unordered_map<std::uint64_t, Scalar> dispersivity_;
297
298 const LookUpData<Grid,GridView> lookUpData_;
299 const LookUpCartesianData<Grid,GridView> lookUpCartesianData_;
300};
301
302namespace details {
303 std::uint64_t isId(std::uint32_t elemIdx1, std::uint32_t elemIdx2);
304 std::pair<std::uint32_t, std::uint32_t> isIdReverse(const std::uint64_t& id);
305 std::uint64_t directionalIsId(std::uint32_t elemIdx1, std::uint32_t elemIdx2);
306}
307
308} // namespace Opm
309
310#endif // OPM_TRANSMISSIBILITY_HPP
Definition Transmissibility.hpp:54
Scalar diffusivity(unsigned elemIdx1, unsigned elemIdx2) const
Return the diffusivity for the intersection between two elements.
Definition Transmissibility_impl.hpp:142
void applyEditNncToGridTrans_(const std::unordered_map< std::size_t, int > &globalToLocal)
Multiplies the grid transmissibilities according to EDITNNC.
Definition Transmissibility_impl.hpp:1139
void applyEditNncrToGridTrans_(const std::unordered_map< std::size_t, int > &globalToLocal)
Resets the grid transmissibilities according to EDITNNCR.
Definition Transmissibility_impl.hpp:1152
Scalar thermalHalfTrans(unsigned insideElemIdx, unsigned outsideElemIdx) const
Return the thermal "half transmissibility" for the intersection between two elements.
Definition Transmissibility_impl.hpp:128
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::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:802
TransUpdateQuantities
Compute all transmissibilities.
Definition Transmissibility.hpp:157
void applyPinchNncToGridTrans_(const std::unordered_map< std::size_t, int > &cartesianToCompressed)
Applies the previous calculate transmissibilities to the NNCs created via PINCH.
Definition Transmissibility_impl.hpp:1030
void resetTransmissibilityFromArrays_(const std::array< bool, 3 > &is_tran, const std::array< std::vector< double >, 3 > &trans)
overwrites calculated transmissibilities
Definition Transmissibility_impl.hpp:876
const DimMatrix & permeability(unsigned elemIdx) const
Return the permeability for an element.
Definition Transmissibility.hpp:74
Scalar transmissibility(unsigned elemIdx1, unsigned elemIdx2) const
Return the transmissibility for the intersection between two elements.
Definition Transmissibility_impl.hpp:114
void applyAllZMultipliers_(Scalar &trans, unsigned insideFaceIdx, unsigned outsideFaceIdx, unsigned insideCartElemIdx, unsigned outsideCartElemIdx, const TransMult &transMult, const std::array< int, dimWorld > &cartDims)
Apply the Multipliers for the case PINCH(4)==TOPBOT.
Definition Transmissibility_impl.hpp:718
Scalar dispersivity(unsigned elemIdx1, unsigned elemIdx2) const
Return the dispersivity for the intersection between two elements.
Definition Transmissibility_impl.hpp:152
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition blackoilboundaryratevector.hh:37