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:
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 bool stop_or_zero_rate_target,
86 const std::function<Scalar()>& alq_value,
87 const std::array<unsigned,3>& active,
88 WellState<Scalar>& well_state,
89 const SummaryState& summary_state,
90 DeferredLogger& deferred_logger) const;
91
92 template<class EvalWell>
93 EvalWell calculateBhpFromThp(const WellState<Scalar>& well_state,
94 const std::vector<EvalWell>& rates,
95 const Well& well,
96 const SummaryState& summaryState,
97 const Scalar rho,
98 DeferredLogger& deferred_logger) const;
99
101 const Well& well,
102 const SummaryState& summaryState,
103 const Scalar rho) const;
104
105 bool isStableSolution(const WellState<Scalar>& well_state,
106 const Well& well,
107 const std::vector<Scalar>& rates,
108 const SummaryState& summaryState) const;
109
110 std::optional<Scalar>
112 const Well& well,
113 const std::vector<Scalar>& rates,
114 const Scalar rho,
115 const SummaryState& summaryState) const;
116
117 std::pair<Scalar, Scalar>
118 getFloIPR(const WellState<Scalar>& well_state,
119 const Well& well,
120 const SummaryState& summary_state) const;
121
123 static bool bruteForceBracketCommonTHP(const std::function<Scalar(const Scalar)>& eq,
124 const std::array<Scalar, 2>& range,
125 Scalar& low, Scalar& high,
126 std::optional<Scalar>& approximate_solution,
127 const Scalar& limit,
128 DeferredLogger& deferred_logger);
129
131 static bool bruteForceBracketCommonTHP(const std::function<Scalar(const Scalar)>& eq,
132 Scalar& min_thp, Scalar& max_thp);
133
134private:
136 template<class ErrorPolicy>
137 std::optional<Scalar>
138 computeBhpAtThpLimitInjImpl(const std::function<std::vector<Scalar>(const Scalar)>& frates,
139 const SummaryState& summary_state,
140 const Scalar rho,
141 const Scalar flo_rel_tol,
142 const int max_iteration,
143 DeferredLogger& deferred_logger) const;
144
146 std::optional<Scalar>
147 bhpMax(const std::function<Scalar(const Scalar)>& fflo,
148 const Scalar bhp_limit,
149 const Scalar maxPerfPress,
150 const Scalar vfp_flo_front,
151 DeferredLogger& deferred_logger) const;
152
154 std::optional<Scalar>
155 computeBhpAtThpLimit(const std::function<std::vector<Scalar>(const Scalar)>& frates,
156 const std::function<Scalar(const std::vector<Scalar>)>& fbhp,
157 const std::array<Scalar, 2>& range,
158 DeferredLogger& deferred_logger) const;
159
161 Scalar getVfpBhpAdjustment(const Scalar bph_tab, const Scalar thp_limit) const;
162
164 bool bisectBracket(const std::function<Scalar(const Scalar)>& eq,
165 const std::array<Scalar, 2>& range,
166 Scalar& low, Scalar& high,
167 std::optional<Scalar>& approximate_solution,
168 DeferredLogger& deferred_logger) const;
169
171 static bool bruteForceBracket(const std::function<Scalar(const Scalar)>& eq,
172 const std::array<Scalar, 2>& range,
173 Scalar& low, Scalar& high,
174 DeferredLogger& deferred_logger);
175
176
177 Scalar findThpFromBhpIteratively(const std::function<Scalar(const Scalar, const Scalar)>& thp_func,
178 const Scalar bhp,
179 const Scalar thp_limit,
180 const Scalar dp,
181 DeferredLogger& deferred_logger) const;
182
183 const WellInterfaceGeneric<Scalar>& well_;
184};
185
186}
187
188#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
Scalar calculateMinimumBhpFromThp(const WellState< Scalar > &well_state, const Well &well, const SummaryState &summaryState, const Scalar rho) const
void updateThp(const Scalar rho, const bool stop_or_zero_rate_target, 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.
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:51
Definition: WellState.hpp:62
Definition: blackoilboundaryratevector.hh:37