opm-simulators
WellHelpers.hpp
1 /*
2  Copyright 2016 SINTEF ICT, Applied Mathematics.
3  Copyright 2016 Statoil ASA.
4  Copyright 2020 OPM-OP AS.
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_WELLHELPERS_HEADER_INCLUDED
24 #define OPM_WELLHELPERS_HEADER_INCLUDED
25 
26 #include <dune/istl/bcrsmatrix.hh>
27 #include <dune/common/dynmatrix.hh>
28 
29 #include <cstdint>
30 
31 namespace Opm {
32 
33 template<class Scalar> class ParallelWellInfo;
34 struct WellProductionControls;
35 struct WellInjectionControls;
36 enum class WellProducerCMode : std::uint16_t;
37 enum class WellInjectorCMode : std::uint16_t;
38 
39 namespace wellhelpers {
40 
51 template<typename Scalar>
53 {
54 public:
55  using Block = Dune::DynamicMatrix<Scalar>;
56  using Matrix = Dune::BCRSMatrix<Block>;
57 
58  ParallelStandardWellB(const Matrix& B,
59  const ParallelWellInfo<Scalar>& parallel_well_info);
60 
62  template<class X, class Y>
63  void mv (const X& x, Y& y) const;
64 
66  template<class X, class Y>
67  void mmv (const X& x, Y& y) const;
68 
69 private:
70  const Matrix& B_;
71  const ParallelWellInfo<Scalar>& parallel_well_info_;
72 };
73 
74 template<class Scalar>
75 Scalar computeHydrostaticCorrection(const Scalar well_ref_depth,
76  const Scalar vfp_ref_depth,
77  const Scalar rho,
78  const Scalar gravity);
79 
81 template<typename MatrixType, typename VectorType, typename Comm>
82 void sumDistributedWellEntries(MatrixType& mat,
83  VectorType& vec,
84  const Comm& comm);
85 
86 
87 // explicit transpose of a dense matrix due to compilation problems
88 // used for calculating quasiimpes well weights
89 template <class DenseMatrix>
90 DenseMatrix transposeDenseDynMatrix(const DenseMatrix& M);
91 
93 bool rateControlWithZeroProdTarget(const WellProductionControls& controls,
94  WellProducerCMode mode);
95 
97 bool rateControlWithZeroInjTarget(const WellInjectionControls& controls,
98  WellInjectorCMode mode);
99 
100 } // namespace wellhelpers
101 } // namespace Opm
102 
103 #endif
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
A wrapper around the B matrix for distributed wells.
Definition: WellHelpers.hpp:52