Skip to content

Commit

Permalink
Allow user to specify Auto, Accumulated or Rate for a summary curve
Browse files Browse the repository at this point in the history
Default setting is Auto, and use the summary address to derive Accumulated/Rate. User can set curve type explicitly.
  • Loading branch information
magnesj committed Aug 27, 2024
1 parent 8a08a4c commit 44727d6
Show file tree
Hide file tree
Showing 12 changed files with 203 additions and 89 deletions.
9 changes: 9 additions & 0 deletions ApplicationLibCode/Application/RiaSummaryDefines.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,15 @@ void caf::AppEnum<RiaDefines::HorizontalAxisType>::setUp()
addItem( RiaDefines::HorizontalAxisType::SUMMARY_VECTOR, "SUMMARY_VECTOR", "Summary Vector" );
setDefault( RiaDefines::HorizontalAxisType::SUMMARY_VECTOR );
}

template <>
void caf::AppEnum<RiaDefines::AccumulatedOrRateType>::setUp()
{
addItem( RiaDefines::AccumulatedOrRateType::AUTO, "AUTO", "Auto" );
addItem( RiaDefines::AccumulatedOrRateType::ACCUMULATED, "ACCUMULATED", "Accumulated" );
addItem( RiaDefines::AccumulatedOrRateType::RATE, "RATE", "Rate" );
setDefault( RiaDefines::AccumulatedOrRateType::AUTO );
}
} // namespace caf

//--------------------------------------------------------------------------------------------------
Expand Down
7 changes: 7 additions & 0 deletions ApplicationLibCode/Application/RiaSummaryDefines.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,13 @@ enum class HorizontalAxisType
SUMMARY_VECTOR
};

enum class AccumulatedOrRateType
{
AUTO,
ACCUMULATED,
RATE
};

