Skip to content

Commit

Permalink
#9773 Generate better ensembles for StimPlan summaries.
Browse files Browse the repository at this point in the history
  • Loading branch information
kriben committed Apr 19, 2023
1 parent 3a327c6 commit 95f9719
Show file tree
Hide file tree
Showing 7 changed files with 180 additions and 13 deletions.
100 changes: 100 additions & 0 deletions ApplicationLibCode/Application/Tools/RiaEnsembleNameTools.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,106 @@ std::vector<QStringList> RiaEnsembleNameTools::groupFilesByEnsemble( const QStri
return groupedByIteration;
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::map<QString, QStringList> RiaEnsembleNameTools::groupFilesByStimPlanEnsemble( const QStringList& fileNames )
{
std::vector<QStringList> componentsForAllFilePaths;
for ( const auto& filePath : fileNames )
{
QStringList components = RiaFilePathTools::splitPathIntoComponents( filePath );
componentsForAllFilePaths.push_back( components );
}

auto mapping = findUniqueStimPlanEnsembleNames( fileNames, componentsForAllFilePaths );

std::set<QString> iterations;
for ( const auto& [name, iterFileNamePair] : mapping )
{
iterations.insert( iterFileNamePair.first );
}

std::map<QString, QStringList> groupedByIteration;

for ( const QString& groupIteration : iterations )
{
QStringList fileNamesFromIteration;

for ( const auto& [name, iterFileNamePair] : mapping )
{
QString iteration = iterFileNamePair.first;
QString fileName = iterFileNamePair.second;

if ( groupIteration == iteration )
{
fileNamesFromIteration << fileName;
}
}
groupedByIteration[groupIteration] = fileNamesFromIteration;
}

return groupedByIteration;
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::map<QString, std::pair<QString, QString>>
RiaEnsembleNameTools::findUniqueStimPlanEnsembleNames( const QStringList& fileNames, const std::vector<QStringList>& fileNameComponents )
{
CAF_ASSERT( fileNames.size() == static_cast<int>( fileNameComponents.size() ) );

struct StimPlanComponents
{
QString realization;
QString iteration;
QString well;
QString fracture;
QString job;
QString fileName;
};

std::vector<StimPlanComponents> comps;

int i = 0;
for ( const auto& fileComponents : fileNameComponents )
{
int numComponents = fileComponents.size();

if ( numComponents >= 7 )
{
StimPlanComponents c;
c.fileName = fileNames[i];
c.fracture = fileComponents[numComponents - 2];
c.iteration = fileComponents[numComponents - 6];
c.realization = fileComponents[numComponents - 7];

QString wellJobComponent = fileComponents[numComponents - 3];
QStringList parts = wellJobComponent.split( "_" );

if ( parts.size() == 4 )
{
c.well = parts[0];
c.job = parts[3];
}

comps.push_back( c );
}
i++;
}

std::map<QString, std::pair<QString, QString>> mapping;
for ( const StimPlanComponents& c : comps )
{
QString key = QString( "%1, %2, %3, %4, %5" ).arg( c.iteration, c.realization, c.well, c.fracture, c.job );
QString iteration = QString( "%1, %2, %3, %4" ).arg( c.iteration, c.well, c.fracture, c.job );
mapping[key] = std::make_pair( iteration, c.fileName );
}

return mapping;
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
Expand Down
6 changes: 5 additions & 1 deletion ApplicationLibCode/Application/Tools/RiaEnsembleNameTools.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,11 @@ class RiaEnsembleNameTools
const std::map<QString, QStringList>& keyFileComponentsForAllFiles,
const QString& ensembleCaseName );

static std::vector<QStringList> groupFilesByEnsemble( const QStringList& fileNames, EnsembleGroupingMode groupingMode );
static std::vector<QStringList> groupFilesByEnsemble( const QStringList& fileNames, EnsembleGroupingMode groupingMode );
static std::map<QString, QStringList> groupFilesByStimPlanEnsemble( const QStringList& fileNames );

static std::map<QString, std::pair<QString, QString>>
findUniqueStimPlanEnsembleNames( const QStringList& fileNames, const std::vector<QStringList>& fileNameComponents );

static QString uniqueShortNameForEnsembleCase( RimSummaryCase* summaryCase );
static QString uniqueShortNameForSummaryCase( RimSummaryCase* summaryCase );
Expand Down
27 changes: 21 additions & 6 deletions ApplicationLibCode/Commands/RicImportEnsembleFeature.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include "RiaEnsembleNameTools.h"
#include "RiaFilePathTools.h"
#include "RiaPreferences.h"
#include "RiaSummaryDefines.h"
#include "RiaSummaryTools.h"
#include "RiaTextStringTools.h"

Expand Down Expand Up @@ -84,11 +85,23 @@ void RicImportEnsembleFeature::onActionTriggered( bool isChecked )
}
else
{
std::vector<QStringList> groupedByEnsemble = RiaEnsembleNameTools::groupFilesByEnsemble( fileNames, ensembleGroupingMode );
for ( const QStringList& groupedFileNames : groupedByEnsemble )
if ( fileType == RiaDefines::FileType::STIMPLAN_SUMMARY )
{
bool useEnsembleNameDialog = false;
importSingleEnsemble( groupedFileNames, useEnsembleNameDialog, ensembleGroupingMode, fileType );
std::map<QString, QStringList> groupedByEnsemble = RiaEnsembleNameTools::groupFilesByStimPlanEnsemble( fileNames );
for ( const auto& [ensembleName, groupedFileNames] : groupedByEnsemble )
{
bool useEnsembleNameDialog = false;
importSingleEnsemble( groupedFileNames, useEnsembleNameDialog, ensembleGroupingMode, fileType, ensembleName );
}
}
else
{
std::vector<QStringList> groupedByEnsemble = RiaEnsembleNameTools::groupFilesByEnsemble( fileNames, ensembleGroupingMode );
for ( const QStringList& groupedFileNames : groupedByEnsemble )
{
bool useEnsembleNameDialog = false;
importSingleEnsemble( groupedFileNames, useEnsembleNameDialog, ensembleGroupingMode, fileType );
}
}
}
}
Expand All @@ -99,9 +112,11 @@ void RicImportEnsembleFeature::onActionTriggered( bool isChecked )
void RicImportEnsembleFeature::importSingleEnsemble( const QStringList& fileNames,
bool useEnsembleNameDialog,
RiaEnsembleNameTools::EnsembleGroupingMode groupingMode,
RiaDefines::FileType fileType )
RiaDefines::FileType fileType,
const QString& defaultEnsembleName )
{
QString ensembleName = RiaEnsembleNameTools::findSuitableEnsembleName( fileNames, groupingMode );
QString ensembleName = !defaultEnsembleName.isEmpty() ? defaultEnsembleName
: RiaEnsembleNameTools::findSuitableEnsembleName( fileNames, groupingMode );

if ( useEnsembleNameDialog ) ensembleName = askForEnsembleName( ensembleName );

Expand Down
3 changes: 2 additions & 1 deletion ApplicationLibCode/Commands/RicImportEnsembleFeature.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,5 +43,6 @@ class RicImportEnsembleFeature : public caf::CmdFeature
static void importSingleEnsemble( const QStringList& fileNames,
bool useEnsembleNameDialog,
RiaEnsembleNameTools::EnsembleGroupingMode groupingMode,
RiaDefines::FileType fileType );
RiaDefines::FileType fileType,
const QString& defaultEnsembleName = QString() );
};
22 changes: 17 additions & 5 deletions ApplicationLibCode/Commands/RicRecursiveFileSearchDialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -433,12 +433,24 @@ void RicRecursiveFileSearchDialog::updateFileListWidget()

