Well Log CSV: fix interpolation of CSV data.

The TVD measurements from the well path were used to interpolate the CSV data.
The typically well path is too coarsely sampled which would lead unwanted
smoothing of the data.

Fixed by resampling the well path to a one meter sampling interval.
This commit is contained in:
Kristian Bendiksen 2024-04-05 11:44:20 +02:00
parent bebf59c309
commit efe37bb063
2 changed files with 43 additions and 4 deletions

View File

@ -58,6 +58,8 @@ RigWellLogCsvFile::~RigWellLogCsvFile()
bool RigWellLogCsvFile::open( const QString& fileName, RigWellPath* wellPath, QString* errorMessage ) bool RigWellLogCsvFile::open( const QString& fileName, RigWellPath* wellPath, QString* errorMessage )
{ {
m_wellLogChannelNames.clear(); m_wellLogChannelNames.clear();
double samplingInterval = 1.0;
cvf::cref<RigWellPath> resampledWellPath = resampleWellPath( *wellPath, samplingInterval );
RifCsvUserDataFileParser parser( fileName, errorMessage ); RifCsvUserDataFileParser parser( fileName, errorMessage );
@ -104,14 +106,14 @@ bool RigWellLogCsvFile::open( const QString& fileName, RigWellPath* wellPath, QS
if ( channelName == m_tvdMslLogName ) if ( channelName == m_tvdMslLogName )
{ {
// Use TVD from well path. // Use TVD from well path.
m_values[m_tvdMslLogName] = wellPath->trueVerticalDepths(); m_values[m_tvdMslLogName] = resampledWellPath->trueVerticalDepths();
} }
else else
{ {
CAF_ASSERT( readValues.size() == readTvds.size() ); CAF_ASSERT( readValues.size() == readTvds.size() );
auto wellPathMds = wellPath->measuredDepths(); auto wellPathMds = resampledWellPath->measuredDepths();
auto wellPathTvds = wellPath->trueVerticalDepths(); auto wellPathTvds = resampledWellPath->trueVerticalDepths();
// Interpolate values for the well path depths (from TVD). // Interpolate values for the well path depths (from TVD).
// Assumes that the well channel values is dependent on TVD only (MD is not considered). // Assumes that the well channel values is dependent on TVD only (MD is not considered).
@ -128,7 +130,7 @@ bool RigWellLogCsvFile::open( const QString& fileName, RigWellPath* wellPath, QS
// Use MD from well path. // Use MD from well path.
m_depthLogName = "DEPTH"; m_depthLogName = "DEPTH";
m_values[m_depthLogName] = wellPath->measuredDepths(); m_values[m_depthLogName] = resampledWellPath->measuredDepths();
return true; return true;
} }
@ -229,3 +231,37 @@ double RigWellLogCsvFile::getMissingValue() const
{ {
return std::numeric_limits<double>::infinity(); return std::numeric_limits<double>::infinity();
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RigWellPath* RigWellLogCsvFile::resampleWellPath( const RigWellPath& wellPath, double samplingInterval )
{
std::vector<double> measuredDepths = resampleMeasuredDepths( wellPath.measuredDepths(), samplingInterval );
std::vector<cvf::Vec3d> wellPathPoints;
for ( double md : measuredDepths )
{
wellPathPoints.push_back( wellPath.interpolatedPointAlongWellPath( md ) );
}
return new RigWellPath( wellPathPoints, measuredDepths );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<double> RigWellLogCsvFile::resampleMeasuredDepths( const std::vector<double>& measuredDepths, double samplingInterval )
{
double firstMd = measuredDepths.front();
double lastMd = measuredDepths.back();
std::vector<double> resampledMds;
for ( double md = firstMd; md < lastMd; md += samplingInterval )
{
resampledMds.push_back( md );
}
resampledMds.push_back( lastMd );
return resampledMds;
}

View File

@ -60,6 +60,9 @@ private:
void close(); void close();
QString depthUnitString() const override; QString depthUnitString() const override;
static RigWellPath* resampleWellPath( const RigWellPath& wellPath, double samplingInterval );
static std::vector<double> resampleMeasuredDepths( const std::vector<double>& measuredDepths, double samplingInterval );
QStringList m_wellLogChannelNames; QStringList m_wellLogChannelNames;
QString m_depthLogName; QString m_depthLogName;
QString m_tvdMslLogName; QString m_tvdMslLogName;