GroupEconomicLimitsChecker.hpp
Go to the documentation of this file.
1/*
2 Copyright 2023 Equinor ASA.
3
4 This file is part of the Open Porous Media project (OPM).
5
6 OPM is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
10
11 OPM is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with OPM. If not, see <http://www.gnu.org/licenses/>.
18*/
19
20#ifndef OPM_GROUP_ECONOMIC_LIMITS_CHECKER_HEADER_INCLUDED
21#define OPM_GROUP_ECONOMIC_LIMITS_CHECKER_HEADER_INCLUDED
22
23#include <opm/input/eclipse/Schedule/Group/GroupEconProductionLimits.hpp>
24
25#include <opm/input/eclipse/Units/UnitSystem.hpp>
26
28
29#include <array>
30#include <map>
31#include <optional>
32#include <string>
33#include <vector>
34
35namespace Opm
36{
37
38template<typename Scalar, typename IndexTraits> class BlackoilWellModelGeneric;
39class DeferredLogger;
40class Group;
41template<typename Scalar, typename IndexTraits> class WellState;
42class WellTestState;
43
44} // namespace Opm
45
46namespace Opm {
47
48template<typename Scalar, typename IndexTraits>
50{
51public:
52 enum class RatioViolation {
53 NONE,
54 WATER_CUT,
55 GOR,
56 WGR
57 };
58
60 {
62 std::string ratio_type;
63 Scalar ratio;
64 Scalar limit;
65 UnitSystem::measure measure;
66 };
67
69 WellTestState& well_test_state,
70 const Group& group,
71 const double simulation_time,
72 const int report_step_idx,
73 DeferredLogger& deferred_logger);
74 void closeWells();
75 bool minGasRate();
76 bool minOilRate();
77 std::optional<RatioDetails> waterCut();
78 std::optional<RatioDetails> GOR();
79 std::optional<RatioDetails> WGR();
80 std::optional<RatioDetails> ratioViolation();
81 void doWorkOver(const RatioDetails& ratio_details);
82 bool endRun();
86 const std::string& message_separator() const
88
89 static constexpr int NUM_PHASES = 3;
90
91private:
92 void displayDebugMessage(const std::string& msg) const;
93 void addPrintMessage(const std::string& msg,
94 const Scalar value,
95 const Scalar limit,
96 const UnitSystem::measure measure);
97 bool closeWellsRecursive(const Group& group, int level = 0);
98 void throwNotImplementedError(const std::string& error) const;
99
101 void collectProducerWells(const Group& group,
102 std::vector<std::string>& well_names) const;
103
107 std::optional<Scalar> computeWellRatio(const std::string& well_name,
108 const RatioViolation ratio_violation) const;
109
113 void closeWorstOffendingRatioWell(const RatioDetails& ratio_details);
114
115 std::optional<RatioDetails> groupRatioDetails(const RatioViolation ratio_violation) const;
116
118 const Group& group_;
119 const double simulation_time_;
120 const int report_step_idx_;
121 DeferredLogger& deferred_logger_;
122 const std::string date_string_;
123 const UnitSystem& unit_system_;
124 const WellState<Scalar, IndexTraits>& well_state_;
125 WellTestState& well_test_state_;
126 GroupEconProductionLimits::GEconGroupProp gecon_props_;
127 bool debug_ = true;
128 std::array<Scalar,NUM_PHASES> production_rates_;
129 std::map<int, unsigned> phase_idx_map_ = {
130 {0, IndexTraits::oilPhaseIdx},
131 {1, IndexTraits::gasPhaseIdx},
132 {2, IndexTraits::waterPhaseIdx}
133 };
134 std::map<unsigned, int> phase_idx_reverse_map_;
135 std::string message_;
136};
137
138} // namespace Opm
139
140#endif // OPM_GROUP_ECONOMIC_LIMITS_CHECKER_HEADER_INCLUDED
Definition: DeferredLogger.hpp:57
Definition: GroupEconomicLimitsChecker.hpp:50
const std::string & message_separator() const
Definition: GroupEconomicLimitsChecker.hpp:86
GroupEconomicLimitsChecker(const BlackoilWellModelGeneric< Scalar, IndexTraits > &well_model, WellTestState &well_test_state, const Group &group, const double simulation_time, const int report_step_idx, DeferredLogger &deferred_logger)
std::optional< RatioDetails > WGR()
std::optional< RatioDetails > waterCut()
RatioViolation
Definition: GroupEconomicLimitsChecker.hpp:52
void doWorkOver(const RatioDetails &ratio_details)
std::optional< RatioDetails > ratioViolation()
static constexpr int NUM_PHASES
Definition: GroupEconomicLimitsChecker.hpp:89
std::optional< RatioDetails > GOR()
Definition: WellState.hpp:68
Definition: blackoilbioeffectsmodules.hh:45
const std::string & economicLimitMessageSeparator()
Separator line used to frame economic-limit workover messages. Built once and returned by reference (...
Definition: EconomicLimitsMessage.hpp:61
Definition: GroupEconomicLimitsChecker.hpp:60
std::string ratio_type
Definition: GroupEconomicLimitsChecker.hpp:62
RatioViolation violation
Definition: GroupEconomicLimitsChecker.hpp:61
Scalar limit
Definition: GroupEconomicLimitsChecker.hpp:64
UnitSystem::measure measure
Definition: GroupEconomicLimitsChecker.hpp:65
Scalar ratio
Definition: GroupEconomicLimitsChecker.hpp:63