diff --git a/ApplicationLibCode/FileInterface/CMakeLists_files.cmake b/ApplicationLibCode/FileInterface/CMakeLists_files.cmake index af85f5b88e..787c1c7846 100644 --- a/ApplicationLibCode/FileInterface/CMakeLists_files.cmake +++ b/ApplicationLibCode/FileInterface/CMakeLists_files.cmake @@ -86,6 +86,7 @@ set(SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RifRevealCsvSectionSummaryReader.h ${CMAKE_CURRENT_LIST_DIR}/RifStimPlanCsvSummaryReader.h ${CMAKE_CURRENT_LIST_DIR}/RifReaderOpmCommon.h + ${CMAKE_CURRENT_LIST_DIR}/RifInpExportTools.h ) set(SOURCE_GROUP_SOURCE_FILES @@ -173,6 +174,7 @@ set(SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RifRevealCsvSectionSummaryReader.cpp ${CMAKE_CURRENT_LIST_DIR}/RifStimPlanCsvSummaryReader.cpp ${CMAKE_CURRENT_LIST_DIR}/RifReaderOpmCommon.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifInpExportTools.cpp ) list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) diff --git a/ApplicationLibCode/FileInterface/RifInpExportTools.cpp b/ApplicationLibCode/FileInterface/RifInpExportTools.cpp new file mode 100644 index 0000000000..4d4577a858 --- /dev/null +++ b/ApplicationLibCode/FileInterface/RifInpExportTools.cpp @@ -0,0 +1,81 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2023- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RifInpExportTools.h" +#include + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RifInpExportTools::printLine( std::ostream& stream, const std::string& heading ) +{ + stream << heading << std::endl; + return stream.good(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RifInpExportTools::printHeading( std::ostream& stream, const std::string& heading ) +{ + return printLine( stream, "*" + heading ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RifInpExportTools::printComment( std::ostream& stream, const std::string& comment ) +{ + return printLine( stream, "** " + comment ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RifInpExportTools::printNodes( std::ostream& stream, const std::vector& nodes ) +{ + if ( !printHeading( stream, "Node" ) ) return false; + + for ( size_t i = 0; i < nodes.size(); i++ ) + { + stream << i + 1 << ", " << std::setprecision( 10 ) << nodes[i].x() << ", " << nodes[i].y() << ", " << nodes[i].z() << std::endl; + } + + return stream.good(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RifInpExportTools::printElements( std::ostream& stream, const std::vector>& elements ) +{ + std::string heading = "Element, type=C3D8P"; + if ( !printHeading( stream, heading ) ) return false; + + for ( size_t i = 0; i < elements.size(); i++ ) + { + stream << i + 1; + for ( size_t j = 0; j < elements[i].size(); j++ ) + { + stream << ", " << elements[i][j] + 1; + } + stream << std::endl; + } + + return stream.good(); +} diff --git a/ApplicationLibCode/FileInterface/RifInpExportTools.h b/ApplicationLibCode/FileInterface/RifInpExportTools.h new file mode 100644 index 0000000000..a66071f5fb --- /dev/null +++ b/ApplicationLibCode/FileInterface/RifInpExportTools.h @@ -0,0 +1,39 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2023- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cvfVector3.h" + +//#include +#include +#include +#include + +//================================================================================================== +/// +//================================================================================================== +class RifInpExportTools +{ +public: + static bool printLine( std::ostream& stream, const std::string& line ); + static bool printHeading( std::ostream& stream, const std::string& heading ); + static bool printComment( std::ostream& stream, const std::string& comment ); + static bool printNodes( std::ostream& stream, const std::vector& nodes ); + static bool printElements( std::ostream& stream, const std::vector>& elements ); +}; diff --git a/ApplicationLibCode/UnitTests/CMakeLists_files.cmake b/ApplicationLibCode/UnitTests/CMakeLists_files.cmake index e22535f905..1b9033cf39 100644 --- a/ApplicationLibCode/UnitTests/CMakeLists_files.cmake +++ b/ApplicationLibCode/UnitTests/CMakeLists_files.cmake @@ -97,6 +97,7 @@ set(SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RigWellLogCurveData-Test.cpp ${CMAKE_CURRENT_LIST_DIR}/RiaNumericalTools-Test.cpp ${CMAKE_CURRENT_LIST_DIR}/opm-import-well-data-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifInpExportTools-Test.cpp ) if(RESINSIGHT_ENABLE_GRPC) diff --git a/ApplicationLibCode/UnitTests/RifInpExportTools-Test.cpp b/ApplicationLibCode/UnitTests/RifInpExportTools-Test.cpp new file mode 100644 index 0000000000..7402f10b59 --- /dev/null +++ b/ApplicationLibCode/UnitTests/RifInpExportTools-Test.cpp @@ -0,0 +1,120 @@ +#include "gtest/gtest.h" + +#include "RifInpExportTools.h" + +#include +#include + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST( RifInpExportTools, PrintLine ) +{ + std::string line = "this is the line"; + + std::stringstream stream; + ASSERT_TRUE( RifInpExportTools::printLine( stream, line ) ); + + std::string res = stream.str(); + ASSERT_TRUE( res.find( line ) != std::string::npos ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST( RifInpExportTools, PrintHeading ) +{ + std::string line = "this is the heading"; + + std::stringstream stream; + ASSERT_TRUE( RifInpExportTools::printHeading( stream, line ) ); + + std::string res = stream.str(); + ASSERT_TRUE( res.find( '*' + line ) != std::string::npos ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST( RifInpExportTools, PrintComment ) +{ + std::string line = "this is the comment"; + + std::stringstream stream; + ASSERT_TRUE( RifInpExportTools::printComment( stream, line ) ); + + std::string expectedString = std::string( "** " ).append( line ); + std::string res = stream.str(); + ASSERT_TRUE( res.find( expectedString ) != std::string::npos ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST( RifInpExportTools, PrintNodes ) +{ + std::vector nodes = { + cvf::Vec3d( 1.0, 1.1, 1.2 ), + cvf::Vec3d( 2.0, 2.1, 2.2 ), + cvf::Vec3d( 3.0, 3.1, 3.2 ), + cvf::Vec3d( 4.0, 4.1, 4.2 ), + }; + + std::stringstream stream; + ASSERT_TRUE( RifInpExportTools::printNodes( stream, nodes ) ); + + auto splitLines = []( const std::string& input ) + { + std::istringstream stream( input ); + std::string line; + std::vector lines; + + while ( std::getline( stream, line ) ) + { + lines.push_back( line ); + } + return lines; + }; + + auto lines = splitLines( stream.str() ); + ASSERT_EQ( 5u, lines.size() ); + + std::string res = stream.str(); + ASSERT_TRUE( res.find( std::string( "*Node" ) ) != std::string::npos ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST( RifInpExportTools, Elements ) +{ + std::vector> elements = { + { 1, 1, 1, 1 }, + { 2, 2, 2, 2 }, + { 3, 3, 3, 3 }, + { 4, 4, 4, 4 }, + { 5, 5, 5, 5 }, + }; + + std::stringstream stream; + ASSERT_TRUE( RifInpExportTools::printElements( stream, elements ) ); + + auto splitLines = []( const std::string& input ) + { + std::istringstream stream( input ); + std::string line; + std::vector lines; + + while ( std::getline( stream, line ) ) + { + lines.push_back( line ); + } + return lines; + }; + + auto lines = splitLines( stream.str() ); + ASSERT_EQ( 6u, lines.size() ); + + std::string res = stream.str(); + ASSERT_TRUE( res.find( std::string( "*Element" ) ) != std::string::npos ); +}