opm-simulators
WellBhpThpCalculator.hpp
1 /*
2  Copyright 2017 SINTEF Digital, Mathematics and Cybernetics.
3  Copyright 2017 Statoil ASA.
4  Copyright 2017 IRIS
5  Copyright 2019 Norce
6 
7  This file is part of the Open Porous Media project (OPM).
8 
9  OPM is free software: you can redistribute it and/or modify
10  it under the terms of the GNU General Public License as published by
11  the Free Software Foundation, either version 3 of the License, or
12  (at your option) any later version.
13 
14  OPM is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  GNU General Public License for more details.
18 
19  You should have received a copy of the GNU General Public License
20  along with OPM. If not, see <http://www.gnu.org/licenses/>.
21 */
22 
23 
24 #ifndef OPM_WELL_BPH_THP_CALCULATOR_HEADER_INCLUDED
25 #define OPM_WELL_BPH_THP_CALCULATOR_HEADER_INCLUDED
26 
27 #include <functional>
28 #include <optional>
29 #include <vector>
30 
31 namespace Opm {
32 
33 class DeferredLogger;
34 class SummaryState;
35 class Well;
36 template<typename Scalar, typename IndexTraits> class WellInterfaceGeneric;
37 template<typename Scalar, typename IndexTraits> class WellState;
38 
40 template<typename Scalar, typename IndexTraits>
42 public:
44  explicit WellBhpThpCalculator(const WellInterfaceGeneric<Scalar, IndexTraits>& well) : well_(well) {}
45 
47  bool wellHasTHPConstraints(const SummaryState& summaryState) const;
48 
50  Scalar getTHPConstraint(const SummaryState& summaryState) const;
51 
53  Scalar mostStrictBhpFromBhpLimits(const SummaryState& summaryState) const;
54 
56  Scalar calculateThpFromBhp(const std::vector<Scalar>& rates,
57  const Scalar bhp,
58  const Scalar rho,
59  const std::optional<Scalar>& alq,
60  const Scalar thp_limit,
61  DeferredLogger& deferred_logger) const;
62 
64  std::optional<Scalar>
65  computeBhpAtThpLimitProd(const std::function<std::vector<Scalar>(const Scalar)>& frates,
66  const SummaryState& summary_state,
67  const Scalar maxPerfPress,
68  const Scalar rho,
69  const Scalar alq_value,
70  const Scalar thp_limit,
71  DeferredLogger& deferred_logger) const;
72 
74  std::optional<Scalar>
75  computeBhpAtThpLimitInj(const std::function<std::vector<Scalar>(const Scalar)>& frates,
76  const SummaryState& summary_state,
77  const Scalar rho,
78  const Scalar flo_rel_tol,
79  const int max_iteration,
80  const bool throwOnError,
81  DeferredLogger& deferred_logger) const;
82 
84  void updateThp(const Scalar rho,
85  const std::function<Scalar()>& alq_value,
87  const SummaryState& summary_state,
88  DeferredLogger& deferred_logger) const;
89 
90  template<class EvalWell>
91  EvalWell calculateBhpFromThp(const WellState<Scalar, IndexTraits>& well_state,
92  const std::vector<EvalWell>& rates,
93  const Well& well,
94  const SummaryState& summaryState,
95  const Scalar rho,
96  DeferredLogger& deferred_logger) const;
97 
98  Scalar calculateMinimumBhpFromThp(const WellState<Scalar, IndexTraits>& well_state,
99  const Well& well,
100  const SummaryState& summaryState,
101  const Scalar rho) const;
102 
103  bool isStableSolution(const WellState<Scalar, IndexTraits>& well_state,
104  const Well& well,
105  const std::vector<Scalar>& rates,
106  const SummaryState& summaryState) const;
107 
108  std::optional<Scalar>
109  estimateStableBhp (const WellState<Scalar, IndexTraits>& well_state,
110  const Well& well,
111  const std::vector<Scalar>& rates,
112  const Scalar rho,
113  const SummaryState& summaryState) const;
114 
115  std::optional<Scalar>
116  estimateStableBhp (const WellState<Scalar, IndexTraits>& well_state,
117  const Well& well,
118  const std::vector<Scalar>& rates,
119  const Scalar rho,
120  const SummaryState& summaryState,
121  const Scalar alq) const;
122 
123  std::pair<Scalar, Scalar>
124  getFloIPR(const WellState<Scalar, IndexTraits>& well_state,
125  const Well& well,
126  const SummaryState& summary_state) const;
127 
129  static bool bruteForceBracketCommonTHP(const std::function<Scalar(const Scalar)>& eq,
130  const std::array<Scalar, 2>& range,
131  Scalar& low, Scalar& high,
132  std::optional<Scalar>& approximate_solution,
133  const Scalar& limit,
134  DeferredLogger& deferred_logger);
135 
137  static bool bruteForceBracketCommonTHP(const std::function<Scalar(const Scalar)>& eq,
138  Scalar& min_thp, Scalar& max_thp);
139 
140 private:
142  template<class ErrorPolicy>
143  std::optional<Scalar>
144  computeBhpAtThpLimitInjImpl(const std::function<std::vector<Scalar>(const Scalar)>& frates,
145  const SummaryState& summary_state,
146  const Scalar rho,
147  const Scalar flo_rel_tol,
148  const int max_iteration,
149  DeferredLogger& deferred_logger) const;
150 
152  std::optional<Scalar>
153  bhpMax(const std::function<Scalar(const Scalar)>& fflo,
154  const Scalar bhp_limit,
155  const Scalar maxPerfPress,
156  const Scalar vfp_flo_front,
157  DeferredLogger& deferred_logger) const;
158 
160  std::optional<Scalar>
161  computeBhpAtThpLimit(const std::function<std::vector<Scalar>(const Scalar)>& frates,
162  const std::function<Scalar(const std::vector<Scalar>)>& fbhp,
163  const std::array<Scalar, 2>& range,
164  DeferredLogger& deferred_logger) const;
165 
167  Scalar getVfpBhpAdjustment(const Scalar bph_tab, const Scalar thp_limit) const;
168 
170  bool bisectBracket(const std::function<Scalar(const Scalar)>& eq,
171  const std::array<Scalar, 2>& range,
172  Scalar& low, Scalar& high,
173  std::optional<Scalar>& approximate_solution,
174  DeferredLogger& deferred_logger) const;
175 
177  static bool bruteForceBracket(const std::function<Scalar(const Scalar)>& eq,
178  const std::array<Scalar, 2>& range,
179  Scalar& low, Scalar& high,
180  DeferredLogger& deferred_logger);
181 
182 
183  Scalar findThpFromBhpIteratively(const std::function<Scalar(const Scalar, const Scalar)>& thp_func,
184  const Scalar bhp,
185  const Scalar thp_limit,
186  const Scalar dp,
187  DeferredLogger& deferred_logger) const;
188 
190 };
191 
192 }
193 
194 #endif // OPM_WELL_BHP_THP_CALCULATOR_HEADER_INCLUDED
WellBhpThpCalculator(const WellInterfaceGeneric< Scalar, IndexTraits > &well)
Constructor sets reference to well.
Definition: WellBhpThpCalculator.hpp:44
Scalar calculateThpFromBhp(const std::vector< Scalar > &rates, const Scalar bhp, const Scalar rho, const std::optional< Scalar > &alq, const Scalar thp_limit, DeferredLogger &deferred_logger) const
Calculates THP from BHP.
Definition: WellBhpThpCalculator.cpp:111
Scalar getTHPConstraint(const SummaryState &summaryState) const
Get THP constraint for well.
Definition: WellBhpThpCalculator.cpp:75
bool wellHasTHPConstraints(const SummaryState &summaryState) const
Checks if well has THP constraints.
Definition: WellBhpThpCalculator.cpp:55
static bool bruteForceBracketCommonTHP(const std::function< Scalar(const Scalar)> &eq, const std::array< Scalar, 2 > &range, Scalar &low, Scalar &high, std::optional< Scalar > &approximate_solution, const Scalar &limit, DeferredLogger &deferred_logger)
Find limits using brute-force solver.
Definition: WellBhpThpCalculator.cpp:1023
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition: blackoilbioeffectsmodules.hh:45
void updateThp(const Scalar rho, const std::function< Scalar()> &alq_value, WellState< Scalar, IndexTraits > &well_state, const SummaryState &summary_state, DeferredLogger &deferred_logger) const
Update THP.
Definition: WellBhpThpCalculator.cpp:301
Scalar mostStrictBhpFromBhpLimits(const SummaryState &summaryState) const
Obtain the most strict BHP from BHP limits.
Definition: WellBhpThpCalculator.cpp:93
std::optional< Scalar > computeBhpAtThpLimitProd(const std::function< std::vector< Scalar >(const Scalar)> &frates, const SummaryState &summary_state, const Scalar maxPerfPress, const Scalar rho, const Scalar alq_value, const Scalar thp_limit, DeferredLogger &deferred_logger) const
Compute BHP from THP limit for a producer.
Definition: WellBhpThpCalculator.cpp:197
Definition: DeferredLogger.hpp:56
std::optional< Scalar > computeBhpAtThpLimitInj(const std::function< std::vector< Scalar >(const Scalar)> &frates, const SummaryState &summary_state, const Scalar rho, const Scalar flo_rel_tol, const int max_iteration, const bool throwOnError, DeferredLogger &deferred_logger) const
Compute BHP from THP limit for an injector.
Definition: WellBhpThpCalculator.cpp:280
Class for computing BHP limits.
Definition: WellBhpThpCalculator.hpp:41
Definition: BlackoilWellModelGeneric.hpp:75
The state of a set of wells, tailored for use by the fully implicit blackoil simulator.
Definition: TemperatureModel.hpp:61