opm-simulators
MSWellHelpers.hpp
1 /*
2  Copyright 2017 SINTEF Digital, Mathematics and Cybernetics.
3  Copyright 2017 Statoil ASA.
4  Copyright 2020 Equinor ASA.
5 
6  This file is part of the Open Porous Media project (OPM).
7 
8  OPM is free software: you can redistribute it and/or modify
9  it under the terms of the GNU General Public License as published by
10  the Free Software Foundation, either version 3 of the License, or
11  (at your option) any later version.
12 
13  OPM is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  GNU General Public License for more details.
17 
18  You should have received a copy of the GNU General Public License
19  along with OPM. If not, see <http://www.gnu.org/licenses/>.
20 */
21 
22 
23 #ifndef OPM_MSWELLHELPERS_HEADER_INCLUDED
24 #define OPM_MSWELLHELPERS_HEADER_INCLUDED
25 
26 #include <dune/istl/matrix.hh>
27 
28 namespace Dune {
29 template<class Matrix> class UMFPack;
30 }
31 
32 namespace Opm {
33 
34 template<class Scalar> class ParallelWellInfo;
35 class DeferredLogger;
36 class SICD;
37 
38 namespace mswellhelpers
39 {
40 
52  template<class MatrixType>
54  {
55  public:
56  using Scalar = typename MatrixType::field_type;
57  ParallellMSWellB(const MatrixType& B,
58  const ParallelWellInfo<Scalar>& parallel_well_info);
59 
61  template<class X, class Y>
62  void mv (const X& x, Y& y) const;
63 
65  template<class X, class Y>
66  void mmv (const X& x, Y& y) const;
67 
68  private:
69  const MatrixType& B_;
70  const ParallelWellInfo<Scalar>& parallel_well_info_;
71  };
72 
74  template <typename MatrixType, typename VectorType>
75  VectorType
76  applyUMFPack(Dune::UMFPack<MatrixType>& linsolver,
77  VectorType x);
78 
79 
80 
82  template <typename VectorType, typename MatrixType>
83  Dune::Matrix<typename MatrixType::block_type>
84  invertWithUMFPack(const int size,
85  const int bsize,
86  Dune::UMFPack<MatrixType>& linsolver);
87 
88 
89 
90  // obtain y = D^-1 * x with a BICSSTAB iterative solver
91  template <typename MatrixType, typename VectorType>
92  VectorType
93  invDX(const MatrixType& D, VectorType x, DeferredLogger& deferred_logger);
94 
95  // calculating the friction pressure loss
96  // l is the segment length
97  // area is the segment cross area
98  // diameter is the segment inner diameter
99  // w is mass flow rate through the segment
100  // density is density
101  // roughness is the absolute roughness
102  // mu is the average phase viscosity
103  template <typename ValueType, typename Scalar>
104  ValueType frictionPressureLoss(const Scalar l, const Scalar diameter,
105  const Scalar area, const Scalar roughness,
106  const ValueType& density,
107  const ValueType& w, const ValueType& mu);
108 
109 
110  template <typename ValueType, typename Scalar>
111  ValueType valveContrictionPressureLoss(const ValueType& mass_rate,
112  const ValueType& density,
113  const Scalar area_con, const Scalar cv);
114 
115 
116  template <typename ValueType, typename Scalar>
117  ValueType velocityHead(const Scalar area, const ValueType& mass_rate,
118  const ValueType& density);
119 
120 
121  // calculating the viscosity of oil-water emulsion at local conditons
122  template <typename ValueType, typename Scalar>
123  ValueType emulsionViscosity(const ValueType& water_fraction,
124  const ValueType& water_viscosity,
125  const ValueType& oil_fraction,
126  const ValueType& oil_viscosity,
127  const SICD& sicd);
128 
129 } // namespace mswellhelpers
130 } // namespace Opm
131 
132 #endif
Definition: MSWellHelpers.hpp:29
A wrapper around the B matrix for distributed MS wells.
Definition: MSWellHelpers.hpp:53
void mmv(const X &x, Y &y) const
y = A x
Definition: MSWellHelpers.cpp:136
Definition: fvbaseprimaryvariables.hh:161
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition: blackoilbioeffectsmodules.hh:45
Class encapsulating some information about parallel wells.
Definition: MSWellHelpers.hpp:34
Definition: DeferredLogger.hpp:56
void mv(const X &x, Y &y) const
y = A x
Definition: MSWellHelpers.cpp:116