mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
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:
@@ -91,7 +91,9 @@ bool RicUserDefinedCalculatorUi::parseExpression() const
|
||||
notifyCalculatedNameChanged( m_currentCalculation()->id(), currentCurveName );
|
||||
}
|
||||
|
||||
m_currentCalculation()->updateDependentObjects();
|
||||
// Always rebuild the case meta data after parsing the expression. A change in name or change in result type will require rebuild of
|
||||
// case metadata. The rebuild is considered lightweight and should not be a performance issue.
|
||||
calculationCollection()->rebuildCaseMetaData();
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -220,17 +222,7 @@ bool RicUserDefinedCalculatorUi::calculate() const
|
||||
{
|
||||
if ( m_currentCalculation() )
|
||||
{
|
||||
QString previousCurveName = m_currentCalculation->description();
|
||||
if ( !m_currentCalculation()->parseExpression() )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
QString currentCurveName = m_currentCalculation->description();
|
||||
if ( previousCurveName != currentCurveName )
|
||||
{
|
||||
notifyCalculatedNameChanged( m_currentCalculation()->id(), currentCurveName );
|
||||
}
|
||||
if ( !parseExpression() ) return false;
|
||||
|
||||
if ( !m_currentCalculation()->preCalculate() )
|
||||
{
|
||||
|
||||
@@ -56,7 +56,7 @@ public:
|
||||
|
||||
private:
|
||||
int indexFromAddress( const RifEclipseSummaryAddress& resultAddress ) const;
|
||||
void buildMetaData();
|
||||
void buildMetaData() override;
|
||||
|
||||
private:
|
||||
ecl_sum_type* m_ecl_sum;
|
||||
|
||||
@@ -36,7 +36,7 @@ void RifMultipleSummaryReaders::addReader( RifSummaryReaderInterface* reader )
|
||||
|
||||
m_readers.push_back( reader );
|
||||
|
||||
rebuildMetaData();
|
||||
buildMetaData();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@@ -45,7 +45,7 @@ void RifMultipleSummaryReaders::addReader( RifSummaryReaderInterface* reader )
|
||||
void RifMultipleSummaryReaders::removeReader( RifSummaryReaderInterface* reader )
|
||||
{
|
||||
m_readers.erase( reader );
|
||||
rebuildMetaData();
|
||||
buildMetaData();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@@ -100,7 +100,7 @@ RiaDefines::EclipseUnitSystem RifMultipleSummaryReaders::unitSystem() const
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RifMultipleSummaryReaders::rebuildMetaData()
|
||||
void RifMultipleSummaryReaders::buildMetaData()
|
||||
{
|
||||
m_allErrorAddresses.clear();
|
||||
m_allResultAddresses.clear();
|
||||
|
||||
@@ -40,7 +40,7 @@ public:
|
||||
std::string unitName( const RifEclipseSummaryAddress& resultAddress ) const override;
|
||||
RiaDefines::EclipseUnitSystem unitSystem() const override;
|
||||
|
||||
void rebuildMetaData();
|
||||
void buildMetaData() override;
|
||||
|
||||
private:
|
||||
cvf::Collection<RifSummaryReaderInterface> m_readers;
|
||||
|
||||
@@ -78,7 +78,7 @@ public:
|
||||
RiaDefines::EclipseUnitSystem unitSystem() const override;
|
||||
|
||||
private:
|
||||
void buildMetaData();
|
||||
void buildMetaData() override;
|
||||
bool openFileReader( const QString& fileName, bool includeRestartFiles, RiaThreadSafeLogger* threadSafeLogger );
|
||||
|
||||
static void increaseEsmryFileCount();
|
||||
|
||||
@@ -62,7 +62,7 @@ public:
|
||||
RiaDefines::EclipseUnitSystem unitSystem() const override;
|
||||
|
||||
private:
|
||||
void buildMetaData();
|
||||
void buildMetaData() override;
|
||||
bool openESmryFile( const QString& headerFileName, bool includeRestartFiles, RiaThreadSafeLogger* threadSafeLogger );
|
||||
|
||||
private:
|
||||
|
||||
@@ -54,10 +54,9 @@ public:
|
||||
std::pair<bool, std::vector<double>> values( const RifEclipseSummaryAddress& resultAddress ) const override;
|
||||
std::string unitName( const RifEclipseSummaryAddress& resultAddress ) const override;
|
||||
RiaDefines::EclipseUnitSystem unitSystem() const override;
|
||||
void buildMetaData() override;
|
||||
|
||||
private:
|
||||
void buildMetaData();
|
||||
|
||||
RifSummaryReaderInterface* currentSummaryReader() const;
|
||||
|
||||
private:
|
||||
|
||||
@@ -49,6 +49,13 @@ RifEclipseSummaryAddress RifSummaryReaderInterface::errorAddress( const RifEclip
|
||||
return m_allErrorAddresses.find( errAddr ) != m_allErrorAddresses.end() ? errAddr : RifEclipseSummaryAddress();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RifSummaryReaderInterface::buildMetaData()
|
||||
{
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
||||
@@ -51,6 +51,8 @@ public:
|
||||
virtual std::string unitName( const RifEclipseSummaryAddress& resultAddress ) const = 0;
|
||||
virtual RiaDefines::EclipseUnitSystem unitSystem() const = 0;
|
||||
|
||||
virtual void buildMetaData();
|
||||
|
||||
protected:
|
||||
std::set<RifEclipseSummaryAddress> m_allResultAddresses; // Result and error addresses
|
||||
std::set<RifEclipseSummaryAddress> m_allErrorAddresses; // Error addresses
|
||||
|
||||
@@ -27,26 +27,17 @@
|
||||
|
||||
#include "RifSummaryReaderInterface.h"
|
||||
#include "RimDataSourceSteppingTools.h"
|
||||
#include "RimObservedDataCollection.h"
|
||||
#include "RimObservedSummaryData.h"
|
||||
#include "RimProject.h"
|
||||
#include "RimSummaryAddress.h"
|
||||
#include "RimSummaryCalculationCollection.h"
|
||||
#include "RimSummaryCalculationVariable.h"
|
||||
#include "RimSummaryCase.h"
|
||||
#include "RimSummaryCaseCollection.h"
|
||||
#include "RimSummaryCaseMainCollection.h"
|
||||
#include "RimSummaryCurve.h"
|
||||
#include "RimSummaryMultiPlot.h"
|
||||
#include "RimSummaryMultiPlotCollection.h"
|
||||
#include "RimSummaryPlot.h"
|
||||
|
||||
#include "RiuExpressionContextMenuManager.h"
|
||||
|
||||
#include "cafPdmUiCheckBoxEditor.h"
|
||||
#include "cafPdmUiLineEditor.h"
|
||||
#include "cafPdmUiTableViewEditor.h"
|
||||
#include "cafPdmUiTextEditor.h"
|
||||
|
||||
#include "expressionparser/ExpressionParser.h"
|
||||
|
||||
@@ -402,35 +393,6 @@ std::optional<std::pair<std::vector<double>, std::vector<time_t>>>
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimSummaryCalculation::updateDependentObjects()
|
||||
{
|
||||
RimSummaryCalculationCollection* calcColl = firstAncestorOrThisOfTypeAsserted<RimSummaryCalculationCollection>();
|
||||
calcColl->rebuildCaseMetaData();
|
||||
|
||||
// Refresh data sources tree.
|
||||
// TODO: refresh too much: would be enough to only refresh calculated resutls.
|
||||
RimSummaryCaseMainCollection* summaryCaseCollection = RiaSummaryTools::summaryCaseMainCollection();
|
||||
auto summaryCases = summaryCaseCollection->allSummaryCases();
|
||||
for ( RimSummaryCase* summaryCase : summaryCases )
|
||||
{
|
||||
summaryCase->createSummaryReaderInterface();
|
||||
summaryCase->createRftReaderInterface();
|
||||
summaryCase->refreshMetaData();
|
||||
}
|
||||
|
||||
RimObservedDataCollection* observedDataCollection = RiaSummaryTools::observedDataCollection();
|
||||
auto observedData = observedDataCollection->allObservedSummaryData();
|
||||
for ( auto obs : observedData )
|
||||
{
|
||||
obs->createSummaryReaderInterface();
|
||||
obs->createRftReaderInterface();
|
||||
obs->refreshMetaData();
|
||||
}
|
||||
|
||||
auto summaryCaseCollections = summaryCaseCollection->summaryCaseCollections();
|
||||
for ( RimSummaryCaseCollection* summaryCaseCollection : summaryCaseCollections )
|
||||
{
|
||||
summaryCaseCollection->refreshMetaData();
|
||||
}
|
||||
|
||||
RimSummaryMultiPlotCollection* summaryPlotCollection = RiaSummaryTools::summaryMultiPlotCollection();
|
||||
for ( auto multiPlot : summaryPlotCollection->multiPlots() )
|
||||
{
|
||||
@@ -438,7 +400,7 @@ void RimSummaryCalculation::updateDependentObjects()
|
||||
{
|
||||
bool plotContainsCalculatedCurves = false;
|
||||
|
||||
for ( RimSummaryCurve* sumCurve : sumPlot->summaryCurves() )
|
||||
for ( RimSummaryCurve* sumCurve : sumPlot->summaryAndEnsembleCurves() )
|
||||
{
|
||||
if ( sumCurve->summaryAddressY().isCalculated() )
|
||||
{
|
||||
@@ -461,6 +423,7 @@ void RimSummaryCalculation::updateDependentObjects()
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimSummaryCalculation::removeDependentObjects()
|
||||
{
|
||||
updateDependentObjects();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
||||
@@ -18,7 +18,15 @@
|
||||
|
||||
#include "RimSummaryCalculationCollection.h"
|
||||
|
||||
#include "RiaSummaryTools.h"
|
||||
|
||||
#include "RifSummaryReaderInterface.h"
|
||||
|
||||
#include "RimObservedSummaryData.h"
|
||||
#include "RimSummaryCalculation.h"
|
||||
#include "RimSummaryCase.h"
|
||||
#include "RimSummaryCaseCollection.h"
|
||||
#include "RimSummaryCaseMainCollection.h"
|
||||
|
||||
CAF_PDM_SOURCE_INIT( RimSummaryCalculationCollection, "RimSummaryCalculationCollection" );
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@@ -37,12 +45,53 @@ RimSummaryCalculation* RimSummaryCalculationCollection::createCalculation() cons
|
||||
return new RimSummaryCalculation;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimSummaryCalculationCollection::updateDataDependingOnCalculations()
|
||||
{
|
||||
// Refresh data sources tree
|
||||
// Refresh meta data for all summary cases and rebuild AddressNodes in the summary tree
|
||||
RimSummaryCaseMainCollection* summaryCaseCollection = RiaSummaryTools::summaryCaseMainCollection();
|
||||
auto summaryCases = summaryCaseCollection->allSummaryCases();
|
||||
for ( RimSummaryCase* summaryCase : summaryCases )
|
||||
{
|
||||
if ( !summaryCase ) continue;
|
||||
|
||||
if ( auto reader = summaryCase->summaryReader() )
|
||||
{
|
||||
reader->buildMetaData();
|
||||
summaryCase->onCalculationUpdated();
|
||||
}
|
||||
}
|
||||
|
||||
RimObservedDataCollection* observedDataCollection = RiaSummaryTools::observedDataCollection();
|
||||
auto observedData = observedDataCollection->allObservedSummaryData();
|
||||
for ( auto obs : observedData )
|
||||
{
|
||||
if ( !obs ) continue;
|
||||
|
||||
if ( auto reader = obs->summaryReader() )
|
||||
{
|
||||
reader->buildMetaData();
|
||||
obs->onCalculationUpdated();
|
||||
}
|
||||
}
|
||||
|
||||
auto summaryCaseCollections = summaryCaseCollection->summaryCaseCollections();
|
||||
for ( RimSummaryCaseCollection* summaryCaseCollection : summaryCaseCollections )
|
||||
{
|
||||
summaryCaseCollection->onCalculationUpdated();
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimSummaryCalculationCollection::rebuildCaseMetaData()
|
||||
{
|
||||
ensureValidCalculationIds();
|
||||
updateDataDependingOnCalculations();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
||||
@@ -42,5 +42,6 @@ public:
|
||||
RimSummaryCalculation* createCalculation() const override;
|
||||
|
||||
private:
|
||||
void updateDataDependingOnCalculations();
|
||||
void initAfterRead() override;
|
||||
};
|
||||
|
||||
@@ -103,9 +103,11 @@ RimUserDefinedCalculation* RimUserDefinedCalculationCollection::addCalculationCo
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimUserDefinedCalculationCollection::deleteCalculation( RimUserDefinedCalculation* calculation )
|
||||
{
|
||||
calculation->removeDependentObjects();
|
||||
m_calculations.removeChild( calculation );
|
||||
|
||||
// Call this function after the object is removed from the collection
|
||||
calculation->removeDependentObjects();
|
||||
|
||||
rebuildCaseMetaData();
|
||||
|
||||
delete calculation;
|
||||
|
||||
@@ -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() )
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -66,6 +66,7 @@ public:
|
||||
int caseId() const;
|
||||
|
||||
void refreshMetaData();
|
||||
void onCalculationUpdated();
|
||||
|
||||
virtual void createSummaryReaderInterface() = 0;
|
||||
virtual void createRftReaderInterface() {}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ set(RESINSIGHT_VERSION_TEXT "-dev")
|
||||
# Must be unique and increasing within one combination of major/minor/patch version
|
||||
# The uniqueness of this text is independent of RESINSIGHT_VERSION_TEXT
|
||||
# Format of text must be ".xx"
|
||||
set(RESINSIGHT_DEV_VERSION ".21")
|
||||
set(RESINSIGHT_DEV_VERSION ".22")
|
||||
|
||||
# https://github.com/CRAVA/crava/tree/master/libs/nrlib
|
||||
set(NRLIB_GITHUB_SHA "ba35d4359882f1c6f5e9dc30eb95fe52af50fd6f")
|
||||
|
||||
Reference in New Issue
Block a user