Merge pull request #1123 from jokva/read-pressure-swat-sgas-from-es
Read RS,RV,PRESSURE,SWAT,SGAS from EclipseState
This commit is contained in:
commit
ec060d513b
@ -25,6 +25,7 @@
|
|||||||
#include <opm/parser/eclipse/Units/Units.hpp>
|
#include <opm/parser/eclipse/Units/Units.hpp>
|
||||||
#include <opm/common/ErrorMacros.hpp>
|
#include <opm/common/ErrorMacros.hpp>
|
||||||
|
|
||||||
|
#include <opm/parser/eclipse/EclipseState/EclipseState.hpp>
|
||||||
#include <opm/parser/eclipse/Deck/DeckItem.hpp>
|
#include <opm/parser/eclipse/Deck/DeckItem.hpp>
|
||||||
#include <opm/parser/eclipse/Deck/DeckKeyword.hpp>
|
#include <opm/parser/eclipse/Deck/DeckKeyword.hpp>
|
||||||
#include <opm/parser/eclipse/Deck/DeckRecord.hpp>
|
#include <opm/parser/eclipse/Deck/DeckRecord.hpp>
|
||||||
|
@ -20,8 +20,7 @@
|
|||||||
#ifndef OPM_INITSTATE_HEADER_INCLUDED
|
#ifndef OPM_INITSTATE_HEADER_INCLUDED
|
||||||
#define OPM_INITSTATE_HEADER_INCLUDED
|
#define OPM_INITSTATE_HEADER_INCLUDED
|
||||||
|
|
||||||
#include <opm/parser/eclipse/Deck/Deck.hpp>
|
#include <opm/parser/eclipse/EclipseState/EclipseState.hpp>
|
||||||
|
|
||||||
|
|
||||||
struct UnstructuredGrid;
|
struct UnstructuredGrid;
|
||||||
|
|
||||||
@ -181,7 +180,7 @@ namespace Opm
|
|||||||
template <class Props, class State>
|
template <class Props, class State>
|
||||||
void initStateFromDeck(const UnstructuredGrid& grid,
|
void initStateFromDeck(const UnstructuredGrid& grid,
|
||||||
const Props& props,
|
const Props& props,
|
||||||
const Opm::Deck& deck,
|
const EclipseState& es,
|
||||||
const double gravity,
|
const double gravity,
|
||||||
State& state);
|
State& state);
|
||||||
|
|
||||||
@ -196,7 +195,7 @@ namespace Opm
|
|||||||
template <class Props, class State>
|
template <class Props, class State>
|
||||||
void initBlackoilStateFromDeck(const UnstructuredGrid& grid,
|
void initBlackoilStateFromDeck(const UnstructuredGrid& grid,
|
||||||
const Props& props,
|
const Props& props,
|
||||||
const Opm::Deck& deck,
|
const Opm::EclipseState& es,
|
||||||
const double gravity,
|
const double gravity,
|
||||||
State& state);
|
State& state);
|
||||||
/// Initialize a blackoil state from input deck.
|
/// Initialize a blackoil state from input deck.
|
||||||
@ -209,7 +208,7 @@ namespace Opm
|
|||||||
CCI begin_cell_centroids,
|
CCI begin_cell_centroids,
|
||||||
int dimensions,
|
int dimensions,
|
||||||
const Props& props,
|
const Props& props,
|
||||||
const Opm::Deck& deck,
|
const Opm::EclipseState& es,
|
||||||
const double gravity,
|
const double gravity,
|
||||||
State& state);
|
State& state);
|
||||||
} // namespace Opm
|
} // namespace Opm
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
#include <opm/core/props/phaseUsageFromDeck.hpp>
|
#include <opm/core/props/phaseUsageFromDeck.hpp>
|
||||||
#include <opm/core/utility/miscUtilitiesBlackoil.hpp>
|
#include <opm/core/utility/miscUtilitiesBlackoil.hpp>
|
||||||
|
|
||||||
|
#include <opm/parser/eclipse/EclipseState/EclipseState.hpp>
|
||||||
#include <opm/parser/eclipse/EclipseState/InitConfig/Equil.hpp>
|
#include <opm/parser/eclipse/EclipseState/InitConfig/Equil.hpp>
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
@ -621,14 +622,14 @@ namespace Opm
|
|||||||
template <class Props, class State>
|
template <class Props, class State>
|
||||||
void initStateFromDeck(const UnstructuredGrid& grid,
|
void initStateFromDeck(const UnstructuredGrid& grid,
|
||||||
const Props& props,
|
const Props& props,
|
||||||
const Opm::Deck& deck,
|
const Opm::EclipseState& es,
|
||||||
const double gravity,
|
const double gravity,
|
||||||
State& state)
|
State& state)
|
||||||
{
|
{
|
||||||
initStateFromDeck(grid.number_of_cells, grid.global_cell,
|
initStateFromDeck(grid.number_of_cells, grid.global_cell,
|
||||||
grid.number_of_faces, UgGridHelpers::faceCells(grid),
|
grid.number_of_faces, UgGridHelpers::faceCells(grid),
|
||||||
grid.face_centroids, grid.cell_centroids, grid.dimensions,
|
grid.face_centroids, grid.cell_centroids, grid.dimensions,
|
||||||
props, deck, gravity, state);
|
props, es, gravity, state);
|
||||||
}
|
}
|
||||||
/// Initialize a state from input deck.
|
/// Initialize a state from input deck.
|
||||||
template <class FaceCells, class FCI, class CCI, class Props, class State>
|
template <class FaceCells, class FCI, class CCI, class Props, class State>
|
||||||
@ -640,22 +641,30 @@ namespace Opm
|
|||||||
CCI begin_cell_centroids,
|
CCI begin_cell_centroids,
|
||||||
int dimensions,
|
int dimensions,
|
||||||
const Props& props,
|
const Props& props,
|
||||||
const Opm::Deck& deck,
|
const Opm::EclipseState& es,
|
||||||
const double gravity,
|
const double gravity,
|
||||||
State& state)
|
State& state)
|
||||||
{
|
{
|
||||||
const int num_phases = props.numPhases();
|
const int num_phases = props.numPhases();
|
||||||
const PhaseUsage pu = phaseUsageFromDeck(deck);
|
const PhaseUsage pu = phaseUsageFromDeck(es);
|
||||||
|
|
||||||
|
const auto& init_config = es.cfg().init();
|
||||||
|
const auto& grid_props = es.get3DProperties();
|
||||||
|
const auto has_equil = init_config.hasEquil();
|
||||||
|
const auto has_pressure = grid_props.hasDeckDoubleGridProperty("PRESSURE");
|
||||||
|
const auto has_sgas = grid_props.hasDeckDoubleGridProperty("SGAS");
|
||||||
|
const auto has_swat = grid_props.hasDeckDoubleGridProperty("SWAT");
|
||||||
|
|
||||||
if (num_phases != pu.num_phases) {
|
if (num_phases != pu.num_phases) {
|
||||||
OPM_THROW(std::runtime_error, "initStateFromDeck(): user specified property object with " << num_phases << " phases, "
|
OPM_THROW(std::runtime_error, "initStateFromDeck(): user specified property object with " << num_phases << " phases, "
|
||||||
"found " << pu.num_phases << " phases in deck.");
|
"found " << pu.num_phases << " phases in deck.");
|
||||||
}
|
}
|
||||||
if (deck.hasKeyword("EQUIL") && deck.hasKeyword("PRESSURE")) {
|
if (has_equil && has_pressure) {
|
||||||
OPM_THROW(std::runtime_error, "initStateFromDeck(): The deck must either specify the initial "
|
OPM_THROW(std::runtime_error, "initStateFromDeck(): The deck must either specify the initial "
|
||||||
"condition using the PRESSURE _or_ the EQUIL keyword (currently it has both)");
|
"condition using the PRESSURE _or_ the EQUIL keyword (currently it has both)");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (deck.hasKeyword("EQUIL")) {
|
if (has_equil) {
|
||||||
if (num_phases != 2) {
|
if (num_phases != 2) {
|
||||||
OPM_THROW(std::runtime_error, "initStateFromDeck(): EQUIL-based init currently handling only two-phase scenarios.");
|
OPM_THROW(std::runtime_error, "initStateFromDeck(): EQUIL-based init currently handling only two-phase scenarios.");
|
||||||
}
|
}
|
||||||
@ -663,7 +672,7 @@ namespace Opm
|
|||||||
OPM_THROW(std::runtime_error, "initStateFromDeck(): EQUIL-based init currently handling only oil-water scenario (no gas).");
|
OPM_THROW(std::runtime_error, "initStateFromDeck(): EQUIL-based init currently handling only oil-water scenario (no gas).");
|
||||||
}
|
}
|
||||||
// Set saturations depending on oil-water contact.
|
// Set saturations depending on oil-water contact.
|
||||||
Equil equil( deck.getKeyword( "EQUIL" ) );
|
const auto& equil = init_config.getEquil();
|
||||||
if (equil.size() != 1) {
|
if (equil.size() != 1) {
|
||||||
OPM_THROW(std::runtime_error, "initStateFromDeck(): No region support yet.");
|
OPM_THROW(std::runtime_error, "initStateFromDeck(): No region support yet.");
|
||||||
}
|
}
|
||||||
@ -675,19 +684,20 @@ namespace Opm
|
|||||||
const double datum_p = equil.getRecord( 0 ).datumDepthPressure();
|
const double datum_p = equil.getRecord( 0 ).datumDepthPressure();
|
||||||
initHydrostaticPressure(number_of_cells, begin_cell_centroids, dimensions,
|
initHydrostaticPressure(number_of_cells, begin_cell_centroids, dimensions,
|
||||||
props, woc, gravity, datum_z, datum_p, state);
|
props, woc, gravity, datum_z, datum_p, state);
|
||||||
} else if (deck.hasKeyword("PRESSURE")) {
|
} else if (has_pressure) {
|
||||||
// Set saturations from SWAT/SGAS, pressure from PRESSURE.
|
// Set saturations from SWAT/SGAS, pressure from PRESSURE.
|
||||||
std::vector<double>& s = state.saturation();
|
std::vector<double>& s = state.saturation();
|
||||||
std::vector<double>& p = state.pressure();
|
std::vector<double>& p = state.pressure();
|
||||||
const std::vector<double>& p_deck = deck.getKeyword("PRESSURE").getSIDoubleData();
|
const auto& p_deck = grid_props.getDoubleGridProperty("PRESSURE").getData();
|
||||||
const int num_cells = number_of_cells;
|
const int num_cells = number_of_cells;
|
||||||
|
|
||||||
if (num_phases == 2) {
|
if (num_phases == 2) {
|
||||||
if (!pu.phase_used[BlackoilPhases::Aqua]) {
|
if (!pu.phase_used[BlackoilPhases::Aqua]) {
|
||||||
// oil-gas: we require SGAS
|
// oil-gas: we require SGAS
|
||||||
if (!deck.hasKeyword("SGAS")) {
|
if (!has_sgas) {
|
||||||
OPM_THROW(std::runtime_error, "initStateFromDeck(): missing SGAS keyword in 2-phase init");
|
OPM_THROW(std::runtime_error, "initStateFromDeck(): missing SGAS keyword in 2-phase init");
|
||||||
}
|
}
|
||||||
const std::vector<double>& sg_deck = deck.getKeyword("SGAS").getSIDoubleData();
|
const auto& sg_deck = grid_props.getDoubleGridProperty("SGAS").getData();
|
||||||
const int gpos = pu.phase_pos[BlackoilPhases::Vapour];
|
const int gpos = pu.phase_pos[BlackoilPhases::Vapour];
|
||||||
const int opos = pu.phase_pos[BlackoilPhases::Liquid];
|
const int opos = pu.phase_pos[BlackoilPhases::Liquid];
|
||||||
for (int c = 0; c < num_cells; ++c) {
|
for (int c = 0; c < num_cells; ++c) {
|
||||||
@ -698,10 +708,10 @@ namespace Opm
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// water-oil or water-gas: we require SWAT
|
// water-oil or water-gas: we require SWAT
|
||||||
if (!deck.hasKeyword("SWAT")) {
|
if (!has_swat) {
|
||||||
OPM_THROW(std::runtime_error, "initStateFromDeck(): missing SWAT keyword in 2-phase init");
|
OPM_THROW(std::runtime_error, "initStateFromDeck(): missing SWAT keyword in 2-phase init");
|
||||||
}
|
}
|
||||||
const std::vector<double>& sw_deck = deck.getKeyword("SWAT").getSIDoubleData();
|
const auto& sw_deck = grid_props.getDoubleGridProperty("SWAT").getData();
|
||||||
const int wpos = pu.phase_pos[BlackoilPhases::Aqua];
|
const int wpos = pu.phase_pos[BlackoilPhases::Aqua];
|
||||||
const int nwpos = (wpos + 1) % 2;
|
const int nwpos = (wpos + 1) % 2;
|
||||||
for (int c = 0; c < num_cells; ++c) {
|
for (int c = 0; c < num_cells; ++c) {
|
||||||
@ -712,15 +722,15 @@ namespace Opm
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (num_phases == 3) {
|
} else if (num_phases == 3) {
|
||||||
const bool has_swat_sgas = deck.hasKeyword("SWAT") && deck.hasKeyword("SGAS");
|
const bool has_swat_sgas = has_swat && has_sgas;
|
||||||
if (!has_swat_sgas) {
|
if (!has_swat_sgas) {
|
||||||
OPM_THROW(std::runtime_error, "initStateFromDeck(): missing SGAS or SWAT keyword in 3-phase init.");
|
OPM_THROW(std::runtime_error, "initStateFromDeck(): missing SGAS or SWAT keyword in 3-phase init.");
|
||||||
}
|
}
|
||||||
const int wpos = pu.phase_pos[BlackoilPhases::Aqua];
|
const int wpos = pu.phase_pos[BlackoilPhases::Aqua];
|
||||||
const int gpos = pu.phase_pos[BlackoilPhases::Vapour];
|
const int gpos = pu.phase_pos[BlackoilPhases::Vapour];
|
||||||
const int opos = pu.phase_pos[BlackoilPhases::Liquid];
|
const int opos = pu.phase_pos[BlackoilPhases::Liquid];
|
||||||
const std::vector<double>& sw_deck = deck.getKeyword("SWAT").getSIDoubleData();
|
const auto& sw_deck = grid_props.getDoubleGridProperty("SWAT").getData();
|
||||||
const std::vector<double>& sg_deck = deck.getKeyword("SGAS").getSIDoubleData();
|
const auto& sg_deck = grid_props.getDoubleGridProperty("SGAS").getData();
|
||||||
for (int c = 0; c < num_cells; ++c) {
|
for (int c = 0; c < num_cells; ++c) {
|
||||||
int c_deck = (global_cell == NULL) ? c : global_cell[c];
|
int c_deck = (global_cell == NULL) ? c : global_cell[c];
|
||||||
s[3*c + wpos] = sw_deck[c_deck];
|
s[3*c + wpos] = sw_deck[c_deck];
|
||||||
@ -913,14 +923,14 @@ namespace Opm
|
|||||||
template <class Props, class State>
|
template <class Props, class State>
|
||||||
void initBlackoilStateFromDeck(const UnstructuredGrid& grid,
|
void initBlackoilStateFromDeck(const UnstructuredGrid& grid,
|
||||||
const Props& props,
|
const Props& props,
|
||||||
const Opm::Deck& deck,
|
const Opm::EclipseState& es,
|
||||||
const double gravity,
|
const double gravity,
|
||||||
State& state)
|
State& state)
|
||||||
{
|
{
|
||||||
initBlackoilStateFromDeck(grid.number_of_cells, grid.global_cell,
|
initBlackoilStateFromDeck(grid.number_of_cells, grid.global_cell,
|
||||||
grid.number_of_faces, UgGridHelpers::faceCells(grid),
|
grid.number_of_faces, UgGridHelpers::faceCells(grid),
|
||||||
grid.face_centroids, grid.cell_centroids,grid.dimensions,
|
grid.face_centroids, grid.cell_centroids,grid.dimensions,
|
||||||
props, deck, gravity, state);
|
props, es, gravity, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Initialize a blackoil state from input deck.
|
/// Initialize a blackoil state from input deck.
|
||||||
@ -933,15 +943,18 @@ namespace Opm
|
|||||||
CCI begin_cell_centroids,
|
CCI begin_cell_centroids,
|
||||||
int dimensions,
|
int dimensions,
|
||||||
const Props& props,
|
const Props& props,
|
||||||
const Opm::Deck& deck,
|
const Opm::EclipseState& es,
|
||||||
const double gravity,
|
const double gravity,
|
||||||
State& state)
|
State& state)
|
||||||
{
|
{
|
||||||
initStateFromDeck(number_of_cells, global_cell, number_of_faces,
|
initStateFromDeck(number_of_cells, global_cell, number_of_faces,
|
||||||
face_cells, begin_face_centroids, begin_cell_centroids,
|
face_cells, begin_face_centroids, begin_cell_centroids,
|
||||||
dimensions, props, deck, gravity, state);
|
dimensions, props, es, gravity, state);
|
||||||
if (deck.hasKeyword("RS")) {
|
|
||||||
const std::vector<double>& rs_deck = deck.getKeyword("RS").getSIDoubleData();
|
const auto& grid_props = es.get3DProperties();
|
||||||
|
|
||||||
|
if (grid_props.hasDeckDoubleGridProperty("RS")) {
|
||||||
|
const auto& rs_deck = grid_props.getDoubleGridProperty("RS").getData();
|
||||||
const int num_cells = number_of_cells;
|
const int num_cells = number_of_cells;
|
||||||
for (int c = 0; c < num_cells; ++c) {
|
for (int c = 0; c < num_cells; ++c) {
|
||||||
int c_deck = (global_cell == NULL) ? c : global_cell[c];
|
int c_deck = (global_cell == NULL) ? c : global_cell[c];
|
||||||
@ -949,8 +962,8 @@ namespace Opm
|
|||||||
}
|
}
|
||||||
initBlackoilSurfvolUsingRSorRV(number_of_cells, props, state);
|
initBlackoilSurfvolUsingRSorRV(number_of_cells, props, state);
|
||||||
computeSaturation(props,state);
|
computeSaturation(props,state);
|
||||||
} else if (deck.hasKeyword("RV")){
|
} else if (grid_props.hasDeckDoubleGridProperty("RV")) {
|
||||||
const std::vector<double>& rv_deck = deck.getKeyword("RV").getSIDoubleData();
|
const auto& rv_deck = grid_props.getDoubleGridProperty("RV").getData();
|
||||||
const int num_cells = number_of_cells;
|
const int num_cells = number_of_cells;
|
||||||
for (int c = 0; c < num_cells; ++c) {
|
for (int c = 0; c < num_cells; ++c) {
|
||||||
int c_deck = (global_cell == NULL) ? c : global_cell[c];
|
int c_deck = (global_cell == NULL) ? c : global_cell[c];
|
||||||
|
Loading…
Reference in New Issue
Block a user