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> 47 class KeywordLocation;
53 template<
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,
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;
105 const std::map<std::pair<unsigned, unsigned>, Scalar>& getThermalHalfTransBoundary()
const;
110 Scalar
diffusivity(
unsigned elemIdx1,
unsigned elemIdx2)
const;
115 Scalar
dispersivity(
unsigned elemIdx1,
unsigned elemIdx2)
const;
131 void finishInit(
const std::function<
unsigned int(
unsigned int)>& map = {})
133 this->update(
true, TransUpdateQuantities::All, map,
true);
161 const std::function<
unsigned int(
unsigned int)>& map = {},
bool applyNncMultRegT =
false);
164 void updateFromEclState_(
bool global);
166 void removeNonCartesianTransmissibilities_(
bool removeAll);
170 DimVector faceCenter;
173 unsigned cartElemIdx;
186 const TransMult& transMult,
187 const std::array<int, dimWorld>& cartDims);
193 std::array<std::vector<double>,3>
201 const std::array<std::vector<double>,3>& trans);
203 template <
class Intersection>
204 void computeFaceProperties(
const Intersection& intersection,
207 DimVector& faceAreaNormal,
208 std::false_type)
const;
210 template <
class Intersection>
211 void computeFaceProperties(
const Intersection& intersection,
214 DimVector& faceAreaNormal,
215 std::true_type)
const;
229 void applyNncToGridTrans_(
const std::unordered_map<std::size_t,int>& cartesianToCompressed);
237 bool applyNncMultregT);
245 void applyNncMultreg_(
const std::unordered_map<std::size_t,int>& globalToLocal);
247 void applyEditNncToGridTransHelper_(
const std::unordered_map<std::size_t,int>& globalToLocal,
248 const std::string& keyword,
const std::vector<NNCdata>& nncs,
249 const std::function<KeywordLocation(
const NNCdata&)>& getLocation,
250 const std::function<
void(Scalar&,
const Scalar&)>& apply);
252 void extractPermeability_();
254 void extractPermeability_(
const std::function<
unsigned int(
unsigned int)>& map);
256 void extractPorosity_();
258 void extractDispersion_();
260 static Scalar computeHalfTrans_(
const DimVector& areaNormal,
262 const DimVector& distance,
263 const DimMatrix& perm);
265 static Scalar computeHalfDiffusivity_(
const DimVector& areaNormal,
266 const DimVector& distance,
269 DimVector distanceVector_(
const DimVector& faceCenter,
270 const unsigned& cellIdx)
const;
272 void applyMultipliers_(Scalar& trans,
274 unsigned cartElemIdx,
275 const TransMult& transMult)
const;
277 static void applyNtg_(Scalar& trans,
279 const std::vector<double>& ntg);
281 std::vector<DimMatrix> permeability_;
282 std::vector<Scalar> porosity_;
283 std::vector<Scalar> dispersion_;
284 std::unordered_map<std::uint64_t, Scalar> trans_;
285 const EclipseState& eclState_;
286 const GridView& gridView_;
287 const CartesianIndexMapper& cartMapper_;
289 std::function<std::array<double,dimWorld>(int)> centroids_;
290 std::vector<std::array<double,dimWorld>> centroids_cache_;
291 Scalar transmissibilityThreshold_;
292 std::map<std::pair<unsigned, unsigned>, Scalar> transBoundary_;
293 std::map<std::pair<unsigned, unsigned>, Scalar> thermalHalfTransBoundary_;
295 bool enableDiffusivity_;
296 bool enableDispersivity_;
297 bool warnEditNNC_ =
true;
298 std::unordered_map<std::uint64_t, Scalar> thermalHalfTrans_;
299 std::unordered_map<std::uint64_t, Scalar> diffusivity_;
300 std::unordered_map<std::uint64_t, Scalar> dispersivity_;
307 std::uint64_t isId(std::uint32_t elemIdx1, std::uint32_t elemIdx2);
308 std::pair<std::uint32_t, std::uint32_t> isIdReverse(
const std::uint64_t&
id);
309 std::uint64_t directionalIsId(std::uint32_t elemIdx1, std::uint32_t elemIdx2);
314 #endif // OPM_TRANSMISSIBILITY_HPP Scalar diffusivity(unsigned elemIdx1, unsigned elemIdx2) const
Return the diffusivity for the intersection between two elements.
Definition: Transmissibility_impl.hpp:157
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:131
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:759
Scalar dispersivity(unsigned elemIdx1, unsigned elemIdx2) const
Return the dispersivity for the intersection between two elements.
Definition: Transmissibility_impl.hpp:167
Scalar transmissibility(unsigned elemIdx1, unsigned elemIdx2) const
Return the transmissibility for the intersection between two elements.
Definition: Transmissibility_impl.hpp:122
const DimMatrix & permeability(unsigned elemIdx) const
Return the permeability for an element.
Definition: Transmissibility.hpp:74
Structs needed for tpfalinearizer and its gpuparams struct extracted to be defined in one place that ...
Definition: blackoilbioeffectsmodules.hh:45
void applyEditNncrToGridTrans_(const std::unordered_map< std::size_t, int > &globalToLocal)
Resets the grid transmissibilities according to EDITNNCR.
Definition: Transmissibility_impl.hpp:1204
Definition: Transmissibility.hpp:168
Scalar transmissibilityBoundary(unsigned elemIdx, unsigned boundaryFaceIdx) const
Return the transmissibility for a given boundary segment.
Definition: Transmissibility_impl.hpp:129
Definition: FlowGenericProblem.hpp:51
TransUpdateQuantities
Compute all transmissibilities.
Definition: Transmissibility.hpp:159
void applyEditNncToGridTrans_(const std::unordered_map< std::size_t, int > &globalToLocal)
Multiplies the grid transmissibilities according to EDITNNC.
Definition: Transmissibility_impl.hpp:1191
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:1075
Definition: Transmissibility.hpp:54
Definition: GenericThresholdPressure.hpp:40
void resetTransmissibilityFromArrays_(const std::array< bool, 3 > &is_tran, const std::array< std::vector< double >, 3 > &trans)
overwrites calculated transmissibilities
Definition: Transmissibility_impl.hpp:919
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:837