mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#7771 Summary Plot Resampling: Crash for identical case names but different size
Avoid mix of curve values of different size
This commit is contained in:
parent
85b333d06d
commit
4b7744af26
@ -104,14 +104,69 @@ public:
|
|||||||
}
|
}
|
||||||
void clear()
|
void clear()
|
||||||
{
|
{
|
||||||
resamplePeriod = RiaQDateTimeTools::DateTimePeriod::NONE;
|
caseIds.clear();
|
||||||
caseNames.clear();
|
|
||||||
timeSteps.clear();
|
timeSteps.clear();
|
||||||
allCurveData.clear();
|
allCurveData.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void addCurveData( const QString& caseName,
|
||||||
|
const QString& ensembleName,
|
||||||
|
const std::vector<time_t>& curvetimeSteps,
|
||||||
|
const CurveData& curveData )
|
||||||
|
{
|
||||||
|
QString caseId = createCaseId( caseName, ensembleName );
|
||||||
|
size_t existingCaseIndex = findCaseIndexForCaseId( caseId, curvetimeSteps.size() );
|
||||||
|
|
||||||
|
if ( existingCaseIndex == cvf::UNDEFINED_SIZE_T )
|
||||||
|
{
|
||||||
|
caseIds.push_back( caseId );
|
||||||
|
timeSteps.push_back( curvetimeSteps );
|
||||||
|
allCurveData.push_back( { curveData } );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CVF_ASSERT( timeSteps[existingCaseIndex].size() == curveData.values.size() );
|
||||||
|
|
||||||
|
allCurveData[existingCaseIndex].push_back( curveData );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void addCurveDataNoSearch( const QString& caseName,
|
||||||
|
const QString& ensembleName,
|
||||||
|
const std::vector<time_t>& curvetimeSteps,
|
||||||
|
const std::vector<CurveData>& curveDataVector )
|
||||||
|
{
|
||||||
|
QString caseId = createCaseId( caseName, ensembleName );
|
||||||
|
|
||||||
|
caseIds.push_back( caseId );
|
||||||
|
timeSteps.push_back( curvetimeSteps );
|
||||||
|
allCurveData.push_back( curveDataVector );
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
size_t findCaseIndexForCaseId( const QString& caseId, size_t timeStepCount )
|
||||||
|
{
|
||||||
|
size_t casePosInList = cvf::UNDEFINED_SIZE_T;
|
||||||
|
|
||||||
|
for ( size_t i = 0; i < caseIds.size(); i++ )
|
||||||
|
{
|
||||||
|
if ( caseId == caseIds[i] && timeSteps[i].size() == timeStepCount ) casePosInList = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return casePosInList;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString createCaseId( const QString& caseName, const QString& ensembleName )
|
||||||
|
{
|
||||||
|
QString caseId = caseName;
|
||||||
|
if ( !ensembleName.isEmpty() ) caseId += QString( " (%1)" ).arg( ensembleName );
|
||||||
|
|
||||||
|
return caseId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
RiaQDateTimeTools::DateTimePeriod resamplePeriod;
|
RiaQDateTimeTools::DateTimePeriod resamplePeriod;
|
||||||
std::vector<QString> caseNames;
|
std::vector<QString> caseIds;
|
||||||
std::vector<std::vector<time_t>> timeSteps;
|
std::vector<std::vector<time_t>> timeSteps;
|
||||||
std::vector<std::vector<CurveData>> allCurveData;
|
std::vector<std::vector<CurveData>> allCurveData;
|
||||||
};
|
};
|
||||||
@ -2241,33 +2296,16 @@ void populateTimeHistoryCurvesData( std::vector<RimGridTimeHistoryCurve*> curves
|
|||||||
{
|
{
|
||||||
CVF_ASSERT( curvesData );
|
CVF_ASSERT( curvesData );
|
||||||
|
|
||||||
curvesData->caseNames.clear();
|
curvesData->clear();
|
||||||
curvesData->timeSteps.clear();
|
|
||||||
curvesData->allCurveData.clear();
|
|
||||||
|
|
||||||
for ( RimGridTimeHistoryCurve* curve : curves )
|
for ( RimGridTimeHistoryCurve* curve : curves )
|
||||||
{
|
{
|
||||||
if ( !curve->isCurveVisible() ) continue;
|
if ( !curve->isCurveVisible() ) continue;
|
||||||
QString curveCaseName = curve->caseName();
|
QString curveCaseName = curve->caseName();
|
||||||
|
|
||||||
size_t casePosInList = cvf::UNDEFINED_SIZE_T;
|
|
||||||
for ( size_t i = 0; i < curvesData->caseNames.size(); i++ )
|
|
||||||
{
|
|
||||||
if ( curveCaseName == curvesData->caseNames[i] ) casePosInList = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
CurveData curveData = { curve->curveExportDescription(), RifEclipseSummaryAddress(), curve->yValues() };
|
CurveData curveData = { curve->curveExportDescription(), RifEclipseSummaryAddress(), curve->yValues() };
|
||||||
|
|
||||||
if ( casePosInList == cvf::UNDEFINED_SIZE_T )
|
curvesData->addCurveData( curveCaseName, "", curve->timeStepValues(), curveData );
|
||||||
{
|
|
||||||
curvesData->caseNames.push_back( curveCaseName );
|
|
||||||
curvesData->timeSteps.push_back( curve->timeStepValues() );
|
|
||||||
curvesData->allCurveData.push_back( std::vector<CurveData>( { curveData } ) );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
curvesData->allCurveData[casePosInList].push_back( curveData );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2278,28 +2316,15 @@ void populateAsciiDataCurvesData( std::vector<RimAsciiDataCurve*> curves, Curves
|
|||||||
{
|
{
|
||||||
CVF_ASSERT( curvesData );
|
CVF_ASSERT( curvesData );
|
||||||
|
|
||||||
curvesData->caseNames.clear();
|
curvesData->clear();
|
||||||
curvesData->timeSteps.clear();
|
|
||||||
curvesData->allCurveData.clear();
|
|
||||||
|
|
||||||
for ( RimAsciiDataCurve* curve : curves )
|
for ( RimAsciiDataCurve* curve : curves )
|
||||||
{
|
{
|
||||||
if ( !curve->isCurveVisible() ) continue;
|
if ( !curve->isCurveVisible() ) continue;
|
||||||
|
|
||||||
size_t casePosInList = cvf::UNDEFINED_SIZE_T;
|
|
||||||
|
|
||||||
CurveData curveData = { curve->curveExportDescription(), RifEclipseSummaryAddress(), curve->yValues() };
|
CurveData curveData = { curve->curveExportDescription(), RifEclipseSummaryAddress(), curve->yValues() };
|
||||||
|
|
||||||
if ( casePosInList == cvf::UNDEFINED_SIZE_T )
|
curvesData->addCurveDataNoSearch( "", "", curve->timeSteps(), { curveData } );
|
||||||
{
|
|
||||||
curvesData->caseNames.push_back( "" );
|
|
||||||
curvesData->timeSteps.push_back( curve->timeSteps() );
|
|
||||||
curvesData->allCurveData.push_back( std::vector<CurveData>( { curveData } ) );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
curvesData->allCurveData[casePosInList].push_back( curveData );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2310,9 +2335,7 @@ void populateSummaryCurvesData( std::vector<RimSummaryCurve*> curves, SummaryCur
|
|||||||
{
|
{
|
||||||
CVF_ASSERT( curvesData );
|
CVF_ASSERT( curvesData );
|
||||||
|
|
||||||
curvesData->caseNames.clear();
|
curvesData->clear();
|
||||||
curvesData->timeSteps.clear();
|
|
||||||
curvesData->allCurveData.clear();
|
|
||||||
|
|
||||||
for ( RimSummaryCurve* curve : curves )
|
for ( RimSummaryCurve* curve : curves )
|
||||||
{
|
{
|
||||||
@ -2324,11 +2347,10 @@ void populateSummaryCurvesData( std::vector<RimSummaryCurve*> curves, SummaryCur
|
|||||||
if ( !curve->summaryCaseY() ) continue;
|
if ( !curve->summaryCaseY() ) continue;
|
||||||
|
|
||||||
QString curveCaseName = curve->summaryCaseY()->displayCaseName();
|
QString curveCaseName = curve->summaryCaseY()->displayCaseName();
|
||||||
|
QString ensembleName;
|
||||||
size_t casePosInList = cvf::UNDEFINED_SIZE_T;
|
if ( curve->curveDefinitionY().ensemble() )
|
||||||
for ( size_t i = 0; i < curvesData->caseNames.size(); i++ )
|
|
||||||
{
|
{
|
||||||
if ( curveCaseName == curvesData->caseNames[i] ) casePosInList = i;
|
ensembleName = curve->curveDefinitionY().ensemble()->name();
|
||||||
}
|
}
|
||||||
|
|
||||||
CurveData curveData = { curve->curveExportDescription(), curve->summaryAddressY(), curve->valuesY() };
|
CurveData curveData = { curve->curveExportDescription(), curve->summaryAddressY(), curve->valuesY() };
|
||||||
@ -2345,26 +2367,19 @@ void populateSummaryCurvesData( std::vector<RimSummaryCurve*> curves, SummaryCur
|
|||||||
errorCurveData.values = errorValues;
|
errorCurveData.values = errorValues;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( casePosInList == cvf::UNDEFINED_SIZE_T ||
|
|
||||||
curve->summaryAddressY().category() == RifEclipseSummaryAddress::SUMMARY_CALCULATED )
|
|
||||||
{
|
|
||||||
// Create a section with separate time axis data if
|
|
||||||
// 1. Case is not referenced before, or
|
|
||||||
// 2. We have calculated data, and it we cannot assume identical time axis
|
|
||||||
|
|
||||||
auto curveDataList = std::vector<CurveData>( { curveData } );
|
auto curveDataList = std::vector<CurveData>( { curveData } );
|
||||||
if ( hasErrorData ) curveDataList.push_back( errorCurveData );
|
if ( hasErrorData ) curveDataList.push_back( errorCurveData );
|
||||||
|
if ( curve->summaryAddressY().category() == RifEclipseSummaryAddress::SUMMARY_CALCULATED )
|
||||||
curvesData->caseNames.push_back( curveCaseName );
|
{
|
||||||
curvesData->timeSteps.push_back( curve->timeStepsY() );
|
// We have calculated data, and it we cannot assume identical time axis
|
||||||
curvesData->allCurveData.push_back( curveDataList );
|
curvesData->addCurveDataNoSearch( curveCaseName, ensembleName, curve->timeStepsY(), curveDataList );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Append curve data to previously created curvesdata object
|
for ( auto cd : curveDataList )
|
||||||
|
{
|
||||||
curvesData->allCurveData[casePosInList].push_back( curveData );
|
curvesData->addCurveData( curveCaseName, ensembleName, curve->timeStepsY(), cd );
|
||||||
if ( hasErrorData ) curvesData->allCurveData[casePosInList].push_back( errorCurveData );
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2386,16 +2401,14 @@ void prepareCaseCurvesForExport( RiaQDateTimeTools::DateTimePeriod period,
|
|||||||
// Prepare result data
|
// Prepare result data
|
||||||
resultCurvesData->resamplePeriod = period;
|
resultCurvesData->resamplePeriod = period;
|
||||||
|
|
||||||
for ( size_t i = 0; i < inputCurvesData.caseNames.size(); i++ )
|
for ( size_t i = 0; i < inputCurvesData.caseIds.size(); i++ )
|
||||||
{
|
{
|
||||||
// Shortcuts to input data
|
// Shortcuts to input data
|
||||||
auto& caseName = inputCurvesData.caseNames[i];
|
auto& caseId = inputCurvesData.caseIds[i];
|
||||||
auto& caseTimeSteps = inputCurvesData.timeSteps[i];
|
auto& caseTimeSteps = inputCurvesData.timeSteps[i];
|
||||||
auto& caseCurveData = inputCurvesData.allCurveData[i];
|
auto& caseCurveData = inputCurvesData.allCurveData[i];
|
||||||
|
|
||||||
// Prepare result data
|
// Prepare result data
|
||||||
resultCurvesData->caseNames.push_back( caseName );
|
|
||||||
resultCurvesData->allCurveData.push_back( std::vector<CurveData>() );
|
|
||||||
|
|
||||||
for ( auto& curveDataItem : caseCurveData )
|
for ( auto& curveDataItem : caseCurveData )
|
||||||
{
|
{
|
||||||
@ -2413,11 +2426,9 @@ void prepareCaseCurvesForExport( RiaQDateTimeTools::DateTimePeriod period,
|
|||||||
|
|
||||||
auto cd = curveDataItem;
|
auto cd = curveDataItem;
|
||||||
cd.values = resampler.resampledValues();
|
cd.values = resampler.resampledValues();
|
||||||
auto& currResultCurveDataList = resultCurvesData->allCurveData[i];
|
|
||||||
currResultCurveDataList.push_back( cd );
|
|
||||||
}
|
|
||||||
|
|
||||||
resultCurvesData->timeSteps.push_back( resampler.resampledTimeSteps() );
|
resultCurvesData->addCurveData( caseId, "", resampler.resampledTimeSteps(), cd );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -2482,7 +2493,7 @@ void appendToExportData( QString& out, const std::vector<CurvesData>& curvesData
|
|||||||
|
|
||||||
out += "\n\n";
|
out += "\n\n";
|
||||||
out += "Date and time";
|
out += "Date and time";
|
||||||
for ( size_t i = 0; i < data.caseNames.size(); i++ )
|
for ( size_t i = 0; i < data.caseIds.size(); i++ )
|
||||||
{
|
{
|
||||||
for ( size_t j = 0; j < data.allCurveData[i].size(); j++ )
|
for ( size_t j = 0; j < data.allCurveData[i].size(); j++ )
|
||||||
{
|
{
|
||||||
@ -2491,7 +2502,7 @@ void appendToExportData( QString& out, const std::vector<CurvesData>& curvesData
|
|||||||
}
|
}
|
||||||
out += "\n";
|
out += "\n";
|
||||||
|
|
||||||
std::vector<size_t> currIndexes( data.caseNames.size() );
|
std::vector<size_t> currIndexes( data.caseIds.size() );
|
||||||
for ( auto& i : currIndexes )
|
for ( auto& i : currIndexes )
|
||||||
i = 0;
|
i = 0;
|
||||||
|
|
||||||
@ -2555,7 +2566,7 @@ void appendToExportData( QString& out, const std::vector<CurvesData>& curvesData
|
|||||||
}
|
}
|
||||||
out += timeText;
|
out += timeText;
|
||||||
|
|
||||||
for ( size_t i = 0; i < data.caseNames.size(); i++ ) // cases
|
for ( size_t i = 0; i < data.caseIds.size(); i++ ) // cases
|
||||||
{
|
{
|
||||||
// Check is time step exists in curr case
|
// Check is time step exists in curr case
|
||||||
size_t& currIndex = currIndexes[i];
|
size_t& currIndex = currIndexes[i];
|
||||||
@ -2583,12 +2594,12 @@ void appendToExportData( QString& out, const std::vector<CurvesData>& curvesData
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for ( size_t i = 0; i < data.caseNames.size(); i++ )
|
for ( size_t i = 0; i < data.caseIds.size(); i++ )
|
||||||
{
|
{
|
||||||
out += "\n\n";
|
out += "\n\n";
|
||||||
if ( !data.caseNames[i].isEmpty() )
|
if ( !data.caseIds[i].isEmpty() )
|
||||||
{
|
{
|
||||||
out += "Case: " + data.caseNames[i];
|
out += "Case: " + data.caseIds[i];
|
||||||
out += "\n";
|
out += "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2611,13 +2622,13 @@ CurvesData concatCurvesData( const std::vector<CurvesData>& curvesData )
|
|||||||
|
|
||||||
for ( auto curvesDataItem : curvesData )
|
for ( auto curvesDataItem : curvesData )
|
||||||
{
|
{
|
||||||
if ( curvesDataItem.caseNames.empty() ) continue;
|
if ( curvesDataItem.caseIds.empty() ) continue;
|
||||||
|
|
||||||
CVF_ASSERT( curvesDataItem.resamplePeriod == period );
|
CVF_ASSERT( curvesDataItem.resamplePeriod == period );
|
||||||
|
|
||||||
resultCurvesData.caseNames.insert( resultCurvesData.caseNames.end(),
|
resultCurvesData.caseIds.insert( resultCurvesData.caseIds.end(),
|
||||||
curvesDataItem.caseNames.begin(),
|
curvesDataItem.caseIds.begin(),
|
||||||
curvesDataItem.caseNames.end() );
|
curvesDataItem.caseIds.end() );
|
||||||
resultCurvesData.timeSteps.insert( resultCurvesData.timeSteps.end(),
|
resultCurvesData.timeSteps.insert( resultCurvesData.timeSteps.end(),
|
||||||
curvesDataItem.timeSteps.begin(),
|
curvesDataItem.timeSteps.begin(),
|
||||||
curvesDataItem.timeSteps.end() );
|
curvesDataItem.timeSteps.end() );
|
||||||
|
Loading…
Reference in New Issue
Block a user