diff --git a/ApplicationLibCode/FileInterface/RifSurfio.cpp b/ApplicationLibCode/FileInterface/RifSurfio.cpp index df9cff94a4..ed7575dd0c 100644 --- a/ApplicationLibCode/FileInterface/RifSurfio.cpp +++ b/ApplicationLibCode/FileInterface/RifSurfio.cpp @@ -19,6 +19,7 @@ #include "RifSurfio.h" #include "RifFileTools.h" +#include "irap_export.h" #include "irap_import.h" #include @@ -94,3 +95,59 @@ std::expected>, std::string> return std::unexpected( "File is not a valid IRAP or GRI file: " + filename ); } } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RifSurfio::exportToGri( const std::string& filename, const RigRegularSurfaceData& surfaceData, const std::vector& values ) +{ + return exportImpl( filename, surfaceData, values, true ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RifSurfio::exportToIrap( const std::string& filename, const RigRegularSurfaceData& surfaceData, const std::vector& values ) +{ + return exportImpl( filename, surfaceData, values, false ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RifSurfio::exportImpl( const std::string& filename, const RigRegularSurfaceData& surfaceData, const std::vector& values, bool binary ) +{ + if ( static_cast( values.size() ) != surfaceData.nx * surfaceData.ny ) return false; + + surfio::irap::irap_header header; + header.ncol = surfaceData.nx; + header.nrow = surfaceData.ny; + header.xori = surfaceData.originX; + header.yori = surfaceData.originY; + header.xmax = surfaceData.originX + ( surfaceData.nx - 1 ) * surfaceData.incrementX; + header.ymax = surfaceData.originY + ( surfaceData.ny - 1 ) * surfaceData.incrementY; + header.xinc = surfaceData.incrementX; + header.yinc = surfaceData.incrementY; + header.rot = surfaceData.rotation; + header.xrot = surfaceData.originX; + header.yrot = surfaceData.originY; + + // Transpose from row-major (ResInsight: values[j * nx + i]) to column-major (IRAP: values[i * ny + j]) + std::vector irapValues( values.size() ); + for ( int j = 0; j < surfaceData.ny; ++j ) + { + for ( int i = 0; i < surfaceData.nx; ++i ) + { + irapValues[i * surfaceData.ny + j] = values[j * surfaceData.nx + i]; + } + } + + const surfio::irap::surf_span span{ irapValues.data(), static_cast( surfaceData.nx ), static_cast( surfaceData.ny ) }; + + if ( binary ) + surfio::irap::to_binary_file( filename, header, span ); + else + surfio::irap::to_ascii_file( filename, header, span ); + + return true; +} diff --git a/ApplicationLibCode/FileInterface/RifSurfio.h b/ApplicationLibCode/FileInterface/RifSurfio.h index 888ae5b6d4..ae11806d1e 100644 --- a/ApplicationLibCode/FileInterface/RifSurfio.h +++ b/ApplicationLibCode/FileInterface/RifSurfio.h @@ -40,4 +40,10 @@ class RifSurfio { public: static std::expected>, std::string> importSurfaceData( const std::string& filename ); + static bool exportToGri( const std::string& filename, const RigRegularSurfaceData& surfaceData, const std::vector& values ); + static bool exportToIrap( const std::string& filename, const RigRegularSurfaceData& surfaceData, const std::vector& values ); + +private: + static bool + exportImpl( const std::string& filename, const RigRegularSurfaceData& surfaceData, const std::vector& values, bool binary ); };