mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
commit
e288a61c59
@ -49,6 +49,7 @@
|
|||||||
#include <opm/input/eclipse/Schedule/Group/GConSale.hpp>
|
#include <opm/input/eclipse/Schedule/Group/GConSale.hpp>
|
||||||
#include <opm/input/eclipse/Schedule/Group/GroupEconProductionLimits.hpp>
|
#include <opm/input/eclipse/Schedule/Group/GroupEconProductionLimits.hpp>
|
||||||
#include <opm/input/eclipse/Schedule/Group/GConSump.hpp>
|
#include <opm/input/eclipse/Schedule/Group/GConSump.hpp>
|
||||||
|
#include <opm/input/eclipse/Schedule/Group/GSatProd.hpp>
|
||||||
#include <opm/input/eclipse/Schedule/Group/GuideRateConfig.hpp>
|
#include <opm/input/eclipse/Schedule/Group/GuideRateConfig.hpp>
|
||||||
#include <opm/input/eclipse/Schedule/Network/Balance.hpp>
|
#include <opm/input/eclipse/Schedule/Network/Balance.hpp>
|
||||||
#include <opm/input/eclipse/Schedule/Network/ExtNetwork.hpp>
|
#include <opm/input/eclipse/Schedule/Network/ExtNetwork.hpp>
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
#include <opm/input/eclipse/Schedule/Group/GroupEconProductionLimits.hpp>
|
#include <opm/input/eclipse/Schedule/Group/GroupEconProductionLimits.hpp>
|
||||||
#include <opm/input/eclipse/Schedule/Group/GConSale.hpp>
|
#include <opm/input/eclipse/Schedule/Group/GConSale.hpp>
|
||||||
#include <opm/input/eclipse/Schedule/Group/GConSump.hpp>
|
#include <opm/input/eclipse/Schedule/Group/GConSump.hpp>
|
||||||
|
#include <opm/input/eclipse/Schedule/Group/GSatProd.hpp>
|
||||||
#include <opm/input/eclipse/Schedule/Group/GuideRateConfig.hpp>
|
#include <opm/input/eclipse/Schedule/Group/GuideRateConfig.hpp>
|
||||||
#include <opm/input/eclipse/Schedule/MSW/SICD.hpp>
|
#include <opm/input/eclipse/Schedule/MSW/SICD.hpp>
|
||||||
#include <opm/input/eclipse/Schedule/MSW/Valve.hpp>
|
#include <opm/input/eclipse/Schedule/MSW/Valve.hpp>
|
||||||
|
@ -602,6 +602,14 @@ partiallySupported()
|
|||||||
{20,{true, allow_values<double> {}, "GCONPROD(COMBRATE): linearly combined rate is not used and should be defaulted (1*)"}}, // LINEAR_COMBINED_TARGET
|
{20,{true, allow_values<double> {}, "GCONPROD(COMBRATE): linearly combined rate is not used and should be defaulted (1*)"}}, // LINEAR_COMBINED_TARGET
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"GSATPROD",
|
||||||
|
{
|
||||||
|
{5,{true, allow_values<double> {.0}, "GSATPROD(RESV): reservoir volume rate is not supported and should be defaulted (1*)"}}, // RESERVOIR_VOLUME_RATE
|
||||||
|
{6,{true, allow_values<double> {.0}, "GSATPROD(GASLIFT): gaslift rate is not supported and should be defaulted (1*)"}}, // GASLIFT
|
||||||
|
{7,{false, allow_values<double> {.0}, "GSATPROD(CALRATE): calorific rate is not used and should be defaulted (1*)"}}, // CALORIFIC_RATE
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"GUIDERAT",
|
"GUIDERAT",
|
||||||
{
|
{
|
||||||
|
@ -253,7 +253,6 @@ const KeywordValidation::UnsupportedKeywords& unsupportedKeywords()
|
|||||||
{"GTADD", {true, std::nullopt}},
|
{"GTADD", {true, std::nullopt}},
|
||||||
{"GTMULT", {true, std::nullopt}},
|
{"GTMULT", {true, std::nullopt}},
|
||||||
{"GUIDECAL", {true, std::nullopt}},
|
{"GUIDECAL", {true, std::nullopt}},
|
||||||
{"GSATPROD", {true, std::nullopt}},
|
|
||||||
{"GUPFREQ", {true, std::nullopt}},
|
{"GUPFREQ", {true, std::nullopt}},
|
||||||
{"GWRTWCV", {true, std::nullopt}},
|
{"GWRTWCV", {true, std::nullopt}},
|
||||||
{"HALFTRAN", {true, std::nullopt}},
|
{"HALFTRAN", {true, std::nullopt}},
|
||||||
|
@ -119,6 +119,12 @@ void GlobalWellInfo<Scalar>::clear()
|
|||||||
this->m_efficiency_scaling_factors.assign(this->name_map.size(), 1.0);
|
this->m_efficiency_scaling_factors.assign(this->name_map.size(), 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<class Scalar>
|
||||||
|
bool GlobalWellInfo<Scalar>::isRank0() const
|
||||||
|
{
|
||||||
|
return is_rank0_;
|
||||||
|
}
|
||||||
|
|
||||||
template<class Scalar>
|
template<class Scalar>
|
||||||
Scalar GlobalWellInfo<Scalar>::
|
Scalar GlobalWellInfo<Scalar>::
|
||||||
efficiency_scaling_factor(const std::string& wname) const
|
efficiency_scaling_factor(const std::string& wname) const
|
||||||
|
@ -65,6 +65,7 @@ public:
|
|||||||
comm.sum( this->m_in_producing_group.data(), size);
|
comm.sum( this->m_in_producing_group.data(), size);
|
||||||
comm.sum( this->m_is_open.data(), size);
|
comm.sum( this->m_is_open.data(), size);
|
||||||
comm.min( this->m_efficiency_scaling_factors.data(), size);
|
comm.min( this->m_efficiency_scaling_factors.data(), size);
|
||||||
|
is_rank0_ = (comm.rank() == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -80,6 +81,7 @@ public:
|
|||||||
void update_efficiency_scaling_factor(std::size_t well_index, const Scalar efficiency_scaling_factor);
|
void update_efficiency_scaling_factor(std::size_t well_index, const Scalar efficiency_scaling_factor);
|
||||||
Scalar efficiency_scaling_factor(const std::string& wname) const;
|
Scalar efficiency_scaling_factor(const std::string& wname) const;
|
||||||
void clear();
|
void clear();
|
||||||
|
bool isRank0() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::vector<std::size_t> local_map; // local_index -> global_index
|
std::vector<std::size_t> local_map; // local_index -> global_index
|
||||||
@ -89,6 +91,7 @@ private:
|
|||||||
std::vector<int> m_in_producing_group; // global_index -> int/bool
|
std::vector<int> m_in_producing_group; // global_index -> int/bool
|
||||||
std::vector<int> m_is_open; // global_index -> int/bool
|
std::vector<int> m_is_open; // global_index -> int/bool
|
||||||
std::vector<Scalar> m_efficiency_scaling_factors; // global_index --> double
|
std::vector<Scalar> m_efficiency_scaling_factors; // global_index --> double
|
||||||
|
bool is_rank0_{true};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#include <opm/input/eclipse/Schedule/Schedule.hpp>
|
#include <opm/input/eclipse/Schedule/Schedule.hpp>
|
||||||
#include <opm/input/eclipse/Schedule/Group/GConSump.hpp>
|
#include <opm/input/eclipse/Schedule/Group/GConSump.hpp>
|
||||||
#include <opm/input/eclipse/Schedule/Group/GConSale.hpp>
|
#include <opm/input/eclipse/Schedule/Group/GConSale.hpp>
|
||||||
|
#include <opm/input/eclipse/Schedule/Group/GSatProd.hpp>
|
||||||
#include <opm/input/eclipse/Schedule/Group/GPMaint.hpp>
|
#include <opm/input/eclipse/Schedule/Group/GPMaint.hpp>
|
||||||
#include <opm/input/eclipse/Schedule/Group/Group.hpp>
|
#include <opm/input/eclipse/Schedule/Group/Group.hpp>
|
||||||
#include <opm/input/eclipse/Schedule/Group/GuideRateConfig.hpp>
|
#include <opm/input/eclipse/Schedule/Group/GuideRateConfig.hpp>
|
||||||
@ -99,6 +100,14 @@ namespace Opm {
|
|||||||
rate += gefac * sumWellPhaseRates(res_rates, groupTmp, schedule, wellState, reportStepIdx, phasePos, injector);
|
rate += gefac * sumWellPhaseRates(res_rates, groupTmp, schedule, wellState, reportStepIdx, phasePos, injector);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// only sum satelite production once
|
||||||
|
if (wellState.isRank0() && !injector) {
|
||||||
|
const auto rateComp = selectRateComponent(wellState.phaseUsage(), phasePos);
|
||||||
|
if (rateComp.has_value()) {
|
||||||
|
rate += satelliteProduction(schedule[reportStepIdx], group.groups(), *rateComp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (const std::string& wellName : group.wells()) {
|
for (const std::string& wellName : group.wells()) {
|
||||||
const auto& well_index = wellState.index(wellName);
|
const auto& well_index = wellState.index(wellName);
|
||||||
if (!well_index.has_value())
|
if (!well_index.has_value())
|
||||||
@ -137,6 +146,42 @@ namespace Opm {
|
|||||||
return rate;
|
return rate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename Scalar>
|
||||||
|
Scalar WellGroupHelpers<Scalar>::
|
||||||
|
satelliteProduction(const ScheduleState& sched,
|
||||||
|
const std::vector<std::string>& groups,
|
||||||
|
const GSatProd::GSatProdGroup::Rate rateComp)
|
||||||
|
{
|
||||||
|
auto gsatProdRate = Scalar{};
|
||||||
|
const auto& gsatProd = sched.gsatprod();
|
||||||
|
for (const auto& group : groups) {
|
||||||
|
if (! gsatProd.has(group)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
gsatProdRate += gsatProd.get(group).rate[rateComp];
|
||||||
|
}
|
||||||
|
return gsatProdRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Scalar>
|
||||||
|
std::optional<GSatProd::GSatProdGroup::Rate> WellGroupHelpers<Scalar>::
|
||||||
|
selectRateComponent(const PhaseUsage& pu, const int phasePos)
|
||||||
|
{
|
||||||
|
using Rate = GSatProd::GSatProdGroup::Rate;
|
||||||
|
|
||||||
|
for (const auto& [phase, rateComp] : std::array {
|
||||||
|
std::pair { BlackoilPhases::Aqua, Rate::Water },
|
||||||
|
std::pair { BlackoilPhases::Liquid, Rate::Oil },
|
||||||
|
std::pair { BlackoilPhases::Vapour, Rate::Gas } })
|
||||||
|
{
|
||||||
|
if (pu.phase_used[phase] && (pu.phase_pos[phase] == phasePos)) {
|
||||||
|
return rateComp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
template<class Scalar>
|
template<class Scalar>
|
||||||
void WellGroupHelpers<Scalar>::
|
void WellGroupHelpers<Scalar>::
|
||||||
setCmodeGroup(const Group& group,
|
setCmodeGroup(const Group& group,
|
||||||
|
@ -22,8 +22,10 @@
|
|||||||
#define OPM_WELLGROUPHELPERS_HEADER_INCLUDED
|
#define OPM_WELLGROUPHELPERS_HEADER_INCLUDED
|
||||||
|
|
||||||
#include <opm/input/eclipse/Schedule/Group/GuideRate.hpp>
|
#include <opm/input/eclipse/Schedule/Group/GuideRate.hpp>
|
||||||
|
#include <opm/input/eclipse/Schedule/Group/GSatProd.hpp>
|
||||||
#include <opm/input/eclipse/EclipseState/Grid/FieldPropsManager.hpp>
|
#include <opm/input/eclipse/EclipseState/Grid/FieldPropsManager.hpp>
|
||||||
#include <opm/simulators/utils/ParallelCommunication.hpp>
|
#include <opm/simulators/utils/ParallelCommunication.hpp>
|
||||||
|
#include <opm/input/eclipse/Schedule/ScheduleState.hpp>
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <string>
|
#include <string>
|
||||||
@ -56,6 +58,13 @@ public:
|
|||||||
const int phasePos,
|
const int phasePos,
|
||||||
const bool injector);
|
const bool injector);
|
||||||
|
|
||||||
|
static Scalar satelliteProduction(const ScheduleState& sched,
|
||||||
|
const std::vector<std::string>& groups,
|
||||||
|
const GSatProd::GSatProdGroup::Rate rateComp);
|
||||||
|
|
||||||
|
static std::optional<GSatProd::GSatProdGroup::Rate>
|
||||||
|
selectRateComponent(const PhaseUsage& pu, const int phasePos);
|
||||||
|
|
||||||
static void setCmodeGroup(const Group& group,
|
static void setCmodeGroup(const Group& group,
|
||||||
const Schedule& schedule,
|
const Schedule& schedule,
|
||||||
const SummaryState& summaryState,
|
const SummaryState& summaryState,
|
||||||
|
@ -260,6 +260,10 @@ public:
|
|||||||
|
|
||||||
bool wellIsOwned(const std::string& wellName) const;
|
bool wellIsOwned(const std::string& wellName) const;
|
||||||
|
|
||||||
|
bool isRank0() const {
|
||||||
|
return this->global_well_info.value().isRank0();
|
||||||
|
}
|
||||||
|
|
||||||
void updateStatus(int well_index, WellStatus status);
|
void updateStatus(int well_index, WellStatus status);
|
||||||
|
|
||||||
void openWell(int well_index);
|
void openWell(int well_index);
|
||||||
|
@ -67,6 +67,7 @@
|
|||||||
#include <opm/input/eclipse/Schedule/Group/GroupEconProductionLimits.hpp>
|
#include <opm/input/eclipse/Schedule/Group/GroupEconProductionLimits.hpp>
|
||||||
#include <opm/input/eclipse/Schedule/Group/GConSale.hpp>
|
#include <opm/input/eclipse/Schedule/Group/GConSale.hpp>
|
||||||
#include <opm/input/eclipse/Schedule/Group/GConSump.hpp>
|
#include <opm/input/eclipse/Schedule/Group/GConSump.hpp>
|
||||||
|
#include <opm/input/eclipse/Schedule/Group/GSatProd.hpp>
|
||||||
#include <opm/input/eclipse/Schedule/Group/Group.hpp>
|
#include <opm/input/eclipse/Schedule/Group/Group.hpp>
|
||||||
#include <opm/input/eclipse/Schedule/Group/GuideRateConfig.hpp>
|
#include <opm/input/eclipse/Schedule/Group/GuideRateConfig.hpp>
|
||||||
#include <opm/input/eclipse/Schedule/Group/GuideRateModel.hpp>
|
#include <opm/input/eclipse/Schedule/Group/GuideRateModel.hpp>
|
||||||
@ -239,6 +240,7 @@ TEST_FOR_TYPE(FoamConfig)
|
|||||||
TEST_FOR_TYPE(FoamData)
|
TEST_FOR_TYPE(FoamData)
|
||||||
TEST_FOR_TYPE(GConSale)
|
TEST_FOR_TYPE(GConSale)
|
||||||
TEST_FOR_TYPE(GConSump)
|
TEST_FOR_TYPE(GConSump)
|
||||||
|
TEST_FOR_TYPE(GSatProd)
|
||||||
TEST_FOR_TYPE(GridDims)
|
TEST_FOR_TYPE(GridDims)
|
||||||
TEST_FOR_TYPE(Group)
|
TEST_FOR_TYPE(Group)
|
||||||
TEST_FOR_TYPE_NAMED(Group::GroupInjectionProperties, GroupInjectionProperties)
|
TEST_FOR_TYPE_NAMED(Group::GroupInjectionProperties, GroupInjectionProperties)
|
||||||
|
Loading…
Reference in New Issue
Block a user