mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
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:
parent
20439e1da9
commit
edbeb4dfb1
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
||||||
|
@ -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] );
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user