Merged from upstream/master

This commit is contained in:
Kristian Flikka
2014-02-12 10:13:49 +01:00
54 changed files with 314 additions and 231 deletions

View File

@@ -31,13 +31,14 @@ if (CMAKE_SIZEOF_VOID_P)
math (EXPR _BITS "8 * ${CMAKE_SIZEOF_VOID_P}")
endif (CMAKE_SIZEOF_VOID_P)
string(REGEX REPLACE "${PROJECT_SOURCE_DIR}/?(.*)" "\\1" BUILD_DIR_SUFFIX "${PROJECT_BINARY_DIR}")
find_library (CJSON_LIBRARY
NAMES "cjson"
HINTS "${CJSON_ROOT}"
PATHS "${PROJECT_BINARY_DIR}/../opm-parser"
"${PROJECT_BINARY_DIR}/../opm-parser-build"
"${PROJECT_BINARY_DIR}/../../opm-parser/build"
"${PROJECT_BINARY_DIR}/../../opm-parser/cmake-build"
"${PROJECT_BINARY_DIR}/../opm-parser${BUILD_DIR_SUFFIX}"
"${PROJECT_BINARY_DIR}/../../opm-parser/${BUILD_DIR_SUFFIX}"
PATH_SUFFIXES "lib" "lib${_BITS}" "lib/${CMAKE_LIBRARY_ARCHITECTURE}"
"opm/json"
DOC "Path to cjson library archive/shared object files"

View File

@@ -144,6 +144,12 @@ Utility/GruptreeWrapper.hpp
Utility/WelspecsWrapper.hpp
Utility/PvtgOuterTable.hpp
Utility/EquilWrapper.hpp
Utility/EndscaleWrapper.hpp
Utility/ScalecrsWrapper.hpp
Utility/EnptvdTable.hpp
Utility/EnkrvdTable.hpp
Utility/RocktabTable.hpp
Utility/RockTable.hpp
)
add_library(buildParser ${rawdeck_source} ${build_parser_source} ${deck_source} ${unit_source})

View File

