Improve summary calculation performance

* Only reload calculation data
* Make sure performance is good when a calculated object is added or changed
- avoid recreation of summary file readers
- delete all nodes in address tree representing calculated curves
- build address nodes for calculated curves
This commit is contained in:
Magne Sjaastad
2024-02-26 13:55:41 +01:00
committed by GitHub
parent 28d281e1d6
commit 672fbe177b
22 changed files with 143 additions and 81 deletions

View File

@@ -87,11 +87,11 @@ void RifCalculatedSummaryCurveReader::buildMetaData()
for ( RimUserDefinedCalculation* calc : m_calculationCollection->calculations() )
{
RimSummaryCalculation* sumCalc = dynamic_cast<RimSummaryCalculation*>( calc );
auto* sumCalc = dynamic_cast<RimSummaryCalculation*>( calc );
CAF_ASSERT( sumCalc );
const auto& allAddresses = sumCalc->allAddressesForSummaryCase( m_summaryCase );
for ( auto calculationAddress : allAddresses )
for ( const auto& calculationAddress : allAddresses )
{
if ( calculationAddress.address().isValid() )
{

View File

@@ -39,7 +39,7 @@ public:
std::pair<bool, std::vector<double>> values( const RifEclipseSummaryAddress& resultAddress ) const override;
std::string unitName( const RifEclipseSummaryAddress& resultAddress ) const override;
void buildMetaData();
void buildMetaData() override;
RiaDefines::EclipseUnitSystem unitSystem() const override;

View File

@@ -99,7 +99,7 @@ RimSummaryAddressCollection::~RimSummaryAddressCollection()
//--------------------------------------------------------------------------------------------------
bool RimSummaryAddressCollection::hasDataVector( const QString quantityName ) const
{
for ( auto& address : m_adresses )
for ( const auto& address : m_adresses )
{
if ( address->quantityName() == quantityName ) return true;
}
@@ -346,6 +346,32 @@ void RimSummaryAddressCollection::deleteChildren()
m_subfolders.deleteChildren();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryAddressCollection::deleteCalculatedObjects()
{
std::vector<RimSummaryAddress*> toDelete;
for ( const auto& a : m_adresses )
{
if ( a->address().isCalculated() )
{
toDelete.push_back( a );
}
}
for ( auto a : toDelete )
{
m_adresses.removeChild( a );
delete a;
}
for ( auto& folder : m_subfolders )
{
folder->deleteCalculatedObjects();
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------

View File

@@ -66,6 +66,7 @@ public:
void updateFolderStructure( const std::set<RifEclipseSummaryAddress>& addresses, int caseId, int ensembleId = -1 );
void deleteChildren();
void deleteCalculatedObjects();
bool isEmpty() const;
bool isEnsemble() const;

View File

@@ -400,3 +400,20 @@ void RimSummaryCase::refreshMetaData()
buildChildNodes();
updateConnectedEditors();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryCase::onCalculationUpdated()
{
// Delete all calculated address objects
m_dataVectorFolders->deleteCalculatedObjects();
if ( auto reader = summaryReader() )
{
auto addresses = reader->allResultAddresses();
m_dataVectorFolders->updateFolderStructure( addresses, m_caseId );
}
updateConnectedEditors();
}

View File

@@ -66,6 +66,7 @@ public:
int caseId() const;
void refreshMetaData();
void onCalculationUpdated();
virtual void createSummaryReaderInterface() = 0;
virtual void createRftReaderInterface() {}

View File

@@ -22,30 +22,23 @@
#include "RiaFieldHandleTools.h"
#include "RiaLogging.h"
#include "RiaStatisticsTools.h"
#include "RiaStdStringTools.h"
#include "RiaSummaryAddressAnalyzer.h"
#include "RiaWeightedMeanCalculator.h"
#include "RicfCommandObject.h"
#include "RifReaderRftInterface.h"
#include "RifSummaryReaderInterface.h"
#include "RimAnalysisPlotDataEntry.h"
#include "RimDerivedEnsembleCaseCollection.h"
#include "RimEnsembleCurveSet.h"
#include "RimProject.h"
#include "RimSummaryAddressCollection.h"
#include "RimSummaryCalculationCollection.h"
#include "RimSummaryCase.h"
#include "cafPdmFieldScriptingCapability.h"
#include "cafPdmObjectScriptingCapability.h"
#include "cafPdmUiTreeOrdering.h"
#include <QDate>
#include <QFileInfo>
#include <algorithm>
#include <cmath>
CAF_PDM_SOURCE_INIT( RimSummaryCaseCollection, "SummaryCaseSubCollection" );
@@ -284,7 +277,7 @@ void RimSummaryCaseCollection::setAsEnsemble( bool isEnsemble )
calculateEnsembleParametersIntersectionHash();
}
refreshMetaData();
buildMetaData();
}
}
@@ -1155,13 +1148,24 @@ void RimSummaryCaseCollection::buildChildNodes()
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryCaseCollection::refreshMetaData()
void RimSummaryCaseCollection::buildMetaData()
{
clearChildNodes();
buildChildNodes();
updateConnectedEditors();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimSummaryCaseCollection::onCalculationUpdated()
{
m_dataVectorFolders->deleteCalculatedObjects();
m_dataVectorFolders->updateFolderStructure( ensembleSummaryAddresses(), -1, m_ensembleId );
updateConnectedEditors();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------

View File

@@ -19,20 +19,17 @@
#pragma once
#include "RiaDefines.h"
#include "RifEclipseSummaryAddress.h"
#include "RigEnsembleParameter.h"
#include "RimObjectiveFunction.h"
#include "cafPdmChildArrayField.h"
#include "cafPdmChildField.h"
#include "cafPdmField.h"
#include "cafPdmObject.h"
#include "cafPdmProxyValueField.h"
#include "cvfObject.h"
#include <QString>
#include <memory>
@@ -103,7 +100,7 @@ public:
RiaDefines::EclipseUnitSystem unitSystem() const;
void refreshMetaData();
void onCalculationUpdated();
void updateReferringCurveSets();
@@ -127,6 +124,7 @@ private:
void onCaseNameChanged( const SignalEmitter* emitter );
void buildMetaData();
void buildChildNodes();
void clearChildNodes();