QString summaryField();
QString summaryAquifer();
QString summaryNetwork();
Expand Down
23 changes: 18 additions & 5 deletions ApplicationLibCode/Application/Tools/RiaSummaryTools.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ RimSummaryTableCollection* RiaSummaryTools::parentSummaryTableCollection( caf::P
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RiaSummaryTools::hasAccumulatedData( const RifEclipseSummaryAddress& address )
RifEclipseSummaryAddressDefines::AccumulatedOrRateType RiaSummaryTools::identifyCurveType( const RifEclipseSummaryAddress& address )
{
if ( address.isCalculated() )
{
Expand All @@ -187,15 +187,16 @@ bool RiaSummaryTools::hasAccumulatedData( const RifEclipseSummaryAddress& addres
{
if ( !variableAddress.hasAccumulatedData() )
{
return false;
return RifEclipseSummaryAddressDefines::AccumulatedOrRateType::RATE;
}
}

// All the variables are accumulated
return true;
return RifEclipseSummaryAddressDefines::AccumulatedOrRateType::ACCUMULATED;
}

return address.hasAccumulatedData();
return address.hasAccumulatedData() ? RifEclipseSummaryAddressDefines::AccumulatedOrRateType::ACCUMULATED
: RifEclipseSummaryAddressDefines::AccumulatedOrRateType::RATE;
}

//--------------------------------------------------------------------------------------------------
Expand Down Expand Up @@ -231,11 +232,23 @@ std::pair<std::vector<time_t>, std::vector<double>> RiaSummaryTools::resampledVa
const std::vector<time_t>& timeSteps,
const std::vector<double>& values,
RiaDefines::DateTimePeriod period )
{
return resampledValuesForPeriod( RiaSummaryTools::identifyCurveType( address ), timeSteps, values, period );
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::pair<std::vector<time_t>, std::vector<double>>
RiaSummaryTools::resampledValuesForPeriod( RifEclipseSummaryAddressDefines::AccumulatedOrRateType accumulatedOrRate,
const std::vector<time_t>& timeSteps,
const std::vector<double>& values,
RiaDefines::DateTimePeriod period )
{
RiaTimeHistoryCurveResampler resampler;
resampler.setCurveData( values, timeSteps );

if ( RiaSummaryTools::hasAccumulatedData( address ) )
if ( accumulatedOrRate == AccumulatedOrRateType::ACCUMULATED )
{
resampler.resampleAndComputePeriodEndValues( period );
}
Expand Down
15 changes: 11 additions & 4 deletions ApplicationLibCode/Application/Tools/RiaSummaryTools.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#pragma once

#include "RiaDateTimeDefines.h"
#include "RifEclipseSummaryAddressDefines.h"
#include "RimObservedDataCollection.h"

#include <QString>
Expand Down Expand Up @@ -66,16 +67,22 @@ class RiaSummaryTools
static RimSummaryTable* parentSummaryTable( caf::PdmObject* object );
static RimSummaryTableCollection* parentSummaryTableCollection( caf::PdmObject* object );

static bool hasAccumulatedData( const RifEclipseSummaryAddress& address );
static void getSummaryCasesAndAddressesForCalculation( int id,
std::vector<RimSummaryCase*>& cases,
std::vector<RifEclipseSummaryAddress>& addresses );
static RifEclipseSummaryAddressDefines::AccumulatedOrRateType identifyCurveType( const RifEclipseSummaryAddress& address );
static void getSummaryCasesAndAddressesForCalculation( int id,
std::vector<RimSummaryCase*>& cases,
std::vector<RifEclipseSummaryAddress>& addresses );

static std::pair<std::vector<time_t>, std::vector<double>> resampledValuesForPeriod( const RifEclipseSummaryAddress& address,
const std::vector<time_t>& timeSteps,
const std::vector<double>& values,
RiaDefines::DateTimePeriod period );

static std::pair<std::vector<time_t>, std::vector<double>>
resampledValuesForPeriod( RifEclipseSummaryAddressDefines::AccumulatedOrRateType accumulatedOrRate,
const std::vector<time_t>& timeSteps,
const std::vector<double>& values,
RiaDefines::DateTimePeriod period );

static RimSummaryCase* summaryCaseById( int caseId );
static RimSummaryEnsemble* ensembleById( int ensembleId );

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ void caf::AppEnum<RifEclipseSummaryAddressDefines::StatisticsType>::setUp()
addItem( RifEclipseSummaryAddressDefines::StatisticsType::MEAN, "MEAN", "Mean" );
setDefault( RifEclipseSummaryAddressDefines::StatisticsType::NONE );
}

} // namespace caf

//--------------------------------------------------------------------------------------------------
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,12 @@ enum class StatisticsType
MEAN
};

enum class AccumulatedOrRateType
{
ACCUMULATED,
RATE
};

std::string statisticsNameP10();
std::string statisticsNameP50();
std::string statisticsNameP90();
Expand Down
63 changes: 60 additions & 3 deletions ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurve.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,11 @@ RimSummaryCurve::RimSummaryCurve()

CAF_PDM_InitFieldNoDefault( &m_yValuesResampling, "Resampling", "Resampling" );

CAF_PDM_InitFieldNoDefault( &m_yAccumulatedOrRate, "AccumulatedOrRate", "Accumulated/Rate Curve Values" );
CAF_PDM_InitFieldNoDefault( &m_yAccumulatedOrRateText, "CurveType", "Curve Type" );
m_yAccumulatedOrRateText.registerGetMethod( this, &RimSummaryCurve::accumulatedOrRateText );
m_yAccumulatedOrRateText.uiCapability()->setUiReadOnly( true );

// X Values

