From f496e6212352bcdd951731ed3af2858b2d5fd2b4 Mon Sep 17 00:00:00 2001 From: Kristian Bendiksen Date: Fri, 18 Sep 2020 12:08:58 +0200 Subject: [PATCH] #6526 Fracture Model: Make TVD/MD values consistent in Deviation.FRK The change in measured depth (MD) must be greater or equal to change in true vertical depth (TVD), and this was not always the case due to interpolation imprecision. --- .../RifFractureModelDeviationFrkExporter.cpp | 46 +++++++++++++++++-- .../RifFractureModelDeviationFrkExporter.h | 5 ++ .../UnitTests/CMakeLists_files.cmake | 1 + ...FractureModelDeviationFrkExporter-Test.cpp | 29 ++++++++++++ 4 files changed, 77 insertions(+), 4 deletions(-) create mode 100644 ApplicationCode/UnitTests/RifFractureModelDeviationFrkExporter-Test.cpp diff --git a/ApplicationCode/FileInterface/RifFractureModelDeviationFrkExporter.cpp b/ApplicationCode/FileInterface/RifFractureModelDeviationFrkExporter.cpp index 4de0c91b38..519a13532d 100644 --- a/ApplicationCode/FileInterface/RifFractureModelDeviationFrkExporter.cpp +++ b/ApplicationCode/FileInterface/RifFractureModelDeviationFrkExporter.cpp @@ -61,11 +61,15 @@ bool RifFractureModelDeviationFrkExporter::writeToFile( RimFractureModelPlot* pl std::vector mdValues; RigWellPathGeometryExporter::exportWellPathGeometry( wellPath, mdStepSize, xValues, yValues, tvdValues, mdValues, useMdRkb ); - convertFromMeterToFeet( mdValues ); - convertFromMeterToFeet( tvdValues ); + std::vector exportTvdValues; + std::vector exportMdValues; + fixupDepthValuesForExport( tvdValues, mdValues, exportTvdValues, exportMdValues ); - appendToStream( stream, "mdArray", mdValues ); - appendToStream( stream, "tvdArray", tvdValues ); + convertFromMeterToFeet( exportMdValues ); + convertFromMeterToFeet( exportTvdValues ); + + appendToStream( stream, "mdArray", exportMdValues ); + appendToStream( stream, "tvdArray", exportTvdValues ); appendFooterToStream( stream ); @@ -124,3 +128,37 @@ void RifFractureModelDeviationFrkExporter::convertFromMeterToFeet( std::vector& tvdValues, + const std::vector& mdValues, + std::vector& exportTvdValues, + std::vector& exportMdValues ) +{ + if ( tvdValues.empty() || mdValues.empty() ) return; + + exportMdValues.push_back( mdValues[0] ); + exportTvdValues.push_back( tvdValues[0] ); + + for ( size_t i = 1; i < tvdValues.size(); i++ ) + { + double changeMd = mdValues[i] - exportMdValues[i - 1]; + double changeTvd = tvdValues[i] - exportTvdValues[i - 1]; + + // Stimplan checks that the change in MD is larger than or equal to change in TVD. + // This condition is not always satisfied due to the interpolation of TVDs. + // Move the MD value to produce a file which can be imported. + if ( changeMd < changeTvd ) + { + exportMdValues.push_back( exportMdValues[i - 1] + changeTvd ); + } + else + { + exportMdValues.push_back( mdValues[i] ); + } + + exportTvdValues.push_back( tvdValues[i] ); + } +} diff --git a/ApplicationCode/FileInterface/RifFractureModelDeviationFrkExporter.h b/ApplicationCode/FileInterface/RifFractureModelDeviationFrkExporter.h index 2af9d62acd..835999786f 100644 --- a/ApplicationCode/FileInterface/RifFractureModelDeviationFrkExporter.h +++ b/ApplicationCode/FileInterface/RifFractureModelDeviationFrkExporter.h @@ -32,6 +32,11 @@ class RifFractureModelDeviationFrkExporter public: static bool writeToFile( RimFractureModelPlot* plot, const QString& filepath ); + static void fixupDepthValuesForExport( const std::vector& tvdValues, + const std::vector& mdValues, + std::vector& exportTvdValues, + std::vector& exportMdValues ); + private: static void appendHeaderToStream( QTextStream& stream ); static void appendToStream( QTextStream& stream, const QString& label, const std::vector& values ); diff --git a/ApplicationCode/UnitTests/CMakeLists_files.cmake b/ApplicationCode/UnitTests/CMakeLists_files.cmake index 58bc1e2f05..bf11a497ec 100644 --- a/ApplicationCode/UnitTests/CMakeLists_files.cmake +++ b/ApplicationCode/UnitTests/CMakeLists_files.cmake @@ -73,6 +73,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RifElasticPropertiesReader-Test.cpp ${CMAKE_CURRENT_LIST_DIR}/RiaStatisticsTools-Test.cpp ${CMAKE_CURRENT_LIST_DIR}/RifStimPlanXmlReader-Test.cpp ${CMAKE_CURRENT_LIST_DIR}/RigWellPathGeometryExporter-Test.cpp +${CMAKE_CURRENT_LIST_DIR}/RifFractureModelDeviationFrkExporter-Test.cpp ) if (RESINSIGHT_ENABLE_GRPC) diff --git a/ApplicationCode/UnitTests/RifFractureModelDeviationFrkExporter-Test.cpp b/ApplicationCode/UnitTests/RifFractureModelDeviationFrkExporter-Test.cpp new file mode 100644 index 0000000000..ac401c004a --- /dev/null +++ b/ApplicationCode/UnitTests/RifFractureModelDeviationFrkExporter-Test.cpp @@ -0,0 +1,29 @@ +#include "gtest/gtest.h" + +#include "RifFractureModelDeviationFrkExporter.h" + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST( RifFractureModelDeviationFrkExporterTest, TvdFixup ) +{ + std::vector tvd = + {475.722, 492.126, 508.53, 524.934, 541.338, 557.743, 574.147, 590.551, 606.955, 623.359, 639.764, 656.168, 672.572}; + std::vector md = + {475.722, 492.126, 508.53, 524.934, 541.339, 557.743, 574.147, 590.551, 606.955, 623.36, 639.764, 656.168, 672.572}; + + std::vector exportTvd; + std::vector exportMd; + + RifFractureModelDeviationFrkExporter::fixupDepthValuesForExport( tvd, md, exportTvd, exportMd ); + + EXPECT_EQ( tvd.size(), exportTvd.size() ); + EXPECT_EQ( md.size(), exportMd.size() ); + + for ( size_t i = 1; i < exportMd.size(); i++ ) + { + double changeMd = exportMd[i] - exportMd[i - 1]; + double changeTvd = exportTvd[i] - exportTvd[i - 1]; + ASSERT_GE( changeMd, changeTvd ); + } +}