diff --git a/CMakeLists_files.cmake b/CMakeLists_files.cmake index 5a628d65d..2bd477aa3 100644 --- a/CMakeLists_files.cmake +++ b/CMakeLists_files.cmake @@ -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 diff --git a/opm/parser/eclipse/EclipseState/Schedule/Schedule.hpp b/opm/parser/eclipse/EclipseState/Schedule/Schedule.hpp index 39bc334b6..ea0973803 100644 --- a/opm/parser/eclipse/EclipseState/Schedule/Schedule.hpp +++ b/opm/parser/eclipse/EclipseState/Schedule/Schedule.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 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> wtest_config; DynamicState> wlist_manager; DynamicState> udq_config; + DynamicState> udq_active; DynamicState 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 group, size_t reportStep); + bool checkGroups(const ParseContext& parseContext, ErrorGuard& errors); + void updateUDQActive( std::size_t timeStep, std::shared_ptr 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, diff --git a/opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQActive.hpp b/opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQActive.hpp new file mode 100644 index 000000000..9c4af1bf5 --- /dev/null +++ b/opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQActive.hpp @@ -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 . +*/ + + +#ifndef UDQ_USAGE_HPP +#define UDQ_USAGE_HPP + +#include +#include +#include +#include + +#include + +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::const_iterator begin() const; + std::vector::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 data; + std::unordered_map keys; + std::unordered_map m_use_count; +}; + +} + +#endif diff --git a/opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQEnums.hpp b/opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQEnums.hpp index d4cb7ecc4..7e030ccc6 100644 --- a/opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQEnums.hpp +++ b/opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQEnums.hpp @@ -100,7 +100,6 @@ enum class UDQAction { UPDATE }; - enum class UDAControl { WCONPROD_ORAT, WCONPROD_GRAT, diff --git a/opm/parser/eclipse/EclipseState/Schedule/Well/Well2.hpp b/opm/parser/eclipse/EclipseState/Schedule/Well/Well2.hpp index 1f1db6d22..8415e80f3 100644 --- a/opm/parser/eclipse/EclipseState/Schedule/Well/Well2.hpp +++ b/opm/parser/eclipse/EclipseState/Schedule/Well/Well2.hpp @@ -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; diff --git a/src/opm/parser/eclipse/EclipseState/Schedule/Schedule.cpp b/src/opm/parser/eclipse/EclipseState/Schedule/Schedule.cpp index d875db542..e4f613fc5 100644 --- a/src/opm/parser/eclipse/EclipseState/Schedule/Schedule.cpp +++ b/src/opm/parser/eclipse/EclipseState/Schedule/Schedule.cpp @@ -49,6 +49,7 @@ #include #include #include +#include #include #include #include @@ -118,6 +119,7 @@ namespace { wtest_config(this->m_timeMap, std::make_shared() ), wlist_manager( this->m_timeMap, std::make_shared()), udq_config(this->m_timeMap, std::make_shared(deck)), + udq_active(this->m_timeMap, std::make_shared()), 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(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(this->udqActive(currentStep)); + if (properties->updateUDQActive(*udq)) + this->updateUDQActive(currentStep, udq); } } } @@ -900,6 +905,10 @@ namespace { } } } + + auto udq = std::make_shared(this->udqActive(currentStep)); + if (injection->updateUDQActive(*udq)) + this->updateUDQActive(currentStep, udq); } } } @@ -1478,7 +1487,6 @@ namespace { auto water_target = record.getItem("WATER_TARGET").get(0); auto liquid_target = record.getItem("LIQUID_TARGET").get(0); auto resv_target = record.getItem("RESERVOIR_FLUID_TARGET").getSIDouble(0); - { auto group_ptr = std::make_shared(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 udq ) { + this->udq_active.update(timeStep, udq); + } const WellTestConfig& Schedule::wtestConfig(size_t timeStep) const { const auto& ptr = this->wtest_config.get(timeStep); diff --git a/src/opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQActive.cpp b/src/opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQActive.cpp new file mode 100644 index 000000000..376575b8a --- /dev/null +++ b/src/opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQActive.cpp @@ -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 . +*/ + +#include +#include + +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(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()) + return this->add(uda.get(), wgname, control); + else + return this->drop(wgname, control); +} + +std::vector::const_iterator UDQActive::begin() const { + return this->data.begin(); +} + +std::vector::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; +} + +} + diff --git a/src/opm/parser/eclipse/EclipseState/Schedule/Well/Well2.cpp b/src/opm/parser/eclipse/EclipseState/Schedule/Well/Well2.cpp index 8077c7cfa..d36e8fcb1 100644 --- a/src/opm/parser/eclipse/EclipseState/Schedule/Well/Well2.cpp +++ b/src/opm/parser/eclipse/EclipseState/Schedule/Well/Well2.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #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"); } - } - diff --git a/src/opm/parser/eclipse/EclipseState/Schedule/Well/WellInjectionProperties.cpp b/src/opm/parser/eclipse/EclipseState/Schedule/Well/WellInjectionProperties.cpp index 771647bce..da33b4ec7 100644 --- a/src/opm/parser/eclipse/EclipseState/Schedule/Well/WellInjectionProperties.cpp +++ b/src/opm/parser/eclipse/EclipseState/Schedule/Well/WellInjectionProperties.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #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); + } + } diff --git a/src/opm/parser/eclipse/EclipseState/Schedule/Well/WellInjectionProperties.hpp b/src/opm/parser/eclipse/EclipseState/Schedule/Well/WellInjectionProperties.hpp index c2205b058..bb507c966 100644 --- a/src/opm/parser/eclipse/EclipseState/Schedule/Well/WellInjectionProperties.hpp +++ b/src/opm/parser/eclipse/EclipseState/Schedule/Well/WellInjectionProperties.hpp @@ -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& ); diff --git a/src/opm/parser/eclipse/EclipseState/Schedule/Well/WellProductionProperties.cpp b/src/opm/parser/eclipse/EclipseState/Schedule/Well/WellProductionProperties.cpp index 16e4d61f2..332272ce1 100644 --- a/src/opm/parser/eclipse/EclipseState/Schedule/Well/WellProductionProperties.cpp +++ b/src/opm/parser/eclipse/EclipseState/Schedule/Well/WellProductionProperties.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -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 diff --git a/src/opm/parser/eclipse/EclipseState/Schedule/Well/WellProductionProperties.hpp b/src/opm/parser/eclipse/EclipseState/Schedule/Well/WellProductionProperties.hpp index 48c2d0fe3..a3e6510d6 100644 --- a/src/opm/parser/eclipse/EclipseState/Schedule/Well/WellProductionProperties.hpp +++ b/src/opm/parser/eclipse/EclipseState/Schedule/Well/WellProductionProperties.hpp @@ -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 ); diff --git a/tests/parser/UDQTests.cpp b/tests/parser/UDQTests.cpp index 8f5bf737c..ac3960255 100644 --- a/tests/parser/UDQTests.cpp +++ b/tests/parser/UDQTests.cpp @@ -32,6 +32,7 @@ Copyright 2018 Statoil ASA. #include #include #include +#include #include using namespace Opm; @@ -1230,3 +1231,115 @@ UDQ BOOST_CHECK( input[0].is()); } + +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); + } +} diff --git a/tests/parser/WellTests.cpp b/tests/parser/WellTests.cpp index d6c3603f3..1b8ae4c32 100644 --- a/tests/parser/WellTests.cpp +++ b/tests/parser/WellTests.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -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; } diff --git a/tests/parser/data/integration_tests/udq.data b/tests/parser/data/integration_tests/udq.data new file mode 100644 index 000000000..e7365e95c --- /dev/null +++ b/tests/parser/data/integration_tests/udq.data @@ -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 / +/ +)"; \ No newline at end of file