Merge pull request #6428 from OPM/elastic-properties-reader-fixes

Elastic properties reader fixes
This commit is contained in:
Kristian Bendiksen
2020-09-03 21:04:00 +02:00
committed by GitHub
4 changed files with 78 additions and 17 deletions

View File

@@ -23,6 +23,7 @@
#include "RimElasticProperties.h"
#include "RimFractureModel.h"
#include "RifCsvUserDataParser.h"
#include "RifElasticPropertiesReader.h"
#include "RifFileParseTools.h"
@@ -37,6 +38,9 @@
void RicElasticPropertiesImportTools::importElasticPropertiesFromFile( const QString& filePath,
RimFractureModel* fractureModel )
{
RifCsvUserDataFileParser csvParser( filePath );
QString separator = csvParser.tryDetermineCellSeparator();
typedef std::tuple<QString, QString, QString> FaciesKey;
// Read the facies properties from file
@@ -45,7 +49,7 @@ void RicElasticPropertiesImportTools::importElasticPropertiesFromFile( const QSt
{
QStringList filePaths;
filePaths << filePath;
RifElasticPropertiesReader::readElasticProperties( rifElasticProperties, filePaths );
RifElasticPropertiesReader::readElasticProperties( rifElasticProperties, filePaths, separator );
}
catch ( FileParseException& exception )
{

View File

@@ -27,13 +27,14 @@
///
//==================================================================================================
void RifElasticPropertiesReader::readElasticProperties( std::vector<RifElasticProperties>& elasticProperties,
const QStringList& filePaths )
const QStringList& filePaths,
const QString& separator )
{
for ( const QString& filePath : filePaths )
{
try
{
readElasticProperties( elasticProperties, filePath );
readElasticProperties( elasticProperties, filePath, separator );
}
catch ( FileParseException& )
{
@@ -48,7 +49,8 @@ void RifElasticPropertiesReader::readElasticProperties( std::vector<RifElasticPr
///
//--------------------------------------------------------------------------------------------------
void RifElasticPropertiesReader::readElasticProperties( std::vector<RifElasticProperties>& elasticProperties,
const QString& filePath )
const QString& filePath,
const QString& separator )
{
QFile file( filePath );
if ( !file.open( QIODevice::ReadOnly | QIODevice::Text ) )
@@ -63,7 +65,7 @@ void RifElasticPropertiesReader::readElasticProperties( std::vector<RifElasticPr
QString line = in.readLine();
if ( !isEmptyLine( line ) && !isCommentLine( line ) )
{
RifElasticProperties faciesProp = parseElasticProperties( line, lineNumber, filePath );
RifElasticProperties faciesProp = parseElasticProperties( line, lineNumber, filePath, separator );
elasticProperties.push_back( faciesProp );
}
@@ -74,12 +76,16 @@ void RifElasticPropertiesReader::readElasticProperties( std::vector<RifElasticPr
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RifElasticProperties
RifElasticPropertiesReader::parseElasticProperties( const QString& line, int lineNumber, const QString& filePath )
RifElasticProperties RifElasticPropertiesReader::parseElasticProperties( const QString& line,
int lineNumber,
const QString& filePath,
const QString& separator )
{
QStringList tokens = tokenize( line, "," );
QStringList tokens = tokenize( line, separator );
if ( tokens.size() != 13 )
// Plus one to allow trailing separator
const int expectedTokens = 13;
if ( !( tokens.size() == expectedTokens || tokens.size() == expectedTokens + 1 ) )
{
throw FileParseException( QString( "Incomplete data on line %1: %2" ).arg( lineNumber ).arg( filePath ) );
}

View File

@@ -45,16 +45,21 @@ struct RifElasticProperties
class RifElasticPropertiesReader
{
public:
static void readElasticProperties( std::vector<RifElasticProperties>& elasticProperties, const QStringList& filePaths );
static void readElasticProperties( std::vector<RifElasticProperties>& elasticProperties,
const QStringList& filePaths,
const QString& separator = "," );
private:
static void readElasticProperties( std::vector<RifElasticProperties>& elasticProperties, const QString& filePath );
static RifElasticProperties parseElasticProperties( const QString& line, int lineNumber, const QString& filePath );
static QStringList tokenize( const QString& line, const QString& separator );
static void verifyNonEmptyTokens( const QStringList& tokens,
const QStringList& nameOfNonEmptyTokens,
int lineNumber,
const QString& filePath );
static void readElasticProperties( std::vector<RifElasticProperties>& elasticProperties,
const QString& filePath,
const QString& separator );
static RifElasticProperties
parseElasticProperties( const QString& line, int lineNumber, const QString& filePath, const QString& separator );
static QStringList tokenize( const QString& line, const QString& separator );
static void verifyNonEmptyTokens( const QStringList& tokens,
const QStringList& nameOfNonEmptyTokens,
int lineNumber,
const QString& filePath );
static double parseDouble( const QString& token, const QString& propertyName, int lineNumber, const QString& filePath );

View File

@@ -77,6 +77,52 @@ TEST( RifElasticPropertiesReaderTest, ReadCorrectInputFile )
ASSERT_DOUBLE_EQ( 0.55, elasticProperties[1].immobileFluidSaturation );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
TEST( RifElasticPropertiesReaderTest, ReadCorrectInputFileWithTrailingSeparator )
{
QTemporaryFile file;
EXPECT_TRUE( file.open() );
{
QTextStream out( &file );
out << "Norne,Not,Sand,0.00,25,0.25,2000,0.2,0.3,0.4,0.5,0.6,0.4,\n"
<< "Norne,Not,Sand,0.10,19,0.27,2099,0.3,0.4,0.5,0.2,0.5,0.55,\n";
}
QStringList filePaths;
filePaths.append( file.fileName() );
std::vector<RifElasticProperties> elasticProperties;
RifElasticPropertiesReader::readElasticProperties( elasticProperties, filePaths );
ASSERT_EQ( 2u, elasticProperties.size() );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
TEST( RifElasticPropertiesReaderTest, ReadCorrectInputFileWithCustomSeparator )
{
QTemporaryFile file;
EXPECT_TRUE( file.open() );
{
QTextStream out( &file );
out << "Norne;Not;Sand;0.00;25;0.25;2000;0.2;0.3;0.4;0.5;0.6;0.4;\n"
<< "Norne;Not;Sand;0.10;19;0.27;2099;0.3;0.4;0.5;0.2;0.5;0.55;\n";
}
QStringList filePaths;
filePaths.append( file.fileName() );
std::vector<RifElasticProperties> elasticProperties;
RifElasticPropertiesReader::readElasticProperties( elasticProperties, filePaths, ";" );
ASSERT_EQ( 2u, elasticProperties.size() );
}
//--------------------------------------------------------------------------------------------------
/// Helper to check exception messages when reading invalid files
//--------------------------------------------------------------------------------------------------