diff --git a/ApplicationLibCode/FileInterface/RifRoffFileTools.cpp b/ApplicationLibCode/FileInterface/RifRoffFileTools.cpp index aab64f64ee..32f7bfe428 100644 --- a/ApplicationLibCode/FileInterface/RifRoffFileTools.cpp +++ b/ApplicationLibCode/FileInterface/RifRoffFileTools.cpp @@ -486,6 +486,34 @@ void RifRoffFileTools::convertToReservoirIndexOrder( int nx } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RifRoffFileTools::convertToReservoirIndexOrder( int nx, + int ny, + int nz, + const std::vector& in, + std::vector& out ) +{ + CAF_ASSERT( static_cast( nx ) * ny * nz == in.size() ); + + out.resize( in.size(), 0.0 ); + + int outIdx = 0; + for ( int k = 0; k < nz; k++ ) + { + for ( int j = 0; j < ny; j++ ) + { + for ( int i = 0; i < nx; i++ ) + { + int inIdx = i * ny * nz + j * nz + ( nz - k - 1 ); + out[outIdx] = in[inIdx]; + outIdx++; + } + } + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -508,3 +536,91 @@ size_t RifRoffFileTools::computeActiveCellMatrixIndex( std::vector& activeC return activeMatrixIndex; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RifRoffFileTools::createInputProperties( const QString& fileName, RigEclipseCaseData* eclipseCaseData ) +{ + RiaLogging::info( QString( "Opening roff file: %1" ).arg( fileName ) ); + + std::string filename = fileName.toStdString(); + + std::ifstream stream( filename, std::ios::binary ); + if ( !stream.good() ) + { + RiaLogging::error( "Unable to open roff file" ); + return false; + } + + try + { + Reader reader( stream ); + reader.parse(); + + std::vector> arrayTypes = reader.getNamedArrayTypes(); + + for ( auto [keyword, kind] : arrayTypes ) + { + size_t keywordLength = reader.getArrayLength( keyword ); + RiaLogging::info( QString( "Array found: %1 . Type: %2 Size: %3" ) + .arg( QString::fromStdString( keyword ) ) + .arg( QString::fromStdString( Token::kindToString( kind ) ) ) + .arg( keywordLength ) ); + if ( eclipseCaseData->mainGrid()->cellCount() == keywordLength ) + { + QString newResultName = eclipseCaseData->results( RiaDefines::PorosityModelType::MATRIX_MODEL ) + ->makeResultNameUnique( QString::fromStdString( keyword ) ); + + if ( !appendNewInputPropertyResult( eclipseCaseData, newResultName, keyword, reader ) ) + { + RiaLogging::error( QString( "Unable to import result '%1' from %2" ) + .arg( QString::fromStdString( keyword ) ) + .arg( fileName ) ); + return false; + } + } + } + } + catch ( std::runtime_error& err ) + { + RiaLogging::error( QString( "Roff property file import failed: %1" ).arg( err.what() ) ); + return false; + } + + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RifRoffFileTools::appendNewInputPropertyResult( RigEclipseCaseData* caseData, + const QString& resultName, + const std::string& keyword, + Reader& reader ) +{ + CVF_ASSERT( caseData ); + + std::vector values = reader.getFloatArray( keyword ); + CAF_ASSERT( values.size() == caseData->mainGrid()->cellCount() ); + + int nx = caseData->mainGrid()->cellCountI(); + int ny = caseData->mainGrid()->cellCountJ(); + int nz = caseData->mainGrid()->cellCountK(); + + std::vector valuesReservoirOrder; + convertToReservoirIndexOrder( nx, ny, nz, values, valuesReservoirOrder ); + + RigEclipseResultAddress resAddr( RiaDefines::ResultCatType::INPUT_PROPERTY, resultName ); + caseData->results( RiaDefines::PorosityModelType::MATRIX_MODEL )->createResultEntry( resAddr, false ); + + auto newPropertyData = + caseData->results( RiaDefines::PorosityModelType::MATRIX_MODEL )->modifiableCellScalarResultTimesteps( resAddr ); + + std::vector doubleVals; + doubleVals.insert( doubleVals.begin(), valuesReservoirOrder.begin(), valuesReservoirOrder.end() ); + + newPropertyData->push_back( doubleVals ); + + return true; +} diff --git a/ApplicationLibCode/FileInterface/RifRoffFileTools.h b/ApplicationLibCode/FileInterface/RifRoffFileTools.h index e004e6b6b0..0b1d3549d4 100644 --- a/ApplicationLibCode/FileInterface/RifRoffFileTools.h +++ b/ApplicationLibCode/FileInterface/RifRoffFileTools.h @@ -27,6 +27,7 @@ class RigEclipseCaseData; class RigMainGrid; +class Reader; //================================================================================================== // @@ -41,6 +42,8 @@ public: static bool openGridFile( const QString& fileName, RigEclipseCaseData* eclipseCase, QString* errorMessages ); + static bool createInputProperties( const QString& fileName, RigEclipseCaseData* eclipseCase ); + private: static void interpretSplitenzData( int nz, float zoffset, @@ -52,6 +55,9 @@ private: static void convertToReservoirIndexOrder( int nx, int ny, int nz, const std::vector& activeIn, std::vector& activeOut ); + static void + convertToReservoirIndexOrder( int nx, int ny, int nz, const std::vector& in, std::vector& out ); + static size_t computeActiveCellMatrixIndex( std::vector& activeCells ); static cvf::Vec3d getCorner( const RigMainGrid& grid, @@ -63,4 +69,9 @@ private: const cvf::Vec3d& scale ); static double interpolate( const cvf::Vec3d& top, const cvf::Vec3d& bottom, double z, int idx ); + + static bool appendNewInputPropertyResult( RigEclipseCaseData* caseData, + const QString& resultName, + const std::string& keyword, + Reader& reader ); }; diff --git a/ApplicationLibCode/ProjectDataModel/RimRoffCase.cpp b/ApplicationLibCode/ProjectDataModel/RimRoffCase.cpp index ba131bea81..a1443e1980 100644 --- a/ApplicationLibCode/ProjectDataModel/RimRoffCase.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimRoffCase.cpp @@ -100,6 +100,8 @@ bool RimRoffCase::openEclipseGridFile() results( RiaDefines::PorosityModelType::MATRIX_MODEL )->computeCellVolumes(); + RifRoffFileTools::createInputProperties( fileName, eclipseCaseData() ); + return true; } diff --git a/ThirdParty/roffcpp b/ThirdParty/roffcpp index 2b5e846161..60298df127 160000 --- a/ThirdParty/roffcpp +++ b/ThirdParty/roffcpp @@ -1 +1 @@ -Subproject commit 2b5e846161a504afd1cbf1a1fa7e7388759cd300 +Subproject commit 60298df1275338db9797db28c8273c8dea02502e