Merge dev into feature-analysis-plots-initial

This commit is contained in:
Jacob Støren
2020-03-31 13:13:47 +02:00
288 changed files with 44732 additions and 2326 deletions

View File

@@ -17,6 +17,7 @@
/////////////////////////////////////////////////////////////////////////////////
#include "RiaApplication.h"
#include "RiaQDateTimeTools.h"
#include "SummaryPlotCommands/RicNewDerivedEnsembleFeature.h"
@@ -28,10 +29,27 @@
#include "RifSummaryReaderInterface.h"
#include <cafPdmUiPushButtonEditor.h>
#include "cafPdmUiPushButtonEditor.h"
#include "cafPdmUiTreeSelectionEditor.h"
#include <cmath>
namespace caf
{
template <>
void caf::AppEnum<RimDerivedEnsembleCaseCollection::FixedTimeStepMode>::setUp()
{
addItem( RimDerivedEnsembleCaseCollection::FixedTimeStepMode::FIXED_TIME_STEP_NONE, "FIXED_TIME_STEP_NONE", "None" );
addItem( RimDerivedEnsembleCaseCollection::FixedTimeStepMode::FIXED_TIME_STEP_CASE_1,
"FIXED_TIME_STEP_CASE_1",
"Ensemble 1" );
addItem( RimDerivedEnsembleCaseCollection::FixedTimeStepMode::FIXED_TIME_STEP_CASE_2,
"FIXED_TIME_STEP_CASE_2",
"Ensemble 2" );
setDefault( RimDerivedEnsembleCaseCollection::FixedTimeStepMode::FIXED_TIME_STEP_NONE );
}
} // namespace caf
CAF_PDM_SOURCE_INIT( RimDerivedEnsembleCaseCollection, "RimDerivedEnsembleCaseCollection" );
//--------------------------------------------------------------------------------------------------
@@ -39,7 +57,7 @@ CAF_PDM_SOURCE_INIT( RimDerivedEnsembleCaseCollection, "RimDerivedEnsembleCaseCo
//--------------------------------------------------------------------------------------------------
RimDerivedEnsembleCaseCollection::RimDerivedEnsembleCaseCollection()
{
CAF_PDM_InitObject( "Derived Ensemble", ":/SummaryEnsemble16x16.png", "", "" );
CAF_PDM_InitObject( "Delta Ensemble", ":/SummaryEnsemble16x16.png", "", "" );
CAF_PDM_InitFieldNoDefault( &m_ensemble1, "Ensemble1", "Ensemble 1", "", "", "" );
m_ensemble1.uiCapability()->setUiTreeChildrenHidden( true );
@@ -59,6 +77,13 @@ RimDerivedEnsembleCaseCollection::RimDerivedEnsembleCaseCollection()
CAF_PDM_InitField( &m_caseCount, "CaseCount", QString( "" ), "Matching Cases", "", "", "" );
m_caseCount.uiCapability()->setUiReadOnly( true );
CAF_PDM_InitField( &m_matchOnParameters, "MatchOnParameters", false, "Match On Parameters", "", "", "" );
CAF_PDM_InitFieldNoDefault( &m_useFixedTimeStep, "UseFixedTimeStep", "Use Fixed Time Step", "", "", "" );
CAF_PDM_InitField( &m_fixedTimeStepIndex, "FixedTimeStepIndex", 0, "Time Step", "", "", "" );
m_fixedTimeStepIndex.uiCapability()->setUiEditorTypeName( caf::PdmUiTreeSelectionEditor::uiEditorTypeName() );
m_fixedTimeStepIndex.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::HIDDEN );
// Do not show child cases
uiCapability()->setUiTreeChildrenHidden( true );
@@ -66,7 +91,7 @@ RimDerivedEnsembleCaseCollection::RimDerivedEnsembleCaseCollection()
m_cases.xmlCapability()->disableIO();
setNameAsReadOnly();
setName( "Derived Ensemble" );
setName( "Delta Ensemble" );
}
//--------------------------------------------------------------------------------------------------
@@ -136,12 +161,33 @@ void RimDerivedEnsembleCaseCollection::updateDerivedEnsembleCases()
auto crp = sumCase1->caseRealizationParameters();
if ( !crp ) continue;
const auto& sumCase2 = findCaseByParametersHash( cases2, crp->parametersHash() );
if ( !sumCase2 ) continue;
RimSummaryCase* summaryCase2 = nullptr;
if ( m_matchOnParameters )
{
summaryCase2 = findCaseByParametersHash( cases2, crp->parametersHash() );
}
else
{
summaryCase2 = findCaseByRealizationNumber( cases2, crp->realizationNumber() );
}
if ( !summaryCase2 ) continue;
auto derivedCase = firstCaseNotInUse();
derivedCase->setSummaryCases( sumCase1, sumCase2 );
derivedCase->setSummaryCases( sumCase1, summaryCase2 );
derivedCase->setOperator( m_operator() );
int fixedTimeStepCase1 = -1;
int fixedTimeStepCase2 = -1;
if ( m_useFixedTimeStep == FixedTimeStepMode::FIXED_TIME_STEP_CASE_1 )
{
fixedTimeStepCase1 = m_fixedTimeStepIndex;
}
else if ( m_useFixedTimeStep == FixedTimeStepMode::FIXED_TIME_STEP_CASE_2 )
{
fixedTimeStepCase2 = m_fixedTimeStepIndex;
}
derivedCase->setFixedTimeSteps( fixedTimeStepCase1, fixedTimeStepCase2 );
derivedCase->createSummaryReaderInterface();
derivedCase->setCaseRealizationParameters( crp );
derivedCase->setInUse( true );
@@ -205,6 +251,30 @@ QList<caf::PdmOptionItemInfo>
m_caseCount = QString( "%1 / %2" ).arg( (int)m_cases.size() ).arg( std::max( caseCount1, caseCount2 ) );
}
if ( fieldNeedingOptions == &m_fixedTimeStepIndex )
{
RimSummaryCaseCollection* sourceEnsemble = nullptr;
if ( m_useFixedTimeStep() == FixedTimeStepMode::FIXED_TIME_STEP_CASE_1 )
{
sourceEnsemble = m_ensemble1;
}
else if ( m_useFixedTimeStep() == FixedTimeStepMode::FIXED_TIME_STEP_CASE_2 )
{
sourceEnsemble = m_ensemble2;
}
if ( sourceEnsemble && !sourceEnsemble->allSummaryCases().empty() )
{
auto firstCase = sourceEnsemble->allSummaryCases().front();
auto summaryReader = firstCase->summaryReader();
const std::vector<time_t>& timeSteps = summaryReader->timeSteps( RifEclipseSummaryAddress() );
options = RiaQDateTimeTools::createOptionItems( timeSteps );
}
}
return options;
}
@@ -220,6 +290,13 @@ void RimDerivedEnsembleCaseCollection::defineUiOrdering( QString uiConfigName, c
uiOrdering.add( &m_operator );
uiOrdering.add( &m_ensemble2 );
uiOrdering.add( &m_swapEnsemblesButton );
uiOrdering.add( &m_matchOnParameters );
uiOrdering.add( &m_useFixedTimeStep );
if ( m_useFixedTimeStep() != RimDerivedEnsembleCaseCollection::FixedTimeStepMode::FIXED_TIME_STEP_NONE )
{
uiOrdering.add( &m_fixedTimeStepIndex );
}
uiOrdering.skipRemainingFields( true );
@@ -238,13 +315,13 @@ void RimDerivedEnsembleCaseCollection::fieldChangedByUi( const caf::PdmFieldHand
bool doUpdateCases = false;
bool doShowDialog = false;
if ( changedField == &m_ensemble1 || changedField == &m_ensemble2 )
if ( changedField == &m_ensemble1 || changedField == &m_ensemble2 || changedField == &m_matchOnParameters )
{
doUpdate = true;
doUpdateCases = true;
doShowDialog = true;
}
else if ( changedField == &m_operator )
else if ( changedField == &m_operator || changedField == &m_useFixedTimeStep || changedField == &m_fixedTimeStepIndex )
{
doUpdate = true;
doUpdateCases = true;
@@ -302,6 +379,15 @@ void RimDerivedEnsembleCaseCollection::defineEditorAttribute( const caf::PdmFiel
attrib->m_buttonText = "Swap Ensembles";
}
}
if ( &m_fixedTimeStepIndex == field )
{
auto a = dynamic_cast<caf::PdmUiTreeSelectionEditorAttribute*>( attribute );
if ( a )
{
a->singleSelectionMode = true;
a->showTextFilter = true;
}
}
}
//--------------------------------------------------------------------------------------------------
@@ -374,16 +460,59 @@ std::vector<RimDerivedSummaryCase*> RimDerivedEnsembleCaseCollection::allDerived
//--------------------------------------------------------------------------------------------------
void RimDerivedEnsembleCaseCollection::updateAutoName()
{
QString op = caf::AppEnum<DerivedSummaryOperator>::uiText( m_operator() );
QString timeStepString;
{
RimSummaryCaseCollection* sourceEnsemble = nullptr;
if ( m_useFixedTimeStep() == FixedTimeStepMode::FIXED_TIME_STEP_CASE_1 )
{
sourceEnsemble = m_ensemble1;
}
else if ( m_useFixedTimeStep() == FixedTimeStepMode::FIXED_TIME_STEP_CASE_2 )
{
sourceEnsemble = m_ensemble2;
}
auto derivedEnsemble1 = dynamic_cast<RimDerivedEnsembleCaseCollection*>( m_ensemble1() );
auto derivedEnsemble2 = dynamic_cast<RimDerivedEnsembleCaseCollection*>( m_ensemble2() );
bool isDerived1 = derivedEnsemble1 != nullptr;
bool isDerived2 = derivedEnsemble2 != nullptr;
if ( sourceEnsemble && !sourceEnsemble->allSummaryCases().empty() )
{
auto firstCase = sourceEnsemble->allSummaryCases().front();
auto summaryReader = firstCase->summaryReader();
if ( summaryReader )
{
const std::vector<time_t>& timeSteps = summaryReader->timeSteps( RifEclipseSummaryAddress() );
if ( m_fixedTimeStepIndex >= 0 && m_fixedTimeStepIndex < timeSteps.size() )
{
time_t selectedTime = timeSteps[m_fixedTimeStepIndex];
QDateTime dt = RiaQDateTimeTools::fromTime_t( selectedTime );
QString formatString = RiaQDateTimeTools::createTimeFormatStringFromDates( {dt} );
QString name = ( isDerived1 ? "(" : "" ) + ( m_ensemble1 ? m_ensemble1->name() : "" ) + ( isDerived1 ? ")" : "" ) +
" " + op + " " + ( isDerived2 ? "(" : "" ) + ( m_ensemble2 ? m_ensemble2->name() : "" ) +
( isDerived2 ? ")" : "" );
timeStepString = RiaQDateTimeTools::toStringUsingApplicationLocale( dt, formatString );
}
}
}
}
QString nameCase1 = "None";
if ( m_ensemble1 )
{
nameCase1 = m_ensemble1->name();
if ( m_useFixedTimeStep() == FixedTimeStepMode::FIXED_TIME_STEP_CASE_1 ) nameCase1 += "@" + timeStepString;
}
QString nameCase2 = "None";
if ( m_ensemble2 )
{
nameCase2 = m_ensemble2->name();
if ( m_useFixedTimeStep() == FixedTimeStepMode::FIXED_TIME_STEP_CASE_2 ) nameCase2 += "@" + timeStepString;
}
QString operatorText;
if ( m_operator() == DerivedSummaryOperator::DERIVED_OPERATOR_SUB )
operatorText = "Delta";
else if ( m_operator() == DerivedSummaryOperator::DERIVED_OPERATOR_ADD )
operatorText = "Sum";
QString name = operatorText + QString( "(%1 , %2)" ).arg( nameCase1, nameCase2 );
setName( name );
// If other derived ensembles are referring to this ensemble, update theirs name as well
@@ -408,6 +537,20 @@ RimSummaryCase* RimDerivedEnsembleCaseCollection::findCaseByParametersHash( cons
return nullptr;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimSummaryCase* RimDerivedEnsembleCaseCollection::findCaseByRealizationNumber( const std::vector<RimSummaryCase*>& cases,
int realizationNumber ) const
{
for ( auto sumCase : cases )
{
auto ensembleParameters = sumCase->caseRealizationParameters();
if ( ensembleParameters && ensembleParameters->realizationNumber() == realizationNumber ) return sumCase;
}
return nullptr;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------

View File

@@ -40,6 +40,14 @@ class RimDerivedEnsembleCaseCollection : public RimSummaryCaseCollection
{
CAF_PDM_HEADER_INIT;
public:
enum class FixedTimeStepMode
{
FIXED_TIME_STEP_NONE,
FIXED_TIME_STEP_CASE_1,
FIXED_TIME_STEP_CASE_2
};
public:
RimDerivedEnsembleCaseCollection();
~RimDerivedEnsembleCaseCollection() override;
@@ -73,7 +81,10 @@ private:
RimDerivedSummaryCase* firstCaseNotInUse();
std::vector<RimDerivedSummaryCase*> allDerivedCases( bool activeOnly ) const;
void updateAutoName();
RimSummaryCase* findCaseByParametersHash( const std::vector<RimSummaryCase*>& cases, size_t hash ) const;
RimSummaryCase* findCaseByRealizationNumber( const std::vector<RimSummaryCase*>& cases, int realizationNumber ) const;
std::vector<RimDerivedEnsembleCaseCollection*> findReferringEnsembles() const;
private:
@@ -85,4 +96,8 @@ private:
caf::PdmField<caf::AppEnum<DerivedSummaryOperator>> m_operator;
caf::PdmField<bool> m_swapEnsemblesButton;
caf::PdmField<QString> m_caseCount;
caf::PdmField<bool> m_matchOnParameters;
caf::PdmField<caf::AppEnum<FixedTimeStepMode>> m_useFixedTimeStep;
caf::PdmField<int> m_fixedTimeStepIndex;
};

View File

@@ -27,6 +27,12 @@
#include "RimProject.h"
#include "RimSummaryPlot.h"
#include "cafPdmUiTreeSelectionEditor.h"
#include <QDateTime>
#include <algorithm>
namespace caf
{
template <>
@@ -36,6 +42,15 @@ void caf::AppEnum<DerivedSummaryOperator>::setUp()
addItem( DerivedSummaryOperator::DERIVED_OPERATOR_ADD, "Add", "+" );
setDefault( DerivedSummaryOperator::DERIVED_OPERATOR_SUB );
}
template <>
void caf::AppEnum<RimDerivedSummaryCase::FixedTimeStepMode>::setUp()
{
addItem( RimDerivedSummaryCase::FixedTimeStepMode::FIXED_TIME_STEP_NONE, "FIXED_TIME_STEP_NONE", "None" );
addItem( RimDerivedSummaryCase::FixedTimeStepMode::FIXED_TIME_STEP_CASE_1, "FIXED_TIME_STEP_CASE_1", "Summary Case 1" );
addItem( RimDerivedSummaryCase::FixedTimeStepMode::FIXED_TIME_STEP_CASE_2, "FIXED_TIME_STEP_CASE_2", "Summary Case 2" );
setDefault( RimDerivedSummaryCase::FixedTimeStepMode::FIXED_TIME_STEP_NONE );
}
} // namespace caf
CAF_PDM_SOURCE_INIT( RimDerivedSummaryCase, "RimDerivedEnsembleCase" );
@@ -48,10 +63,17 @@ RimDerivedSummaryCase::RimDerivedSummaryCase()
, m_summaryCase2( nullptr )
{
CAF_PDM_InitObject( "Summary Case", ":/SummaryCase16x16.png", "", "" );
CAF_PDM_InitFieldNoDefault( &m_summaryCase1, "SummaryCase1", "SummaryCase1", "", "", "" );
CAF_PDM_InitFieldNoDefault( &m_summaryCase2, "SummaryCase2", "SummaryCase2", "", "", "" );
CAF_PDM_InitFieldNoDefault( &m_summaryCase1, "SummaryCase1", "Summary Case 1", "", "", "" );
CAF_PDM_InitFieldNoDefault( &m_operator, "Operator", "Operator", "", "", "" );
CAF_PDM_InitFieldNoDefault( &m_summaryCase2, "SummaryCase2", "Summary Case 2", "", "", "" );
CAF_PDM_InitFieldNoDefault( &m_useFixedTimeStep, "UseFixedTimeStep", "Use Fixed Time Step", "", "", "" );
CAF_PDM_InitField( &m_fixedTimeStepIndex, "FixedTimeStepIndex", 0, "Time Step", "", "", "" );
m_fixedTimeStepIndex.uiCapability()->setUiEditorTypeName( caf::PdmUiTreeSelectionEditor::uiEditorTypeName() );
m_fixedTimeStepIndex.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::HIDDEN );
m_inUse = false;
}
@@ -141,8 +163,20 @@ void RimDerivedSummaryCase::calculate( const RifEclipseSummaryAddress& address )
RifSummaryReaderInterface* reader1 = m_summaryCase1 ? m_summaryCase1->summaryReader() : nullptr;
RifSummaryReaderInterface* reader2 = m_summaryCase2 ? m_summaryCase2->summaryReader() : nullptr;
auto itAndIsInsertedPair =
m_dataCache.insert( std::make_pair( address, calculateDerivedValues( reader1, reader2, m_operator(), address ) ) );
int fixedTimeStepCase1 = -1;
int fixedTimeStepCase2 = -1;
if ( m_useFixedTimeStep() == FixedTimeStepMode::FIXED_TIME_STEP_CASE_1 )
{
fixedTimeStepCase1 = m_fixedTimeStepIndex;
}
else if ( m_useFixedTimeStep() == FixedTimeStepMode::FIXED_TIME_STEP_CASE_2 )
{
fixedTimeStepCase2 = m_fixedTimeStepIndex;
}
auto itAndIsInsertedPair = m_dataCache.insert(
std::make_pair( address,
calculateDerivedValues( reader1, fixedTimeStepCase1, reader2, fixedTimeStepCase2, m_operator(), address ) ) );
// Check if we got any data. If not, erase the map entry to comply with previous behavior
@@ -157,7 +191,9 @@ void RimDerivedSummaryCase::calculate( const RifEclipseSummaryAddress& address )
//--------------------------------------------------------------------------------------------------
std::pair<std::vector<time_t>, std::vector<double>>
RimDerivedSummaryCase::calculateDerivedValues( RifSummaryReaderInterface* reader1,
int fixedTimeStepCase1,
RifSummaryReaderInterface* reader2,
int fixedTimeStepCase2,
DerivedSummaryOperator m_operator,
const RifEclipseSummaryAddress& address )
{
@@ -212,15 +248,20 @@ std::pair<std::vector<time_t>, std::vector<double>>
std::vector<double> calculatedValues;
calculatedValues.reserve( sampleCount );
int clampedIndexCase1 = std::min( fixedTimeStepCase1, static_cast<int>( allValues1.size() ) );
int clampedIndexCase2 = std::min( fixedTimeStepCase2, static_cast<int>( allValues2.size() ) );
for ( size_t i = 0; i < sampleCount; i++ )
{
double valueCase1 = clampedIndexCase1 >= 0 ? allValues1[clampedIndexCase1] : allValues1[i];
double valueCase2 = clampedIndexCase2 >= 0 ? allValues2[clampedIndexCase2] : allValues2[i];
if ( m_operator == DerivedSummaryOperator::DERIVED_OPERATOR_SUB )
{
calculatedValues.push_back( allValues1[i] - allValues2[i] );
calculatedValues.push_back( valueCase1 - valueCase2 );
}
else if ( m_operator == DerivedSummaryOperator::DERIVED_OPERATOR_ADD )
{
calculatedValues.push_back( allValues1[i] + allValues2[i] );
calculatedValues.push_back( valueCase1 + valueCase2 );
}
}
@@ -232,17 +273,6 @@ std::pair<std::vector<time_t>, std::vector<double>>
//--------------------------------------------------------------------------------------------------
QString RimDerivedSummaryCase::caseName() const
{
if ( m_summaryCase1 && m_summaryCase2 )
{
auto case1Name = m_summaryCase1->displayCaseName();
auto case2Name = m_summaryCase2->displayCaseName();
if ( case1Name == case2Name )
return case1Name;
else
return QString( "%1/%2" ).arg( case1Name ).arg( case2Name );
}
return m_shortName;
}
@@ -299,6 +329,25 @@ void RimDerivedSummaryCase::setOperator( DerivedSummaryOperator oper )
m_operator = oper;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimDerivedSummaryCase::setFixedTimeSteps( int fixedTimeStepCase1, int fixedTimeStepCase2 )
{
m_useFixedTimeStep = FixedTimeStepMode::FIXED_TIME_STEP_NONE;
if ( fixedTimeStepCase1 >= 0 )
{
m_useFixedTimeStep = FixedTimeStepMode::FIXED_TIME_STEP_CASE_1;
m_fixedTimeStepIndex = fixedTimeStepCase1;
}
else if ( fixedTimeStepCase2 >= 0 )
{
m_useFixedTimeStep = FixedTimeStepMode::FIXED_TIME_STEP_CASE_2;
m_fixedTimeStepIndex = fixedTimeStepCase2;
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -307,6 +356,67 @@ void RimDerivedSummaryCase::clearData( const RifEclipseSummaryAddress& address )
m_dataCache.erase( address );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimDerivedSummaryCase::updateDisplayNameFromCases()
{
QString timeStepString;
{
RimSummaryCase* sourceEnsemble = nullptr;
if ( m_useFixedTimeStep() == FixedTimeStepMode::FIXED_TIME_STEP_CASE_1 )
{
sourceEnsemble = m_summaryCase1;
}
else if ( m_useFixedTimeStep() == FixedTimeStepMode::FIXED_TIME_STEP_CASE_2 )
{
sourceEnsemble = m_summaryCase2;
}
if ( sourceEnsemble )
{
auto summaryReader = sourceEnsemble->summaryReader();
if ( summaryReader )
{
const std::vector<time_t>& timeSteps = summaryReader->timeSteps( RifEclipseSummaryAddress() );
if ( m_fixedTimeStepIndex >= 0 && m_fixedTimeStepIndex < timeSteps.size() )
{
time_t selectedTime = timeSteps[m_fixedTimeStepIndex];
QDateTime dt = RiaQDateTimeTools::fromTime_t( selectedTime );
QString formatString = RiaQDateTimeTools::createTimeFormatStringFromDates( {dt} );
timeStepString = RiaQDateTimeTools::toStringUsingApplicationLocale( dt, formatString );
}
}
}
}
QString case1Name = "None";
QString case2Name = "None";
if ( m_summaryCase1 )
{
case1Name = m_summaryCase1->displayCaseName();
if ( m_useFixedTimeStep() == FixedTimeStepMode::FIXED_TIME_STEP_CASE_1 ) case1Name += "@" + timeStepString;
}
if ( m_summaryCase2 )
{
case2Name = m_summaryCase2->displayCaseName();
if ( m_useFixedTimeStep() == FixedTimeStepMode::FIXED_TIME_STEP_CASE_2 ) case2Name += "@" + timeStepString;
}
QString operatorText;
if ( m_operator() == DerivedSummaryOperator::DERIVED_OPERATOR_SUB )
operatorText = "Delta";
else if ( m_operator() == DerivedSummaryOperator::DERIVED_OPERATOR_ADD )
operatorText = "Sum";
QString name = operatorText + QString( "(%1 , %2)" ).arg( case1Name, case2Name );
m_shortName = name;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -315,11 +425,16 @@ void RimDerivedSummaryCase::defineUiOrdering( QString uiConfigName, caf::PdmUiOr
// Base class
uiOrdering.add( &m_shortName );
// This class
uiOrdering.add( &m_summaryCase1 );
uiOrdering.add( &m_operator );
uiOrdering.add( &m_summaryCase2 );
uiOrdering.add( &m_useFixedTimeStep );
if ( m_useFixedTimeStep() != FixedTimeStepMode::FIXED_TIME_STEP_NONE )
{
uiOrdering.add( &m_fixedTimeStepIndex );
}
uiOrdering.skipRemainingFields();
}
@@ -334,6 +449,27 @@ QList<caf::PdmOptionItemInfo>
RimProject* proj = RiaApplication::instance()->project();
auto summaryCases = proj->allSummaryCases();
if ( fieldNeedingOptions == &m_fixedTimeStepIndex )
{
RimSummaryCase* sourceCase = nullptr;
if ( m_useFixedTimeStep() == FixedTimeStepMode::FIXED_TIME_STEP_CASE_1 )
{
sourceCase = m_summaryCase1;
}
else if ( m_useFixedTimeStep() == FixedTimeStepMode::FIXED_TIME_STEP_CASE_2 )
{
sourceCase = m_summaryCase2;
}
if ( sourceCase && sourceCase->summaryReader() )
{
const std::vector<time_t>& timeSteps = sourceCase->summaryReader()->timeSteps( RifEclipseSummaryAddress() );
options = RiaQDateTimeTools::createOptionItems( timeSteps );
}
}
if ( fieldNeedingOptions == &m_summaryCase1 || fieldNeedingOptions == &m_summaryCase2 )
{
for ( auto c : summaryCases )
@@ -359,6 +495,10 @@ void RimDerivedSummaryCase::fieldChangedByUi( const caf::PdmFieldHandle* changed
reloadData = true;
}
else if ( changedField == &m_useFixedTimeStep || changedField == &m_fixedTimeStepIndex )
{
reloadData = true;
}
else if ( changedField == &m_operator )
{
reloadData = true;
@@ -370,6 +510,8 @@ void RimDerivedSummaryCase::fieldChangedByUi( const caf::PdmFieldHandle* changed
if ( reloadData )
{
updateDisplayNameFromCases();
m_dataCache.clear();
std::vector<caf::PdmObjectHandle*> referringObjects;
@@ -393,3 +535,21 @@ void RimDerivedSummaryCase::fieldChangedByUi( const caf::PdmFieldHandle* changed
}
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimDerivedSummaryCase::defineEditorAttribute( const caf::PdmFieldHandle* field,
QString uiConfigName,
caf::PdmUiEditorAttribute* attribute )
{
if ( &m_fixedTimeStepIndex == field )
{
auto a = dynamic_cast<caf::PdmUiTreeSelectionEditorAttribute*>( attribute );
if ( a )
{
a->singleSelectionMode = true;
a->showTextFilter = true;
}
}
}

View File

@@ -45,6 +45,14 @@ class RimDerivedSummaryCase : public RimSummaryCase
{
CAF_PDM_HEADER_INIT;
public:
enum class FixedTimeStepMode
{
FIXED_TIME_STEP_NONE,
FIXED_TIME_STEP_CASE_1,
FIXED_TIME_STEP_CASE_2
};
public:
RimDerivedSummaryCase();
~RimDerivedSummaryCase() override;
@@ -53,6 +61,7 @@ public:
bool isInUse() const;
void setSummaryCases( RimSummaryCase* sumCase1, RimSummaryCase* sumCase2 );
void setOperator( DerivedSummaryOperator oper );
void setFixedTimeSteps( int fixedTimeStepCase1, int fixedTimeStepCase2 );
bool needsCalculation( const RifEclipseSummaryAddress& address ) const;
const std::vector<time_t>& timeSteps( const RifEclipseSummaryAddress& address ) const;
@@ -62,7 +71,9 @@ public:
static std::pair<std::vector<time_t>, std::vector<double>>
calculateDerivedValues( RifSummaryReaderInterface* reader1,
int fixedTimeStepCase1,
RifSummaryReaderInterface* reader2,
int fixedTimeStepCase2,
DerivedSummaryOperator m_operator,
const RifEclipseSummaryAddress& address );
@@ -70,6 +81,8 @@ public:
RifSummaryReaderInterface* summaryReader() override;
void updateFilePathsFromProjectPath( const QString& newProjectPath, const QString& oldProjectPath ) override;
void updateDisplayNameFromCases();
protected:
QString caseName() const override;
@@ -79,14 +92,21 @@ private:
bool* useOptionsOnly ) override;
void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override;
void defineEditorAttribute( const caf::PdmFieldHandle* field,
QString uiConfigName,
caf::PdmUiEditorAttribute* attribute ) override;
void clearData( const RifEclipseSummaryAddress& address );
private:
caf::PdmPtrField<RimSummaryCase*> m_summaryCase1;
caf::PdmPtrField<RimSummaryCase*> m_summaryCase2;
caf::PdmPtrField<RimSummaryCase*> m_summaryCase1;
caf::PdmPtrField<RimSummaryCase*> m_summaryCase2;
caf::PdmField<caf::AppEnum<DerivedSummaryOperator>> m_operator;
caf::PdmField<caf::AppEnum<FixedTimeStepMode>> m_useFixedTimeStep;
caf::PdmField<int> m_fixedTimeStepIndex;
bool m_inUse;
std::unique_ptr<RifDerivedEnsembleReader> m_reader;

View File

@@ -27,6 +27,9 @@
#include "RimTools.h"
#include "cafPdmFieldIOScriptability.h"
#include "cafPdmObjectScriptability.h"
#include <QDir>
#include <QFileInfo>
@@ -42,8 +45,8 @@ CAF_PDM_SOURCE_INIT( RimFileSummaryCase, "FileSummaryCase" );
//--------------------------------------------------------------------------------------------------
RimFileSummaryCase::RimFileSummaryCase()
{
CAF_PDM_InitScriptableObject( "File Summary Case ", "", "", "A Summary Case based on SMSPEC files" );
CAF_PDM_InitField( &m_includeRestartFiles, "IncludeRestartFiles", false, "Include Restart Files", "", "", "" );
CAF_PDM_InitScriptableObject( "File Summary Case ", ":/SummaryCases16x16.png", "", "A Summary Case based on SMSPEC files" );
CAF_PDM_InitScriptableFieldWithIO( &m_includeRestartFiles, "IncludeRestartFiles", false, "Include Restart Files", "", "", "" );
m_includeRestartFiles.uiCapability()->setUiHidden( true );
}

View File

@@ -25,6 +25,8 @@
#include "RimFileSummaryCase.h"
#include "RimProject.h"
#include "cafPdmObjectScriptability.h"
#include <QFileInfo>
//==================================================================================================
@@ -40,7 +42,10 @@ CAF_PDM_SOURCE_INIT( RimGridSummaryCase, "GridSummaryCase" );
//--------------------------------------------------------------------------------------------------
RimGridSummaryCase::RimGridSummaryCase()
{
CAF_PDM_InitScriptableObject( "Grid Summary Case ", "", "", "A Summary Case based on extracting grid data." );
CAF_PDM_InitScriptableObject( "Grid Summary Case",
":/SummaryCases16x16.png",
"",
"A Summary Case based on extracting grid data." );
CAF_PDM_InitFieldNoDefault( &m_eclipseCase, "Associated3DCase", "Eclipse Case", "", "", "" );
m_eclipseCase.uiCapability()->setUiHidden( true );

View File

@@ -30,9 +30,12 @@
#include "RimSummaryCaseMainCollection.h"
#include "RimSummaryPlotCollection.h"
#include "RimObservedSummaryData.h"
#include "cafPdmFieldIOScriptability.h"
#include "cvfAssert.h"
#include "RimObservedSummaryData.h"
#include <QFileInfo>
CAF_PDM_ABSTRACT_SOURCE_INIT( RimSummaryCase, "SummaryCase" );
@@ -46,10 +49,15 @@ RimSummaryCase::RimSummaryCase()
{
CAF_PDM_InitScriptableObject( "Summary Case", ":/SummaryCase16x16.png", "", "The Base Class for all Summary Cases" );
RICF_InitField( &m_shortName, "ShortName", QString( "Display Name" ), DEFAULT_DISPLAY_NAME, "", "", "" );
RICF_InitField( &m_useAutoShortName, "AutoShortyName", false, "Use Auto Display Name", "", "", "" );
CAF_PDM_InitScriptableFieldWithIO( &m_shortName, "ShortName", QString( "Display Name" ), DEFAULT_DISPLAY_NAME, "", "", "" );
CAF_PDM_InitScriptableFieldWithIO( &m_useAutoShortName, "AutoShortyName", false, "Use Auto Display Name", "", "", "" );
RICF_InitFieldNoDefault( &m_summaryHeaderFilename, "SummaryHeaderFilename", "Summary Header File", "", "", "" );
CAF_PDM_InitScriptableFieldWithIONoDefault( &m_summaryHeaderFilename,
"SummaryHeaderFilename",
"Summary Header File",
"",
"",
"" );
m_summaryHeaderFilename.uiCapability()->setUiReadOnly( true );
m_isObservedData = false;

View File

@@ -703,7 +703,8 @@ void RimSummaryCaseCollection::updateReferringCurveSets()
for ( auto curveSet : referringObjects )
{
if ( curveSet ) curveSet->updateAllCurves();
bool updateParentPlot = true;
if ( curveSet ) curveSet->loadDataAndUpdate( updateParentPlot );
}
}

View File

@@ -41,6 +41,7 @@ CAF_PDM_SOURCE_INIT( RimSummaryCaseMainCollection, "SummaryCaseCollection" );
//--------------------------------------------------------------------------------------------------
void addCaseRealizationParametersIfFound( RimSummaryCase& sumCase, const QString modelFolderOrFile )
{
std::shared_ptr<RigCaseRealizationParameters> parameters;
QString parametersFile = RifCaseRealizationParametersFileLocator::locate( modelFolderOrFile );
if ( !parametersFile.isEmpty() )
{
@@ -51,13 +52,23 @@ void addCaseRealizationParametersIfFound( RimSummaryCase& sumCase, const QString
try
{
reader->parse();
sumCase.setCaseRealizationParameters( reader->parameters() );
parameters = reader->parameters();
}
catch ( ... )
{
}
}
}
else
{
parameters = std::shared_ptr<RigCaseRealizationParameters>( new RigCaseRealizationParameters() );
}
int realizationNumber = RifCaseRealizationParametersFileLocator::realizationNumber( modelFolderOrFile );
parameters->setRealizationNumber( realizationNumber );
parameters->addParameter( "RI:REALIZATION_NUM", realizationNumber );
sumCase.setCaseRealizationParameters( parameters );
}
//--------------------------------------------------------------------------------------------------

View File

@@ -54,6 +54,7 @@
#include "cvfColor3.h"
#include "cafPdmFieldIOScriptability.h"
#include "cafPdmUiCheckBoxEditor.h"
#include "cafPdmUiTreeOrdering.h"
#include "cafSelectionManager.h"
@@ -145,14 +146,20 @@ RimSummaryPlot::RimSummaryPlot()
{
CAF_PDM_InitScriptableObject( "Summary Plot", ":/SummaryPlotLight16x16.png", "", "A Summary Plot" );
RICF_InitField( &m_showPlotTitle, "ShowPlotTitle", true, "Plot Title", "", "", "" );
CAF_PDM_InitScriptableFieldWithIO( &m_showPlotTitle, "ShowPlotTitle", true, "Plot Title", "", "", "" );
m_showPlotTitle.xmlCapability()->setIOWritable( false );
RICF_InitField( &m_useAutoPlotTitle, "IsUsingAutoName", true, "Auto Title", "", "", "" );
CAF_PDM_InitScriptableFieldWithIO( &m_useAutoPlotTitle, "IsUsingAutoName", true, "Auto Title", "", "", "" );
RICF_InitField( &m_description, "PlotDescription", QString( "Summary Plot" ), "Name", "", "", "" );
CAF_PDM_InitScriptableFieldWithIO( &m_description, "PlotDescription", QString( "Summary Plot" ), "Name", "", "", "" );
RICF_InitField( &m_normalizeCurveYValues, "normalizeCurveYValues", false, "Normalize all curves", "", "", "" );
CAF_PDM_InitScriptableFieldWithIO( &m_normalizeCurveYValues,
"normalizeCurveYValues",
false,
"Normalize all curves",
"",
"",
"" );
CAF_PDM_InitFieldNoDefault( &m_summaryCurveCollection, "SummaryCurveCollection", "", "", "", "" );
m_summaryCurveCollection.uiCapability()->setUiTreeHidden( true );
@@ -1843,6 +1850,8 @@ void RimSummaryPlot::detachAllPlotItems()
{
curve->detachQwtCurve();
}
m_plotInfoLabel->detach();
}
//--------------------------------------------------------------------------------------------------
@@ -2255,7 +2264,7 @@ void appendToExportDataForCase( QString& out, const std::vector<time_t>& timeSte
QString valueText;
if ( j < curveData[k].values.size() )
{
valueText = QString::number( curveData[k].values[j], 'g', 6 );
valueText = QString::number( curveData[k].values[j], 'g', RimSummaryPlot::precision() );
}
out += "\t" + valueText.rightJustified( 13 );
}
@@ -2372,7 +2381,8 @@ void appendToExportData( QString& out, const std::vector<CurvesData>& curvesData
QString valueText;
if ( timeStepExists )
{
valueText = QString::number( data.allCurveData[i][j].values[currIndex], 'g', 6 );
valueText =
QString::number( data.allCurveData[i][j].values[currIndex], 'g', RimSummaryPlot::precision() );
}
else
{

View File

@@ -29,6 +29,7 @@
#include "qwt_plot_textlabel.h"
#include "cafPdmChildArrayField.h"
#include "cafPdmPtrArrayField.h"
#include "cafPdmPtrField.h"
#include <QPointer>
@@ -168,6 +169,12 @@ public:
void onAxisSelected( int axis, bool toggle ) override;
static constexpr int precision()
{
// Set precision to 8, as this is the precision used in summary data in libEcl
return 8;
}
public:
// RimViewWindow overrides
void deleteViewWidget() override;

View File

@@ -22,6 +22,9 @@
#include "RimProject.h"
#include "RimSummaryPlot.h"
#include "cafPdmFieldScriptability.h"
#include "cafPdmObjectScriptability.h"
CAF_PDM_SOURCE_INIT( RimSummaryPlotCollection, "SummaryPlotCollection" );
//--------------------------------------------------------------------------------------------------
@@ -29,7 +32,7 @@ CAF_PDM_SOURCE_INIT( RimSummaryPlotCollection, "SummaryPlotCollection" );
//--------------------------------------------------------------------------------------------------
RimSummaryPlotCollection::RimSummaryPlotCollection()
{
CAF_PDM_InitObject( "Summary Plots", ":/SummaryPlotsLight16x16.png", "", "" );
CAF_PDM_InitScriptableObject( "Summary Plots", ":/SummaryPlotsLight16x16.png", "", "" );
CAF_PDM_InitFieldNoDefault( &summaryPlots, "SummaryPlots", "Summary Plots", "", "", "" );
summaryPlots.uiCapability()->setUiHidden( true );

View File

@@ -20,6 +20,8 @@
#include "cafPdmChildArrayField.h"
#include "cafPdmObject.h"
#include "cafPdmObjectMethod.h"
#include "cafPdmPtrArrayField.h"
class RimSummaryPlot;

View File

@@ -374,6 +374,7 @@ void RimSummaryPlotFilterTextCurveSetEditor::fieldChangedByUi( const caf::PdmFie
parentPlot->applyDefaultCurveAppearances();
parentPlot->loadDataAndUpdate();
parentPlot->zoomAll();
m_isFieldRecentlyChangedFromGui = true;