changed: make initParamsForElements public

This commit is contained in:
Arne Morten Kvarving
2020-01-20 15:29:56 +01:00
parent fcf113509e
commit 14eff62913

View File

@@ -148,9 +148,215 @@ public:
stoneEtas[satRegionIdx] = deck.getKeyword("STONE1EX").getRecord(satRegionIdx).getItem(0).getSIDouble(0);
}
initParamsForElements_(eclState, compressedToCartesianElemIdx);
initParamsForElements(eclState, compressedToCartesianElemIdx);
}
void initParamsForElements(const EclipseState& eclState,
const std::vector<int>& compressedToCartesianElemIdx)
{
// get the number of saturation regions
const size_t numSatRegions = eclState.runspec().tabdims().getNumSatTables();
// setup the saturation region specific parameters
gasOilUnscaledPointsVector_.resize(numSatRegions);
oilWaterUnscaledPointsVector_.resize(numSatRegions);
gasOilEffectiveParamVector_.resize(numSatRegions);
oilWaterEffectiveParamVector_.resize(numSatRegions);
for (unsigned satRegionIdx = 0; satRegionIdx < numSatRegions; ++satRegionIdx) {
// unscaled points for end-point scaling
readGasOilUnscaledPoints_(gasOilUnscaledPointsVector_, gasOilConfig, eclState, satRegionIdx);
readOilWaterUnscaledPoints_(oilWaterUnscaledPointsVector_, oilWaterConfig, eclState, satRegionIdx);
// the parameters for the effective two-phase matererial laws
readGasOilEffectiveParameters_(gasOilEffectiveParamVector_, eclState, satRegionIdx);
readOilWaterEffectiveParameters_(oilWaterEffectiveParamVector_, eclState, satRegionIdx);
}
unsigned numCompressedElems = static_cast<unsigned>(compressedToCartesianElemIdx.size());
// copy the SATNUM grid property. in some cases this is not necessary, but it
// should not require much memory anyway...
satnumRegionArray_.resize(numCompressedElems);
if (eclState.fieldProps().has<int>("SATNUM")) {
const auto& satnumRawData = eclState.fieldProps().get_global<int>("SATNUM");
for (unsigned elemIdx = 0; elemIdx < numCompressedElems; ++elemIdx) {
unsigned cartesianElemIdx = static_cast<unsigned>(compressedToCartesianElemIdx[elemIdx]);
satnumRegionArray_[elemIdx] = satnumRawData[cartesianElemIdx] - 1;
}
}
else
std::fill(satnumRegionArray_.begin(), satnumRegionArray_.end(), 0);
// create the information for the imbibition region (IMBNUM). By default this is
// the same as the saturation region (SATNUM)
imbnumRegionArray_ = satnumRegionArray_;
if (eclState.fieldProps().has<int>("IMBNUM")) {
const auto& imbnumRawData = eclState.fieldProps().get_global<int>("IMBNUM");
for (unsigned elemIdx = 0; elemIdx < numCompressedElems; ++elemIdx) {
int cartesianElemIdx = compressedToCartesianElemIdx[elemIdx];
imbnumRegionArray_[elemIdx] = imbnumRawData[cartesianElemIdx] - 1;
}
}
// read the scaled end point scaling parameters which are specific for each
// element
GasOilScalingInfoVector gasOilScaledInfoVector(numCompressedElems);
oilWaterScaledEpsInfoDrainage_.resize(numCompressedElems);
GasOilScalingInfoVector gasOilScaledImbInfoVector;
OilWaterScalingInfoVector oilWaterScaledImbInfoVector;
GasOilScalingPointsVector gasOilScaledPointsVector(numCompressedElems);
GasOilScalingPointsVector oilWaterScaledEpsPointsDrainage(numCompressedElems);
GasOilScalingPointsVector gasOilScaledImbPointsVector;
OilWaterScalingPointsVector oilWaterScaledImbPointsVector;
if (enableHysteresis()) {
gasOilScaledImbInfoVector.resize(numCompressedElems);
gasOilScaledImbPointsVector.resize(numCompressedElems);
oilWaterScaledImbInfoVector.resize(numCompressedElems);
oilWaterScaledImbPointsVector.resize(numCompressedElems);
}
EclEpsGridProperties epsGridProperties(eclState, false, compressedToCartesianElemIdx);
for (unsigned elemIdx = 0; elemIdx < numCompressedElems; ++elemIdx) {
readGasOilScaledPoints_(gasOilScaledInfoVector,
gasOilScaledPointsVector,
gasOilConfig,
eclState,
epsGridProperties,
elemIdx);
readOilWaterScaledPoints_(oilWaterScaledEpsInfoDrainage_,
oilWaterScaledEpsPointsDrainage,
oilWaterConfig,
eclState,
epsGridProperties,
elemIdx);
}
if (enableHysteresis()) {
EclEpsGridProperties epsImbGridProperties(eclState, true, compressedToCartesianElemIdx);
for (unsigned elemIdx = 0; elemIdx < numCompressedElems; ++elemIdx) {
readGasOilScaledPoints_(gasOilScaledImbInfoVector,
gasOilScaledImbPointsVector,
gasOilConfig,
eclState,
epsImbGridProperties,
elemIdx);
readOilWaterScaledPoints_(oilWaterScaledImbInfoVector,
oilWaterScaledImbPointsVector,
oilWaterConfig,
eclState,
epsImbGridProperties,
elemIdx);
}
}
// create the parameter objects for the two-phase laws
GasOilParamVector gasOilParams(numCompressedElems);
OilWaterParamVector oilWaterParams(numCompressedElems);
GasOilParamVector gasOilImbParams;
OilWaterParamVector oilWaterImbParams;
if (enableHysteresis()) {
gasOilImbParams.resize(numCompressedElems);
oilWaterImbParams.resize(numCompressedElems);
}
assert(numCompressedElems == satnumRegionArray_.size());
assert(!enableHysteresis() || numCompressedElems == imbnumRegionArray_.size());
for (unsigned elemIdx = 0; elemIdx < numCompressedElems; ++elemIdx) {
unsigned satRegionIdx = static_cast<unsigned>(satnumRegionArray_[elemIdx]);
gasOilParams[elemIdx] = std::make_shared<GasOilTwoPhaseHystParams>();
oilWaterParams[elemIdx] = std::make_shared<OilWaterTwoPhaseHystParams>();
gasOilParams[elemIdx]->setConfig(hysteresisConfig_);
oilWaterParams[elemIdx]->setConfig(hysteresisConfig_);
if (hasGas && hasOil) {
auto gasOilDrainParams = std::make_shared<GasOilEpsTwoPhaseParams>();
gasOilDrainParams->setConfig(gasOilConfig);
gasOilDrainParams->setUnscaledPoints(gasOilUnscaledPointsVector_[satRegionIdx]);
gasOilDrainParams->setScaledPoints(gasOilScaledPointsVector[elemIdx]);
gasOilDrainParams->setEffectiveLawParams(gasOilEffectiveParamVector_[satRegionIdx]);
gasOilDrainParams->finalize();
gasOilParams[elemIdx]->setDrainageParams(gasOilDrainParams,
*gasOilScaledInfoVector[elemIdx],
EclGasOilSystem);
}
if (hasOil && hasWater) {
auto oilWaterDrainParams = std::make_shared<OilWaterEpsTwoPhaseParams>();
oilWaterDrainParams->setConfig(oilWaterConfig);
oilWaterDrainParams->setUnscaledPoints(oilWaterUnscaledPointsVector_[satRegionIdx]);
oilWaterDrainParams->setScaledPoints(oilWaterScaledEpsPointsDrainage[elemIdx]);
oilWaterDrainParams->setEffectiveLawParams(oilWaterEffectiveParamVector_[satRegionIdx]);
oilWaterDrainParams->finalize();
oilWaterParams[elemIdx]->setDrainageParams(oilWaterDrainParams,
*oilWaterScaledEpsInfoDrainage_[elemIdx],
EclOilWaterSystem);
}
if (enableHysteresis()) {
unsigned imbRegionIdx = imbnumRegionArray_[elemIdx];
if (hasGas && hasOil) {
auto gasOilImbParamsHyst = std::make_shared<GasOilEpsTwoPhaseParams>();
gasOilImbParamsHyst->setConfig(gasOilConfig);
gasOilImbParamsHyst->setUnscaledPoints(gasOilUnscaledPointsVector_[imbRegionIdx]);
gasOilImbParamsHyst->setScaledPoints(gasOilScaledImbPointsVector[elemIdx]);
gasOilImbParamsHyst->setEffectiveLawParams(gasOilEffectiveParamVector_[imbRegionIdx]);
gasOilImbParamsHyst->finalize();
gasOilParams[elemIdx]->setImbibitionParams(gasOilImbParamsHyst,
*gasOilScaledImbInfoVector[elemIdx],
EclGasOilSystem);
}
if (hasOil && hasWater) {
auto oilWaterImbParamsHyst = std::make_shared<OilWaterEpsTwoPhaseParams>();
oilWaterImbParamsHyst->setConfig(oilWaterConfig);
oilWaterImbParamsHyst->setUnscaledPoints(oilWaterUnscaledPointsVector_[imbRegionIdx]);
oilWaterImbParamsHyst->setScaledPoints(oilWaterScaledImbPointsVector[elemIdx]);
oilWaterImbParamsHyst->setEffectiveLawParams(oilWaterEffectiveParamVector_[imbRegionIdx]);
oilWaterImbParamsHyst->finalize();
oilWaterParams[elemIdx]->setImbibitionParams(oilWaterImbParamsHyst,
*gasOilScaledImbInfoVector[elemIdx],
EclGasOilSystem);
}
}
if (hasGas && hasOil)
gasOilParams[elemIdx]->finalize();
if (hasOil && hasWater)
oilWaterParams[elemIdx]->finalize();
}
// create the parameter objects for the three-phase law
materialLawParams_.resize(numCompressedElems);
for (unsigned elemIdx = 0; elemIdx < numCompressedElems; ++elemIdx) {
materialLawParams_[elemIdx] = std::make_shared<MaterialLawParams>();
unsigned satRegionIdx = static_cast<unsigned>(satnumRegionArray_[elemIdx]);
initThreePhaseParams_(eclState,
*materialLawParams_[elemIdx],
satRegionIdx,
*oilWaterScaledEpsInfoDrainage_[elemIdx],
oilWaterParams[elemIdx],
gasOilParams[elemIdx]);
materialLawParams_[elemIdx]->finalize();
}
}
/*!
* \brief Modify the initial condition according to the SWATINIT keyword.
*
@@ -464,211 +670,6 @@ private:
}
}
void initParamsForElements_(const EclipseState& eclState,
const std::vector<int>& compressedToCartesianElemIdx)
{
// get the number of saturation regions
const size_t numSatRegions = eclState.runspec().tabdims().getNumSatTables();
// setup the saturation region specific parameters
gasOilUnscaledPointsVector_.resize(numSatRegions);
oilWaterUnscaledPointsVector_.resize(numSatRegions);
gasOilEffectiveParamVector_.resize(numSatRegions);
oilWaterEffectiveParamVector_.resize(numSatRegions);
for (unsigned satRegionIdx = 0; satRegionIdx < numSatRegions; ++satRegionIdx) {
// unscaled points for end-point scaling
readGasOilUnscaledPoints_(gasOilUnscaledPointsVector_, gasOilConfig, eclState, satRegionIdx);
readOilWaterUnscaledPoints_(oilWaterUnscaledPointsVector_, oilWaterConfig, eclState, satRegionIdx);
// the parameters for the effective two-phase matererial laws
readGasOilEffectiveParameters_(gasOilEffectiveParamVector_, eclState, satRegionIdx);
readOilWaterEffectiveParameters_(oilWaterEffectiveParamVector_, eclState, satRegionIdx);
}
unsigned numCompressedElems = static_cast<unsigned>(compressedToCartesianElemIdx.size());
// copy the SATNUM grid property. in some cases this is not necessary, but it
// should not require much memory anyway...
satnumRegionArray_.resize(numCompressedElems);
if (eclState.fieldProps().has<int>("SATNUM")) {
const auto& satnumRawData = eclState.fieldProps().get_global<int>("SATNUM");
for (unsigned elemIdx = 0; elemIdx < numCompressedElems; ++elemIdx) {
unsigned cartesianElemIdx = static_cast<unsigned>(compressedToCartesianElemIdx[elemIdx]);
satnumRegionArray_[elemIdx] = satnumRawData[cartesianElemIdx] - 1;
}
}
else
std::fill(satnumRegionArray_.begin(), satnumRegionArray_.end(), 0);
// create the information for the imbibition region (IMBNUM). By default this is
// the same as the saturation region (SATNUM)
imbnumRegionArray_ = satnumRegionArray_;
if (eclState.fieldProps().has<int>("IMBNUM")) {
const auto& imbnumRawData = eclState.fieldProps().get_global<int>("IMBNUM");
for (unsigned elemIdx = 0; elemIdx < numCompressedElems; ++elemIdx) {
int cartesianElemIdx = compressedToCartesianElemIdx[elemIdx];
imbnumRegionArray_[elemIdx] = imbnumRawData[cartesianElemIdx] - 1;
}
}
// read the scaled end point scaling parameters which are specific for each
// element
GasOilScalingInfoVector gasOilScaledInfoVector(numCompressedElems);
oilWaterScaledEpsInfoDrainage_.resize(numCompressedElems);
GasOilScalingInfoVector gasOilScaledImbInfoVector;
OilWaterScalingInfoVector oilWaterScaledImbInfoVector;
GasOilScalingPointsVector gasOilScaledPointsVector(numCompressedElems);
GasOilScalingPointsVector oilWaterScaledEpsPointsDrainage(numCompressedElems);
GasOilScalingPointsVector gasOilScaledImbPointsVector;
OilWaterScalingPointsVector oilWaterScaledImbPointsVector;
if (enableHysteresis()) {
gasOilScaledImbInfoVector.resize(numCompressedElems);
gasOilScaledImbPointsVector.resize(numCompressedElems);
oilWaterScaledImbInfoVector.resize(numCompressedElems);
oilWaterScaledImbPointsVector.resize(numCompressedElems);
}
EclEpsGridProperties epsGridProperties(eclState, false, compressedToCartesianElemIdx);
for (unsigned elemIdx = 0; elemIdx < numCompressedElems; ++elemIdx) {
readGasOilScaledPoints_(gasOilScaledInfoVector,
gasOilScaledPointsVector,
gasOilConfig,
eclState,
epsGridProperties,
elemIdx);
readOilWaterScaledPoints_(oilWaterScaledEpsInfoDrainage_,
oilWaterScaledEpsPointsDrainage,
oilWaterConfig,
eclState,
epsGridProperties,
elemIdx);
}
if (enableHysteresis()) {
EclEpsGridProperties epsImbGridProperties(eclState, true, compressedToCartesianElemIdx);
for (unsigned elemIdx = 0; elemIdx < numCompressedElems; ++elemIdx) {
readGasOilScaledPoints_(gasOilScaledImbInfoVector,
gasOilScaledImbPointsVector,
gasOilConfig,
eclState,
epsImbGridProperties,
elemIdx);
readOilWaterScaledPoints_(oilWaterScaledImbInfoVector,
oilWaterScaledImbPointsVector,
oilWaterConfig,
eclState,
epsImbGridProperties,
elemIdx);
}
}
// create the parameter objects for the two-phase laws
GasOilParamVector gasOilParams(numCompressedElems);
OilWaterParamVector oilWaterParams(numCompressedElems);
GasOilParamVector gasOilImbParams;
OilWaterParamVector oilWaterImbParams;
if (enableHysteresis()) {
gasOilImbParams.resize(numCompressedElems);
oilWaterImbParams.resize(numCompressedElems);
}
assert(numCompressedElems == satnumRegionArray_.size());
assert(!enableHysteresis() || numCompressedElems == imbnumRegionArray_.size());
for (unsigned elemIdx = 0; elemIdx < numCompressedElems; ++elemIdx) {
unsigned satRegionIdx = static_cast<unsigned>(satnumRegionArray_[elemIdx]);
gasOilParams[elemIdx] = std::make_shared<GasOilTwoPhaseHystParams>();
oilWaterParams[elemIdx] = std::make_shared<OilWaterTwoPhaseHystParams>();
gasOilParams[elemIdx]->setConfig(hysteresisConfig_);
oilWaterParams[elemIdx]->setConfig(hysteresisConfig_);
if (hasGas && hasOil) {
auto gasOilDrainParams = std::make_shared<GasOilEpsTwoPhaseParams>();
gasOilDrainParams->setConfig(gasOilConfig);
gasOilDrainParams->setUnscaledPoints(gasOilUnscaledPointsVector_[satRegionIdx]);
gasOilDrainParams->setScaledPoints(gasOilScaledPointsVector[elemIdx]);
gasOilDrainParams->setEffectiveLawParams(gasOilEffectiveParamVector_[satRegionIdx]);
gasOilDrainParams->finalize();
gasOilParams[elemIdx]->setDrainageParams(gasOilDrainParams,
*gasOilScaledInfoVector[elemIdx],
EclGasOilSystem);
}
if (hasOil && hasWater) {
auto oilWaterDrainParams = std::make_shared<OilWaterEpsTwoPhaseParams>();
oilWaterDrainParams->setConfig(oilWaterConfig);
oilWaterDrainParams->setUnscaledPoints(oilWaterUnscaledPointsVector_[satRegionIdx]);
oilWaterDrainParams->setScaledPoints(oilWaterScaledEpsPointsDrainage[elemIdx]);
oilWaterDrainParams->setEffectiveLawParams(oilWaterEffectiveParamVector_[satRegionIdx]);
oilWaterDrainParams->finalize();
oilWaterParams[elemIdx]->setDrainageParams(oilWaterDrainParams,
*oilWaterScaledEpsInfoDrainage_[elemIdx],
EclOilWaterSystem);
}
if (enableHysteresis()) {
unsigned imbRegionIdx = imbnumRegionArray_[elemIdx];
if (hasGas && hasOil) {
auto gasOilImbParamsHyst = std::make_shared<GasOilEpsTwoPhaseParams>();
gasOilImbParamsHyst->setConfig(gasOilConfig);
gasOilImbParamsHyst->setUnscaledPoints(gasOilUnscaledPointsVector_[imbRegionIdx]);
gasOilImbParamsHyst->setScaledPoints(gasOilScaledImbPointsVector[elemIdx]);
gasOilImbParamsHyst->setEffectiveLawParams(gasOilEffectiveParamVector_[imbRegionIdx]);
gasOilImbParamsHyst->finalize();
gasOilParams[elemIdx]->setImbibitionParams(gasOilImbParamsHyst,
*gasOilScaledImbInfoVector[elemIdx],
EclGasOilSystem);
}
if (hasOil && hasWater) {
auto oilWaterImbParamsHyst = std::make_shared<OilWaterEpsTwoPhaseParams>();
oilWaterImbParamsHyst->setConfig(oilWaterConfig);
oilWaterImbParamsHyst->setUnscaledPoints(oilWaterUnscaledPointsVector_[imbRegionIdx]);
oilWaterImbParamsHyst->setScaledPoints(oilWaterScaledImbPointsVector[elemIdx]);
oilWaterImbParamsHyst->setEffectiveLawParams(oilWaterEffectiveParamVector_[imbRegionIdx]);
oilWaterImbParamsHyst->finalize();
oilWaterParams[elemIdx]->setImbibitionParams(oilWaterImbParamsHyst,
*gasOilScaledImbInfoVector[elemIdx],
EclGasOilSystem);
}
}
if (hasGas && hasOil)
gasOilParams[elemIdx]->finalize();
if (hasOil && hasWater)
oilWaterParams[elemIdx]->finalize();
}
// create the parameter objects for the three-phase law
materialLawParams_.resize(numCompressedElems);
for (unsigned elemIdx = 0; elemIdx < numCompressedElems; ++elemIdx) {
materialLawParams_[elemIdx] = std::make_shared<MaterialLawParams>();
unsigned satRegionIdx = static_cast<unsigned>(satnumRegionArray_[elemIdx]);
initThreePhaseParams_(eclState,
*materialLawParams_[elemIdx],
satRegionIdx,
*oilWaterScaledEpsInfoDrainage_[elemIdx],
oilWaterParams[elemIdx],
gasOilParams[elemIdx]);
materialLawParams_[elemIdx]->finalize();
}
}
// The saturation function family.
// If SWOF and SGOF are specified in the deck it return FamilyI
// If SWFN, SGFN and SOF3 are specified in the deck it return FamilyII