Log use of UDA for output purposes
This commit is contained in:
committed by
Jostein Alvestad
parent
4d1b747b42
commit
1a62ceff7d
@@ -136,6 +136,7 @@ if(ENABLE_ECL_INPUT)
|
||||
src/opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQParams.cpp
|
||||
src/opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQParser.cpp
|
||||
src/opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQSet.cpp
|
||||
src/opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQActive.cpp
|
||||
src/opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQAssign.cpp
|
||||
src/opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQDefine.cpp
|
||||
src/opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQEnums.cpp
|
||||
@@ -567,6 +568,7 @@ if(ENABLE_ECL_INPUT)
|
||||
opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQEnums.hpp
|
||||
opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQParams.hpp
|
||||
opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQInput.hpp
|
||||
opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQActive.hpp
|
||||
opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQSet.hpp
|
||||
opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQFunction.hpp
|
||||
opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQFunctionTable.hpp
|
||||
|
||||
@@ -102,6 +102,7 @@ namespace Opm
|
||||
class ErrorGuard;
|
||||
class WListManager;
|
||||
class UDQConfig;
|
||||
class UDQActive;
|
||||
|
||||
class Schedule {
|
||||
public:
|
||||
@@ -177,6 +178,7 @@ namespace Opm
|
||||
std::vector<Well2> getChildWells2(const std::string& group_name, size_t timeStep, GroupWellQueryMode query_mode) const;
|
||||
const OilVaporizationProperties& getOilVaporizationProperties(size_t timestep) const;
|
||||
|
||||
const UDQActive& udqActive(size_t timeStep) const;
|
||||
const WellTestConfig& wtestConfig(size_t timestep) const;
|
||||
const WListManager& getWListManager(size_t timeStep) const;
|
||||
const UDQConfig& getUDQConfig(size_t timeStep) const;
|
||||
@@ -227,6 +229,7 @@ namespace Opm
|
||||
DynamicState<std::shared_ptr<WellTestConfig>> wtest_config;
|
||||
DynamicState<std::shared_ptr<WListManager>> wlist_manager;
|
||||
DynamicState<std::shared_ptr<UDQConfig>> udq_config;
|
||||
DynamicState<std::shared_ptr<UDQActive>> udq_active;
|
||||
DynamicState<WellProducer::ControlModeEnum> global_whistctl_mode;
|
||||
RFTConfig rft_config;
|
||||
|
||||
@@ -236,6 +239,8 @@ namespace Opm
|
||||
|
||||
GTNode groupTree(const std::string& root_node, std::size_t report_step, const GTNode * parent) const;
|
||||
void updateGroup(std::shared_ptr<Group2> group, size_t reportStep);
|
||||
bool checkGroups(const ParseContext& parseContext, ErrorGuard& errors);
|
||||
void updateUDQActive( std::size_t timeStep, std::shared_ptr<UDQActive> udq );
|
||||
bool updateWellStatus( const std::string& well, size_t reportStep , WellCommon::StatusEnum status);
|
||||
void addWellToGroup( const std::string& group_name, const std::string& well_name , size_t timeStep);
|
||||
void iterateScheduleSection(const ParseContext& parseContext , ErrorGuard& errors, const SCHEDULESection& , const EclipseGrid& grid,
|
||||
|
||||
64
opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQActive.hpp
Normal file
64
opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQActive.hpp
Normal file
@@ -0,0 +1,64 @@
|
||||
/*
|
||||
Copyright 2019 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 UDQ_USAGE_HPP
|
||||
#define UDQ_USAGE_HPP
|
||||
|
||||
#include <cstdlib>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <unordered_map>
|
||||
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQEnums.hpp>
|
||||
|
||||
namespace Opm {
|
||||
|
||||
class UDAValue;
|
||||
class UDQActive {
|
||||
public:
|
||||
struct Record{
|
||||
std::size_t index;
|
||||
std::string udq;
|
||||
std::string wgname;
|
||||
UDAControl control;
|
||||
bool active;
|
||||
};
|
||||
|
||||
int update(const UDAValue& uda, const std::string& wgname, UDAControl control);
|
||||
|
||||
std::size_t size() const;
|
||||
std::size_t use_count(const std::string& udq) const;
|
||||
|
||||
const Record& operator[](std::size_t index) const;
|
||||
std::vector<Record>::const_iterator begin() const;
|
||||
std::vector<Record>::const_iterator end() const;
|
||||
private:
|
||||
std::string hash(const std::string& wgname, UDAControl control);
|
||||
int add(const std::string& udq, const std::string& wgname, UDAControl control);
|
||||
int drop(const std::string& wgname, UDAControl control);
|
||||
|
||||
std::vector<Record> data;
|
||||
std::unordered_map<std::string, std::size_t> keys;
|
||||
std::unordered_map<std::string, std::size_t> m_use_count;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -100,7 +100,6 @@ enum class UDQAction {
|
||||
UPDATE
|
||||
};
|
||||
|
||||
|
||||
enum class UDAControl {
|
||||
WCONPROD_ORAT,
|
||||
WCONPROD_GRAT,
|
||||
|
||||
@@ -44,6 +44,7 @@ class EclipseGrid;
|
||||
class DeckKeyword;
|
||||
struct WellInjectionProperties;
|
||||
class WellProductionProperties;
|
||||
class UDQActive;
|
||||
|
||||
struct WellGuideRate {
|
||||
bool available;
|
||||
@@ -162,7 +163,6 @@ public:
|
||||
void switchToProducer();
|
||||
ProductionControls productionControls(const SummaryState& st) const;
|
||||
InjectionControls injectionControls(const SummaryState& st) const;
|
||||
|
||||
int vfp_table_number() const;
|
||||
double alq_value() const;
|
||||
double temperature() const;
|
||||
|
||||
@@ -49,6 +49,7 @@
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/OilVaporizationProperties.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/ScheduleEnums.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQConfig.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQActive.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/Schedule.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/TimeMap.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/Tuning.hpp>
|
||||
@@ -118,6 +119,7 @@ namespace {
|
||||
wtest_config(this->m_timeMap, std::make_shared<WellTestConfig>() ),
|
||||
wlist_manager( this->m_timeMap, std::make_shared<WListManager>()),
|
||||
udq_config(this->m_timeMap, std::make_shared<UDQConfig>(deck)),
|
||||
udq_active(this->m_timeMap, std::make_shared<UDQActive>()),
|
||||
global_whistctl_mode(this->m_timeMap, WellProducer::CMODE_UNDEFINED),
|
||||
rft_config(this->m_timeMap)
|
||||
{
|
||||
@@ -772,12 +774,11 @@ namespace {
|
||||
bool switching_from_injector = !well2->isProducer();
|
||||
auto properties = std::make_shared<WellProductionProperties>(well2->getProductionProperties());
|
||||
bool update_well = switching_from_injector;
|
||||
|
||||
properties->clearControls();
|
||||
if (well2->isAvailableForGroupControl())
|
||||
properties->addProductionControl(WellProducer::GRUP);
|
||||
|
||||
properties->handleWCONPROD(record);
|
||||
properties->handleWCONPROD(well_name, record);
|
||||
|
||||
if (switching_from_injector)
|
||||
properties->resetDefaultBHPLimit();
|
||||
@@ -796,6 +797,10 @@ namespace {
|
||||
this->addWellEvent( well2->name(), ScheduleEvents::PRODUCTION_UPDATE, currentStep);
|
||||
this->updateWell(well2, currentStep);
|
||||
}
|
||||
|
||||
auto udq = std::make_shared<UDQActive>(this->udqActive(currentStep));
|
||||
if (properties->updateUDQActive(*udq))
|
||||
this->updateUDQActive(currentStep, udq);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -900,6 +905,10 @@ namespace {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
auto udq = std::make_shared<UDQActive>(this->udqActive(currentStep));
|
||||
if (injection->updateUDQActive(*udq))
|
||||
this->updateUDQActive(currentStep, udq);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1478,7 +1487,6 @@ namespace {
|
||||
auto water_target = record.getItem("WATER_TARGET").get<UDAValue>(0);
|
||||
auto liquid_target = record.getItem("LIQUID_TARGET").get<UDAValue>(0);
|
||||
auto resv_target = record.getItem("RESERVOIR_FLUID_TARGET").getSIDouble(0);
|
||||
|
||||
{
|
||||
auto group_ptr = std::make_shared<Group2>(this->getGroup2(group_name, currentStep));
|
||||
Group2::GroupProductionProperties production;
|
||||
@@ -2444,6 +2452,13 @@ void Schedule::handleGRUPTREE( const DeckKeyword& keyword, size_t currentStep, c
|
||||
return tables;
|
||||
}
|
||||
|
||||
const UDQActive& Schedule::udqActive(size_t timeStep) const {
|
||||
return *this->udq_active[timeStep];
|
||||
}
|
||||
|
||||
void Schedule::updateUDQActive( size_t timeStep, std::shared_ptr<UDQActive> udq ) {
|
||||
this->udq_active.update(timeStep, udq);
|
||||
}
|
||||
|
||||
const WellTestConfig& Schedule::wtestConfig(size_t timeStep) const {
|
||||
const auto& ptr = this->wtest_config.get(timeStep);
|
||||
|
||||
104
src/opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQActive.cpp
Normal file
104
src/opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQActive.cpp
Normal file
@@ -0,0 +1,104 @@
|
||||
/*
|
||||
Copyright 2019 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/>.
|
||||
*/
|
||||
|
||||
#include <opm/parser/eclipse/Deck/UDAValue.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQActive.hpp>
|
||||
|
||||
namespace Opm {
|
||||
|
||||
std::size_t UDQActive::size() const {
|
||||
return this->data.size();
|
||||
}
|
||||
|
||||
|
||||
std::string UDQActive::hash(const std::string& wgname, UDAControl control) {
|
||||
return wgname + std::to_string(static_cast<int64_t>(control));
|
||||
}
|
||||
|
||||
|
||||
int UDQActive::add(const std::string& udq, const std::string& wgname, UDAControl control) {
|
||||
auto hash_key = this->hash(wgname, control);
|
||||
const auto iter = this->keys.find( hash_key );
|
||||
if (iter == this->keys.end()) {
|
||||
auto index = this->data.size();
|
||||
this->data.push_back( {index, udq, wgname, control, true} );
|
||||
this->keys.insert( std::make_pair(hash_key, index) );
|
||||
} else {
|
||||
auto& record = this->data[iter->second];
|
||||
this->m_use_count[record.udq] -= 1;
|
||||
record.udq = udq;
|
||||
}
|
||||
|
||||
this->m_use_count[udq] += 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
int UDQActive::drop(const std::string& wgname, UDAControl control) {
|
||||
if (this->data.empty())
|
||||
return 0;
|
||||
|
||||
auto hash_key = this->hash(wgname, control);
|
||||
const auto iter = this->keys.find( hash_key );
|
||||
if (iter != this->keys.end()) {
|
||||
auto index = iter->second;
|
||||
auto& record = this->data[index];
|
||||
|
||||
if (record.active)
|
||||
record.active = false;
|
||||
|
||||
if (this->m_use_count[record.udq] > 0)
|
||||
this->m_use_count[record.udq] -= 1;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int UDQActive::update(const UDAValue& uda, const std::string& wgname, UDAControl control) {
|
||||
if (uda.is<std::string>())
|
||||
return this->add(uda.get<std::string>(), wgname, control);
|
||||
else
|
||||
return this->drop(wgname, control);
|
||||
}
|
||||
|
||||
std::vector<UDQActive::Record>::const_iterator UDQActive::begin() const {
|
||||
return this->data.begin();
|
||||
}
|
||||
|
||||
std::vector<UDQActive::Record>::const_iterator UDQActive::end() const {
|
||||
return this->data.end();
|
||||
}
|
||||
|
||||
const UDQActive::Record& UDQActive::operator[](std::size_t index) const {
|
||||
return this->data[index];
|
||||
}
|
||||
|
||||
std::size_t UDQActive::use_count(const std::string& udq) const {
|
||||
const auto iter = this->m_use_count.find(udq);
|
||||
if (iter == this->m_use_count.end())
|
||||
return 0;
|
||||
|
||||
return iter->second;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <opm/parser/eclipse/Parser/ParserKeywords/W.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/MSW/updatingConnectionsWithSegments.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/Well/Well2.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQActive.hpp>
|
||||
|
||||
#include "WellProductionProperties.hpp"
|
||||
#include "WellInjectionProperties.hpp"
|
||||
@@ -781,6 +782,4 @@ double Well2::temperature() const {
|
||||
throw std::runtime_error("Can not ask for temperature in a producer");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <opm/parser/eclipse/Deck/DeckRecord.hpp>
|
||||
#include <opm/parser/eclipse/Parser/ParserKeywords/S.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/SummaryState.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQActive.hpp>
|
||||
|
||||
|
||||
#include "WellInjectionProperties.hpp"
|
||||
@@ -262,4 +263,16 @@ namespace Opm {
|
||||
|
||||
return controls;
|
||||
}
|
||||
|
||||
bool WellInjectionProperties::updateUDQActive(UDQActive& active) const {
|
||||
int update_count = 0;
|
||||
|
||||
update_count += active.update(this->surfaceInjectionRate, this->name, UDAControl::WCONINJE_RATE);
|
||||
update_count += active.update(this->reservoirInjectionRate, this->name, UDAControl::WCONINJE_RESV);
|
||||
update_count += active.update(this->BHPLimit, this->name, UDAControl::WCONINJE_BHP);
|
||||
update_count += active.update(this->THPLimit, this->name, UDAControl::WCONINJE_THP);
|
||||
|
||||
return (update_count > 0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -31,6 +31,7 @@ namespace Opm {
|
||||
class DeckRecord;
|
||||
class UnitSystem;
|
||||
class SummaryState;
|
||||
class UDQActive;
|
||||
|
||||
struct WellInjectionProperties {
|
||||
std::string name;
|
||||
@@ -75,6 +76,7 @@ namespace Opm {
|
||||
|
||||
void setBHPLimit(const double limit);
|
||||
InjectionControls controls(const UnitSystem& unit_system, const SummaryState& st, double udq_default) const;
|
||||
bool updateUDQActive(UDQActive& active) const;
|
||||
};
|
||||
|
||||
std::ostream& operator<<( std::ostream&, const WellInjectionProperties& );
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <opm/parser/eclipse/Deck/DeckRecord.hpp>
|
||||
#include <opm/parser/eclipse/Deck/UDAValue.hpp>
|
||||
#include <opm/parser/eclipse/Units/Units.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQActive.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/ScheduleEnums.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/SummaryState.hpp>
|
||||
|
||||
@@ -102,7 +103,7 @@ namespace Opm {
|
||||
|
||||
|
||||
|
||||
void WellProductionProperties::handleWCONPROD( const DeckRecord& record )
|
||||
void WellProductionProperties::handleWCONPROD( const std::string& /* well */, const DeckRecord& record)
|
||||
{
|
||||
this->predictionMode = true;
|
||||
|
||||
@@ -297,5 +298,19 @@ namespace Opm {
|
||||
return controls;
|
||||
}
|
||||
|
||||
bool WellProductionProperties::updateUDQActive(UDQActive& active) const {
|
||||
int update_count = 0;
|
||||
|
||||
update_count += active.update(this->OilRate, this->name, UDAControl::WCONPROD_ORAT);
|
||||
update_count += active.update(this->WaterRate, this->name, UDAControl::WCONPROD_WRAT);
|
||||
update_count += active.update(this->GasRate, this->name, UDAControl::WCONPROD_GRAT);
|
||||
update_count += active.update(this->LiquidRate, this->name, UDAControl::WCONPROD_LRAT);
|
||||
update_count += active.update(this->ResVRate, this->name, UDAControl::WCONPROD_RESV);
|
||||
update_count += active.update(this->BHPLimit, this->name, UDAControl::WCONPROD_BHP);
|
||||
update_count += active.update(this->THPLimit, this->name, UDAControl::WCONPROD_THP);
|
||||
|
||||
return (update_count > 0);
|
||||
}
|
||||
|
||||
|
||||
} // namespace Opm
|
||||
|
||||
@@ -32,6 +32,7 @@ namespace Opm {
|
||||
|
||||
class DeckRecord;
|
||||
class SummaryState;
|
||||
class UDQActive;
|
||||
|
||||
class WellProductionProperties {
|
||||
public:
|
||||
@@ -75,13 +76,13 @@ namespace Opm {
|
||||
|
||||
// this is used to check whether the specified control mode is an effective history matching production mode
|
||||
static bool effectiveHistoryProductionControl(const WellProducer::ControlModeEnum cmode);
|
||||
void handleWCONPROD( const DeckRecord& record);
|
||||
void handleWCONPROD( const std::string& well, const DeckRecord& record);
|
||||
void handleWCONHIST( const DeckRecord& record);
|
||||
void handleWELTARG(WellTarget::ControlModeEnum cmode, double newValue, double siFactorG, double siFactorL, double siFactorP);
|
||||
void resetDefaultBHPLimit();
|
||||
void clearControls();
|
||||
|
||||
ProductionControls controls(const SummaryState& st, double udq_default) const;
|
||||
bool updateUDQActive(UDQActive& active) const;
|
||||
private:
|
||||
int m_productionControls = 0;
|
||||
void init_rates( const DeckRecord& record );
|
||||
|
||||
@@ -32,6 +32,7 @@ Copyright 2018 Statoil ASA.
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQAssign.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQFunction.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQFunctionTable.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQActive.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/SummaryState.hpp>
|
||||
|
||||
using namespace Opm;
|
||||
@@ -1230,3 +1231,115 @@ UDQ
|
||||
BOOST_CHECK( input[0].is<UDQDefine>());
|
||||
}
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_CASE(UDQ_USAGE) {
|
||||
UDQActive usage;
|
||||
BOOST_CHECK_EQUAL( usage.size(), 0 );
|
||||
BOOST_CHECK_EQUAL( usage.use_count("UDQ"), 0);
|
||||
|
||||
UDAValue uda1("UDQ");
|
||||
usage.update(uda1, "W1", UDAControl::WCONPROD_ORAT);
|
||||
BOOST_CHECK_EQUAL( usage.size(), 1 );
|
||||
BOOST_CHECK_EQUAL( usage.use_count("UDQ"), 1);
|
||||
|
||||
usage.update(uda1, "W1", UDAControl::WCONPROD_GRAT);
|
||||
BOOST_CHECK_EQUAL( usage.size(), 2 );
|
||||
BOOST_CHECK_EQUAL( usage.use_count("UDQ"), 2);
|
||||
|
||||
|
||||
std::size_t index = 0;
|
||||
for (const auto& record : usage) {
|
||||
BOOST_CHECK_EQUAL(record.index, index);
|
||||
BOOST_CHECK_EQUAL(record.wgname, "W1");
|
||||
BOOST_CHECK_EQUAL(record.active, true);
|
||||
|
||||
if (index == 0)
|
||||
BOOST_CHECK(record.control == UDAControl::WCONPROD_ORAT);
|
||||
else
|
||||
BOOST_CHECK(record.control == UDAControl::WCONPROD_GRAT);
|
||||
|
||||
index += 1;
|
||||
}
|
||||
|
||||
|
||||
UDAValue uda2(100);
|
||||
usage.update(uda2, "W1", UDAControl::WCONPROD_ORAT);
|
||||
BOOST_CHECK_EQUAL(usage[0].active, false);
|
||||
BOOST_CHECK_EQUAL(usage[1].active, true);
|
||||
BOOST_CHECK_EQUAL( usage.use_count("UDQ"), 1);
|
||||
}
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_CASE(IntegrationTest) {
|
||||
#include "data/integration_tests/udq.data"
|
||||
auto schedule = make_schedule(deck_string);
|
||||
{
|
||||
const auto& active = schedule.udqActive(1);
|
||||
BOOST_CHECK_EQUAL(active.size(), 4);
|
||||
|
||||
BOOST_CHECK(active[0].control == UDAControl::WCONPROD_ORAT);
|
||||
BOOST_CHECK(active[1].control == UDAControl::WCONPROD_LRAT);
|
||||
BOOST_CHECK(active[2].control == UDAControl::WCONPROD_ORAT);
|
||||
BOOST_CHECK(active[3].control == UDAControl::WCONPROD_LRAT);
|
||||
|
||||
BOOST_CHECK(active[0].wgname == "OPL02");
|
||||
BOOST_CHECK(active[1].wgname == "OPL02");
|
||||
BOOST_CHECK(active[2].wgname == "OPU02");
|
||||
BOOST_CHECK(active[3].wgname == "OPU02");
|
||||
|
||||
BOOST_CHECK(active[0].udq == "WUOPRL");
|
||||
BOOST_CHECK(active[1].udq == "WULPRL");
|
||||
BOOST_CHECK(active[2].udq == "WUOPRU");
|
||||
BOOST_CHECK(active[3].udq == "WULPRU");
|
||||
|
||||
BOOST_CHECK(active[0].index == 0);
|
||||
BOOST_CHECK(active[1].index == 1);
|
||||
BOOST_CHECK(active[2].index == 2);
|
||||
BOOST_CHECK(active[3].index == 3);
|
||||
|
||||
BOOST_CHECK(active[0].active == true);
|
||||
BOOST_CHECK(active[1].active == true);
|
||||
BOOST_CHECK(active[2].active == true);
|
||||
BOOST_CHECK(active[3].active == true);
|
||||
|
||||
BOOST_CHECK(active.use_count("WUOPRL") == 1);
|
||||
BOOST_CHECK(active.use_count("WULPRL") == 1);
|
||||
BOOST_CHECK(active.use_count("WUOPRU") == 1);
|
||||
BOOST_CHECK(active.use_count("WULPRU") == 1);
|
||||
}
|
||||
|
||||
{
|
||||
const auto& active = schedule.udqActive(6);
|
||||
BOOST_CHECK_EQUAL(active.size(), 4);
|
||||
|
||||
BOOST_CHECK(active[0].control == UDAControl::WCONPROD_ORAT);
|
||||
BOOST_CHECK(active[1].control == UDAControl::WCONPROD_LRAT);
|
||||
BOOST_CHECK(active[2].control == UDAControl::WCONPROD_ORAT);
|
||||
BOOST_CHECK(active[3].control == UDAControl::WCONPROD_LRAT);
|
||||
|
||||
BOOST_CHECK(active[0].wgname == "OPL02");
|
||||
BOOST_CHECK(active[1].wgname == "OPL02");
|
||||
BOOST_CHECK(active[2].wgname == "OPU02");
|
||||
BOOST_CHECK(active[3].wgname == "OPU02");
|
||||
|
||||
BOOST_CHECK(active[0].udq == "WUOPRL");
|
||||
BOOST_CHECK(active[1].udq == "WULPRL");
|
||||
BOOST_CHECK(active[2].udq == "WUOPRU");
|
||||
BOOST_CHECK(active[3].udq == "WULPRU");
|
||||
|
||||
BOOST_CHECK(active[0].index == 0);
|
||||
BOOST_CHECK(active[1].index == 1);
|
||||
BOOST_CHECK(active[2].index == 2);
|
||||
BOOST_CHECK(active[3].index == 3);
|
||||
|
||||
BOOST_CHECK(active[0].active == false);
|
||||
BOOST_CHECK(active[1].active == false);
|
||||
BOOST_CHECK(active[2].active == true);
|
||||
BOOST_CHECK(active[3].active == true);
|
||||
|
||||
BOOST_CHECK_EQUAL(active.use_count("WUOPRL"), 0);
|
||||
BOOST_CHECK_EQUAL(active.use_count("WULPRL"), 0);
|
||||
BOOST_CHECK_EQUAL(active.use_count("WUOPRU"), 1);
|
||||
BOOST_CHECK_EQUAL(active.use_count("WULPRU"), 1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
#include <opm/parser/eclipse/EclipseState/Grid/EclipseGrid.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/Schedule.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/SummaryState.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQActive.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/ScheduleEnums.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/Well/Connection.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/Well/WellConnections.hpp>
|
||||
@@ -545,7 +546,7 @@ namespace {
|
||||
const auto& kwd = deck.getKeyword("WCONPROD");
|
||||
const auto& record = kwd.getRecord(0);
|
||||
Opm::WellProductionProperties pred("W");
|
||||
pred.handleWCONPROD(record);
|
||||
pred.handleWCONPROD("WELL", record);
|
||||
|
||||
return pred;
|
||||
}
|
||||
|
||||
718
tests/parser/data/integration_tests/udq.data
Normal file
718
tests/parser/data/integration_tests/udq.data
Normal file
@@ -0,0 +1,718 @@
|
||||
const std::string deck_string = R"(
|
||||
RUNSPEC
|
||||
|
||||
|
||||
TITLE
|
||||
'Generic' 'Reservoir'
|
||||
|
||||
NOECHO
|
||||
|
||||
|
||||
DIMENS
|
||||
3 5 4 /
|
||||
|
||||
|
||||
START
|
||||
22 'AUG' 2018 /
|
||||
|
||||
|
||||
OIL
|
||||
|
||||
|
||||
GAS
|
||||
|
||||
|
||||
WATER
|
||||
|
||||
|
||||
DISGAS
|
||||
|
||||
|
||||
METRIC
|
||||
|
||||
|
||||
TABDIMS
|
||||
1 1 130 24 1 20 /
|
||||
|
||||
|
||||
EQLDIMS
|
||||
2 100 20 /
|
||||
|
||||
|
||||
WELLDIMS
|
||||
230 120 50 80 /
|
||||
|
||||
|
||||
UNIFIN
|
||||
|
||||
|
||||
UNIFOUT
|
||||
|
||||
|
||||
UDQDIMS
|
||||
50 25 0 50 50 0 0 50 0 20 /
|
||||
|
||||
|
||||
UDADIMS
|
||||
10 1* 10 /
|
||||
|
||||
|
||||
GRID
|
||||
|
||||
|
||||
NOECHO
|
||||
|
||||
|
||||
INIT
|
||||
|
||||
|
||||
GRIDFILE
|
||||
0 1 /
|
||||
|
||||
|
||||
MAPAXES
|
||||
0 100 0 0 100 0 /
|
||||
|
||||
|
||||
NOECHO
|
||||
|
||||
|
||||
SPECGRID
|
||||
3 5 4 1 'F' /
|
||||
|
||||
|
||||
COORD
|
||||
2000 2000 2000 1999.5638 2000 2039.9619 2199.8096 2000 2008.7239 2199.3735 2000 2048.6858 2399.6193 2000 2017.4478 2399.1831
|
||||
2000 2057.4097 2599.4289 2000 2026.1716 2598.9927 2000 2066.1336 2000 2200 2000 1999.5638 2200 2039.9619 2199.8096 2200
|
||||
2008.7239 2199.3735 2200 2048.6858 2399.6193 2200 2017.4478 2399.1831 2200 2057.4097 2599.4289 2200 2026.1716 2598.9927 2200 2066.1336
|
||||
2000 2400 2000 1999.5638 2400 2039.9619 2199.8096 2400 2008.7239 2199.3735 2400 2048.6858 2399.6193 2400 2017.4478 2399.1831
|
||||
2400 2057.4097 2599.4289 2400 2026.1716 2598.9927 2400 2066.1336 2000 2600 2000 1999.5638 2600 2039.9619 2199.8096 2600
|
||||
2008.7239 2199.3735 2600 2048.6858 2399.6193 2600 2017.4478 2399.1831 2600 2057.4097 2599.4289 2600 2026.1716 2598.9927 2600 2066.1336
|
||||
2000 2800 2000 1999.5638 2800 2039.9619 2199.8096 2800 2008.7239 2199.3735 2800 2048.6858 2399.6193 2800 2017.4478 2399.1831
|
||||
2800 2057.4097 2599.4289 2800 2026.1716 2598.9927 2800 2066.1336 2000 3000 2000 1999.5638 3000 2039.9619 2199.8096 3000
|
||||
2008.7239 2199.3735 3000 2048.6858 2399.6193 3000 2017.4478 2399.1831 3000 2057.4097 2599.4289 3000 2026.1716 2598.9927 3000 2066.1336 /
|
||||
|
||||
|
||||
ZCORN
|
||||
2000 2008.7239 2008.7239 2017.4478 2017.4478 2026.1716 2000 2008.7239 2008.7239 2017.4478 2017.4478 2026.1716 2000 2008.7239 2008.7239 2017.4478
|
||||
2017.4478 2026.1716 2000 2008.7239 2008.7239 2017.4478 2017.4478 2026.1716 2000 2008.7239 2008.7239 2017.4478 2017.4478 2026.1716 2000 2008.7239
|
||||
2008.7239 2017.4478 2017.4478 2026.1716 2000 2008.7239 2008.7239 2017.4478 2017.4478 2026.1716 2000 2008.7239 2008.7239 2017.4478 2017.4478 2026.1716
|
||||
2000 2008.7239 2008.7239 2017.4478 2017.4478 2026.1716 2000 2008.7239 2008.7239 2017.4478 2017.4478 2026.1716 2009.9905 2018.7144 2018.7144 2027.4382
|
||||
2027.4382 2036.1621 2009.9905 2018.7144 2018.7144 2027.4382 2027.4382 2036.1621 2009.9905 2018.7144 2018.7144 2027.4382 2027.4382 2036.1621 2009.9905 2018.7144
|
||||
2018.7144 2027.4382 2027.4382 2036.1621 2009.9905 2018.7144 2018.7144 2027.4382 2027.4382 2036.1621 2009.9905 2018.7144 2018.7144 2027.4382 2027.4382 2036.1621
|
||||
2009.9905 2018.7144 2018.7144 2027.4382 2027.4382 2036.1621 2009.9905 2018.7144 2018.7144 2027.4382 2027.4382 2036.1621 2009.9905 2018.7144 2018.7144 2027.4382
|
||||
2027.4382 2036.1621 2009.9905 2018.7144 2018.7144 2027.4382 2027.4382 2036.1621 2009.9905 2018.7144 2018.7144 2027.4382 2027.4382 2036.1621 2009.9905 2018.7144
|
||||
2018.7144 2027.4382 2027.4382 2036.1621 2009.9905 2018.7144 2018.7144 2027.4382 2027.4382 2036.1621 2009.9905 2018.7144 2018.7144 2027.4382 2027.4382 2036.1621
|
||||
2009.9905 2018.7144 2018.7144 2027.4382 2027.4382 2036.1621 2009.9905 2018.7144 2018.7144 2027.4382 2027.4382 2036.1621 2009.9905 2018.7144 2018.7144 2027.4382
|
||||
2027.4382 2036.1621 2009.9905 2018.7144 2018.7144 2027.4382 2027.4382 2036.1621 2009.9905 2018.7144 2018.7144 2027.4382 2027.4382 2036.1621 2009.9905 2018.7144
|
||||
2018.7144 2027.4382 2027.4382 2036.1621 2019.981 2028.7048 2028.7048 2037.4287 2037.4287 2046.1526 2019.981 2028.7048 2028.7048 2037.4287 2037.4287 2046.1526
|
||||
2019.981 2028.7048 2028.7048 2037.4287 2037.4287 2046.1526 2019.981 2028.7048 2028.7048 2037.4287 2037.4287 2046.1526 2019.981 2028.7048 2028.7048 2037.4287
|
||||
2037.4287 2046.1526 2019.981 2028.7048 2028.7048 2037.4287 2037.4287 2046.1526 2019.981 2028.7048 2028.7048 2037.4287 2037.4287 2046.1526 2019.981 2028.7048
|
||||
2028.7048 2037.4287 2037.4287 2046.1526 2019.981 2028.7048 2028.7048 2037.4287 2037.4287 2046.1526 2019.981 2028.7048 2028.7048 2037.4287 2037.4287 2046.1526
|
||||
2019.981 2028.7048 2028.7048 2037.4287 2037.4287 2046.1526 2019.981 2028.7048 2028.7048 2037.4287 2037.4287 2046.1526 2019.981 2028.7048 2028.7048 2037.4287
|
||||
2037.4287 2046.1526 2019.981 2028.7048 2028.7048 2037.4287 2037.4287 2046.1526 2019.981 2028.7048 2028.7048 2037.4287 2037.4287 2046.1526 2019.981 2028.7048
|
||||
2028.7048 2037.4287 2037.4287 2046.1526 2019.981 2028.7048 2028.7048 2037.4287 2037.4287 2046.1526 2019.981 2028.7048 2028.7048 2037.4287 2037.4287 2046.1526
|
||||
2019.981 2028.7048 2028.7048 2037.4287 2037.4287 2046.1526 2019.981 2028.7048 2028.7048 2037.4287 2037.4287 2046.1526 2029.9714 2038.6953 2038.6953 2047.4192
|
||||
2047.4192 2056.1431 2029.9714 2038.6953 2038.6953 2047.4192 2047.4192 2056.1431 2029.9714 2038.6953 2038.6953 2047.4192 2047.4192 2056.1431 2029.9714 2038.6953
|
||||
2038.6953 2047.4192 2047.4192 2056.1431 2029.9714 2038.6953 2038.6953 2047.4192 2047.4192 2056.1431 2029.9714 2038.6953 2038.6953 2047.4192 2047.4192 2056.1431
|
||||
2029.9714 2038.6953 2038.6953 2047.4192 2047.4192 2056.1431 2029.9714 2038.6953 2038.6953 2047.4192 2047.4192 2056.1431 2029.9714 2038.6953 2038.6953 2047.4192
|
||||
2047.4192 2056.1431 2029.9714 2038.6953 2038.6953 2047.4192 2047.4192 2056.1431 2029.9714 2038.6953 2038.6953 2047.4192 2047.4192 2056.1431 2029.9714 2038.6953
|
||||
2038.6953 2047.4192 2047.4192 2056.1431 2029.9714 2038.6953 2038.6953 2047.4192 2047.4192 2056.1431 2029.9714 2038.6953 2038.6953 2047.4192 2047.4192 2056.1431
|
||||
2029.9714 2038.6953 2038.6953 2047.4192 2047.4192 2056.1431 2029.9714 2038.6953 2038.6953 2047.4192 2047.4192 2056.1431 2029.9714 2038.6953 2038.6953 2047.4192
|
||||
2047.4192 2056.1431 2029.9714 2038.6953 2038.6953 2047.4192 2047.4192 2056.1431 2029.9714 2038.6953 2038.6953 2047.4192 2047.4192 2056.1431 2029.9714 2038.6953
|
||||
2038.6953 2047.4192 2047.4192 2056.1431 2039.9619 2048.6858 2048.6858 2057.4097 2057.4097 2066.1336 2039.9619 2048.6858 2048.6858 2057.4097 2057.4097 2066.1336
|
||||
2039.9619 2048.6858 2048.6858 2057.4097 2057.4097 2066.1336 2039.9619 2048.6858 2048.6858 2057.4097 2057.4097 2066.1336 2039.9619 2048.6858 2048.6858 2057.4097
|
||||
2057.4097 2066.1336 2039.9619 2048.6858 2048.6858 2057.4097 2057.4097 2066.1336 2039.9619 2048.6858 2048.6858 2057.4097 2057.4097 2066.1336 2039.9619 2048.6858
|
||||
2048.6858 2057.4097 2057.4097 2066.1336 2039.9619 2048.6858 2048.6858 2057.4097 2057.4097 2066.1336 2039.9619 2048.6858 2048.6858 2057.4097 2057.4097 2066.1336 /
|
||||
|
||||
|
||||
PORO
|
||||
0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.2
|
||||
0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.23 0.23
|
||||
0.23 0.23 0.23 0.23 0.23 0.23 0.23 0.23 0.23 0.23 0.23 0.23 0.23 0.18 0.18 0.18
|
||||
0.18 0.18 0.18 0.18 0.18 0.18 0.18 0.18 0.18 0.18 0.18 0.18 /
|
||||
|
||||
|
||||
PERMX
|
||||
500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 100
|
||||
100 100 100 100 100 100 100 100 100 100 100 100 100 100 1000 1000
|
||||
1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 250 250 250
|
||||
250 250 250 250 250 250 250 250 250 250 250 250 /
|
||||
|
||||
|
||||
COPY
|
||||
'PERMX' 'PERMY' /
|
||||
'PERMX' 'PERMZ' /
|
||||
/
|
||||
|
||||
|
||||
MULTIPLY
|
||||
'PERMZ' 0.1 /
|
||||
/
|
||||
|
||||
|
||||
MULTZ
|
||||
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
|
||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
|
||||
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
1 1 1 1 1 1 1 1 1 1 1 1 /
|
||||
|
||||
|
||||
EDIT
|
||||
|
||||
|
||||
PROPS
|
||||
|
||||
|
||||
SGOF
|
||||
0 0 1 0 0.0183 0.001480314 0.8127534 0 0.0366 0.004696335 0.675857 0 0.0549 0.009371694 0.5622753 0
|
||||
0.0732 0.01546379 0.4663578 0 0.0915 0.02298664 0.385133 0 0.1098 0.03197913 0.3164995 0 0.1281 0.04249268 0.2587408 0
|
||||
0.1464 0.05458466 0.2103665 0 0.1647 0.06831379 0.1700565 0 0.183 0.08373629 0.1366388 0 0.2013 0.1009022 0.1090792 0
|
||||
0.2196 0.1198516 0.08647139 0 0.2379 0.1406109 0.06802822 0 0.2562 0.1631885 0.05307051 0 0.2745 0.1875705 0.04101619 0
|
||||
0.2928 0.2137163 0.03136912 0 0.3111 0.2415547 0.02370834 0 0.3294 0.2709792 0.01767817 0 0.3477 0.3018447 0.01297907 0
|
||||
0.366 0.3339653 0.009359652 0 0.3843 0.3671116 0.006609586 0 0.4026 0.401011 0.00455345 0 0.4209 0.4353486 0.003045475 0
|
||||
0.4392 0.4697695 0.001965044 0 0.4575 0.5038828 0.001212868 0 0.4758 0.5372664 0.0007077659 0 0.4941 0.5694721 0.000383946 0
|
||||
0.5124 0.6000285 0.0001887263 0 0.5307 0.6284408 8.062741e-05 0 0.549 0.6541796 2.778023e-05 0 0.5673 0.676644 6.602397e-06 0
|
||||
0.5856 0.6950468 7.048731e-07 0 0.61 0.71 0 0 0.6275 0.7825 0 0 0.645 0.855 0 0
|
||||
0.6625 0.9275 0 0 0.68 1 0 0 /
|
||||
|
||||
|
||||
SWOF
|
||||
0.32 0 1 0 0.3365 3.00925e-08 0.9804566 0 0.353 7.541952e-07 0.9391194 0 0.3695 5.01876e-06 0.8832853 0
|
||||
0.386 1.941502e-05 0.8178788 0 0.4025 5.581854e-05 0.7471578 0 0.419 0.0001330574 0.674704 0 0.4355 0.0002787865 0.60333 0
|
||||
0.452 0.0005316304 0.535068 0 0.4685 0.0009436502 0.4712431 0 0.485 0.001583182 0.412597 0 0.5015 0.002538082 0.3594268 0
|
||||
0.518 0.00391938 0.3117147 0 0.5345 0.005865308 0.2692366 0 0.551 0.008545575 0.2316458 0 0.5675 0.01216566 0.1985336 0
|
||||
0.584 0.01697073 0.169471 0 0.6005 0.0232485 0.1440352 0 0.617 0.03133019 0.1218258 0 0.6335 0.04158825 0.1024735 0
|
||||
0.65 0.05442925 0.08564409 0 0.6665 0.07028023 0.0710386 0 0.683 0.08956673 0.05839253 0 0.6995 0.1126816 0.0474734 0
|
||||
0.716 0.1399451 0.03807806 0 0.7325 0.1715593 0.03002991 0 0.749 0.2075632 0.02317622 0 0.7655 0.2478002 0.01738581 0
|
||||
0.782 0.2919105 0.01254709 0 0.7985 0.3393688 0.008566921 0 0.815 0.3895919 0.005370427 0 0.8315 0.4421811 0.002903191 0
|
||||
0.848 0.4975608 0.001139647 0 0.87 0.59168 0 0 0.8885714 0.6500114 0 0 0.9071429 0.7083429 0 0
|
||||
0.9257143 0.7666743 0 0 0.9442857 0.8250057 0 0 0.9628571 0.8833371 0 0 0.9814286 0.9416686 0 0
|
||||
1 1 0 0 /
|
||||
|
||||
|
||||
PVDG
|
||||
20 0.061895 0.01299 40 0.030252 0.01383 60 0.019844 0.0145 80 0.014686 0.0152 100 0.011627 0.01596 120
|
||||
0.009619 0.01682 140 0.008213 0.0178 160 0.007184 0.0189 197.66 0.00582 0.0216 231.13 0.005042 0.02477 261.31 0.004561
|
||||
0.02844 288.87 0.004255 0.03272 314.34 0.004062 0.03783 338.2 0.003953 0.0441 360.83 0.003947 0.0521 382.58 0.003915 0.06273
|
||||
403.6 0.003912 0.07723 423.77 0.003907 0.09631 /
|
||||
|
||||
|
||||
PVTO
|
||||
19.6 20 1.12324 0.96519 55 1.11698 1.03237 90 1.11127 1.10051 125 1.10602 1.16942 160 1.10119 1.2389
|
||||
195 1.09672 1.30876 230 1.09256 1.37884 265 1.08868 1.44899 300 1.08504 1.51908 335 1.08164 1.58903 370
|
||||
1.07843 1.65876 /
|
||||
31.5 40 1.15981 0.85738 75 1.15288 0.91402 110 1.14657 0.97137 145 1.14079 1.02927 180 1.13546 1.08759
|
||||
215 1.13053 1.14617 250 1.12595 1.20488 285 1.12168 1.2636 320 1.11768 1.32224 355 1.11394 1.38073 390
|
||||
1.11042 1.43898 /
|
||||
42.4 60 1.191 0.7868 95 1.184 0.8364 130 1.177 0.8866 165 1.171 0.9371 200 1.165 0.988
|
||||
235 1.16 1.039 270 1.155 1.0902 305 1.15 1.1413 340 1.146 1.1922 375 1.142 1.2431 410
|
||||
1.138 1.2936 /
|
||||
53.4 80 1.222 0.7175 115 1.214 0.7608 150 1.206 0.8045 185 1.2 0.8485 220 1.194 0.8928
|
||||
255 1.188 0.9371 290 1.183 0.9815 325 1.178 1.0258 360 1.173 1.07 395 1.169 1.1141 430
|
||||
1.165 1.1579 /
|
||||
64.6 100 1.252 0.6544 135 1.244 0.6923 170 1.236 0.7305 205 1.229 0.7689 240 1.222 0.8075
|
||||
275 1.216 0.8461 310 1.211 0.8847 345 1.205 0.9233 380 1.2 0.9618 415 1.196 1 450
|
||||
1.191 1.0381 /
|
||||
76.3 120 1.284 0.5978 155 1.275 0.6312 190 1.266 0.6648 225 1.259 0.6985 260 1.252 0.7323
|
||||
295 1.245 0.7661 330 1.239 0.7999 365 1.234 0.8337 400 1.229 0.8673 435 1.224 0.9007 470
|
||||
1.219 0.934 /
|
||||
88.5 140 1.316 0.5477 175 1.307 0.5749 210 1.298 0.602 245 1.29 0.629 280 1.282 0.6559
|
||||
315 1.276 0.6827 350 1.269 0.7095 385 1.263 0.7362 420 1.258 0.7629 455 1.253 0.7895 490
|
||||
1.248 0.8161 /
|
||||
101.3 160 1.35 0.502 195 1.34 0.5227 230 1.331 0.5432 265 1.322 0.5635 300 1.314 0.5835
|
||||
335 1.307 0.6034 370 1.3 0.6231 405 1.294 0.6426 440 1.288 0.662 475 1.283 0.6813 /
|
||||
114.7 180 1.385 0.4636 215 1.375 0.482 250 1.365 0.5003 285 1.356 0.5183 320 1.347 0.5362
|
||||
355 1.34 0.5538 390 1.333 0.5712 425 1.326 0.5885 460 1.32 0.6055 495 1.314 0.6222 /
|
||||
128.9 200 1.422 0.429 235 1.411 0.4455 270 1.401 0.4618 305 1.391 0.4779 340 1.382 0.4938
|
||||
375 1.374 0.5096 410 1.367 0.5252 445 1.36 0.5406 480 1.353 0.5558 /
|
||||
143.8 220 1.461 0.3977 255 1.449 0.4125 290 1.438 0.4271 325 1.428 0.4415 360 1.419 0.4558
|
||||
395 1.41 0.4699 430 1.402 0.4839 465 1.395 0.4977 /
|
||||
159.5 240 1.502 0.3692 275 1.489 0.3825 310 1.478 0.3956 345 1.467 0.4086 380 1.458 0.4214
|
||||
415 1.449 0.4341 450 1.44 0.4466 485 1.432 0.459 /
|
||||
184 268.79 1.565 0.3324 303.79 1.551 0.3438 338.79 1.539 0.3551 373.79 1.528 0.3663 408.79 1.517 0.3774
|
||||
443.79 1.508 0.3883 478.79 1.499 0.3991 /
|
||||
226.3 306.18 1.679 0.2855 341.18 1.664 0.2949 376.18 1.65 0.3041 411.18 1.637 0.3132 446.18 1.625 0.3222
|
||||
481.18 1.614 0.3311 /
|
||||
268.6 339.93 1.792 0.2517 374.93 1.775 0.2597 409.93 1.76 0.2675 444.93 1.746 0.2751 479.93 1.732 0.2827 /
|
||||
310.9 371.44 1.903 0.2265 406.44 1.885 0.2333 441.44 1.868 0.2401 476.44 1.853 0.2468 /
|
||||
353.3 401.66 2.013 0.2071 436.66 1.993 0.2132 471.66 1.975 0.2192 /
|
||||
/
|
||||
|
||||
|
||||
PVTW
|
||||
344.83 1.0292 4.002e-05 0.36 0 /
|
||||
|
||||
|
||||
ROCK
|
||||
383 4.12e-05 /
|
||||
|
||||
|
||||
DENSITY
|
||||
842.3 1001.1 0.9 /
|
||||
|
||||
|
||||
REGIONS
|
||||
|
||||
|
||||
EQLNUM
|
||||
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2
|
||||
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
|
||||
2 2 2 2 2 2 2 2 2 2 2 2 /
|
||||
|
||||
|
||||
SOLUTION
|
||||
|
||||
|
||||
EQUIL
|
||||
2030 382.4 2030 0 500 0 1 1 0 /
|
||||
2050 382.4 2050 0 500 0 1 1 0 /
|
||||
|
||||
|
||||
RSVD
|
||||
1500 180 4000 180 /
|
||||
1500 180 4000 180 /
|
||||
|
||||
|
||||
RPTRST
|
||||
'BASIC=2' 'PBPD' /
|
||||
|
||||
|
||||
SUMMARY
|
||||
|
||||
|
||||
FOPR
|
||||
|
||||
|
||||
FOPRH
|
||||
|
||||
|
||||
FGPR
|
||||
|
||||
|
||||
FGPRH
|
||||
|
||||
|
||||
FWPR
|
||||
|
||||
|
||||
FWPRH
|
||||
|
||||
|
||||
FWIR
|
||||
|
||||
|
||||
FWIP
|
||||
|
||||
|
||||
FOIP
|
||||
|
||||
|
||||
FGIP
|
||||
|
||||
|
||||
FWCT
|
||||
|
||||
|
||||
FWCTH
|
||||
|
||||
|
||||
FGOR
|
||||
|
||||
|
||||
FGORH
|
||||
|
||||
|
||||
FPR
|
||||
|
||||
|
||||
RPR
|
||||
/
|
||||
|
||||
|
||||
ROIP
|
||||
/
|
||||
|
||||
|
||||
ROIPL
|
||||
/
|
||||
|
||||
|
||||
ROIPG
|
||||
/
|
||||
|
||||
|
||||
RGIP
|
||||
/
|
||||
|
||||
|
||||
RGIPL
|
||||
/
|
||||
|
||||
|
||||
RGIPG
|
||||
/
|
||||
|
||||
|
||||
RGPR
|
||||
/
|
||||
|
||||
|
||||
RGPT
|
||||
/
|
||||
|
||||
|
||||
GWIR
|
||||
/
|
||||
|
||||
|
||||
GVIR
|
||||
/
|
||||
|
||||
|
||||
GOPR
|
||||
/
|
||||
|
||||
|
||||
GWPR
|
||||
/
|
||||
|
||||
|
||||
GLPR
|
||||
/
|
||||
|
||||
|
||||
GLPR
|
||||
/
|
||||
|
||||
|
||||
GVPR
|
||||
/
|
||||
|
||||
|
||||
WOPR
|
||||
/
|
||||
|
||||
|
||||
WOPRH
|
||||
/
|
||||
|
||||
|
||||
WGPR
|
||||
/
|
||||
|
||||
|
||||
WGPRH
|
||||
/
|
||||
|
||||
|
||||
WWPR
|
||||
/
|
||||
|
||||
|
||||
WWPRH
|
||||
/
|
||||
|
||||
|
||||
WOPT
|
||||
/
|
||||
|
||||
|
||||
WWPT
|
||||
/
|
||||
|
||||
|
||||
WGPT
|
||||
/
|
||||
|
||||
|
||||
WOPTH
|
||||
/
|
||||
|
||||
|
||||
WWPTH
|
||||
/
|
||||
|
||||
|
||||
WGPTH
|
||||
/
|
||||
|
||||
|
||||
WWCT
|
||||
/
|
||||
|
||||
|
||||
WWCTH
|
||||
/
|
||||
|
||||
|
||||
WGOR
|
||||
/
|
||||
|
||||
|
||||
WGORH
|
||||
/
|
||||
|
||||
|
||||
WWIR
|
||||
/
|
||||
|
||||
|
||||
WWIRH
|
||||
/
|
||||
|
||||
|
||||
WGIR
|
||||
/
|
||||
|
||||
|
||||
WGIRH
|
||||
/
|
||||
|
||||
|
||||
WWIT
|
||||
/
|
||||
|
||||
|
||||
WWITH
|
||||
/
|
||||
|
||||
|
||||
WGIT
|
||||
/
|
||||
|
||||
|
||||
WGITH
|
||||
/
|
||||
|
||||
|
||||
WBHP
|
||||
/
|
||||
|
||||
|
||||
WTHP
|
||||
/
|
||||
|
||||
|
||||
WPI
|
||||
/
|
||||
|
||||
|
||||
WVPR
|
||||
/
|
||||
|
||||
|
||||
WBP
|
||||
/
|
||||
|
||||
|
||||
WBP4
|
||||
/
|
||||
|
||||
|
||||
WBP9
|
||||
/
|
||||
|
||||
|
||||
WMCTL
|
||||
/
|
||||
|
||||
|
||||
WLPR
|
||||
/
|
||||
|
||||
|
||||
TCPU
|
||||
|
||||
|
||||
TCPUDAY
|
||||
|
||||
|
||||
FMWIN
|
||||
|
||||
|
||||
FMWPR
|
||||
|
||||
|
||||
GMWPR
|
||||
'UPPER' 'LOWER' /
|
||||
|
||||
|
||||
GMWIN
|
||||
'UPPER' 'LOWER' /
|
||||
|
||||
|
||||
WUOPRL
|
||||
'OPL01' 'OPL02' 'OPU01' 'OPU02' /
|
||||
|
||||
|
||||
WULPRL
|
||||
'OPL01' 'OPL02' 'OPU01' 'OPU02' /
|
||||
|
||||
|
||||
WUOPRU
|
||||
'OPL01' 'OPL02' 'OPU01' 'OPU02' /
|
||||
|
||||
|
||||
WULPRU
|
||||
'OPL01' 'OPL02' 'OPU01' 'OPU02' /
|
||||
|
||||
|
||||
SCHEDULE
|
||||
|
||||
|
||||
GRUPTREE
|
||||
'UPPER' 'TEST' /
|
||||
'LOWER' 'TEST' /
|
||||
/
|
||||
|
||||
|
||||
WELSPECS
|
||||
'OPU01' 'UPPER' 1 2 2002 'OIL' 0 'STD' 'SHUT' 'YES' 0 'SEG' /
|
||||
'OPU02' 'UPPER' 1 4 2002 'OIL' 0 'STD' 'SHUT' 'YES' 0 'SEG' /
|
||||
'OPL01' 'LOWER' 1 2 2025 'OIL' 0 'STD' 'SHUT' 'YES' 0 'SEG' /
|
||||
'OPL02' 'LOWER' 1 4 2025 'OIL' 0 'STD' 'SHUT' 'YES' 0 'SEG' /
|
||||
/
|
||||
|
||||
|
||||
WELSPECS
|
||||
'WIU01' 'UPPER' 3 3 2030 'WATER' 0 'STD' 'SHUT' 'YES' 0 'SEG' /
|
||||
'WIL01' 'LOWER' 3 3 2050 'WATER' 0 'STD' 'SHUT' 'YES' 0 'SEG' /
|
||||
/
|
||||
|
||||
|
||||
COMPDAT
|
||||
'OPU01' 1 2 1 1 'OPEN' 0 1* 0.241 1* 2.5 0 'Z' /
|
||||
'OPU02' 1 4 1 1 'OPEN' 0 1* 0.241 1* 2.5 0 'Z' /
|
||||
'OPL01' 1 2 3 3 'OPEN' 0 1* 0.241 1* 2.5 0 'Z' /
|
||||
'OPL02' 1 4 3 3 'OPEN' 0 1* 0.241 1* 2.5 0 'Z' /
|
||||
'WIU01' 3 3 2 2 'OPEN' 0 1* 0.241 1* 2.5 0 'Z' /
|
||||
'WIL01' 3 3 4 4 'OPEN' 0 1* 0.241 1* 2.5 0 'Z' /
|
||||
/
|
||||
|
||||
|
||||
WCONPROD
|
||||
'OPU*' 'SHUT' 'GRUP' 1500 2* 2500 1* 60 /
|
||||
'OPL*' 'SHUT' 'GRUP' 1500 2* 2500 1* 60 /
|
||||
/
|
||||
|
||||
|
||||
WCONINJE
|
||||
'WIU*' 'WATER' 'SHUT' 'GRUP' 10500 1* 400 /
|
||||
'WIL*' 'WATER' 'SHUT' 'GRUP' 10500 1* 400 /
|
||||
/
|
||||
|
||||
UDQ
|
||||
-- test
|
||||
--oil & liquid capacities at GEFAC = 0.8995
|
||||
DEFINE WUOPRL (WOPR OPL01 - 150) * 0.90 /
|
||||
DEFINE WULPRL (WLPR OPL01 - 200) * 0.90 /
|
||||
DEFINE WUOPRU (WOPR OPU01 - 250) * 0.80 /
|
||||
DEFINE WULPRU (WLPR OPU01 - 300) * 0.80 /
|
||||
-- units
|
||||
UNITS WUOPRL SM3/DAY /
|
||||
UNITS WULPRL SM3/DAY /
|
||||
UNITS WUOPRU SM3/DAY /
|
||||
UNITS WULPRU SM3/DAY /
|
||||
--
|
||||
/
|
||||
|
||||
|
||||
GCONPROD
|
||||
'TEST' 'LRAT' 6000 2* 6000 'RATE' 'NO' /
|
||||
'LOWER' 'FLD' 6000 2* 6000 'RATE' 'YES' 1* 'FORM' /
|
||||
'UPPER' 'FLD' 3000 2* 6000 'RATE' 'YES' 1* 'FORM' /
|
||||
/
|
||||
|
||||
|
||||
GCONINJE
|
||||
'LOWER' 'WATER' 'VREP' 3* 1.2 /
|
||||
'UPPER' 'WATER' 'VREP' 3* 1.2 /
|
||||
/
|
||||
|
||||
|
||||
GUIDERAT
|
||||
0 'OIL' 1 0.5 1 1 0 0 'YES' 0.5 /
|
||||
|
||||
|
||||
WCONPROD
|
||||
'OPL02' 'OPEN' 'GRUP' 'WUOPRL' 2* 'WULPRL' 1* 60 /
|
||||
/
|
||||
|
||||
|
||||
WCONPROD
|
||||
'OPU02' 'OPEN' 'GRUP' 'WUOPRU' 2* 'WULPRU' 1* 60 /
|
||||
/
|
||||
|
||||
|
||||
DATES
|
||||
1 'SEP' 2018 /
|
||||
/
|
||||
|
||||
|
||||
WELOPEN
|
||||
'OPL01' 'OPEN' /
|
||||
/
|
||||
|
||||
|
||||
DATES
|
||||
1 'OCT' 2018 /
|
||||
/
|
||||
|
||||
|
||||
WELOPEN
|
||||
'WIL01' 'OPEN' /
|
||||
/
|
||||
|
||||
|
||||
DATES
|
||||
1 'NOV' 2018 /
|
||||
/
|
||||
|
||||
WCONPROD
|
||||
'OPL02' 'OPEN' 'GRUP' 100 2* 200 1* 60 /
|
||||
/
|
||||
|
||||
WELOPEN
|
||||
'OPL02' 'OPEN' /
|
||||
/
|
||||
|
||||
|
||||
DATES
|
||||
1 'DEC' 2018 /
|
||||
/
|
||||
|
||||
|
||||
WELOPEN
|
||||
'OPU01' 'OPEN' /
|
||||
/
|
||||
|
||||
|
||||
DATES
|
||||
1 'JAN' 2019 /
|
||||
/
|
||||
|
||||
|
||||
WELOPEN
|
||||
'OPU02' 'OPEN' /
|
||||
/
|
||||
|
||||
|
||||
DATES
|
||||
1 'FEB' 2019 /
|
||||
/
|
||||
|
||||
|
||||
WELOPEN
|
||||
'WIU01' 'OPEN' /
|
||||
/
|
||||
DATES
|
||||
1 'MAR' 2019 /
|
||||
1 'APR' 2019 /
|
||||
1 'MAY' 2019 /
|
||||
1 'JUN' 2019 /
|
||||
1 'JUL' 2019 /
|
||||
1 'JAN' 2020 /
|
||||
/
|
||||
)";
|
||||
Reference in New Issue
Block a user