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#include <opm/input/eclipse/Units/UnitSystem.hpp>
25
27
28#include <array>
29#include <map>
30#include <optional>
31#include <string>
32#include <vector>
33
34namespace Opm
35{
36
37template<typename Scalar, typename IndexTraits> class BlackoilWellModelGeneric;
38class DeferredLogger;
39class Group;
40template<typename Scalar, typename IndexTraits> class WellState;
41class WellTestState;
42
43template<typename Scalar, typename IndexTraits>
45{
46public:
47 enum class RatioViolation {
48 NONE,
49 WATER_CUT,
50 GOR,
51 WGR
52 };
53
55 {
57 std::string ratio_type;
58 Scalar ratio;
59 Scalar limit;
60 UnitSystem::measure measure;
61 };
62
64 WellTestState& well_test_state,
65 const Group& group,
66 const double simulation_time,
67 const int report_step_idx,
68 DeferredLogger& deferred_logger);
69 void closeWells();
70 bool minGasRate();
71 bool minOilRate();
72 std::optional<RatioDetails> waterCut();
73 std::optional<RatioDetails> GOR();
74 std::optional<RatioDetails> WGR();
75 std::optional<RatioDetails> ratioViolation();
76 void doWorkOver(const RatioDetails& ratio_details);
77 bool endRun();
81 const std::string& message_separator() const
83
84 static constexpr int NUM_PHASES = 3;
85
86private:
87 void displayDebugMessage(const std::string& msg) const;
88 void addPrintMessage(const std::string& msg,
89 const Scalar value,
90 const Scalar limit,
91 const UnitSystem::measure measure);
92 bool closeWellsRecursive(const Group& group, int level = 0);
93 void throwNotImplementedError(const std::string& error) const;
94
96 void collectProducerWells(const Group& group,
97 std::vector<std::string>& well_names) const;
98
102 std::optional<Scalar> computeWellRatio(const std::string& well_name,
103 const RatioViolation ratio_violation) const;
104
108 void closeWorstOffendingRatioWell(const RatioDetails& ratio_details);
109
110 std::optional<RatioDetails> groupRatioDetails(const RatioViolation ratio_violation) const;
111
113 const Group& group_;
114 const double simulation_time_;
115 const int report_step_idx_;
116 DeferredLogger& deferred_logger_;
117 const std::string date_string_;
118 const UnitSystem& unit_system_;
119 const WellState<Scalar, IndexTraits>& well_state_;
120 WellTestState& well_test_state_;
121 const Schedule& schedule_;
122 GroupEconProductionLimits::GEconGroupProp gecon_props_;
123 bool debug_ = true;
124 std::array<Scalar,NUM_PHASES> production_rates_;
125 std::map<int, unsigned> phase_idx_map_ = {
126 {0, IndexTraits::oilPhaseIdx},
127 {1, IndexTraits::gasPhaseIdx},
128 {2, IndexTraits::waterPhaseIdx}
129 };
130 std::map<unsigned, int> phase_idx_reverse_map_;
131 std::string message_;
132};
133
134} // namespace Opm
135
136#endif // OPM_GROUP_ECONOMIC_LIMITS_CHECKER_HEADER_INCLUDED
Definition: DeferredLogger.hpp:57
Definition: GroupEconomicLimitsChecker.hpp:45
const std::string & message_separator() const
Definition: GroupEconomicLimitsChecker.hpp:81
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:47
void doWorkOver(const RatioDetails &ratio_details)
std::optional< RatioDetails > ratioViolation()
static constexpr int NUM_PHASES
Definition: GroupEconomicLimitsChecker.hpp:84
std::optional< RatioDetails > GOR()
Definition: WellState.hpp:66
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:47
Definition: GroupEconomicLimitsChecker.hpp:55
std::string ratio_type
Definition: GroupEconomicLimitsChecker.hpp:57
RatioViolation violation
Definition: GroupEconomicLimitsChecker.hpp:56
Scalar limit
Definition: GroupEconomicLimitsChecker.hpp:59
UnitSystem::measure measure
Definition: GroupEconomicLimitsChecker.hpp:60
Scalar ratio
Definition: GroupEconomicLimitsChecker.hpp:58