Address review issues.
This commit is contained in:
parent
215af283e2
commit
322c6fb0ff
@ -44,16 +44,6 @@ namespace Opm {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* \brief Indicates how interpolation will be performed. Normal interpolation
|
|
||||||
* is done by interpolating vertically between lines of sample points,
|
|
||||||
* whereas LeftExtreme or RightExtreme implies guided interpolation, where
|
|
||||||
* interpolation is done parallel to a guide line. With LeftExtreme
|
|
||||||
* the lowest Y values will be used for the guide, and the guide line slope
|
|
||||||
* extends unchanged to infinity. With RightExtreme, the highest Y values
|
|
||||||
* are used, and the slope decreases linearly down to 0 at Y = 0.
|
|
||||||
*/
|
|
||||||
enum class InterpolationGuide { LeftExtreme, RightExtreme, Vertical };
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Implements a scalar function that depends on two variables and which is sampled
|
* \brief Implements a scalar function that depends on two variables and which is sampled
|
||||||
@ -70,7 +60,21 @@ class UniformXTabulated2DFunction
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
explicit UniformXTabulated2DFunction(const InterpolationGuide iGuide)
|
/*!
|
||||||
|
* \brief Indicates how interpolation will be performed.
|
||||||
|
*
|
||||||
|
* Normal interpolation is done by interpolating vertically
|
||||||
|
* between lines of sample points, whereas LeftExtreme or
|
||||||
|
* RightExtreme implies guided interpolation, where
|
||||||
|
* interpolation is done parallel to a guide line. With
|
||||||
|
* LeftExtreme the lowest Y values will be used for the guide,
|
||||||
|
* and the guide line slope extends unchanged to infinity. With
|
||||||
|
* RightExtreme, the highest Y values are used, and the slope
|
||||||
|
* decreases linearly down to 0 (normal interpolation) for y <= 0.
|
||||||
|
*/
|
||||||
|
enum class InterpolationPolicy { LeftExtreme, RightExtreme, Vertical };
|
||||||
|
|
||||||
|
explicit UniformXTabulated2DFunction(const InterpolationPolicy iGuide)
|
||||||
: interpGuide_(iGuide)
|
: interpGuide_(iGuide)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
@ -298,13 +302,13 @@ public:
|
|||||||
const Evaluation& alpha = xToAlpha(x, i);
|
const Evaluation& alpha = xToAlpha(x, i);
|
||||||
// find upper and lower y value
|
// find upper and lower y value
|
||||||
Evaluation shift = 0.0;
|
Evaluation shift = 0.0;
|
||||||
if (interpGuide_ == InterpolationGuide::Vertical) {
|
if (interpGuide_ == InterpolationPolicy::Vertical) {
|
||||||
// Shift is zero, no need to reset it.
|
// Shift is zero, no need to reset it.
|
||||||
} else {
|
} else {
|
||||||
if (interpGuide_ == InterpolationGuide::LeftExtreme) {
|
if (interpGuide_ == InterpolationPolicy::LeftExtreme) {
|
||||||
shift = yPos_[i+1] - yPos_[i];
|
shift = yPos_[i+1] - yPos_[i];
|
||||||
} else {
|
} else {
|
||||||
assert(interpGuide_ == InterpolationGuide::RightExtreme);
|
assert(interpGuide_ == InterpolationPolicy::RightExtreme);
|
||||||
shift = yPos_[i+1] - yPos_[i];
|
shift = yPos_[i+1] - yPos_[i];
|
||||||
auto yEnd = yPos_[i]*(1.0 - alpha) + yPos_[i+1]*alpha;
|
auto yEnd = yPos_[i]*(1.0 - alpha) + yPos_[i+1]*alpha;
|
||||||
if (yEnd > 0.) {
|
if (yEnd > 0.) {
|
||||||
@ -314,13 +318,13 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
auto ylower = y - alpha*shift;
|
auto yLower = y - alpha*shift;
|
||||||
auto yupper = y + (1-alpha)*shift;
|
auto yUpper = y + (1-alpha)*shift;
|
||||||
|
|
||||||
unsigned j1 = ySegmentIndex(ylower, i, extrapolate);
|
unsigned j1 = ySegmentIndex(yLower, i, extrapolate);
|
||||||
unsigned j2 = ySegmentIndex(yupper, i + 1, extrapolate);
|
unsigned j2 = ySegmentIndex(yUpper, i + 1, extrapolate);
|
||||||
const Evaluation& beta1 = yToBeta(ylower, i, j1);
|
const Evaluation& beta1 = yToBeta(yLower, i, j1);
|
||||||
const Evaluation& beta2 = yToBeta(yupper, i + 1, j2);
|
const Evaluation& beta2 = yToBeta(yUpper, i + 1, j2);
|
||||||
|
|
||||||
// evaluate the two function values for the same y value ...
|
// evaluate the two function values for the same y value ...
|
||||||
const Evaluation& s1 = valueAt(i, j1)*(1.0 - beta1) + valueAt(i, j1 + 1)*beta1;
|
const Evaluation& s1 = valueAt(i, j1)*(1.0 - beta1) + valueAt(i, j1 + 1)*beta1;
|
||||||
@ -345,8 +349,8 @@ public:
|
|||||||
{
|
{
|
||||||
if (xPos_.empty() || xPos_.back() < nextX) {
|
if (xPos_.empty() || xPos_.back() < nextX) {
|
||||||
xPos_.push_back(nextX);
|
xPos_.push_back(nextX);
|
||||||
yPos_.resize(xPos_.size());
|
yPos_.push_back(-1e100);
|
||||||
samples_.resize(xPos_.size());
|
samples_.push_back({});
|
||||||
return xPos_.size() - 1;
|
return xPos_.size() - 1;
|
||||||
}
|
}
|
||||||
else if (xPos_.front() > nextX) {
|
else if (xPos_.front() > nextX) {
|
||||||
@ -371,7 +375,7 @@ public:
|
|||||||
Scalar x = iToX(i);
|
Scalar x = iToX(i);
|
||||||
if (samples_[i].empty() || std::get<1>(samples_[i].back()) < y) {
|
if (samples_[i].empty() || std::get<1>(samples_[i].back()) < y) {
|
||||||
samples_[i].push_back(SamplePoint(x, y, value));
|
samples_[i].push_back(SamplePoint(x, y, value));
|
||||||
if (interpGuide_ == InterpolationGuide::RightExtreme) {
|
if (interpGuide_ == InterpolationPolicy::RightExtreme) {
|
||||||
yPos_[i] = y;
|
yPos_[i] = y;
|
||||||
}
|
}
|
||||||
return samples_[i].size() - 1;
|
return samples_[i].size() - 1;
|
||||||
@ -379,7 +383,7 @@ public:
|
|||||||
else if (std::get<1>(samples_[i].front()) > y) {
|
else if (std::get<1>(samples_[i].front()) > y) {
|
||||||
// slow, but we still don't care...
|
// slow, but we still don't care...
|
||||||
samples_[i].insert(samples_[i].begin(), SamplePoint(x, y, value));
|
samples_[i].insert(samples_[i].begin(), SamplePoint(x, y, value));
|
||||||
if (interpGuide_ == InterpolationGuide::LeftExtreme) {
|
if (interpGuide_ == InterpolationPolicy::LeftExtreme) {
|
||||||
yPos_[i] = y;
|
yPos_[i] = y;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -432,7 +436,7 @@ private:
|
|||||||
std::vector<Scalar> xPos_;
|
std::vector<Scalar> xPos_;
|
||||||
// the position on the y-axis of the guide point
|
// the position on the y-axis of the guide point
|
||||||
std::vector<Scalar> yPos_;
|
std::vector<Scalar> yPos_;
|
||||||
InterpolationGuide interpGuide_;
|
InterpolationPolicy interpGuide_;
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -238,11 +238,11 @@ public:
|
|||||||
{
|
{
|
||||||
oilReferenceDensity_.resize(numRegions);
|
oilReferenceDensity_.resize(numRegions);
|
||||||
gasReferenceDensity_.resize(numRegions);
|
gasReferenceDensity_.resize(numRegions);
|
||||||
inverseOilBTable_.resize(numRegions, TabulatedTwoDFunction{InterpolationGuide::LeftExtreme});
|
inverseOilBTable_.resize(numRegions, TabulatedTwoDFunction{TabulatedTwoDFunction::InterpolationPolicy::LeftExtreme});
|
||||||
inverseOilBMuTable_.resize(numRegions, TabulatedTwoDFunction{InterpolationGuide::LeftExtreme});
|
inverseOilBMuTable_.resize(numRegions, TabulatedTwoDFunction{TabulatedTwoDFunction::InterpolationPolicy::LeftExtreme});
|
||||||
inverseSaturatedOilBTable_.resize(numRegions);
|
inverseSaturatedOilBTable_.resize(numRegions);
|
||||||
inverseSaturatedOilBMuTable_.resize(numRegions);
|
inverseSaturatedOilBMuTable_.resize(numRegions);
|
||||||
oilMuTable_.resize(numRegions, TabulatedTwoDFunction{InterpolationGuide::LeftExtreme});
|
oilMuTable_.resize(numRegions, TabulatedTwoDFunction{TabulatedTwoDFunction::InterpolationPolicy::LeftExtreme});
|
||||||
saturatedOilMuTable_.resize(numRegions);
|
saturatedOilMuTable_.resize(numRegions);
|
||||||
saturatedGasDissolutionFactorTable_.resize(numRegions);
|
saturatedGasDissolutionFactorTable_.resize(numRegions);
|
||||||
saturationPressure_.resize(numRegions);
|
saturationPressure_.resize(numRegions);
|
||||||
|
@ -234,11 +234,11 @@ public:
|
|||||||
{
|
{
|
||||||
oilReferenceDensity_.resize(numRegions);
|
oilReferenceDensity_.resize(numRegions);
|
||||||
gasReferenceDensity_.resize(numRegions);
|
gasReferenceDensity_.resize(numRegions);
|
||||||
inverseGasB_.resize(numRegions, TabulatedTwoDFunction{InterpolationGuide::RightExtreme});
|
inverseGasB_.resize(numRegions, TabulatedTwoDFunction{TabulatedTwoDFunction::InterpolationPolicy::RightExtreme});
|
||||||
inverseGasBMu_.resize(numRegions, TabulatedTwoDFunction{InterpolationGuide::RightExtreme});
|
inverseGasBMu_.resize(numRegions, TabulatedTwoDFunction{TabulatedTwoDFunction::InterpolationPolicy::RightExtreme});
|
||||||
inverseSaturatedGasB_.resize(numRegions);
|
inverseSaturatedGasB_.resize(numRegions);
|
||||||
inverseSaturatedGasBMu_.resize(numRegions);
|
inverseSaturatedGasBMu_.resize(numRegions);
|
||||||
gasMu_.resize(numRegions, TabulatedTwoDFunction{InterpolationGuide::RightExtreme});
|
gasMu_.resize(numRegions, TabulatedTwoDFunction{TabulatedTwoDFunction::InterpolationPolicy::RightExtreme});
|
||||||
saturatedOilVaporizationFactorTable_.resize(numRegions);
|
saturatedOilVaporizationFactorTable_.resize(numRegions);
|
||||||
saturationPressure_.resize(numRegions);
|
saturationPressure_.resize(numRegions);
|
||||||
}
|
}
|
||||||
|
@ -90,7 +90,7 @@ struct Test
|
|||||||
Scalar yMin = -1/2.0;
|
Scalar yMin = -1/2.0;
|
||||||
Scalar yMax = 1/3.0;
|
Scalar yMax = 1/3.0;
|
||||||
unsigned n = 40;
|
unsigned n = 40;
|
||||||
auto tab = std::make_shared<Opm::UniformXTabulated2DFunction<Scalar>>(Opm::InterpolationGuide::Vertical);
|
auto tab = std::make_shared<Opm::UniformXTabulated2DFunction<Scalar>>(Opm::UniformXTabulated2DFunction<Scalar>::InterpolationPolicy::Vertical);
|
||||||
for (unsigned i = 0; i < m; ++i) {
|
for (unsigned i = 0; i < m; ++i) {
|
||||||
Scalar x = xMin + Scalar(i)/(m - 1) * (xMax - xMin);
|
Scalar x = xMin + Scalar(i)/(m - 1) * (xMax - xMin);
|
||||||
tab->appendXPos(x);
|
tab->appendXPos(x);
|
||||||
@ -115,7 +115,7 @@ struct Test
|
|||||||
Scalar yMin = - 4.0;
|
Scalar yMin = - 4.0;
|
||||||
Scalar yMax = 5.0;
|
Scalar yMax = 5.0;
|
||||||
|
|
||||||
auto tab = std::make_shared<Opm::UniformXTabulated2DFunction<Scalar>>(Opm::InterpolationGuide::Vertical);
|
auto tab = std::make_shared<Opm::UniformXTabulated2DFunction<Scalar>>(Opm::UniformXTabulated2DFunction<Scalar>::InterpolationPolicy::Vertical);
|
||||||
|
|
||||||
for (unsigned i = 0; i < m; ++i) {
|
for (unsigned i = 0; i < m; ++i) {
|
||||||
Scalar x = xMin + Scalar(i)/(m - 1) * (xMax - xMin);
|
Scalar x = xMin + Scalar(i)/(m - 1) * (xMax - xMin);
|
||||||
|
Loading…
Reference in New Issue
Block a user