mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
Split WellGroupHelpers to cpp/hpp.
Also changed namespace name.
This commit is contained in:
parent
21b98b5573
commit
f30ddffdb7
@ -39,6 +39,7 @@ list (APPEND MAIN_SOURCE_FILES
|
|||||||
opm/simulators/utils/ParallelRestart.cpp
|
opm/simulators/utils/ParallelRestart.cpp
|
||||||
opm/simulators/wells/VFPProdProperties.cpp
|
opm/simulators/wells/VFPProdProperties.cpp
|
||||||
opm/simulators/wells/VFPInjProperties.cpp
|
opm/simulators/wells/VFPInjProperties.cpp
|
||||||
|
opm/simulators/wells/WellGroupHelpers.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
if(CUDA_FOUND)
|
if(CUDA_FOUND)
|
||||||
@ -188,6 +189,7 @@ list (APPEND PUBLIC_HEADER_FILES
|
|||||||
opm/simulators/wells/PerforationData.hpp
|
opm/simulators/wells/PerforationData.hpp
|
||||||
opm/simulators/wells/RateConverter.hpp
|
opm/simulators/wells/RateConverter.hpp
|
||||||
opm/simulators/wells/SimFIBODetails.hpp
|
opm/simulators/wells/SimFIBODetails.hpp
|
||||||
|
opm/simulators/wells/TargetCalculator.hpp
|
||||||
opm/simulators/wells/WellConnectionAuxiliaryModule.hpp
|
opm/simulators/wells/WellConnectionAuxiliaryModule.hpp
|
||||||
opm/simulators/wells/WellStateFullyImplicitBlackoil.hpp
|
opm/simulators/wells/WellStateFullyImplicitBlackoil.hpp
|
||||||
opm/simulators/wells/VFPProperties.hpp
|
opm/simulators/wells/VFPProperties.hpp
|
||||||
|
@ -292,7 +292,7 @@ namespace Opm {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
const Group& fieldGroup = schedule().getGroup("FIELD", timeStepIdx);
|
const Group& fieldGroup = schedule().getGroup("FIELD", timeStepIdx);
|
||||||
wellGroupHelpers::setCmodeGroup(fieldGroup, schedule(), summaryState, timeStepIdx, well_state_);
|
WellGroupHelpers::setCmodeGroup(fieldGroup, schedule(), summaryState, timeStepIdx, well_state_);
|
||||||
|
|
||||||
// Compute reservoir volumes for RESV controls.
|
// Compute reservoir volumes for RESV controls.
|
||||||
rateConverter_.reset(new RateConverterType (phase_usage_,
|
rateConverter_.reset(new RateConverterType (phase_usage_,
|
||||||
@ -381,7 +381,7 @@ namespace Opm {
|
|||||||
|
|
||||||
//compute well guideRates
|
//compute well guideRates
|
||||||
const auto& comm = ebosSimulator_.vanguard().grid().comm();
|
const auto& comm = ebosSimulator_.vanguard().grid().comm();
|
||||||
wellGroupHelpers::updateGuideRatesForWells(schedule(), phase_usage_, reportStepIdx, simulationTime, well_state_, comm, guideRate_.get());
|
WellGroupHelpers::updateGuideRatesForWells(schedule(), phase_usage_, reportStepIdx, simulationTime, well_state_, comm, guideRate_.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -408,7 +408,7 @@ namespace Opm {
|
|||||||
well->init(&phase_usage_, depth_, gravity_, number_of_cells_);
|
well->init(&phase_usage_, depth_, gravity_, number_of_cells_);
|
||||||
const Well& wellEcl = schedule().getWell(well_name, timeStepIdx);
|
const Well& wellEcl = schedule().getWell(well_name, timeStepIdx);
|
||||||
double well_efficiency_factor = wellEcl.getEfficiencyFactor();
|
double well_efficiency_factor = wellEcl.getEfficiencyFactor();
|
||||||
wellGroupHelpers::accumulateGroupEfficiencyFactor(schedule().getGroup(wellEcl.groupName(), timeStepIdx), schedule(), timeStepIdx, well_efficiency_factor);
|
WellGroupHelpers::accumulateGroupEfficiencyFactor(schedule().getGroup(wellEcl.groupName(), timeStepIdx), schedule(), timeStepIdx, well_efficiency_factor);
|
||||||
well->setWellEfficiencyFactor(well_efficiency_factor);
|
well->setWellEfficiencyFactor(well_efficiency_factor);
|
||||||
well->setVFPProperties(vfp_properties_.get());
|
well->setVFPProperties(vfp_properties_.get());
|
||||||
well->setGuideRate(guideRate_.get());
|
well->setGuideRate(guideRate_.get());
|
||||||
@ -1231,23 +1231,23 @@ namespace Opm {
|
|||||||
// the group target reduction rates needs to be update since wells may have swicthed to/from GRUP control
|
// the group target reduction rates needs to be update since wells may have swicthed to/from GRUP control
|
||||||
// Currently the group target reduction does not honor NUPCOL. TODO: is that true?
|
// Currently the group target reduction does not honor NUPCOL. TODO: is that true?
|
||||||
std::vector<double> groupTargetReduction(numPhases(), 0.0);
|
std::vector<double> groupTargetReduction(numPhases(), 0.0);
|
||||||
wellGroupHelpers::updateGroupTargetReduction(fieldGroup, schedule(), reportStepIdx, /*isInjector*/ false, phase_usage_, well_state_nupcol_, well_state_, groupTargetReduction);
|
WellGroupHelpers::updateGroupTargetReduction(fieldGroup, schedule(), reportStepIdx, /*isInjector*/ false, phase_usage_, well_state_nupcol_, well_state_, groupTargetReduction);
|
||||||
std::vector<double> groupTargetReductionInj(numPhases(), 0.0);
|
std::vector<double> groupTargetReductionInj(numPhases(), 0.0);
|
||||||
wellGroupHelpers::updateGroupTargetReduction(fieldGroup, schedule(), reportStepIdx, /*isInjector*/ true, phase_usage_, well_state_nupcol_, well_state_, groupTargetReductionInj);
|
WellGroupHelpers::updateGroupTargetReduction(fieldGroup, schedule(), reportStepIdx, /*isInjector*/ true, phase_usage_, well_state_nupcol_, well_state_, groupTargetReductionInj);
|
||||||
|
|
||||||
const double simulationTime = ebosSimulator_.time();
|
const double simulationTime = ebosSimulator_.time();
|
||||||
std::vector<double> pot(numPhases(), 0.0);
|
std::vector<double> pot(numPhases(), 0.0);
|
||||||
wellGroupHelpers::updateGuideRateForGroups(fieldGroup, schedule(), phase_usage_, reportStepIdx, simulationTime, /*isInjector*/ false, well_state_, comm, guideRate_.get(), pot);
|
WellGroupHelpers::updateGuideRateForGroups(fieldGroup, schedule(), phase_usage_, reportStepIdx, simulationTime, /*isInjector*/ false, well_state_, comm, guideRate_.get(), pot);
|
||||||
std::vector<double> potInj(numPhases(), 0.0);
|
std::vector<double> potInj(numPhases(), 0.0);
|
||||||
wellGroupHelpers::updateGuideRateForGroups(fieldGroup, schedule(), phase_usage_, reportStepIdx, simulationTime, /*isInjector*/ true, well_state_, comm, guideRate_.get(), potInj);
|
WellGroupHelpers::updateGuideRateForGroups(fieldGroup, schedule(), phase_usage_, reportStepIdx, simulationTime, /*isInjector*/ true, well_state_, comm, guideRate_.get(), potInj);
|
||||||
|
|
||||||
const auto& summaryState = ebosSimulator_.vanguard().summaryState();
|
const auto& summaryState = ebosSimulator_.vanguard().summaryState();
|
||||||
wellGroupHelpers::updateREINForGroups(fieldGroup, schedule(), reportStepIdx, phase_usage_, summaryState, well_state_nupcol_, well_state_);
|
WellGroupHelpers::updateREINForGroups(fieldGroup, schedule(), reportStepIdx, phase_usage_, summaryState, well_state_nupcol_, well_state_);
|
||||||
wellGroupHelpers::updateVREPForGroups(fieldGroup, schedule(), reportStepIdx, well_state_nupcol_, well_state_);
|
WellGroupHelpers::updateVREPForGroups(fieldGroup, schedule(), reportStepIdx, well_state_nupcol_, well_state_);
|
||||||
|
|
||||||
wellGroupHelpers::updateReservoirRatesInjectionGroups(fieldGroup, schedule(), reportStepIdx, well_state_nupcol_, well_state_);
|
WellGroupHelpers::updateReservoirRatesInjectionGroups(fieldGroup, schedule(), reportStepIdx, well_state_nupcol_, well_state_);
|
||||||
wellGroupHelpers::updateGroupProductionRates(fieldGroup, schedule(), reportStepIdx, well_state_nupcol_, well_state_);
|
WellGroupHelpers::updateGroupProductionRates(fieldGroup, schedule(), reportStepIdx, well_state_nupcol_, well_state_);
|
||||||
wellGroupHelpers::updateWellRates(fieldGroup, schedule(), reportStepIdx, well_state_nupcol_, well_state_);
|
WellGroupHelpers::updateWellRates(fieldGroup, schedule(), reportStepIdx, well_state_nupcol_, well_state_);
|
||||||
well_state_.communicateGroupRates(comm);
|
well_state_.communicateGroupRates(comm);
|
||||||
|
|
||||||
// compute wsolvent fraction for REIN wells
|
// compute wsolvent fraction for REIN wells
|
||||||
@ -1396,7 +1396,7 @@ namespace Opm {
|
|||||||
for (auto& well : well_container_) {
|
for (auto& well : well_container_) {
|
||||||
const Well& wellEcl = well->wellEcl();
|
const Well& wellEcl = well->wellEcl();
|
||||||
double well_efficiency_factor = wellEcl.getEfficiencyFactor();
|
double well_efficiency_factor = wellEcl.getEfficiencyFactor();
|
||||||
wellGroupHelpers::accumulateGroupEfficiencyFactor(schedule().getGroup(wellEcl.groupName(), reportStepIdx), schedule(), reportStepIdx, well_efficiency_factor);
|
WellGroupHelpers::accumulateGroupEfficiencyFactor(schedule().getGroup(wellEcl.groupName(), reportStepIdx), schedule(), reportStepIdx, well_efficiency_factor);
|
||||||
well->setWellEfficiencyFactor(well_efficiency_factor);
|
well->setWellEfficiencyFactor(well_efficiency_factor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1846,7 +1846,7 @@ namespace Opm {
|
|||||||
if (currentControl != Group::ProductionCMode::ORAT)
|
if (currentControl != Group::ProductionCMode::ORAT)
|
||||||
{
|
{
|
||||||
double current_rate = 0.0;
|
double current_rate = 0.0;
|
||||||
current_rate += wellGroupHelpers::sumWellRates(group, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Liquid], false);
|
current_rate += WellGroupHelpers::sumWellRates(group, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Liquid], false);
|
||||||
|
|
||||||
// sum over all nodes
|
// sum over all nodes
|
||||||
current_rate = comm.sum(current_rate);
|
current_rate = comm.sum(current_rate);
|
||||||
@ -1863,7 +1863,7 @@ namespace Opm {
|
|||||||
{
|
{
|
||||||
|
|
||||||
double current_rate = 0.0;
|
double current_rate = 0.0;
|
||||||
current_rate += wellGroupHelpers::sumWellRates(group, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Aqua], false);
|
current_rate += WellGroupHelpers::sumWellRates(group, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Aqua], false);
|
||||||
|
|
||||||
// sum over all nodes
|
// sum over all nodes
|
||||||
current_rate = comm.sum(current_rate);
|
current_rate = comm.sum(current_rate);
|
||||||
@ -1878,7 +1878,7 @@ namespace Opm {
|
|||||||
if (currentControl != Group::ProductionCMode::GRAT)
|
if (currentControl != Group::ProductionCMode::GRAT)
|
||||||
{
|
{
|
||||||
double current_rate = 0.0;
|
double current_rate = 0.0;
|
||||||
current_rate += wellGroupHelpers::sumWellRates(group, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Vapour], false);
|
current_rate += WellGroupHelpers::sumWellRates(group, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Vapour], false);
|
||||||
|
|
||||||
// sum over all nodes
|
// sum over all nodes
|
||||||
current_rate = comm.sum(current_rate);
|
current_rate = comm.sum(current_rate);
|
||||||
@ -1892,8 +1892,8 @@ namespace Opm {
|
|||||||
if (currentControl != Group::ProductionCMode::LRAT)
|
if (currentControl != Group::ProductionCMode::LRAT)
|
||||||
{
|
{
|
||||||
double current_rate = 0.0;
|
double current_rate = 0.0;
|
||||||
current_rate += wellGroupHelpers::sumWellRates(group, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Liquid], false);
|
current_rate += WellGroupHelpers::sumWellRates(group, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Liquid], false);
|
||||||
current_rate += wellGroupHelpers::sumWellRates(group, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Aqua], false);
|
current_rate += WellGroupHelpers::sumWellRates(group, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Aqua], false);
|
||||||
|
|
||||||
// sum over all nodes
|
// sum over all nodes
|
||||||
current_rate = comm.sum(current_rate);
|
current_rate = comm.sum(current_rate);
|
||||||
@ -1913,9 +1913,9 @@ namespace Opm {
|
|||||||
if (currentControl != Group::ProductionCMode::RESV)
|
if (currentControl != Group::ProductionCMode::RESV)
|
||||||
{
|
{
|
||||||
double current_rate = 0.0;
|
double current_rate = 0.0;
|
||||||
current_rate += wellGroupHelpers::sumWellResRates(group, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Aqua], true);
|
current_rate += WellGroupHelpers::sumWellResRates(group, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Aqua], true);
|
||||||
current_rate += wellGroupHelpers::sumWellResRates(group, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Liquid], true);
|
current_rate += WellGroupHelpers::sumWellResRates(group, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Liquid], true);
|
||||||
current_rate += wellGroupHelpers::sumWellResRates(group, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Vapour], true);
|
current_rate += WellGroupHelpers::sumWellResRates(group, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Vapour], true);
|
||||||
|
|
||||||
// sum over all nodes
|
// sum over all nodes
|
||||||
current_rate = comm.sum(current_rate);
|
current_rate = comm.sum(current_rate);
|
||||||
@ -1962,7 +1962,7 @@ namespace Opm {
|
|||||||
if (currentControl != Group::InjectionCMode::RATE)
|
if (currentControl != Group::InjectionCMode::RATE)
|
||||||
{
|
{
|
||||||
double current_rate = 0.0;
|
double current_rate = 0.0;
|
||||||
current_rate += wellGroupHelpers::sumWellRates(group, schedule(), well_state, reportStepIdx, phasePos, /*isInjector*/true);
|
current_rate += WellGroupHelpers::sumWellRates(group, schedule(), well_state, reportStepIdx, phasePos, /*isInjector*/true);
|
||||||
|
|
||||||
// sum over all nodes
|
// sum over all nodes
|
||||||
current_rate = comm.sum(current_rate);
|
current_rate = comm.sum(current_rate);
|
||||||
@ -1977,7 +1977,7 @@ namespace Opm {
|
|||||||
if (currentControl != Group::InjectionCMode::RESV)
|
if (currentControl != Group::InjectionCMode::RESV)
|
||||||
{
|
{
|
||||||
double current_rate = 0.0;
|
double current_rate = 0.0;
|
||||||
current_rate += wellGroupHelpers::sumWellResRates(group, schedule(), well_state, reportStepIdx, phasePos, /*isInjector*/true);
|
current_rate += WellGroupHelpers::sumWellResRates(group, schedule(), well_state, reportStepIdx, phasePos, /*isInjector*/true);
|
||||||
// sum over all nodes
|
// sum over all nodes
|
||||||
current_rate = comm.sum(current_rate);
|
current_rate = comm.sum(current_rate);
|
||||||
|
|
||||||
@ -1992,13 +1992,13 @@ namespace Opm {
|
|||||||
{
|
{
|
||||||
double production_Rate = 0.0;
|
double production_Rate = 0.0;
|
||||||
const Group& groupRein = schedule().getGroup(controls.reinj_group, reportStepIdx);
|
const Group& groupRein = schedule().getGroup(controls.reinj_group, reportStepIdx);
|
||||||
production_Rate += wellGroupHelpers::sumWellRates(groupRein, schedule(), well_state, reportStepIdx, phasePos, /*isInjector*/false);
|
production_Rate += WellGroupHelpers::sumWellRates(groupRein, schedule(), well_state, reportStepIdx, phasePos, /*isInjector*/false);
|
||||||
|
|
||||||
// sum over all nodes
|
// sum over all nodes
|
||||||
production_Rate = comm.sum(production_Rate);
|
production_Rate = comm.sum(production_Rate);
|
||||||
|
|
||||||
double current_rate = 0.0;
|
double current_rate = 0.0;
|
||||||
current_rate += wellGroupHelpers::sumWellRates(group, schedule(), well_state, reportStepIdx, phasePos, /*isInjector*/true);
|
current_rate += WellGroupHelpers::sumWellRates(group, schedule(), well_state, reportStepIdx, phasePos, /*isInjector*/true);
|
||||||
|
|
||||||
// sum over all nodes
|
// sum over all nodes
|
||||||
current_rate = comm.sum(current_rate);
|
current_rate = comm.sum(current_rate);
|
||||||
@ -2014,17 +2014,17 @@ namespace Opm {
|
|||||||
{
|
{
|
||||||
double voidage_rate = 0.0;
|
double voidage_rate = 0.0;
|
||||||
const Group& groupVoidage = schedule().getGroup(controls.voidage_group, reportStepIdx);
|
const Group& groupVoidage = schedule().getGroup(controls.voidage_group, reportStepIdx);
|
||||||
voidage_rate += wellGroupHelpers::sumWellResRates(groupVoidage, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Aqua], false);
|
voidage_rate += WellGroupHelpers::sumWellResRates(groupVoidage, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Aqua], false);
|
||||||
voidage_rate += wellGroupHelpers::sumWellResRates(groupVoidage, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Liquid], false);
|
voidage_rate += WellGroupHelpers::sumWellResRates(groupVoidage, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Liquid], false);
|
||||||
voidage_rate += wellGroupHelpers::sumWellResRates(groupVoidage, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Vapour], false);
|
voidage_rate += WellGroupHelpers::sumWellResRates(groupVoidage, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Vapour], false);
|
||||||
|
|
||||||
// sum over all nodes
|
// sum over all nodes
|
||||||
voidage_rate = comm.sum(voidage_rate);
|
voidage_rate = comm.sum(voidage_rate);
|
||||||
|
|
||||||
double total_rate = 0.0;
|
double total_rate = 0.0;
|
||||||
total_rate += wellGroupHelpers::sumWellResRates(group, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Aqua], true);
|
total_rate += WellGroupHelpers::sumWellResRates(group, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Aqua], true);
|
||||||
total_rate += wellGroupHelpers::sumWellResRates(group, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Liquid], true);
|
total_rate += WellGroupHelpers::sumWellResRates(group, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Liquid], true);
|
||||||
total_rate += wellGroupHelpers::sumWellResRates(group, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Vapour], true);
|
total_rate += WellGroupHelpers::sumWellResRates(group, schedule(), well_state, reportStepIdx, phase_usage_.phase_pos[BlackoilPhases::Vapour], true);
|
||||||
|
|
||||||
// sum over all nodes
|
// sum over all nodes
|
||||||
total_rate = comm.sum(total_rate);
|
total_rate = comm.sum(total_rate);
|
||||||
@ -2044,8 +2044,8 @@ namespace Opm {
|
|||||||
|
|
||||||
double sales_rate = 0.0;
|
double sales_rate = 0.0;
|
||||||
int gasPos = phase_usage_.phase_pos[BlackoilPhases::Vapour];
|
int gasPos = phase_usage_.phase_pos[BlackoilPhases::Vapour];
|
||||||
sales_rate += wellGroupHelpers::sumWellRates(group, schedule(), well_state, reportStepIdx, gasPos, /*isInjector*/false);
|
sales_rate += WellGroupHelpers::sumWellRates(group, schedule(), well_state, reportStepIdx, gasPos, /*isInjector*/false);
|
||||||
sales_rate -= wellGroupHelpers::sumWellRates(group, schedule(), well_state, reportStepIdx, gasPos, /*isInjector*/true);
|
sales_rate -= WellGroupHelpers::sumWellRates(group, schedule(), well_state, reportStepIdx, gasPos, /*isInjector*/true);
|
||||||
|
|
||||||
// sum over all nodes
|
// sum over all nodes
|
||||||
sales_rate = comm.sum(sales_rate);
|
sales_rate = comm.sum(sales_rate);
|
||||||
@ -2171,13 +2171,17 @@ namespace Opm {
|
|||||||
BlackoilWellModel<TypeTag>::
|
BlackoilWellModel<TypeTag>::
|
||||||
checkGroupHigherConstraints(const Group& group, Opm::DeferredLogger& deferred_logger, std::set<std::string>& switched_groups)
|
checkGroupHigherConstraints(const Group& group, Opm::DeferredLogger& deferred_logger, std::set<std::string>& switched_groups)
|
||||||
{
|
{
|
||||||
|
// Set up coefficients for RESV <-> surface rate conversion.
|
||||||
// Use the pvtRegionIdx from the top cell of the first well.
|
// Use the pvtRegionIdx from the top cell of the first well.
|
||||||
// TODO fix this!
|
// TODO fix this!
|
||||||
// This is only used for converting RESV rates.
|
// This is only used for converting RESV rates.
|
||||||
// What is the proper approach?
|
// What is the proper approach?
|
||||||
|
const int fipnum = 0;
|
||||||
const int pvtreg = well_perf_data_.empty()
|
const int pvtreg = well_perf_data_.empty()
|
||||||
? pvt_region_idx_[0]
|
? pvt_region_idx_[0]
|
||||||
: pvt_region_idx_[well_perf_data_[0][0].cell_index];
|
: pvt_region_idx_[well_perf_data_[0][0].cell_index];
|
||||||
|
std::vector<double> resv_coeff(phase_usage_.num_phases, 0.0);
|
||||||
|
rateConverter_->calcCoeff(fipnum, pvtreg, resv_coeff);
|
||||||
|
|
||||||
const int reportStepIdx = ebosSimulator_.episodeIndex();
|
const int reportStepIdx = ebosSimulator_.episodeIndex();
|
||||||
const auto& summaryState = ebosSimulator_.vanguard().summaryState();
|
const auto& summaryState = ebosSimulator_.vanguard().summaryState();
|
||||||
@ -2190,7 +2194,7 @@ namespace Opm {
|
|||||||
if (!skip && group.isInjectionGroup()) {
|
if (!skip && group.isInjectionGroup()) {
|
||||||
// Obtain rates for group.
|
// Obtain rates for group.
|
||||||
for (int phasePos = 0; phasePos < phase_usage_.num_phases; ++phasePos) {
|
for (int phasePos = 0; phasePos < phase_usage_.num_phases; ++phasePos) {
|
||||||
const double local_current_rate = wellGroupHelpers::sumWellRates(
|
const double local_current_rate = WellGroupHelpers::sumWellRates(
|
||||||
group, schedule(), well_state_, reportStepIdx, phasePos, /* isInjector */ true);
|
group, schedule(), well_state_, reportStepIdx, phasePos, /* isInjector */ true);
|
||||||
// Sum over all processes
|
// Sum over all processes
|
||||||
rates[phasePos] = comm.sum(local_current_rate);
|
rates[phasePos] = comm.sum(local_current_rate);
|
||||||
@ -2201,7 +2205,7 @@ namespace Opm {
|
|||||||
const Group::InjectionCMode& currentControl = well_state_.currentInjectionGroupControl(phase, group.name());
|
const Group::InjectionCMode& currentControl = well_state_.currentInjectionGroupControl(phase, group.name());
|
||||||
if (currentControl != Group::InjectionCMode::FLD) {
|
if (currentControl != Group::InjectionCMode::FLD) {
|
||||||
const Group& parentGroup = schedule().getGroup(group.parent(), reportStepIdx);
|
const Group& parentGroup = schedule().getGroup(group.parent(), reportStepIdx);
|
||||||
const std::pair<bool, double> changed = wellGroupHelpers::checkGroupConstraintsInj(
|
const std::pair<bool, double> changed = WellGroupHelpers::checkGroupConstraintsInj(
|
||||||
group.name(),
|
group.name(),
|
||||||
group.parent(),
|
group.parent(),
|
||||||
parentGroup,
|
parentGroup,
|
||||||
@ -2214,8 +2218,7 @@ namespace Opm {
|
|||||||
group.getGroupEfficiencyFactor(),
|
group.getGroupEfficiencyFactor(),
|
||||||
schedule(),
|
schedule(),
|
||||||
summaryState,
|
summaryState,
|
||||||
*rateConverter_,
|
resv_coeff,
|
||||||
pvtreg,
|
|
||||||
deferred_logger);
|
deferred_logger);
|
||||||
if (changed.first) {
|
if (changed.first) {
|
||||||
switched_groups.insert(group.name());
|
switched_groups.insert(group.name());
|
||||||
@ -2228,7 +2231,7 @@ namespace Opm {
|
|||||||
if (!skip && group.isProductionGroup()) {
|
if (!skip && group.isProductionGroup()) {
|
||||||
// Obtain rates for group.
|
// Obtain rates for group.
|
||||||
for (int phasePos = 0; phasePos < phase_usage_.num_phases; ++phasePos) {
|
for (int phasePos = 0; phasePos < phase_usage_.num_phases; ++phasePos) {
|
||||||
const double local_current_rate = wellGroupHelpers::sumWellRates(
|
const double local_current_rate = WellGroupHelpers::sumWellRates(
|
||||||
group, schedule(), well_state_, reportStepIdx, phasePos, /* isInjector */ false);
|
group, schedule(), well_state_, reportStepIdx, phasePos, /* isInjector */ false);
|
||||||
// Sum over all processes
|
// Sum over all processes
|
||||||
rates[phasePos] = -comm.sum(local_current_rate);
|
rates[phasePos] = -comm.sum(local_current_rate);
|
||||||
@ -2237,7 +2240,7 @@ namespace Opm {
|
|||||||
const Group::ProductionCMode& currentControl = well_state_.currentProductionGroupControl(group.name());
|
const Group::ProductionCMode& currentControl = well_state_.currentProductionGroupControl(group.name());
|
||||||
if (currentControl != Group::ProductionCMode::FLD) {
|
if (currentControl != Group::ProductionCMode::FLD) {
|
||||||
const Group& parentGroup = schedule().getGroup(group.parent(), reportStepIdx);
|
const Group& parentGroup = schedule().getGroup(group.parent(), reportStepIdx);
|
||||||
const std::pair<bool, double> changed = wellGroupHelpers::checkGroupConstraintsProd(
|
const std::pair<bool, double> changed = WellGroupHelpers::checkGroupConstraintsProd(
|
||||||
group.name(),
|
group.name(),
|
||||||
group.parent(),
|
group.parent(),
|
||||||
parentGroup,
|
parentGroup,
|
||||||
@ -2249,8 +2252,7 @@ namespace Opm {
|
|||||||
group.getGroupEfficiencyFactor(),
|
group.getGroupEfficiencyFactor(),
|
||||||
schedule(),
|
schedule(),
|
||||||
summaryState,
|
summaryState,
|
||||||
*rateConverter_,
|
resv_coeff,
|
||||||
pvtreg,
|
|
||||||
deferred_logger);
|
deferred_logger);
|
||||||
if (changed.first) {
|
if (changed.first) {
|
||||||
switched_groups.insert(group.name());
|
switched_groups.insert(group.name());
|
||||||
@ -2283,8 +2285,8 @@ namespace Opm {
|
|||||||
const Group::InjectionCMode& currentGroupControl = wellState.currentInjectionGroupControl(Phase::GAS, group.name());
|
const Group::InjectionCMode& currentGroupControl = wellState.currentInjectionGroupControl(Phase::GAS, group.name());
|
||||||
if( currentGroupControl == Group::InjectionCMode::REIN ) {
|
if( currentGroupControl == Group::InjectionCMode::REIN ) {
|
||||||
int gasPos = phase_usage_.phase_pos[BlackoilPhases::Vapour];
|
int gasPos = phase_usage_.phase_pos[BlackoilPhases::Vapour];
|
||||||
double gasProductionRate = wellGroupHelpers::sumWellRates(group, schedule, wellState, reportStepIdx, gasPos, /*isInjector*/false);
|
double gasProductionRate = WellGroupHelpers::sumWellRates(group, schedule, wellState, reportStepIdx, gasPos, /*isInjector*/false);
|
||||||
double solventProductionRate = wellGroupHelpers::sumSolventRates(group, schedule, wellState, reportStepIdx, /*isInjector*/false);
|
double solventProductionRate = WellGroupHelpers::sumSolventRates(group, schedule, wellState, reportStepIdx, /*isInjector*/false);
|
||||||
|
|
||||||
const auto& comm = ebosSimulator_.vanguard().grid().comm();
|
const auto& comm = ebosSimulator_.vanguard().grid().comm();
|
||||||
solventProductionRate = comm.sum(solventProductionRate);
|
solventProductionRate = comm.sum(solventProductionRate);
|
||||||
|
160
opm/simulators/wells/TargetCalculator.hpp
Normal file
160
opm/simulators/wells/TargetCalculator.hpp
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2020 Equinor ASA.
|
||||||
|
|
||||||
|
This file is part of the Open Porous Media project (OPM).
|
||||||
|
|
||||||
|
OPM is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OPM is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OPM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef OPM_TARGETCALCULATOR_HEADER_INCLUDED
|
||||||
|
#define OPM_TARGETCALCULATOR_HEADER_INCLUDED
|
||||||
|
|
||||||
|
#include <opm/parser/eclipse/EclipseState/Schedule/Group/Group.hpp>
|
||||||
|
#include <opm/parser/eclipse/EclipseState/Schedule/Group/GuideRate.hpp>
|
||||||
|
#include <opm/parser/eclipse/EclipseState/Schedule/Schedule.hpp>
|
||||||
|
#include <opm/simulators/utils/DeferredLogger.hpp>
|
||||||
|
#include <opm/simulators/utils/DeferredLoggingErrorHelpers.hpp>
|
||||||
|
#include <opm/simulators/wells/WellStateFullyImplicitBlackoil.hpp>
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <cassert>
|
||||||
|
#include <type_traits>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace Opm
|
||||||
|
{
|
||||||
|
|
||||||
|
namespace WellGroupHelpers
|
||||||
|
{
|
||||||
|
|
||||||
|
/// Based on a group control mode, extract or calculate rates, and
|
||||||
|
/// provide other conveniences.
|
||||||
|
class TargetCalculator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TargetCalculator(const Group::ProductionCMode cmode,
|
||||||
|
const PhaseUsage& pu,
|
||||||
|
const std::vector<double>& resv_coeff)
|
||||||
|
: cmode_(cmode)
|
||||||
|
, pu_(pu)
|
||||||
|
, resv_coeff_(resv_coeff)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename RateVec>
|
||||||
|
auto calcModeRateFromRates(const RateVec& rates) const
|
||||||
|
{
|
||||||
|
// ElemType is just the plain element type of the rates container,
|
||||||
|
// without any reference, const or volatile modifiers.
|
||||||
|
using ElemType = std::remove_cv_t<std::remove_reference_t<decltype(rates[0])>>;
|
||||||
|
switch (cmode_) {
|
||||||
|
case Group::ProductionCMode::ORAT: {
|
||||||
|
assert(pu_.phase_used[BlackoilPhases::Liquid]);
|
||||||
|
const int pos = pu_.phase_pos[BlackoilPhases::Liquid];
|
||||||
|
return rates[pos];
|
||||||
|
}
|
||||||
|
case Group::ProductionCMode::WRAT: {
|
||||||
|
assert(pu_.phase_used[BlackoilPhases::Aqua]);
|
||||||
|
const int pos = pu_.phase_pos[BlackoilPhases::Aqua];
|
||||||
|
return rates[pos];
|
||||||
|
}
|
||||||
|
case Group::ProductionCMode::GRAT: {
|
||||||
|
assert(pu_.phase_used[BlackoilPhases::Vapour]);
|
||||||
|
const int pos = pu_.phase_pos[BlackoilPhases::Vapour];
|
||||||
|
return rates[pos];
|
||||||
|
}
|
||||||
|
case Group::ProductionCMode::LRAT: {
|
||||||
|
assert(pu_.phase_used[BlackoilPhases::Liquid]);
|
||||||
|
assert(pu_.phase_used[BlackoilPhases::Aqua]);
|
||||||
|
const int opos = pu_.phase_pos[BlackoilPhases::Liquid];
|
||||||
|
const int wpos = pu_.phase_pos[BlackoilPhases::Aqua];
|
||||||
|
return rates[opos] + rates[wpos];
|
||||||
|
}
|
||||||
|
case Group::ProductionCMode::RESV: {
|
||||||
|
assert(pu_.phase_used[BlackoilPhases::Liquid]);
|
||||||
|
assert(pu_.phase_used[BlackoilPhases::Aqua]);
|
||||||
|
assert(pu_.phase_used[BlackoilPhases::Vapour]);
|
||||||
|
ElemType mode_rate = zero<ElemType>();
|
||||||
|
for (int phase = 0; phase < pu_.num_phases; ++phase) {
|
||||||
|
mode_rate += rates[phase] * resv_coeff_[phase];
|
||||||
|
}
|
||||||
|
return mode_rate;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
// Should never be here.
|
||||||
|
assert(false);
|
||||||
|
return zero<ElemType>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
double groupTarget(const Group::ProductionControls ctrl) const
|
||||||
|
{
|
||||||
|
switch (cmode_) {
|
||||||
|
case Group::ProductionCMode::ORAT:
|
||||||
|
return ctrl.oil_target;
|
||||||
|
case Group::ProductionCMode::WRAT:
|
||||||
|
return ctrl.water_target;
|
||||||
|
case Group::ProductionCMode::GRAT:
|
||||||
|
return ctrl.gas_target;
|
||||||
|
case Group::ProductionCMode::LRAT:
|
||||||
|
return ctrl.liquid_target;
|
||||||
|
case Group::ProductionCMode::RESV:
|
||||||
|
return ctrl.resv_target;
|
||||||
|
default:
|
||||||
|
// Should never be here.
|
||||||
|
assert(false);
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GuideRateModel::Target guideTargetMode() const
|
||||||
|
{
|
||||||
|
switch (cmode_) {
|
||||||
|
case Group::ProductionCMode::ORAT:
|
||||||
|
return GuideRateModel::Target::OIL;
|
||||||
|
case Group::ProductionCMode::WRAT:
|
||||||
|
return GuideRateModel::Target::WAT;
|
||||||
|
case Group::ProductionCMode::GRAT:
|
||||||
|
return GuideRateModel::Target::GAS;
|
||||||
|
case Group::ProductionCMode::LRAT:
|
||||||
|
return GuideRateModel::Target::LIQ;
|
||||||
|
case Group::ProductionCMode::RESV:
|
||||||
|
return GuideRateModel::Target::RES;
|
||||||
|
default:
|
||||||
|
// Should never be here.
|
||||||
|
assert(false);
|
||||||
|
return GuideRateModel::Target::NONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
template <typename ElemType>
|
||||||
|
static ElemType zero()
|
||||||
|
{
|
||||||
|
// This is for Evaluation types.
|
||||||
|
ElemType x;
|
||||||
|
x = 0.0;
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
Group::ProductionCMode cmode_;
|
||||||
|
const PhaseUsage& pu_;
|
||||||
|
const std::vector<double>& resv_coeff_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace WellGroupHelpers
|
||||||
|
|
||||||
|
} // namespace Opm
|
||||||
|
|
||||||
|
#endif
|
1165
opm/simulators/wells/WellGroupHelpers.cpp
Normal file
1165
opm/simulators/wells/WellGroupHelpers.cpp
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -21,6 +21,7 @@
|
|||||||
|
|
||||||
#include <opm/parser/eclipse/EclipseState/Schedule/ScheduleTypes.hpp>
|
#include <opm/parser/eclipse/EclipseState/Schedule/ScheduleTypes.hpp>
|
||||||
#include <opm/simulators/utils/DeferredLoggingErrorHelpers.hpp>
|
#include <opm/simulators/utils/DeferredLoggingErrorHelpers.hpp>
|
||||||
|
#include <opm/simulators/wells/TargetCalculator.hpp>
|
||||||
|
|
||||||
namespace Opm
|
namespace Opm
|
||||||
{
|
{
|
||||||
@ -1773,8 +1774,13 @@ namespace Opm
|
|||||||
default:
|
default:
|
||||||
throw("Expected WATER, OIL or GAS as type for injector " + name());
|
throw("Expected WATER, OIL or GAS as type for injector " + name());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Make conversion factors for RESV <-> surface rates.
|
||||||
|
std::vector<double> resv_coeff(phaseUsage().num_phases, 1.0);
|
||||||
|
rateConverter_.calcCoeff(0, pvtRegionIdx_, resv_coeff); // FIPNUM region 0 here, should use FIPNUM from WELSPECS.
|
||||||
|
|
||||||
// Call check for the well's injection phase.
|
// Call check for the well's injection phase.
|
||||||
return wellGroupHelpers::checkGroupConstraintsInj(name(),
|
return WellGroupHelpers::checkGroupConstraintsInj(name(),
|
||||||
well_ecl_.groupName(),
|
well_ecl_.groupName(),
|
||||||
group,
|
group,
|
||||||
well_state,
|
well_state,
|
||||||
@ -1786,8 +1792,7 @@ namespace Opm
|
|||||||
efficiencyFactor,
|
efficiencyFactor,
|
||||||
schedule,
|
schedule,
|
||||||
summaryState,
|
summaryState,
|
||||||
rateConverter_,
|
resv_coeff,
|
||||||
pvtRegionIdx_,
|
|
||||||
deferred_logger);
|
deferred_logger);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1804,7 +1809,11 @@ namespace Opm
|
|||||||
const SummaryState& summaryState,
|
const SummaryState& summaryState,
|
||||||
DeferredLogger& deferred_logger) const
|
DeferredLogger& deferred_logger) const
|
||||||
{
|
{
|
||||||
return wellGroupHelpers::checkGroupConstraintsProd(name(),
|
// Make conversion factors for RESV <-> surface rates.
|
||||||
|
std::vector<double> resv_coeff(phaseUsage().num_phases, 1.0);
|
||||||
|
rateConverter_.calcCoeff(0, pvtRegionIdx_, resv_coeff); // FIPNUM region 0 here, should use FIPNUM from WELSPECS.
|
||||||
|
|
||||||
|
return WellGroupHelpers::checkGroupConstraintsProd(name(),
|
||||||
well_ecl_.groupName(),
|
well_ecl_.groupName(),
|
||||||
group,
|
group,
|
||||||
well_state,
|
well_state,
|
||||||
@ -1815,8 +1824,7 @@ namespace Opm
|
|||||||
efficiencyFactor,
|
efficiencyFactor,
|
||||||
schedule,
|
schedule,
|
||||||
summaryState,
|
summaryState,
|
||||||
rateConverter_,
|
resv_coeff,
|
||||||
pvtRegionIdx_,
|
|
||||||
deferred_logger);
|
deferred_logger);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2096,7 +2104,7 @@ namespace Opm
|
|||||||
|
|
||||||
const std::vector<double>& groupInjectionReductions = well_state.currentInjectionGroupReductionRates(group.name());
|
const std::vector<double>& groupInjectionReductions = well_state.currentInjectionGroupReductionRates(group.name());
|
||||||
double groupTargetReduction = groupInjectionReductions[phasePos];
|
double groupTargetReduction = groupInjectionReductions[phasePos];
|
||||||
double fraction = wellGroupHelpers::fractionFromInjectionPotentials(well.name(),
|
double fraction = WellGroupHelpers::fractionFromInjectionPotentials(well.name(),
|
||||||
group.name(),
|
group.name(),
|
||||||
schedule,
|
schedule,
|
||||||
well_state,
|
well_state,
|
||||||
@ -2242,8 +2250,13 @@ namespace Opm
|
|||||||
|
|
||||||
// If we are here, we are at the topmost group to be visited in the recursion.
|
// If we are here, we are at the topmost group to be visited in the recursion.
|
||||||
// This is the group containing the control we will check against.
|
// This is the group containing the control we will check against.
|
||||||
wellGroupHelpers::TargetCalculator tcalc(currentGroupControl, pu, rateConverter_, pvtRegionIdx_);
|
|
||||||
wellGroupHelpers::FractionCalculator fcalc(schedule, well_state, current_step_, guide_rate_, tcalc.guideTargetMode(), pu);
|
// Make conversion factors for RESV <-> surface rates.
|
||||||
|
std::vector<double> resv_coeff(phaseUsage().num_phases, 1.0);
|
||||||
|
rateConverter_.calcCoeff(0, pvtRegionIdx_, resv_coeff); // FIPNUM region 0 here, should use FIPNUM from WELSPECS.
|
||||||
|
|
||||||
|
WellGroupHelpers::TargetCalculator tcalc(currentGroupControl, pu, resv_coeff);
|
||||||
|
WellGroupHelpers::FractionCalculator fcalc(schedule, well_state, current_step_, guide_rate_, tcalc.guideTargetMode(), pu);
|
||||||
|
|
||||||
auto localFraction = [&](const std::string& child) {
|
auto localFraction = [&](const std::string& child) {
|
||||||
return fcalc.localFraction(child, "");
|
return fcalc.localFraction(child, "");
|
||||||
@ -2255,7 +2268,7 @@ namespace Opm
|
|||||||
};
|
};
|
||||||
|
|
||||||
const double orig_target = tcalc.groupTarget(group.productionControls(summaryState));
|
const double orig_target = tcalc.groupTarget(group.productionControls(summaryState));
|
||||||
const auto chain = wellGroupHelpers::groupChainTopBot(name(), group.name(), schedule, current_step_);
|
const auto chain = WellGroupHelpers::groupChainTopBot(name(), group.name(), schedule, current_step_);
|
||||||
// Because 'name' is the last of the elements, and not an ancestor, we subtract one below.
|
// Because 'name' is the last of the elements, and not an ancestor, we subtract one below.
|
||||||
const size_t num_ancestors = chain.size() - 1;
|
const size_t num_ancestors = chain.size() - 1;
|
||||||
double target = orig_target;
|
double target = orig_target;
|
||||||
|
Loading…
Reference in New Issue
Block a user