2016-06-20 10:11:00 +02:00
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2016 Statoil 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 <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
#include "RifReaderOpmParserInput.h"
#include "RifReaderEclipseOutput.h"
#include "RigCaseCellResultsData.h"
2017-01-10 09:51:39 +01:00
#include "RigEclipseCaseData.h"
2017-01-09 19:04:45 +01:00
#include "RigMainGrid.h"
2016-06-20 10:11:00 +02:00
#include "RimEclipseInputCaseOpm.h"
#include "RimEclipseInputProperty.h"
#include "RimEclipseInputPropertyCollection.h"
2017-01-09 19:04:45 +01:00
2016-06-20 10:11:00 +02:00
#include "RiuMainWindow.h"
2017-01-09 19:04:45 +01:00
2016-06-20 10:11:00 +02:00
#include "RiuProcessMonitor.h"
#include "cafProgressInfo.h"
2016-07-06 09:49:31 +02:00
#include "cvfBase.h"
2016-06-20 10:11:00 +02:00
#include "opm/parser/eclipse/Deck/DeckItem.hpp"
2016-07-06 09:49:31 +02:00
#include "opm/parser/eclipse/Deck/Section.hpp"
2016-06-20 10:11:00 +02:00
#include "opm/parser/eclipse/Parser/MessageContainer.hpp"
#include "opm/parser/eclipse/Parser/ParseContext.hpp"
#include "opm/parser/eclipse/Parser/Parser.hpp"
2016-07-06 09:49:31 +02:00
#include "../generated-source/include/opm/parser/eclipse/Parser/ParserKeywords/F.hpp"
2016-06-20 10:11:00 +02:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
2017-01-10 09:51:39 +01:00
void RifReaderOpmParserInput :: importGridPropertiesFaults ( const QString & fileName , RigEclipseCaseData * caseData )
2016-06-20 10:11:00 +02:00
{
2016-06-24 12:19:19 +02:00
RiuMainWindow :: instance () -> processMonitor () -> addStringToLog ( QString ( " \n Started reading of grid and properties from file : " + fileName + " \n " ));
2016-06-20 10:11:00 +02:00
{
std :: shared_ptr < const Opm :: EclipseGrid > eclipseGrid ;
std :: string errorMessage ;
2016-07-12 18:54:55 +02:00
std :: shared_ptr < Opm :: Deck > deck ;
2016-06-20 10:11:00 +02:00
try
{
Opm :: Parser parser ;
// A default ParseContext will set up all parsing errors to throw exceptions
Opm :: ParseContext parseContext ;
2016-07-06 09:49:31 +02:00
RifReaderOpmParserInput :: initUsingWarnings ( & parseContext );
2016-06-20 10:11:00 +02:00
deck = parser . parseFile ( fileName . toStdString (), parseContext );
if ( deck )
{
eclipseGrid = Opm :: Parser :: parseGrid ( * deck , parseContext );
2016-10-13 13:39:48 +02:00
if ( eclipseGrid && eclipseGrid -> c_ptr ())
2016-06-20 10:11:00 +02:00
{
2016-10-13 13:39:48 +02:00
RifReaderEclipseOutput :: transferGeometry ( eclipseGrid -> c_ptr (), caseData );
}
else
{
throw std :: invalid_argument ( "No valid 3D grid detected" );
}
2016-06-20 10:11:00 +02:00
2016-10-13 13:39:48 +02:00
Opm :: TableManager tableManager ( * deck );
2016-06-20 10:11:00 +02:00
2016-10-13 13:39:48 +02:00
Opm :: Eclipse3DProperties properties ( * deck , tableManager , * eclipseGrid );
2016-06-20 10:11:00 +02:00
2016-10-13 13:39:48 +02:00
std :: vector < std :: string > predefKeywords = RifReaderOpmParserInput :: knownPropertyKeywords ();
for ( auto keyword : predefKeywords )
{
if ( properties . supportsGridProperty ( keyword ))
2016-06-20 10:11:00 +02:00
{
2016-10-13 13:39:48 +02:00
if ( properties . hasDeckDoubleGridProperty ( keyword ))
2016-06-20 10:11:00 +02:00
{
2016-10-13 13:39:48 +02:00
auto allValues = properties . getDoubleGridProperty ( keyword ). getData ();
2016-06-20 10:11:00 +02:00
2016-10-13 13:39:48 +02:00
QString newResultName = caseData -> results ( RifReaderInterface :: MATRIX_RESULTS ) -> makeResultNameUnique ( QString :: fromStdString ( keyword ));
size_t resultIndex = RifReaderOpmParserPropertyReader :: findOrCreateResult ( newResultName , caseData );
2016-06-20 10:11:00 +02:00
2016-10-13 13:39:48 +02:00
if ( resultIndex != cvf :: UNDEFINED_SIZE_T )
2016-06-20 10:11:00 +02:00
{
2016-10-13 13:39:48 +02:00
std :: vector < std :: vector < double > >& newPropertyData = caseData -> results ( RifReaderInterface :: MATRIX_RESULTS ) -> cellScalarResults ( resultIndex );
newPropertyData . push_back ( allValues );
}
}
else if ( properties . hasDeckIntGridProperty ( keyword ))
{
auto intValues = properties . getIntGridProperty ( keyword ). getData ();
2016-06-20 10:11:00 +02:00
2016-10-13 13:39:48 +02:00
QString newResultName = caseData -> results ( RifReaderInterface :: MATRIX_RESULTS ) -> makeResultNameUnique ( QString :: fromStdString ( keyword ));
size_t resultIndex = RifReaderOpmParserPropertyReader :: findOrCreateResult ( newResultName , caseData );
2016-06-20 10:11:00 +02:00
2016-10-13 13:39:48 +02:00
if ( resultIndex != cvf :: UNDEFINED_SIZE_T )
{
std :: vector < std :: vector < double > >& newPropertyData = caseData -> results ( RifReaderInterface :: MATRIX_RESULTS ) -> cellScalarResults ( resultIndex );
2016-06-20 10:11:00 +02:00
2016-10-13 13:39:48 +02:00
std :: vector < double > doubleValues ;
2016-06-20 10:11:00 +02:00
2016-10-13 13:39:48 +02:00
doubleValues . insert ( std :: end ( doubleValues ), std :: begin ( intValues ), std :: end ( intValues ));
2016-06-20 10:11:00 +02:00
2016-10-13 13:39:48 +02:00
newPropertyData . push_back ( doubleValues );
2016-06-20 10:11:00 +02:00
}
2016-07-12 14:08:05 +02:00
}
}
2016-06-20 10:11:00 +02:00
2016-07-12 18:54:55 +02:00
if ( caseData -> results ( RifReaderInterface :: MATRIX_RESULTS ) -> resultCount () == 0 )
{
// Eclipse3DProperties was not able to extract results. This is often the case when reading a GRDECL file directly
// Parse for known keywords by analyzing the present keywords in the deck
RifReaderOpmParserPropertyReader propertyReader ( deck );
std :: set < std :: string > keywordsOnFile = propertyReader . keywords ();
std :: vector < std :: string > predefKeywords = RifReaderOpmParserInput :: knownPropertyKeywords ();
for ( auto keyword : predefKeywords )
{
if ( std :: find ( keywordsOnFile . begin (), keywordsOnFile . end (), keyword ) != keywordsOnFile . end ())
{
QString newResultName = caseData -> results ( RifReaderInterface :: MATRIX_RESULTS ) -> makeResultNameUnique ( QString :: fromStdString ( keyword ));
propertyReader . copyPropertyToCaseData ( keyword , caseData , newResultName );
}
}
}
2016-07-12 14:08:05 +02:00
if ( caseData -> mainGrid ())
{
cvf :: Collection < RigFault > faults ;
2016-10-21 08:48:33 +02:00
importFaults ( * deck , & faults );
2016-07-12 14:08:05 +02:00
if ( faults . size () > 0 )
{
caseData -> mainGrid () -> setFaults ( faults );
2016-06-20 10:11:00 +02:00
}
}
}
}
}
catch ( std :: exception & e )
{
errorMessage = e . what ();
}
catch (...)
{
errorMessage = "Unknown exception throwm from Opm::Parser" ;
}
if ( deck )
{
const Opm :: MessageContainer & messages = deck -> getMessageContainer ();
if ( messages . size () > 0 )
{
2016-06-24 12:19:19 +02:00
RiuMainWindow :: instance () -> processMonitor () -> addStringToLog ( " \n\n Log messages from Deck : \n " );
2016-06-20 10:11:00 +02:00
}
for ( auto m : messages )
{
2016-06-24 12:19:19 +02:00
RiuMainWindow :: instance () -> processMonitor () -> addStringToLog ( " Deck : " + QString :: fromStdString ( m . message ) + " \n " );
2016-06-20 10:11:00 +02:00
}
}
if ( eclipseGrid )
{
const Opm :: MessageContainer & messages = eclipseGrid -> getMessageContainer ();
if ( messages . size () > 0 )
{
2016-06-24 12:19:19 +02:00
RiuMainWindow :: instance () -> processMonitor () -> addStringToLog ( " \n\n Log messages from EclipseGrid : \n " );
2016-06-20 10:11:00 +02:00
}
for ( auto m : messages )
{
2016-06-24 12:19:19 +02:00
RiuMainWindow :: instance () -> processMonitor () -> addStringToLog ( " EclipseGrid :" + QString :: fromStdString ( m . message ) + " \n " );
2016-06-20 10:11:00 +02:00
}
}
if ( errorMessage . size () > 0 )
{
2016-06-24 12:19:19 +02:00
RiuMainWindow :: instance () -> processMonitor () -> addStringToLog ( " \n\n Error messages : \n " );
2016-06-20 10:11:00 +02:00
RiuMainWindow :: instance () -> processMonitor () -> addStringToLog ( " " + QString :: fromStdString ( errorMessage ) + " \n " );
RiuMainWindow :: instance () -> processMonitor () -> addStringToLog ( QString ( "Failed reading of grid and properties from file : " + fileName + " \n " ));
}
else
{
RiuMainWindow :: instance () -> processMonitor () -> addStringToLog ( QString ( "Completed reading of grid and properties from file : " + fileName + " \n " ));
}
}
}
2016-07-06 09:49:31 +02:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
2016-10-21 08:48:33 +02:00
void RifReaderOpmParserInput :: readFaults ( const QString & fileName , cvf :: Collection < RigFault >* faults )
2016-07-06 09:49:31 +02:00
{
{
std :: string errorMessage ;
try
{
Opm :: Parser parser ;
// A default ParseContext will set up all parsing errors to throw exceptions
Opm :: ParseContext parseContext ;
RifReaderOpmParserInput :: initUsingWarnings ( & parseContext );
auto deckptr = parser . parseFile ( fileName . toStdString (), parseContext );
const Opm :: Deck & deck = * deckptr ;
2016-07-12 14:08:05 +02:00
importFaults ( deck , faults );
2016-07-06 09:49:31 +02:00
2016-07-12 14:08:05 +02:00
}
catch ( std :: exception & e )
{
errorMessage = e . what ();
}
catch (...)
{
errorMessage = "Unknown exception throwm from Opm::Parser" ;
}
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
2016-10-21 08:48:33 +02:00
void RifReaderOpmParserInput :: importFaults ( const Opm :: Deck & deck , cvf :: Collection < RigFault >* faults )
2016-07-12 14:08:05 +02:00
{
{
std :: string errorMessage ;
try
{
2016-07-06 09:49:31 +02:00
RigFault * fault = NULL ;
// The following is based on Opm::FaultCollection
// Not possible to use this class, as the logic in ResInsight handles IJK-values instead
// of cell indices
2016-07-12 14:08:05 +02:00
const auto & faultKeywords = deck . getKeywordList < Opm :: ParserKeywords :: FAULTS > ();
2016-07-06 09:49:31 +02:00
for ( auto keyword_iter = faultKeywords . begin (); keyword_iter != faultKeywords . end (); ++ keyword_iter ) {
const auto & faultsKeyword = * keyword_iter ;
for ( auto iter = faultsKeyword -> begin (); iter != faultsKeyword -> end (); ++ iter ) {
const auto & faultRecord = * iter ;
const std :: string & faultName = faultRecord . getItem ( 0 ). get < std :: string > ( 0 );
int I1 = faultRecord . getItem ( 1 ). get < int > ( 0 ) - 1 ;
int I2 = faultRecord . getItem ( 2 ). get < int > ( 0 ) - 1 ;
int J1 = faultRecord . getItem ( 3 ). get < int > ( 0 ) - 1 ;
int J2 = faultRecord . getItem ( 4 ). get < int > ( 0 ) - 1 ;
int K1 = faultRecord . getItem ( 5 ). get < int > ( 0 ) - 1 ;
int K2 = faultRecord . getItem ( 6 ). get < int > ( 0 ) - 1 ;
const std :: string & faceText = faultRecord . getItem ( 7 ). get < std :: string > ( 0 );
cvf :: StructGridInterface :: FaceEnum cellFaceEnum = RifReaderOpmParserInput :: faceEnumFromText ( QString :: fromStdString ( faceText ));
QString name = QString :: fromStdString ( faultName );
// Guard against invalid cell ranges by limiting lowest possible range value to zero
cvf :: CellRange cellrange ( CVF_MAX ( I1 , 0 ), CVF_MAX ( J1 , 0 ), CVF_MAX ( K1 , 0 ), CVF_MAX ( I2 , 0 ), CVF_MAX ( J2 , 0 ), CVF_MAX ( K2 , 0 ));
if ( ! ( fault && fault -> name () == name ))
{
2016-10-21 08:48:33 +02:00
if ( findFaultByName ( * faults , name ) == cvf :: UNDEFINED_SIZE_T )
2016-07-06 09:49:31 +02:00
{
RigFault * newFault = new RigFault ;
newFault -> setName ( name );
2016-10-21 08:48:33 +02:00
faults -> push_back ( newFault );
2016-07-06 09:49:31 +02:00
}
2016-10-21 08:48:33 +02:00
size_t faultIndex = findFaultByName ( * faults , name );
2016-07-06 09:49:31 +02:00
if ( faultIndex == cvf :: UNDEFINED_SIZE_T )
{
CVF_ASSERT ( faultIndex != cvf :: UNDEFINED_SIZE_T );
continue ;
}
2016-10-21 08:48:33 +02:00
fault = faults -> at ( faultIndex );
2016-07-06 09:49:31 +02:00
}
CVF_ASSERT ( fault );
fault -> addCellRangeForFace ( cellFaceEnum , cellrange );
}
}
}
catch ( std :: exception & e )
{
errorMessage = e . what ();
}
catch (...)
{
errorMessage = "Unknown exception throwm from Opm::Parser" ;
}
}
}
2016-06-20 10:11:00 +02:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std :: vector < std :: string > RifReaderOpmParserInput :: knownPropertyKeywords ()
{
std :: vector < std :: string > knownKeywords ;
knownKeywords . push_back ( "AQUIFERA" );
knownKeywords . push_back ( "ACTNUM" );
knownKeywords . push_back ( "EQLNUM" );
knownKeywords . push_back ( "FIPNUM" );
knownKeywords . push_back ( "KRG" );
knownKeywords . push_back ( "KRGR" );
knownKeywords . push_back ( "KRO" );
knownKeywords . push_back ( "KRORG" );
knownKeywords . push_back ( "KRORW" );
knownKeywords . push_back ( "KRW" );
knownKeywords . push_back ( "KRWR" );
knownKeywords . push_back ( "MINPVV" );
knownKeywords . push_back ( "MULTPV" );
knownKeywords . push_back ( "MULTX" );
knownKeywords . push_back ( "MULTX-" );
knownKeywords . push_back ( "MULTY" );
knownKeywords . push_back ( "MULTY-" );
knownKeywords . push_back ( "MULTZ" );
knownKeywords . push_back ( "NTG" );
knownKeywords . push_back ( "PCG" );
knownKeywords . push_back ( "PCW" );
knownKeywords . push_back ( "PERMX" );
knownKeywords . push_back ( "PERMY" );
knownKeywords . push_back ( "PERMZ" );
knownKeywords . push_back ( "PORO" );
knownKeywords . push_back ( "PVTNUM" );
knownKeywords . push_back ( "SATNUM" );
knownKeywords . push_back ( "SGCR" );
knownKeywords . push_back ( "SGL" );
knownKeywords . push_back ( "SGLPC" );
knownKeywords . push_back ( "SGU" );
knownKeywords . push_back ( "SGWCR" );
knownKeywords . push_back ( "SWATINIT" );
knownKeywords . push_back ( "SWCR" );
knownKeywords . push_back ( "SWGCR" );
knownKeywords . push_back ( "SWL" );
knownKeywords . push_back ( "SWLPC" );
knownKeywords . push_back ( "TRANX" );
knownKeywords . push_back ( "TRANY" );
knownKeywords . push_back ( "TRANZ" );
return knownKeywords ;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std :: vector < std :: string > RifReaderOpmParserInput :: allParserConfigKeys ()
{
std :: vector < std :: string > configKeys ;
configKeys . push_back ( Opm :: ParseContext :: PARSE_UNKNOWN_KEYWORD );
configKeys . push_back ( Opm :: ParseContext :: PARSE_RANDOM_TEXT );
configKeys . push_back ( Opm :: ParseContext :: PARSE_RANDOM_SLASH );
configKeys . push_back ( Opm :: ParseContext :: PARSE_MISSING_DIMS_KEYWORD );
configKeys . push_back ( Opm :: ParseContext :: PARSE_EXTRA_DATA );
configKeys . push_back ( Opm :: ParseContext :: PARSE_MISSING_INCLUDE );
configKeys . push_back ( Opm :: ParseContext :: UNSUPPORTED_SCHEDULE_GEO_MODIFIER );
configKeys . push_back ( Opm :: ParseContext :: UNSUPPORTED_COMPORD_TYPE );
configKeys . push_back ( Opm :: ParseContext :: UNSUPPORTED_INITIAL_THPRES );
configKeys . push_back ( Opm :: ParseContext :: INTERNAL_ERROR_UNINITIALIZED_THPRES );
configKeys . push_back ( Opm :: ParseContext :: PARSE_MISSING_SECTIONS );
return configKeys ;
}
2016-07-06 09:49:31 +02:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
size_t RifReaderOpmParserInput :: findFaultByName ( const cvf :: Collection < RigFault >& faults , const QString & name )
{
for ( size_t i = 0 ; i < faults . size (); i ++ )
{
if ( faults . at ( i ) -> name () == name )
{
return i ;
}
}
return cvf :: UNDEFINED_SIZE_T ;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
cvf :: StructGridInterface :: FaceEnum RifReaderOpmParserInput :: faceEnumFromText ( const QString & faceString )
{
QString upperCaseText = faceString . toUpper (). trimmed ();
if ( upperCaseText == "X" || upperCaseText == "X+" || upperCaseText == "I" || upperCaseText == "I+" ) return cvf :: StructGridInterface :: POS_I ;
if ( upperCaseText == "Y" || upperCaseText == "Y+" || upperCaseText == "J" || upperCaseText == "J+" ) return cvf :: StructGridInterface :: POS_J ;
if ( upperCaseText == "Z" || upperCaseText == "Z+" || upperCaseText == "K" || upperCaseText == "K+" ) return cvf :: StructGridInterface :: POS_K ;
if ( upperCaseText == "X-" || upperCaseText == "I-" ) return cvf :: StructGridInterface :: NEG_I ;
if ( upperCaseText == "Y-" || upperCaseText == "J-" ) return cvf :: StructGridInterface :: NEG_J ;
if ( upperCaseText == "Z-" || upperCaseText == "K-" ) return cvf :: StructGridInterface :: NEG_K ;
return cvf :: StructGridInterface :: NO_FACE ;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RifReaderOpmParserInput :: initUsingWarnings ( Opm :: ParseContext * parseContext )
{
if ( ! parseContext ) return ;
for ( auto state : allParserConfigKeys ())
{
parseContext -> addKey ( state );
}
// Treat all parsing errors as warnings
parseContext -> update ( Opm :: InputError :: WARN );
}
2016-06-20 10:11:00 +02:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
2017-01-10 09:51:39 +01:00
size_t RifReaderOpmParserPropertyReader :: findOrCreateResult ( const QString & newResultName , RigEclipseCaseData * reservoir )
2016-06-20 10:11:00 +02:00
{
size_t resultIndex = reservoir -> results ( RifReaderInterface :: MATRIX_RESULTS ) -> findScalarResultIndex ( newResultName );
if ( resultIndex == cvf :: UNDEFINED_SIZE_T )
{
resultIndex = reservoir -> results ( RifReaderInterface :: MATRIX_RESULTS ) -> addEmptyScalarResult ( RimDefines :: INPUT_PROPERTY , newResultName , false );
}
return resultIndex ;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
2017-01-10 09:51:39 +01:00
void RifReaderOpmParserPropertyReader :: readAllProperties ( std :: shared_ptr < Opm :: Deck > deck , RigEclipseCaseData * caseData , std :: map < QString , QString >* newResults )
2016-06-20 10:11:00 +02:00
{
std :: set < std :: string > uniqueKeywords ;
for ( auto it = deck -> begin (); it != deck -> end (); it ++ )
{
uniqueKeywords . insert ( it -> name ());
}
for ( auto keyword : uniqueKeywords )
{
bool isItemCountEqual = RifReaderOpmParserPropertyReader :: isDataItemCountIdenticalToMainGridCellCount ( deck , keyword , caseData );
if ( isItemCountEqual )
{
std :: vector < double > allValues ;
RifReaderOpmParserPropertyReader :: getAllValuesForKeyword ( deck , keyword , allValues );
QString keywordName = QString :: fromStdString ( keyword );
QString newResultName = caseData -> results ( RifReaderInterface :: MATRIX_RESULTS ) -> makeResultNameUnique ( keywordName );
size_t resultIndex = findOrCreateResult ( newResultName , caseData );
if ( resultIndex != cvf :: UNDEFINED_SIZE_T )
{
std :: vector < std :: vector < double > >& newPropertyData = caseData -> results ( RifReaderInterface :: MATRIX_RESULTS ) -> cellScalarResults ( resultIndex );
newPropertyData . push_back ( allValues );
}
newResults -> insert ( std :: make_pair ( newResultName , keywordName ));
}
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
2016-07-12 18:54:55 +02:00
RifReaderOpmParserPropertyReader :: RifReaderOpmParserPropertyReader ( std :: shared_ptr < Opm :: Deck > deck )
: m_deck ( deck )
2016-06-20 10:11:00 +02:00
{
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
2016-07-12 18:54:55 +02:00
RifReaderOpmParserPropertyReader :: RifReaderOpmParserPropertyReader ( const QString & fileName )
2016-06-20 10:11:00 +02:00
{
2016-07-12 18:54:55 +02:00
open ( fileName );
2016-06-20 10:11:00 +02:00
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RifReaderOpmParserPropertyReader :: open ( const QString & fileName )
{
{
std :: string errorMessage ;
try
{
Opm :: Parser parser ;
// A default ParseContext will set up all parsing errors to throw exceptions
Opm :: ParseContext parseContext ;
// Treat all parsing errors as warnings
parseContext . update ( Opm :: InputError :: WARN );
m_deck = parser . parseFile ( fileName . toStdString (), parseContext );
}
catch ( std :: exception & e )
{
errorMessage = e . what ();
}
catch (...)
{
errorMessage = "Unknown exception throwm from Opm::Parser" ;
}
}
return true ;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
2016-07-12 18:54:55 +02:00
std :: set < std :: string > RifReaderOpmParserPropertyReader :: keywords () const
2016-06-20 10:11:00 +02:00
{
2016-07-12 18:54:55 +02:00
std :: set < std :: string > ids ;
2016-06-20 10:11:00 +02:00
if ( m_deck )
{
for ( auto it = m_deck -> begin (); it != m_deck -> end (); it ++ )
{
2016-07-12 18:54:55 +02:00
ids . insert ( it -> name ());
2016-06-20 10:11:00 +02:00
}
}
return ids ;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
2017-01-10 09:51:39 +01:00
bool RifReaderOpmParserPropertyReader :: copyPropertyToCaseData ( const std :: string & keywordName , RigEclipseCaseData * caseData , const QString & resultName )
2016-06-20 10:11:00 +02:00
{
{
std :: string errorMessage ;
try
{
2016-07-12 18:54:55 +02:00
if ( m_deck -> hasKeyword ( keywordName ))
2016-06-20 10:11:00 +02:00
{
2016-07-12 18:54:55 +02:00
bool isItemCountEqual = isDataItemCountIdenticalToMainGridCellCount ( m_deck , keywordName , caseData );
2016-06-20 10:11:00 +02:00
if ( isItemCountEqual )
{
std :: vector < double > allValues ;
2016-07-12 18:54:55 +02:00
getAllValuesForKeyword ( m_deck , keywordName , allValues );
2016-06-20 10:11:00 +02:00
size_t resultIndex = RifReaderOpmParserPropertyReader :: findOrCreateResult ( resultName , caseData );
if ( resultIndex != cvf :: UNDEFINED_SIZE_T )
{
std :: vector < std :: vector < double > >& newPropertyData = caseData -> results ( RifReaderInterface :: MATRIX_RESULTS ) -> cellScalarResults ( resultIndex );
newPropertyData . push_back ( allValues );
}
}
}
}
catch ( std :: exception & e )
{
errorMessage = e . what ();
}
catch (...)
{
errorMessage = "Unknown exception throwm from Opm::Parser" ;
}
QString fileName = QString :: fromStdString ( m_deck -> getDataFile ());
if ( errorMessage . size () > 0 )
{
RiuMainWindow :: instance () -> processMonitor () -> addStringToLog ( " " + QString :: fromStdString ( errorMessage ) + " \n " );
2016-07-12 18:54:55 +02:00
RiuMainWindow :: instance () -> processMonitor () -> addStringToLog ( QString ( "Error detected while reading property %1 from file : %2 \n " ). arg ( QString :: fromStdString ( keywordName )). arg ( fileName ));
2016-06-20 10:11:00 +02:00
}
else
{
2016-07-12 18:54:55 +02:00
RiuMainWindow :: instance () -> processMonitor () -> addStringToLog ( QString ( "Completed reading of property %1 from file : %2 \n " ). arg ( QString :: fromStdString ( keywordName )). arg ( fileName ));
2016-06-20 10:11:00 +02:00
}
}
return true ;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RifReaderOpmParserPropertyReader :: getAllValuesForKeyword ( std :: shared_ptr < Opm :: Deck > deck , const std :: string & keyword , std :: vector < double >& allValues )
{
for ( auto deckKeyword : deck -> getKeywordList ( keyword ))
{
if ( deckKeyword -> isDataKeyword () && deckKeyword -> size () == 1 )
{
auto deckRecord = deckKeyword -> getDataRecord ();
if ( deckRecord . size () == 1 )
{
if ( deckRecord . getDataItem (). typeof () == Opm :: DeckItem :: integer )
{
auto opmData = deckKeyword -> getIntData ();
allValues . insert ( std :: end ( allValues ), std :: begin ( opmData ), std :: end ( opmData ));
}
else if ( deckRecord . getDataItem (). typeof () == Opm :: DeckItem :: fdouble )
{
auto opmData = deckKeyword -> getRawDoubleData ();
allValues . insert ( std :: end ( allValues ), std :: begin ( opmData ), std :: end ( opmData ));
}
}
}
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
2017-01-10 09:51:39 +01:00
bool RifReaderOpmParserPropertyReader :: isDataItemCountIdenticalToMainGridCellCount ( std :: shared_ptr < Opm :: Deck > deck , const std :: string & keyword , RigEclipseCaseData * caseData )
2016-06-20 10:11:00 +02:00
{
bool isEqual = false ;
{
size_t valueCount = 0 ;
for ( auto deckKeyword : deck -> getKeywordList ( keyword ))
{
if ( deckKeyword -> isDataKeyword ())
{
valueCount += deckKeyword -> getDataSize ();
}
}
if ( valueCount == caseData -> mainGrid () -> cellCount ())
{
isEqual = true ;
}
}
return isEqual ;
}