mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
Simulate with only active cells (#2213)
Use FieldProps implementation for 3D properties
This commit is contained in:
parent
dce86bb078
commit
0e9535319b
@ -34,6 +34,11 @@ option(BUILD_EBOS "Build the research oriented ebos simulator?" ON)
|
||||
option(BUILD_EBOS_EXTENSIONS "Build the variants for various extensions of ebos by default?" OFF)
|
||||
option(BUILD_EBOS_DEBUG_EXTENSIONS "Build the ebos variants which are purely for debugging by default?" OFF)
|
||||
|
||||
option(ENABLE_3DPROPS_TESTING "Build and use the new experimental 3D properties" OFF)
|
||||
if (ENABLE_3DPROPS_TESTING)
|
||||
add_definitions(-DENABLE_3DPROPS_TESTING)
|
||||
endif()
|
||||
|
||||
if(SIBLING_SEARCH AND NOT opm-common_DIR)
|
||||
# guess the sibling dir
|
||||
get_filename_component(_leaf_dir_name ${PROJECT_BINARY_DIR} NAME)
|
||||
|
@ -258,12 +258,7 @@ public:
|
||||
protected:
|
||||
void createGrids_()
|
||||
{
|
||||
#ifdef ENABLE_3DPROPS_TESTING
|
||||
const auto& porv = this->eclState().fieldProps().porv(true);
|
||||
#else
|
||||
const auto& gridProps = this->eclState().get3DProperties();
|
||||
const std::vector<double>& porv = gridProps.getDoubleGridProperty("PORV").getData();
|
||||
#endif
|
||||
grid_.reset(new Dune::CpGrid());
|
||||
grid_->processEclipseFormat(&(this->eclState().getInputGrid()),
|
||||
/*isPeriodic=*/false,
|
||||
@ -284,8 +279,6 @@ protected:
|
||||
equilCartesianIndexMapper_.reset(new CartesianIndexMapper(*equilGrid_));
|
||||
}
|
||||
|
||||
|
||||
#ifdef ENABLE_3DPROPS_TESTING
|
||||
std::vector<int> actnum;
|
||||
unsigned long actnum_size;
|
||||
if (mpiRank == 0) {
|
||||
@ -301,7 +294,6 @@ protected:
|
||||
|
||||
auto & field_props = this->eclState().fieldProps();
|
||||
const_cast<FieldPropsManager&>(field_props).reset_actnum(actnum);
|
||||
#endif
|
||||
}
|
||||
|
||||
// removing some connection located in inactive grid cells
|
||||
|
@ -325,7 +325,7 @@ public:
|
||||
krnSwMdcGo_.resize(bufferSize, 0.0);
|
||||
}
|
||||
|
||||
if (simulator_.vanguard().eclState().get3DProperties().hasDeckDoubleGridProperty("SWATINIT"))
|
||||
if (simulator_.vanguard().eclState().fieldProps().has_double("SWATINIT"))
|
||||
ppcw_.resize(bufferSize, 0.0);
|
||||
|
||||
if (FluidSystem::enableDissolvedGas() && rstKeywords["RSSAT"] > 0) {
|
||||
@ -633,9 +633,10 @@ public:
|
||||
}
|
||||
|
||||
|
||||
if (ppcw_.size() > 0)
|
||||
if (ppcw_.size() > 0) {
|
||||
ppcw_[globalDofIdx] = matLawManager->oilWaterScaledEpsInfoDrainage(globalDofIdx).maxPcow;
|
||||
|
||||
//printf("ppcw_[%d] = %lg\n", globalDofIdx, ppcw_[globalDofIdx]);
|
||||
}
|
||||
// hack to make the intial output of rs and rv Ecl compatible.
|
||||
// For cells with swat == 1 Ecl outputs; rs = rsSat and rv=rvSat, in all but the initial step
|
||||
// where it outputs rs and rv values calculated by the initialization. To be compatible we overwrite
|
||||
@ -1605,12 +1606,11 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
if (simulator_.vanguard().eclState().get3DProperties().hasDeckDoubleGridProperty("SWATINIT")) {
|
||||
if (simulator_.vanguard().eclState().fieldProps().has_double("SWATINIT")) {
|
||||
auto oilWaterScaledEpsInfoDrainage = simulator.problem().materialLawManager()->oilWaterScaledEpsInfoDrainagePointerReferenceHack(elemIdx);
|
||||
oilWaterScaledEpsInfoDrainage->maxPcow = ppcw_[elemIdx];
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
Scalar getSolventSaturation(unsigned elemIdx) const
|
||||
@ -1744,7 +1744,7 @@ private:
|
||||
|
||||
void createLocalFipnum_()
|
||||
{
|
||||
const std::vector<int>& fipnumGlobal = simulator_.vanguard().eclState().get3DProperties().getIntGridProperty("FIPNUM").getData();
|
||||
const std::vector<int> fipnumGlobal = simulator_.vanguard().eclState().fieldProps().get_global_int("FIPNUM");
|
||||
// Get compressed cell fipnum.
|
||||
const auto& gridView = simulator_.vanguard().gridView();
|
||||
unsigned numElements = gridView.size(/*codim=*/0);
|
||||
|
@ -2184,9 +2184,9 @@ private:
|
||||
void readRockParameters_()
|
||||
{
|
||||
const auto& simulator = this->simulator();
|
||||
const auto& deck = simulator.vanguard().deck();
|
||||
const auto& eclState = simulator.vanguard().eclState();
|
||||
const auto& vanguard = simulator.vanguard();
|
||||
const auto& deck = vanguard.deck();
|
||||
auto& eclState = vanguard.eclState();
|
||||
|
||||
// read the rock compressibility parameters
|
||||
if (deck.hasKeyword("ROCK")) {
|
||||
@ -2226,21 +2226,18 @@ private:
|
||||
|
||||
// If ROCKCOMP is used and ROCKNUM is specified ROCK2D ROCK2DTR ROCKTAB etc. uses ROCKNUM
|
||||
// to give the correct table index.
|
||||
if (deck.hasKeyword("ROCKCOMP") && eclState.get3DProperties().hasDeckIntGridProperty("ROCKNUM"))
|
||||
if (deck.hasKeyword("ROCKCOMP") && eclState.fieldProps().has_int("ROCKNUM"))
|
||||
propName = "ROCKNUM";
|
||||
|
||||
// the deck does not specify the selected keyword, so everything uses the first
|
||||
// record of ROCK.
|
||||
if (eclState.get3DProperties().hasDeckIntGridProperty(propName)) {
|
||||
const std::vector<int>& tablenumData =
|
||||
eclState.get3DProperties().getIntGridProperty(propName).getData();
|
||||
if (eclState.fieldProps().has_int(propName)) {
|
||||
const auto& tmp = eclState.fieldProps().get_global_int(propName);
|
||||
unsigned numElem = vanguard.gridView().size(0);
|
||||
rockTableIdx_.resize(numElem);
|
||||
for (size_t elemIdx = 0; elemIdx < numElem; ++ elemIdx) {
|
||||
unsigned cartElemIdx = vanguard.cartesianIndex(elemIdx);
|
||||
|
||||
// reminder: Eclipse uses FORTRAN-style indices
|
||||
rockTableIdx_[elemIdx] = tablenumData[cartElemIdx] - 1;
|
||||
rockTableIdx_[elemIdx] = tmp[cartElemIdx] - 1;
|
||||
}
|
||||
}
|
||||
|
||||
@ -2425,17 +2422,14 @@ private:
|
||||
const auto& vanguard = simulator.vanguard();
|
||||
const auto& eclState = vanguard.eclState();
|
||||
const auto& eclGrid = eclState.getInputGrid();
|
||||
const auto& props = eclState.get3DProperties();
|
||||
|
||||
size_t numDof = this->model().numGridDof();
|
||||
|
||||
referencePorosity_[/*timeIdx=*/0].resize(numDof);
|
||||
|
||||
const std::vector<double>& porvData =
|
||||
props.getDoubleGridProperty("PORV").getData();
|
||||
const std::vector<int>& actnumData =
|
||||
props.getIntGridProperty("ACTNUM").getData();
|
||||
|
||||
const auto& fp = eclState.fieldProps();
|
||||
const std::vector<double> porvData = fp.porv(true);
|
||||
const std::vector<int> actnumData = fp.actnum();
|
||||
int nx = eclGrid.getNX();
|
||||
int ny = eclGrid.getNY();
|
||||
for (size_t dofIdx = 0; dofIdx < numDof; ++ dofIdx) {
|
||||
@ -2683,23 +2677,28 @@ private:
|
||||
const auto& simulator = this->simulator();
|
||||
const auto& vanguard = simulator.vanguard();
|
||||
const auto& eclState = vanguard.eclState();
|
||||
const auto& eclProps = eclState.get3DProperties();
|
||||
const auto& fp = eclState.fieldProps();
|
||||
bool has_swat = fp.has_double("SWAT");
|
||||
bool has_sgas = fp.has_double("SGAS");
|
||||
bool has_rs = fp.has_double("RS");
|
||||
bool has_rv = fp.has_double("RV");
|
||||
bool has_pressure = fp.has_double("PRESSURE");
|
||||
|
||||
// make sure all required quantities are enables
|
||||
if (FluidSystem::phaseIsActive(waterPhaseIdx) && !eclProps.hasDeckDoubleGridProperty("SWAT"))
|
||||
if (FluidSystem::phaseIsActive(waterPhaseIdx) && !has_swat)
|
||||
throw std::runtime_error("The ECL input file requires the presence of the SWAT keyword if "
|
||||
"the water phase is active");
|
||||
if (FluidSystem::phaseIsActive(gasPhaseIdx) && !eclProps.hasDeckDoubleGridProperty("SGAS"))
|
||||
if (FluidSystem::phaseIsActive(gasPhaseIdx) && !has_sgas)
|
||||
throw std::runtime_error("The ECL input file requires the presence of the SGAS keyword if "
|
||||
"the gas phase is active");
|
||||
|
||||
if (!eclProps.hasDeckDoubleGridProperty("PRESSURE"))
|
||||
if (!has_pressure)
|
||||
throw std::runtime_error("The ECL input file requires the presence of the PRESSURE "
|
||||
"keyword if the model is initialized explicitly");
|
||||
if (FluidSystem::enableDissolvedGas() && !eclProps.hasDeckDoubleGridProperty("RS"))
|
||||
if (FluidSystem::enableDissolvedGas() && !has_rs)
|
||||
throw std::runtime_error("The ECL input file requires the RS keyword to be present if"
|
||||
" dissolved gas is enabled");
|
||||
if (FluidSystem::enableVaporizedOil() && !eclProps.hasDeckDoubleGridProperty("RV"))
|
||||
if (FluidSystem::enableVaporizedOil() && !has_rv)
|
||||
throw std::runtime_error("The ECL input file requires the RV keyword to be present if"
|
||||
" vaporized oil is enabled");
|
||||
|
||||
@ -2711,28 +2710,32 @@ private:
|
||||
size_t numCartesianCells = cartSize[0] * cartSize[1] * cartSize[2];
|
||||
|
||||
std::vector<double> waterSaturationData;
|
||||
if (FluidSystem::phaseIsActive(waterPhaseIdx))
|
||||
waterSaturationData = eclProps.getDoubleGridProperty("SWAT").getData();
|
||||
else
|
||||
waterSaturationData.resize(numCartesianCells, 0.0);
|
||||
|
||||
std::vector<double> gasSaturationData;
|
||||
if (FluidSystem::phaseIsActive(gasPhaseIdx))
|
||||
gasSaturationData = eclProps.getDoubleGridProperty("SGAS").getData();
|
||||
else
|
||||
gasSaturationData.resize(numCartesianCells, 0.0);
|
||||
|
||||
const std::vector<double>& pressureData =
|
||||
eclProps.getDoubleGridProperty("PRESSURE").getData();
|
||||
std::vector<double> pressureData;
|
||||
std::vector<double> rsData;
|
||||
if (FluidSystem::enableDissolvedGas())
|
||||
rsData = eclProps.getDoubleGridProperty("RS").getData();
|
||||
std::vector<double> rvData;
|
||||
std::vector<double> tempiData;
|
||||
|
||||
if (FluidSystem::phaseIsActive(waterPhaseIdx))
|
||||
waterSaturationData = fp.get_global_double("SWAT");
|
||||
else
|
||||
waterSaturationData.resize(numCartesianCells);
|
||||
|
||||
if (FluidSystem::phaseIsActive(gasPhaseIdx))
|
||||
gasSaturationData = fp.get_global_double("SGAS");
|
||||
else
|
||||
gasSaturationData.resize(numCartesianCells);
|
||||
|
||||
pressureData = fp.get_global_double("PRESSURE");
|
||||
if (FluidSystem::enableDissolvedGas())
|
||||
rsData = fp.get_global_double("RS");
|
||||
|
||||
if (FluidSystem::enableVaporizedOil())
|
||||
rvData = eclProps.getDoubleGridProperty("RV").getData();
|
||||
rvData = fp.get_global_double("RV");
|
||||
|
||||
// initial reservoir temperature
|
||||
const std::vector<double>& tempiData =
|
||||
eclState.get3DProperties().getDoubleGridProperty("TEMPI").getData();
|
||||
tempiData = fp.get_global_double("TEMPI");
|
||||
|
||||
|
||||
// make sure that the size of the data arrays is correct
|
||||
#ifndef NDEBUG
|
||||
@ -2830,8 +2833,12 @@ private:
|
||||
const auto& eclState = vanguard.eclState();
|
||||
size_t numDof = this->model().numGridDof();
|
||||
|
||||
|
||||
if (enableSolvent) {
|
||||
const std::vector<double>& solventSaturationData = eclState.get3DProperties().getDoubleGridProperty("SSOL").getData();
|
||||
std::vector<double> solventSaturationData(eclState.getInputGrid().getCartesianSize(), 0.0);
|
||||
if (eclState.fieldProps().has_double("SSOL"))
|
||||
solventSaturationData = eclState.fieldProps().get_global_double("SSOL");
|
||||
|
||||
solventSaturation_.resize(numDof, 0.0);
|
||||
for (size_t dofIdx = 0; dofIdx < numDof; ++dofIdx) {
|
||||
size_t cartesianDofIdx = vanguard.cartesianIndex(dofIdx);
|
||||
@ -2842,7 +2849,10 @@ private:
|
||||
}
|
||||
|
||||
if (enablePolymer) {
|
||||
const std::vector<double>& polyConcentrationData = eclState.get3DProperties().getDoubleGridProperty("SPOLY").getData();
|
||||
std::vector<double> polyConcentrationData(eclState.getInputGrid().getCartesianSize(), 0.0);
|
||||
if (eclState.fieldProps().has_double("SPOLY"))
|
||||
polyConcentrationData = eclState.fieldProps().get_global_double("SPOLY");
|
||||
|
||||
polymerConcentration_.resize(numDof, 0.0);
|
||||
for (size_t dofIdx = 0; dofIdx < numDof; ++dofIdx) {
|
||||
size_t cartesianDofIdx = vanguard.cartesianIndex(dofIdx);
|
||||
@ -2853,7 +2863,9 @@ private:
|
||||
}
|
||||
|
||||
if (enablePolymerMolarWeight) {
|
||||
const std::vector<double>& polyMoleWeightData = eclState.get3DProperties().getDoubleGridProperty("SPOLYMW").getData();
|
||||
std::vector<double> polyMoleWeightData(eclState.getInputGrid().getCartesianSize(), 0.0);
|
||||
if (eclState.fieldProps().has_double("SPOLYMW"))
|
||||
polyMoleWeightData = eclState.fieldProps().get_global_double("SPOLYMW");
|
||||
polymerMoleWeight_.resize(numDof, 0.0);
|
||||
for (size_t dofIdx = 0; dofIdx < numDof; ++dofIdx) {
|
||||
const size_t cartesianDofIdx = vanguard.cartesianIndex(dofIdx);
|
||||
@ -2911,16 +2923,24 @@ private:
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static bool has_int_prop(const EclipseState& eclState, const std::string& prop) {
|
||||
return eclState.fieldProps().has_int(prop);
|
||||
}
|
||||
|
||||
static std::vector<int> get_int_prop(const EclipseState& eclState, const std::string& prop) {
|
||||
return eclState.fieldProps().get_global_int(prop);
|
||||
}
|
||||
|
||||
void updatePvtnum_()
|
||||
{
|
||||
const auto& simulator = this->simulator();
|
||||
const auto& eclState = simulator.vanguard().eclState();
|
||||
const auto& eclProps = eclState.get3DProperties();
|
||||
|
||||
if (!eclProps.hasDeckIntGridProperty("PVTNUM"))
|
||||
if (!has_int_prop(eclState, "PVTNUM"))
|
||||
return;
|
||||
|
||||
const auto& pvtnumData = eclProps.getIntGridProperty("PVTNUM").getData();
|
||||
const auto& pvtnumData = get_int_prop(eclState, "PVTNUM");
|
||||
const auto& vanguard = simulator.vanguard();
|
||||
|
||||
unsigned numElems = vanguard.gridView().size(/*codim=*/0);
|
||||
@ -2935,12 +2955,11 @@ private:
|
||||
{
|
||||
const auto& simulator = this->simulator();
|
||||
const auto& eclState = simulator.vanguard().eclState();
|
||||
const auto& eclProps = eclState.get3DProperties();
|
||||
|
||||
if (!eclProps.hasDeckIntGridProperty("SATNUM"))
|
||||
if (!has_int_prop(eclState, "SATNUM"))
|
||||
return;
|
||||
|
||||
const auto& satnumData = eclProps.getIntGridProperty("SATNUM").getData();
|
||||
const auto& satnumData = get_int_prop(eclState, "SATNUM");
|
||||
const auto& vanguard = simulator.vanguard();
|
||||
|
||||
unsigned numElems = vanguard.gridView().size(/*codim=*/0);
|
||||
@ -2955,12 +2974,11 @@ private:
|
||||
{
|
||||
const auto& simulator = this->simulator();
|
||||
const auto& eclState = simulator.vanguard().eclState();
|
||||
const auto& eclProps = eclState.get3DProperties();
|
||||
|
||||
if (!eclProps.hasDeckIntGridProperty("MISCNUM"))
|
||||
if (!has_int_prop(eclState, "MISCNUM"))
|
||||
return;
|
||||
|
||||
const auto& miscnumData = eclProps.getIntGridProperty("MISCNUM").getData();
|
||||
const auto& miscnumData = get_int_prop(eclState, "MISCNUM");
|
||||
const auto& vanguard = simulator.vanguard();
|
||||
|
||||
unsigned numElems = vanguard.gridView().size(/*codim=*/0);
|
||||
@ -2975,12 +2993,11 @@ private:
|
||||
{
|
||||
const auto& simulator = this->simulator();
|
||||
const auto& eclState = simulator.vanguard().eclState();
|
||||
const auto& eclProps = eclState.get3DProperties();
|
||||
|
||||
if (!eclProps.hasDeckIntGridProperty("PLMIXNUM"))
|
||||
if (!has_int_prop(eclState, "PLMIXNUM"))
|
||||
return;
|
||||
|
||||
const auto& plmixnumData = eclProps.getIntGridProperty("PLMIXNUM").getData();
|
||||
const auto& plmixnumData = get_int_prop(eclState, "PLMIXNUM");
|
||||
const auto& vanguard = simulator.vanguard();
|
||||
|
||||
unsigned numElems = vanguard.gridView().size(/*codim=*/0);
|
||||
|
@ -35,6 +35,7 @@
|
||||
|
||||
#include <opm/parser/eclipse/Deck/Deck.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/EclipseState.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Grid/FieldPropsManager.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Grid/GridProperty.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Tables/Eqldims.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/SimulationConfig/SimulationConfig.hpp>
|
||||
@ -122,13 +123,11 @@ public:
|
||||
}
|
||||
|
||||
// internalize the data specified using the EQLNUM keyword
|
||||
const std::vector<int>& equilRegionData =
|
||||
eclState.get3DProperties().getIntGridProperty("EQLNUM").getData();
|
||||
const auto& fp = eclState.fieldProps();
|
||||
const auto& equilRegionData = fp.get_global_int("EQLNUM");
|
||||
elemEquilRegion_.resize(numElements, 0);
|
||||
for (unsigned elemIdx = 0; elemIdx < numElements; ++elemIdx) {
|
||||
int cartElemIdx = vanguard.cartesianIndex(elemIdx);
|
||||
|
||||
// ECL uses Fortran-style indices but we want C-style ones!
|
||||
elemEquilRegion_[elemIdx] = equilRegionData[cartElemIdx] - 1;
|
||||
}
|
||||
|
||||
|
@ -34,6 +34,7 @@
|
||||
|
||||
#include <opm/parser/eclipse/EclipseState/EclipseState.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Grid/GridProperties.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Grid/FieldPropsManager.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Grid/FaceDir.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Grid/TransMult.hpp>
|
||||
#include <opm/parser/eclipse/Units/Units.hpp>
|
||||
@ -491,21 +492,19 @@ private:
|
||||
const auto& gridView = vanguard_.gridView();
|
||||
const auto& cartMapper = vanguard_.cartesianIndexMapper();
|
||||
const auto& cartDims = cartMapper.cartesianDimensions();
|
||||
const auto& properties = vanguard_.eclState().get3DProperties();
|
||||
|
||||
#if DUNE_VERSION_NEWER(DUNE_GRID, 2,6)
|
||||
ElementMapper elemMapper(gridView, Dune::mcmgElementLayout());
|
||||
#else
|
||||
ElementMapper elemMapper(gridView);
|
||||
#endif
|
||||
|
||||
const auto& inputTranx = properties.getDoubleGridProperty("TRANX");
|
||||
const auto& inputTrany = properties.getDoubleGridProperty("TRANY");
|
||||
const auto& inputTranz = properties.getDoubleGridProperty("TRANZ");
|
||||
const auto& inputTranxData = properties.getDoubleGridProperty("TRANX").getData();
|
||||
const auto& inputTranyData = properties.getDoubleGridProperty("TRANY").getData();
|
||||
const auto& inputTranzData = properties.getDoubleGridProperty("TRANZ").getData();
|
||||
|
||||
const auto& fp = vanguard_.eclState().fieldProps();
|
||||
const auto& inputTranxData = fp.get_global_double("TRANX");
|
||||
const auto& inputTranyData = fp.get_global_double("TRANY");
|
||||
const auto& inputTranzData = fp.get_global_double("TRANZ");
|
||||
bool tranx_deckAssigned = false; // Ohh my ....
|
||||
bool trany_deckAssigned = false;
|
||||
bool tranz_deckAssigned = false;
|
||||
// compute the transmissibilities for all intersections
|
||||
auto elemIt = gridView.template begin</*codim=*/ 0>();
|
||||
const auto& elemEndIt = gridView.template end</*codim=*/ 0>();
|
||||
@ -532,7 +531,7 @@ private:
|
||||
int gc2 = std::max(cartMapper.cartesianIndex(c1), cartMapper.cartesianIndex(c2));
|
||||
|
||||
if (gc2 - gc1 == 1) {
|
||||
if (inputTranx.deckAssigned())
|
||||
if (tranx_deckAssigned)
|
||||
// set simulator internal transmissibilities to values from inputTranx
|
||||
trans_[isId] = inputTranxData[gc1];
|
||||
else
|
||||
@ -540,7 +539,7 @@ private:
|
||||
trans_[isId] *= inputTranxData[gc1];
|
||||
}
|
||||
else if (gc2 - gc1 == cartDims[0]) {
|
||||
if (inputTrany.deckAssigned())
|
||||
if (trany_deckAssigned)
|
||||
// set simulator internal transmissibilities to values from inputTrany
|
||||
trans_[isId] = inputTranyData[gc1];
|
||||
else
|
||||
@ -548,7 +547,7 @@ private:
|
||||
trans_[isId] *= inputTranyData[gc1];
|
||||
}
|
||||
else if (gc2 - gc1 == cartDims[0]*cartDims[1]) {
|
||||
if (inputTranz.deckAssigned())
|
||||
if (tranz_deckAssigned)
|
||||
// set simulator internal transmissibilities to values from inputTranz
|
||||
trans_[isId] = inputTranzData[gc1];
|
||||
else
|
||||
@ -703,8 +702,6 @@ private:
|
||||
|
||||
void extractPermeability_()
|
||||
{
|
||||
const auto& props = vanguard_.eclState().get3DProperties();
|
||||
|
||||
unsigned numElem = vanguard_.gridView().size(/*codim=*/0);
|
||||
permeability_.resize(numElem);
|
||||
|
||||
@ -712,15 +709,17 @@ private:
|
||||
// provided by eclState are one-per-cell of "uncompressed" grid, whereas the
|
||||
// simulation grid might remove a few elements. (e.g. because it is distributed
|
||||
// over several processes.)
|
||||
if (props.hasDeckDoubleGridProperty("PERMX")) {
|
||||
const std::vector<double>& permxData =
|
||||
props.getDoubleGridProperty("PERMX").getData();
|
||||
const auto& fp = vanguard_.eclState().fieldProps();
|
||||
if (fp.has_double("PERMX")) {
|
||||
const std::vector<double>& permxData = fp.get_global_double("PERMX");
|
||||
|
||||
std::vector<double> permyData(permxData);
|
||||
if (props.hasDeckDoubleGridProperty("PERMY"))
|
||||
permyData = props.getDoubleGridProperty("PERMY").getData();
|
||||
if (fp.has_double("PERMY"))
|
||||
permyData = fp.get_global_double("PERMY");
|
||||
|
||||
std::vector<double> permzData(permxData);
|
||||
if (props.hasDeckDoubleGridProperty("PERMZ"))
|
||||
permzData = props.getDoubleGridProperty("PERMZ").getData();
|
||||
if (fp.has_double("PERMZ"))
|
||||
permzData = fp.get_global_double("PERMZ");
|
||||
|
||||
for (size_t dofIdx = 0; dofIdx < numElem; ++ dofIdx) {
|
||||
unsigned cartesianElemIdx = vanguard_.cartesianIndex(dofIdx);
|
||||
@ -731,6 +730,7 @@ private:
|
||||
}
|
||||
|
||||
// for now we don't care about non-diagonal entries
|
||||
|
||||
}
|
||||
else
|
||||
throw std::logic_error("Can't read the intrinsic permeability from the ecl state. "
|
||||
@ -859,22 +859,19 @@ private:
|
||||
// cells merged as an result of minpv.
|
||||
const auto& eclState = vanguard_.eclState();
|
||||
const auto& eclGrid = eclState.getInputGrid();
|
||||
|
||||
const std::vector<double>& ntg =
|
||||
eclState.get3DProperties().getDoubleGridProperty("NTG").getData();
|
||||
|
||||
averageNtg = ntg;
|
||||
|
||||
bool opmfil = eclGrid.getMinpvMode() == Opm::MinpvMode::OpmFIL;
|
||||
std::vector<double> ntg;
|
||||
|
||||
ntg = eclState.fieldProps().get_global_double("NTG");
|
||||
// just return the unmodified ntg if opmfil is not used
|
||||
averageNtg = ntg;
|
||||
if (!opmfil)
|
||||
return;
|
||||
|
||||
const auto& porv = eclState.get3DProperties().getDoubleGridProperty("PORV").getData();
|
||||
const auto& actnum = eclState.get3DProperties().getIntGridProperty("ACTNUM").getData();
|
||||
const auto& cartMapper = vanguard_.cartesianIndexMapper();
|
||||
const auto& cartDims = cartMapper.cartesianDimensions();
|
||||
const auto& actnum = eclState.fieldProps().actnum();
|
||||
const auto& porv = eclState.fieldProps().porv(true);
|
||||
assert(dimWorld > 1);
|
||||
const size_t nxny = cartDims[0] * cartDims[1];
|
||||
for (size_t cartesianCellIdx = 0; cartesianCellIdx < ntg.size(); ++cartesianCellIdx) {
|
||||
|
@ -406,7 +406,7 @@ public:
|
||||
void beginRestart()
|
||||
{
|
||||
bool enableHysteresis = simulator_.problem().materialLawManager()->enableHysteresis();
|
||||
bool enableSwatinit = simulator_.vanguard().eclState().get3DProperties().hasDeckDoubleGridProperty("SWATINIT");
|
||||
bool enableSwatinit = simulator_.vanguard().eclState().fieldProps().has_double("SWATINIT");
|
||||
std::vector<Opm::RestartKey> solutionKeys{
|
||||
{"PRESSURE", Opm::UnitSystem::measure::pressure},
|
||||
{"SWAT", Opm::UnitSystem::measure::identity, static_cast<bool>(FluidSystem::phaseIsActive(FluidSystem::waterPhaseIdx))},
|
||||
|
@ -901,24 +901,19 @@ std::vector<int>
|
||||
equilnum(const Opm::EclipseState& eclipseState,
|
||||
const Grid& grid)
|
||||
{
|
||||
std::vector<int> eqlnum;
|
||||
if (eclipseState.get3DProperties().hasDeckIntGridProperty("EQLNUM")) {
|
||||
std::vector<int> eqlnum(grid.size(0), 0);
|
||||
|
||||
if (eclipseState.fieldProps().has<int>("EQLNUM")) {
|
||||
const int nc = grid.size(/*codim=*/0);
|
||||
eqlnum.resize(nc);
|
||||
const std::vector<int>& e =
|
||||
eclipseState.get3DProperties().getIntGridProperty("EQLNUM").getData();
|
||||
|
||||
const auto& e = eclipseState.fieldProps().get_global<int>("EQLNUM");
|
||||
const int* gc = Opm::UgGridHelpers::globalCell(grid);
|
||||
for (int cell = 0; cell < nc; ++cell) {
|
||||
const int deckPos = (gc == NULL) ? cell : gc[cell];
|
||||
eqlnum[cell] = e[deckPos] - 1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
// No explicit equilibration region.
|
||||
// All cells in region zero.
|
||||
eqlnum.assign(grid.size(/*codim=*/0), 0);
|
||||
}
|
||||
|
||||
return eqlnum;
|
||||
}
|
||||
|
||||
@ -945,17 +940,21 @@ public:
|
||||
rv_(grid.size(/*codim=*/0))
|
||||
{
|
||||
//Check for presence of kw SWATINIT
|
||||
if (eclipseState.get3DProperties().hasDeckDoubleGridProperty("SWATINIT") && applySwatInit) {
|
||||
const std::vector<double>& swatInitEcl = eclipseState.
|
||||
get3DProperties().getDoubleGridProperty("SWATINIT").getData();
|
||||
if (applySwatInit) {
|
||||
const int nc = grid.size(/*codim=*/0);
|
||||
swatInit_.resize(nc);
|
||||
|
||||
if (eclipseState.fieldProps().has<double>("SWATINIT")) {
|
||||
const std::vector<double>& swatInitEcl = eclipseState.fieldProps().get_global<double>("SWATINIT");
|
||||
const int* gc = Opm::UgGridHelpers::globalCell(grid);
|
||||
swatInit_.resize(nc);
|
||||
for (int c = 0; c < nc; ++c) {
|
||||
const int deckPos = (gc == NULL) ? c : gc[c];
|
||||
swatInit_[c] = swatInitEcl[deckPos];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Get the equilibration records.
|
||||
const std::vector<Opm::EquilRecord> rec = getEquil(eclipseState);
|
||||
const auto& tables = eclipseState.getTableManager();
|
||||
@ -1061,7 +1060,7 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
// extract the initial temperature
|
||||
// EXTRACT the initial temperature
|
||||
updateInitialTemperature_(eclipseState);
|
||||
|
||||
// Compute pressures, saturations, rs and rv factors.
|
||||
@ -1084,9 +1083,7 @@ private:
|
||||
void updateInitialTemperature_(const Opm::EclipseState& eclState)
|
||||
{
|
||||
// Get the initial temperature data
|
||||
const std::vector<double>& tempiData =
|
||||
eclState.get3DProperties().getDoubleGridProperty("TEMPI").getData();
|
||||
|
||||
std::vector<double> tempiData = eclState.fieldProps().get_global<double>("TEMPI");
|
||||
temperature_ = tempiData;
|
||||
}
|
||||
|
||||
@ -1109,8 +1106,7 @@ private:
|
||||
std::vector<int> cellPvtRegionIdx(numCompressed);
|
||||
|
||||
//Get the PVTNUM data
|
||||
const std::vector<int>& pvtnumData = eclState.get3DProperties().getIntGridProperty("PVTNUM").getData();
|
||||
|
||||
const auto pvtnumData = eclState.fieldProps().get_global<int>("PVTNUM");
|
||||
// Convert PVTNUM data into an array of indices for compressed cells. Remember
|
||||
// that Eclipse uses Fortran-style indices which start at 1 instead of 0, so we
|
||||
// need to subtract 1.
|
||||
|
@ -53,6 +53,7 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <string.h>
|
||||
|
||||
#define CHECK(value, expected) \
|
||||
{ \
|
||||
if ((value) != (expected)) { \
|
||||
|
@ -1056,17 +1056,21 @@ int main(int argc, char** argv)
|
||||
typedef TTAG(TestEquilTypeTag) TypeTag;
|
||||
Opm::registerAllParameters_<TypeTag>();
|
||||
|
||||
/*
|
||||
test_PhasePressure();
|
||||
test_CellSubset();
|
||||
test_RegMapping();
|
||||
test_DeckAllDead();
|
||||
test_CapillaryInversion();
|
||||
*/
|
||||
test_DeckWithCapillary();
|
||||
/*
|
||||
test_DeckWithCapillaryOverlap();
|
||||
test_DeckWithLiveOil();
|
||||
test_DeckWithLiveGas();
|
||||
test_DeckWithRSVDAndRVVD();
|
||||
test_DeckWithPBVDAndPDVD();
|
||||
*/
|
||||
//test_DeckWithSwatinit();
|
||||
|
||||
return 0;
|
||||
|
Loading…
Reference in New Issue
Block a user