Fix incorrect detection of first and last timestep in vectorData (#10143)

- Incorrect sorting was due to incorrect detection of first and last timestep for vector data.
- First/last timestep is for value above 0.0 and not threshold.
This commit is contained in:
Jørgen Herje
2023-04-21 13:48:57 +02:00
committed by GitHub
parent 0d8aee8995
commit 25e78e9792

View File

@@ -382,16 +382,21 @@ void RimSummaryTable::onLoadDataAndUpdate()
const auto [resampledTimeSteps, resampledValues] = const auto [resampledTimeSteps, resampledValues] =
RiaSummaryTools::resampledValuesForPeriod( adr, timeSteps, values, m_resamplingSelection() ); RiaSummaryTools::resampledValuesForPeriod( adr, timeSteps, values, m_resamplingSelection() );
// First and last time step with value above threshold and set flag (first and last should be valid/invalid simultaneously) // Detect if values contain at least one value above threshold
const auto firstItr = const auto valueAboveThresholdItr =
std::find_if( resampledValues.begin(), resampledValues.end(), [&]( double value ) { return value > m_thresholdValue; } ); std::find_if( resampledValues.begin(), resampledValues.end(), [&]( double value ) { return value > m_thresholdValue; } );
const auto lastItr = const bool hasValueAboveThreshold = valueAboveThresholdItr != resampledValues.end();
std::find_if( resampledValues.rbegin(), resampledValues.rend(), [&]( double value ) { return value > m_thresholdValue; } );
const auto firstIdx = static_cast<size_t>( std::distance( resampledValues.begin(), firstItr ) ); // Find first and last time step with value above 0.0 when hasValueAboveThreshold flag is true (first and last should be
const auto lastIdx = resampledValues.size() - static_cast<size_t>( std::distance( resampledValues.rbegin(), lastItr ) ) - 1; // valid/invalid simultaneously)
const bool hasValueAboveThreshold = firstIdx < resampledTimeSteps.size() && lastIdx < resampledTimeSteps.size(); const auto firstTimeStepItr =
const auto firstTimeStep = hasValueAboveThreshold ? resampledTimeSteps[firstIdx] : invalidTimeStep; std::find_if( resampledValues.begin(), resampledValues.end(), [&]( double value ) { return value > 0.0; } );
const auto lastTimeStep = hasValueAboveThreshold ? resampledTimeSteps[lastIdx] : invalidTimeStep; const auto lastTimeStepItr =
std::find_if( resampledValues.rbegin(), resampledValues.rend(), [&]( double value ) { return value > 0.0; } );
const auto firstIdx = static_cast<size_t>( std::distance( resampledValues.begin(), firstTimeStepItr ) );
const auto lastIdx = resampledValues.size() - static_cast<size_t>( std::distance( resampledValues.rbegin(), lastTimeStepItr ) ) - 1;
const auto firstTimeStep = hasValueAboveThreshold ? resampledTimeSteps[firstIdx] : invalidTimeStep;
const auto lastTimeStep = hasValueAboveThreshold ? resampledTimeSteps[lastIdx] : invalidTimeStep;
// Add to vector of VectorData // Add to vector of VectorData
VectorData vectorData{ .category = categoryName, VectorData vectorData{ .category = categoryName,