Struct for collecting group limit actions

This commit is contained in:
Paul
2023-07-14 11:16:29 +02:00
parent f8dac94ac9
commit c422724422
4 changed files with 61 additions and 65 deletions

View File

@@ -174,6 +174,31 @@ struct GroupInjectionProperties {
}
};
struct GroupLimitAction
{
ExceedAction allRates{ExceedAction::NONE};
ExceedAction water{ExceedAction::NONE};
ExceedAction gas{ExceedAction::NONE};
ExceedAction liquid{ExceedAction::NONE};
template<class Serializer>
void serializeOp(Serializer& serializer)
{
serializer(allRates);
serializer(water);
serializer(gas);
serializer(liquid);
}
bool operator==(const GroupLimitAction& other) const
{
return (this->allRates == other.allRates)
&& (this->water == other.water)
&& (this->gas == other.gas)
&& (this->liquid == other.liquid);
}
};
struct InjectionControls {
Phase phase;
InjectionCMode cmode;
@@ -194,10 +219,7 @@ struct GroupProductionProperties {
std::string name;
ProductionCMode cmode = ProductionCMode::NONE;
ExceedAction exceed_action = ExceedAction::NONE;
ExceedAction water_exceed_action = ExceedAction::NONE;
ExceedAction gas_exceed_action = ExceedAction::NONE;
ExceedAction liquid_exceed_action = ExceedAction::NONE;
GroupLimitAction group_limit_action;
UDAValue oil_target;
UDAValue water_target;
UDAValue gas_target;
@@ -219,10 +241,7 @@ struct GroupProductionProperties {
{
serializer(name);
serializer(cmode);
serializer(exceed_action);
serializer(water_exceed_action);
serializer(gas_exceed_action);
serializer(liquid_exceed_action);
serializer(group_limit_action);
serializer(oil_target);
serializer(water_target);
serializer(gas_target);
@@ -238,10 +257,7 @@ struct GroupProductionProperties {
struct ProductionControls {
ProductionCMode cmode;
ExceedAction exceed_action;
ExceedAction water_exceed_action;
ExceedAction gas_exceed_action;
ExceedAction liquid_exceed_action;
GroupLimitAction group_limit_action;
double oil_target;
double water_target;
double gas_target;

View File

@@ -127,18 +127,9 @@ namespace {
production.water_target.update(rst_group.water_rate_limit);
production.liquid_target.update(rst_group.liquid_rate_limit);
production.cmode = Opm::Group::ProductionCModeFromInt(rst_group.prod_cmode);
production.exceed_action = Opm::Group::ExceedActionFromInt(rst_group.exceed_action);
production.group_limit_action.allRates = Opm::Group::ExceedActionFromInt(rst_group.exceed_action);
production.guide_rate_def = Opm::Group::GuideRateProdTargetFromInt(rst_group.prod_guide_rate_def);
//TODO allow also for ExceedAction::NONE (item 7 of GCONPROD)
if ((production.cmode == Opm::Group::ProductionCMode::ORAT) ||
(production.cmode == Opm::Group::ProductionCMode::WRAT) ||
(production.cmode == Opm::Group::ProductionCMode::GRAT) ||
(production.cmode == Opm::Group::ProductionCMode::LRAT))
{
production.exceed_action = Opm::Group::ExceedAction::RATE;
}
production.production_controls = 0;
if (active.oil)
@@ -499,10 +490,7 @@ Group::GroupProductionProperties Group::GroupProductionProperties::serialization
Group::GroupProductionProperties result(UnitSystem(UnitSystem::UnitType::UNIT_TYPE_METRIC), "Group123");
result.name = "Group123";
result.cmode = ProductionCMode::PRBL;
result.exceed_action = ExceedAction::WELL;
result.water_exceed_action = ExceedAction::WELL;
result.gas_exceed_action = ExceedAction::WELL;
result.liquid_exceed_action = ExceedAction::WELL;
result.group_limit_action = {ExceedAction::WELL,ExceedAction::WELL,ExceedAction::WELL,ExceedAction::WELL};
result.oil_target = UDAValue(1.0);
result.water_target = UDAValue(2.0);
result.gas_target = UDAValue(3.0);
@@ -520,10 +508,7 @@ bool Group::GroupProductionProperties::operator==(const GroupProductionPropertie
return
this->name == other.name &&
this->cmode == other.cmode &&
this->exceed_action == other.exceed_action &&
this->water_exceed_action == other.water_exceed_action &&
this->gas_exceed_action == other.gas_exceed_action &&
this->liquid_exceed_action == other.liquid_exceed_action &&
this->group_limit_action == other.group_limit_action &&
this->oil_target == other.oil_target &&
this->water_target == other.water_target &&
this->gas_target == other.gas_target &&
@@ -766,10 +751,7 @@ Group::ProductionControls Group::productionControls(const SummaryState& st) cons
Group::ProductionControls pc;
pc.cmode = this->production_properties.cmode;
pc.exceed_action = this->production_properties.exceed_action;
pc.water_exceed_action = this->production_properties.water_exceed_action;
pc.gas_exceed_action = this->production_properties.gas_exceed_action;
pc.liquid_exceed_action = this->production_properties.liquid_exceed_action;
pc.group_limit_action = this->production_properties.group_limit_action;
pc.oil_target = UDA::eval_group_uda(this->production_properties.oil_target, this->m_name, st, this->udq_undefined);
pc.water_target = UDA::eval_group_uda(this->production_properties.water_target, this->m_name, st, this->udq_undefined);
pc.gas_target = UDA::eval_group_uda(this->production_properties.gas_target, this->m_name, st, this->udq_undefined);

View File

@@ -511,10 +511,11 @@ File {} line {}.)", wname, location.keyword, location.filename, location.lineno)
this->invalidNamePattern(groupNamePattern, handlerContext);
const Group::ProductionCMode controlMode = Group::ProductionCModeFromString(record.getItem("CONTROL_MODE").getTrimmedString(0));
const Group::ExceedAction exceedAction = Group::ExceedActionFromString(record.getItem("EXCEED_PROC").getTrimmedString(0));
const Group::ExceedAction waterExceedAction = Group::ExceedActionFromString(record.getItem("WATER_EXCEED_PROCEDURE").getTrimmedString(0));
const Group::ExceedAction gasExceedAction = Group::ExceedActionFromString(record.getItem("GAS_EXCEED_PROCEDURE").getTrimmedString(0));
const Group::ExceedAction liquidExceedAction = Group::ExceedActionFromString(record.getItem("LIQUID_EXCEED_PROCEDURE").getTrimmedString(0));
Group::GroupLimitAction groupLimitAction;
groupLimitAction.allRates = Group::ExceedActionFromString(record.getItem("EXCEED_PROC").getTrimmedString(0));
groupLimitAction.water = Group::ExceedActionFromString(record.getItem("WATER_EXCEED_PROCEDURE").getTrimmedString(0));
groupLimitAction.gas = Group::ExceedActionFromString(record.getItem("GAS_EXCEED_PROCEDURE").getTrimmedString(0));
groupLimitAction.liquid = Group::ExceedActionFromString(record.getItem("LIQUID_EXCEED_PROCEDURE").getTrimmedString(0));
const bool respond_to_parent = DeckItem::to_bool(record.getItem("RESPOND_TO_PARENT").getTrimmedString(0));
@@ -581,11 +582,7 @@ File {} line {}.)", wname, location.keyword, location.filename, location.lineno)
production.guide_rate_def = guide_rate_def;
production.resv_target = resv_target;
production.available_group_control = availableForGroupControl;
production.exceed_action = exceedAction;
production.water_exceed_action = waterExceedAction;
production.liquid_exceed_action = liquidExceedAction;
production.gas_exceed_action = gasExceedAction;
production.group_limit_action = groupLimitAction;
production.production_controls = 0;
// GCONPROD
@@ -593,28 +590,29 @@ File {} line {}.)", wname, location.keyword, location.filename, location.lineno)
//
// GCONPROD
// 'G1' 'ORAT' 1000 100 200 300 RATE => constraints 100,200,300 should be honored
if (production.cmode == Group::ProductionCMode::ORAT ||
(exceedAction == Group::ExceedAction::RATE && !apply_default_oil_target)) {
production.production_controls += static_cast<int>(Group::ProductionCMode::ORAT);
}
if (production.cmode == Group::ProductionCMode::WRAT ||
((exceedAction == Group::ExceedAction::RATE ||
waterExceedAction == Group::ExceedAction::RATE)
&& !apply_default_water_target)) {
production.production_controls += static_cast<int>(Group::ProductionCMode::WRAT);
}
if (production.cmode == Group::ProductionCMode::GRAT ||
((exceedAction == Group::ExceedAction::RATE ||
gasExceedAction == Group::ExceedAction::RATE)
&& !apply_default_gas_target)) {
production.production_controls += static_cast<int>(Group::ProductionCMode::GRAT);
}
if (production.cmode == Group::ProductionCMode::LRAT ||
((exceedAction == Group::ExceedAction::RATE ||
liquidExceedAction == Group::ExceedAction::RATE)
&& !apply_default_liquid_target)) {
if (production.cmode == Group::ProductionCMode::ORAT ||
(groupLimitAction.allRates == Group::ExceedAction::RATE &&
!apply_default_oil_target)) {
production.production_controls += static_cast<int>(Group::ProductionCMode::ORAT);
}
if (production.cmode == Group::ProductionCMode::WRAT ||
((groupLimitAction.allRates == Group::ExceedAction::RATE ||
groupLimitAction.water == Group::ExceedAction::RATE) &&
!apply_default_water_target)) {
production.production_controls += static_cast<int>(Group::ProductionCMode::WRAT);
}
if (production.cmode == Group::ProductionCMode::GRAT ||
((groupLimitAction.allRates == Group::ExceedAction::RATE ||
groupLimitAction.gas == Group::ExceedAction::RATE) &&
!apply_default_gas_target)) {
production.production_controls += static_cast<int>(Group::ProductionCMode::GRAT);
}
if (production.cmode == Group::ProductionCMode::LRAT ||
((groupLimitAction.allRates == Group::ExceedAction::RATE ||
groupLimitAction.liquid == Group::ExceedAction::RATE) &&
!apply_default_liquid_target)) {
production.production_controls += static_cast<int>(Group::ProductionCMode::LRAT);
}
}
if (!apply_default_resv_target)
production.production_controls += static_cast<int>(Group::ProductionCMode::RESV);

View File

@@ -412,7 +412,7 @@ void productionGroup(const Opm::Schedule& sched,
Other reduction options are currently not covered in the code
*/
const auto& p_exceed_act = production_controls.exceed_action;
const auto& p_exceed_act = production_controls.group_limit_action.allRates;
switch (deck_cmode) {
case Opm::Group::ProductionCMode::NONE:
iGrp[nwgmax + IGroup::ExceedAction] = (p_exceed_act == Opm::Group::ExceedAction::NONE) ? 0 : 4;