Log use of UDA for output purposes

This commit is contained in:
Joakim Hove
2019-06-19 13:40:27 +02:00
committed by Jostein Alvestad
parent 4d1b747b42
commit 1a62ceff7d
15 changed files with 1062 additions and 11 deletions

View File

@@ -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

View File

@@ -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,

View 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

View File

@@ -100,7 +100,6 @@ enum class UDQAction {
UPDATE
};
enum class UDAControl {
WCONPROD_ORAT,
WCONPROD_GRAT,

View File

@@ -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;

View File

@@ -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);

View 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;
}
}

View File

@@ -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");
}
}

View File

@@ -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);
}
}

View File

@@ -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& );

View File

@@ -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

View File

@@ -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 );

View File

@@ -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);
}
}

View File

@@ -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;
}

View 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 /
/
)";