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>
56 enum { dimWorld = GridView::dimensionworld };
59 using DimMatrix = Dune::FieldMatrix<Scalar, dimWorld, dimWorld>;
60 using DimVector = Dune::FieldVector<Scalar, dimWorld>;
63 const GridView& gridView,
66 std::function<std::array<double,dimWorld>(
int)>
centroids,
75 {
return permeability_[
elemIdx]; }
131 this->update(
true, TransUpdateQuantities::All,
map,
true);
162 void updateFromEclState_(
bool global);
164 void removeNonCartesianTransmissibilities_(
bool removeAll);
175 const std::array<int, dimWorld>&
cartDims);
181 std::array<std::vector<double>,3>
189 const std::array<std::vector<double>,3>& trans);
191 template <
class Intersection>
192 void computeFaceProperties(
const Intersection& intersection,
200 std::false_type)
const;
202 template <
class Intersection>
203 void computeFaceProperties(
const Intersection& intersection,
211 std::true_type)
const;
239 void applyNncMultreg_(
const std::unordered_map<std::size_t,int>&
globalToLocal);
241 void applyEditNncToGridTransHelper_(
const std::unordered_map<std::size_t,int>&
globalToLocal,
242 const std::string&
keyword,
const std::vector<NNCdata>&
nncs,
244 const std::function<
void(Scalar&,
const Scalar&)>& apply);
246 void extractPermeability_();
248 void extractPermeability_(
const std::function<
unsigned int(
unsigned int)>&
map);
250 void extractPorosity_();
252 void extractDispersion_();
254 void computeHalfTrans_(Scalar&
halfTrans,
258 const DimMatrix& perm)
const;
260 void computeHalfDiffusivity_(Scalar&
halfDiff,
263 const Scalar& poro)
const;
265 DimVector distanceVector_(
const DimVector&
faceCenter,
266 const unsigned&
cellIdx)
const;
268 void applyMultipliers_(Scalar& trans,
273 void applyNtg_(Scalar& trans,
276 const std::vector<double>&
ntg)
const;
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_;
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_;
291 bool enableDiffusivity_;
292 bool enableDispersivity_;
293 bool warnEditNNC_ =
true;
294 std::unordered_map<std::uint64_t, Scalar> thermalHalfTrans_;
295 std::unordered_map<std::uint64_t, Scalar> diffusivity_;
296 std::unordered_map<std::uint64_t, Scalar> dispersivity_;
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);
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
constexpr auto getPropValue()
get the value data member of a property
Definition propertysystem.hh:242