opm-simulators
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 
45 namespace Opm {
46 
47 class KeywordLocation;
48 class EclipseState;
49 struct NNCdata;
50 class TransMult;
51 
52 
53 template<class Grid, class GridView, class ElementMapper, class CartesianIndexMapper, class Scalar>
55  // Grid and world dimension
56  enum { dimWorld = GridView::dimensionworld };
57 public:
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 
161 protected:
162  void updateFromEclState_(bool global);
163 
164  void removeNonCartesianTransmissibilities_(bool removeAll);
165 
166  struct FaceInfo
167  {
168  DimVector faceCenter;
169  int faceIdx;
170  unsigned elemIdx;
171  unsigned cartElemIdx;
172  };
173 
181  void applyAllZMultipliers_(Scalar& trans,
182  const FaceInfo& inside,
183  const FaceInfo& outside,
184  const TransMult& transMult,
185  const std::array<int, dimWorld>& cartDims);
186 
191  std::array<std::vector<double>,3>
192  createTransmissibilityArrays_(const std::array<bool,3>& is_tran);
193 
198  void resetTransmissibilityFromArrays_(const std::array<bool,3>& is_tran,
199  const std::array<std::vector<double>,3>& trans);
200 
201  template <class Intersection>
202  void computeFaceProperties(const Intersection& intersection,
203  FaceInfo& inside,
204  FaceInfo& outside,
205  DimVector& faceAreaNormal,
206  /*isCpGrid=*/std::false_type) const;
207 
208  template <class Intersection>
209  void computeFaceProperties(const Intersection& intersection,
210  FaceInfo& inside,
211  FaceInfo& outside,
212  DimVector& faceAreaNormal,
213  /*isCpGrid=*/std::true_type) const;
214 
215  /*
216  * \brief Applies additional transmissibilities specified via NNC keyword.
217  *
218  * Applies only those NNC that are actually represented by the grid. These may
219  * NNCs due to faults or NNCs that are actually neighbours. In both cases that
220  * specified transmissibilities (scaled by EDITNNC) will be added to the already
221  * existing models.
222  *
223  * \param cartesianToCompressed Vector containing the compressed index (or -1 for inactive
224  * cells) as the element at the cartesian index.
225  * \return Nothing.
226  */
227  void applyNncToGridTrans_(const std::unordered_map<std::size_t,int>& cartesianToCompressed);
228 
234  void applyPinchNncToGridTrans_(const std::unordered_map<std::size_t,int>& cartesianToCompressed,
235  bool applyNncMultregT);
236 
238  void applyEditNncToGridTrans_(const std::unordered_map<std::size_t,int>& globalToLocal);
239 
241  void applyEditNncrToGridTrans_(const std::unordered_map<std::size_t,int>& globalToLocal);
242 
243  void applyNncMultreg_(const std::unordered_map<std::size_t,int>& globalToLocal);
244 
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);
249 
250  void extractPermeability_();
251 
252  void extractPermeability_(const std::function<unsigned int(unsigned int)>& map);
253 
254  void extractPorosity_();
255 
256  void extractDispersion_();
257 
258  static Scalar computeHalfTrans_(const DimVector& areaNormal,
259  int faceIdx, // in the reference element that contains the intersection
260  const DimVector& distance,
261  const DimMatrix& perm);
262 
263  static Scalar computeHalfDiffusivity_(const DimVector& areaNormal,
264  const DimVector& distance,
265  const Scalar poro);
266 
267  DimVector distanceVector_(const DimVector& faceCenter,
268  const unsigned& cellIdx) const;
269 
270  void applyMultipliers_(Scalar& trans,
271  unsigned faceIdx,
272  unsigned cartElemIdx,
273  const TransMult& transMult) const;
274 
275  static void applyNtg_(Scalar& trans,
276  const FaceInfo& face,
277  const std::vector<double>& ntg);
278 
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_;
286  const Grid& grid_;
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_;
292  bool enableEnergy_;
293  bool enableDiffusivity_;
294  bool enableDispersivity_;
295  bool warnEditNNC_ = true;
296  std::unordered_map<std::uint64_t, Scalar> thermalHalfTrans_; //NB this is based on direction map size is ca 2*trans_ (diffusivity_)
297  std::unordered_map<std::uint64_t, Scalar> diffusivity_;
298  std::unordered_map<std::uint64_t, Scalar> dispersivity_;
299 
300  const LookUpData<Grid,GridView> lookUpData_;
301  const LookUpCartesianData<Grid,GridView> lookUpCartesianData_;
302 };
303 
304 namespace details {
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);
308 }
309 
310 } // namespace Opm
311 
312 #endif // OPM_TRANSMISSIBILITY_HPP
Scalar diffusivity(unsigned elemIdx1, unsigned elemIdx2) const
Return the diffusivity for the intersection between two elements.
Definition: Transmissibility_impl.hpp:150
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
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:752
Scalar dispersivity(unsigned elemIdx1, unsigned elemIdx2) const
Return the dispersivity for the intersection between two elements.
Definition: Transmissibility_impl.hpp:160
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
This file contains a set of helper functions used by VFPProd / VFPInj.
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:1197
Definition: Transmissibility.hpp:166
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:157
void applyEditNncToGridTrans_(const std::unordered_map< std::size_t, int > &globalToLocal)
Multiplies the grid transmissibilities according to EDITNNC.
Definition: Transmissibility_impl.hpp:1184
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:1068
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:912
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:830