WellBhpThpCalculator.hpp
Go to the documentation of this file.
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
31namespace Opm {
32
33class DeferredLogger;
34class SummaryState;
35class Well;
36template<class Scalar> class WellInterfaceGeneric;
37template<class Scalar> class WellState;
38
40template<class Scalar>
42public:
44 explicit WellBhpThpCalculator(const WellInterfaceGeneric<Scalar>& 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,
86 const std::array<unsigned,3>& active,
87 WellState<Scalar>& well_state,
88 const SummaryState& summary_state,
89 DeferredLogger& deferred_logger) const;
90
91 template<class EvalWell>
92 EvalWell calculateBhpFromThp(const WellState<Scalar>& well_state,
93 const std::vector<EvalWell>& rates,
94 const Well& well,
95 const SummaryState& summaryState,
96 const Scalar rho,
97 DeferredLogger& deferred_logger) const;
98
100 const Well& well,
101 const SummaryState& summaryState,
102 const Scalar rho) const;
103
104 bool isStableSolution(const WellState<Scalar>& well_state,
105 const Well& well,
106 const std::vector<Scalar>& rates,
107 const SummaryState& summaryState) const;
108
109 std::optional<Scalar>
111 const Well& well,
112 const std::vector<Scalar>& rates,
113 const Scalar rho,
114 const SummaryState& summaryState) const;
115
116 std::pair<Scalar, Scalar>
117 getFloIPR(const WellState<Scalar>& well_state,
118 const Well& well,
119 const SummaryState& summary_state) const;
120
122 static bool bruteForceBracketCommonTHP(const std::function<Scalar(const Scalar)>& eq,
123 const std::array<Scalar, 2>& range,
124 Scalar& low, Scalar& high,
125 std::optional<Scalar>& approximate_solution,
126 const Scalar& limit,
127 DeferredLogger& deferred_logger);
128
130 static bool bruteForceBracketCommonTHP(const std::function<Scalar(const Scalar)>& eq,
131 Scalar& min_thp, Scalar& max_thp);
132
133private:
135 template<class ErrorPolicy>
136 std::optional<Scalar>
137 computeBhpAtThpLimitInjImpl(const std::function<std::vector<Scalar>(const Scalar)>& frates,
138 const SummaryState& summary_state,
139 const Scalar rho,
140 const Scalar flo_rel_tol,
141 const int max_iteration,
142 DeferredLogger& deferred_logger) const;
143
145 std::optional<Scalar>
146 bhpMax(const std::function<Scalar(const Scalar)>& fflo,
147 const Scalar bhp_limit,
148 const Scalar maxPerfPress,
149 const Scalar vfp_flo_front,
150 DeferredLogger& deferred_logger) const;
151
153 std::optional<Scalar>
154 computeBhpAtThpLimit(const std::function<std::vector<Scalar>(const Scalar)>& frates,
155 const std::function<Scalar(const std::vector<Scalar>)>& fbhp,
156 const std::array<Scalar, 2>& range,
157 DeferredLogger& deferred_logger) const;
158
160 Scalar getVfpBhpAdjustment(const Scalar bph_tab, const Scalar thp_limit) const;
161
163 bool bisectBracket(const std::function<Scalar(const Scalar)>& eq,
164 const std::array<Scalar, 2>& range,
165 Scalar& low, Scalar& high,
166 std::optional<Scalar>& approximate_solution,
167 DeferredLogger& deferred_logger) const;
168
170 static bool bruteForceBracket(const std::function<Scalar(const Scalar)>& eq,
171 const std::array<Scalar, 2>& range,
172 Scalar& low, Scalar& high,
173 DeferredLogger& deferred_logger);
174
175
176 Scalar findThpFromBhpIteratively(const std::function<Scalar(const Scalar, const Scalar)>& thp_func,
177 const Scalar bhp,
178 const Scalar thp_limit,
179 const Scalar dp,
180 DeferredLogger& deferred_logger) const;
181
182 const WellInterfaceGeneric<Scalar>& well_;
183};
184
185}
186
187#endif // OPM_WELL_BHP_THP_CALCULATOR_HEADER_INCLUDED
Definition: DeferredLogger.hpp:57
Class for computing BHP limits.
Definition: WellBhpThpCalculator.hpp:41
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.
bool wellHasTHPConstraints(const SummaryState &summaryState) const
Checks if well has THP constraints.
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.
static bool bruteForceBracketCommonTHP(const std::function< Scalar(const Scalar)> &eq, Scalar &min_thp, Scalar &max_thp)
Find limits using brute-force solver.
std::pair< Scalar, Scalar > getFloIPR(const WellState< Scalar > &well_state, const Well &well, const SummaryState &summary_state) const
std::optional< Scalar > estimateStableBhp(const WellState< Scalar > &well_state, const Well &well, const std::vector< Scalar > &rates, const Scalar rho, const SummaryState &summaryState) const
void updateThp(const Scalar rho, const std::function< Scalar()> &alq_value, const std::array< unsigned, 3 > &active, WellState< Scalar > &well_state, const SummaryState &summary_state, DeferredLogger &deferred_logger) const
Update THP.
Scalar calculateMinimumBhpFromThp(const WellState< Scalar > &well_state, const Well &well, const SummaryState &summaryState, const Scalar rho) const
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.
bool isStableSolution(const WellState< Scalar > &well_state, const Well &well, const std::vector< Scalar > &rates, const SummaryState &summaryState) const
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.
EvalWell calculateBhpFromThp(const WellState< Scalar > &well_state, const std::vector< EvalWell > &rates, const Well &well, const SummaryState &summaryState, const Scalar rho, DeferredLogger &deferred_logger) const
Scalar getTHPConstraint(const SummaryState &summaryState) const
Get THP constraint for well.
WellBhpThpCalculator(const WellInterfaceGeneric< Scalar > &well)
Constructor sets reference to well.
Definition: WellBhpThpCalculator.hpp:44
Scalar mostStrictBhpFromBhpLimits(const SummaryState &summaryState) const
Obtain the most strict BHP from BHP limits.
Definition: WellInterfaceGeneric.hpp:53
Definition: WellState.hpp:65
Definition: blackoilboundaryratevector.hh:39