From 89f1c04dd924c07519ef6519a636c10a47209571 Mon Sep 17 00:00:00 2001 From: Andreas Lauser Date: Thu, 23 Nov 2017 13:18:31 +0100 Subject: [PATCH 01/11] fix the JSON definition of the STCOND keyword --- lib/eclipse/share/keywords/001_Eclipse300/S/STCOND | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/eclipse/share/keywords/001_Eclipse300/S/STCOND b/lib/eclipse/share/keywords/001_Eclipse300/S/STCOND index 31a04b19e..702f034f4 100644 --- a/lib/eclipse/share/keywords/001_Eclipse300/S/STCOND +++ b/lib/eclipse/share/keywords/001_Eclipse300/S/STCOND @@ -3,6 +3,6 @@ "sections": ["PROPS"], "size": 1, "items": [ - {"name": "TEMPERATURE", "value_type": "DOUBLE", "dimension": "Temperature", "default": 60}, - {"name": "PRESSURE", "value_type": "DOUBLE", "dimension": "Pressure", "default": 14.6959} + {"name": "TEMPERATURE", "value_type": "DOUBLE", "dimension": "Temperature", "default": 15.56}, + {"name": "PRESSURE", "value_type": "DOUBLE", "dimension": "Pressure", "default": 1.01325} ]} From df45093bf2988ddaceba3fc55b2218afd706f2fc Mon Sep 17 00:00:00 2001 From: Andreas Lauser Date: Thu, 23 Nov 2017 13:18:32 +0100 Subject: [PATCH 02/11] fix the value returned by TableManager.rtemp() because everything in opm-parser uses SI units this needs to be Kelvin, not degrees Celsius! --- lib/eclipse/EclipseState/Tables/TableManager.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/eclipse/EclipseState/Tables/TableManager.cpp b/lib/eclipse/EclipseState/Tables/TableManager.cpp index 0527806bc..df4af442f 100644 --- a/lib/eclipse/EclipseState/Tables/TableManager.cpp +++ b/lib/eclipse/EclipseState/Tables/TableManager.cpp @@ -73,6 +73,8 @@ #include #include +#include + namespace Opm { TableManager::TableManager( const Deck& deck ) @@ -81,9 +83,12 @@ namespace Opm { hasImptvd (deck.hasKeyword("IMPTVD")), hasEnptvd (deck.hasKeyword("ENPTVD")), hasEqlnum (deck.hasKeyword("EQLNUM")), - m_jfunc( deck ), - m_rtemp( ParserKeywords::RTEMP::TEMP::defaultValue ) + m_jfunc( deck ) { + // determine the default resevoir temperature in Kelvin + m_rtemp = ParserKeywords::RTEMP::TEMP::defaultValue; + m_rtemp += Metric::TemperatureOffset; // <- default values always use METRIC as the unit system! + initDims( deck ); initSimpleTables( deck ); initFullTables(deck, "PVTG", m_pvtgTables); From 006b639d8c6906720f182abaf08aead6f2dcb42d Mon Sep 17 00:00:00 2001 From: Andreas Lauser Date: Thu, 23 Nov 2017 13:18:32 +0100 Subject: [PATCH 03/11] WATDENT: fix the defaults the old default values seemed to be the ones for imperial units, not the metric ones. --- lib/eclipse/share/keywords/001_Eclipse300/W/WATDENT | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/eclipse/share/keywords/001_Eclipse300/W/WATDENT b/lib/eclipse/share/keywords/001_Eclipse300/W/WATDENT index d8d3bfa1e..5eba647e9 100644 --- a/lib/eclipse/share/keywords/001_Eclipse300/W/WATDENT +++ b/lib/eclipse/share/keywords/001_Eclipse300/W/WATDENT @@ -10,8 +10,8 @@ "comment": "item, the RM is _very_ inconsistent. (it says that the default for the second item is 1.67/degR in", "comment": "FIELD units which is the same the 3e-4/K for METRIC but four orders of magnitude off!)", "items" : [ - {"name" : "REFERENCE_TEMPERATURE" , "value_type" : "DOUBLE", "dimension" : "AbsoluteTemperature", "default": 527.67 }, - {"name" : "EXPANSION_COEFF_LINEAR" , "value_type" : "DOUBLE", "dimension" : "1/AbsoluteTemperature", "default": 1.67e-4 }, - {"name" : "EXPANSION_COEFF_QUADRATIC" , "value_type" : "DOUBLE", "dimension" : "1/AbsoluteTemperature*AbsoluteTemperature", "default": 9.26e-7 } + {"name" : "REFERENCE_TEMPERATURE" , "value_type" : "DOUBLE", "dimension" : "AbsoluteTemperature", "default": 293.15 }, + {"name" : "EXPANSION_COEFF_LINEAR" , "value_type" : "DOUBLE", "dimension" : "1/AbsoluteTemperature", "default": 3.0e-4 }, + {"name" : "EXPANSION_COEFF_QUADRATIC" , "value_type" : "DOUBLE", "dimension" : "1/AbsoluteTemperature*AbsoluteTemperature", "default": 3.0e-6 } ] } From e5fbf5acd01352166992a6eac231266f7aa7e4e7 Mon Sep 17 00:00:00 2001 From: Andreas Lauser Date: Thu, 23 Nov 2017 13:18:32 +0100 Subject: [PATCH 04/11] add a GASDENT keyword this keyword is OPM-specific and specifies the thermal expansion of gas. it is completely analogous to WATDENT. --- lib/eclipse/share/keywords/900_OPM/G/GASDENT | 14 ++++++++++++++ lib/eclipse/share/keywords/keyword_list.cmake | 1 + 2 files changed, 15 insertions(+) create mode 100644 lib/eclipse/share/keywords/900_OPM/G/GASDENT diff --git a/lib/eclipse/share/keywords/900_OPM/G/GASDENT b/lib/eclipse/share/keywords/900_OPM/G/GASDENT new file mode 100644 index 000000000..5f43777c9 --- /dev/null +++ b/lib/eclipse/share/keywords/900_OPM/G/GASDENT @@ -0,0 +1,14 @@ +{ + "name": "GASDENT", + "sections": ["PROPS"], + "size" : { + "keyword": "TABDIMS", + "item" : "NTPVT" + }, + + "items" : [ + {"name" : "REFERENCE_TEMPERATURE" , "value_type" : "DOUBLE", "dimension" : "AbsoluteTemperature", "default": 293.15 }, + {"name" : "EXPANSION_COEFF_LINEAR" , "value_type" : "DOUBLE", "dimension" : "1/AbsoluteTemperature", "default": 0.0 }, + {"name" : "EXPANSION_COEFF_QUADRATIC" , "value_type" : "DOUBLE", "dimension" : "1/AbsoluteTemperature*AbsoluteTemperature", "default": 0.0 } + ] +} diff --git a/lib/eclipse/share/keywords/keyword_list.cmake b/lib/eclipse/share/keywords/keyword_list.cmake index 2b15af054..303adc34d 100644 --- a/lib/eclipse/share/keywords/keyword_list.cmake +++ b/lib/eclipse/share/keywords/keyword_list.cmake @@ -413,6 +413,7 @@ set( keywords 900_OPM/G/GCOMPIDX 900_OPM/G/GRUPRIG + 900_OPM/G/GASDENT 900_OPM/M/MINPVFIL 900_OPM/O/OCOMPIDX 900_OPM/R/RHO From ae1725272c2f3deeb3cc38b8a7b12a0d5426384a Mon Sep 17 00:00:00 2001 From: Andreas Lauser Date: Thu, 23 Nov 2017 13:18:32 +0100 Subject: [PATCH 05/11] add a OILDENT keyword just like GASDENT, this keyword is OPM specific but it is exactly analogous to WATDENT. --- lib/eclipse/share/keywords/900_OPM/O/OILDENT | 14 ++++++++++++++ lib/eclipse/share/keywords/keyword_list.cmake | 1 + 2 files changed, 15 insertions(+) create mode 100644 lib/eclipse/share/keywords/900_OPM/O/OILDENT diff --git a/lib/eclipse/share/keywords/900_OPM/O/OILDENT b/lib/eclipse/share/keywords/900_OPM/O/OILDENT new file mode 100644 index 000000000..f0b35ef17 --- /dev/null +++ b/lib/eclipse/share/keywords/900_OPM/O/OILDENT @@ -0,0 +1,14 @@ +{ + "name": "OILDENT", + "sections": ["PROPS"], + "size" : { + "keyword": "TABDIMS", + "item" : "NTPVT" + }, + + "items" : [ + {"name" : "REFERENCE_TEMPERATURE" , "value_type" : "DOUBLE", "dimension" : "AbsoluteTemperature", "default": 293.15 }, + {"name" : "EXPANSION_COEFF_LINEAR" , "value_type" : "DOUBLE", "dimension" : "1/AbsoluteTemperature", "default": 0.0 }, + {"name" : "EXPANSION_COEFF_QUADRATIC" , "value_type" : "DOUBLE", "dimension" : "1/AbsoluteTemperature*AbsoluteTemperature", "default": 0.0 } + ] +} diff --git a/lib/eclipse/share/keywords/keyword_list.cmake b/lib/eclipse/share/keywords/keyword_list.cmake index 303adc34d..4c18277e0 100644 --- a/lib/eclipse/share/keywords/keyword_list.cmake +++ b/lib/eclipse/share/keywords/keyword_list.cmake @@ -416,5 +416,6 @@ set( keywords 900_OPM/G/GASDENT 900_OPM/M/MINPVFIL 900_OPM/O/OCOMPIDX + 900_OPM/O/OILDENT 900_OPM/R/RHO 900_OPM/T/TLPMIXPA) From 4d79dbeb0ec41f6a24a590b3d8e9c8f765342c88 Mon Sep 17 00:00:00 2001 From: Andreas Lauser Date: Thu, 23 Nov 2017 13:18:32 +0100 Subject: [PATCH 06/11] units: add energy an alternative is to add heat capacity, but this is more cumbersome because some heat capacities are volumetric while others are mass specific. (note that the "single division" shenengian of the unit system's expression parser needs to be considered for most energy related keywords.) --- lib/eclipse/Units/UnitSystem.cpp | 16 ++++++++++++++++ .../include/opm/parser/eclipse/Units/Units.hpp | 10 ++++++++++ 2 files changed, 26 insertions(+) diff --git a/lib/eclipse/Units/UnitSystem.cpp b/lib/eclipse/Units/UnitSystem.cpp index 2d7ee872d..4ae2f997d 100644 --- a/lib/eclipse/Units/UnitSystem.cpp +++ b/lib/eclipse/Units/UnitSystem.cpp @@ -66,6 +66,7 @@ namespace { 1, /* gas inverse formation volume factor */ 1, /* oil inverse formation volume factor */ 1, /* water inverse formation volume factor */ + 1 / Metric::Energy }; static const double from_metric[] = { @@ -95,6 +96,7 @@ namespace { 1, /* gas inverse formation volume factor */ 1, /* oil inverse formation volume factor */ 1, /* water inverse formation volume factor */ + Metric::Energy }; static constexpr const char* metric_names[] = { @@ -124,6 +126,7 @@ namespace { "SM3/RM3", /* gas inverse formation volume factor */ "SM3/RM3", /* oil inverse formation volume factor */ "SM3/RM3", /* water inverse formation volume factor */ + "KJ", /* energy */ }; static const double to_field[] = { @@ -153,6 +156,7 @@ namespace { 1 / (Field::GasSurfaceVolume / Field::ReservoirVolume), /* gas inverse formation volume factor */ 1, /* oil inverse formation volume factor */ 1, /* water inverse formation volume factor */ + 1 / Field::Energy }; static const double from_field[] = { @@ -182,6 +186,7 @@ namespace { Field::GasSurfaceVolume / Field::ReservoirVolume, /* gas inverse formation volume factor */ 1, /* oil inverse formation volume factor */ 1, /* water inverse formation volume factor */ + Field::Energy }; static constexpr const char* field_names[] = { @@ -211,6 +216,7 @@ namespace { "MSCF/RB", /* gas inverse formation volume factor */ "STB/RB", /* oil inverse formation volume factor */ "STB/RB", /* water inverse formation volume factor */ + "BTU", /* energy */ }; static const double to_lab[] = { @@ -240,6 +246,7 @@ namespace { 1, /* gas inverse formation volume factor */ 1, /* oil inverse formation volume factor */ 1, /* water inverse formation volume factor */ + 1 / Lab::Energy }; static const double from_lab[] = { @@ -269,6 +276,7 @@ namespace { 1, /* gas inverse formation volume factor */ 1, /* oil inverse formation volume factor */ 1, /* water inverse formation volume factor */ + Lab::Energy }; static constexpr const char* lab_names[] = { @@ -298,6 +306,7 @@ namespace { "SCC/RCC", /* gas formation volume factor */ "SCC/RCC", /* oil inverse formation volume factor */ "SCC/RCC", /* water inverse formation volume factor */ + "J", /* energy */ }; static const double to_pvt_m[] = { @@ -327,6 +336,7 @@ namespace { 1 / (PVT_M::GasSurfaceVolume / PVT_M::ReservoirVolume), /* 1/Bg */ 1 / (PVT_M::LiquidSurfaceVolume / PVT_M::ReservoirVolume), /* 1/Bo */ 1 / (PVT_M::LiquidSurfaceVolume / PVT_M::ReservoirVolume), /* 1/Bw */ + 1 / PVT_M::Energy }; static const double from_pvt_m[] = { @@ -356,6 +366,7 @@ namespace { PVT_M::GasSurfaceVolume / PVT_M::ReservoirVolume, /* 1/Bg */ PVT_M::LiquidSurfaceVolume / PVT_M::ReservoirVolume, /* 1/Bo */ PVT_M::LiquidSurfaceVolume / PVT_M::ReservoirVolume, /* 1/Bw */ + PVT_M::Energy }; static constexpr const char* pvt_m_names[] = { @@ -385,6 +396,7 @@ namespace { "SM3/RM3", /* gas inverse formation volume factor */ "SM3/RM3", /* oil inverse formation volume factor */ "SM3/RM3", /* water inverse formation volume factor */ + "KJ" /* energy */ }; } @@ -601,6 +613,7 @@ namespace { system.addDimension("Viscosity" , Metric::Viscosity); system.addDimension("Timestep" , Metric::Timestep); system.addDimension("SurfaceTension" , Metric::SurfaceTension); + system.addDimension("Energy", Metric::Energy); system.addDimension("ContextDependent", std::numeric_limits::quiet_NaN()); return system; } @@ -630,6 +643,7 @@ namespace { system.addDimension("Viscosity", Field::Viscosity); system.addDimension("Timestep", Field::Timestep); system.addDimension("SurfaceTension" , Field::SurfaceTension); + system.addDimension("Energy", Field::Energy); system.addDimension("ContextDependent", std::numeric_limits::quiet_NaN()); return system; } @@ -659,6 +673,7 @@ namespace { system.addDimension("Viscosity", Lab::Viscosity); system.addDimension("Timestep", Lab::Timestep); system.addDimension("SurfaceTension" , Lab::SurfaceTension); + system.addDimension("Energy", Lab::Energy); system.addDimension("ContextDependent", std::numeric_limits::quiet_NaN()); return system; } @@ -687,6 +702,7 @@ namespace { system.addDimension("Viscosity" , PVT_M::Viscosity); system.addDimension("Timestep" , PVT_M::Timestep); system.addDimension("SurfaceTension" , PVT_M::SurfaceTension); + system.addDimension("Energy", PVT_M::Energy); system.addDimension("ContextDependent", std::numeric_limits::quiet_NaN()); return system; } diff --git a/lib/eclipse/include/opm/parser/eclipse/Units/Units.hpp b/lib/eclipse/include/opm/parser/eclipse/Units/Units.hpp index a097a1935..e4f27d581 100644 --- a/lib/eclipse/include/opm/parser/eclipse/Units/Units.hpp +++ b/lib/eclipse/include/opm/parser/eclipse/Units/Units.hpp @@ -123,6 +123,12 @@ namespace Opm { constexpr const double pound = 0.45359237 * kilogram; /// @} + /// \name Energy + /// @{ + constexpr const double joule = 1; + constexpr const double btu = 1054.3503*joule; // "british thermal units" + /// @} + // -------------------------------------------------------------- // Standardised constants // -------------------------------------------------------------- @@ -267,6 +273,7 @@ namespace Opm { constexpr const double Viscosity = centi*Poise; constexpr const double Timestep = day; constexpr const double SurfaceTension = dyne/(centi*meter); + constexpr const double Energy = kilo*joule; } @@ -293,6 +300,7 @@ namespace Opm { constexpr const double Viscosity = centi*Poise; constexpr const double Timestep = day; constexpr const double SurfaceTension = dyne/(centi*meter); + constexpr const double Energy = btu; } @@ -319,6 +327,7 @@ namespace Opm { constexpr const double Viscosity = centi*Poise; constexpr const double Timestep = hour; constexpr const double SurfaceTension = dyne/(centi*meter); + constexpr const double Energy = joule; } @@ -345,6 +354,7 @@ namespace Opm { constexpr const double Viscosity = centi*Poise; constexpr const double Timestep = day; constexpr const double SurfaceTension = dyne/(centi*meter); + constexpr const double Energy = kilo*joule; } } From 709d2c839fa5a365be8aa562a3f65b5c37c5a98a Mon Sep 17 00:00:00 2001 From: Andreas Lauser Date: Thu, 23 Nov 2017 13:18:32 +0100 Subject: [PATCH 07/11] add some missing thermal keywords and grid properties --- lib/eclipse/EclipseState/Eclipse3DProperties.cpp | 9 ++++++++- lib/eclipse/share/keywords/000_Eclipse100/B/BLACKOIL | 1 + lib/eclipse/share/keywords/000_Eclipse100/T/THCONR | 9 ++++++++- lib/eclipse/share/keywords/001_Eclipse300/D/DEADOIL | 1 + lib/eclipse/share/keywords/001_Eclipse300/H/HEATCR | 8 ++++++++ lib/eclipse/share/keywords/001_Eclipse300/H/HEATCRT | 8 ++++++++ lib/eclipse/share/keywords/001_Eclipse300/L/LIVEOIL | 1 + lib/eclipse/share/keywords/001_Eclipse300/T/THCONSF | 8 ++++++++ lib/eclipse/share/keywords/001_Eclipse300/W/WINJTEMP | 11 +++++++++++ lib/eclipse/share/keywords/keyword_list.cmake | 7 +++++++ 10 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 lib/eclipse/share/keywords/000_Eclipse100/B/BLACKOIL create mode 100644 lib/eclipse/share/keywords/001_Eclipse300/D/DEADOIL create mode 100644 lib/eclipse/share/keywords/001_Eclipse300/H/HEATCR create mode 100644 lib/eclipse/share/keywords/001_Eclipse300/H/HEATCRT create mode 100644 lib/eclipse/share/keywords/001_Eclipse300/L/LIVEOIL create mode 100644 lib/eclipse/share/keywords/001_Eclipse300/T/THCONSF create mode 100644 lib/eclipse/share/keywords/001_Eclipse300/W/WINJTEMP diff --git a/lib/eclipse/EclipseState/Eclipse3DProperties.cpp b/lib/eclipse/EclipseState/Eclipse3DProperties.cpp index 54b5e5e48..0e73a4858 100644 --- a/lib/eclipse/EclipseState/Eclipse3DProperties.cpp +++ b/lib/eclipse/EclipseState/Eclipse3DProperties.cpp @@ -387,6 +387,10 @@ namespace Opm { // pore volume multipliers supportedDoubleKeywords.emplace_back( "MULTPV", 1.0, "1" ); + /* rock heat capacity, E300 only */ + supportedDoubleKeywords.emplace_back("HEATCR", nan, distributeTopLayer, "Energy/AbsoluteTemperature*Length*Length*Length" ); + supportedDoubleKeywords.emplace_back("HEATCRT", 0.0, distributeTopLayer, "Energy/AbsoluteTemperature*AbsoluteTemperature*Length*Length*Length" ); + // the permeability keywords for( const auto& kw : { "PERMR", "PERMTHT", "PERMX", "PERMY", "PERMZ", } ) supportedDoubleKeywords.emplace_back( kw, nan, distributeTopLayer, "Permeability" ); @@ -415,7 +419,10 @@ namespace Opm { // initialisation supportedDoubleKeywords.emplace_back( "SWATINIT", 0.0, "1"); - supportedDoubleKeywords.emplace_back( "THCONR", 0.0, "1"); + supportedDoubleKeywords.emplace_back( "THCONR", 0.0, "Energy/AbsoluteTemperature*Length*Time"); + + // saturation dependence of thermal conductivity, E300 only + supportedDoubleKeywords.emplace_back( "THCONSF", 0.0, "1"); return supportedDoubleKeywords; } diff --git a/lib/eclipse/share/keywords/000_Eclipse100/B/BLACKOIL b/lib/eclipse/share/keywords/000_Eclipse100/B/BLACKOIL new file mode 100644 index 000000000..3bd9a9927 --- /dev/null +++ b/lib/eclipse/share/keywords/000_Eclipse100/B/BLACKOIL @@ -0,0 +1 @@ +{"name" : "BLACKOIL", "sections" : ["RUNSPEC"]} diff --git a/lib/eclipse/share/keywords/000_Eclipse100/T/THCONR b/lib/eclipse/share/keywords/000_Eclipse100/T/THCONR index 398946003..a45618aa4 100644 --- a/lib/eclipse/share/keywords/000_Eclipse100/T/THCONR +++ b/lib/eclipse/share/keywords/000_Eclipse100/T/THCONR @@ -1 +1,8 @@ -{"name" : "THCONR" , "sections" : ["GRID"], "data" : {"value_type" : "DOUBLE"}} \ No newline at end of file +{ + "name": "THCONR", + "sections": ["GRID"], + "data": { + "value_type": "DOUBLE", + "dimension": "Energy/AbsoluteTemperature*Length*Time" + } +} diff --git a/lib/eclipse/share/keywords/001_Eclipse300/D/DEADOIL b/lib/eclipse/share/keywords/001_Eclipse300/D/DEADOIL new file mode 100644 index 000000000..c4b5b2d87 --- /dev/null +++ b/lib/eclipse/share/keywords/001_Eclipse300/D/DEADOIL @@ -0,0 +1 @@ +{"name" : "DEADOIL", "sections" : ["RUNSPEC"]} diff --git a/lib/eclipse/share/keywords/001_Eclipse300/H/HEATCR b/lib/eclipse/share/keywords/001_Eclipse300/H/HEATCR new file mode 100644 index 000000000..4e9007048 --- /dev/null +++ b/lib/eclipse/share/keywords/001_Eclipse300/H/HEATCR @@ -0,0 +1,8 @@ +{ + "name" : "HEATCR", + "sections" : ["GRID"], + "data" : { + "value_type": "DOUBLE", + "dimension" : "Energy/Length*Length*Length*AbsoluteTemperature" + } +} diff --git a/lib/eclipse/share/keywords/001_Eclipse300/H/HEATCRT b/lib/eclipse/share/keywords/001_Eclipse300/H/HEATCRT new file mode 100644 index 000000000..72bf8ea1f --- /dev/null +++ b/lib/eclipse/share/keywords/001_Eclipse300/H/HEATCRT @@ -0,0 +1,8 @@ +{ + "name" : "HEATCRT", + "sections" : ["GRID"], + "data" : { + "value_type": "DOUBLE", + "dimension" : "Energy/Length*Length*Length*AbsoluteTemperature*AbsoluteTemperature" + } +} diff --git a/lib/eclipse/share/keywords/001_Eclipse300/L/LIVEOIL b/lib/eclipse/share/keywords/001_Eclipse300/L/LIVEOIL new file mode 100644 index 000000000..f87f84725 --- /dev/null +++ b/lib/eclipse/share/keywords/001_Eclipse300/L/LIVEOIL @@ -0,0 +1 @@ +{"name" : "LIVEOIL", "sections" : ["RUNSPEC"]} diff --git a/lib/eclipse/share/keywords/001_Eclipse300/T/THCONSF b/lib/eclipse/share/keywords/001_Eclipse300/T/THCONSF new file mode 100644 index 000000000..fb8ee6c5f --- /dev/null +++ b/lib/eclipse/share/keywords/001_Eclipse300/T/THCONSF @@ -0,0 +1,8 @@ +{ + "name": "THCONSF", + "sections": ["GRID"], + "data": { + "value_type": "DOUBLE", + "dimension": "1" + } +} diff --git a/lib/eclipse/share/keywords/001_Eclipse300/W/WINJTEMP b/lib/eclipse/share/keywords/001_Eclipse300/W/WINJTEMP new file mode 100644 index 000000000..31b9360cf --- /dev/null +++ b/lib/eclipse/share/keywords/001_Eclipse300/W/WINJTEMP @@ -0,0 +1,11 @@ +{ + "name": "WINJTEMP", + "sections": ["SCHEDULE"], + "items": [ + {"name": "WELL", "value_type": "STRING"}, + {"name": "STEAM_QUALITY", "value_type": "DOUBLE", "default": 1.0}, + {"name": "TEMPERATURE", "value_type": "DOUBLE", "dimension": "Temperature", "default": 15.56 }, + {"name": "PRESSURE", "value_type": "DOUBLE", "dimension": "Pressure", "default": 0.0 }, + {"name": "ENTHALPY", "value_type": "DOUBLE", "dimension": "Energy/Mass", "default": 0.0 } + ] +} diff --git a/lib/eclipse/share/keywords/keyword_list.cmake b/lib/eclipse/share/keywords/keyword_list.cmake index 4c18277e0..b587731c2 100644 --- a/lib/eclipse/share/keywords/keyword_list.cmake +++ b/lib/eclipse/share/keywords/keyword_list.cmake @@ -30,6 +30,7 @@ set( keywords 000_Eclipse100/A/AQUIFER_PROBE_NUMERIC 000_Eclipse100/A/AQUNUM 000_Eclipse100/A/AQUTAB + 000_Eclipse100/B/BLACKOIL 000_Eclipse100/B/BLOCK_PROBE 000_Eclipse100/B/BOX 000_Eclipse100/C/CECON @@ -385,11 +386,15 @@ set( keywords 001_Eclipse300/C/COMPS 001_Eclipse300/C/CREF 001_Eclipse300/C/CREFS + 001_Eclipse300/D/DEADOIL 001_Eclipse300/D/DREF 001_Eclipse300/D/DREFS 001_Eclipse300/D/DZV 001_Eclipse300/G/GASVISCT 001_Eclipse300/G/GCONPROD + 001_Eclipse300/H/HEATCR + 001_Eclipse300/H/HEATCRT + 001_Eclipse300/L/LIVEOIL 001_Eclipse300/M/MW 001_Eclipse300/M/MWS 001_Eclipse300/O/OILCOMPR @@ -400,10 +405,12 @@ set( keywords 001_Eclipse300/S/STCOND 001_Eclipse300/T/TEMPI 001_Eclipse300/T/TEMPVD + 001_Eclipse300/T/THCONSF 001_Eclipse300/T/THERMAL 001_Eclipse300/T/THERMEX1 001_Eclipse300/T/TREF 001_Eclipse300/T/TREFS + 001_Eclipse300/W/WINJTEMP 001_Eclipse300/W/WATDENT 001_Eclipse300/Z/ZFACT1 001_Eclipse300/Z/ZFACT1S From 98825b1921370a30c0950dc68837e16a6cc41473 Mon Sep 17 00:00:00 2001 From: Andreas Lauser Date: Thu, 23 Nov 2017 13:18:32 +0100 Subject: [PATCH 08/11] add the higher-level infrastructure for the SPECHEAT keyword This changes the JSON definition of the SPEHEAT keyword from a blob to a table, adds a SpecHeatTable class and wires it into the TableManager. --- .../EclipseState/Tables/TableManager.cpp | 8 ++++ lib/eclipse/EclipseState/Tables/Tables.cpp | 23 +++++++++++ .../EclipseState/Tables/SpecheatTable.hpp | 41 +++++++++++++++++++ .../EclipseState/Tables/TableManager.hpp | 1 + .../share/keywords/000_Eclipse100/S/SPECHEAT | 14 +++++-- 5 files changed, 84 insertions(+), 3 deletions(-) create mode 100644 lib/eclipse/include/opm/parser/eclipse/EclipseState/Tables/SpecheatTable.hpp diff --git a/lib/eclipse/EclipseState/Tables/TableManager.cpp b/lib/eclipse/EclipseState/Tables/TableManager.cpp index df4af442f..fb31de960 100644 --- a/lib/eclipse/EclipseState/Tables/TableManager.cpp +++ b/lib/eclipse/EclipseState/Tables/TableManager.cpp @@ -61,6 +61,7 @@ #include #include #include +#include #include #include #include @@ -209,6 +210,8 @@ namespace Opm { addTables( "PVDO", m_tabdims.getNumPVTTables()); addTables( "PVDS", m_tabdims.getNumPVTTables()); + addTables( "SPECHEAT", m_tabdims.getNumPVTTables()); + addTables( "OILVISCT", m_tabdims.getNumPVTTables()); addTables( "WATVISCT", m_tabdims.getNumPVTTables()); addTables( "GASVISCT", m_tabdims.getNumPVTTables()); @@ -306,6 +309,7 @@ namespace Opm { initSimpleTableContainer(deck, "PVDG", m_tabdims.getNumPVTTables()); initSimpleTableContainer(deck, "PVDO", m_tabdims.getNumPVTTables()); initSimpleTableContainer(deck, "PVDS", m_tabdims.getNumPVTTables()); + initSimpleTableContainer(deck, "SPECHEAT", m_tabdims.getNumPVTTables()); initSimpleTableContainer(deck, "OILVISCT", m_tabdims.getNumPVTTables()); initSimpleTableContainer(deck, "WATVISCT", m_tabdims.getNumPVTTables()); @@ -623,6 +627,10 @@ namespace Opm { return getTables("PVDS"); } + const TableContainer& TableManager::getSpecheatTables() const { + return getTables("SPECHEAT"); + } + const TableContainer& TableManager::getOilvisctTables() const { return getTables("OILVISCT"); } diff --git a/lib/eclipse/EclipseState/Tables/Tables.cpp b/lib/eclipse/EclipseState/Tables/Tables.cpp index fb6550055..7d5dc8c06 100644 --- a/lib/eclipse/EclipseState/Tables/Tables.cpp +++ b/lib/eclipse/EclipseState/Tables/Tables.cpp @@ -63,6 +63,7 @@ #include #include #include +#include #include #include #include @@ -100,6 +101,28 @@ PvtoTable::PvtoTable( const DeckKeyword& keyword, size_t tableIdx) : PvtxTable::init(keyword , tableIdx); } +SpecheatTable::SpecheatTable(const DeckItem& item) +{ + m_schema.addColumn(ColumnSchema("TEMPERATURE", Table::STRICTLY_INCREASING, Table::DEFAULT_NONE)); + m_schema.addColumn(ColumnSchema("CP_OIL", Table::RANDOM, Table::DEFAULT_LINEAR)); + m_schema.addColumn(ColumnSchema("CP_WATER", Table::RANDOM, Table::DEFAULT_LINEAR)); + m_schema.addColumn(ColumnSchema("CP_GAS", Table::RANDOM, Table::DEFAULT_LINEAR)); + + SimpleTable::init(item); +} + +const TableColumn& SpecheatTable::getTemperatureColumn() const +{ return SimpleTable::getColumn(0); } + +const TableColumn& SpecheatTable::getCpOilColumn() const +{ return SimpleTable::getColumn(1); } + +const TableColumn& SpecheatTable::getCpWaterColumn() const +{ return SimpleTable::getColumn(2); } + +const TableColumn& SpecheatTable::getCpGasColumn() const +{ return SimpleTable::getColumn(3); } + SwofTable::SwofTable( const DeckItem& item , const bool jfunc) { m_schema.addColumn( ColumnSchema( "SW" , Table::STRICTLY_INCREASING , Table::DEFAULT_NONE) ); diff --git a/lib/eclipse/include/opm/parser/eclipse/EclipseState/Tables/SpecheatTable.hpp b/lib/eclipse/include/opm/parser/eclipse/EclipseState/Tables/SpecheatTable.hpp new file mode 100644 index 000000000..5b19b2173 --- /dev/null +++ b/lib/eclipse/include/opm/parser/eclipse/EclipseState/Tables/SpecheatTable.hpp @@ -0,0 +1,41 @@ +/* + 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 OPM_PARSER_SPECHEAT_TABLE_HPP +#define OPM_PARSER_SPECHEAT_TABLE_HPP + +#include "SimpleTable.hpp" + +namespace Opm { + + class DeckItem; + + // this table specifies the specific heat capacity of the black oil fluids. In this + // context, be aware that the keyword "SPECHEAT" stands for "SPECific HEAT capacity" + // not for a way to cheat on the SPE test cases ;) + class SpecheatTable : public SimpleTable { + public: + SpecheatTable(const DeckItem& item); + + const TableColumn& getTemperatureColumn() const; + const TableColumn& getCpOilColumn() const; + const TableColumn& getCpWaterColumn() const; + const TableColumn& getCpGasColumn() const; + }; +} + +#endif + diff --git a/lib/eclipse/include/opm/parser/eclipse/EclipseState/Tables/TableManager.hpp b/lib/eclipse/include/opm/parser/eclipse/EclipseState/Tables/TableManager.hpp index d587e25b2..b2221e2da 100644 --- a/lib/eclipse/include/opm/parser/eclipse/EclipseState/Tables/TableManager.hpp +++ b/lib/eclipse/include/opm/parser/eclipse/EclipseState/Tables/TableManager.hpp @@ -86,6 +86,7 @@ namespace Opm { const TableContainer& getPvdgTables() const; const TableContainer& getPvdoTables() const; const TableContainer& getPvdsTables() const; + const TableContainer& getSpecheatTables() const; const TableContainer& getWatvisctTables() const; const TableContainer& getOilvisctTables() const; const TableContainer& getGasvisctTables() const; diff --git a/lib/eclipse/share/keywords/000_Eclipse100/S/SPECHEAT b/lib/eclipse/share/keywords/000_Eclipse100/S/SPECHEAT index b78ab52dd..eed3620e0 100644 --- a/lib/eclipse/share/keywords/000_Eclipse100/S/SPECHEAT +++ b/lib/eclipse/share/keywords/000_Eclipse100/S/SPECHEAT @@ -1,3 +1,11 @@ -{"name" : "SPECHEAT" , "sections" : ["PROPS"], "size" : {"keyword":"TABDIMS" , "item":"NTPVT"}, - "items" : - [{"name" : "DATA" , "value_type" : "DOUBLE" , "size_type" : "ALL"}]} +{ + "name": "SPECHEAT", + "sections": ["PROPS"], + "size": { + "keyword": "TABDIMS", + "item": "NTPVT" + }, + "items": [ + { "name": "DATA", "value_type": "DOUBLE", "size_type": "ALL", "dimension": ["Temperature", "Energy/Mass*AbsoluteTemperature", "Energy/Mass*AbsoluteTemperature", "Energy/Mass*AbsoluteTemperature"]} + ] +} From 2d3d8cb220965692ce0ef73101135ecefb7da78e Mon Sep 17 00:00:00 2001 From: Andreas Lauser Date: Thu, 23 Nov 2017 13:18:32 +0100 Subject: [PATCH 09/11] add the infrastructure for SPECROCK this is analogous to the SPECHEAT patch: - fix the JSON definition - add a table class - wire the table class into TableManager --- .../EclipseState/Tables/TableManager.cpp | 7 ++++ lib/eclipse/EclipseState/Tables/Tables.cpp | 15 ++++++++ .../EclipseState/Tables/SpecrockTable.hpp | 38 +++++++++++++++++++ .../EclipseState/Tables/TableManager.hpp | 1 + .../share/keywords/000_Eclipse100/S/SPECROCK | 16 ++++++-- 5 files changed, 74 insertions(+), 3 deletions(-) create mode 100644 lib/eclipse/include/opm/parser/eclipse/EclipseState/Tables/SpecrockTable.hpp diff --git a/lib/eclipse/EclipseState/Tables/TableManager.cpp b/lib/eclipse/EclipseState/Tables/TableManager.cpp index fb31de960..e249a9c22 100644 --- a/lib/eclipse/EclipseState/Tables/TableManager.cpp +++ b/lib/eclipse/EclipseState/Tables/TableManager.cpp @@ -62,6 +62,7 @@ #include #include #include +#include #include #include #include @@ -211,6 +212,7 @@ namespace Opm { addTables( "PVDS", m_tabdims.getNumPVTTables()); addTables( "SPECHEAT", m_tabdims.getNumPVTTables()); + addTables( "SPECROCK", m_tabdims.getNumSatTables()); addTables( "OILVISCT", m_tabdims.getNumPVTTables()); addTables( "WATVISCT", m_tabdims.getNumPVTTables()); @@ -310,6 +312,7 @@ namespace Opm { initSimpleTableContainer(deck, "PVDO", m_tabdims.getNumPVTTables()); initSimpleTableContainer(deck, "PVDS", m_tabdims.getNumPVTTables()); initSimpleTableContainer(deck, "SPECHEAT", m_tabdims.getNumPVTTables()); + initSimpleTableContainer(deck, "SPECROCK", m_tabdims.getNumSatTables()); initSimpleTableContainer(deck, "OILVISCT", m_tabdims.getNumPVTTables()); initSimpleTableContainer(deck, "WATVISCT", m_tabdims.getNumPVTTables()); @@ -631,6 +634,10 @@ namespace Opm { return getTables("SPECHEAT"); } + const TableContainer& TableManager::getSpecrockTables() const { + return getTables("SPECROCK"); + } + const TableContainer& TableManager::getOilvisctTables() const { return getTables("OILVISCT"); } diff --git a/lib/eclipse/EclipseState/Tables/Tables.cpp b/lib/eclipse/EclipseState/Tables/Tables.cpp index 7d5dc8c06..5f198832b 100644 --- a/lib/eclipse/EclipseState/Tables/Tables.cpp +++ b/lib/eclipse/EclipseState/Tables/Tables.cpp @@ -64,6 +64,7 @@ #include #include #include +#include #include #include #include @@ -123,6 +124,20 @@ const TableColumn& SpecheatTable::getCpWaterColumn() const const TableColumn& SpecheatTable::getCpGasColumn() const { return SimpleTable::getColumn(3); } +SpecrockTable::SpecrockTable(const DeckItem& item) +{ + m_schema.addColumn(ColumnSchema("TEMPERATURE", Table::STRICTLY_INCREASING, Table::DEFAULT_NONE)); + m_schema.addColumn(ColumnSchema("CP_ROCK", Table::RANDOM, Table::DEFAULT_LINEAR)); + + SimpleTable::init(item); +} + +const TableColumn& SpecrockTable::getTemperatureColumn() const +{ return SimpleTable::getColumn(0); } + +const TableColumn& SpecrockTable::getCpRockColumn() const +{ return SimpleTable::getColumn(1); } + SwofTable::SwofTable( const DeckItem& item , const bool jfunc) { m_schema.addColumn( ColumnSchema( "SW" , Table::STRICTLY_INCREASING , Table::DEFAULT_NONE) ); diff --git a/lib/eclipse/include/opm/parser/eclipse/EclipseState/Tables/SpecrockTable.hpp b/lib/eclipse/include/opm/parser/eclipse/EclipseState/Tables/SpecrockTable.hpp new file mode 100644 index 000000000..bd51e65a1 --- /dev/null +++ b/lib/eclipse/include/opm/parser/eclipse/EclipseState/Tables/SpecrockTable.hpp @@ -0,0 +1,38 @@ +/* + 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 OPM_PARSER_SPECROCK_TABLE_HPP +#define OPM_PARSER_SPECROCK_TABLE_HPP + +#include "SimpleTable.hpp" + +namespace Opm { + + class DeckItem; + + // this table specifies the volumetric heat capacity of the rock not including the + // pore space. + class SpecrockTable : public SimpleTable { + public: + SpecrockTable(const DeckItem& item); + + const TableColumn& getTemperatureColumn() const; + const TableColumn& getCpRockColumn() const; + }; +} + +#endif + diff --git a/lib/eclipse/include/opm/parser/eclipse/EclipseState/Tables/TableManager.hpp b/lib/eclipse/include/opm/parser/eclipse/EclipseState/Tables/TableManager.hpp index b2221e2da..ec1e16f2b 100644 --- a/lib/eclipse/include/opm/parser/eclipse/EclipseState/Tables/TableManager.hpp +++ b/lib/eclipse/include/opm/parser/eclipse/EclipseState/Tables/TableManager.hpp @@ -87,6 +87,7 @@ namespace Opm { const TableContainer& getPvdoTables() const; const TableContainer& getPvdsTables() const; const TableContainer& getSpecheatTables() const; + const TableContainer& getSpecrockTables() const; const TableContainer& getWatvisctTables() const; const TableContainer& getOilvisctTables() const; const TableContainer& getGasvisctTables() const; diff --git a/lib/eclipse/share/keywords/000_Eclipse100/S/SPECROCK b/lib/eclipse/share/keywords/000_Eclipse100/S/SPECROCK index f0e246699..54eb53485 100644 --- a/lib/eclipse/share/keywords/000_Eclipse100/S/SPECROCK +++ b/lib/eclipse/share/keywords/000_Eclipse100/S/SPECROCK @@ -1,3 +1,13 @@ -{"name" : "SPECROCK" , "sections" : ["PROPS"], "size" : {"keyword":"TABDIMS" , "item":"NTSFUN"}, - "items" : - [{"name" : "DATA" , "value_type" : "DOUBLE" , "size_type" : "ALL"}]} +{ + "name": "SPECROCK", + "sections": ["PROPS"], + "size": { + "keyword": "TABDIMS", + "item": "NTSFUN" + }, + "items": [ + { "name":"DATA", "value_type":"DOUBLE", "size_type": "ALL", "dimension": ["Temperature", "Energy/Length*Length*Length*AbsoluteTemperature"] } + ] +} + + From 89a41414de8ec77d8eefe53e460956f1074be62a Mon Sep 17 00:00:00 2001 From: Andreas Lauser Date: Thu, 23 Nov 2017 13:18:33 +0100 Subject: [PATCH 10/11] add an energy "phase" this is just like the solvent "phase" and the polymer "phase". Since IMO this is a bit awkward, the Phases class should possibly be renamed to something like "ConservedQuantities". --- lib/eclipse/EclipseState/Runspec.cpp | 13 ++++++++----- lib/eclipse/EclipseState/Schedule/Well.cpp | 2 ++ .../opm/parser/eclipse/EclipseState/Runspec.hpp | 5 +++-- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/lib/eclipse/EclipseState/Runspec.cpp b/lib/eclipse/EclipseState/Runspec.cpp index c40217ff3..8deebdd03 100644 --- a/lib/eclipse/EclipseState/Runspec.cpp +++ b/lib/eclipse/EclipseState/Runspec.cpp @@ -33,6 +33,7 @@ Phase get_phase( const std::string& str ) { if( str == "WATER" ) return Phase::WATER; if( str == "SOLVENT" ) return Phase::SOLVENT; if( str == "POLYMER" ) return Phase::POLYMER; + if( str == "ENERGY" ) return Phase::ENERGY; throw std::invalid_argument( "Unknown phase '" + str + "'" ); } @@ -44,6 +45,7 @@ std::ostream& operator<<( std::ostream& stream, const Phase& p ) { case Phase::WATER: return stream << "WATER"; case Phase::SOLVENT: return stream << "SOLVENT"; case Phase::POLYMER: return stream << "POLYMER"; + case Phase::ENERGY: return stream << "ENERGY"; } @@ -52,12 +54,13 @@ std::ostream& operator<<( std::ostream& stream, const Phase& p ) { using un = std::underlying_type< Phase >::type; -Phases::Phases( bool oil, bool gas, bool wat, bool sol, bool pol ) noexcept : +Phases::Phases( bool oil, bool gas, bool wat, bool sol, bool pol, bool energy ) noexcept : bits( (oil ? (1 << static_cast< un >( Phase::OIL ) ) : 0) | (gas ? (1 << static_cast< un >( Phase::GAS ) ) : 0) | (wat ? (1 << static_cast< un >( Phase::WATER ) ) : 0) | (sol ? (1 << static_cast< un >( Phase::SOLVENT ) ) : 0) | - (pol ? (1 << static_cast< un >( Phase::POLYMER ) ) : 0) ) + (pol ? (1 << static_cast< un >( Phase::POLYMER ) ) : 0) | + (energy ? (1 << static_cast< un >( Phase::ENERGY ) ) : 0) ) {} @@ -70,12 +73,12 @@ size_t Phases::size() const noexcept { } Runspec::Runspec( const Deck& deck ) : - active_phases( Phases{ deck.hasKeyword( "OIL" ), + active_phases( Phases( deck.hasKeyword( "OIL" ), deck.hasKeyword( "GAS" ), deck.hasKeyword( "WATER" ), deck.hasKeyword( "SOLVENT" ), - deck.hasKeyword( "POLYMER" ) - } ), + deck.hasKeyword( "POLYMER" ), + deck.hasKeyword( "THERMAL" ) ) ), m_tabdims( deck ), endscale( deck ) {} diff --git a/lib/eclipse/EclipseState/Schedule/Well.cpp b/lib/eclipse/EclipseState/Schedule/Well.cpp index b7bc4fc46..0d357d3d8 100644 --- a/lib/eclipse/EclipseState/Schedule/Well.cpp +++ b/lib/eclipse/EclipseState/Schedule/Well.cpp @@ -116,6 +116,8 @@ namespace Opm { throw std::invalid_argument( "Production of 'SOLVENT' requested." ); case Phase::POLYMER: throw std::invalid_argument( "Production of 'POLYMER' requested." ); + case Phase::ENERGY: + throw std::invalid_argument( "Production of 'ENERGY' requested." ); } throw std::logic_error( "Unreachable state. Invalid Phase value. " diff --git a/lib/eclipse/include/opm/parser/eclipse/EclipseState/Runspec.hpp b/lib/eclipse/include/opm/parser/eclipse/EclipseState/Runspec.hpp index 1b686f4ee..1d5cd45dc 100644 --- a/lib/eclipse/include/opm/parser/eclipse/EclipseState/Runspec.hpp +++ b/lib/eclipse/include/opm/parser/eclipse/EclipseState/Runspec.hpp @@ -35,6 +35,7 @@ enum class Phase { WATER = 2, SOLVENT = 3, POLYMER = 4, + ENERGY = 5, }; Phase get_phase( const std::string& ); @@ -43,12 +44,12 @@ std::ostream& operator<<( std::ostream&, const Phase& ); class Phases { public: Phases() noexcept = default; - Phases( bool oil, bool gas, bool wat, bool solvent = false, bool polymer = false ) noexcept; + Phases( bool oil, bool gas, bool wat, bool solvent = false, bool polymer = false, bool energy = false ) noexcept; bool active( Phase ) const noexcept; size_t size() const noexcept; private: - std::bitset< 5 > bits; + std::bitset< 6 > bits; }; From 36f477ce36037de10eb784b54aaca8d71ea20d35 Mon Sep 17 00:00:00 2001 From: Andreas Lauser Date: Thu, 23 Nov 2017 13:18:33 +0100 Subject: [PATCH 11/11] add temperature to the well injection properties so far, this uses the WTEMP keyword. the WINJTEMP keyword is still to do! --- .../EclipseState/Schedule/Schedule.cpp | 23 +++++++++++++++++++ .../Schedule/WellInjectionProperties.cpp | 7 ++++++ .../EclipseState/Schedule/Schedule.hpp | 1 + .../Schedule/WellInjectionProperties.hpp | 1 + 4 files changed, 32 insertions(+) diff --git a/lib/eclipse/EclipseState/Schedule/Schedule.cpp b/lib/eclipse/EclipseState/Schedule/Schedule.cpp index e776b8ff0..6c5e25282 100644 --- a/lib/eclipse/EclipseState/Schedule/Schedule.cpp +++ b/lib/eclipse/EclipseState/Schedule/Schedule.cpp @@ -167,6 +167,9 @@ namespace Opm { else if (keyword.name() == "WSOLVENT") handleWSOLVENT(keyword, currentStep); + else if (keyword.name() == "WTEMP") + handleWTEMP(keyword, currentStep); + else if (keyword.name() == "WCONINJH") handleWCONINJH(section, keyword, currentStep); @@ -714,6 +717,26 @@ namespace Opm { } } + void Schedule::handleWTEMP( const DeckKeyword& keyword, size_t currentStep) { + for( const auto& record : keyword ) { + const std::string& wellNamePattern = record.getItem("WELL").getTrimmedString(0); + + for (auto* well : getWells(wellNamePattern)) { + // TODO: Can this be done like this? Setting the temperature only has an + // effect on injectors, but specifying this for producers won't hurt and + // wells can also switch their injector/producer status. Note that + // modifying the injector properties for producer wells currently leads + // to a very weird segmentation fault downstream. For now, let's take the + // water route. + if (well->isInjector(currentStep)) { + WellInjectionProperties injectionProperties = well->getInjectionProperties(currentStep); + injectionProperties.temperature = record.getItem("TEMP").getSIDouble(0); + well->setInjectionProperties(currentStep, injectionProperties); + } + } + } + } + void Schedule::handleWCONINJH( const SCHEDULESection& section, const DeckKeyword& keyword, size_t currentStep) { for( const auto& record : keyword ) { const std::string& wellName = record.getItem("WELL").getTrimmedString(0); diff --git a/lib/eclipse/EclipseState/Schedule/WellInjectionProperties.cpp b/lib/eclipse/EclipseState/Schedule/WellInjectionProperties.cpp index e069979e5..2fa18a883 100644 --- a/lib/eclipse/EclipseState/Schedule/WellInjectionProperties.cpp +++ b/lib/eclipse/EclipseState/Schedule/WellInjectionProperties.cpp @@ -16,6 +16,8 @@ You should have received a copy of the GNU General Public License along with OPM. If not, see . */ +#include +#include #include #include @@ -27,6 +29,9 @@ namespace Opm { WellInjectionProperties::WellInjectionProperties() { surfaceInjectionRate=0.0; reservoirInjectionRate=0.0; + temperature= + Metric::TemperatureOffset + + ParserKeywords::STCOND::TEMPERATURE::defaultValue; BHPLimit=0.0; THPLimit=0.0; VFPTableNumber=0; @@ -40,6 +45,7 @@ namespace Opm { bool WellInjectionProperties::operator==(const WellInjectionProperties& other) const { if ((surfaceInjectionRate == other.surfaceInjectionRate) && (reservoirInjectionRate == other.reservoirInjectionRate) && + (temperature == other.temperature) && (BHPLimit == other.BHPLimit) && (THPLimit == other.THPLimit) && (VFPTableNumber == other.VFPTableNumber) && @@ -62,6 +68,7 @@ namespace Opm { << "WellInjectionProperties { " << "surfacerate: " << wp.surfaceInjectionRate << ", " << "reservoir rate " << wp.reservoirInjectionRate << ", " + << "temperature: " << wp.temperature << ", " << "BHP limit: " << wp.BHPLimit << ", " << "THP limit: " << wp.THPLimit << ", " << "VFP table: " << wp.VFPTableNumber << ", " diff --git a/lib/eclipse/include/opm/parser/eclipse/EclipseState/Schedule/Schedule.hpp b/lib/eclipse/include/opm/parser/eclipse/EclipseState/Schedule/Schedule.hpp index 770defa03..1ee94a7e9 100644 --- a/lib/eclipse/include/opm/parser/eclipse/EclipseState/Schedule/Schedule.hpp +++ b/lib/eclipse/include/opm/parser/eclipse/EclipseState/Schedule/Schedule.hpp @@ -143,6 +143,7 @@ namespace Opm void handleWCONINJE( const SCHEDULESection&, const DeckKeyword& keyword, size_t currentStep); void handleWPOLYMER( const DeckKeyword& keyword, size_t currentStep); void handleWSOLVENT( const DeckKeyword& keyword, size_t currentStep); + void handleWTEMP( const DeckKeyword& keyword, size_t currentStep); void handleWCONINJH( const SCHEDULESection&, const DeckKeyword& keyword, size_t currentStep); void handleWELOPEN( const DeckKeyword& keyword, size_t currentStep ); void handleWELTARG( const SCHEDULESection&, const DeckKeyword& keyword, size_t currentStep); diff --git a/lib/eclipse/include/opm/parser/eclipse/EclipseState/Schedule/WellInjectionProperties.hpp b/lib/eclipse/include/opm/parser/eclipse/EclipseState/Schedule/WellInjectionProperties.hpp index a263befbd..1b2bbc892 100644 --- a/lib/eclipse/include/opm/parser/eclipse/EclipseState/Schedule/WellInjectionProperties.hpp +++ b/lib/eclipse/include/opm/parser/eclipse/EclipseState/Schedule/WellInjectionProperties.hpp @@ -29,6 +29,7 @@ namespace Opm { struct WellInjectionProperties { double surfaceInjectionRate; double reservoirInjectionRate; + double temperature; double BHPLimit; double THPLimit; int VFPTableNumber;