if ( ensembleGroupingMode() != RiaEnsembleNameTools::EnsembleGroupingMode::NONE )
{
std::vector<QStringList> groupedByEnsemble = RiaEnsembleNameTools::groupFilesByEnsemble( m_foundFiles, ensembleGroupingMode() );
for ( const QStringList& groupedFileNames : groupedByEnsemble )
if ( m_fileType == RicRecursiveFileSearchDialog::FileType::STIMPLAN_SUMMARY )
{
QString ensembleName = RiaEnsembleNameTools::findSuitableEnsembleName( groupedFileNames, ensembleGroupingMode() );
new QListWidgetItem( QDir::toNativeSeparators( ensembleName ), m_fileListWidget );
addToFileListWidget( groupedFileNames );
std::map<QString, QStringList> groupedByEnsemble = RiaEnsembleNameTools::groupFilesByStimPlanEnsemble( m_foundFiles );
for ( auto [ensembleName, groupedFileNames] : groupedByEnsemble )
{
new QListWidgetItem( QDir::toNativeSeparators( ensembleName ), m_fileListWidget );
addToFileListWidget( groupedFileNames );
}
}
else
{
std::vector<QStringList> groupedByEnsemble = RiaEnsembleNameTools::groupFilesByEnsemble( m_foundFiles, ensembleGroupingMode() );
for ( const QStringList& groupedFileNames : groupedByEnsemble )
{
QString ensembleName = RiaEnsembleNameTools::findSuitableEnsembleName( groupedFileNames, ensembleGroupingMode() );
new QListWidgetItem( QDir::toNativeSeparators( ensembleName ), m_fileListWidget );
addToFileListWidget( groupedFileNames );
}
}
}
else
Expand Down
1 change: 1 addition & 0 deletions ApplicationLibCode/UnitTests/CMakeLists_files.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ set(SOURCE_GROUP_SOURCE_FILES
${CMAKE_CURRENT_LIST_DIR}/RifRevealCsvSectionSummaryReader-Test.cpp
${CMAKE_CURRENT_LIST_DIR}/RifRevealCsvSummaryReader-Test.cpp
${CMAKE_CURRENT_LIST_DIR}/RifStimPlanCsvSummaryReader-Test.cpp
${CMAKE_CURRENT_LIST_DIR}/RiaEnsembleNameTools-Test.cpp
)

if(RESINSIGHT_ENABLE_GRPC)
Expand Down
34 changes: 34 additions & 0 deletions ApplicationLibCode/UnitTests/RiaEnsembleNameTools-Test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2023 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 "gtest/gtest.h"

#include "RiaEnsembleNameTools.h"

#include <QStringList>

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
TEST( RiaEnsembleNameToolsTests, commonBaseName )
{
QStringList fileNames = { "/base/realization-0/iter-0/stimplan/output/B-H3_StimPlanModel_01_job-01/mainfrac/data_vs_time.csv",
"/base/realization-0/iter-0/stimplan/output/B-H3_StimPlanModel_02_job-02/mainfrac/data_vs_time.csv" };

ASSERT_EQ( "data_vs_time", RiaEnsembleNameTools::findCommonBaseName( fileNames ).toStdString() );
}

0 comments on commit 95f9719

Please sign in to comment.