embed the scaled endpoints directly into the relevant parameter objects

this hopefully improves performance slightly.
This commit is contained in:
Andreas Lauser 2015-08-07 16:44:02 +02:00
parent 53309405c2
commit a82648a002
4 changed files with 49 additions and 19 deletions

View File

@ -140,6 +140,7 @@ public:
values[gasPhaseIdx] = pcgn<FluidState, Evaluation>(params, state);
values[oilPhaseIdx] = 0;
values[waterPhaseIdx] = - pcnw<FluidState, Evaluation>(params, state);
Valgrind::CheckDefined(values[gasPhaseIdx]);
Valgrind::CheckDefined(values[oilPhaseIdx]);
Valgrind::CheckDefined(values[waterPhaseIdx]);

View File

@ -72,7 +72,6 @@ public:
assert(config_);
if (config_->enableSatScaling()) {
assert(unscaledPoints_);
assert(scaledPoints_);
}
assert(effectiveLawParams_);
@ -108,13 +107,19 @@ public:
* \brief Set the scaling points which are seen by the physical model
*/
void setScaledPoints(std::shared_ptr<ScalingPoints> value)
{ scaledPoints_ = value; }
{ scaledPoints_ = *value; }
/*!
* \brief Returns the scaling points which are seen by the physical model
*/
const ScalingPoints& scaledPoints() const
{ return *scaledPoints_; }
{ return scaledPoints_; }
/*!
* \brief Returns the scaling points which are seen by the physical model
*/
ScalingPoints& scaledPoints()
{ return scaledPoints_; }
/*!
* \brief Sets the parameter object for the effective/nested material law.
@ -144,7 +149,7 @@ private:
std::shared_ptr<EclEpsConfig> config_;
std::shared_ptr<ScalingPoints> unscaledPoints_;
std::shared_ptr<ScalingPoints> scaledPoints_;
ScalingPoints scaledPoints_;
};
} // namespace Opm

View File

@ -102,7 +102,7 @@ public:
EclTwoPhaseSystemType twoPhaseSystem)
{
drainageParams_ = value;
drainageParams_ = *value;
#if 0
if (twoPhaseSystem == EclGasOilSystem) {
@ -118,10 +118,13 @@ public:
}
/*!
* \brief Sets the parameters used for the drainage curve
* \brief Returns the parameters used for the drainage curve
*/
const EffLawParams& drainageParams() const
{ return *drainageParams_; }
{ return drainageParams_; }
EffLawParams& drainageParams()
{ return drainageParams_; }
/*!
* \brief Sets the parameters used for the imbibition curve
@ -130,7 +133,7 @@ public:
const EclEpsScalingPointsInfo<Scalar>& info,
EclTwoPhaseSystemType twoPhaseSystem)
{
imbibitionParams_ = value;
imbibitionParams_ = *value;
/*
if (twoPhaseSystem == EclGasOilSystem) {
@ -144,10 +147,13 @@ public:
}
/*!
* \brief Sets the parameters used for the imbibition curve
* \brief Returns the parameters used for the imbibition curve
*/
const EffLawParams& imbibitionParams() const
{ return *imbibitionParams_; }
{ return imbibitionParams_; }
EffLawParams& imbibitionParams()
{ return imbibitionParams_; }
/*!
* \brief Set the saturation of the wetting phase where the last switch from the main
@ -324,11 +330,9 @@ private:
#endif
}
std::shared_ptr<EffLawParams> effectiveLawParams_;
std::shared_ptr<EclHysteresisConfig> config_;
std::shared_ptr<EffLawParams> imbibitionParams_;
std::shared_ptr<EffLawParams> drainageParams_;
EffLawParams imbibitionParams_;
EffLawParams drainageParams_;
// largest wettinging phase saturation which is on the main-drainage curve. These are
// three different values because the sourounding code can choose to use different

View File

@ -187,7 +187,7 @@ public:
Scalar pcowAtSw = pc[oilPhaseIdx] - pc[waterPhaseIdx];
if (pcowAtSw > 0.0) {
elemScaledEpsInfo.maxPcow *= pcow/pcowAtSw;
auto& elemEclEpsScalingPoints = *oilWaterScaledEpsPointsDrainage_[elemIdx];
auto& elemEclEpsScalingPoints = getOilWaterScaledEpsPointsDrainage_(elemIdx);
elemEclEpsScalingPoints.init(elemScaledEpsInfo, *oilWaterEclEpsConfig_, Opm::EclOilWaterSystem);
}
}
@ -402,7 +402,7 @@ private:
OilWaterScalingInfoVector oilWaterScaledImbInfoVector;
GasOilScalingPointsVector gasOilScaledPointsVector(numCompressedElems);
oilWaterScaledEpsPointsDrainage_.resize(numCompressedElems);
GasOilScalingPointsVector oilWaterScaledEpsPointsDrainage(numCompressedElems);
GasOilScalingPointsVector gasOilScaledImbPointsVector;
OilWaterScalingPointsVector oilWaterScaledImbPointsVector;
@ -424,7 +424,7 @@ private:
epsGridProperties,
elemIdx);
readOilWaterScaledPoints_(oilWaterScaledEpsInfoDrainage_,
oilWaterScaledEpsPointsDrainage_,
oilWaterScaledEpsPointsDrainage,
oilWaterConfig,
epsGridProperties,
elemIdx);
@ -475,7 +475,7 @@ private:
auto oilWaterDrainParams = std::make_shared<OilWaterEpsTwoPhaseParams>();
oilWaterDrainParams->setConfig(oilWaterConfig);
oilWaterDrainParams->setUnscaledPoints(oilWaterUnscaledPointsVector[satnumRegionIdx]);
oilWaterDrainParams->setScaledPoints(oilWaterScaledEpsPointsDrainage_[elemIdx]);
oilWaterDrainParams->setScaledPoints(oilWaterScaledEpsPointsDrainage[elemIdx]);
oilWaterDrainParams->setEffectiveLawParams(oilWaterEffectiveParamVector[satnumRegionIdx]);
oilWaterDrainParams->finalize();
@ -678,13 +678,33 @@ private:
}
}
EclEpsScalingPoints<Scalar>& getOilWaterScaledEpsPointsDrainage_(int elemIdx)
{
auto& materialParams = *materialLawParams_[elemIdx];
switch (materialParams.approach()) {
case EclStone1Approach: {
auto& realParams = materialParams.template getRealParams<Opm::EclStone1Approach>();
return realParams.oilWaterParams().drainageParams().scaledPoints();
}
case EclStone2Approach: {
auto& realParams = materialParams.template getRealParams<Opm::EclStone2Approach>();
return realParams.oilWaterParams().drainageParams().scaledPoints();
}
case EclDefaultApproach: {
auto& realParams = materialParams.template getRealParams<Opm::EclDefaultApproach>();
return realParams.oilWaterParams().drainageParams().scaledPoints();
}
}
}
bool enableEndPointScaling_;
std::shared_ptr<EclHysteresisConfig> hysteresisConfig_;
std::shared_ptr<EclEpsConfig> oilWaterEclEpsConfig_;
std::vector<Opm::EclEpsScalingPointsInfo<Scalar>> unscaledEpsInfo_;
OilWaterScalingInfoVector oilWaterScaledEpsInfoDrainage_;
OilWaterScalingPointsVector oilWaterScaledEpsPointsDrainage_;
EclMultiplexerApproach threePhaseApproach_;
std::vector<std::shared_ptr<MaterialLawParams> > materialLawParams_;