Use splines and more robust mechanism

This commit is contained in:
Gaute Lindkvist
2019-08-30 15:23:11 +02:00
parent 20e90bc172
commit 5d8feb1536
3 changed files with 250 additions and 76 deletions

View File

@@ -22,6 +22,8 @@
#include <vector>
#define TOLERANCE 1.0e-7
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -30,12 +32,20 @@ TEST(RigWellPathGeometryTools, VerticalPath)
std::vector<double> mdValues = {100, 500, 1000};
std::vector<double> tvdValues = {100, 500, 1000};
std::vector<double> fullTVDValues = {100, 200, 300, 400, 500, 600, 700, 800, 900, 1000};
std::vector<int> expectedSegmentIndices = {0, 0, 0, 0, 1, 1, 1, 1, 1, 2};
std::vector<int> segmentIndices = RigWellPathGeometryTools::findSegmentIndices(mdValues, tvdValues, fullTVDValues);
EXPECT_EQ(expectedSegmentIndices.size(), segmentIndices.size());
for (size_t i = 0; i < expectedSegmentIndices.size(); ++i)
{
EXPECT_EQ(expectedSegmentIndices[i], segmentIndices[i]);
}
std::vector<double> fullMDValues = RigWellPathGeometryTools::interpolateMdFromTvd(mdValues, tvdValues, fullTVDValues);
EXPECT_EQ(fullTVDValues.size(), fullMDValues.size());
for (size_t i = 0; i < fullTVDValues.size(); ++i)
{
EXPECT_DOUBLE_EQ(fullTVDValues[i], fullMDValues[i]);
EXPECT_NEAR(fullTVDValues[i], fullMDValues[i], TOLERANCE);
}
}
@@ -44,12 +54,22 @@ TEST(RigWellPathGeometryTools, LinearPath)
std::vector<double> mdValues = {100, 500, 1000};
std::vector<double> tvdValues = {50, 250, 500};
std::vector<double> fullTVDValues = {50, 100, 150, 200, 250, 300, 350, 400, 450, 500};
std::vector<int> expectedSegmentIndices = {0, 0, 0, 0, 1, 1, 1, 1, 1, 2};
std::vector<int> segmentIndices = RigWellPathGeometryTools::findSegmentIndices(mdValues, tvdValues, fullTVDValues);
EXPECT_EQ(expectedSegmentIndices.size(), segmentIndices.size());
for (size_t i = 0; i < expectedSegmentIndices.size(); ++i)
{
EXPECT_EQ(expectedSegmentIndices[i], segmentIndices[i]);
}
std::vector<double> fullMDValues = RigWellPathGeometryTools::interpolateMdFromTvd(mdValues, tvdValues, fullTVDValues);
EXPECT_EQ(fullTVDValues.size(), fullMDValues.size());
for (size_t i = 0; i < fullTVDValues.size(); ++i)
{
EXPECT_DOUBLE_EQ(2.0*fullTVDValues[i], fullMDValues[i]);
EXPECT_NEAR(2.0*fullTVDValues[i], fullMDValues[i], TOLERANCE);
}
}
@@ -72,11 +92,20 @@ TEST(RigWellPathGeometryTools, QuadraticPath)
{
fullTvdValues.push_back(quadraticFunction(md));
}
std::vector<int> expectedSegmentIndices = {0, 0, 1, 1, 1, 2, 2, 2, 2, 3};
std::vector<int> segmentIndices = RigWellPathGeometryTools::findSegmentIndices(mdValues, tvdValues, fullTvdValues);
EXPECT_EQ(expectedSegmentIndices.size(), segmentIndices.size());
for (size_t i = 0; i < expectedSegmentIndices.size(); ++i)
{
EXPECT_EQ(expectedSegmentIndices[i], segmentIndices[i]);
}
std::vector<double> estimatedFullMDValues = RigWellPathGeometryTools::interpolateMdFromTvd(mdValues, tvdValues, fullTvdValues);
EXPECT_EQ(estimatedFullMDValues.size(), fullMDValues.size());
for (size_t i = 0; i < estimatedFullMDValues.size(); ++i)
{
EXPECT_DOUBLE_EQ(fullMDValues[i], estimatedFullMDValues[i]);
EXPECT_NEAR(fullMDValues[i], estimatedFullMDValues[i], TOLERANCE);
}
}
@@ -86,6 +115,37 @@ double cubicFunction(double x)
}
TEST(RigWellPathGeometryTools, CubicPath)
{
std::vector<double> mdValues = {100, 300, 700, 1000};
std::vector<double> tvdValues;
for (double md : mdValues)
{
tvdValues.push_back(cubicFunction(md));
}
std::vector<double> fullMDValues = {100, 200, 300, 400, 500, 600, 700, 800, 900, 1000};
std::vector<double> fullTvdValues;
for (double md : fullMDValues)
{
fullTvdValues.push_back(cubicFunction(md));
}
std::vector<int> expectedSegmentIndices = {0, 0, 1, 1, 1, 2, 2, 2, 2, 3};
std::vector<int> segmentIndices = RigWellPathGeometryTools::findSegmentIndices(mdValues, tvdValues, fullTvdValues);
EXPECT_EQ(expectedSegmentIndices.size(), segmentIndices.size());
for (size_t i = 0; i < expectedSegmentIndices.size(); ++i)
{
EXPECT_EQ(expectedSegmentIndices[i], segmentIndices[i]);
}
std::vector<double> estimatedFullMDValues = RigWellPathGeometryTools::interpolateMdFromTvd(mdValues, tvdValues, fullTvdValues);
EXPECT_EQ(estimatedFullMDValues.size(), fullMDValues.size());
for (size_t i = 0; i < estimatedFullMDValues.size(); ++i)
{
EXPECT_DOUBLE_EQ(fullMDValues[i], estimatedFullMDValues[i]);
}
}
TEST(RigWellPathGeometryTools, CubicPathPoorSampling)
{
std::vector<double> mdValues = {100, 300, 600, 1000};
std::vector<double> tvdValues;
@@ -99,6 +159,46 @@ TEST(RigWellPathGeometryTools, CubicPath)
{
fullTvdValues.push_back(cubicFunction(md));
}
std::vector<int> expectedSegmentIndices = {0, 0, 1, 1, 1, 2, 2, 2, 2, 3};
std::vector<int> segmentIndices = RigWellPathGeometryTools::findSegmentIndices(mdValues, tvdValues, fullTvdValues);
EXPECT_EQ(expectedSegmentIndices.size(), segmentIndices.size());
for (size_t i = 0; i < expectedSegmentIndices.size(); ++i)
{
EXPECT_EQ(expectedSegmentIndices[i], segmentIndices[i]);
}
std::vector<double> estimatedFullMDValues = RigWellPathGeometryTools::interpolateMdFromTvd(mdValues, tvdValues, fullTvdValues);
EXPECT_EQ(estimatedFullMDValues.size(), fullMDValues.size());
for (size_t i = 0; i < estimatedFullMDValues.size(); ++i)
{
EXPECT_DOUBLE_EQ(fullMDValues[i], estimatedFullMDValues[i]);
}
}
TEST(RigWellPathGeometryTools, CubicPathVeryPoorSampling)
{
std::vector<double> mdValues = {150, 400, 800, 900};
std::vector<double> tvdValues;
for (double md : mdValues)
{
tvdValues.push_back(cubicFunction(md));
}
std::vector<double> fullMDValues = {100, 200, 300, 400, 500, 600, 700, 800, 900, 1000};
std::vector<double> fullTvdValues;
for (double md : fullMDValues)
{
fullTvdValues.push_back(cubicFunction(md));
}
std::vector<int> expectedSegmentIndices = {0, 0, 1, 1, 1, 1, 2, 2, 2, 3};
std::vector<int> segmentIndices = RigWellPathGeometryTools::findSegmentIndices(mdValues, tvdValues, fullTvdValues);
EXPECT_EQ(expectedSegmentIndices.size(), segmentIndices.size());
for (size_t i = 0; i < expectedSegmentIndices.size(); ++i)
{
EXPECT_EQ(expectedSegmentIndices[i], segmentIndices[i]);
}
std::vector<double> estimatedFullMDValues = RigWellPathGeometryTools::interpolateMdFromTvd(mdValues, tvdValues, fullTvdValues);
EXPECT_EQ(estimatedFullMDValues.size(), fullMDValues.size());
for (size_t i = 0; i < estimatedFullMDValues.size(); ++i)