Fix invalid parsing of line with keyword end tag and comment

* Add error text when size differs
* #9845: Remove invalid parsing of data in comment line
The line '/ -- 123 123' was parsed incorrectly, and values 123 123 was added to the list of valid values for the keyword.
This commit is contained in:
Magne Sjaastad 2023-02-16 13:04:16 +01:00 committed by GitHub
parent 20439e1da9
commit edbeb4dfb1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 46 additions and 12 deletions

View File

@ -193,8 +193,12 @@ bool RifEclipseInputFileTools::openGridFile( const QString& fileName,
ecl_grid_free( inputGrid ); ecl_grid_free( inputGrid );
QString errorMessages;
// Import additional keywords as input properties // Import additional keywords as input properties
RifEclipseInputPropertyLoader::createInputPropertiesFromKeywords( eclipseCase, objects ); RifEclipseInputPropertyLoader::createInputPropertiesFromKeywords( eclipseCase, objects, &errorMessages );
if ( !errorMessages.isEmpty() ) RiaLogging::error( errorMessages );
return true; return true;
} }

View File

@ -40,7 +40,7 @@ QString RifEclipseInputPropertyLoader::evaluateAndCreateInputPropertyResult( Rig
QString* errorMessage ) QString* errorMessage )
{ {
auto eclipseKeyword = keywordContent.keyword; auto eclipseKeyword = keywordContent.keyword;
if ( isInputPropertyCandidate( eclipseCase, eclipseKeyword, keywordContent.values.size() ) ) if ( isInputPropertyCandidate( eclipseCase, eclipseKeyword, keywordContent.values.size(), errorMessage ) )
{ {
QString newResultName = eclipseCase->results( RiaDefines::PorosityModelType::MATRIX_MODEL ) QString newResultName = eclipseCase->results( RiaDefines::PorosityModelType::MATRIX_MODEL )
->makeResultNameUnique( QString::fromStdString( eclipseKeyword ) ); ->makeResultNameUnique( QString::fromStdString( eclipseKeyword ) );
@ -58,11 +58,12 @@ QString RifEclipseInputPropertyLoader::evaluateAndCreateInputPropertyResult( Rig
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RifEclipseInputPropertyLoader::createInputPropertiesFromKeywords( RigEclipseCaseData* eclipseCase, void RifEclipseInputPropertyLoader::createInputPropertiesFromKeywords( RigEclipseCaseData* eclipseCase,
const std::vector<RifEclipseKeywordContent>& keywordContent ) const std::vector<RifEclipseKeywordContent>& keywordContent,
QString* errorText )
{ {
for ( const auto& keywordAndValues : keywordContent ) for ( const auto& keywordAndValues : keywordContent )
{ {
RifEclipseInputPropertyLoader::evaluateAndCreateInputPropertyResult( eclipseCase, keywordAndValues, nullptr ); RifEclipseInputPropertyLoader::evaluateAndCreateInputPropertyResult( eclipseCase, keywordAndValues, errorText );
} }
} }
@ -71,13 +72,27 @@ void RifEclipseInputPropertyLoader::createInputPropertiesFromKeywords( RigEclips
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
bool RifEclipseInputPropertyLoader::isInputPropertyCandidate( const RigEclipseCaseData* caseData, bool RifEclipseInputPropertyLoader::isInputPropertyCandidate( const RigEclipseCaseData* caseData,
const std::string& eclipseKeyword, const std::string& eclipseKeyword,
size_t numberOfValues ) size_t numberOfValues,
QString* errorText )
{ {
CVF_ASSERT( caseData ); CVF_ASSERT( caseData );
if ( !isValidDataKeyword( QString::fromStdString( eclipseKeyword ) ) ) return false; if ( !isValidDataKeyword( QString::fromStdString( eclipseKeyword ) ) ) return false;
return ( numberOfValues == caseData->mainGrid()->cellCount() ); if ( numberOfValues != caseData->mainGrid()->cellCount() )
{
if ( errorText )
{
*errorText += QString( "Keyword %1 has %2 values, but the grid has %3 cells" )
.arg( QString::fromStdString( eclipseKeyword ) )
.arg( numberOfValues )
.arg( caseData->mainGrid()->cellCount() );
}
return false;
}
return true;
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@ -42,7 +42,8 @@ class RifEclipseInputPropertyLoader
{ {
public: public:
static void createInputPropertiesFromKeywords( RigEclipseCaseData* eclipseCase, static void createInputPropertiesFromKeywords( RigEclipseCaseData* eclipseCase,
const std::vector<RifEclipseKeywordContent>& keywordContent ); const std::vector<RifEclipseKeywordContent>& keywordContent,
QString* errorText );
// Returns map of assigned resultName and Eclipse Keyword. // Returns map of assigned resultName and Eclipse Keyword.
static std::map<QString, QString> readProperties( const QString& fileName, RigEclipseCaseData* eclipseCase ); static std::map<QString, QString> readProperties( const QString& fileName, RigEclipseCaseData* eclipseCase );
@ -56,7 +57,8 @@ private:
static bool isInputPropertyCandidate( const RigEclipseCaseData* caseData, static bool isInputPropertyCandidate( const RigEclipseCaseData* caseData,
const std::string& eclipseKeyword, const std::string& eclipseKeyword,
size_t numberOfValues ); size_t numberOfValues,
QString* errorText );
static bool appendNewInputPropertyResult( RigEclipseCaseData* caseData, static bool appendNewInputPropertyResult( RigEclipseCaseData* caseData,
const QString& resultName, const QString& resultName,

View File

@ -147,6 +147,13 @@ std::pair<std::string, std::vector<float>>
continue; continue;
} }
// End of keyword is defined by '/', parse values of line until '/' is found
auto positionOfEndToken = line.find_first_of( '/' );
if ( positionOfEndToken != std::string::npos )
{
line = line.substr( 0, positionOfEndToken );
}
if ( !isEndTokenKeywordRead ) if ( !isEndTokenKeywordRead )
{ {
size_t start = 0; size_t start = 0;
@ -186,8 +193,7 @@ std::pair<std::string, std::vector<float>>
} }
} }
// End of keyword is defined by '/' if ( positionOfEndToken != std::string::npos )
if ( line.find_first_of( '/' ) != std::string::npos )
{ {
isEndTokenKeywordRead = true; isEndTokenKeywordRead = true;
continue; continue;

View File

@ -216,11 +216,14 @@ TEST( RifEclipseTextFileReader, KeywordsWithoutValue )
"/\n" "/\n"
"SOIL\n" "SOIL\n"
"6.0 7.0 8.0 9.0\n" "6.0 7.0 8.0 9.0\n"
"/\n"; "/\n"
"G4\n"
"1.0 2.0 3.0\n"
"0.123/ -- 1213 values in comment 123.123 \n";
auto keywordDataItems = RifEclipseTextFileReader::parseStringData( fileContent ); auto keywordDataItems = RifEclipseTextFileReader::parseStringData( fileContent );
EXPECT_EQ( 3u, keywordDataItems.size() ); EXPECT_EQ( 4u, keywordDataItems.size() );
auto noEchoKeyword = keywordDataItems[0]; auto noEchoKeyword = keywordDataItems[0];
EXPECT_EQ( 0u, noEchoKeyword.values.size() ); EXPECT_EQ( 0u, noEchoKeyword.values.size() );
@ -233,4 +236,8 @@ TEST( RifEclipseTextFileReader, KeywordsWithoutValue )
EXPECT_FLOAT_EQ( 1.0f, swatKeyword.values[0] ); EXPECT_FLOAT_EQ( 1.0f, swatKeyword.values[0] );
EXPECT_FLOAT_EQ( 6.0f, soilKeyword.values[0] ); EXPECT_FLOAT_EQ( 6.0f, soilKeyword.values[0] );
auto g4Keyword = keywordDataItems[3];
EXPECT_EQ( 4u, g4Keyword.values.size() );
EXPECT_FLOAT_EQ( 0.123f, g4Keyword.values[3] );
} }