From 6c8dda3869d17c85eabb70f365f79cde2bceee89 Mon Sep 17 00:00:00 2001 From: Kristian Bendiksen Date: Wed, 7 Oct 2020 12:41:10 +0200 Subject: [PATCH] #6651: Allow wild card in formation name when importing elastic properties. --- .../RicElasticPropertiesImportTools.cpp | 103 ++++++++++++++---- .../RicElasticPropertiesImportTools.h | 7 +- 2 files changed, 86 insertions(+), 24 deletions(-) diff --git a/ApplicationCode/Commands/RicElasticPropertiesImportTools.cpp b/ApplicationCode/Commands/RicElasticPropertiesImportTools.cpp index 1a014b6822..b3edd0a631 100644 --- a/ApplicationCode/Commands/RicElasticPropertiesImportTools.cpp +++ b/ApplicationCode/Commands/RicElasticPropertiesImportTools.cpp @@ -20,15 +20,20 @@ #include "RiaLogging.h" -#include "RimElasticProperties.h" -#include "RimFractureModelTemplate.h" - #include "RifCsvUserDataParser.h" #include "RifElasticPropertiesReader.h" #include "RifFileParseTools.h" #include "RigElasticProperties.h" +#include "RigFormationNames.h" +#include "RimElasticProperties.h" +#include "RimFormationNames.h" +#include "RimFormationNamesCollection.h" +#include "RimFractureModelTemplate.h" +#include "RimOilField.h" +#include "RimProject.h" + #include #include @@ -36,7 +41,8 @@ /// //-------------------------------------------------------------------------------------------------- void RicElasticPropertiesImportTools::importElasticPropertiesFromFile( const QString& filePath, - RimFractureModelTemplate* fractureModelTemplate ) + RimFractureModelTemplate* fractureModelTemplate, + const QString& formationWildCard ) { RifCsvUserDataFileParser csvParser( filePath ); QString separator = csvParser.tryDetermineCellSeparator(); @@ -57,12 +63,26 @@ void RicElasticPropertiesImportTools::importElasticPropertiesFromFile( const QSt return; } + std::vector formationNames = getFormationNames(); + // Find the unique facies keys (combination of field, formation and facies names) std::set faciesKeys; for ( RifElasticProperties item : rifElasticProperties ) { - FaciesKey faciesKey = std::make_tuple( item.fieldName, item.formationName, item.faciesName ); - faciesKeys.insert( faciesKey ); + if ( item.formationName == formationWildCard ) + { + // Found wildcard: generate keys for all formations + for ( QString formationName : formationNames ) + { + FaciesKey faciesKey = std::make_tuple( item.fieldName, formationName, item.faciesName ); + faciesKeys.insert( faciesKey ); + } + } + else + { + FaciesKey faciesKey = std::make_tuple( item.fieldName, item.formationName, item.faciesName ); + faciesKeys.insert( faciesKey ); + } } RimElasticProperties* rimElasticProperties = new RimElasticProperties; @@ -77,7 +97,9 @@ void RicElasticPropertiesImportTools::importElasticPropertiesFromFile( const QSt // Group the items with a given facies key for ( RifElasticProperties item : rifElasticProperties ) { - if ( item.fieldName == fieldName && item.formationName == formationName && item.faciesName == faciesName ) + if ( item.fieldName == fieldName && + ( item.formationName == formationName || item.formationName == formationWildCard ) && + item.faciesName == faciesName ) { matchingFacies.push_back( item ); } @@ -88,28 +110,63 @@ void RicElasticPropertiesImportTools::importElasticPropertiesFromFile( const QSt matchingFacies.end(), []( const RifElasticProperties& a, const RifElasticProperties& b ) { return a.porosity < b.porosity; } ); - // Finally add the values - RigElasticProperties rigElasticProperties( fieldName, formationName, faciesName ); - for ( RifElasticProperties item : matchingFacies ) + std::vector matchingFormations; + if ( formationName == formationWildCard ) { - rigElasticProperties.appendValues( item.porosity, - item.youngsModulus, - item.poissonsRatio, - item.K_Ic, - item.proppantEmbedment, - item.biotCoefficient, - item.k0, - item.fluidLossCoefficient, - item.spurtLoss, - item.immobileFluidSaturation ); + // Duplicate values for all formations when encountering a wild card + matchingFormations = formationNames; + } + else + { + matchingFormations.push_back( formationName ); } - // Avoid using the field name in the match for now - FaciesKey noFieldKey = std::make_tuple( "", formationName, faciesName ); - rimElasticProperties->setPropertiesForFacies( noFieldKey, rigElasticProperties ); + for ( QString matchingFormationName : matchingFormations ) + { + // Finally add the values + RigElasticProperties rigElasticProperties( fieldName, matchingFormationName, faciesName ); + for ( RifElasticProperties item : matchingFacies ) + { + rigElasticProperties.appendValues( item.porosity, + item.youngsModulus, + item.poissonsRatio, + item.K_Ic, + item.proppantEmbedment, + item.biotCoefficient, + item.k0, + item.fluidLossCoefficient, + item.spurtLoss, + item.immobileFluidSaturation ); + } + + // Avoid using the field name in the match for now + FaciesKey noFieldKey = std::make_tuple( "", matchingFormationName, faciesName ); + rimElasticProperties->setPropertiesForFacies( noFieldKey, rigElasticProperties ); + } } rimElasticProperties->setFilePath( filePath ); fractureModelTemplate->setElasticProperties( rimElasticProperties ); fractureModelTemplate->updateConnectedEditors(); } + +//-------------------------------------------------------------------------------------------------- +/// Finds first formation names. +//-------------------------------------------------------------------------------------------------- +std::vector RicElasticPropertiesImportTools::getFormationNames() +{ + RimProject* project = RimProject::current(); + RimOilField* oilField = project->activeOilField(); + + RimFormationNamesCollection* formationNamesCollection = oilField->formationNamesCollection(); + for ( RimFormationNames* formationNames : formationNamesCollection->formationNamesList().childObjects() ) + { + if ( formationNames && formationNames->formationNamesData() ) + { + RigFormationNames* rigFormationNames = formationNames->formationNamesData(); + if ( rigFormationNames ) return rigFormationNames->formationNames(); + } + } + + return std::vector(); +} diff --git a/ApplicationCode/Commands/RicElasticPropertiesImportTools.h b/ApplicationCode/Commands/RicElasticPropertiesImportTools.h index 789098fbb1..811a00a49f 100644 --- a/ApplicationCode/Commands/RicElasticPropertiesImportTools.h +++ b/ApplicationCode/Commands/RicElasticPropertiesImportTools.h @@ -19,6 +19,7 @@ #pragma once #include +#include class RimFractureModelTemplate; @@ -28,9 +29,13 @@ class RimFractureModelTemplate; class RicElasticPropertiesImportTools { public: - static void importElasticPropertiesFromFile( const QString& filePath, RimFractureModelTemplate* fractureModelTemplate ); + static void importElasticPropertiesFromFile( const QString& filePath, + RimFractureModelTemplate* fractureModelTemplate, + const QString& formationWildCard = "1*" ); private: // Hidden to avoid instantiation RicElasticPropertiesImportTools(); + + static std::vector getFormationNames(); };