mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#7622 Summary Restart : Add summary restart reader
Move libecl reader into RifEclEclipseSummary Add a summary file restart history reader Simplify RifEclipseSummary
This commit is contained in:
parent
6ed6b17543
commit
2c91725365
@ -235,7 +235,7 @@ RicSummaryCaseRestartDialogResult RicSummaryCaseRestartDialog::openDialog( const
|
|||||||
RifRestartFileInfo currentFileInfo;
|
RifRestartFileInfo currentFileInfo;
|
||||||
if ( !initialSummaryFile.isEmpty() )
|
if ( !initialSummaryFile.isEmpty() )
|
||||||
{
|
{
|
||||||
currentFileInfo = dialog.getFileInfo( initialSummaryFile );
|
currentFileInfo = RifEclipseSummaryTools::getFileInfo( initialSummaryFile );
|
||||||
|
|
||||||
if ( !currentFileInfo.valid() )
|
if ( !currentFileInfo.valid() )
|
||||||
{
|
{
|
||||||
@ -270,12 +270,12 @@ RicSummaryCaseRestartDialogResult RicSummaryCaseRestartDialog::openDialog( const
|
|||||||
( lastResult && lastResult->applyToAll ) );
|
( lastResult && lastResult->applyToAll ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
RifReaderEclipseSummary reader;
|
std::vector<QString> warnings;
|
||||||
bool hasWarnings = false;
|
std::vector<RifRestartFileInfo> originFileInfos =
|
||||||
std::vector<RifRestartFileInfo> originFileInfos = reader.getRestartFiles( initialSummaryFile, &hasWarnings );
|
RifEclipseSummaryTools::getRestartFiles( initialSummaryFile, warnings );
|
||||||
|
|
||||||
// If no restart files are found and no warnings, do not show dialog
|
// If no restart files are found and no warnings, do not show dialog
|
||||||
if ( originFileInfos.empty() && !hasWarnings )
|
if ( originFileInfos.empty() && warnings.empty() )
|
||||||
{
|
{
|
||||||
return RicSummaryCaseRestartDialogResult( RicSummaryCaseRestartDialogResult::SUMMARY_OK,
|
return RicSummaryCaseRestartDialogResult( RicSummaryCaseRestartDialogResult::SUMMARY_OK,
|
||||||
ImportOptions::NOT_IMPORT,
|
ImportOptions::NOT_IMPORT,
|
||||||
@ -292,11 +292,8 @@ RicSummaryCaseRestartDialogResult RicSummaryCaseRestartDialog::openDialog( const
|
|||||||
dialogResult.summaryFiles.clear();
|
dialogResult.summaryFiles.clear();
|
||||||
dialogResult.gridFiles.clear();
|
dialogResult.gridFiles.clear();
|
||||||
|
|
||||||
if ( hasWarnings )
|
for ( const QString& warning : warnings )
|
||||||
{
|
RiaLogging::error( warning );
|
||||||
for ( const QString& warning : reader.warnings() )
|
|
||||||
RiaLogging::error( warning );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -369,7 +366,7 @@ RicSummaryCaseRestartDialogResult RicSummaryCaseRestartDialog::openDialog( const
|
|||||||
dialog.updateFileListWidget( dialog.m_gridFilesLayout, GRID_FILES_LIST_INDEX );
|
dialog.updateFileListWidget( dialog.m_gridFilesLayout, GRID_FILES_LIST_INDEX );
|
||||||
|
|
||||||
// Display warnings if any
|
// Display warnings if any
|
||||||
dialog.displayWarningsIfAny( reader.warnings() );
|
dialog.displayWarningsIfAny( warnings );
|
||||||
|
|
||||||
// Set properties and show dialog
|
// Set properties and show dialog
|
||||||
dialog.setWindowTitle( "Origin Files" );
|
dialog.setWindowTitle( "Origin Files" );
|
||||||
@ -544,18 +541,9 @@ void RicSummaryCaseRestartDialog::appendTextToGridLayout( QGridLayout* gridLayou
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
RifRestartFileInfo RicSummaryCaseRestartDialog::getFileInfo( const QString& summaryHeaderFile )
|
void RicSummaryCaseRestartDialog::displayWarningsIfAny( const std::vector<QString>& warnings )
|
||||||
{
|
{
|
||||||
RifReaderEclipseSummary reader;
|
m_warnings->setVisible( !warnings.empty() );
|
||||||
return reader.getFileInfo( summaryHeaderFile );
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
///
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
void RicSummaryCaseRestartDialog::displayWarningsIfAny( const QStringList& warnings )
|
|
||||||
{
|
|
||||||
m_warnings->setVisible( !warnings.isEmpty() );
|
|
||||||
for ( const auto& warning : warnings )
|
for ( const auto& warning : warnings )
|
||||||
{
|
{
|
||||||
QListWidgetItem* item = new QListWidgetItem( warning, m_warnings );
|
QListWidgetItem* item = new QListWidgetItem( warning, m_warnings );
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
|
|
||||||
#include "Rim3dOverlayInfoConfig.h"
|
#include "Rim3dOverlayInfoConfig.h"
|
||||||
|
|
||||||
#include "RifReaderEclipseSummary.h"
|
#include "RifEclipseSummaryTools.h"
|
||||||
|
|
||||||
#include "cafPdmPointer.h"
|
#include "cafPdmPointer.h"
|
||||||
|
|
||||||
@ -81,14 +81,13 @@ public:
|
|||||||
bool okToAllSelected() const;
|
bool okToAllSelected() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void updateFileListWidget( QGridLayout* gridLayout, int listIndex );
|
void updateFileListWidget( QGridLayout* gridLayout, int listIndex );
|
||||||
void appendFileInfoToGridLayout( QGridLayout* gridLayout,
|
void appendFileInfoToGridLayout( QGridLayout* gridLayout,
|
||||||
const RifRestartFileInfo& fileInfo,
|
const RifRestartFileInfo& fileInfo,
|
||||||
const QString& fullPathFileName );
|
const QString& fullPathFileName );
|
||||||
void appendTextToGridLayout( QGridLayout* gridLayout, const QString& text );
|
void appendTextToGridLayout( QGridLayout* gridLayout, const QString& text );
|
||||||
RifRestartFileInfo getFileInfo( const QString& summaryHeaderFile );
|
void displayWarningsIfAny( const std::vector<QString>& warnings );
|
||||||
void displayWarningsIfAny( const QStringList& warnings );
|
QString fullFileName( const QString& shortOrFullFileName );
|
||||||
QString fullFileName( const QString& shortOrFullFileName );
|
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void slotShowFullPathToggled( int state );
|
void slotShowFullPathToggled( int state );
|
||||||
|
@ -62,6 +62,8 @@ ${CMAKE_CURRENT_LIST_DIR}/RifStimPlanModelAsymmetricFrkExporter.h
|
|||||||
${CMAKE_CURRENT_LIST_DIR}/RifSurfaceExporter.h
|
${CMAKE_CURRENT_LIST_DIR}/RifSurfaceExporter.h
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RifOpmCommonSummary.h
|
${CMAKE_CURRENT_LIST_DIR}/RifOpmCommonSummary.h
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RifEnsembleFractureStatisticsExporter.h
|
${CMAKE_CURRENT_LIST_DIR}/RifEnsembleFractureStatisticsExporter.h
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/RifSummaryReaderMultipleFiles.h
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/RifEclEclipseSummary.h
|
||||||
|
|
||||||
# HDF5 file reader is directly included in ResInsight main CmakeList.txt
|
# HDF5 file reader is directly included in ResInsight main CmakeList.txt
|
||||||
#${CMAKE_CURRENT_LIST_DIR}/RifHdf5Reader.h
|
#${CMAKE_CURRENT_LIST_DIR}/RifHdf5Reader.h
|
||||||
@ -128,6 +130,8 @@ ${CMAKE_CURRENT_LIST_DIR}/RifStimPlanModelAsymmetricFrkExporter.cpp
|
|||||||
${CMAKE_CURRENT_LIST_DIR}/RifSurfaceExporter.cpp
|
${CMAKE_CURRENT_LIST_DIR}/RifSurfaceExporter.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RifOpmCommonSummary.cpp
|
${CMAKE_CURRENT_LIST_DIR}/RifOpmCommonSummary.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RifEnsembleFractureStatisticsExporter.cpp
|
${CMAKE_CURRENT_LIST_DIR}/RifEnsembleFractureStatisticsExporter.cpp
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/RifSummaryReaderMultipleFiles.cpp
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/RifEclEclipseSummary.cpp
|
||||||
|
|
||||||
# HDF5 file reader is directly included in ResInsight main CmakeList.txt
|
# HDF5 file reader is directly included in ResInsight main CmakeList.txt
|
||||||
#${CMAKE_CURRENT_LIST_DIR}/RifHdf5Reader.cpp
|
#${CMAKE_CURRENT_LIST_DIR}/RifHdf5Reader.cpp
|
||||||
|
354
ApplicationLibCode/FileInterface/RifEclEclipseSummary.cpp
Normal file
354
ApplicationLibCode/FileInterface/RifEclEclipseSummary.cpp
Normal file
@ -0,0 +1,354 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Copyright (C) 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 "RifEclEclipseSummary.h"
|
||||||
|
|
||||||
|
#include "RiaFilePathTools.h"
|
||||||
|
#include "RiaLogging.h"
|
||||||
|
#include "RiaPreferences.h"
|
||||||
|
#include "RiaPreferencesSummary.h"
|
||||||
|
#include "RiaStdStringTools.h"
|
||||||
|
#include "RiaStringEncodingTools.h"
|
||||||
|
|
||||||
|
#include "RifEclipseSummaryTools.h"
|
||||||
|
#include "RifOpmCommonSummary.h"
|
||||||
|
#include "RifReaderEclipseOutput.h"
|
||||||
|
|
||||||
|
#include <cassert>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include <QDateTime>
|
||||||
|
#include <QDir>
|
||||||
|
#include <QString>
|
||||||
|
#include <QStringList>
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
RifEclEclipseSummary::RifEclEclipseSummary()
|
||||||
|
: m_ecl_sum( nullptr )
|
||||||
|
, m_ecl_SmSpec( nullptr )
|
||||||
|
, m_unitSystem( RiaDefines::EclipseUnitSystem::UNITS_METRIC )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
RifEclEclipseSummary::~RifEclEclipseSummary()
|
||||||
|
{
|
||||||
|
if ( m_ecl_sum )
|
||||||
|
{
|
||||||
|
RifEclipseSummaryTools::closeEclSum( m_ecl_sum );
|
||||||
|
|
||||||
|
m_ecl_sum = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
bool RifEclEclipseSummary::open( const QString& headerFileName, RiaThreadSafeLogger* threadSafeLogger )
|
||||||
|
{
|
||||||
|
assert( m_ecl_sum == nullptr );
|
||||||
|
|
||||||
|
m_ecl_sum = RifEclipseSummaryTools::openEclSum( headerFileName, false );
|
||||||
|
if ( m_ecl_sum )
|
||||||
|
{
|
||||||
|
m_timeSteps.clear();
|
||||||
|
m_ecl_SmSpec = ecl_sum_get_smspec( m_ecl_sum );
|
||||||
|
m_timeSteps = RifEclipseSummaryTools::getTimeSteps( m_ecl_sum );
|
||||||
|
m_unitSystem = RifEclipseSummaryTools::readUnitSystem( m_ecl_sum );
|
||||||
|
}
|
||||||
|
|
||||||
|
buildMetaData();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
std::string stringFromPointer( const char* pointerToChar )
|
||||||
|
{
|
||||||
|
std::string myString;
|
||||||
|
|
||||||
|
// NB! Assigning a null pointer to a std::string causes runtime crash
|
||||||
|
if ( pointerToChar )
|
||||||
|
{
|
||||||
|
myString = pointerToChar;
|
||||||
|
|
||||||
|
replace( myString.begin(), myString.end(), '\t', ' ' );
|
||||||
|
}
|
||||||
|
|
||||||
|
return myString;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
RifEclipseSummaryAddress addressFromErtSmSpecNode( const ecl::smspec_node& ertSumVarNode )
|
||||||
|
{
|
||||||
|
if ( ertSumVarNode.get_var_type() == ECL_SMSPEC_INVALID_VAR )
|
||||||
|
{
|
||||||
|
return RifEclipseSummaryAddress();
|
||||||
|
}
|
||||||
|
|
||||||
|
RifEclipseSummaryAddress::SummaryVarCategory sumCategory( RifEclipseSummaryAddress::SUMMARY_INVALID );
|
||||||
|
std::string quantityName;
|
||||||
|
int regionNumber( -1 );
|
||||||
|
int regionNumber2( -1 );
|
||||||
|
std::string wellGroupName;
|
||||||
|
std::string wellName;
|
||||||
|
int wellSegmentNumber( -1 );
|
||||||
|
std::string lgrName;
|
||||||
|
int cellI( -1 );
|
||||||
|
int cellJ( -1 );
|
||||||
|
int cellK( -1 );
|
||||||
|
int aquiferNumber( -1 );
|
||||||
|
bool isErrorResult( false );
|
||||||
|
int id( -1 );
|
||||||
|
|
||||||
|
quantityName = stringFromPointer( ertSumVarNode.get_keyword() );
|
||||||
|
|
||||||
|
switch ( ertSumVarNode.get_var_type() )
|
||||||
|
{
|
||||||
|
case ECL_SMSPEC_AQUIFER_VAR:
|
||||||
|
{
|
||||||
|
sumCategory = RifEclipseSummaryAddress::SUMMARY_AQUIFER;
|
||||||
|
aquiferNumber = ertSumVarNode.get_num();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ECL_SMSPEC_WELL_VAR:
|
||||||
|
{
|
||||||
|
sumCategory = RifEclipseSummaryAddress::SUMMARY_WELL;
|
||||||
|
wellName = stringFromPointer( ertSumVarNode.get_wgname() );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ECL_SMSPEC_REGION_VAR:
|
||||||
|
{
|
||||||
|
sumCategory = RifEclipseSummaryAddress::SUMMARY_REGION;
|
||||||
|
regionNumber = ertSumVarNode.get_num();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ECL_SMSPEC_FIELD_VAR:
|
||||||
|
{
|
||||||
|
sumCategory = RifEclipseSummaryAddress::SUMMARY_FIELD;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ECL_SMSPEC_GROUP_VAR:
|
||||||
|
{
|
||||||
|
sumCategory = RifEclipseSummaryAddress::SUMMARY_WELL_GROUP;
|
||||||
|
wellGroupName = stringFromPointer( ertSumVarNode.get_wgname() );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ECL_SMSPEC_BLOCK_VAR:
|
||||||
|
{
|
||||||
|
sumCategory = RifEclipseSummaryAddress::SUMMARY_BLOCK;
|
||||||
|
|
||||||
|
auto ijk = ertSumVarNode.get_ijk();
|
||||||
|
cellI = ijk[0];
|
||||||
|
cellJ = ijk[1];
|
||||||
|
cellK = ijk[2];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ECL_SMSPEC_COMPLETION_VAR:
|
||||||
|
{
|
||||||
|
sumCategory = RifEclipseSummaryAddress::SUMMARY_WELL_COMPLETION;
|
||||||
|
wellName = stringFromPointer( ertSumVarNode.get_wgname() );
|
||||||
|
|
||||||
|
auto ijk = ertSumVarNode.get_ijk();
|
||||||
|
cellI = ijk[0];
|
||||||
|
cellJ = ijk[1];
|
||||||
|
cellK = ijk[2];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ECL_SMSPEC_LOCAL_BLOCK_VAR:
|
||||||
|
{
|
||||||
|
sumCategory = RifEclipseSummaryAddress::SUMMARY_BLOCK_LGR;
|
||||||
|
lgrName = stringFromPointer( ertSumVarNode.get_lgr_name() );
|
||||||
|
|
||||||
|
auto ijk = ertSumVarNode.get_lgr_ijk();
|
||||||
|
cellI = ijk[0];
|
||||||
|
cellJ = ijk[1];
|
||||||
|
cellK = ijk[2];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ECL_SMSPEC_LOCAL_COMPLETION_VAR:
|
||||||
|
{
|
||||||
|
sumCategory = RifEclipseSummaryAddress::SUMMARY_WELL_COMPLETION_LGR;
|
||||||
|
wellName = stringFromPointer( ertSumVarNode.get_wgname() );
|
||||||
|
lgrName = stringFromPointer( ertSumVarNode.get_lgr_name() );
|
||||||
|
|
||||||
|
auto ijk = ertSumVarNode.get_lgr_ijk();
|
||||||
|
cellI = ijk[0];
|
||||||
|
cellJ = ijk[1];
|
||||||
|
cellK = ijk[2];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ECL_SMSPEC_LOCAL_WELL_VAR:
|
||||||
|
{
|
||||||
|
sumCategory = RifEclipseSummaryAddress::SUMMARY_WELL_LGR;
|
||||||
|
wellName = stringFromPointer( ertSumVarNode.get_wgname() );
|
||||||
|
lgrName = stringFromPointer( ertSumVarNode.get_lgr_name() );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ECL_SMSPEC_NETWORK_VAR:
|
||||||
|
{
|
||||||
|
sumCategory = RifEclipseSummaryAddress::SUMMARY_NETWORK;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ECL_SMSPEC_REGION_2_REGION_VAR:
|
||||||
|
{
|
||||||
|
sumCategory = RifEclipseSummaryAddress::SUMMARY_REGION_2_REGION;
|
||||||
|
regionNumber = ertSumVarNode.get_R1();
|
||||||
|
regionNumber2 = ertSumVarNode.get_R2();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ECL_SMSPEC_SEGMENT_VAR:
|
||||||
|
{
|
||||||
|
sumCategory = RifEclipseSummaryAddress::SUMMARY_WELL_SEGMENT;
|
||||||
|
wellName = stringFromPointer( ertSumVarNode.get_wgname() );
|
||||||
|
wellSegmentNumber = ertSumVarNode.get_num();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ECL_SMSPEC_MISC_VAR:
|
||||||
|
{
|
||||||
|
sumCategory = RifEclipseSummaryAddress::SUMMARY_MISC;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
CVF_ASSERT( false );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return RifEclipseSummaryAddress( sumCategory,
|
||||||
|
quantityName,
|
||||||
|
regionNumber,
|
||||||
|
regionNumber2,
|
||||||
|
wellGroupName,
|
||||||
|
wellName,
|
||||||
|
wellSegmentNumber,
|
||||||
|
lgrName,
|
||||||
|
cellI,
|
||||||
|
cellJ,
|
||||||
|
cellK,
|
||||||
|
aquiferNumber,
|
||||||
|
isErrorResult,
|
||||||
|
id );
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
bool RifEclEclipseSummary::values( const RifEclipseSummaryAddress& resultAddress, std::vector<double>* values ) const
|
||||||
|
{
|
||||||
|
CVF_ASSERT( values );
|
||||||
|
|
||||||
|
if ( m_timeSteps.empty() ) return true;
|
||||||
|
|
||||||
|
values->clear();
|
||||||
|
values->reserve( m_timeSteps.size() );
|
||||||
|
|
||||||
|
if ( m_ecl_SmSpec )
|
||||||
|
{
|
||||||
|
int variableIndex = indexFromAddress( resultAddress );
|
||||||
|
if ( variableIndex < 0 ) return false;
|
||||||
|
|
||||||
|
const ecl::smspec_node& ertSumVarNode = ecl_smspec_iget_node_w_node_index( m_ecl_SmSpec, variableIndex );
|
||||||
|
int paramsIndex = ertSumVarNode.get_params_index();
|
||||||
|
|
||||||
|
double_vector_type* dataValues = ecl_sum_alloc_data_vector( m_ecl_sum, paramsIndex, false );
|
||||||
|
|
||||||
|
if ( dataValues )
|
||||||
|
{
|
||||||
|
int dataSize = double_vector_size( dataValues );
|
||||||
|
const double* dataPtr = double_vector_get_const_ptr( dataValues );
|
||||||
|
values->insert( values->end(), dataPtr, dataPtr + dataSize );
|
||||||
|
double_vector_free( dataValues );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
const std::vector<time_t>& RifEclEclipseSummary::timeSteps( const RifEclipseSummaryAddress& resultAddress ) const
|
||||||
|
{
|
||||||
|
return m_timeSteps;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
int RifEclEclipseSummary::indexFromAddress( const RifEclipseSummaryAddress& resultAddress ) const
|
||||||
|
{
|
||||||
|
auto it = m_resultAddressToErtNodeIdx.find( resultAddress );
|
||||||
|
if ( it != m_resultAddressToErtNodeIdx.end() )
|
||||||
|
{
|
||||||
|
return it->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RifEclEclipseSummary::buildMetaData()
|
||||||
|
{
|
||||||
|
m_allResultAddresses.clear();
|
||||||
|
m_resultAddressToErtNodeIdx.clear();
|
||||||
|
|
||||||
|
if ( m_ecl_SmSpec )
|
||||||
|
{
|
||||||
|
int varCount = ecl_smspec_num_nodes( m_ecl_SmSpec );
|
||||||
|
for ( int i = 0; i < varCount; i++ )
|
||||||
|
{
|
||||||
|
const ecl::smspec_node& ertSumVarNode = ecl_smspec_iget_node_w_node_index( m_ecl_SmSpec, i );
|
||||||
|
RifEclipseSummaryAddress addr = addressFromErtSmSpecNode( ertSumVarNode );
|
||||||
|
m_allResultAddresses.insert( addr );
|
||||||
|
m_resultAddressToErtNodeIdx[addr] = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
std::string RifEclEclipseSummary::unitName( const RifEclipseSummaryAddress& resultAddress ) const
|
||||||
|
{
|
||||||
|
if ( !m_ecl_SmSpec ) return "";
|
||||||
|
|
||||||
|
int variableIndex = indexFromAddress( resultAddress );
|
||||||
|
|
||||||
|
if ( variableIndex < 0 ) return "";
|
||||||
|
|
||||||
|
const ecl::smspec_node& ertSumVarNode = ecl_smspec_iget_node_w_node_index( m_ecl_SmSpec, variableIndex );
|
||||||
|
return ertSumVarNode.get_unit();
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
RiaDefines::EclipseUnitSystem RifEclEclipseSummary::unitSystem() const
|
||||||
|
{
|
||||||
|
return m_unitSystem;
|
||||||
|
}
|
69
ApplicationLibCode/FileInterface/RifEclEclipseSummary.h
Normal file
69
ApplicationLibCode/FileInterface/RifEclEclipseSummary.h
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Copyright (C) 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.
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "RiaDefines.h"
|
||||||
|
|
||||||
|
#include "RifEclipseSummaryAddress.h"
|
||||||
|
#include "RifSummaryReaderInterface.h"
|
||||||
|
|
||||||
|
#include "ert/ecl/ecl_sum.hpp"
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
#include <QStringList>
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
#include <memory>
|
||||||
|
#include <set>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
class RiaThreadSafeLogger;
|
||||||
|
|
||||||
|
//==================================================================================================
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//==================================================================================================
|
||||||
|
class RifEclEclipseSummary : public RifSummaryReaderInterface
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
RifEclEclipseSummary();
|
||||||
|
~RifEclEclipseSummary() override;
|
||||||
|
|
||||||
|
bool open( const QString& headerFileName, RiaThreadSafeLogger* threadSafeLogger );
|
||||||
|
|
||||||
|
const std::vector<time_t>& timeSteps( const RifEclipseSummaryAddress& resultAddress ) const override;
|
||||||
|
|
||||||
|
bool values( const RifEclipseSummaryAddress& resultAddress, std::vector<double>* values ) const override;
|
||||||
|
std::string unitName( const RifEclipseSummaryAddress& resultAddress ) const override;
|
||||||
|
RiaDefines::EclipseUnitSystem unitSystem() const override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
int indexFromAddress( const RifEclipseSummaryAddress& resultAddress ) const;
|
||||||
|
void buildMetaData();
|
||||||
|
|
||||||
|
private:
|
||||||
|
ecl_sum_type* m_ecl_sum;
|
||||||
|
const ecl_smspec_type* m_ecl_SmSpec;
|
||||||
|
std::vector<time_t> m_timeSteps;
|
||||||
|
|
||||||
|
RiaDefines::EclipseUnitSystem m_unitSystem;
|
||||||
|
|
||||||
|
std::map<RifEclipseSummaryAddress, int> m_resultAddressToErtNodeIdx;
|
||||||
|
};
|
@ -25,8 +25,14 @@
|
|||||||
|
|
||||||
#include "cafAppEnum.h"
|
#include "cafAppEnum.h"
|
||||||
|
|
||||||
|
#include "ert/ecl/ecl_file.h"
|
||||||
|
#include "ert/ecl/ecl_kw.h"
|
||||||
|
#include "ert/ecl/ecl_kw_magic.h"
|
||||||
|
#include "ert/ecl/ecl_sum.h"
|
||||||
#include "ert/ecl/ecl_util.h"
|
#include "ert/ecl/ecl_util.h"
|
||||||
|
#include "ert/ecl/smspec_node.hpp"
|
||||||
|
|
||||||
|
#include <QDateTime>
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
@ -127,7 +133,7 @@ QString RifEclipseSummaryTools::findGridCaseFileFromSummaryHeaderFile( const QSt
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
void RifEclipseSummaryTools::dumpMetaData( RifSummaryReaderInterface* readerEclipseSummary )
|
void RifEclipseSummaryTools::dumpMetaData( RifSummaryReaderInterface* readerEclipseSummary )
|
||||||
{
|
{
|
||||||
std::set<RifEclipseSummaryAddress> addresses = readerEclipseSummary->allResultAddresses();
|
const std::set<RifEclipseSummaryAddress>& addresses = readerEclipseSummary->allResultAddresses();
|
||||||
|
|
||||||
for ( int category = 0; category < RifEclipseSummaryAddress::SUMMARY_BLOCK_LGR; category++ )
|
for ( int category = 0; category < RifEclipseSummaryAddress::SUMMARY_BLOCK_LGR; category++ )
|
||||||
{
|
{
|
||||||
@ -137,18 +143,18 @@ void RifEclipseSummaryTools::dumpMetaData( RifSummaryReaderInterface* readerEcli
|
|||||||
std::vector<RifEclipseSummaryAddress> catAddresses =
|
std::vector<RifEclipseSummaryAddress> catAddresses =
|
||||||
RiaSummaryCurveAnalyzer::addressesForCategory( addresses, categoryEnum );
|
RiaSummaryCurveAnalyzer::addressesForCategory( addresses, categoryEnum );
|
||||||
|
|
||||||
if ( catAddresses.size() > 0 )
|
if ( !catAddresses.empty() )
|
||||||
{
|
{
|
||||||
std::cout << caf::AppEnum<RifEclipseSummaryAddress::SummaryVarCategory>::uiText( categoryEnum ).toStdString()
|
std::cout << caf::AppEnum<RifEclipseSummaryAddress::SummaryVarCategory>::uiText( categoryEnum ).toStdString()
|
||||||
<< " count : " << catAddresses.size() << std::endl;
|
<< " count : " << catAddresses.size() << std::endl;
|
||||||
|
|
||||||
for ( size_t i = 0; i < catAddresses.size(); i++ )
|
for ( const auto& catAddresse : catAddresses )
|
||||||
{
|
{
|
||||||
std::cout << catAddresses[i].quantityName() << " " << catAddresses[i].regionNumber() << " "
|
std::cout << catAddresse.quantityName() << " " << catAddresse.regionNumber() << " "
|
||||||
<< catAddresses[i].regionNumber2() << " " << catAddresses[i].wellGroupName() << " "
|
<< catAddresse.regionNumber2() << " " << catAddresse.wellGroupName() << " "
|
||||||
<< catAddresses[i].wellName() << " " << catAddresses[i].wellSegmentNumber() << " "
|
<< catAddresse.wellName() << " " << catAddresse.wellSegmentNumber() << " "
|
||||||
<< catAddresses[i].lgrName() << " " << catAddresses[i].cellI() << " "
|
<< catAddresse.lgrName() << " " << catAddresse.cellI() << " " << catAddresse.cellJ() << " "
|
||||||
<< catAddresses[i].cellJ() << " " << catAddresses[i].cellK() << std::endl;
|
<< catAddresse.cellK() << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::cout << std::endl;
|
std::cout << std::endl;
|
||||||
@ -156,6 +162,88 @@ void RifEclipseSummaryTools::dumpMetaData( RifSummaryReaderInterface* readerEcli
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
std::vector<RifRestartFileInfo> RifEclipseSummaryTools::getRestartFiles( const QString& headerFileName,
|
||||||
|
std::vector<QString>& warnings )
|
||||||
|
{
|
||||||
|
std::vector<RifRestartFileInfo> restartFiles;
|
||||||
|
|
||||||
|
std::set<QString> restartFilesOpened;
|
||||||
|
|
||||||
|
RifRestartFileInfo currFile;
|
||||||
|
currFile.fileName = headerFileName;
|
||||||
|
while ( !currFile.fileName.isEmpty() )
|
||||||
|
{
|
||||||
|
// Due to a weakness in libecl regarding restart summary header file selection,
|
||||||
|
// do some extra checking
|
||||||
|
{
|
||||||
|
QString formattedHeaderExtension = ".FSMSPEC";
|
||||||
|
QString nonformattedHeaderExtension = ".SMSPEC";
|
||||||
|
QString formattedDataFileExtension = ".FUNSMRY";
|
||||||
|
|
||||||
|
if ( currFile.fileName.endsWith( nonformattedHeaderExtension, Qt::CaseInsensitive ) )
|
||||||
|
{
|
||||||
|
QString formattedHeaderFile = currFile.fileName;
|
||||||
|
formattedHeaderFile.replace( nonformattedHeaderExtension, formattedHeaderExtension, Qt::CaseInsensitive );
|
||||||
|
QString formattedDateFile = currFile.fileName;
|
||||||
|
formattedDateFile.replace( nonformattedHeaderExtension, formattedDataFileExtension, Qt::CaseInsensitive );
|
||||||
|
|
||||||
|
QFileInfo nonformattedHeaderFileInfo = QFileInfo( currFile.fileName );
|
||||||
|
QFileInfo formattedHeaderFileInfo = QFileInfo( formattedHeaderFile );
|
||||||
|
QFileInfo formattedDateFileInfo = QFileInfo( formattedDateFile );
|
||||||
|
if ( formattedHeaderFileInfo.lastModified() < nonformattedHeaderFileInfo.lastModified() &&
|
||||||
|
formattedHeaderFileInfo.exists() && !formattedDateFileInfo.exists() )
|
||||||
|
{
|
||||||
|
warnings.push_back(
|
||||||
|
QString( "RifReaderEclipseSummary: Formatted summary header file without an\n" ) +
|
||||||
|
QString( "associated data file detected.\n" ) +
|
||||||
|
QString( "This may cause a failure reading summary origin data.\n" ) +
|
||||||
|
QString( "To avoid this problem, please delete or rename the.FSMSPEC file." ) );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
QString prevFile = currFile.fileName;
|
||||||
|
currFile = getRestartFile( currFile.fileName );
|
||||||
|
|
||||||
|
// Fix to stop potential infinite loop
|
||||||
|
if ( currFile.fileName == prevFile )
|
||||||
|
{
|
||||||
|
warnings.push_back( "RifReaderEclipseSummary: Restart file reference loop detected" );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if ( restartFilesOpened.count( currFile.fileName ) != 0u )
|
||||||
|
{
|
||||||
|
warnings.push_back( "RifReaderEclipseSummary: Same restart file being opened multiple times" );
|
||||||
|
}
|
||||||
|
restartFilesOpened.insert( currFile.fileName );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !currFile.fileName.isEmpty() ) restartFiles.push_back( currFile );
|
||||||
|
}
|
||||||
|
return restartFiles;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
RifRestartFileInfo RifEclipseSummaryTools::getFileInfo( const QString& headerFileName )
|
||||||
|
{
|
||||||
|
RifRestartFileInfo fileInfo;
|
||||||
|
ecl_sum_type* ecl_sum = openEclSum( headerFileName, false );
|
||||||
|
std::vector<time_t> timeSteps = getTimeSteps( ecl_sum );
|
||||||
|
if ( !timeSteps.empty() )
|
||||||
|
{
|
||||||
|
fileInfo.fileName = headerFileName;
|
||||||
|
fileInfo.startDate = timeSteps.front();
|
||||||
|
fileInfo.endDate = timeSteps.back();
|
||||||
|
}
|
||||||
|
closeEclSum( ecl_sum );
|
||||||
|
|
||||||
|
return fileInfo;
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@ -193,3 +281,124 @@ void RifEclipseSummaryTools::findSummaryHeaderFileInfo( const QString& inputFile
|
|||||||
free( myBase );
|
free( myBase );
|
||||||
free( myPath );
|
free( myPath );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
RifRestartFileInfo RifEclipseSummaryTools::getRestartFile( const QString& headerFileName )
|
||||||
|
{
|
||||||
|
ecl_sum_type* ecl_sum = openEclSum( headerFileName, true );
|
||||||
|
|
||||||
|
const ecl_smspec_type* smspec = ecl_sum ? ecl_sum_get_smspec( ecl_sum ) : nullptr;
|
||||||
|
const char* rstCase = smspec ? ecl_smspec_get_restart_case( smspec ) : nullptr;
|
||||||
|
QString restartCase =
|
||||||
|
rstCase ? RiaFilePathTools::canonicalPath( RiaStringEncodingTools::fromNativeEncoded( rstCase ) ) : "";
|
||||||
|
closeEclSum( ecl_sum );
|
||||||
|
|
||||||
|
if ( !restartCase.isEmpty() )
|
||||||
|
{
|
||||||
|
QString path = QFileInfo( restartCase ).dir().path();
|
||||||
|
QString restartBase = QDir( restartCase ).dirName();
|
||||||
|
|
||||||
|
char* smspec_header = ecl_util_alloc_exfilename( path.toStdString().data(),
|
||||||
|
restartBase.toStdString().data(),
|
||||||
|
ECL_SUMMARY_HEADER_FILE,
|
||||||
|
false /*unformatted*/,
|
||||||
|
0 );
|
||||||
|
QString restartFileName =
|
||||||
|
RiaFilePathTools::toInternalSeparator( RiaStringEncodingTools::fromNativeEncoded( smspec_header ) );
|
||||||
|
free( smspec_header );
|
||||||
|
|
||||||
|
return getFileInfo( restartFileName );
|
||||||
|
}
|
||||||
|
return RifRestartFileInfo();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<time_t> RifEclipseSummaryTools::getTimeSteps( ecl_sum_type* ecl_sum )
|
||||||
|
{
|
||||||
|
std::vector<time_t> timeSteps;
|
||||||
|
|
||||||
|
if ( ecl_sum )
|
||||||
|
{
|
||||||
|
time_t_vector_type* steps = ecl_sum_alloc_time_vector( ecl_sum, false );
|
||||||
|
|
||||||
|
if ( steps )
|
||||||
|
{
|
||||||
|
for ( int i = 0; i < time_t_vector_size( steps ); i++ )
|
||||||
|
{
|
||||||
|
timeSteps.push_back( time_t_vector_iget( steps, i ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
time_t_vector_free( steps );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return timeSteps;
|
||||||
|
}
|
||||||
|
|
||||||
|
RiaDefines::EclipseUnitSystem RifEclipseSummaryTools::readUnitSystem( ecl_sum_type* ecl_sum )
|
||||||
|
{
|
||||||
|
ert_ecl_unit_enum eclUnitEnum = ecl_sum_get_unit_system( ecl_sum );
|
||||||
|
switch ( eclUnitEnum )
|
||||||
|
{
|
||||||
|
case ECL_METRIC_UNITS:
|
||||||
|
return RiaDefines::EclipseUnitSystem::UNITS_METRIC;
|
||||||
|
case ECL_FIELD_UNITS:
|
||||||
|
return RiaDefines::EclipseUnitSystem::UNITS_FIELD;
|
||||||
|
case ECL_LAB_UNITS:
|
||||||
|
return RiaDefines::EclipseUnitSystem::UNITS_LAB;
|
||||||
|
default:
|
||||||
|
return RiaDefines::EclipseUnitSystem::UNITS_UNKNOWN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
ecl_sum_type* RifEclipseSummaryTools::openEclSum( const QString& inHeaderFileName, bool includeRestartFiles )
|
||||||
|
{
|
||||||
|
QString headerFileName;
|
||||||
|
QStringList dataFileNames;
|
||||||
|
QString nativeHeaderFileName = QDir::toNativeSeparators( inHeaderFileName );
|
||||||
|
RifEclipseSummaryTools::findSummaryFiles( nativeHeaderFileName, &headerFileName, &dataFileNames );
|
||||||
|
|
||||||
|
if ( headerFileName.isEmpty() || dataFileNames.isEmpty() ) return nullptr;
|
||||||
|
|
||||||
|
assert( !headerFileName.isEmpty() );
|
||||||
|
assert( dataFileNames.size() > 0 );
|
||||||
|
|
||||||
|
stringlist_type* dataFiles = stringlist_alloc_new();
|
||||||
|
for ( int i = 0; i < dataFileNames.size(); i++ )
|
||||||
|
{
|
||||||
|
stringlist_append_copy( dataFiles, RiaStringEncodingTools::toNativeEncoded( dataFileNames[i] ).data() );
|
||||||
|
}
|
||||||
|
|
||||||
|
bool lazyLoad = true;
|
||||||
|
std::string itemSeparatorInVariableNames = ":";
|
||||||
|
|
||||||
|
ecl_sum_type* ecl_sum = nullptr;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ecl_sum = ecl_sum_fread_alloc( RiaStringEncodingTools::toNativeEncoded( headerFileName ).data(),
|
||||||
|
dataFiles,
|
||||||
|
itemSeparatorInVariableNames.data(),
|
||||||
|
includeRestartFiles,
|
||||||
|
lazyLoad,
|
||||||
|
ECL_FILE_CLOSE_STREAM );
|
||||||
|
}
|
||||||
|
catch ( ... )
|
||||||
|
{
|
||||||
|
ecl_sum = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
stringlist_free( dataFiles );
|
||||||
|
|
||||||
|
return ecl_sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RifEclipseSummaryTools::closeEclSum( ecl_sum_type* ecl_sum )
|
||||||
|
{
|
||||||
|
if ( ecl_sum ) ecl_sum_free( ecl_sum );
|
||||||
|
}
|
||||||
|
@ -18,14 +18,43 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "RiaDefines.h"
|
||||||
#include "RifEclipseSummaryAddress.h"
|
#include "RifEclipseSummaryAddress.h"
|
||||||
|
|
||||||
|
#include "ert/ecl/ecl_sum.hpp"
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
class RifSummaryReaderInterface;
|
class RifSummaryReaderInterface;
|
||||||
class QStringList;
|
class QStringList;
|
||||||
class QString;
|
|
||||||
|
//==================================================================================================
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//==================================================================================================
|
||||||
|
class RifRestartFileInfo
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
RifRestartFileInfo()
|
||||||
|
: startDate( 0 )
|
||||||
|
, endDate( 0 )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
RifRestartFileInfo( const QString& _fileName, time_t _startDate, time_t _endDate )
|
||||||
|
: fileName( _fileName )
|
||||||
|
, startDate( _startDate )
|
||||||
|
, endDate( _endDate )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
bool valid() { return !fileName.isEmpty(); }
|
||||||
|
|
||||||
|
QString fileName;
|
||||||
|
time_t startDate;
|
||||||
|
time_t endDate;
|
||||||
|
};
|
||||||
|
|
||||||
//==================================================================================================
|
//==================================================================================================
|
||||||
//
|
//
|
||||||
@ -38,10 +67,20 @@ public:
|
|||||||
static void findSummaryHeaderFile( const QString& inputFile, QString* headerFile, bool* isFormatted );
|
static void findSummaryHeaderFile( const QString& inputFile, QString* headerFile, bool* isFormatted );
|
||||||
static QString findGridCaseFileFromSummaryHeaderFile( const QString& summaryHeaderFile );
|
static QString findGridCaseFileFromSummaryHeaderFile( const QString& summaryHeaderFile );
|
||||||
|
|
||||||
static void findSummaryFiles( const QString& inputFile, QString* headerFile, QStringList* dataFiles );
|
|
||||||
static void dumpMetaData( RifSummaryReaderInterface* readerEclipseSummary );
|
static void dumpMetaData( RifSummaryReaderInterface* readerEclipseSummary );
|
||||||
|
|
||||||
|
static std::vector<RifRestartFileInfo> getRestartFiles( const QString& headerFileName, std::vector<QString>& warnings );
|
||||||
|
static RifRestartFileInfo getFileInfo( const QString& headerFileName );
|
||||||
|
|
||||||
|
static void closeEclSum( ecl_sum_type* ecl_sum );
|
||||||
|
static ecl_sum_type* openEclSum( const QString& inHeaderFileName, bool includeRestartFiles );
|
||||||
|
static RiaDefines::EclipseUnitSystem readUnitSystem( ecl_sum_type* ecl_sum );
|
||||||
|
static std::vector<time_t> getTimeSteps( ecl_sum_type* ecl_sum );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
static void findSummaryFiles( const QString& inputFile, QString* headerFile, QStringList* dataFiles );
|
||||||
|
static RifRestartFileInfo getRestartFile( const QString& headerFileName );
|
||||||
|
|
||||||
static void findSummaryHeaderFileInfo( const QString& inputFile,
|
static void findSummaryHeaderFileInfo( const QString& inputFile,
|
||||||
QString* headerFile,
|
QString* headerFile,
|
||||||
QString* path,
|
QString* path,
|
||||||
|
@ -18,16 +18,12 @@
|
|||||||
|
|
||||||
#include "RifReaderEclipseSummary.h"
|
#include "RifReaderEclipseSummary.h"
|
||||||
|
|
||||||
#include "RiaFilePathTools.h"
|
|
||||||
#include "RiaLogging.h"
|
#include "RiaLogging.h"
|
||||||
#include "RiaPreferences.h"
|
|
||||||
#include "RiaPreferencesSummary.h"
|
#include "RiaPreferencesSummary.h"
|
||||||
#include "RiaStdStringTools.h"
|
#include "RiaStdStringTools.h"
|
||||||
#include "RiaStringEncodingTools.h"
|
|
||||||
|
|
||||||
#include "RifEclipseSummaryTools.h"
|
#include "RifEclEclipseSummary.h"
|
||||||
#include "RifOpmCommonSummary.h"
|
#include "RifOpmCommonSummary.h"
|
||||||
#include "RifReaderEclipseOutput.h"
|
|
||||||
|
|
||||||
#ifdef USE_HDF5
|
#ifdef USE_HDF5
|
||||||
#include "RifHdf5SummaryExporter.h"
|
#include "RifHdf5SummaryExporter.h"
|
||||||
@ -42,107 +38,10 @@
|
|||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
|
|
||||||
#include "ert/ecl/ecl_file.h"
|
|
||||||
#include "ert/ecl/ecl_kw.h"
|
|
||||||
#include "ert/ecl/ecl_kw_magic.h"
|
|
||||||
#include "ert/ecl/ecl_sum.h"
|
|
||||||
#include "ert/ecl/smspec_node.hpp"
|
|
||||||
|
|
||||||
std::vector<time_t> getTimeSteps( ecl_sum_type* ecl_sum )
|
|
||||||
{
|
|
||||||
std::vector<time_t> timeSteps;
|
|
||||||
|
|
||||||
if ( ecl_sum )
|
|
||||||
{
|
|
||||||
time_t_vector_type* steps = ecl_sum_alloc_time_vector( ecl_sum, false );
|
|
||||||
|
|
||||||
if ( steps )
|
|
||||||
{
|
|
||||||
for ( int i = 0; i < time_t_vector_size( steps ); i++ )
|
|
||||||
{
|
|
||||||
timeSteps.push_back( time_t_vector_iget( steps, i ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
time_t_vector_free( steps );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return timeSteps;
|
|
||||||
}
|
|
||||||
|
|
||||||
RiaDefines::EclipseUnitSystem readUnitSystem( ecl_sum_type* ecl_sum )
|
|
||||||
{
|
|
||||||
ert_ecl_unit_enum eclUnitEnum = ecl_sum_get_unit_system( ecl_sum );
|
|
||||||
switch ( eclUnitEnum )
|
|
||||||
{
|
|
||||||
case ECL_METRIC_UNITS:
|
|
||||||
return RiaDefines::EclipseUnitSystem::UNITS_METRIC;
|
|
||||||
case ECL_FIELD_UNITS:
|
|
||||||
return RiaDefines::EclipseUnitSystem::UNITS_FIELD;
|
|
||||||
case ECL_LAB_UNITS:
|
|
||||||
return RiaDefines::EclipseUnitSystem::UNITS_LAB;
|
|
||||||
default:
|
|
||||||
return RiaDefines::EclipseUnitSystem::UNITS_UNKNOWN;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
///
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
ecl_sum_type* openEclSum( const QString& inHeaderFileName, bool includeRestartFiles )
|
|
||||||
{
|
|
||||||
QString headerFileName;
|
|
||||||
QStringList dataFileNames;
|
|
||||||
QString nativeHeaderFileName = QDir::toNativeSeparators( inHeaderFileName );
|
|
||||||
RifEclipseSummaryTools::findSummaryFiles( nativeHeaderFileName, &headerFileName, &dataFileNames );
|
|
||||||
|
|
||||||
if ( headerFileName.isEmpty() || dataFileNames.isEmpty() ) return nullptr;
|
|
||||||
|
|
||||||
assert( !headerFileName.isEmpty() );
|
|
||||||
assert( dataFileNames.size() > 0 );
|
|
||||||
|
|
||||||
stringlist_type* dataFiles = stringlist_alloc_new();
|
|
||||||
for ( int i = 0; i < dataFileNames.size(); i++ )
|
|
||||||
{
|
|
||||||
stringlist_append_copy( dataFiles, RiaStringEncodingTools::toNativeEncoded( dataFileNames[i] ).data() );
|
|
||||||
}
|
|
||||||
|
|
||||||
bool lazyLoad = true;
|
|
||||||
std::string itemSeparatorInVariableNames = ":";
|
|
||||||
|
|
||||||
ecl_sum_type* ecl_sum = nullptr;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
ecl_sum = ecl_sum_fread_alloc( RiaStringEncodingTools::toNativeEncoded( headerFileName ).data(),
|
|
||||||
dataFiles,
|
|
||||||
itemSeparatorInVariableNames.data(),
|
|
||||||
includeRestartFiles,
|
|
||||||
lazyLoad,
|
|
||||||
ECL_FILE_CLOSE_STREAM );
|
|
||||||
}
|
|
||||||
catch ( ... )
|
|
||||||
{
|
|
||||||
ecl_sum = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
stringlist_free( dataFiles );
|
|
||||||
|
|
||||||
return ecl_sum;
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
///
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
void closeEclSum( ecl_sum_type* ecl_sum )
|
|
||||||
{
|
|
||||||
if ( ecl_sum ) ecl_sum_free( ecl_sum );
|
|
||||||
}
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
RifReaderEclipseSummary::RifReaderEclipseSummary()
|
RifReaderEclipseSummary::RifReaderEclipseSummary()
|
||||||
: m_ecl_sum( nullptr )
|
|
||||||
, m_ecl_SmSpec( nullptr )
|
|
||||||
, m_unitSystem( RiaDefines::EclipseUnitSystem::UNITS_METRIC )
|
|
||||||
{
|
{
|
||||||
m_valuesCache = std::make_unique<ValuesCache>();
|
m_valuesCache = std::make_unique<ValuesCache>();
|
||||||
}
|
}
|
||||||
@ -152,25 +51,18 @@ RifReaderEclipseSummary::RifReaderEclipseSummary()
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
RifReaderEclipseSummary::~RifReaderEclipseSummary()
|
RifReaderEclipseSummary::~RifReaderEclipseSummary()
|
||||||
{
|
{
|
||||||
if ( m_ecl_sum )
|
|
||||||
{
|
|
||||||
ecl_sum_free( m_ecl_sum );
|
|
||||||
m_ecl_sum = nullptr;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
bool RifReaderEclipseSummary::open( const QString& headerFileName,
|
bool RifReaderEclipseSummary::open( const QString& headerFileName, RiaThreadSafeLogger* threadSafeLogger )
|
||||||
bool includeRestartFiles,
|
|
||||||
RiaThreadSafeLogger* threadSafeLogger )
|
|
||||||
{
|
{
|
||||||
bool isValid = false;
|
bool isValid = false;
|
||||||
|
|
||||||
// Try to create readers. If HDF5 or Opm readers fails to create, use ecllib reader
|
// Try to create readers. If HDF5 or Opm readers fails to create, use libecl reader
|
||||||
|
|
||||||
RiaPreferencesSummary* prefSummary = RiaPreferences::current()->summaryPreferences();
|
RiaPreferencesSummary* prefSummary = RiaPreferencesSummary::current();
|
||||||
|
|
||||||
if ( prefSummary->summaryDataReader() == RiaPreferencesSummary::SummaryReaderMode::HDF5_OPM_COMMON )
|
if ( prefSummary->summaryDataReader() == RiaPreferencesSummary::SummaryReaderMode::HDF5_OPM_COMMON )
|
||||||
{
|
{
|
||||||
@ -197,42 +89,32 @@ bool RifReaderEclipseSummary::open( const QString& headerFileName,
|
|||||||
isValid = hdfReader->open( headerFileName, false, threadSafeLogger );
|
isValid = hdfReader->open( headerFileName, false, threadSafeLogger );
|
||||||
if ( isValid )
|
if ( isValid )
|
||||||
{
|
{
|
||||||
m_hdf5OpmReader = std::move( hdfReader );
|
m_summaryReader = std::move( hdfReader );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else if ( prefSummary->summaryDataReader() == RiaPreferencesSummary::SummaryReaderMode::OPM_COMMON )
|
else if ( prefSummary->summaryDataReader() == RiaPreferencesSummary::SummaryReaderMode::OPM_COMMON )
|
||||||
{
|
{
|
||||||
bool useLodsmryFiles = prefSummary->useOptimizedSummaryDataFiles();
|
auto opmCommonReader = std::make_unique<RifOpmCommonEclipseSummary>();
|
||||||
if ( useLodsmryFiles && includeRestartFiles )
|
|
||||||
|
opmCommonReader->useLodsmaryFiles( prefSummary->useOptimizedSummaryDataFiles() );
|
||||||
|
opmCommonReader->createLodsmaryFiles( prefSummary->createOptimizedSummaryDataFiles() );
|
||||||
|
isValid = opmCommonReader->open( headerFileName, false, threadSafeLogger );
|
||||||
|
|
||||||
|
if ( isValid )
|
||||||
{
|
{
|
||||||
QString txt =
|
m_summaryReader = std::move( opmCommonReader );
|
||||||
"LODSMRY file loading for summary restart files is not supported. Restart history might be incomplete.";
|
|
||||||
if ( threadSafeLogger ) threadSafeLogger->warning( txt );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_opmCommonReader = std::make_unique<RifOpmCommonEclipseSummary>();
|
|
||||||
|
|
||||||
m_opmCommonReader->useLodsmaryFiles( prefSummary->useOptimizedSummaryDataFiles() );
|
|
||||||
m_opmCommonReader->createLodsmaryFiles( prefSummary->createOptimizedSummaryDataFiles() );
|
|
||||||
isValid = m_opmCommonReader->open( headerFileName, false, threadSafeLogger );
|
|
||||||
if ( !isValid ) m_opmCommonReader.reset();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !isValid || prefSummary->summaryDataReader() == RiaPreferencesSummary::SummaryReaderMode::LIBECL )
|
if ( !isValid || prefSummary->summaryDataReader() == RiaPreferencesSummary::SummaryReaderMode::LIBECL )
|
||||||
{
|
{
|
||||||
assert( m_ecl_sum == nullptr );
|
auto libeclReader = std::make_unique<RifEclEclipseSummary>();
|
||||||
|
|
||||||
m_ecl_sum = openEclSum( headerFileName, includeRestartFiles );
|
isValid = libeclReader->open( headerFileName, threadSafeLogger );
|
||||||
|
if ( isValid )
|
||||||
if ( m_ecl_sum )
|
|
||||||
{
|
{
|
||||||
m_timeSteps.clear();
|
m_summaryReader = std::move( libeclReader );
|
||||||
m_ecl_SmSpec = ecl_sum_get_smspec( m_ecl_sum );
|
|
||||||
m_timeSteps = getTimeSteps( m_ecl_sum );
|
|
||||||
m_unitSystem = readUnitSystem( m_ecl_sum );
|
|
||||||
|
|
||||||
isValid = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -244,265 +126,6 @@ bool RifReaderEclipseSummary::open( const QString& headerFileName,
|
|||||||
return isValid;
|
return isValid;
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
///
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
std::vector<RifRestartFileInfo> RifReaderEclipseSummary::getRestartFiles( const QString& headerFileName, bool* hasWarnings )
|
|
||||||
{
|
|
||||||
CVF_ASSERT( hasWarnings );
|
|
||||||
|
|
||||||
std::vector<RifRestartFileInfo> restartFiles;
|
|
||||||
m_warnings.clear();
|
|
||||||
*hasWarnings = false;
|
|
||||||
|
|
||||||
std::set<QString> restartFilesOpened;
|
|
||||||
|
|
||||||
RifRestartFileInfo currFile;
|
|
||||||
currFile.fileName = headerFileName;
|
|
||||||
while ( !currFile.fileName.isEmpty() )
|
|
||||||
{
|
|
||||||
// Due to a weakness in libecl regarding restart summary header file selection,
|
|
||||||
// do some extra checking
|
|
||||||
{
|
|
||||||
QString formattedHeaderExtension = ".FSMSPEC";
|
|
||||||
QString nonformattedHeaderExtension = ".SMSPEC";
|
|
||||||
QString formattedDataFileExtension = ".FUNSMRY";
|
|
||||||
|
|
||||||
if ( currFile.fileName.endsWith( nonformattedHeaderExtension, Qt::CaseInsensitive ) )
|
|
||||||
{
|
|
||||||
QString formattedHeaderFile = currFile.fileName;
|
|
||||||
formattedHeaderFile.replace( nonformattedHeaderExtension, formattedHeaderExtension, Qt::CaseInsensitive );
|
|
||||||
QString formattedDateFile = currFile.fileName;
|
|
||||||
formattedDateFile.replace( nonformattedHeaderExtension, formattedDataFileExtension, Qt::CaseInsensitive );
|
|
||||||
|
|
||||||
QFileInfo nonformattedHeaderFileInfo = QFileInfo( currFile.fileName );
|
|
||||||
QFileInfo formattedHeaderFileInfo = QFileInfo( formattedHeaderFile );
|
|
||||||
QFileInfo formattedDateFileInfo = QFileInfo( formattedDateFile );
|
|
||||||
if ( formattedHeaderFileInfo.lastModified() < nonformattedHeaderFileInfo.lastModified() &&
|
|
||||||
formattedHeaderFileInfo.exists() && !formattedDateFileInfo.exists() )
|
|
||||||
{
|
|
||||||
m_warnings.push_back(
|
|
||||||
QString( "RifReaderEclipseSummary: Formatted summary header file without an\n" ) +
|
|
||||||
QString( "associated data file detected.\n" ) +
|
|
||||||
QString( "This may cause a failure reading summary origin data.\n" ) +
|
|
||||||
QString( "To avoid this problem, please delete or rename the.FSMSPEC file." ) );
|
|
||||||
*hasWarnings = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
QString prevFile = currFile.fileName;
|
|
||||||
currFile = getRestartFile( currFile.fileName );
|
|
||||||
|
|
||||||
// Fix to stop potential infinite loop
|
|
||||||
if ( currFile.fileName == prevFile )
|
|
||||||
{
|
|
||||||
m_warnings.push_back( "RifReaderEclipseSummary: Restart file reference loop detected" );
|
|
||||||
*hasWarnings = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if ( restartFilesOpened.count( currFile.fileName ) != 0u )
|
|
||||||
{
|
|
||||||
m_warnings.push_back( "RifReaderEclipseSummary: Same restart file being opened multiple times" );
|
|
||||||
*hasWarnings = true;
|
|
||||||
}
|
|
||||||
restartFilesOpened.insert( currFile.fileName );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !currFile.fileName.isEmpty() ) restartFiles.push_back( currFile );
|
|
||||||
}
|
|
||||||
return restartFiles;
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
///
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
RifRestartFileInfo RifReaderEclipseSummary::getFileInfo( const QString& headerFileName )
|
|
||||||
{
|
|
||||||
RifRestartFileInfo fileInfo;
|
|
||||||
ecl_sum_type* ecl_sum = openEclSum( headerFileName, false );
|
|
||||||
std::vector<time_t> timeSteps = getTimeSteps( ecl_sum );
|
|
||||||
if ( !timeSteps.empty() )
|
|
||||||
{
|
|
||||||
fileInfo.fileName = headerFileName;
|
|
||||||
fileInfo.startDate = timeSteps.front();
|
|
||||||
fileInfo.endDate = timeSteps.back();
|
|
||||||
}
|
|
||||||
closeEclSum( ecl_sum );
|
|
||||||
return fileInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
///
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
std::string stringFromPointer( const char* pointerToChar )
|
|
||||||
{
|
|
||||||
std::string myString;
|
|
||||||
|
|
||||||
// NB! Assigning a null pointer to a std::string causes runtime crash
|
|
||||||
if ( pointerToChar )
|
|
||||||
{
|
|
||||||
myString = pointerToChar;
|
|
||||||
|
|
||||||
replace( myString.begin(), myString.end(), '\t', ' ' );
|
|
||||||
}
|
|
||||||
|
|
||||||
return myString;
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
///
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
RifEclipseSummaryAddress addressFromErtSmSpecNode( const ecl::smspec_node& ertSumVarNode )
|
|
||||||
{
|
|
||||||
if ( ertSumVarNode.get_var_type() == ECL_SMSPEC_INVALID_VAR )
|
|
||||||
{
|
|
||||||
return RifEclipseSummaryAddress();
|
|
||||||
}
|
|
||||||
|
|
||||||
RifEclipseSummaryAddress::SummaryVarCategory sumCategory( RifEclipseSummaryAddress::SUMMARY_INVALID );
|
|
||||||
std::string quantityName;
|
|
||||||
int regionNumber( -1 );
|
|
||||||
int regionNumber2( -1 );
|
|
||||||
std::string wellGroupName;
|
|
||||||
std::string wellName;
|
|
||||||
int wellSegmentNumber( -1 );
|
|
||||||
std::string lgrName;
|
|
||||||
int cellI( -1 );
|
|
||||||
int cellJ( -1 );
|
|
||||||
int cellK( -1 );
|
|
||||||
int aquiferNumber( -1 );
|
|
||||||
bool isErrorResult( false );
|
|
||||||
int id( -1 );
|
|
||||||
|
|
||||||
quantityName = stringFromPointer( ertSumVarNode.get_keyword() );
|
|
||||||
|
|
||||||
switch ( ertSumVarNode.get_var_type() )
|
|
||||||
{
|
|
||||||
case ECL_SMSPEC_AQUIFER_VAR:
|
|
||||||
{
|
|
||||||
sumCategory = RifEclipseSummaryAddress::SUMMARY_AQUIFER;
|
|
||||||
aquiferNumber = ertSumVarNode.get_num();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ECL_SMSPEC_WELL_VAR:
|
|
||||||
{
|
|
||||||
sumCategory = RifEclipseSummaryAddress::SUMMARY_WELL;
|
|
||||||
wellName = stringFromPointer( ertSumVarNode.get_wgname() );
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ECL_SMSPEC_REGION_VAR:
|
|
||||||
{
|
|
||||||
sumCategory = RifEclipseSummaryAddress::SUMMARY_REGION;
|
|
||||||
regionNumber = ertSumVarNode.get_num();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ECL_SMSPEC_FIELD_VAR:
|
|
||||||
{
|
|
||||||
sumCategory = RifEclipseSummaryAddress::SUMMARY_FIELD;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ECL_SMSPEC_GROUP_VAR:
|
|
||||||
{
|
|
||||||
sumCategory = RifEclipseSummaryAddress::SUMMARY_WELL_GROUP;
|
|
||||||
wellGroupName = stringFromPointer( ertSumVarNode.get_wgname() );
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ECL_SMSPEC_BLOCK_VAR:
|
|
||||||
{
|
|
||||||
sumCategory = RifEclipseSummaryAddress::SUMMARY_BLOCK;
|
|
||||||
|
|
||||||
auto ijk = ertSumVarNode.get_ijk();
|
|
||||||
cellI = ijk[0];
|
|
||||||
cellJ = ijk[1];
|
|
||||||
cellK = ijk[2];
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ECL_SMSPEC_COMPLETION_VAR:
|
|
||||||
{
|
|
||||||
sumCategory = RifEclipseSummaryAddress::SUMMARY_WELL_COMPLETION;
|
|
||||||
wellName = stringFromPointer( ertSumVarNode.get_wgname() );
|
|
||||||
|
|
||||||
auto ijk = ertSumVarNode.get_ijk();
|
|
||||||
cellI = ijk[0];
|
|
||||||
cellJ = ijk[1];
|
|
||||||
cellK = ijk[2];
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ECL_SMSPEC_LOCAL_BLOCK_VAR:
|
|
||||||
{
|
|
||||||
sumCategory = RifEclipseSummaryAddress::SUMMARY_BLOCK_LGR;
|
|
||||||
lgrName = stringFromPointer( ertSumVarNode.get_lgr_name() );
|
|
||||||
|
|
||||||
auto ijk = ertSumVarNode.get_lgr_ijk();
|
|
||||||
cellI = ijk[0];
|
|
||||||
cellJ = ijk[1];
|
|
||||||
cellK = ijk[2];
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ECL_SMSPEC_LOCAL_COMPLETION_VAR:
|
|
||||||
{
|
|
||||||
sumCategory = RifEclipseSummaryAddress::SUMMARY_WELL_COMPLETION_LGR;
|
|
||||||
wellName = stringFromPointer( ertSumVarNode.get_wgname() );
|
|
||||||
lgrName = stringFromPointer( ertSumVarNode.get_lgr_name() );
|
|
||||||
|
|
||||||
auto ijk = ertSumVarNode.get_lgr_ijk();
|
|
||||||
cellI = ijk[0];
|
|
||||||
cellJ = ijk[1];
|
|
||||||
cellK = ijk[2];
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ECL_SMSPEC_LOCAL_WELL_VAR:
|
|
||||||
{
|
|
||||||
sumCategory = RifEclipseSummaryAddress::SUMMARY_WELL_LGR;
|
|
||||||
wellName = stringFromPointer( ertSumVarNode.get_wgname() );
|
|
||||||
lgrName = stringFromPointer( ertSumVarNode.get_lgr_name() );
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ECL_SMSPEC_NETWORK_VAR:
|
|
||||||
{
|
|
||||||
sumCategory = RifEclipseSummaryAddress::SUMMARY_NETWORK;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ECL_SMSPEC_REGION_2_REGION_VAR:
|
|
||||||
{
|
|
||||||
sumCategory = RifEclipseSummaryAddress::SUMMARY_REGION_2_REGION;
|
|
||||||
regionNumber = ertSumVarNode.get_R1();
|
|
||||||
regionNumber2 = ertSumVarNode.get_R2();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ECL_SMSPEC_SEGMENT_VAR:
|
|
||||||
{
|
|
||||||
sumCategory = RifEclipseSummaryAddress::SUMMARY_WELL_SEGMENT;
|
|
||||||
wellName = stringFromPointer( ertSumVarNode.get_wgname() );
|
|
||||||
wellSegmentNumber = ertSumVarNode.get_num();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ECL_SMSPEC_MISC_VAR:
|
|
||||||
{
|
|
||||||
sumCategory = RifEclipseSummaryAddress::SUMMARY_MISC;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
CVF_ASSERT( false );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return RifEclipseSummaryAddress( sumCategory,
|
|
||||||
quantityName,
|
|
||||||
regionNumber,
|
|
||||||
regionNumber2,
|
|
||||||
wellGroupName,
|
|
||||||
wellName,
|
|
||||||
wellSegmentNumber,
|
|
||||||
lgrName,
|
|
||||||
cellI,
|
|
||||||
cellJ,
|
|
||||||
cellK,
|
|
||||||
aquiferNumber,
|
|
||||||
isErrorResult,
|
|
||||||
id );
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@ -510,8 +133,10 @@ bool RifReaderEclipseSummary::values( const RifEclipseSummaryAddress& resultAddr
|
|||||||
{
|
{
|
||||||
CVF_ASSERT( values );
|
CVF_ASSERT( values );
|
||||||
|
|
||||||
|
if ( timeSteps( resultAddress ).empty() ) return false;
|
||||||
|
|
||||||
values->clear();
|
values->clear();
|
||||||
values->reserve( timeStepCount() );
|
values->reserve( timeSteps( resultAddress ).size() );
|
||||||
|
|
||||||
const std::vector<double>& cachedValues = m_valuesCache->getValues( resultAddress );
|
const std::vector<double>& cachedValues = m_valuesCache->getValues( resultAddress );
|
||||||
if ( !cachedValues.empty() )
|
if ( !cachedValues.empty() )
|
||||||
@ -521,106 +146,60 @@ bool RifReaderEclipseSummary::values( const RifEclipseSummaryAddress& resultAddr
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( m_hdf5OpmReader )
|
if ( m_differenceAddresses.count( resultAddress ) )
|
||||||
{
|
{
|
||||||
auto status = m_hdf5OpmReader->values( resultAddress, values );
|
const std::string& quantityName = resultAddress.quantityName();
|
||||||
|
auto historyQuantity = quantityName.substr( 0, quantityName.size() - differenceIdentifier().size() ) +
|
||||||
|
historyIdentifier();
|
||||||
|
|
||||||
if ( status ) m_valuesCache->insertValues( resultAddress, *values );
|
RifEclipseSummaryAddress nativeAdrNoHistory = resultAddress;
|
||||||
|
nativeAdrNoHistory.setQuantityName( historyQuantity );
|
||||||
|
auto quantityNoHistory = quantityName.substr( 0, historyQuantity.size() - 1 );
|
||||||
|
|
||||||
return status;
|
RifEclipseSummaryAddress nativeAdrHistory = resultAddress;
|
||||||
}
|
nativeAdrHistory.setQuantityName( quantityNoHistory );
|
||||||
|
|
||||||
if ( m_opmCommonReader )
|
std::vector<double> nativeValues;
|
||||||
{
|
std::vector<double> historyValues;
|
||||||
auto status = m_opmCommonReader->values( resultAddress, values );
|
|
||||||
if ( status ) m_valuesCache->insertValues( resultAddress, *values );
|
|
||||||
|
|
||||||
return status;
|
if ( !this->values( nativeAdrHistory, &nativeValues ) ) return false;
|
||||||
}
|
if ( !this->values( nativeAdrNoHistory, &historyValues ) ) return false;
|
||||||
|
|
||||||
if ( m_ecl_SmSpec )
|
if ( nativeValues.size() != historyValues.size() ) return false;
|
||||||
{
|
|
||||||
if ( m_differenceAddresses.count( resultAddress ) )
|
for ( size_t i = 0; i < nativeValues.size(); i++ )
|
||||||
{
|
{
|
||||||
const std::string& quantityName = resultAddress.quantityName();
|
double diff = nativeValues[i] - historyValues[i];
|
||||||
auto historyQuantity = quantityName.substr( 0, quantityName.size() - differenceIdentifier().size() ) +
|
values->push_back( diff );
|
||||||
historyIdentifier();
|
|
||||||
|
|
||||||
RifEclipseSummaryAddress nativeAdrNoHistory = resultAddress;
|
|
||||||
nativeAdrNoHistory.setQuantityName( historyQuantity );
|
|
||||||
auto quantityNoHistory = quantityName.substr( 0, historyQuantity.size() - 1 );
|
|
||||||
|
|
||||||
RifEclipseSummaryAddress nativeAdrHistory = resultAddress;
|
|
||||||
nativeAdrHistory.setQuantityName( quantityNoHistory );
|
|
||||||
|
|
||||||
std::vector<double> nativeValues;
|
|
||||||
std::vector<double> historyValues;
|
|
||||||
|
|
||||||
if ( !this->values( nativeAdrHistory, &nativeValues ) ) return false;
|
|
||||||
if ( !this->values( nativeAdrNoHistory, &historyValues ) ) return false;
|
|
||||||
|
|
||||||
if ( nativeValues.size() != historyValues.size() ) return false;
|
|
||||||
|
|
||||||
for ( size_t i = 0; i < nativeValues.size(); i++ )
|
|
||||||
{
|
|
||||||
double diff = nativeValues[i] - historyValues[i];
|
|
||||||
values->push_back( diff );
|
|
||||||
m_valuesCache->insertValues( resultAddress, *values );
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int variableIndex = indexFromAddress( resultAddress );
|
|
||||||
if ( variableIndex < 0 ) return false;
|
|
||||||
|
|
||||||
const ecl::smspec_node& ertSumVarNode = ecl_smspec_iget_node_w_node_index( m_ecl_SmSpec, variableIndex );
|
|
||||||
int paramsIndex = ertSumVarNode.get_params_index();
|
|
||||||
|
|
||||||
double_vector_type* dataValues = ecl_sum_alloc_data_vector( m_ecl_sum, paramsIndex, false );
|
|
||||||
|
|
||||||
if ( dataValues )
|
|
||||||
{
|
|
||||||
int dataSize = double_vector_size( dataValues );
|
|
||||||
const double* dataPtr = double_vector_get_const_ptr( dataValues );
|
|
||||||
values->insert( values->end(), dataPtr, dataPtr + dataSize );
|
|
||||||
double_vector_free( dataValues );
|
|
||||||
|
|
||||||
m_valuesCache->insertValues( resultAddress, *values );
|
m_valuesCache->insertValues( resultAddress, *values );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto reader = currentSummaryReader();
|
||||||
|
if ( reader )
|
||||||
|
{
|
||||||
|
auto status = reader->values( resultAddress, values );
|
||||||
|
|
||||||
|
if ( status ) m_valuesCache->insertValues( resultAddress, *values );
|
||||||
|
|
||||||
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
///
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
size_t RifReaderEclipseSummary::timeStepCount() const
|
|
||||||
{
|
|
||||||
return m_timeSteps.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
const std::vector<time_t>& RifReaderEclipseSummary::timeSteps( const RifEclipseSummaryAddress& resultAddress ) const
|
const std::vector<time_t>& RifReaderEclipseSummary::timeSteps( const RifEclipseSummaryAddress& resultAddress ) const
|
||||||
{
|
{
|
||||||
return m_timeSteps;
|
auto reader = currentSummaryReader();
|
||||||
}
|
if ( reader ) return reader->timeSteps( resultAddress );
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
static std::vector<time_t> emptyVector;
|
||||||
///
|
return emptyVector;
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
int RifReaderEclipseSummary::indexFromAddress( const RifEclipseSummaryAddress& resultAddress ) const
|
|
||||||
{
|
|
||||||
auto it = m_resultAddressToErtNodeIdx.find( resultAddress );
|
|
||||||
if ( it != m_resultAddressToErtNodeIdx.end() )
|
|
||||||
{
|
|
||||||
return it->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@ -629,36 +208,14 @@ int RifReaderEclipseSummary::indexFromAddress( const RifEclipseSummaryAddress& r
|
|||||||
void RifReaderEclipseSummary::buildMetaData()
|
void RifReaderEclipseSummary::buildMetaData()
|
||||||
{
|
{
|
||||||
m_allResultAddresses.clear();
|
m_allResultAddresses.clear();
|
||||||
m_resultAddressToErtNodeIdx.clear();
|
m_allErrorAddresses.clear();
|
||||||
|
|
||||||
if ( m_hdf5OpmReader )
|
auto reader = currentSummaryReader();
|
||||||
|
|
||||||
|
if ( reader )
|
||||||
{
|
{
|
||||||
m_allResultAddresses = m_hdf5OpmReader->allResultAddresses();
|
m_allResultAddresses = reader->allResultAddresses();
|
||||||
m_allErrorAddresses = m_hdf5OpmReader->allErrorAddresses();
|
m_allErrorAddresses = reader->allErrorAddresses();
|
||||||
|
|
||||||
m_timeSteps = m_hdf5OpmReader->timeSteps( RifEclipseSummaryAddress() );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( m_opmCommonReader )
|
|
||||||
{
|
|
||||||
m_allResultAddresses = m_opmCommonReader->allResultAddresses();
|
|
||||||
m_allErrorAddresses = m_opmCommonReader->allErrorAddresses();
|
|
||||||
|
|
||||||
m_timeSteps = m_opmCommonReader->timeSteps( RifEclipseSummaryAddress() );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( m_ecl_SmSpec )
|
|
||||||
{
|
|
||||||
int varCount = ecl_smspec_num_nodes( m_ecl_SmSpec );
|
|
||||||
for ( int i = 0; i < varCount; i++ )
|
|
||||||
{
|
|
||||||
const ecl::smspec_node& ertSumVarNode = ecl_smspec_iget_node_w_node_index( m_ecl_SmSpec, i );
|
|
||||||
RifEclipseSummaryAddress addr = addressFromErtSmSpecNode( ertSumVarNode );
|
|
||||||
m_allResultAddresses.insert( addr );
|
|
||||||
m_resultAddressToErtNodeIdx[addr] = i;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool addDifferenceVectors = true;
|
bool addDifferenceVectors = true;
|
||||||
@ -700,33 +257,11 @@ void RifReaderEclipseSummary::buildMetaData()
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
RifRestartFileInfo RifReaderEclipseSummary::getRestartFile( const QString& headerFileName )
|
RifSummaryReaderInterface* RifReaderEclipseSummary::currentSummaryReader() const
|
||||||
{
|
{
|
||||||
ecl_sum_type* ecl_sum = openEclSum( headerFileName, true );
|
if ( m_summaryReader ) return m_summaryReader.get();
|
||||||
|
|
||||||
const ecl_smspec_type* smspec = ecl_sum ? ecl_sum_get_smspec( ecl_sum ) : nullptr;
|
return nullptr;
|
||||||
const char* rstCase = smspec ? ecl_smspec_get_restart_case( smspec ) : nullptr;
|
|
||||||
QString restartCase =
|
|
||||||
rstCase ? RiaFilePathTools::canonicalPath( RiaStringEncodingTools::fromNativeEncoded( rstCase ) ) : "";
|
|
||||||
closeEclSum( ecl_sum );
|
|
||||||
|
|
||||||
if ( !restartCase.isEmpty() )
|
|
||||||
{
|
|
||||||
QString path = QFileInfo( restartCase ).dir().path();
|
|
||||||
QString restartBase = QDir( restartCase ).dirName();
|
|
||||||
|
|
||||||
char* smspec_header = ecl_util_alloc_exfilename( path.toStdString().data(),
|
|
||||||
restartBase.toStdString().data(),
|
|
||||||
ECL_SUMMARY_HEADER_FILE,
|
|
||||||
false /*unformatted*/,
|
|
||||||
0 );
|
|
||||||
QString restartFileName =
|
|
||||||
RiaFilePathTools::toInternalSeparator( RiaStringEncodingTools::fromNativeEncoded( smspec_header ) );
|
|
||||||
free( smspec_header );
|
|
||||||
|
|
||||||
return getFileInfo( restartFileName );
|
|
||||||
}
|
|
||||||
return RifRestartFileInfo();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@ -734,14 +269,11 @@ RifRestartFileInfo RifReaderEclipseSummary::getRestartFile( const QString& heade
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
std::string RifReaderEclipseSummary::unitName( const RifEclipseSummaryAddress& resultAddress ) const
|
std::string RifReaderEclipseSummary::unitName( const RifEclipseSummaryAddress& resultAddress ) const
|
||||||
{
|
{
|
||||||
if ( !m_ecl_SmSpec ) return "";
|
auto reader = currentSummaryReader();
|
||||||
|
|
||||||
int variableIndex = indexFromAddress( resultAddress );
|
if ( reader ) return reader->unitName( resultAddress );
|
||||||
|
|
||||||
if ( variableIndex < 0 ) return "";
|
return "";
|
||||||
|
|
||||||
const ecl::smspec_node& ertSumVarNode = ecl_smspec_iget_node_w_node_index( m_ecl_SmSpec, variableIndex );
|
|
||||||
return ertSumVarNode.get_unit();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@ -749,7 +281,11 @@ std::string RifReaderEclipseSummary::unitName( const RifEclipseSummaryAddress& r
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
RiaDefines::EclipseUnitSystem RifReaderEclipseSummary::unitSystem() const
|
RiaDefines::EclipseUnitSystem RifReaderEclipseSummary::unitSystem() const
|
||||||
{
|
{
|
||||||
return m_unitSystem;
|
auto reader = currentSummaryReader();
|
||||||
|
|
||||||
|
if ( reader ) return reader->unitSystem();
|
||||||
|
|
||||||
|
return RiaDefines::EclipseUnitSystem::UNITS_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "RiaDefines.h"
|
#include "RiaDefines.h"
|
||||||
#include "RifEclipseSummaryAddress.h"
|
|
||||||
#include "RifSummaryReaderInterface.h"
|
#include "RifSummaryReaderInterface.h"
|
||||||
|
|
||||||
#include <QString>
|
#include <QString>
|
||||||
@ -33,32 +33,9 @@
|
|||||||
|
|
||||||
class RifOpmCommonEclipseSummary;
|
class RifOpmCommonEclipseSummary;
|
||||||
class RifOpmHdf5Summary;
|
class RifOpmHdf5Summary;
|
||||||
|
class RifEclEclipseSummary;
|
||||||
class RiaThreadSafeLogger;
|
class RiaThreadSafeLogger;
|
||||||
|
class RifEclipseSummaryAddress;
|
||||||
//==================================================================================================
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//==================================================================================================
|
|
||||||
class RifRestartFileInfo
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
RifRestartFileInfo()
|
|
||||||
: startDate( 0 )
|
|
||||||
, endDate( 0 )
|
|
||||||
{
|
|
||||||
}
|
|
||||||
RifRestartFileInfo( const QString& _fileName, time_t _startDate, time_t _endDate )
|
|
||||||
: fileName( _fileName )
|
|
||||||
, startDate( _startDate )
|
|
||||||
, endDate( _endDate )
|
|
||||||
{
|
|
||||||
}
|
|
||||||
bool valid() { return !fileName.isEmpty(); }
|
|
||||||
|
|
||||||
QString fileName;
|
|
||||||
time_t startDate;
|
|
||||||
time_t endDate;
|
|
||||||
};
|
|
||||||
|
|
||||||
//==================================================================================================
|
//==================================================================================================
|
||||||
//
|
//
|
||||||
@ -70,47 +47,27 @@ public:
|
|||||||
RifReaderEclipseSummary();
|
RifReaderEclipseSummary();
|
||||||
~RifReaderEclipseSummary() override;
|
~RifReaderEclipseSummary() override;
|
||||||
|
|
||||||
bool open( const QString& headerFileName, bool includeRestartFiles, RiaThreadSafeLogger* threadSafeLogger );
|
bool open( const QString& headerFileName, RiaThreadSafeLogger* threadSafeLogger );
|
||||||
|
|
||||||
std::vector<RifRestartFileInfo> getRestartFiles( const QString& headerFileName, bool* hasWarnings );
|
|
||||||
RifRestartFileInfo getFileInfo( const QString& headerFileName );
|
|
||||||
|
|
||||||
const std::vector<time_t>& timeSteps( const RifEclipseSummaryAddress& resultAddress ) const override;
|
const std::vector<time_t>& timeSteps( const RifEclipseSummaryAddress& resultAddress ) const override;
|
||||||
|
|
||||||
bool values( const RifEclipseSummaryAddress& resultAddress, std::vector<double>* values ) const override;
|
bool values( const RifEclipseSummaryAddress& resultAddress, std::vector<double>* values ) const override;
|
||||||
std::string unitName( const RifEclipseSummaryAddress& resultAddress ) const override;
|
std::string unitName( const RifEclipseSummaryAddress& resultAddress ) const override;
|
||||||
RiaDefines::EclipseUnitSystem unitSystem() const override;
|
RiaDefines::EclipseUnitSystem unitSystem() const override;
|
||||||
QStringList warnings() const { return m_warnings; }
|
|
||||||
|
|
||||||
static std::string differenceIdentifier() { return "_DIFF"; }
|
static std::string differenceIdentifier() { return "_DIFF"; }
|
||||||
static const std::string historyIdentifier() { return "H"; }
|
static const std::string historyIdentifier() { return "H"; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
size_t timeStepCount() const;
|
void buildMetaData();
|
||||||
int indexFromAddress( const RifEclipseSummaryAddress& resultAddress ) const;
|
|
||||||
void buildMetaData();
|
RifSummaryReaderInterface* currentSummaryReader() const;
|
||||||
RifRestartFileInfo getRestartFile( const QString& headerFileName );
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Taken from ecl_sum.h
|
std::unique_ptr<RifSummaryReaderInterface> m_summaryReader;
|
||||||
typedef struct ecl_sum_struct ecl_sum_type;
|
std::set<RifEclipseSummaryAddress> m_differenceAddresses;
|
||||||
typedef struct ecl_smspec_struct ecl_smspec_type;
|
|
||||||
|
|
||||||
ecl_sum_type* m_ecl_sum;
|
|
||||||
const ecl_smspec_type* m_ecl_SmSpec;
|
|
||||||
std::vector<time_t> m_timeSteps;
|
|
||||||
|
|
||||||
RiaDefines::EclipseUnitSystem m_unitSystem;
|
|
||||||
|
|
||||||
std::map<RifEclipseSummaryAddress, int> m_resultAddressToErtNodeIdx;
|
|
||||||
|
|
||||||
QStringList m_warnings;
|
|
||||||
|
|
||||||
std::set<RifEclipseSummaryAddress> m_differenceAddresses;
|
|
||||||
|
|
||||||
std::unique_ptr<RifOpmCommonEclipseSummary> m_opmCommonReader;
|
|
||||||
std::unique_ptr<RifSummaryReaderInterface> m_hdf5OpmReader;
|
|
||||||
|
|
||||||
|
private:
|
||||||
//==================================================================================================
|
//==================================================================================================
|
||||||
//
|
//
|
||||||
//==================================================================================================
|
//==================================================================================================
|
||||||
|
@ -286,10 +286,10 @@ void RifSummaryCaseRestartSelector::determineFilesToImportUsingPrefs( const std:
|
|||||||
else if ( defaultSummaryImportMode == RicSummaryCaseRestartDialog::ImportOptions::SEPARATE_CASES )
|
else if ( defaultSummaryImportMode == RicSummaryCaseRestartDialog::ImportOptions::SEPARATE_CASES )
|
||||||
{
|
{
|
||||||
m_summaryFileInfos.push_back( RifSummaryCaseFileResultInfo( initialSummaryFile, false ) );
|
m_summaryFileInfos.push_back( RifSummaryCaseFileResultInfo( initialSummaryFile, false ) );
|
||||||
bool hasWarnings = false;
|
|
||||||
RifReaderEclipseSummary reader;
|
std::vector<QString> warnings;
|
||||||
std::vector<RifRestartFileInfo> restartFileInfos =
|
std::vector<RifRestartFileInfo> restartFileInfos =
|
||||||
reader.getRestartFiles( initialSummaryFile, &hasWarnings );
|
RifEclipseSummaryTools::getRestartFiles( initialSummaryFile, warnings );
|
||||||
for ( const auto& rfi : restartFileInfos )
|
for ( const auto& rfi : restartFileInfos )
|
||||||
{
|
{
|
||||||
RifSummaryCaseFileResultInfo resultFileInfo( RiaFilePathTools::toInternalSeparator( rfi.fileName ),
|
RifSummaryCaseFileResultInfo resultFileInfo( RiaFilePathTools::toInternalSeparator( rfi.fileName ),
|
||||||
@ -309,10 +309,10 @@ void RifSummaryCaseRestartSelector::determineFilesToImportUsingPrefs( const std:
|
|||||||
RicSummaryCaseRestartDialog::ImportOptions defaultGridImportMode = mapReadOption( prefs->gridImportMode() );
|
RicSummaryCaseRestartDialog::ImportOptions defaultGridImportMode = mapReadOption( prefs->gridImportMode() );
|
||||||
if ( defaultGridImportMode == RicSummaryCaseRestartDialog::ImportOptions::SEPARATE_CASES )
|
if ( defaultGridImportMode == RicSummaryCaseRestartDialog::ImportOptions::SEPARATE_CASES )
|
||||||
{
|
{
|
||||||
RifReaderEclipseSummary reader;
|
std::vector<QString> warnings;
|
||||||
bool hasWarnings = false;
|
|
||||||
std::vector<RifRestartFileInfo> restartFileInfos =
|
std::vector<RifRestartFileInfo> restartFileInfos =
|
||||||
reader.getRestartFiles( initialSummaryFile, &hasWarnings );
|
RifEclipseSummaryTools::getRestartFiles( initialSummaryFile, warnings );
|
||||||
for ( const auto& rfi : restartFileInfos )
|
for ( const auto& rfi : restartFileInfos )
|
||||||
{
|
{
|
||||||
QString gridFileName = RifEclipseSummaryTools::findGridCaseFileFromSummaryHeaderFile( rfi.fileName );
|
QString gridFileName = RifEclipseSummaryTools::findGridCaseFileFromSummaryHeaderFile( rfi.fileName );
|
||||||
@ -322,11 +322,8 @@ void RifSummaryCaseRestartSelector::determineFilesToImportUsingPrefs( const std:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( hasWarnings )
|
for ( const QString& warning : warnings )
|
||||||
{
|
RiaLogging::error( warning );
|
||||||
for ( const QString& warning : reader.warnings() )
|
|
||||||
RiaLogging::error( warning );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,113 @@
|
|||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Copyright (C) 2021- Equinor 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 "RifSummaryReaderMultipleFiles.h"
|
||||||
|
|
||||||
|
#include "RifReaderEclipseSummary.h"
|
||||||
|
|
||||||
|
#include "cafAssert.h"
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
RifSummaryReaderMultipleFiles::RifSummaryReaderMultipleFiles( const std::vector<std::string>& filesOrderedByStartOfHistory )
|
||||||
|
: m_fileNames( filesOrderedByStartOfHistory )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
const std::vector<time_t>& RifSummaryReaderMultipleFiles::timeSteps( const RifEclipseSummaryAddress& resultAddress ) const
|
||||||
|
{
|
||||||
|
return m_aggregatedTimeSteps;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
bool RifSummaryReaderMultipleFiles::values( const RifEclipseSummaryAddress& resultAddress, std::vector<double>* values ) const
|
||||||
|
{
|
||||||
|
for ( const auto& reader : m_summaryReaders )
|
||||||
|
{
|
||||||
|
std::vector<double> readerValues;
|
||||||
|
reader->values( resultAddress, &readerValues );
|
||||||
|
values->insert( values->end(), readerValues.begin(), readerValues.end() );
|
||||||
|
}
|
||||||
|
|
||||||
|
CAF_ASSERT( m_aggregatedTimeSteps.size() == values->size() );
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
std::string RifSummaryReaderMultipleFiles::unitName( const RifEclipseSummaryAddress& resultAddress ) const
|
||||||
|
{
|
||||||
|
if ( !m_summaryReaders.empty() ) return m_summaryReaders.front()->unitName( resultAddress );
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
RiaDefines::EclipseUnitSystem RifSummaryReaderMultipleFiles::unitSystem() const
|
||||||
|
{
|
||||||
|
if ( !m_summaryReaders.empty() ) return m_summaryReaders.front()->unitSystem();
|
||||||
|
|
||||||
|
return RiaDefines::EclipseUnitSystem::UNITS_UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
bool RifSummaryReaderMultipleFiles::createReadersAndImportMetaData( RiaThreadSafeLogger* threadSafeLogger )
|
||||||
|
{
|
||||||
|
for ( const auto& fileName : m_fileNames )
|
||||||
|
{
|
||||||
|
auto candidate = std::make_unique<RifReaderEclipseSummary>();
|
||||||
|
auto result = candidate->open( QString::fromStdString( fileName ), threadSafeLogger );
|
||||||
|
if ( result )
|
||||||
|
{
|
||||||
|
m_summaryReaders.push_back( std::move( candidate ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( const auto& reader : m_summaryReaders )
|
||||||
|
{
|
||||||
|
auto readerTimeSteps = reader->timeSteps( {} );
|
||||||
|
|
||||||
|
m_aggregatedTimeSteps.insert( m_aggregatedTimeSteps.end(), readerTimeSteps.begin(), readerTimeSteps.end() );
|
||||||
|
|
||||||
|
{
|
||||||
|
auto resultAddresses = reader->allResultAddresses();
|
||||||
|
m_allResultAddresses.insert( resultAddresses.begin(), resultAddresses.end() );
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto errorResultAddresses = reader->allErrorAddresses();
|
||||||
|
m_allErrorAddresses.insert( errorResultAddresses.begin(), errorResultAddresses.end() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
@ -0,0 +1,52 @@
|
|||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Copyright (C) 2021- Equinor 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.
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "RifSummaryReaderInterface.h"
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
class RiaThreadSafeLogger;
|
||||||
|
|
||||||
|
//==================================================================================================
|
||||||
|
//
|
||||||
|
// This class is used to append time history curves from multiple summary files. The summary files are assumed to be
|
||||||
|
// ordered, and the start of history at the front of the vector
|
||||||
|
//
|
||||||
|
//==================================================================================================
|
||||||
|
class RifSummaryReaderMultipleFiles : public RifSummaryReaderInterface
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
RifSummaryReaderMultipleFiles( const std::vector<std::string>& filesOrderedByStartOfHistory );
|
||||||
|
|
||||||
|
bool createReadersAndImportMetaData( RiaThreadSafeLogger* threadSafeLogger );
|
||||||
|
|
||||||
|
const std::vector<time_t>& timeSteps( const RifEclipseSummaryAddress& resultAddress ) const override;
|
||||||
|
bool values( const RifEclipseSummaryAddress& resultAddress, std::vector<double>* values ) const override;
|
||||||
|
std::string unitName( const RifEclipseSummaryAddress& resultAddress ) const override;
|
||||||
|
RiaDefines::EclipseUnitSystem unitSystem() const override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::vector<std::string> m_fileNames;
|
||||||
|
std::vector<std::unique_ptr<RifSummaryReaderInterface>> m_summaryReaders;
|
||||||
|
|
||||||
|
std::vector<time_t> m_aggregatedTimeSteps;
|
||||||
|
};
|
@ -24,6 +24,7 @@
|
|||||||
#include "RifEclipseSummaryTools.h"
|
#include "RifEclipseSummaryTools.h"
|
||||||
#include "RifReaderEclipseRft.h"
|
#include "RifReaderEclipseRft.h"
|
||||||
#include "RifReaderEclipseSummary.h"
|
#include "RifReaderEclipseSummary.h"
|
||||||
|
#include "RifSummaryReaderMultipleFiles.h"
|
||||||
|
|
||||||
#include "RimTools.h"
|
#include "RimTools.h"
|
||||||
|
|
||||||
@ -131,9 +132,40 @@ RifSummaryReaderInterface* RimFileSummaryCase::findRelatedFilesAndCreateReader(
|
|||||||
bool includeRestartFiles,
|
bool includeRestartFiles,
|
||||||
RiaThreadSafeLogger* threadSafeLogger )
|
RiaThreadSafeLogger* threadSafeLogger )
|
||||||
{
|
{
|
||||||
|
if ( includeRestartFiles )
|
||||||
|
{
|
||||||
|
std::vector<QString> warnings;
|
||||||
|
std::vector<RifRestartFileInfo> restartFileInfos =
|
||||||
|
RifEclipseSummaryTools::getRestartFiles( headerFileName, warnings );
|
||||||
|
|
||||||
|
if ( !restartFileInfos.empty() )
|
||||||
|
{
|
||||||
|
std::vector<std::string> summaryFileNames;
|
||||||
|
summaryFileNames.push_back( headerFileName.toStdString() );
|
||||||
|
for ( const auto& s : restartFileInfos )
|
||||||
|
{
|
||||||
|
summaryFileNames.push_back( s.fileName.toStdString() );
|
||||||
|
}
|
||||||
|
|
||||||
|
// The ordering in intended to be start of history first, so we reverse the ordering
|
||||||
|
std::reverse( summaryFileNames.begin(), summaryFileNames.end() );
|
||||||
|
|
||||||
|
auto summaryReader = new RifSummaryReaderMultipleFiles( summaryFileNames );
|
||||||
|
if ( !summaryReader->createReadersAndImportMetaData( threadSafeLogger ) )
|
||||||
|
{
|
||||||
|
delete summaryReader;
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return summaryReader;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
RifReaderEclipseSummary* summaryFileReader = new RifReaderEclipseSummary;
|
RifReaderEclipseSummary* summaryFileReader = new RifReaderEclipseSummary;
|
||||||
|
|
||||||
if ( !summaryFileReader->open( headerFileName, includeRestartFiles, threadSafeLogger ) )
|
// All restart data is taken care of by RifSummaryReaderMultipleFiles, never read restart data from native file
|
||||||
|
// readers
|
||||||
|
if ( !summaryFileReader->open( headerFileName, threadSafeLogger ) )
|
||||||
{
|
{
|
||||||
delete summaryFileReader;
|
delete summaryFileReader;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
@ -43,7 +43,7 @@ TEST( DISABLED_HDFTests, WriteDataToH5 )
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
RifReaderEclipseSummary summaryReader;
|
RifReaderEclipseSummary summaryReader;
|
||||||
summaryReader.open( file_path, true, nullptr );
|
summaryReader.open( file_path, nullptr );
|
||||||
|
|
||||||
{
|
{
|
||||||
std::string exportFileName = "e:/project/scratch_export/hdf-test.h5";
|
std::string exportFileName = "e:/project/scratch_export/hdf-test.h5";
|
||||||
|
@ -26,21 +26,63 @@
|
|||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
|
|
||||||
|
#include "RifSummaryReaderMultipleFiles.h"
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
TEST( RifEclipseSummaryTest, BasicTestSetCurrentFolder )
|
TEST( DISABLED_RifEclipseSummaryTest, TestRestartSummaryFileReferences_01 )
|
||||||
{
|
{
|
||||||
RifReaderEclipseSummary eclSummary;
|
QString summaryFileName =
|
||||||
|
"d:/Dropbox/Dropbox (Ceetron Solutions)/Projects/20084 ResInsight Introduction and Advanced "
|
||||||
|
"courses/intro2020_data/reek_ensemble/3_r001_reek_50/realization-0/base_pred/eclipse/model/"
|
||||||
|
"3_R001_REEK-0.SMSPEC";
|
||||||
|
|
||||||
|
std::vector<QString> warnings;
|
||||||
|
std::vector<RifRestartFileInfo> originFileInfos = RifEclipseSummaryTools::getRestartFiles( summaryFileName, warnings );
|
||||||
|
EXPECT_TRUE( originFileInfos.empty() );
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
TEST( DISABLED_RifEclipseSummaryTest, TestRestartSummaryFileReferences_02 )
|
||||||
|
{
|
||||||
|
QString summaryFileName =
|
||||||
|
"e:/models/reek_ensemble/3_r001_reek_50/realization-0/base_pred/eclipse/model/3_R001_REEK-0.SMSPEC";
|
||||||
|
|
||||||
|
std::vector<QString> warnings;
|
||||||
|
std::vector<RifRestartFileInfo> originFileInfos = RifEclipseSummaryTools::getRestartFiles( summaryFileName, warnings );
|
||||||
|
|
||||||
|
if ( !originFileInfos.empty() )
|
||||||
|
{
|
||||||
|
std::vector<std::string> smspecFilesNewFirst;
|
||||||
|
smspecFilesNewFirst.push_back( summaryFileName.toStdString() );
|
||||||
|
for ( const auto& s : originFileInfos )
|
||||||
|
{
|
||||||
|
smspecFilesNewFirst.push_back( s.fileName.toStdString() );
|
||||||
|
}
|
||||||
|
|
||||||
|
RifSummaryReaderMultipleFiles multipleSummaryFiles( smspecFilesNewFirst );
|
||||||
|
auto ts = multipleSummaryFiles.timeSteps( {} );
|
||||||
|
std::cout << ts.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
EXPECT_TRUE( originFileInfos.empty() );
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
TEST( DISABLED_RifEclipseSummaryTest, BasicTestSetCurrentFolder )
|
||||||
|
{
|
||||||
static const QString testDataRootFolder = QString( "%1/SummaryData/Reek/" ).arg( TEST_DATA_DIR );
|
static const QString testDataRootFolder = QString( "%1/SummaryData/Reek/" ).arg( TEST_DATA_DIR );
|
||||||
|
|
||||||
QString summaryFileName = testDataRootFolder + "3_R001_REEK-1.SMSPEC";
|
QString summaryFileName = testDataRootFolder + "3_R001_REEK-1.SMSPEC";
|
||||||
|
|
||||||
bool hasWarning = false;
|
std::vector<QString> warnings;
|
||||||
std::vector<RifRestartFileInfo> originFileInfos = eclSummary.getRestartFiles( summaryFileName, &hasWarning );
|
std::vector<RifRestartFileInfo> originFileInfos = RifEclipseSummaryTools::getRestartFiles( summaryFileName, warnings );
|
||||||
EXPECT_TRUE( originFileInfos.empty() );
|
EXPECT_TRUE( originFileInfos.empty() );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,7 +105,7 @@ void printDateAndValues(const std::vector<QDateTime>& dates, const std::vector<d
|
|||||||
TEST(RifEclipseSummaryTest, SummaryToolsFindSummaryFiles)
|
TEST(RifEclipseSummaryTest, SummaryToolsFindSummaryFiles)
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
// std::string filename = "g:\\Models\\Statoil\\MultipleRealisations\\Case_without_p9\\Real10\\BRUGGE_0010";
|
// std::string filename = "g:/\Models\\Statoil\\MultipleRealisations\\Case_without_p9\\Real10\\BRUGGE_0010";
|
||||||
std::string filename = "g:\\Models\\Statoil\\testcase_juli_2011\\data\\TEST10K_FLT_LGR_NNC";
|
std::string filename = "g:\\Models\\Statoil\\testcase_juli_2011\\data\\TEST10K_FLT_LGR_NNC";
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -74,7 +74,7 @@ TEST( DISABLED_RifSummaryDataTest, LibEclAllData )
|
|||||||
{
|
{
|
||||||
auto start = std::chrono::high_resolution_clock::now();
|
auto start = std::chrono::high_resolution_clock::now();
|
||||||
|
|
||||||
reader.open( filename, true, nullptr );
|
reader.open( filename, nullptr );
|
||||||
|
|
||||||
auto end = std::chrono::high_resolution_clock::now();
|
auto end = std::chrono::high_resolution_clock::now();
|
||||||
std::chrono::duration<double> diff = end - start;
|
std::chrono::duration<double> diff = end - start;
|
||||||
|
Loading…
Reference in New Issue
Block a user