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 
105  const std::map<std::pair<unsigned, unsigned>, Scalar>& getThermalHalfTransBoundary() const;
106 
110  Scalar diffusivity(unsigned elemIdx1, unsigned elemIdx2) const;
111 
115  Scalar dispersivity(unsigned elemIdx1, unsigned elemIdx2) const;
116 
131  void finishInit(const std::function<unsigned int(unsigned int)>& map = {})
132  {
133  this->update(true, TransUpdateQuantities::All, map, /*applyNncMultRegT = */ true);
134  }
135 
159  enum class TransUpdateQuantities { Trans, All };
160  void update(bool global, TransUpdateQuantities update_quantities = TransUpdateQuantities::All,
161  const std::function<unsigned int(unsigned int)>& map = {}, bool applyNncMultRegT = false);
162 
163 protected:
164  void updateFromEclState_(bool global);
165 
166  void removeNonCartesianTransmissibilities_(bool removeAll);
167 
168  struct FaceInfo
169  {
170  DimVector faceCenter;
171  int faceIdx;
172  unsigned elemIdx;
173  unsigned cartElemIdx;
174  };
175 
183  void applyAllZMultipliers_(Scalar& trans,
184  const FaceInfo& inside,
185  const FaceInfo& outside,
186  const TransMult& transMult,
187  const std::array<int, dimWorld>& cartDims);
188 
193  std::array<std::vector<double>,3>
194  createTransmissibilityArrays_(const std::array<bool,3>& is_tran);
195 
200  void resetTransmissibilityFromArrays_(const std::array<bool,3>& is_tran,
201  const std::array<std::vector<double>,3>& trans);
202 
203  template <class Intersection>
204  void computeFaceProperties(const Intersection& intersection,
205  FaceInfo& inside,
206  FaceInfo& outside,
207  DimVector& faceAreaNormal,
208  /*isCpGrid=*/std::false_type) const;
209 
210  template <class Intersection>
211  void computeFaceProperties(const Intersection& intersection,
212  FaceInfo& inside,
213  FaceInfo& outside,
214  DimVector& faceAreaNormal,
215  /*isCpGrid=*/std::true_type) const;
216 
217  /*
218  * \brief Applies additional transmissibilities specified via NNC keyword.
219  *
220  * Applies only those NNC that are actually represented by the grid. These may
221  * NNCs due to faults or NNCs that are actually neighbours. In both cases that
222  * specified transmissibilities (scaled by EDITNNC) will be added to the already
223  * existing models.
224  *
225  * \param cartesianToCompressed Vector containing the compressed index (or -1 for inactive
226  * cells) as the element at the cartesian index.
227  * \return Nothing.
228  */
229  void applyNncToGridTrans_(const std::unordered_map<std::size_t,int>& cartesianToCompressed);
230 
236  void applyPinchNncToGridTrans_(const std::unordered_map<std::size_t,int>& cartesianToCompressed,
237  bool applyNncMultregT);
238 
240  void applyEditNncToGridTrans_(const std::unordered_map<std::size_t,int>& globalToLocal);
241 
243  void applyEditNncrToGridTrans_(const std::unordered_map<std::size_t,int>& globalToLocal);
244 
245  void applyNncMultreg_(const std::unordered_map<std::size_t,int>& globalToLocal);
246 
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);
251 
252  void extractPermeability_();
253 
254  void extractPermeability_(const std::function<unsigned int(unsigned int)>& map);
255 
256  void extractPorosity_();
257 
258  void extractDispersion_();
259 
260  static Scalar computeHalfTrans_(const DimVector& areaNormal,
261  int faceIdx, // in the reference element that contains the intersection
262  const DimVector& distance,
263  const DimMatrix& perm);
264 
265  static Scalar computeHalfDiffusivity_(const DimVector& areaNormal,
266  const DimVector& distance,
267  const Scalar poro);
268 
269  DimVector distanceVector_(const DimVector& faceCenter,
270  const unsigned& cellIdx) const;
271 
272  void applyMultipliers_(Scalar& trans,
273  unsigned faceIdx,
274  unsigned cartElemIdx,
275  const TransMult& transMult) const;
276 
277  static void applyNtg_(Scalar& trans,
278  const FaceInfo& face,
279  const std::vector<double>& ntg);
280 
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_;
288  const Grid& grid_;
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_;
294  bool enableEnergy_;
295  bool enableDiffusivity_;
296  bool enableDispersivity_;
297  bool warnEditNNC_ = true;
298  std::unordered_map<std::uint64_t, Scalar> thermalHalfTrans_; //NB this is based on direction map size is ca 2*trans_ (diffusivity_)
299  std::unordered_map<std::uint64_t, Scalar> diffusivity_;
300  std::unordered_map<std::uint64_t, Scalar> dispersivity_;
301 
302  const LookUpData<Grid,GridView> lookUpData_;
303  const LookUpCartesianData<Grid,GridView> lookUpCartesianData_;
304 };
305 
306 namespace details {
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);
310 }
311 
312 } // namespace Opm
313 
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