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 ); + } +}