commit
efbfbaa90c
@ -41,6 +41,9 @@ struct RstGroup {
|
|||||||
std::string name;
|
std::string name;
|
||||||
|
|
||||||
int parent_group;
|
int parent_group;
|
||||||
|
int prod_cmode;
|
||||||
|
int winj_cmode;
|
||||||
|
int ginj_cmode;
|
||||||
|
|
||||||
float oil_rate_limit;
|
float oil_rate_limit;
|
||||||
float water_rate_limit;
|
float water_rate_limit;
|
||||||
|
@ -53,6 +53,9 @@ namespace Opm { namespace RestartIO { namespace Helpers { namespace VectorItems
|
|||||||
|
|
||||||
namespace IGroup {
|
namespace IGroup {
|
||||||
enum index : std::vector<int>::size_type {
|
enum index : std::vector<int>::size_type {
|
||||||
|
ProdCMode = 1,
|
||||||
|
WInjCMode = 16,
|
||||||
|
GInjCMode = 21,
|
||||||
ParentGroup = 28,
|
ParentGroup = 28,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -40,6 +40,9 @@ RstGroup::RstGroup(const ::Opm::UnitSystem& unit_system,
|
|||||||
const double * xgrp) :
|
const double * xgrp) :
|
||||||
name(trim_copy(zwel[0])),
|
name(trim_copy(zwel[0])),
|
||||||
parent_group(igrp[header.nwgmax + VI::IGroup::ParentGroup] ),
|
parent_group(igrp[header.nwgmax + VI::IGroup::ParentGroup] ),
|
||||||
|
prod_cmode(igrp[header.nwgmax + VI::IGroup::ProdCMode]),
|
||||||
|
winj_cmode(igrp[header.nwgmax + VI::IGroup::WInjCMode]),
|
||||||
|
ginj_cmode(igrp[header.nwgmax + VI::IGroup::GInjCMode]),
|
||||||
oil_rate_limit( unit_system.to_si(M::liquid_surface_rate, sgrp[VI::SGroup::OilRateLimit])),
|
oil_rate_limit( unit_system.to_si(M::liquid_surface_rate, sgrp[VI::SGroup::OilRateLimit])),
|
||||||
water_rate_limit( unit_system.to_si(M::liquid_surface_rate, sgrp[VI::SGroup::WatRateLimit])),
|
water_rate_limit( unit_system.to_si(M::liquid_surface_rate, sgrp[VI::SGroup::WatRateLimit])),
|
||||||
gas_rate_limit( unit_system.to_si(M::gas_surface_rate, sgrp[VI::SGroup::GasRateLimit])),
|
gas_rate_limit( unit_system.to_si(M::gas_surface_rate, sgrp[VI::SGroup::GasRateLimit])),
|
||||||
|
@ -572,37 +572,38 @@ void productionGroup(const Opm::Schedule& sched,
|
|||||||
Other reduction options are currently not covered in the code
|
Other reduction options are currently not covered in the code
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
using IGroup = ::Opm::RestartIO::Helpers::VectorItems::IGroup::index;
|
||||||
if (higher_lev_ctrl > 0 && (group.getGroupType() != Opm::Group::GroupType::NONE)) {
|
if (higher_lev_ctrl > 0 && (group.getGroupType() != Opm::Group::GroupType::NONE)) {
|
||||||
iGrp[nwgmax + 1]
|
iGrp[nwgmax + IGroup::ProdCMode]
|
||||||
= (prod_guide_rate_def != Opm::Group::GuideRateTarget::NO_GUIDE_RATE) ? higher_lev_ctrl_mode : 0;
|
= (prod_guide_rate_def != Opm::Group::GuideRateTarget::NO_GUIDE_RATE) ? higher_lev_ctrl_mode : 0;
|
||||||
} else {
|
} else {
|
||||||
switch (pctl_mode) {
|
switch (pctl_mode) {
|
||||||
case Opm::Group::ProductionCMode::NONE:
|
case Opm::Group::ProductionCMode::NONE:
|
||||||
iGrp[nwgmax + 1] = 0;
|
iGrp[nwgmax + IGroup::ProdCMode] = 0;
|
||||||
break;
|
break;
|
||||||
case Opm::Group::ProductionCMode::ORAT:
|
case Opm::Group::ProductionCMode::ORAT:
|
||||||
iGrp[nwgmax + 1] = 1;
|
iGrp[nwgmax + IGroup::ProdCMode] = 1;
|
||||||
break;
|
break;
|
||||||
case Opm::Group::ProductionCMode::WRAT:
|
case Opm::Group::ProductionCMode::WRAT:
|
||||||
iGrp[nwgmax + 1] = 2;
|
iGrp[nwgmax + IGroup::ProdCMode] = 2;
|
||||||
break;
|
break;
|
||||||
case Opm::Group::ProductionCMode::GRAT:
|
case Opm::Group::ProductionCMode::GRAT:
|
||||||
iGrp[nwgmax + 1] = 3;
|
iGrp[nwgmax + IGroup::ProdCMode] = 3;
|
||||||
break;
|
break;
|
||||||
case Opm::Group::ProductionCMode::LRAT:
|
case Opm::Group::ProductionCMode::LRAT:
|
||||||
iGrp[nwgmax + 1] = 4;
|
iGrp[nwgmax + IGroup::ProdCMode] = 4;
|
||||||
break;
|
break;
|
||||||
case Opm::Group::ProductionCMode::RESV:
|
case Opm::Group::ProductionCMode::RESV:
|
||||||
iGrp[nwgmax + 1] = 5;
|
iGrp[nwgmax + IGroup::ProdCMode] = 5;
|
||||||
break;
|
break;
|
||||||
case Opm::Group::ProductionCMode::FLD:
|
case Opm::Group::ProductionCMode::FLD:
|
||||||
iGrp[nwgmax + 1] = 0; // need to be checked!!
|
iGrp[nwgmax + IGroup::ProdCMode] = 0; // need to be checked!!
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
iGrp[nwgmax + 1] = 0;
|
iGrp[nwgmax + IGroup::ProdCMode] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
iGrp[nwgmax + 9] = iGrp[nwgmax + 1];
|
iGrp[nwgmax + 9] = iGrp[nwgmax + IGroup::ProdCMode];
|
||||||
|
|
||||||
switch (prod_cmode) {
|
switch (prod_cmode) {
|
||||||
case Opm::Group::ProductionCMode::NONE:
|
case Opm::Group::ProductionCMode::NONE:
|
||||||
@ -660,8 +661,10 @@ void injectionGroup(const Opm::Schedule& sched,
|
|||||||
const std::map<Opm::Group::InjectionCMode, int>& cmodeToNum,
|
const std::map<Opm::Group::InjectionCMode, int>& cmodeToNum,
|
||||||
IGrpArray& iGrp)
|
IGrpArray& iGrp)
|
||||||
{
|
{
|
||||||
|
using IGroup = ::Opm::RestartIO::Helpers::VectorItems::IGroup::index;
|
||||||
const bool is_field = group.name() == "FIELD";
|
const bool is_field = group.name() == "FIELD";
|
||||||
auto group_parent_list = groupParentSeqIndex(sched, group, simStep);
|
auto group_parent_list = groupParentSeqIndex(sched, group, simStep);
|
||||||
|
using IGroup = ::Opm::RestartIO::Helpers::VectorItems::IGroup::index;
|
||||||
|
|
||||||
// set "default value" in case a group is only injection group
|
// set "default value" in case a group is only injection group
|
||||||
if (group.isInjectionGroup() && !group.isProductionGroup()) {
|
if (group.isInjectionGroup() && !group.isProductionGroup()) {
|
||||||
@ -670,12 +673,15 @@ void injectionGroup(const Opm::Schedule& sched,
|
|||||||
// use default value if group is not available for group control
|
// use default value if group is not available for group control
|
||||||
if (groupInjectionControllable(sched, sumState, group, Opm::Phase::WATER, simStep)) {
|
if (groupInjectionControllable(sched, sumState, group, Opm::Phase::WATER, simStep)) {
|
||||||
if ((group.hasInjectionControl(Opm::Phase::WATER)) || (group.getGroupType() == Opm::Group::GroupType::NONE)) {
|
if ((group.hasInjectionControl(Opm::Phase::WATER)) || (group.getGroupType() == Opm::Group::GroupType::NONE)) {
|
||||||
const double cur_winj_ctrl
|
|
||||||
= is_field ? sumState.get("FMCTW", -1) : sumState.get_group_var(group.name(), "GMCTW", -1);
|
if (is_field) {
|
||||||
const auto& winj_cmode = (group.hasInjectionControl(Opm::Phase::WATER))
|
iGrp[nwgmax + 17] = 0;
|
||||||
? group.injectionControls(Opm::Phase::WATER, sumState).cmode
|
iGrp[nwgmax + 22] = 0;
|
||||||
: Opm::Group::InjectionCMode::NONE;
|
} else {
|
||||||
if (!is_field) {
|
const double cur_winj_ctrl = sumState.get_group_var(group.name(), "GMCTW", -1);
|
||||||
|
const auto& winj_cmode = (group.hasInjectionControl(Opm::Phase::WATER))
|
||||||
|
? group.injectionControls(Opm::Phase::WATER, sumState).cmode
|
||||||
|
: Opm::Group::InjectionCMode::NONE;
|
||||||
int higher_lev_winj_ctrl = higherLevelInjControlGroupSeqIndex(sched, sumState, group, "GMCTW", simStep);
|
int higher_lev_winj_ctrl = higherLevelInjControlGroupSeqIndex(sched, sumState, group, "GMCTW", simStep);
|
||||||
int higher_lev_winj_cmode
|
int higher_lev_winj_cmode
|
||||||
= higherLevelInjCMode_NotNoneFld_SeqIndex(sched, sumState, group, Opm::Phase::WATER, simStep);
|
= higherLevelInjCMode_NotNoneFld_SeqIndex(sched, sumState, group, Opm::Phase::WATER, simStep);
|
||||||
@ -725,9 +731,6 @@ void injectionGroup(const Opm::Schedule& sched,
|
|||||||
} else {
|
} else {
|
||||||
iGrp[nwgmax + 17] = -1;
|
iGrp[nwgmax + 17] = -1;
|
||||||
}
|
}
|
||||||
} else { // group name "FIELD"
|
|
||||||
iGrp[nwgmax + 17] = 0;
|
|
||||||
iGrp[nwgmax + 22] = 0;
|
|
||||||
}
|
}
|
||||||
// item[nwgmax + 16] - mode for operation for water injection
|
// item[nwgmax + 16] - mode for operation for water injection
|
||||||
// 1 - RATE
|
// 1 - RATE
|
||||||
@ -740,9 +743,9 @@ void injectionGroup(const Opm::Schedule& sched,
|
|||||||
: Opm::Group::InjectionCMode::NONE;
|
: Opm::Group::InjectionCMode::NONE;
|
||||||
const auto it = cmodeToNum.find(inj_mode);
|
const auto it = cmodeToNum.find(inj_mode);
|
||||||
if (it != cmodeToNum.end()) {
|
if (it != cmodeToNum.end()) {
|
||||||
iGrp[nwgmax + 16] = it->second;
|
iGrp[nwgmax + IGroup::WInjCMode] = it->second;
|
||||||
iGrp[nwgmax + 18] = iGrp[nwgmax + 16];
|
iGrp[nwgmax + 18] = iGrp[nwgmax + IGroup::WInjCMode];
|
||||||
iGrp[nwgmax + 19] = iGrp[nwgmax + 16];
|
iGrp[nwgmax + 19] = iGrp[nwgmax + IGroup::WInjCMode];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -750,12 +753,19 @@ void injectionGroup(const Opm::Schedule& sched,
|
|||||||
// use default value if group is not available for group control
|
// use default value if group is not available for group control
|
||||||
if (groupInjectionControllable(sched, sumState, group, Opm::Phase::GAS, simStep)) {
|
if (groupInjectionControllable(sched, sumState, group, Opm::Phase::GAS, simStep)) {
|
||||||
if ((group.hasInjectionControl(Opm::Phase::GAS)) || (group.getGroupType() == Opm::Group::GroupType::NONE)) {
|
if ((group.hasInjectionControl(Opm::Phase::GAS)) || (group.getGroupType() == Opm::Group::GroupType::NONE)) {
|
||||||
const double cur_ginj_ctrl
|
if (is_field) {
|
||||||
= is_field ? sumState.get("FMCTG", -1) : sumState.get_group_var(group.name(), "GMCTG", -1);
|
iGrp[nwgmax + 17] = 0;
|
||||||
const auto& ginj_cmode = (group.hasInjectionControl(Opm::Phase::GAS))
|
iGrp[nwgmax + 22] = 0;
|
||||||
? group.injectionControls(Opm::Phase::GAS, sumState).cmode
|
// parameters connected to oil injection - not implemented in flow yet
|
||||||
: Opm::Group::InjectionCMode::NONE;
|
iGrp[nwgmax + 11] = 0;
|
||||||
if (!is_field) {
|
iGrp[nwgmax + 12] = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const double cur_ginj_ctrl = sumState.get_group_var(group.name(), "GMCTG", -1);
|
||||||
|
const auto& ginj_cmode = (group.hasInjectionControl(Opm::Phase::GAS))
|
||||||
|
? group.injectionControls(Opm::Phase::GAS, sumState).cmode
|
||||||
|
: Opm::Group::InjectionCMode::NONE;
|
||||||
|
|
||||||
int higher_lev_ginj_ctrl = higherLevelInjControlGroupSeqIndex(sched, sumState, group, "GMCTG", simStep);
|
int higher_lev_ginj_ctrl = higherLevelInjControlGroupSeqIndex(sched, sumState, group, "GMCTG", simStep);
|
||||||
int higher_lev_ginj_cmode
|
int higher_lev_ginj_cmode
|
||||||
= higherLevelInjCMode_NotNoneFld_SeqIndex(sched, sumState, group, Opm::Phase::GAS, simStep);
|
= higherLevelInjCMode_NotNoneFld_SeqIndex(sched, sumState, group, Opm::Phase::GAS, simStep);
|
||||||
@ -803,13 +813,8 @@ void injectionGroup(const Opm::Schedule& sched,
|
|||||||
} else {
|
} else {
|
||||||
iGrp[nwgmax + 22] = -1;
|
iGrp[nwgmax + 22] = -1;
|
||||||
}
|
}
|
||||||
} else { // group name "FIELD"
|
|
||||||
iGrp[nwgmax + 17] = 0;
|
|
||||||
iGrp[nwgmax + 22] = 0;
|
|
||||||
// parameters connected to oil injection - not implemented in flow yet
|
|
||||||
iGrp[nwgmax + 11] = 0;
|
|
||||||
iGrp[nwgmax + 12] = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// item[nwgmax + 21] - mode for operation for gas injection
|
// item[nwgmax + 21] - mode for operation for gas injection
|
||||||
// 1 - RATE
|
// 1 - RATE
|
||||||
// 2 - RESV
|
// 2 - RESV
|
||||||
@ -821,9 +826,9 @@ void injectionGroup(const Opm::Schedule& sched,
|
|||||||
: Opm::Group::InjectionCMode::NONE;
|
: Opm::Group::InjectionCMode::NONE;
|
||||||
const auto it = cmodeToNum.find(inj_mode);
|
const auto it = cmodeToNum.find(inj_mode);
|
||||||
if (it != cmodeToNum.end()) {
|
if (it != cmodeToNum.end()) {
|
||||||
iGrp[nwgmax + 21] = it->second;
|
iGrp[nwgmax + IGroup::GInjCMode] = it->second;
|
||||||
iGrp[nwgmax + 23] = iGrp[nwgmax + 21];
|
iGrp[nwgmax + 23] = iGrp[nwgmax + IGroup::GInjCMode];
|
||||||
iGrp[nwgmax + 24] = iGrp[nwgmax + 21];
|
iGrp[nwgmax + 24] = iGrp[nwgmax + IGroup::GInjCMode];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user