mirror of
https://github.com/OPM/ResInsight.git
synced 2025-01-03 20:57:39 -06:00
ff209ad7c2
* #9773 Refactor ensemble import dialog. * #9773 Add support for ensemble import of StimPlan/Reveal summary data. * #9773 Add method for finding min and max time steps. * #9773 Add option for resampling to hour intervals. * #9773 Add option for resampling to minute intervals. * #9773 Ensemble statistics: determine sub-sampling period dynamically. * Use RiaWeightedMeanCalculator for curve resampling. * Add HOUR and MINUTE to date time app enum. * #9773 Generate better ensembles for StimPlan summaries. * #9773 Fix parameters.txt lookup for StimPlan summaries * Refactor: Improve interface of RicImportSummaryCasesFreature::createSummaryCasesFromFiles Co-authored-by: Magne Sjaastad <magne.sjaastad@ceetronsolutions.com>
485 lines
20 KiB
C++
485 lines
20 KiB
C++
/////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// 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 "RifSummaryCaseRestartSelector.h"
|
|
|
|
#include "RiaApplication.h"
|
|
#include "RiaFilePathTools.h"
|
|
#include "RiaLogging.h"
|
|
#include "RiaPreferencesSummary.h"
|
|
|
|
#include "RicSummaryCaseRestartDialog.h"
|
|
|
|
#include "RifEclipseSummaryTools.h"
|
|
|
|
#include "cafProgressInfo.h"
|
|
|
|
#include <cassert>
|
|
#include <string>
|
|
|
|
#include <QDateTime>
|
|
#include <QDir>
|
|
#include <QString>
|
|
#include <QStringList>
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
/// Internal function
|
|
//--------------------------------------------------------------------------------------------------
|
|
template <typename T>
|
|
bool vectorContains( const std::vector<T>& vector, T item )
|
|
{
|
|
for ( const auto& i : vector )
|
|
{
|
|
if ( i == item ) return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
/// INternal function
|
|
//--------------------------------------------------------------------------------------------------
|
|
RicSummaryCaseRestartDialog::ImportOptions mapReadOption( RiaPreferencesSummary::SummaryRestartFilesImportMode mode )
|
|
{
|
|
return mode == RiaPreferencesSummary::SummaryRestartFilesImportMode::NOT_IMPORT ? RicSummaryCaseRestartDialog::ImportOptions::NOT_IMPORT
|
|
: mode == RiaPreferencesSummary::SummaryRestartFilesImportMode::SEPARATE_CASES
|
|
? RicSummaryCaseRestartDialog::ImportOptions::SEPARATE_CASES
|
|
: RicSummaryCaseRestartDialog::ImportOptions::IMPORT_ALL;
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
RifSummaryCaseRestartSelector::RifSummaryCaseRestartSelector()
|
|
{
|
|
RiaPreferencesSummary* prefs = RiaPreferencesSummary::current();
|
|
|
|
m_showDialog = prefs->summaryRestartFilesShowImportDialog();
|
|
m_ensembleOrGroupMode = false;
|
|
|
|
m_gridFiles.clear();
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
RifSummaryCaseRestartSelector::~RifSummaryCaseRestartSelector()
|
|
{
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
void RifSummaryCaseRestartSelector::determineFilesToImportFromSummaryFiles( const QStringList& initialSummaryFiles )
|
|
{
|
|
std::vector<RifSummaryCaseFileImportInfo> files;
|
|
for ( QString f : initialSummaryFiles )
|
|
{
|
|
RifSummaryCaseFileImportInfo importInfo( f, "" );
|
|
importInfo.setFailOnSummaryFileError( true );
|
|
files.push_back( importInfo );
|
|
}
|
|
determineFilesToImport( files );
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
void RifSummaryCaseRestartSelector::determineFilesToImportFromGridFiles( const QStringList& initialGridFiles )
|
|
{
|
|
std::vector<RifSummaryCaseFileImportInfo> files;
|
|
for ( QString f : initialGridFiles )
|
|
{
|
|
RifSummaryCaseFileImportInfo importInfo( getSummaryFileFromGridFile( f ), f );
|
|
importInfo.setFailOnSummaryFileError( false );
|
|
files.push_back( importInfo );
|
|
}
|
|
determineFilesToImport( files );
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
void RifSummaryCaseRestartSelector::showDialog( bool show )
|
|
{
|
|
m_showDialog = show;
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
void RifSummaryCaseRestartSelector::setEnsembleOrGroupMode( bool eogMode )
|
|
{
|
|
m_ensembleOrGroupMode = eogMode;
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
std::vector<RifSummaryCaseFileResultInfo> RifSummaryCaseRestartSelector::summaryFileInfos() const
|
|
{
|
|
return m_summaryFileInfos;
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
QStringList RifSummaryCaseRestartSelector::gridCaseFiles() const
|
|
{
|
|
return m_gridFiles;
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
void RifSummaryCaseRestartSelector::determineFilesToImport( const std::vector<RifSummaryCaseFileImportInfo>& initialFiles )
|
|
{
|
|
if ( m_showDialog )
|
|
{
|
|
bool enableApplyToAllField = initialFiles.size() > 1;
|
|
determineFilesToImportByAskingUser( initialFiles, enableApplyToAllField );
|
|
}
|
|
else
|
|
{
|
|
determineFilesToImportUsingPrefs( initialFiles );
|
|
}
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
void RifSummaryCaseRestartSelector::determineFilesToImportByAskingUser( const std::vector<RifSummaryCaseFileImportInfo>& initialFiles,
|
|
bool enableApplyToAllField )
|
|
{
|
|
RicSummaryCaseRestartDialogResult lastResult;
|
|
|
|
m_summaryFileInfos.clear();
|
|
m_gridFiles.clear();
|
|
m_summaryFileErrors.clear();
|
|
|
|
RiaPreferencesSummary* prefs = RiaPreferencesSummary::current();
|
|
|
|
RicSummaryCaseRestartDialog::ImportOptions defaultSummaryImportMode;
|
|
if ( m_ensembleOrGroupMode )
|
|
{
|
|
defaultSummaryImportMode = mapReadOption( prefs->summaryEnsembleImportMode() );
|
|
}
|
|
else
|
|
{
|
|
defaultSummaryImportMode = mapReadOption( prefs->summaryImportMode() );
|
|
}
|
|
|
|
RicSummaryCaseRestartDialog::ImportOptions defaultGridImportMode = mapReadOption( prefs->gridImportMode() );
|
|
|
|
caf::ProgressInfo progress( initialFiles.size(), QString( "Importing files" ) );
|
|
for ( const RifSummaryCaseFileImportInfo& initialFile : initialFiles )
|
|
{
|
|
RicSummaryCaseRestartDialogResult result = RicSummaryCaseRestartDialog::openDialog( initialFile.summaryFileName(),
|
|
initialFile.gridFileName(),
|
|
initialFile.failOnSummaryFileError(),
|
|
enableApplyToAllField,
|
|
m_ensembleOrGroupMode,
|
|
defaultSummaryImportMode,
|
|
defaultGridImportMode,
|
|
m_ensembleOrGroupMode,
|
|
&lastResult,
|
|
nullptr );
|
|
|
|
if ( result.status == RicSummaryCaseRestartDialogResult::SUMMARY_CANCELLED )
|
|
{
|
|
// Cancel pressed, cancel everything and return early
|
|
m_summaryFileInfos.clear();
|
|
m_gridFiles.clear();
|
|
m_summaryFileErrors.clear();
|
|
return;
|
|
}
|
|
|
|
if ( result.status == RicSummaryCaseRestartDialogResult::SUMMARY_ERROR ||
|
|
result.status == RicSummaryCaseRestartDialogResult::SUMMARY_WARNING )
|
|
{
|
|
// A summary import failure occurred with one of the files. The others may still have worked.
|
|
m_summaryFileErrors.push_back( initialFile.summaryFileName() );
|
|
}
|
|
else
|
|
{
|
|
for ( const QString& file : result.summaryFiles )
|
|
{
|
|
RifSummaryCaseFileResultInfo resultFileInfo( file,
|
|
result.summaryImportOption ==
|
|
RicSummaryCaseRestartDialog::ImportOptions::IMPORT_ALL );
|
|
if ( !vectorContains( m_summaryFileInfos, resultFileInfo ) )
|
|
{
|
|
m_summaryFileInfos.push_back( resultFileInfo );
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( result.status != RicSummaryCaseRestartDialogResult::SUMMARY_ERROR )
|
|
{
|
|
lastResult = result;
|
|
|
|
for ( const QString& gridFile : result.gridFiles )
|
|
{
|
|
m_gridFiles.push_back( gridFile );
|
|
}
|
|
}
|
|
|
|
progress.incrementProgress();
|
|
}
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
void RifSummaryCaseRestartSelector::determineFilesToImportUsingPrefs( const std::vector<RifSummaryCaseFileImportInfo>& initialFiles )
|
|
{
|
|
RicSummaryCaseRestartDialogResult lastResult;
|
|
|
|
m_summaryFileInfos.clear();
|
|
m_gridFiles.clear();
|
|
m_summaryFileErrors.clear();
|
|
|
|
RiaPreferencesSummary* prefs = RiaPreferencesSummary::current();
|
|
|
|
RicSummaryCaseRestartDialog::ImportOptions defaultSummaryImportMode;
|
|
if ( m_ensembleOrGroupMode )
|
|
{
|
|
defaultSummaryImportMode = mapReadOption( prefs->summaryEnsembleImportMode() );
|
|
}
|
|
else
|
|
{
|
|
defaultSummaryImportMode = mapReadOption( prefs->summaryImportMode() );
|
|
}
|
|
|
|
caf::ProgressInfo progress( initialFiles.size(), QString( "Importing files" ) );
|
|
for ( const RifSummaryCaseFileImportInfo& initialFile : initialFiles )
|
|
{
|
|
QString initialSummaryFile = RiaFilePathTools::toInternalSeparator( initialFile.summaryFileName() );
|
|
QString initialGridFile = RiaFilePathTools::toInternalSeparator( initialFile.gridFileName() );
|
|
bool handleSummaryFile = !initialSummaryFile.isEmpty();
|
|
bool handleGridFile = !initialGridFile.isEmpty();
|
|
|
|
if ( handleSummaryFile )
|
|
{
|
|
if ( defaultSummaryImportMode == RicSummaryCaseRestartDialog::ImportOptions::IMPORT_ALL )
|
|
{
|
|
m_summaryFileInfos.push_back( RifSummaryCaseFileResultInfo( initialSummaryFile, true ) );
|
|
}
|
|
else if ( defaultSummaryImportMode == RicSummaryCaseRestartDialog::ImportOptions::NOT_IMPORT )
|
|
{
|
|
m_summaryFileInfos.push_back( RifSummaryCaseFileResultInfo( initialSummaryFile, false ) );
|
|
}
|
|
else if ( defaultSummaryImportMode == RicSummaryCaseRestartDialog::ImportOptions::SEPARATE_CASES )
|
|
{
|
|
m_summaryFileInfos.push_back( RifSummaryCaseFileResultInfo( initialSummaryFile, false ) );
|
|
|
|
std::vector<QString> warnings;
|
|
std::vector<RifRestartFileInfo> restartFileInfos = RifEclipseSummaryTools::getRestartFiles( initialSummaryFile, warnings );
|
|
for ( const auto& rfi : restartFileInfos )
|
|
{
|
|
RifSummaryCaseFileResultInfo resultFileInfo( RiaFilePathTools::toInternalSeparator( rfi.fileName ), false );
|
|
if ( !vectorContains( m_summaryFileInfos, resultFileInfo ) )
|
|
{
|
|
m_summaryFileInfos.push_back( resultFileInfo );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( handleGridFile )
|
|
{
|
|
m_gridFiles.push_back( initialGridFile );
|
|
|
|
RicSummaryCaseRestartDialog::ImportOptions defaultGridImportMode = mapReadOption( prefs->gridImportMode() );
|
|
if ( defaultGridImportMode == RicSummaryCaseRestartDialog::ImportOptions::SEPARATE_CASES )
|
|
{
|
|
std::vector<QString> warnings;
|
|
|
|
std::vector<RifRestartFileInfo> restartFileInfos = RifEclipseSummaryTools::getRestartFiles( initialSummaryFile, warnings );
|
|
for ( const auto& rfi : restartFileInfos )
|
|
{
|
|
QString gridFileName = RifEclipseSummaryTools::findGridCaseFileFromSummaryHeaderFile( rfi.fileName );
|
|
if ( !m_gridFiles.contains( gridFileName ) && QFileInfo( gridFileName ).exists() )
|
|
{
|
|
m_gridFiles.push_back( gridFileName );
|
|
}
|
|
}
|
|
|
|
for ( const QString& warning : warnings )
|
|
RiaLogging::error( warning );
|
|
}
|
|
}
|
|
|
|
progress.incrementProgress();
|
|
}
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
bool RifSummaryCaseRestartSelector::foundErrors() const
|
|
{
|
|
return !m_summaryFileErrors.empty();
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
QString RifSummaryCaseRestartSelector::createCombinedErrorMessage() const
|
|
{
|
|
QString errorMessage;
|
|
if ( !m_summaryFileErrors.empty() )
|
|
{
|
|
errorMessage = QString( "Failed to import the following summary file" );
|
|
if ( m_summaryFileErrors.size() > 1 )
|
|
{
|
|
errorMessage += QString( "s" );
|
|
}
|
|
errorMessage += QString( ":\n" );
|
|
for ( const QString& fileWarning : m_summaryFileErrors )
|
|
{
|
|
errorMessage += fileWarning + QString( "\n" );
|
|
}
|
|
}
|
|
return errorMessage;
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
QString RifSummaryCaseRestartSelector::getSummaryFileFromGridFile( const QString& gridFile )
|
|
{
|
|
// Find summary header file names from eclipse case file names
|
|
if ( !gridFile.isEmpty() )
|
|
{
|
|
QString summaryHeaderFile;
|
|
bool formatted;
|
|
|
|
RifEclipseSummaryTools::findSummaryHeaderFile( gridFile, &summaryHeaderFile, &formatted );
|
|
|
|
if ( !summaryHeaderFile.isEmpty() )
|
|
{
|
|
return summaryHeaderFile;
|
|
}
|
|
}
|
|
return "";
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
RifSummaryCaseFileImportInfo::RifSummaryCaseFileImportInfo( const QString& summaryFileName,
|
|
const QString& gridFileName,
|
|
RiaDefines::FileType fileType )
|
|
: m_summaryFileName( summaryFileName )
|
|
, m_gridFileName( gridFileName )
|
|
, m_failOnSummaryFileImportError( false )
|
|
, m_fileType( fileType )
|
|
{
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
const QString& RifSummaryCaseFileImportInfo::summaryFileName() const
|
|
{
|
|
return m_summaryFileName;
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
const QString& RifSummaryCaseFileImportInfo::gridFileName() const
|
|
{
|
|
return m_gridFileName;
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
bool RifSummaryCaseFileImportInfo::failOnSummaryFileError() const
|
|
{
|
|
return m_failOnSummaryFileImportError;
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
void RifSummaryCaseFileImportInfo::setFailOnSummaryFileError( bool failOnSummaryFileImportError )
|
|
{
|
|
m_failOnSummaryFileImportError = failOnSummaryFileImportError;
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
RiaDefines::FileType RifSummaryCaseFileImportInfo::fileType() const
|
|
{
|
|
return m_fileType;
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
RifSummaryCaseFileResultInfo::RifSummaryCaseFileResultInfo( const QString& summaryFileName, bool includeRestartFiles, RiaDefines::FileType fileType )
|
|
: m_summaryFileName( summaryFileName )
|
|
, m_includeRestartFiles( includeRestartFiles )
|
|
, m_fileType( fileType )
|
|
{
|
|
CVF_ASSERT( !m_summaryFileName.isEmpty() );
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
const QString& RifSummaryCaseFileResultInfo::summaryFileName() const
|
|
{
|
|
return m_summaryFileName;
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
bool RifSummaryCaseFileResultInfo::includeRestartFiles() const
|
|
{
|
|
return m_includeRestartFiles;
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
RiaDefines::FileType RifSummaryCaseFileResultInfo::fileType() const
|
|
{
|
|
return m_fileType;
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
bool RifSummaryCaseFileResultInfo::operator<( const RifSummaryCaseFileResultInfo& other ) const
|
|
{
|
|
return m_summaryFileName < other.summaryFileName();
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------
|
|
///
|
|
//--------------------------------------------------------------------------------------------------
|
|
bool RifSummaryCaseFileResultInfo::operator==( const RifSummaryCaseFileResultInfo& other ) const
|
|
{
|
|
return m_summaryFileName == other.summaryFileName();
|
|
}
|