CAF_PDM_InitField( &m_xAxisType,
Expand Down Expand Up @@ -419,6 +424,25 @@ void RimSummaryCurve::setOverrideCurveDataY( const std::vector<time_t>& dateTime
setSamplesFromTimeTAndYValues( dateTimes, yValues, true );
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RifEclipseSummaryAddressDefines::AccumulatedOrRateType RimSummaryCurve::accumulatedOrRate() const
{
switch ( m_yAccumulatedOrRate() )
{
case RiaDefines::AccumulatedOrRateType::AUTO:
return RiaSummaryTools::identifyCurveType( m_yValuesSummaryAddress()->address() );
case RiaDefines::AccumulatedOrRateType::ACCUMULATED:
return RifEclipseSummaryAddressDefines::AccumulatedOrRateType::ACCUMULATED;
case RiaDefines::AccumulatedOrRateType::RATE:
return RifEclipseSummaryAddressDefines::AccumulatedOrRateType::RATE;
default:
CAF_ASSERT( false );
return RifEclipseSummaryAddressDefines::AccumulatedOrRateType::ACCUMULATED;
}
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
Expand Down Expand Up @@ -899,9 +923,14 @@ void RimSummaryCurve::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering
curveDataGroup->add( &m_yValuesSummaryCase, { .newRow = true, .totalColumnSpan = 3, .leftLabelColumnSpan = 1 } );
curveDataGroup->add( &m_yValuesSummaryAddressUiField, { .newRow = true, .totalColumnSpan = 2, .leftLabelColumnSpan = 1 } );
curveDataGroup->add( &m_yPushButtonSelectSummaryAddress, { .newRow = false, .totalColumnSpan = 1, .leftLabelColumnSpan = 0 } );
curveDataGroup->add( &m_yValuesResampling, { .newRow = true, .totalColumnSpan = 3, .leftLabelColumnSpan = 1 } );
curveDataGroup->add( &m_yPlotAxisProperties, { .newRow = true, .totalColumnSpan = 3, .leftLabelColumnSpan = 1 } );
curveDataGroup->add( &m_showErrorBars );

caf::PdmUiGroup* detailGroup = curveDataGroup->addNewGroup( "Advanced" );
detailGroup->setCollapsedByDefault();
detailGroup->add( &m_yValuesResampling, { .newRow = true, .totalColumnSpan = 3, .leftLabelColumnSpan = 1 } );
detailGroup->add( &m_showErrorBars );
detailGroup->add( &m_yAccumulatedOrRate );
detailGroup->add( &m_yAccumulatedOrRateText );
}

if ( m_showXAxisGroup )
Expand Down Expand Up @@ -1350,6 +1379,34 @@ RifSummaryReaderInterface* RimSummaryCurve::valuesSummaryReaderY() const
return m_yValuesSummaryCase()->summaryReader();
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RimSummaryCurve::accumulatedOrRateText() const
{
QString text;

if ( m_yAccumulatedOrRate() == RiaDefines::AccumulatedOrRateType::AUTO )
{
text = "Auto : ";
}
else
{
text = "User Defined : ";
}

if ( accumulatedOrRate() == RifEclipseSummaryAddressDefines::AccumulatedOrRateType::ACCUMULATED )
{
text += "Accumulated";
}
else
{
text += "Rate";
}

return text;
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
Expand All @@ -1372,7 +1429,7 @@ void RimSummaryCurve::calculateCurveInterpolationFromAddress()
if ( m_yValuesSummaryAddress() )
{
auto address = m_yValuesSummaryAddress()->address();
if ( RiaSummaryTools::hasAccumulatedData( address ) )
if ( RiaSummaryTools::identifyCurveType( address ) == RifEclipseSummaryAddressDefines::AccumulatedOrRateType::ACCUMULATED )
{
m_curveAppearance->setInterpolation( RiuQwtPlotCurveDefines::CurveInterpolationEnum::INTERPOLATION_POINT_TO_POINT );
}
Expand Down
10 changes: 10 additions & 0 deletions ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurve.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,13 @@
#include "RiaSummaryCurveAddress.h"
#include "RiaSummaryDefines.h"

#include "RifEclipseSummaryAddressDefines.h"
#include "RifEclipseSummaryAddressQMetaType.h"

#include "RimStackablePlotCurve.h"

#include "cafAppEnum.h"
#include "cafPdmProxyValueField.h"
#include "cafTristate.h"

class RifSummaryReaderInterface;
Expand Down Expand Up @@ -76,6 +79,8 @@ class RimSummaryCurve : public RimStackablePlotCurve
double yValueAtTimeT( time_t time ) const;
void setOverrideCurveDataY( const std::vector<time_t>& xValues, const std::vector<double>& yValues );

RifEclipseSummaryAddressDefines::AccumulatedOrRateType accumulatedOrRate() const;

// X Axis functions
void setAxisTypeX( RiaDefines::HorizontalAxisType axisType );
RiaDefines::HorizontalAxisType axisTypeX() const;
Expand Down Expand Up @@ -139,6 +144,8 @@ class RimSummaryCurve : public RimStackablePlotCurve
RifSummaryReaderInterface* valuesSummaryReaderX() const;
RifSummaryReaderInterface* valuesSummaryReaderY() const;

QString accumulatedOrRateText() const;

void calculateCurveInterpolationFromAddress();

static void appendOptionItemsForSummaryAddresses( QList<caf::PdmOptionItemInfo>* options, RimSummaryCase* summaryCase );
Expand All @@ -152,6 +159,9 @@ class RimSummaryCurve : public RimStackablePlotCurve
caf::PdmPtrField<RimPlotAxisPropertiesInterface*> m_yPlotAxisProperties;
caf::PdmField<RiaDefines::DateTimePeriodEnum> m_yValuesResampling;

caf::PdmField<caf::AppEnum<RiaDefines::AccumulatedOrRateType>> m_yAccumulatedOrRate;
caf::PdmProxyValueField<QString> m_yAccumulatedOrRateText;

// X values
caf::PdmField<caf::AppEnum<RiaDefines::HorizontalAxisType>> m_xAxisType;
caf::PdmPtrField<RimSummaryCase*> m_xValuesSummaryCase;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,9 @@ void RimSummaryCurvesData::populateTimeHistoryCurvesData( std::vector<RimGridTim
if ( !curve->isChecked() ) continue;
QString curveCaseName = curve->caseName();

CurveData curveData = { curve->curveExportDescription( {} ), RifEclipseSummaryAddress(), curve->yValues() };
CurveData curveData = { curve->curveExportDescription( {} ),
RifEclipseSummaryAddressDefines::AccumulatedOrRateType::ACCUMULATED,
curve->yValues() };

curvesData->addCurveData( curveCaseName, "", curve->timeStepValues(), curveData );
}
Expand All @@ -68,7 +70,9 @@ void RimSummaryCurvesData::populateAsciiDataCurvesData( std::vector<RimAsciiData
{
if ( !curve->isChecked() ) continue;

CurveData curveData = { curve->curveExportDescription( {} ), RifEclipseSummaryAddress(), curve->yValues() };
CurveData curveData = { curve->curveExportDescription( {} ),
RifEclipseSummaryAddressDefines::AccumulatedOrRateType::ACCUMULATED,
curve->yValues() };

curvesData->addCurveDataNoSearch( "", "", curve->timeSteps(), { curveData } );
}
Expand Down Expand Up @@ -145,30 +149,25 @@ QString RimSummaryCurvesData::createTextForExport( const std::vector<RimSummaryC

QString out;

RimSummaryCurvesData summaryCurvesGridData;
RimSummaryCurvesData summaryCurvesData;
RimSummaryCurvesData summaryCurvesObsData;
RimSummaryCurvesData::populateSummaryCurvesData( curves, SummaryCurveType::CURVE_TYPE_GRID, &summaryCurvesGridData );
RimSummaryCurvesData gridCurvesData;
RimSummaryCurvesData::populateSummaryCurvesData( curves, SummaryCurveType::CURVE_TYPE_SUMMARY, &summaryCurvesData );
RimSummaryCurvesData::populateSummaryCurvesData( curves, SummaryCurveType::CURVE_TYPE_OBSERVED, &summaryCurvesObsData );
RimSummaryCurvesData::populateTimeHistoryCurvesData( gridCurves, &gridCurvesData );

RimSummaryCurvesData timeHistoryCurvesData;
RimSummaryCurvesData::populateTimeHistoryCurvesData( gridCurves, &timeHistoryCurvesData );

// Export observed data
RimSummaryCurvesData::appendToExportData( out, { summaryCurvesObsData }, showTimeAsLongString );

std::vector<RimSummaryCurvesData> exportData( 2 );

// Summary grid data for export
RimSummaryCurvesData::prepareCaseCurvesForExport( resamplingPeriod, ResampleAlgorithm::DATA_DECIDES, summaryCurvesGridData, &exportData[0] );

// Time history data for export
RimSummaryCurvesData::prepareCaseCurvesForExport( resamplingPeriod, ResampleAlgorithm::PERIOD_END, timeHistoryCurvesData, &exportData[1] );
RimSummaryCurvesData::prepareCaseCurvesForExport( resamplingPeriod, ResampleAlgorithm::DATA_DECIDES, summaryCurvesData, &exportData[0] );
RimSummaryCurvesData::prepareCaseCurvesForExport( resamplingPeriod, ResampleAlgorithm::PERIOD_END, gridCurvesData, &exportData[1] );

// Export resampled summary and time history data
RimSummaryCurvesData::appendToExportData( out, exportData, showTimeAsLongString );

// Pasted observed data
{
// Handle observed data pasted into plot from clipboard

RimSummaryCurvesData asciiCurvesData;
RimSummaryCurvesData::populateAsciiDataCurvesData( asciiCurves, &asciiCurvesData );

Expand Down Expand Up @@ -239,7 +238,7 @@ void RimSummaryCurvesData::populateSummaryCurvesData( std::vector<RimSummaryCurv

if ( !curve->isChecked() ) continue;
if ( isObservedCurve && ( curveType != SummaryCurveType::CURVE_TYPE_OBSERVED ) ) continue;
if ( !isObservedCurve && ( curveType != SummaryCurveType::CURVE_TYPE_GRID ) ) continue;
if ( !isObservedCurve && ( curveType != SummaryCurveType::CURVE_TYPE_SUMMARY ) ) continue;
if ( !curve->summaryCaseY() ) continue;

QString curveCaseName = curve->summaryCaseY()->displayCaseName();
Expand All @@ -249,7 +248,7 @@ void RimSummaryCurvesData::populateSummaryCurvesData( std::vector<RimSummaryCurv
ensembleName = curve->curveDefinition().ensemble()->name();
}

CurveData curveData = { curve->curveExportDescription( {} ), curve->summaryAddressY(), curve->valuesY() };
CurveData curveData = { curve->curveExportDescription( {} ), curve->accumulatedOrRate(), curve->valuesY() };
CurveData errorCurveData;

// Error data
Expand All @@ -258,9 +257,9 @@ void RimSummaryCurvesData::populateSummaryCurvesData( std::vector<RimSummaryCurv

if ( hasErrorData )
{
errorCurveData.name = curve->curveExportDescription( curve->errorSummaryAddressY() );
errorCurveData.address = curve->errorSummaryAddressY();
errorCurveData.values = errorValues;
errorCurveData.name = curve->curveExportDescription( curve->errorSummaryAddressY() );
errorCurveData.accumulatedOrRate = curve->accumulatedOrRate();
errorCurveData.values = errorValues;
}

auto curveDataList = std::vector<CurveData>( { curveData } );
Expand Down Expand Up @@ -307,7 +306,7 @@ void RimSummaryCurvesData::prepareCaseCurvesForExport( RiaDefines::DateTimePerio
for ( auto& curveDataItem : caseCurveData )
{
const auto [resampledTime, resampledValues] =
RiaSummaryTools::resampledValuesForPeriod( curveDataItem.address, caseTimeSteps, curveDataItem.values, period );
RiaSummaryTools::resampledValuesForPeriod( curveDataItem.accumulatedOrRate, caseTimeSteps, curveDataItem.values, period );

auto cd = curveDataItem;
cd.values = resampledValues;
Expand Down
Loading

0 comments on commit 44727d6

Please sign in to comment.