@@ -23,6 +23,7 @@
#include <algorithm>
#include <iostream>
#include <cmath>
namespace Opm {

View File

@@ -101,15 +101,15 @@ BOOST_AUTO_TEST_CASE(PushBackMultiple) {
BOOST_AUTO_TEST_CASE(PushBackDimension) {
DeckDoubleItem item("HEI");
std::shared_ptr<Dimension> activeDimension(new Dimension("L" , 100));
std::shared_ptr<Dimension> defaultDimension(new Dimension("L" , 10));
std::shared_ptr<Dimension> activeDimension(new Dimension("Length" , 100));
std::shared_ptr<Dimension> defaultDimension(new Dimension("Length" , 10));
item.push_backDimension( activeDimension , defaultDimension);
}
BOOST_AUTO_TEST_CASE(PushBackDimensionInvalidType) {
DeckIntItem item("HEI");
std::shared_ptr<Dimension> dim(new Dimension("L" , 100));
std::shared_ptr<Dimension> dim(new Dimension("Length" , 100));
BOOST_CHECK_THROW( item.push_backDimension( dim , dim ) , std::invalid_argument );
}
@@ -127,7 +127,7 @@ BOOST_AUTO_TEST_CASE(GetSIWithoutDimensionThrows) {
BOOST_AUTO_TEST_CASE(GetSISingleDimensionCorrect) {
DeckDoubleItem item("HEI");
std::shared_ptr<Dimension> dim(new Dimension("L" , 100));
std::shared_ptr<Dimension> dim(new Dimension("Length" , 100));
item.push_backMultiple(1 , 100 );
item.push_backDimension( dim , dim );
@@ -139,8 +139,8 @@ BOOST_AUTO_TEST_CASE(GetSISingleDimensionCorrect) {
BOOST_AUTO_TEST_CASE(GetSISingleDefault) {
DeckDoubleItem item("HEI");
std::shared_ptr<Dimension> dim(new Dimension("L" , 1));
std::shared_ptr<Dimension> defaultDim(new Dimension("L" , 100));
std::shared_ptr<Dimension> dim(new Dimension("Length" , 1));
std::shared_ptr<Dimension> defaultDim(new Dimension("Length" , 100));
item.push_backDefault(1 );
item.push_backDimension( dim , defaultDim );
@@ -152,11 +152,11 @@ BOOST_AUTO_TEST_CASE(GetSISingleDefault) {
BOOST_AUTO_TEST_CASE(GetSIMultipleDim) {
DeckDoubleItem item("HEI");
std::shared_ptr<Dimension> dim1(new Dimension("L" , 2));
std::shared_ptr<Dimension> dim2(new Dimension("L" , 4));
std::shared_ptr<Dimension> dim3(new Dimension("L" , 8));
std::shared_ptr<Dimension> dim4(new Dimension("L" ,16));
std::shared_ptr<Dimension> defaultDim(new Dimension("L" , 100));
std::shared_ptr<Dimension> dim1(new Dimension("Length" , 2));
std::shared_ptr<Dimension> dim2(new Dimension("Length" , 4));
std::shared_ptr<Dimension> dim3(new Dimension("Length" , 8));
std::shared_ptr<Dimension> dim4(new Dimension("Length" ,16));
std::shared_ptr<Dimension> defaultDim(new Dimension("Length" , 100));
item.push_backMultiple( 1 , 16 );
item.push_backDimension( dim1 , defaultDim );

View File

@@ -227,7 +227,7 @@ namespace Opm {
}
double Group::getOilTargetRate(size_t time_step) {
double Group::getOilTargetRate(size_t time_step) const {
return m_production->oilTarget->get(time_step);
}
@@ -237,7 +237,7 @@ namespace Opm {
}
double Group::getGasTargetRate(size_t time_step) {
double Group::getGasTargetRate(size_t time_step) const {
return m_production->gasTarget->get(time_step);
}
@@ -247,7 +247,7 @@ namespace Opm {
}
double Group::getWaterTargetRate(size_t time_step) {
double Group::getWaterTargetRate(size_t time_step) const {
return m_production->waterTarget->get(time_step);
}
@@ -257,7 +257,7 @@ namespace Opm {
}
double Group::getLiquidTargetRate(size_t time_step) {
double Group::getLiquidTargetRate(size_t time_step) const {
return m_production->liquidTarget->get(time_step);
}
@@ -269,7 +269,7 @@ namespace Opm {
}
bool Group::hasWell(const std::string& wellName , size_t time_step) {
bool Group::hasWell(const std::string& wellName , size_t time_step) const {
WellSetConstPtr wellSet = wellMap(time_step);
return wellSet->hasWell(wellName);
}
@@ -281,7 +281,7 @@ namespace Opm {
}
size_t Group::numWells(size_t time_step) {
size_t Group::numWells(size_t time_step) const {
WellSetConstPtr wellSet = wellMap(time_step);
return wellSet->size();
}

View File

@@ -81,19 +81,19 @@ namespace Opm {
void setProductionExceedLimitAction(size_t time_step , GroupProductionExceedLimit::ActionEnum action);
void setOilTargetRate(size_t time_step , double oilTargetRate);
double getOilTargetRate(size_t time_step);
double getOilTargetRate(size_t time_step) const;
void setGasTargetRate(size_t time_step , double gasTargetRate);
double getGasTargetRate(size_t time_step);
double getGasTargetRate(size_t time_step) const;
void setWaterTargetRate(size_t time_step , double waterTargetRate);
double getWaterTargetRate(size_t time_step);
double getWaterTargetRate(size_t time_step) const;
void setLiquidTargetRate(size_t time_step , double LiquidTargetRate);
double getLiquidTargetRate(size_t time_step);
double getLiquidTargetRate(size_t time_step) const;
/*****************************************************************/
bool hasWell(const std::string& wellName , size_t time_step);
bool hasWell(const std::string& wellName , size_t time_step) const;
WellConstPtr getWell(const std::string& wellName , size_t time_step) const;
size_t numWells(size_t time_step);
size_t numWells(size_t time_step) const;
void addWell(size_t time_step , WellPtr well);
void delWell(size_t time_step, const std::string& wellName );
private:

View File

@@ -80,10 +80,10 @@ namespace Opm {
handleWCONPROD(keyword, currentStep);
if (keyword->name() == "WCONINJE")
handleWCONINJE(keyword, currentStep);
handleWCONINJE(deck, keyword, currentStep);
if (keyword->name() == "WCONINJH")
handleWCONINJH(keyword, currentStep);
handleWCONINJH(deck, keyword, currentStep);
if (keyword->name() == "COMPDAT")
handleCOMPDAT(keyword, currentStep);
@@ -95,7 +95,7 @@ namespace Opm {
handleGRUPTREE(keyword, currentStep);
if (keyword->name() == "GCONINJE")
handleGCONINJE( keyword , currentStep );
handleGCONINJE( deck, keyword , currentStep );
if (keyword->name() == "GCONPROD")
handleGCONPROD( keyword , currentStep );
@@ -188,9 +188,9 @@ namespace Opm {
if (isPredictionMode) {
liquidRate = record->getItem("LRAT")->getSIDouble(0);
resVRate = record->getItem("RESV")->getSIDouble(0);
BHPLimit = record->getItem("BHP")->getSIDouble(0);
THPLimit = record->getItem("THP")->getSIDouble(0);
resVRate = record->getItem("RESV")->getSIDouble(0);
}
well->setLiquidRate( currentStep , liquidRate );
@@ -238,18 +238,25 @@ namespace Opm {
handleWCONProducer(keyword, currentStep, true);
}
void Schedule::handleWCONINJE(DeckKeywordConstPtr keyword, size_t currentStep) {
void Schedule::handleWCONINJE(DeckConstPtr deck, DeckKeywordConstPtr keyword, size_t currentStep) {
for (size_t recordNr = 0; recordNr < keyword->size(); recordNr++) {
DeckRecordConstPtr record = keyword->getRecord(recordNr);
const std::string& wellName = record->getItem("WELL")->getString(0);
WellPtr well = getWell(wellName);
double surfaceInjectionRate = record->getItem("RATE")->getSIDouble(0);
double reservoirInjectionRate = record->getItem("RESV")->getSIDouble(0);
// calculate the injection rates. These are context
// dependent, so we have to jump through some hoops
// here...
WellInjector::TypeEnum injectorType = WellInjector::TypeFromString( record->getItem("TYPE")->getString(0) );
double surfaceInjectionRate = record->getItem("RATE")->getRawDouble(0);
double reservoirInjectionRate = record->getItem("RESV")->getRawDouble(0);
surfaceInjectionRate = convertInjectionRateToSI(surfaceInjectionRate, injectorType, *deck->getActiveUnitSystem());
reservoirInjectionRate = convertInjectionRateToSI(reservoirInjectionRate, injectorType, *deck->getActiveUnitSystem());
double BHPLimit = record->getItem("BHP")->getSIDouble(0);
double THPLimit = record->getItem("THP")->getSIDouble(0);
WellInjector::ControlModeEnum controlMode = WellInjector::ControlModeFromString( record->getItem("CMODE")->getString(0));
WellCommon::StatusEnum status = WellCommon::StatusFromString( record->getItem("STATUS")->getString(0));
WellInjector::TypeEnum injectorType = WellInjector::TypeFromString( record->getItem("TYPE")->getString(0) );
WellInjector::ControlModeEnum controlMode = WellInjector::ControlModeFromString( record->getItem("CMODE")->getString(0));
well->setStatus( currentStep , status );
well->setSurfaceInjectionRate( currentStep , surfaceInjectionRate );
@@ -275,14 +282,19 @@ namespace Opm {
}
}
void Schedule::handleWCONINJH(DeckKeywordConstPtr keyword, size_t currentStep) {
void Schedule::handleWCONINJH(DeckConstPtr deck, DeckKeywordConstPtr keyword, size_t currentStep) {
for (size_t recordNr = 0; recordNr < keyword->size(); recordNr++) {
DeckRecordConstPtr record = keyword->getRecord(recordNr);
const std::string& wellName = record->getItem("WELL")->getString(0);
WellPtr well = getWell(wellName);
double injectionRate = record->getItem("RATE")->getSIDouble(0);
// convert injection rates to SI
WellInjector::TypeEnum wellType = WellInjector::TypeFromString( record->getItem("TYPE")->getString(0));
double injectionRate = record->getItem("RATE")->getRawDouble(0);
injectionRate = convertInjectionRateToSI(injectionRate, wellType, *deck->getActiveUnitSystem());
WellCommon::StatusEnum status = WellCommon::StatusFromString( record->getItem("STATUS")->getString(0));
well->setStatus( currentStep , status );
well->setSurfaceInjectionRate( currentStep , injectionRate );
well->setInPredictionMode(currentStep, false );
@@ -306,7 +318,7 @@ namespace Opm {
}
void Schedule::handleGCONINJE(DeckKeywordConstPtr keyword, size_t currentStep) {
void Schedule::handleGCONINJE(DeckConstPtr deck, DeckKeywordConstPtr keyword, size_t currentStep) {
for (size_t recordNr = 0; recordNr < keyword->size(); recordNr++) {
DeckRecordConstPtr record = keyword->getRecord(recordNr);
const std::string& groupName = record->getItem("GROUP")->getString(0);
@@ -320,10 +332,19 @@ namespace Opm {
GroupInjection::ControlEnum controlMode = GroupInjection::ControlEnumFromString( record->getItem("CONTROL_MODE")->getString(0) );
group->setInjectionControlMode( currentStep , controlMode );
}
group->setSurfaceMaxRate( currentStep , record->getItem("SURFACE_TARGET")->getSIDouble(0));
group->setReservoirMaxRate( currentStep , record->getItem("RESV_TARGET")->getSIDouble(0));
group->setTargetReinjectFraction( currentStep , record->getItem("REINJ_TARGET")->getRawDouble(0));
group->setTargetVoidReplacementFraction( currentStep , record->getItem("VOIDAGE_TARGET")->getRawDouble(0));
Phase::PhaseEnum wellPhase = Phase::PhaseEnumFromString( record->getItem("PHASE")->getString(0));
// calculate SI injection rates for the group
double surfaceInjectionRate = record->getItem("SURFACE_TARGET")->getRawDouble(0);
surfaceInjectionRate = convertInjectionRateToSI(surfaceInjectionRate, wellPhase, *deck->getActiveUnitSystem());
double reservoirInjectionRate = record->getItem("RESV_TARGET")->getRawDouble(0);
reservoirInjectionRate = convertInjectionRateToSI(reservoirInjectionRate, wellPhase, *deck->getActiveUnitSystem());
group->setSurfaceMaxRate( currentStep , surfaceInjectionRate);
group->setReservoirMaxRate( currentStep , reservoirInjectionRate);
group->setTargetReinjectFraction( currentStep , record->getItem("REINJ_TARGET")->getSIDouble(0));
group->setTargetVoidReplacementFraction( currentStep , record->getItem("VOIDAGE_TARGET")->getSIDouble(0));
group->setProductionGroup(currentStep, false);
}
@@ -465,4 +486,38 @@ namespace Opm {
}
double Schedule::convertInjectionRateToSI(double rawRate, WellInjector::TypeEnum wellType, const Opm::UnitSystem &unitSystem) const {
switch (wellType) {
case WellInjector::MULTI:
// multi-phase controlled injectors are a really funny
// construct in Eclipse: the quantity controlled for is
// not physically meaningful, i.e. Eclipse adds up
// MCFT/day and STB/day.
throw std::logic_error("There is no generic way to handle multi-phase injectors at this level!");
case WellInjector::OIL:
case WellInjector::WATER:
return rawRate * unitSystem.parse("LiquidVolume/Time")->getSIScaling();
case WellInjector::GAS:
return rawRate * unitSystem.parse("GasVolume/Time")->getSIScaling();
default:
throw std::logic_error("Unknown injector type");
}
}
double Schedule::convertInjectionRateToSI(double rawRate, Phase::PhaseEnum wellPhase, const Opm::UnitSystem &unitSystem) const {
switch (wellPhase) {
case Phase::OIL:
case Phase::WATER:
return rawRate * unitSystem.parse("LiquidVolume/Time")->getSIScaling();
case Phase::GAS:
return rawRate * unitSystem.parse("GasVolume/Time")->getSIScaling();
default:
throw std::logic_error("Unknown injection phase");
}
}
}

View File

@@ -73,15 +73,17 @@ namespace Opm
void handleWCONHIST(DeckKeywordConstPtr keyword , size_t currentStep);
void handleWCONPROD(DeckKeywordConstPtr keyword, size_t currentStep);
void handleCOMPDAT(DeckKeywordConstPtr keyword , size_t currentStep);
void handleWCONINJE(DeckKeywordConstPtr keyword, size_t currentStep);
void handleWCONINJH(DeckKeywordConstPtr keyword, size_t currentStep);
void handleWCONINJE(DeckConstPtr deck, DeckKeywordConstPtr keyword, size_t currentStep);
void handleWCONINJH(DeckConstPtr deck, DeckKeywordConstPtr keyword, size_t currentStep);
void handleWELOPEN(DeckKeywordConstPtr keyword, size_t currentStep);
void handleGCONINJE(DeckKeywordConstPtr keyword, size_t currentStep);
void handleGCONINJE(DeckConstPtr deck, DeckKeywordConstPtr keyword, size_t currentStep);
void handleGCONPROD(DeckKeywordConstPtr keyword, size_t currentStep);
void handleDATES(DeckKeywordConstPtr keyword);
void handleTSTEP(DeckKeywordConstPtr keyword);
void handleGRUPTREE(DeckKeywordConstPtr keyword, size_t currentStep);
double convertInjectionRateToSI(double rawRate, WellInjector::TypeEnum wellType, const Opm::UnitSystem &unitSystem) const;
double convertInjectionRateToSI(double rawRate, Phase::PhaseEnum wellPhase, const Opm::UnitSystem &unitSystem) const;
};
typedef std::shared_ptr<Schedule> SchedulePtr;
typedef std::shared_ptr<const Schedule> ScheduleConstPtr;

View File

@@ -130,7 +130,7 @@ BOOST_AUTO_TEST_CASE(WellTesting) {
BOOST_CHECK( well1->isInjector(9));
BOOST_CHECK_CLOSE(20000/Metric::Time , well1->getSurfaceInjectionRate(9) , 0.001);
BOOST_CHECK_CLOSE(200000/Metric::Time , well1->getReservoirInjectionRate(9) , 0.001);
BOOST_CHECK_CLOSE(200000/Metric::Time, well1->getReservoirInjectionRate(9) , 0.001);
BOOST_CHECK_CLOSE(6891 * Metric::Pressure , well1->getBHPLimit(9) , 0.001);
BOOST_CHECK_CLOSE(0 , well1->getTHPLimit(9) , 0.001);
BOOST_CHECK_CLOSE(123.00 * Metric::Pressure , well1->getBHPLimit(10) , 0.001);

View File

@@ -108,13 +108,13 @@ namespace Opm {
UnitSystem * system = new UnitSystem("Metric");
system->addDimension("1" , 1);
system->addDimension("L" , 1);
system->addDimension("t" , 86400 );
system->addDimension("m" , 1 );
system->addDimension("P" , 100000 );
system->addDimension("K" , 9.869233e-10 );
system->addDimension("mu" , 0.001); // viscosity. ECLiPSE uses cP for metric units
system->addDimension("Rs" , 1); // Gas dissolution factor. ECLiPSE uses m^3/m^3 for metric units
system->addDimension("Length" , 1);
system->addDimension("Time" , 86400 );
system->addDimension("Mass" , 1 );
system->addDimension("Pressure" , 100000 );
system->addDimension("Permeability" , 9.869233e-10 );
system->addDimension("Viscosity" , 0.001); // viscosity. ECLiPSE uses cP for metric units
system->addDimension("GasDissolutionFactor" , 1); // Gas dissolution factor. ECLiPSE uses m^3/m^3 for metric units
return system;
}
@@ -125,13 +125,13 @@ namespace Opm {
UnitSystem * system = new UnitSystem("Field");
system->addDimension("1" , 1);
system->addDimension("L" , 0.3048);
system->addDimension("t" , 86400 );
system->addDimension("m" , 0.45359237 );
system->addDimension("P" , 6894.76 );
system->addDimension("K" , 9.869233e-10 );
system->addDimension("mu" , 0.001); // viscosity. ECLiPSE uses cP for field units
system->addDimension("Rs" , 28.316847/0.15898729); // Gas dissolution factor. ECLiPSE uses Mscft/stb for field units
system->addDimension("Length" , 0.3048);
system->addDimension("Time" , 86400 );
system->addDimension("Mass" , 0.45359237 );
system->addDimension("Pressure" , 6894.76 );
system->addDimension("Permeability" , 9.869233e-10 );
system->addDimension("Viscosity" , 0.001); // viscosity. ECLiPSE uses cP for field units
system->addDimension("GasDissolutionFactor" , 28.316847/0.15898729); // Gas dissolution factor. ECLiPSE uses Mscft/stb for field units
return system;
}

View File

@@ -189,8 +189,8 @@ BOOST_AUTO_TEST_CASE(DoubleItem_DimEqual_ReturnsTrue) {
ParserDoubleItem item1("ITEM1", sizeType);
ParserDoubleItem item2("ITEM1", sizeType);
item1.push_backDimension("L*L");
item2.push_backDimension("L*L");
item1.push_backDimension("Length*Length");
item2.push_backDimension("Length*Length");
BOOST_CHECK( item1.equal( item2 ));
}
@@ -199,16 +199,16 @@ BOOST_AUTO_TEST_CASE(DoubleItem_DimEqual_ReturnsTrue) {
BOOST_AUTO_TEST_CASE(DoubleItem_DimDifferent_ReturnsFalse) {
ParserItemSizeEnum sizeType = ALL;
ParserDoubleItem item1("ITEM1", sizeType); // Dim: []
ParserDoubleItem item2("ITEM1", sizeType); // Dim: [L]
ParserDoubleItem item3("ITEM1", sizeType); // Dim: [L ,L]
ParserDoubleItem item2("ITEM1", sizeType); // Dim: [Length]
ParserDoubleItem item3("ITEM1", sizeType); // Dim: [Length ,Length]
ParserDoubleItem item4("ITEM1", sizeType); // Dim: [t]
item2.push_backDimension("L");
item2.push_backDimension("Length");
item3.push_backDimension("L");
item3.push_backDimension("L");
item3.push_backDimension("Length");
item3.push_backDimension("Length");
item4.push_backDimension("t");
item4.push_backDimension("Time");
BOOST_CHECK_EQUAL(false , item1.equal( item2 ));
BOOST_CHECK_EQUAL(false , item2.equal( item3 ));
@@ -587,7 +587,7 @@ BOOST_AUTO_TEST_CASE(ParserIntItemGetDimensionThrows) {
ParserIntItem intItem(std::string("SOMEINT"));
BOOST_CHECK_THROW( intItem.getDimension(0) , std::invalid_argument );
BOOST_CHECK_THROW( intItem.push_backDimension("L") , std::invalid_argument );
BOOST_CHECK_THROW( intItem.push_backDimension("Length") , std::invalid_argument );
}
@@ -595,8 +595,8 @@ BOOST_AUTO_TEST_CASE(ParserIntItemGetDimensionThrows) {
BOOST_AUTO_TEST_CASE(ParserDoubleItemAddMultipleDimensionToSIngleSizeThrows) {
ParserDoubleItem doubleItem(std::string("SOMEDOUBLE"));
doubleItem.push_backDimension("L*L");
BOOST_CHECK_THROW( doubleItem.push_backDimension("L*L"), std::invalid_argument);
doubleItem.push_backDimension("Length*Length");
BOOST_CHECK_THROW( doubleItem.push_backDimension("Length*Length"), std::invalid_argument);
}
@@ -604,7 +604,7 @@ BOOST_AUTO_TEST_CASE(ParserDoubleItemWithDimensionHasReturnsCorrect) {
ParserDoubleItem doubleItem(std::string("SOMEDOUBLE"));
BOOST_CHECK_EQUAL( false , doubleItem.hasDimension() );
doubleItem.push_backDimension("L*L");
doubleItem.push_backDimension("Length*Length");
BOOST_CHECK_EQUAL( true , doubleItem.hasDimension() );
}
@@ -615,13 +615,13 @@ BOOST_AUTO_TEST_CASE(ParserDoubleItemGetDimension) {
BOOST_CHECK_THROW( doubleItem.getDimension( 10 ) , std::invalid_argument );
BOOST_CHECK_THROW( doubleItem.getDimension( 0 ) , std::invalid_argument );
doubleItem.push_backDimension("L");
doubleItem.push_backDimension("L*L");
doubleItem.push_backDimension("L*L*L");
doubleItem.push_backDimension("Length");
doubleItem.push_backDimension("Length*Length");
doubleItem.push_backDimension("Length*Length*Length");
BOOST_CHECK_EQUAL( "L" , doubleItem.getDimension(0));
BOOST_CHECK_EQUAL( "L*L" , doubleItem.getDimension(1));
BOOST_CHECK_EQUAL( "L*L*L" , doubleItem.getDimension(2));
BOOST_CHECK_EQUAL( "Length" , doubleItem.getDimension(0));
BOOST_CHECK_EQUAL( "Length*Length" , doubleItem.getDimension(1));
BOOST_CHECK_EQUAL( "Length*Length*Length" , doubleItem.getDimension(2));
BOOST_CHECK_THROW( doubleItem.getDimension( 3 ) , std::invalid_argument );
}

View File

@@ -465,14 +465,14 @@ BOOST_AUTO_TEST_CASE(ParseKeywordHasDimensionCorrect) {
BOOST_CHECK_EQUAL( false , parserKeyword->hasDimension());
BOOST_CHECK_EQUAL( 0U , itemI->numDimensions() );
item2->push_backDimension("L*L/t");
item2->push_backDimension("Length*Length/Time");
BOOST_CHECK_EQUAL( true , parserKeyword->hasDimension());
BOOST_CHECK_EQUAL( 1U , item2->numDimensions() );
}
BOOST_AUTO_TEST_CASE(ConstructFromJsonObject_withDimension) {
Json::JsonObject jsonObject("{\"name\": \"BPR\", \"size\" : 100 , \"items\" :[{\"name\":\"ItemX\" , \"size_type\":\"SINGLE\" , \"value_type\" : \"FLOAT\" , \"dimension\" : \"L*L/t\"}]}");
Json::JsonObject jsonObject("{\"name\": \"BPR\", \"size\" : 100 , \"items\" :[{\"name\":\"ItemX\" , \"size_type\":\"SINGLE\" , \"value_type\" : \"FLOAT\" , \"dimension\" : \"Length*Length/Time\"}]}");
ParserKeyword parserKeyword(jsonObject);
ParserRecordConstPtr record = parserKeyword.getRecord();
ParserItemConstPtr item = record->get("ItemX");
@@ -490,7 +490,7 @@ BOOST_AUTO_TEST_CASE(ConstructFromJsonObject_withDimension) {
BOOST_AUTO_TEST_CASE(ConstructFromJsonObject_withDimensionList) {
Json::JsonObject jsonObject("{\"name\": \"BPR\", \"size\" : 100 , \"items\" :[{\"name\":\"ItemX\" , \"size_type\":\"ALL\" , \"value_type\" : \"FLOAT\" , \"dimension\" : [\"L*L/t\" , \"t\", \"1\"]}]}");
Json::JsonObject jsonObject("{\"name\": \"BPR\", \"size\" : 100 , \"items\" :[{\"name\":\"ItemX\" , \"size_type\":\"ALL\" , \"value_type\" : \"FLOAT\" , \"dimension\" : [\"Length*Length/Time\" , \"Time\", \"1\"]}]}");
ParserKeyword parserKeyword(jsonObject);
ParserRecordConstPtr record = parserKeyword.getRecord();
ParserItemConstPtr item = record->get("ItemX");

View File

@@ -318,6 +318,6 @@ BOOST_AUTO_TEST_CASE(ParseRecordHasDimensionCorrect) {
parserRecord->addItem( item2 );
BOOST_CHECK_EQUAL( false , parserRecord->hasDimension());
item2->push_backDimension("L*L/t");
item2->push_backDimension("Length*Length/Time");
BOOST_CHECK_EQUAL( true , parserRecord->hasDimension());
}

View File

@@ -51,8 +51,10 @@ namespace Opm {
const double Time = 86400;
const double Mass = 1.0;
const double Permeability = 9.869233e-16;
const double DissolvedGasRatio = 1.0;
const double FlowVolume = 1.0;
const double GasDissolutionFactor = 1.0;
const double OilDissolutionFactor = 1.0;
const double LiquidVolume = 1.0;
const double GasVolume = 1.0;
const double Density = 1.0;
const double Viscosity = 0.001; // cP -> Pa s
const double Timestep = 24*60*60; // days -> s
@@ -65,8 +67,10 @@ namespace Opm {
const double Time = 86400;
const double Mass = 0.45359237;
const double Permeability = 9.869233e-16;
const double DissolvedGasRatio = 178.1076; // Mscf / stb -> m^3/m^3
const double FlowVolume = 0.158987294; // STB -> m^3
const double GasDissolutionFactor = 178.1076; // Mscf / stb -> m^3/m^3
const double OilDissolutionFactor = 1.0/178.1076; // stb / Mscf -> m^3/m^3
const double LiquidVolume = 0.158987294; // STB -> m^3
const double GasVolume = 28.316847; // MCFT -> m^3
const double Density = 16.01846; // lb/ft^3 -> kg / m^3
const double Viscosity = 0.001; // cP -> Pa s
const double Timestep = 24*60*60; // days -> s

View File

@@ -21,6 +21,7 @@
#include <string>
#include <stdexcept>
#include <cmath>
namespace Opm {
@@ -40,6 +41,9 @@ namespace Opm {
double Dimension::getSIScaling() const {
if (!std::isfinite(m_SIfactor))
throw std::logic_error("The DeckItem contains a field with a context dependent unit. "
"Use getRawDoubleData() and convert the returned value manually!");
return m_SIfactor;
}
@@ -58,11 +62,13 @@ namespace Opm {
bool Dimension::equal(const Dimension& other) const {
if ((m_name == other.m_name) &&
(m_SIfactor == other.m_SIfactor))
return true;
else
if (m_name != other.m_name)
return false;
if (m_SIfactor == other.m_SIfactor)
return true;
if (std::isnan(m_SIfactor) && std::isnan(other.m_SIfactor))
return true;
return false;
}
}

View File

@@ -24,7 +24,9 @@
#include <opm/parser/eclipse/Units/ConversionFactors.hpp>
#include <opm/parser/eclipse/Units/UnitSystem.hpp>
#include <vector>
#include <limits>
namespace Opm {
@@ -136,16 +138,19 @@ namespace Opm {
UnitSystem * system = new UnitSystem("Metric");
system->addDimension("1" , 1.0);
system->addDimension("P" , Metric::Pressure );
system->addDimension("L" , Metric::Length);
system->addDimension("t" , Metric::Time );
system->addDimension("m" , Metric::Mass );
system->addDimension("K" , Metric::Permeability );
system->addDimension("Rs" , Metric::DissolvedGasRatio);
system->addDimension("FlowVolume", Metric::FlowVolume );
system->addDimension("Rho" , Metric::Density );
system->addDimension("mu" , Metric::Viscosity);
system->addDimension("Pressure" , Metric::Pressure );
system->addDimension("Length" , Metric::Length);
system->addDimension("Time" , Metric::Time );
system->addDimension("Mass" , Metric::Mass );
system->addDimension("Permeability", Metric::Permeability );
system->addDimension("GasDissolutionFactor", Metric::GasDissolutionFactor);
system->addDimension("OilDissolutionFactor", Metric::OilDissolutionFactor);
system->addDimension("LiquidVolume", Metric::LiquidVolume );
system->addDimension("GasVolume" , Metric::GasVolume );
system->addDimension("Density" , Metric::Density );
system->addDimension("Viscosity" , Metric::Viscosity);
system->addDimension("Timestep" , Metric::Timestep);
system->addDimension("ContextDependent", std::numeric_limits<double>::quiet_NaN());
return system;
}
@@ -155,16 +160,19 @@ namespace Opm {
UnitSystem * system = new UnitSystem("Field");
system->addDimension("1" , 1.0);
system->addDimension("P" , Field::Pressure );
system->addDimension("L" , Field::Length);
system->addDimension("t" , Field::Time);
system->addDimension("m" , Field::Mass);
system->addDimension("K" , Field::Permeability );
system->addDimension("Rs" , Field::DissolvedGasRatio );
system->addDimension("FlowVolume" , Field::FlowVolume );
system->addDimension("Rho" , Field::Density );
system->addDimension("mu" , Field::Viscosity);
system->addDimension("Pressure", Field::Pressure );
system->addDimension("Length", Field::Length);
system->addDimension("Time" , Field::Time);
system->addDimension("Mass", Field::Mass);
system->addDimension("Permeability", Field::Permeability );
system->addDimension("GasDissolutionFactor" , Field::GasDissolutionFactor);
system->addDimension("OilDissolutionFactor", Field::OilDissolutionFactor);
system->addDimension("LiquidVolume", Field::LiquidVolume );
system->addDimension("GasVolume", Field::GasVolume );
system->addDimension("Density", Field::Density );
system->addDimension("Viscosity", Field::Viscosity);
system->addDimension("Timestep", Field::Timestep);
system->addDimension("ContextDependent", std::numeric_limits<double>::quiet_NaN());
return system;
}

View File

@@ -30,14 +30,14 @@
using namespace Opm;
BOOST_AUTO_TEST_CASE(CreateDimension) {
Dimension length("L" , 1);
BOOST_CHECK_EQUAL("L" , length.getName());
Dimension length("Length" , 1);
BOOST_CHECK_EQUAL("Length" , length.getName());
BOOST_CHECK_EQUAL(1 , length.getSIScaling());
}
BOOST_AUTO_TEST_CASE(makeComposite) {
std::shared_ptr<Dimension> composite(Dimension::newComposite("L*L*L/t" , 100));
BOOST_CHECK_EQUAL("L*L*L/t" , composite->getName());
std::shared_ptr<Dimension> composite(Dimension::newComposite("Length*Length*Length/Time" , 100));
BOOST_CHECK_EQUAL("Length*Length*Length/Time" , composite->getName());
BOOST_CHECK_EQUAL(100 , composite->getSIScaling());
}
@@ -60,7 +60,7 @@ BOOST_AUTO_TEST_CASE(CreateUnitSystem) {
BOOST_AUTO_TEST_CASE(UnitSystemEmptyHasNone) {
UnitSystem system("Metric");
BOOST_CHECK_EQUAL( false , system.hasDimension("L"));
BOOST_CHECK_EQUAL( false , system.hasDimension("Length"));
BOOST_CHECK_EQUAL( false , system.hasDimension("LXY"));
}
@@ -68,17 +68,17 @@ BOOST_AUTO_TEST_CASE(UnitSystemEmptyHasNone) {
BOOST_AUTO_TEST_CASE(UnitSystemGetMissingDimensionThrows) {
UnitSystem system("Metric");
BOOST_CHECK_THROW( system.getDimension("L") , std::invalid_argument );
BOOST_CHECK_THROW( system.getDimension("Length") , std::invalid_argument );
}
BOOST_AUTO_TEST_CASE(UnitSystemGetNewOK) {
UnitSystem system("Metric");
system.addDimension("L" , 10 );
system.addDimension("t" , 100);
system.addDimension("Length" , 10 );
system.addDimension("Time" , 100);
BOOST_CHECK_EQUAL( false , system.hasDimension("L*L/t"));
std::shared_ptr<const Dimension> comp = system.getNewDimension("L*L/t");
BOOST_CHECK_EQUAL( true , system.hasDimension("L*L/t"));
BOOST_CHECK_EQUAL( false , system.hasDimension("Length*Length/Time"));
std::shared_ptr<const Dimension> comp = system.getNewDimension("Length*Length/Time");
BOOST_CHECK_EQUAL( true , system.hasDimension("Length*Length/Time"));
BOOST_CHECK_EQUAL(1 , comp->getSIScaling());
}
@@ -87,16 +87,16 @@ BOOST_AUTO_TEST_CASE(UnitSystemGetNewOK) {
BOOST_AUTO_TEST_CASE(UnitSystemAddDimensions) {
UnitSystem system("Metric");
system.addDimension("L" , 1 );
system.addDimension("t" , 86400 );
system.addDimension("Length" , 1 );
system.addDimension("Time" , 86400 );
std::shared_ptr<const Dimension> length = system.getDimension("L");
std::shared_ptr<const Dimension> time = system.getDimension("t");
std::shared_ptr<const Dimension> length = system.getDimension("Length");
std::shared_ptr<const Dimension> time = system.getDimension("Time");
BOOST_CHECK_EQUAL(1 , length->getSIScaling());
BOOST_CHECK_EQUAL(86400 , time->getSIScaling());
system.addDimension("L" , 0.3048);
length = system.getDimension("L");
system.addDimension("Length" , 0.3048);
length = system.getDimension("Length");
BOOST_CHECK_EQUAL(0.3048 , length->getSIScaling());
}
@@ -104,13 +104,13 @@ BOOST_AUTO_TEST_CASE(UnitSystemAddDimensions) {
BOOST_AUTO_TEST_CASE(UnitSystemParseInvalidThrows) {
UnitSystem system("Metric");
BOOST_CHECK_THROW( system.parse("//") , std::invalid_argument);
BOOST_CHECK_THROW( system.parse("L * L / t") , std::invalid_argument);
BOOST_CHECK_THROW( system.parse("Length * Length / Time") , std::invalid_argument);
system.addDimension("L" , 3.00 );
system.addDimension("t" , 9.0 );
system.addDimension("Length" , 3.00 );
system.addDimension("Time" , 9.0 );
std::shared_ptr<const Dimension> volumePerTime = system.parse("L*L*L/t");
BOOST_CHECK_EQUAL("L*L*L/t" , volumePerTime->getName() );
std::shared_ptr<const Dimension> volumePerTime = system.parse("Length*Length*Length/Time");
BOOST_CHECK_EQUAL("Length*Length*Length/Time" , volumePerTime->getName() );
BOOST_CHECK_EQUAL(3.0 , volumePerTime->getSIScaling());
}
@@ -118,11 +118,11 @@ BOOST_AUTO_TEST_CASE(UnitSystemParseInvalidThrows) {
void checkSystemHasRequiredDimensions(std::shared_ptr<const UnitSystem> system) {
BOOST_CHECK( system->hasDimension("1"));
BOOST_CHECK( system->hasDimension("L"));
BOOST_CHECK( system->hasDimension("m"));
BOOST_CHECK( system->hasDimension("t"));
BOOST_CHECK( system->hasDimension("K"));
BOOST_CHECK( system->hasDimension("P"));
BOOST_CHECK( system->hasDimension("Length"));
BOOST_CHECK( system->hasDimension("Mass"));
BOOST_CHECK( system->hasDimension("Time"));
BOOST_CHECK( system->hasDimension("Permeability"));
BOOST_CHECK( system->hasDimension("Pressure"));
}
@@ -131,11 +131,11 @@ BOOST_AUTO_TEST_CASE(CreateMetricSystem) {
std::shared_ptr<UnitSystem> system = std::shared_ptr<UnitSystem>( UnitSystem::newMETRIC() );
checkSystemHasRequiredDimensions( system );
BOOST_CHECK_EQUAL( Metric::Length , system->getDimension("L")->getSIScaling() );
BOOST_CHECK_EQUAL( Metric::Mass , system->getDimension("m")->getSIScaling() );
BOOST_CHECK_EQUAL( Metric::Time , system->getDimension("t")->getSIScaling() );
BOOST_CHECK_EQUAL( Metric::Permeability , system->getDimension("K")->getSIScaling() );
BOOST_CHECK_EQUAL( Metric::Pressure , system->getDimension("P")->getSIScaling() );
BOOST_CHECK_EQUAL( Metric::Length , system->getDimension("Length")->getSIScaling() );
BOOST_CHECK_EQUAL( Metric::Mass , system->getDimension("Mass")->getSIScaling() );
BOOST_CHECK_EQUAL( Metric::Time , system->getDimension("Time")->getSIScaling() );
BOOST_CHECK_EQUAL( Metric::Permeability , system->getDimension("Permeability")->getSIScaling() );
BOOST_CHECK_EQUAL( Metric::Pressure , system->getDimension("Pressure")->getSIScaling() );
}
@@ -144,21 +144,21 @@ BOOST_AUTO_TEST_CASE(CreateFieldSystem) {
std::shared_ptr<UnitSystem> system = std::shared_ptr<UnitSystem>( UnitSystem::newFIELD() );
checkSystemHasRequiredDimensions( system );
BOOST_CHECK_EQUAL( Field::Length , system->getDimension("L")->getSIScaling() );
BOOST_CHECK_EQUAL( Field::Mass , system->getDimension("m")->getSIScaling() );
BOOST_CHECK_EQUAL( Field::Time , system->getDimension("t")->getSIScaling() );
BOOST_CHECK_EQUAL( Field::Permeability , system->getDimension("K")->getSIScaling() );
BOOST_CHECK_EQUAL( Field::Pressure , system->getDimension("P")->getSIScaling() );
BOOST_CHECK_EQUAL( Field::Length , system->getDimension("Length")->getSIScaling() );
BOOST_CHECK_EQUAL( Field::Mass , system->getDimension("Mass")->getSIScaling() );
BOOST_CHECK_EQUAL( Field::Time , system->getDimension("Time")->getSIScaling() );
BOOST_CHECK_EQUAL( Field::Permeability , system->getDimension("Permeability")->getSIScaling() );
BOOST_CHECK_EQUAL( Field::Pressure , system->getDimension("Pressure")->getSIScaling() );
}
BOOST_AUTO_TEST_CASE(DimensionEqual) {
Dimension d1("L" , 1);
Dimension d2("L" , 1);
Dimension d3("t" , 1);
Dimension d4("L" , 2);
Dimension d1("Length" , 1);
Dimension d2("Length" , 1);
Dimension d3("Time" , 1);
Dimension d4("Length" , 2);
BOOST_CHECK_EQUAL( true , d1.equal(d1) );
BOOST_CHECK_EQUAL( true , d1.equal(d2) );

View File

@@ -6,10 +6,10 @@
{"name" : "K2" , "value_type" : "INT" },
{"name" : "STATE" , "value_type" : "STRING" , "default" : "OPEN"},
{"name" : "SAT_TABLE" , "value_type" : "INT" , "default" : 0},
{"name" : "CF" , "value_type" : "FLOAT", "dimension" : "mu*FlowVolume/t*P"},
{"name" : "DIAMETER" , "value_type" : "FLOAT", "dimension" : "L"},
{"name" : "Kh" , "value_type" : "FLOAT", "dimension" : "K" , "default" : -1},
{"name" : "CF" , "value_type" : "FLOAT", "dimension" : "Viscosity*LiquidVolume/Time*Pressure"},
{"name" : "DIAMETER" , "value_type" : "FLOAT", "dimension" : "Length"},
{"name" : "Kh" , "value_type" : "FLOAT", "dimension" : "Permeability" , "default" : -1},
{"name" : "SKIN" , "value_type" : "FLOAT", "dimension" : "1" , "default" : 0},
{"name" : "D_FACTOR" , "value_type" : "FLOAT", "dimension" : "1" },
{"name" : "DIR" , "value_type" : "STRING" , "default" : "Z"},
{"name" : "PR" , "value_type" : "FLOAT", "dimension" : "P" }]}
{"name" : "PR" , "value_type" : "FLOAT", "dimension" : "Pressure" }]}

View File

@@ -1 +1 @@
{"name" : "COORD", "data" : {"value_type" : "FLOAT", "dimension" : "L" }}
{"name" : "COORD", "data" : {"value_type" : "FLOAT", "dimension" : "Length" }}

View File

@@ -1,4 +1,4 @@
{"name" : "DENSITY", "size" : {"keyword":"TABDIMS", "item":"NTPVT" }, "items" :
[{"name": "OIL" , "value_type" : "FLOAT" , "default": 600 , "dimension" : "Rho"},
{"name": "WATER" , "value_type" : "FLOAT" , "default": 999.014 , "dimension" : "Rho"},
{"name": "GAS" , "value_type" : "FLOAT" , "default": 1 , "dimension" : "Rho"}]}
[{"name": "OIL" , "value_type" : "FLOAT" , "default": 600 , "dimension" : "Density"},
{"name": "WATER" , "value_type" : "FLOAT" , "default": 999.014 , "dimension" : "Density"},
{"name": "GAS" , "value_type" : "FLOAT" , "default": 1 , "dimension" : "Density"}]}

View File

@@ -1,3 +1,3 @@
{"name" : "DEPTHZ" , "data" : {"value_type" : "FLOAT" , "dimension" : "L"},
{"name" : "DEPTHZ" , "data" : {"value_type" : "FLOAT" , "dimension" : "Length"},
"comment" : "DEPTHZ is not documented in the Eclipse manual, but found in the SPE1 case"
}

View File

@@ -1 +1 @@
{"name":"DXV", "data" : {"value_type" : "FLOAT", "dimension":"L" }}
{"name":"DXV", "data" : {"value_type" : "FLOAT", "dimension":"Length" }}

View File

@@ -1 +1 @@
{"name":"DYV", "data" : {"value_type" : "FLOAT", "dimension":"L" }}
{"name":"DYV", "data" : {"value_type" : "FLOAT", "dimension":"Length" }}

View File

@@ -1 +1 @@
{"name":"DZV", "data" : {"value_type" : "FLOAT", "dimension":"L" }}
{"name":"DZV", "data" : {"value_type" : "FLOAT", "dimension":"Length" }}

View File

@@ -1,5 +1,5 @@
{"name" : "ENKRVD" , "size" : {"keyword" : "ENDSCALE" , "item" : "NUM_TABLES"},
"items" : [
{"name":"DATA", "value_type":"FLOAT", "size_type" : "ALL" , "dimension" : ["L","1","1","1","1","1","1","1"]}
{"name":"DATA", "value_type":"FLOAT", "size_type" : "ALL" , "dimension" : ["Length","1","1","1","1","1","1","1"]}
]
}

View File

@@ -1,5 +1,5 @@
{"name" : "ENPTVD" , "size" : {"keyword" : "ENDSCALE" , "item" : "NUM_TABLES"},
"items" : [
{"name":"DATA", "value_type":"FLOAT", "size_type" : "ALL" , "dimension" : ["L","1","1","1","1","1","1","1","1"]}
{"name":"DATA", "value_type":"FLOAT", "size_type" : "ALL" , "dimension" : ["Length","1","1","1","1","1","1","1","1"]}
]
}

View File

@@ -1,13 +1,13 @@
{"name" : "EQUIL" , "size" : {"keyword":"EQLDIMS" , "item":"NTEQUL"},
"description": "The EQUIL item is used when equilibrationg the model. The item should consist of one record for each PVT region",
"items" :
[{"name" : "DATUM_DEPTH" , "value_type" : "FLOAT" , "default" : 0.0 , "dimension" : "L"},
{"name" : "DATUM_PRESSURE" , "value_type" : "FLOAT" , "dimension" : "P"} ,
{"name" : "OWC" , "value_type" : "FLOAT" , "default" : 0.0 , "dimension" : "L",
[{"name" : "DATUM_DEPTH" , "value_type" : "FLOAT" , "default" : 0.0 , "dimension" : "Length"},
{"name" : "DATUM_PRESSURE" , "value_type" : "FLOAT" , "dimension" : "Pressure"} ,
{"name" : "OWC" , "value_type" : "FLOAT" , "default" : 0.0 , "dimension" : "Length",
"description" : "The OWC item is depth of the OIL Water contact. This should ..."} ,
{"name" : "PC_OWC" , "value_type" : "FLOAT" , "default" : 0.0 , "dimension" : "P"} ,
{"name" : "GOC" , "value_type" : "FLOAT" , "default" : 0.0 , "dimension" : "L"} ,
{"name" : "PC_GOC" , "value_type" : "FLOAT" , "default" : 0.0 , "dimension" : "P"} ,
{"name" : "PC_OWC" , "value_type" : "FLOAT" , "default" : 0.0 , "dimension" : "Pressure"} ,
{"name" : "GOC" , "value_type" : "FLOAT" , "default" : 0.0 , "dimension" : "Length"} ,
{"name" : "PC_GOC" , "value_type" : "FLOAT" , "default" : 0.0 , "dimension" : "Pressure"} ,
{"name" : "BLACK_OIL_INIT" , "value_type" : "INT" , "default" : 0} ,
{"name" : "BLACK_OIL_INIT_WG" , "value_type" : "INT" , "default" : 0} ,
{"name" : "OIP_INIT" , "value_type" : "INT" , "default" : -5 , "comment":"The default is a state variable"}]}

View File

@@ -2,8 +2,8 @@
{"name" : "GROUP" , "value_type" : "STRING" },
{"name" : "PHASE" , "value_type" : "STRING"},
{"name" : "CONTROL_MODE" , "value_type" : "STRING" , "default" : "NONE"},
{"name" : "SURFACE_TARGET" , "value_type" : "FLOAT" , "default" : 0 , "dimension" : "FlowVolume/t"},
{"name" : "RESV_TARGET" , "value_type" : "FLOAT" , "default" : 0 , "dimension" : "FlowVolume/t"},
{"name" : "SURFACE_TARGET" , "value_type" : "FLOAT" , "default" : 0 , "dimension" : "ContextDependent"},
{"name" : "RESV_TARGET" , "value_type" : "FLOAT" , "default" : 0 , "dimension" : "ContextDependent"},
{"name" : "REINJ_TARGET" , "value_type" : "FLOAT" , "default" : 0, "dimension":"1"},
{"name" : "VOIDAGE_TARGET" , "value_type" : "FLOAT" , "default" : 0, "dimension":"1"},
{"name" : "FREE" , "value_type" : "STRING" , "default" : "YES"},
@@ -11,5 +11,5 @@
{"name" : "GUIDE_DEF" , "value_type" : "STRING"},
{"name" : "REINJECT_GROUP" , "value_type" : "STRING"},
{"name" : "VOIDAGE_GROUP" , "value_type" : "STRING"},
{"name" : "WETGAS_TARGET", "value_type" : "FLOAT" , "dimension" : "FlowVolume/t"}
{"name" : "WETGAS_TARGET", "value_type" : "FLOAT" , "dimension" : "GasVolume/Time"}
]}

View File

@@ -1,10 +1,10 @@
{"name" : "GCONPROD" , "items" : [
{"name" : "GROUP" , "value_type" : "STRING" },
{"name" : "CONTROL_MODE" , "value_type" : "STRING" , "default" : "NONE"},
{"name" : "OIL_TARGET" , "value_type" : "FLOAT" , "dimension" : "FlowVolume/t"},
{"name" : "WATER_TARGET" , "value_type" : "FLOAT" , "dimension" : "FlowVolume/t"},
{"name" : "GAS_TARGET" , "value_type" : "FLOAT" , "dimension" : "FlowVolume/t"},
{"name" : "LIQUID_TARGET" , "value_type" : "FLOAT" , "dimension" : "FlowVolume/t"},
{"name" : "OIL_TARGET" , "value_type" : "FLOAT" , "dimension" : "LiquidVolume/Time"},
{"name" : "WATER_TARGET" , "value_type" : "FLOAT" , "dimension" : "LiquidVolume/Time"},
{"name" : "GAS_TARGET" , "value_type" : "FLOAT" , "dimension" : "GasVolume/Time"},
{"name" : "LIQUID_TARGET" , "value_type" : "FLOAT" , "dimension" : "LiquidVolume/Time"},
{"name" : "EXCEED_PROC" , "value_type" : "STRING" , "default" : "NONE"},
{"name" : "RESPOND_TO_PARENT" , "value_type" : "STRING" , "default" : "YES"},
{"name" : "GUIDE_RATE" , "value_type" : "FLOAT"},

View File

@@ -1,7 +1,7 @@
{"name" : "MAPAXES" , "size" : 1 , "items" : [
{"name" : "X1" , "value_type" : "FLOAT", "dimension" : "L" },
{"name" : "Y1" , "value_type" : "FLOAT", "dimension" : "L" },
{"name" : "X2" , "value_type" : "FLOAT", "dimension" : "L" },
{"name" : "Y2" , "value_type" : "FLOAT", "dimension" : "L" },
{"name" : "X3" , "value_type" : "FLOAT", "dimension" : "L" },
{"name" : "Y3" , "value_type" : "FLOAT", "dimension" : "L" }]}
{"name" : "X1" , "value_type" : "FLOAT", "dimension" : "Length" },
{"name" : "Y1" , "value_type" : "FLOAT", "dimension" : "Length" },
{"name" : "X2" , "value_type" : "FLOAT", "dimension" : "Length" },
{"name" : "Y2" , "value_type" : "FLOAT", "dimension" : "Length" },
{"name" : "X3" , "value_type" : "FLOAT", "dimension" : "Length" },
{"name" : "Y3" , "value_type" : "FLOAT", "dimension" : "Length" }]}

View File

@@ -1 +1 @@
{"name" : "PERMX" , "data" : {"value_type" : "FLOAT" , "dimension" : "K"}}
{"name" : "PERMX" , "data" : {"value_type" : "FLOAT" , "dimension" : "Permeability"}}

View File

@@ -1 +1 @@
{"name" : "PERMXY" , "data" : {"value_type" : "FLOAT" , "dimension" : "K"}}
{"name" : "PERMXY" , "data" : {"value_type" : "FLOAT" , "dimension" : "Permeability"}}

View File

@@ -1 +1 @@
{"name" : "PERMY" , "data" : {"value_type" : "FLOAT" , "default" : 0 , "dimension" : "K"}}
{"name" : "PERMY" , "data" : {"value_type" : "FLOAT" , "default" : 0 , "dimension" : "Permeability"}}

View File

@@ -1 +1 @@
{"name" : "PERMYX" , "data" : {"value_type" : "FLOAT" , "dimension" : "K"}}
{"name" : "PERMYX" , "data" : {"value_type" : "FLOAT" , "dimension" : "Permeability"}}

View File

@@ -1 +1 @@
{"name" : "PERMYZ" , "data" : {"value_type" : "FLOAT" , "dimension" : "K"}}
{"name" : "PERMYZ" , "data" : {"value_type" : "FLOAT" , "dimension" : "Permeability"}}

View File

@@ -1 +1 @@
{"name" : "PERMZ" , "data" : {"value_type" : "FLOAT" , "default" : 0 , "dimension" : "K"}}
{"name" : "PERMZ" , "data" : {"value_type" : "FLOAT" , "default" : 0 , "dimension" : "Permeability"}}

View File

@@ -1 +1 @@
{"name" : "PERMZX" , "data" : {"value_type" : "FLOAT" , "dimension" : "K"}}
{"name" : "PERMZX" , "data" : {"value_type" : "FLOAT" , "dimension" : "Permeability"}}

View File

@@ -1 +1 @@
{"name" : "PRESSURE" , "data" : {"value_type" : "FLOAT", "dimension" : "P"}}
{"name" : "PRESSURE" , "data" : {"value_type" : "FLOAT", "dimension" : "Pressure"}}

View File

@@ -1,4 +1,4 @@
{"name" : "PVDG" , "size" : {"keyword" : "TABDIMS" , "item" : "NTPVT"} , "items" : [
{"name" : "data" , "size_type" : "ALL" , "value_type" : "FLOAT" , "dimension" : ["P","1/Rs","mu"]}]}
{"name" : "data" , "size_type" : "ALL" , "value_type" : "FLOAT" , "dimension" : ["Pressure","OilDissolutionFactor","Viscosity"]}]}

View File

@@ -1,6 +1,6 @@
{"name" : "PVTG" , "num_tables" : {"keyword":"TABDIMS" , "item":"NTPVT"},
"items" : [
{"name":"GAS_PRESSURE", "value_type" : "FLOAT", "dimension":"P" },
{"name":"DATA", "size_type" : "ALL" , "value_type":"FLOAT" , "dimension" : ["1/Rs","1","mu"]}
{"name":"GAS_PRESSURE", "value_type" : "FLOAT", "dimension":"Pressure" },
{"name":"DATA", "size_type" : "ALL" , "value_type":"FLOAT" , "dimension" : ["OilDissolutionFactor","1","Viscosity"]}
]
}

View File

@@ -1,6 +1,6 @@
{"name" : "PVTO" , "num_tables" : {"keyword" : "TABDIMS" , "item" : "NTPVT"},
"items" : [
{"name":"RS", "value_type" : "FLOAT", "dimension":"Rs" },
{"name":"DATA", "value_type":"FLOAT", "size_type" : "ALL" , "dimension" : ["P","1","mu"]}
{"name":"RS", "value_type" : "FLOAT", "dimension":"GasDissolutionFactor" },
{"name":"DATA", "value_type":"FLOAT", "size_type" : "ALL" , "dimension" : ["Pressure","1","Viscosity"]}
]
}

View File

@@ -1,8 +1,8 @@
{"name" : "PVTW" , "size" : {"keyword":"TABDIMS" , "item":"NTPVT"}, "items":
[ {"name":"P_REF", "value_type" : "FLOAT", "dimension":"P" },
[ {"name":"P_REF", "value_type" : "FLOAT", "dimension":"Pressure" },
{"name":"WATER_VOL_FACTOR", "value_type" : "FLOAT", "default" : 1.0,"dimension":"1"},
{"name":"WATER_COMPRESSIBILITY", "value_type" : "FLOAT", "default" : 0.00004, "dimension":"1/P"},
{"name":"WATER_VISCOSITY", "value_type" : "FLOAT", "default" : 0.5, "dimension":"mu", "comment" : "Default is 0.3 in Eclipse300"},
{"name":"WATER_VISCOSIBILITY", "value_type" : "FLOAT", "default" : 0.0, "dimension":"1/P"}
{"name":"WATER_COMPRESSIBILITY", "value_type" : "FLOAT", "default" : 0.00004, "dimension":"1/Pressure"},
{"name":"WATER_VISCOSITY", "value_type" : "FLOAT", "default" : 0.5, "dimension":"Viscosity", "comment" : "Default is 0.3 in Eclipse300"},
{"name":"WATER_VISCOSIBILITY", "value_type" : "FLOAT", "default" : 0.0, "dimension":"1/Pressure"}
]}

View File

@@ -1,3 +1,3 @@
{"name" : "ROCK" , "size" : {"keyword":"TABDIMS" , "item":"NTPVT"}, "items" : [
{"name" : "PREF" , "value_type" : "FLOAT" , "default" : 1.0132 , "dimension" : "P"},
{"name" : "COMPRESSIBILITY" , "value_type" : "FLOAT" , "default" : 0 , "dimension" : "1/P"}]}
{"name" : "PREF" , "value_type" : "FLOAT" , "default" : 1.0132 , "dimension" : "Pressure"},
{"name" : "COMPRESSIBILITY" , "value_type" : "FLOAT" , "default" : 0 , "dimension" : "1/Pressure"}]}

View File

@@ -1 +1 @@
{"name" : "RS" , "data" : {"value_type" : "FLOAT", "dimension" : "Rs"}}
{"name" : "RS" , "data" : {"value_type" : "FLOAT", "dimension" : "GasDissolutionFactor"}}

View File

@@ -2,6 +2,6 @@
"items" : [{"name" : "table" ,
"value_type" : "FLOAT" ,
"size_type" : "ALL",
"dimension" : ["L" , "Rs"]}]}
"dimension" : ["Length" , "GasDissolutionFactor"]}]}

View File

@@ -1,5 +1,5 @@
{"name" : "SGOF" , "size" : {"keyword" : "TABDIMS" , "item" : "NTSFUN"},
"items" : [
{"name":"table", "value_type":"FLOAT", "size_type" : "ALL", "dimension" : ["1","1","1","P"]}
{"name":"table", "value_type":"FLOAT", "size_type" : "ALL", "dimension" : ["1","1","1","Pressure"]}
]
}

View File

@@ -1,5 +1,5 @@
{"name" : "SWOF" , "size" : {"keyword" : "TABDIMS" , "item" : "NTSFUN"},
"items" : [
{"name":"DATA", "value_type":"FLOAT", "size_type" : "ALL" , "dimension" : ["1","1","1","P"]}
{"name":"DATA", "value_type":"FLOAT", "size_type" : "ALL" , "dimension" : ["1","1","1","Pressure"]}
]
}

View File

@@ -1,2 +1,2 @@
{"name" : "TVDP*" , "size" : {"keyword":"EQLDIMS" , "item":"NTTRVD"}, "items" :
[ {"name" : "table" , "value_type" : "FLOAT" , "size_type" : "ALL" , "dimension" : ["L" , "1/FlowVolume"]}]}
[ {"name" : "table" , "value_type" : "FLOAT" , "size_type" : "ALL" , "dimension" : ["Length" , "ContextDependent"]}]}

View File

@@ -2,11 +2,11 @@
[{"name" : "WELL" , "value_type" : "STRING"},
{"name" : "STATUS" , "value_type" : "STRING" , "default" : "OPEN"},
{"name" : "CMODE" , "value_type" : "STRING"},
{"name" : "ORAT" , "value_type" : "FLOAT", "default" : 0.0, "dimension" : "FlowVolume/t"},
{"name" : "WRAT" , "value_type" : "FLOAT" , "default" : 0.0, "dimension" : "FlowVolume/t"},
{"name" : "GRAT" , "value_type" : "FLOAT" , "default" : 0.0, "dimension" : "FlowVolume/t"},
{"name" : "ORAT" , "value_type" : "FLOAT", "default" : 0.0, "dimension" : "LiquidVolume/Time"},
{"name" : "WRAT" , "value_type" : "FLOAT" , "default" : 0.0, "dimension" : "LiquidVolume/Time"},
{"name" : "GRAT" , "value_type" : "FLOAT" , "default" : 0.0, "dimension" : "GasVolume/Time"},
{"name" : "VFPTable" , "value_type" : "INT" , "default" : 0.0 , "comment":"The default is a state variable"},
{"name" : "Lift" , "value_type" : "FLOAT" , "default" : 0.0 , "comment":"The default is a state variable"},
{"name" : "THP" , "value_type" : "FLOAT" , "default" : 0.0 , "dimension" : "P"},
{"name" : "BHP" , "value_type" : "FLOAT" , "default" : 0.0 ,"dimension" : "P"},
{"name" : "NGLRAT" , "value_type" : "FLOAT" , "default" : 0.0 ,"dimension" : "FlowVolume/t"}]}
{"name" : "THP" , "value_type" : "FLOAT" , "default" : 0.0 , "dimension" : "Pressure"},
{"name" : "BHP" , "value_type" : "FLOAT" , "default" : 0.0 ,"dimension" : "Pressure"},
{"name" : "NGLRAT" , "value_type" : "FLOAT" , "default" : 0.0 ,"dimension" : "LiquidVolume/Time"}]}

View File

@@ -3,10 +3,10 @@
{"name" : "TYPE" , "value_type" : "STRING" },
{"name" : "STATUS" , "value_type" : "STRING" , "default" : "OPEN"},
{"name" : "CMODE" , "value_type" : "STRING" },
{"name" : "RATE" , "value_type" : "FLOAT" , "dimension" : "FlowVolume/t"},
{"name" : "RESV" , "value_type" : "FLOAT" , "dimension" : "FlowVolume/t"},
{"name" : "BHP" , "value_type" : "FLOAT" , "dimension" : "P" , "default" : 6891},
{"name" : "THP" , "value_type" : "FLOAT" , "dimension" : "P"},
{"name" : "RATE" , "value_type" : "FLOAT" , "dimension" : "ContextDependent"},
{"name" : "RESV" , "value_type" : "FLOAT" , "dimension" : "ContextDependent"},
{"name" : "BHP" , "value_type" : "FLOAT" , "dimension" : "Pressure" , "default" : 6891},
{"name" : "THP" , "value_type" : "FLOAT" , "dimension" : "Pressure"},
{"name" : "VFP_TABLE" , "value_type" : "INT" , "default" : 0},
{"name" : "VAPOIL_C" , "value_type" : "FLOAT" , "default" : 0},
{"name" : "GAS_STEAM_RATIO" , "value_type" : "FLOAT" , "default" : 0},

View File

@@ -2,13 +2,13 @@
{"name" : "WELL" , "value_type" : "STRING" },
{"name" : "TYPE" , "value_type" : "STRING" },
{"name" : "STATUS" , "value_type" : "STRING" , "default" : "OPEN"},
{"name" : "RATE" , "value_type" : "FLOAT" , "dimension" : "FlowVolume/t"},
{"name" : "BHP" , "value_type" : "FLOAT" , "dimension" : "P"},
{"name" : "THP" , "value_type" : "FLOAT" , "dimension" : "P"},
{"name" : "RATE" , "value_type" : "FLOAT" , "dimension" : "ContextDependent"},
{"name" : "BHP" , "value_type" : "FLOAT" , "dimension" : "Pressure"},
{"name" : "THP" , "value_type" : "FLOAT" , "dimension" : "Pressure"},
{"name" : "VFP_TABLE" , "value_type" : "INT" , "default" : 0},
{"name" : "VAPOIL_C" , "value_type" : "FLOAT" , "default" : 0},
{"name" : "SURFACE_OIL_FRACTION" , "value_type" : "FLOAT" , "default" : 0},
{"name" : "SURFACE_WATER_FRACTION" , "value_type" : "FLOAT" , "default" : 0},
{"name" : "SURFACE_GAS_FRACTION" , "value_type" : "FLOAT" , "default" : 0},
{"name" : "CMODE" , "value_type" : "STRING" }
]}
]}

View File

@@ -2,13 +2,13 @@
[{"name" : "WELL" , "value_type" : "STRING"},
{"name" : "STATUS" , "value_type" : "STRING" , "default" : "OPEN"},
{"name" : "CMODE" , "value_type" : "STRING"},
{"name" : "ORAT" , "value_type" : "FLOAT", "default" : 0.0 , "dimension" : "FlowVolume/t"},
{"name" : "WRAT" , "value_type" : "FLOAT" , "default" : 0.0 , "dimension" : "FlowVolume/t"},
{"name" : "GRAT" , "value_type" : "FLOAT" , "default" : 0.0 , "dimension" : "FlowVolume/t"},
{"name" : "LRAT" , "value_type" : "FLOAT" , "default" : 0.0 , "dimension" : "FlowVolume/t"},
{"name" : "RESV" , "value_type" : "FLOAT" , "default" : 0.0 , "dimension" : "FlowVolume/t"},
{"name" : "BHP" , "value_type" : "FLOAT" , "default" : 0.0 , "dimension" : "P"},
{"name" : "THP" , "value_type" : "FLOAT" , "default" : 0.0 , "dimension" : "P"},
{"name" : "ORAT" , "value_type" : "FLOAT", "default" : 0.0 , "dimension" : "LiquidVolume/Time"},
{"name" : "WRAT" , "value_type" : "FLOAT" , "default" : 0.0 , "dimension" : "LiquidVolume/Time"},
{"name" : "GRAT" , "value_type" : "FLOAT" , "default" : 0.0 , "dimension" : "GasVolume/Time"},
{"name" : "LRAT" , "value_type" : "FLOAT" , "default" : 0.0 , "dimension" : "LiquidVolume/Time"},
{"name" : "RESV" , "value_type" : "FLOAT" , "default" : 0.0 , "dimension" : "LiquidVolume/Time"},
{"name" : "BHP" , "value_type" : "FLOAT" , "default" : 0.0 , "dimension" : "Pressure"},
{"name" : "THP" , "value_type" : "FLOAT" , "default" : 0.0 , "dimension" : "Pressure"},
{"name" : "VFPTable" , "value_type" : "INT" , "default" : 0.0 , "comment":"The default is a state variable"},
{"name" : "ALQ" , "value_type" : "FLOAT" , "default" : 0.0 , "comment":"The default is a state variable"},
{"name" : "E300_ITEM13" , "value_type" : "FLOAT"},

View File

@@ -3,9 +3,9 @@
{"name" : "GROUP" , "value_type" : "STRING" },
{"name" : "HEAD_I" , "value_type" : "INT"},
{"name" : "HEAD_J" , "value_type" : "INT"},
{"name" : "REF_DEPTH" , "value_type" : "FLOAT", "dimension" : "L"},
{"name" : "REF_DEPTH" , "value_type" : "FLOAT", "dimension" : "Length"},
{"name" : "PHASE" , "value_type" : "STRING"},
{"name" : "D_RADIUS" , "value_type" : "FLOAT" , "default" : 0, "dimension" : "L"},
{"name" : "D_RADIUS" , "value_type" : "FLOAT" , "default" : 0, "dimension" : "Length"},
{"name" : "INFLOW_EQ" , "value_type" : "STRING" , "default" : "STD"},
{"name" : "AUTO_SHUTIN" , "value_type" : "STRING" , "default" : "SHUT"},
{"name" : "CROSSFLOW" , "value_type" : "STRING" , "default" : "YES"},

View File

@@ -1 +1 @@
{"name" : "ZCORN", "data" : {"value_type" : "FLOAT", "dimension" : "L" }}
{"name" : "ZCORN", "data" : {"value_type" : "FLOAT", "dimension" : "Length" }}