28#ifndef OPM_TRANSMISSIBILITY_HPP
29#define OPM_TRANSMISSIBILITY_HPP
31#include <dune/common/fvector.hh>
32#include <dune/common/fmatrix.hh>
34#include <opm/grid/common/CartesianIndexMapper.hpp>
35#include <opm/grid/LookUpData.hh>
42#include <unordered_map>
53template<
class Gr
id,
class Gr
idView,
class ElementMapper,
class CartesianIndexMapper,
class Scalar>
54class Transmissibility {
56 enum { dimWorld = GridView::dimensionworld };
59 using DimMatrix = Dune::FieldMatrix<Scalar, dimWorld, dimWorld>;
60 using DimVector = Dune::FieldVector<Scalar, dimWorld>;
62 Transmissibility(
const EclipseState& eclState,
63 const GridView& gridView,
64 const CartesianIndexMapper& cartMapper,
66 std::function<std::array<double,dimWorld>(
int)> centroids,
68 bool enableDiffusivity,
69 bool enableDispersivity);
75 {
return permeability_[elemIdx]; }
101 Scalar
thermalHalfTrans(
unsigned insideElemIdx,
unsigned outsideElemIdx)
const;
103 Scalar thermalHalfTransBoundary(
unsigned insideElemIdx,
unsigned boundaryFaceIdx)
const;
108 Scalar
diffusivity(
unsigned elemIdx1,
unsigned elemIdx2)
const;
113 Scalar
dispersivity(
unsigned elemIdx1,
unsigned elemIdx2)
const;
129 void finishInit(
const std::function<
unsigned int(
unsigned int)>& map = {})
131 this->update(
true, TransUpdateQuantities::All, map,
true);
159 const std::function<
unsigned int(
unsigned int)>& map = {},
bool applyNncMultRegT =
false);
162 void updateFromEclState_(
bool global);
164 void removeNonCartesianTransmissibilities_(
bool removeAll);
168 DimVector faceCenter;
171 unsigned cartElemIdx;
184 const TransMult& transMult,
185 const std::array<int, dimWorld>& cartDims);
191 std::array<std::vector<double>,3>
199 const std::array<std::vector<double>,3>& trans);
201 template <
class Intersection>
202 void computeFaceProperties(
const Intersection& intersection,
205 DimVector& faceAreaNormal,
206 std::false_type)
const;
208 template <
class Intersection>
209 void computeFaceProperties(
const Intersection& intersection,
212 DimVector& faceAreaNormal,
213 std::true_type)
const;
227 void applyNncToGridTrans_(
const std::unordered_map<std::size_t,int>& cartesianToCompressed);
235 bool applyNncMultregT);
243 void applyNncMultreg_(
const std::unordered_map<std::size_t,int>& globalToLocal);
245 void applyEditNncToGridTransHelper_(
const std::unordered_map<std::size_t,int>& globalToLocal,
246 const std::string& keyword,
const std::vector<NNCdata>& nncs,
247 const std::function<KeywordLocation(
const NNCdata&)>& getLocation,
248 const std::function<
void(Scalar&,
const Scalar&)>& apply);
250 void extractPermeability_();
252 void extractPermeability_(
const std::function<
unsigned int(
unsigned int)>& map);
254 void extractPorosity_();
256 void extractDispersion_();
258 static Scalar computeHalfTrans_(
const DimVector& areaNormal,
260 const DimVector& distance,
261 const DimMatrix& perm);
263 static Scalar computeHalfDiffusivity_(
const DimVector& areaNormal,
264 const DimVector& distance,
267 DimVector distanceVector_(
const DimVector& faceCenter,
268 const unsigned& cellIdx)
const;
270 void applyMultipliers_(Scalar& trans,
272 unsigned cartElemIdx,
273 const TransMult& transMult)
const;
275 static void applyNtg_(Scalar& trans,
277 const std::vector<double>& ntg);
279 std::vector<DimMatrix> permeability_;
280 std::vector<Scalar> porosity_;
281 std::vector<Scalar> dispersion_;
282 std::unordered_map<std::uint64_t, Scalar> trans_;
283 const EclipseState& eclState_;
284 const GridView& gridView_;
285 const CartesianIndexMapper& cartMapper_;
287 std::function<std::array<double,dimWorld>(
int)> centroids_;
288 std::vector<std::array<double,dimWorld>> centroids_cache_;
289 Scalar transmissibilityThreshold_;
290 std::map<std::pair<unsigned, unsigned>, Scalar> transBoundary_;
291 std::map<std::pair<unsigned, unsigned>, Scalar> thermalHalfTransBoundary_;
293 bool enableDiffusivity_;
294 bool enableDispersivity_;
295 bool warnEditNNC_ =
true;
296 std::unordered_map<std::uint64_t, Scalar> thermalHalfTrans_;
297 std::unordered_map<std::uint64_t, Scalar> diffusivity_;
298 std::unordered_map<std::uint64_t, Scalar> dispersivity_;
305 std::uint64_t isId(std::uint32_t elemIdx1, std::uint32_t elemIdx2);
306 std::pair<std::uint32_t, std::uint32_t> isIdReverse(
const std::uint64_t&
id);
307 std::uint64_t directionalIsId(std::uint32_t elemIdx1, std::uint32_t elemIdx2);
Definition GenericThresholdPressure.hpp:40
Definition FlowGenericProblem.hpp:51
Scalar diffusivity(unsigned elemIdx1, unsigned elemIdx2) const
Return the diffusivity for the intersection between two elements.
Definition Transmissibility_impl.hpp:150
void applyEditNncToGridTrans_(const std::unordered_map< std::size_t, int > &globalToLocal)
Multiplies the grid transmissibilities according to EDITNNC.
Definition Transmissibility_impl.hpp:1173
void applyEditNncrToGridTrans_(const std::unordered_map< std::size_t, int > &globalToLocal)
Resets the grid transmissibilities according to EDITNNCR.
Definition Transmissibility_impl.hpp:1186
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:129
Scalar transmissibilityBoundary(unsigned elemIdx, unsigned boundaryFaceIdx) const
Return the transmissibility for a given boundary segment.
Definition Transmissibility_impl.hpp:129
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:819
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:741
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:901
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:122
Scalar dispersivity(unsigned elemIdx1, unsigned elemIdx2) const
Return the dispersivity for the intersection between two elements.
Definition Transmissibility_impl.hpp:160
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:1057
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition blackoilbioeffectsmodules.hh:43
Definition Transmissibility.hpp:167