mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#3060 Resampled plot export. Prepare for resampling during summary plot export
This commit is contained in:
parent
16725b2376
commit
7e6943aa96
@ -33,6 +33,7 @@ class DateTimeSpan;
|
|||||||
//==================================================================================================
|
//==================================================================================================
|
||||||
enum class DateTimePeriod
|
enum class DateTimePeriod
|
||||||
{
|
{
|
||||||
|
NONE = -1,
|
||||||
DECADE,
|
DECADE,
|
||||||
YEAR,
|
YEAR,
|
||||||
HALFYEAR,
|
HALFYEAR,
|
||||||
|
@ -34,7 +34,6 @@
|
|||||||
// return QString("%1.%2.%3 %4:%5:%6").arg(y).arg(m).arg(d).arg(h).arg(mm).arg(s);
|
// return QString("%1.%2.%3 %4:%5:%6").arg(y).arg(m).arg(d).arg(h).arg(mm).arg(s);
|
||||||
//}
|
//}
|
||||||
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@ -185,7 +184,7 @@ void RiaTimeHistoryCurveResampler::clearData()
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
void RiaTimeHistoryCurveResampler::computeResampledTimeSteps(DateTimePeriod period)
|
void RiaTimeHistoryCurveResampler::computeResampledTimeSteps(DateTimePeriod period)
|
||||||
{
|
{
|
||||||
CVF_ASSERT(m_originalValues.second.size() > 0);
|
CVF_ASSERT(period != DateTimePeriod::NONE && m_originalValues.second.size() > 0);
|
||||||
|
|
||||||
auto firstOriginalTimeStep = QDT::fromTime_t(m_originalValues.second.front());
|
auto firstOriginalTimeStep = QDT::fromTime_t(m_originalValues.second.front());
|
||||||
auto lastOriginalTimeStep = QDT::fromTime_t(m_originalValues.second.back());
|
auto lastOriginalTimeStep = QDT::fromTime_t(m_originalValues.second.back());
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
|
|
||||||
#include "RiaApplication.h"
|
#include "RiaApplication.h"
|
||||||
#include "RiaSummaryCurveAnalyzer.h"
|
#include "RiaSummaryCurveAnalyzer.h"
|
||||||
|
#include "RiaTimeHistoryCurveResampler.h"
|
||||||
|
|
||||||
#include "SummaryPlotCommands/RicSummaryCurveCreator.h"
|
#include "SummaryPlotCommands/RicSummaryCurveCreator.h"
|
||||||
|
|
||||||
@ -61,6 +62,25 @@
|
|||||||
|
|
||||||
CAF_PDM_SOURCE_INIT(RimSummaryPlot, "SummaryPlot");
|
CAF_PDM_SOURCE_INIT(RimSummaryPlot, "SummaryPlot");
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
/// Internal data
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
struct CurveData
|
||||||
|
{
|
||||||
|
QString name;
|
||||||
|
RifEclipseSummaryAddress address;
|
||||||
|
std::vector<double> values;
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
/// Internal functions
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void prepareCaseCurvesForExport(DateTimePeriod period,
|
||||||
|
const std::vector<time_t> &timeSteps, const std::vector<CurveData>& curveData,
|
||||||
|
std::vector<time_t>* resampledTimeSteps, std::vector<CurveData>* resampledValues);
|
||||||
|
|
||||||
|
void appendToExportData(QString& out, const std::vector<time_t>& timeSteps, const std::vector<CurveData>& curveData);
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@ -243,100 +263,69 @@ QWidget* RimSummaryPlot::viewWidget()
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
QString RimSummaryPlot::asciiDataForPlotExport() const
|
QString RimSummaryPlot::asciiDataForPlotExport(DateTimePeriod resamplingPeriod) const
|
||||||
{
|
{
|
||||||
QString out;
|
QString out;
|
||||||
|
RiaTimeHistoryCurveResampler resampler;
|
||||||
|
|
||||||
out += description();
|
out += description();
|
||||||
|
|
||||||
|
// Summary curves
|
||||||
{
|
{
|
||||||
std::vector<RimSummaryCurve*> curves;
|
std::vector<RimSummaryCurve*> curves;
|
||||||
this->descendantsIncludingThisOfType(curves);
|
this->descendantsIncludingThisOfType(curves);
|
||||||
|
|
||||||
std::vector<QString> caseNames;
|
std::vector<QString> caseNames;
|
||||||
std::vector<std::vector<time_t> > timeSteps;
|
std::vector<std::vector<time_t> > timeSteps;
|
||||||
|
std::vector<std::vector<CurveData>> allCurveData;
|
||||||
std::vector<std::vector<std::vector<double> > > allCurveData;
|
// Vector containing cases - curves
|
||||||
std::vector<std::vector<QString > > allCurveNames;
|
|
||||||
//Vectors containing cases - curves - data points/curve name
|
|
||||||
|
|
||||||
for (RimSummaryCurve* curve : curves)
|
for (RimSummaryCurve* curve : curves)
|
||||||
{
|
{
|
||||||
if (!curve->isCurveVisible()) continue;
|
if (!curve->isCurveVisible()) continue;
|
||||||
QString curveCaseName = curve->summaryCaseY()->caseName();
|
QString curveCaseName = curve->summaryCaseY()->caseName();
|
||||||
|
|
||||||
size_t casePosInList = cvf::UNDEFINED_SIZE_T;
|
size_t casePosInList = cvf::UNDEFINED_SIZE_T;
|
||||||
for (size_t i = 0; i < caseNames.size(); i++)
|
for (size_t i = 0; i < caseNames.size(); i++)
|
||||||
{
|
{
|
||||||
if (curveCaseName == caseNames[i]) casePosInList = i;
|
if (curveCaseName == caseNames[i]) casePosInList = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CurveData curveData = { curve->curveName(), curve->summaryAddressY(), curve->valuesY() };
|
||||||
|
|
||||||
if (casePosInList == cvf::UNDEFINED_SIZE_T)
|
if (casePosInList == cvf::UNDEFINED_SIZE_T)
|
||||||
{
|
{
|
||||||
caseNames.push_back(curveCaseName);
|
caseNames.push_back(curveCaseName);
|
||||||
|
timeSteps.push_back(curve->timeStepsY());
|
||||||
std::vector<time_t> curveTimeSteps = curve->timeStepsY();
|
allCurveData.push_back(std::vector<CurveData>({ curveData }));
|
||||||
timeSteps.push_back(curveTimeSteps);
|
|
||||||
|
|
||||||
std::vector<std::vector<double> > curveDataForCase;
|
|
||||||
std::vector<double> curveYData = curve->valuesY();
|
|
||||||
curveDataForCase.push_back(curveYData);
|
|
||||||
allCurveData.push_back(curveDataForCase);
|
|
||||||
|
|
||||||
std::vector<QString> curveNamesForCase;
|
|
||||||
curveNamesForCase.push_back(curve->curveName());
|
|
||||||
allCurveNames.push_back(curveNamesForCase);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::vector<double> curveYData = curve->valuesY();
|
allCurveData[casePosInList].push_back(curveData);
|
||||||
allCurveData[casePosInList].push_back(curveYData);
|
|
||||||
|
|
||||||
QString curveName = curve->curveName();
|
|
||||||
allCurveNames[casePosInList].push_back(curveName);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t i = 0; i < timeSteps.size(); i++) //cases
|
for (size_t i = 0; i < timeSteps.size(); i++) //cases
|
||||||
{
|
{
|
||||||
|
// Data for export
|
||||||
|
std::vector<time_t> expTimeSteps;
|
||||||
|
std::vector<CurveData> expCurveData;
|
||||||
|
|
||||||
out += "\n\n";
|
out += "\n\n";
|
||||||
out += "Case: " + caseNames[i];
|
out += "Case: " + caseNames[i];
|
||||||
out += "\n";
|
out += "\n";
|
||||||
|
|
||||||
for (size_t j = 0; j < timeSteps[i].size(); j++) //time steps & data points
|
prepareCaseCurvesForExport(resamplingPeriod, timeSteps[i], allCurveData[i], &expTimeSteps, &expCurveData);
|
||||||
{
|
appendToExportData(out, expTimeSteps, expCurveData);
|
||||||
if (j == 0)
|
|
||||||
{
|
|
||||||
out += "Date and time";
|
|
||||||
for (size_t k = 0; k < allCurveNames[i].size(); k++) // curves
|
|
||||||
{
|
|
||||||
out += "\t" + (allCurveNames[i][k]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
out += "\n";
|
|
||||||
out += QDateTime::fromTime_t(timeSteps[i][j]).toUTC().toString("yyyy-MM-dd hh:mm:ss ");
|
|
||||||
|
|
||||||
for (size_t k = 0; k < allCurveData[i].size(); k++) // curves
|
|
||||||
{
|
|
||||||
QString valueText;
|
|
||||||
if (j < allCurveData[i][k].size())
|
|
||||||
{
|
|
||||||
valueText = QString::number(allCurveData[i][k][j], 'g', 6);
|
|
||||||
}
|
|
||||||
out += "\t" + valueText;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Time history curves (from grid)
|
||||||
{
|
{
|
||||||
std::vector<QString> caseNames;
|
std::vector<QString> caseNames;
|
||||||
std::vector<std::vector<time_t> > timeSteps;
|
std::vector<std::vector<time_t> > timeSteps;
|
||||||
|
std::vector<std::vector<CurveData>> allCurveData;
|
||||||
std::vector<std::vector<std::vector<double> > > allCurveData;
|
// Vector containing cases - curves
|
||||||
std::vector<std::vector<QString > > allCurveNames;
|
|
||||||
//Vectors containing cases - curves - data points/curve name
|
|
||||||
|
|
||||||
for (RimGridTimeHistoryCurve* curve : m_gridTimeHistoryCurves)
|
for (RimGridTimeHistoryCurve* curve : m_gridTimeHistoryCurves)
|
||||||
{
|
{
|
||||||
@ -349,65 +338,40 @@ QString RimSummaryPlot::asciiDataForPlotExport() const
|
|||||||
if (curveCaseName == caseNames[i]) casePosInList = i;
|
if (curveCaseName == caseNames[i]) casePosInList = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CurveData curveData = { curve->curveName(), RifEclipseSummaryAddress(), curve->yValues() };
|
||||||
|
|
||||||
if (casePosInList == cvf::UNDEFINED_SIZE_T)
|
if (casePosInList == cvf::UNDEFINED_SIZE_T)
|
||||||
{
|
{
|
||||||
caseNames.push_back(curveCaseName);
|
caseNames.push_back(curveCaseName);
|
||||||
|
timeSteps.push_back(curve->timeStepValues());
|
||||||
std::vector<time_t> curveTimeSteps = curve->timeStepValues();
|
allCurveData.push_back(std::vector<CurveData>({ curveData }));
|
||||||
timeSteps.push_back(curveTimeSteps);
|
|
||||||
|
|
||||||
std::vector<std::vector<double> > curveDataForCase;
|
|
||||||
std::vector<double> curveYData = curve->yValues();
|
|
||||||
curveDataForCase.push_back(curveYData);
|
|
||||||
allCurveData.push_back(curveDataForCase);
|
|
||||||
|
|
||||||
std::vector<QString> curveNamesForCase;
|
|
||||||
curveNamesForCase.push_back(curve->curveName());
|
|
||||||
allCurveNames.push_back(curveNamesForCase);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::vector<double> curveYData = curve->yValues();
|
allCurveData[casePosInList].push_back(curveData);
|
||||||
allCurveData[casePosInList].push_back(curveYData);
|
|
||||||
|
|
||||||
QString curveName = curve->curveName();
|
|
||||||
allCurveNames[casePosInList].push_back(curveName);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t i = 0; i < timeSteps.size(); i++) //cases
|
for (size_t i = 0; i < timeSteps.size(); i++) //cases
|
||||||
{
|
{
|
||||||
|
// Data for export
|
||||||
|
std::vector<time_t> expTimeSteps;
|
||||||
|
std::vector<CurveData> expCurveData;
|
||||||
|
|
||||||
out += "\n\n";
|
out += "\n\n";
|
||||||
out += "Case: " + caseNames[i];
|
out += "Case: " + caseNames[i];
|
||||||
out += "\n";
|
out += "\n";
|
||||||
|
|
||||||
for (size_t j = 0; j < timeSteps[i].size(); j++) //time steps & data points
|
prepareCaseCurvesForExport(resamplingPeriod, timeSteps[i], allCurveData[i], &expTimeSteps, &expCurveData);
|
||||||
{
|
appendToExportData(out, expTimeSteps, expCurveData);
|
||||||
if (j == 0)
|
|
||||||
{
|
|
||||||
out += "Date and time";
|
|
||||||
for (size_t k = 0; k < allCurveNames[i].size(); k++) // curves
|
|
||||||
{
|
|
||||||
out += "\t" + (allCurveNames[i][k]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
out += "\n";
|
|
||||||
out += QDateTime::fromTime_t(timeSteps[i][j]).toUTC().toString("yyyy-MM-dd hh:mm:ss ");
|
|
||||||
|
|
||||||
for (size_t k = 0; k < allCurveData[i].size(); k++) // curves
|
|
||||||
{
|
|
||||||
out += "\t" + QString::number(allCurveData[i][k][j], 'g', 6);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Pasted observed data
|
||||||
{
|
{
|
||||||
std::vector<std::vector<time_t> > timeSteps;
|
std::vector<std::vector<time_t> > timeSteps;
|
||||||
|
std::vector<std::vector<CurveData>> allCurveData;
|
||||||
std::vector<std::vector<std::vector<double> > > allCurveData;
|
// Vector containing cases - curves
|
||||||
std::vector<std::vector<QString > > allCurveNames;
|
|
||||||
//Vectors containing cases - curves - data points/curve name
|
|
||||||
|
|
||||||
for (RimAsciiDataCurve* curve : m_asciiDataCurves)
|
for (RimAsciiDataCurve* curve : m_asciiDataCurves)
|
||||||
{
|
{
|
||||||
@ -415,52 +379,29 @@ QString RimSummaryPlot::asciiDataForPlotExport() const
|
|||||||
|
|
||||||
size_t casePosInList = cvf::UNDEFINED_SIZE_T;
|
size_t casePosInList = cvf::UNDEFINED_SIZE_T;
|
||||||
|
|
||||||
|
CurveData curveData = { curve->curveName(), RifEclipseSummaryAddress(), curve->yValues() };
|
||||||
|
|
||||||
if (casePosInList == cvf::UNDEFINED_SIZE_T)
|
if (casePosInList == cvf::UNDEFINED_SIZE_T)
|
||||||
{
|
{
|
||||||
std::vector<time_t> curveTimeSteps = curve->timeSteps();
|
timeSteps.push_back(curve->timeSteps());
|
||||||
timeSteps.push_back(curveTimeSteps);
|
allCurveData.push_back(std::vector<CurveData>({ curveData }));
|
||||||
|
|
||||||
std::vector<std::vector<double> > curveDataForCase;
|
|
||||||
std::vector<double> curveYData = curve->yValues();
|
|
||||||
curveDataForCase.push_back(curveYData);
|
|
||||||
allCurveData.push_back(curveDataForCase);
|
|
||||||
|
|
||||||
std::vector<QString> curveNamesForCase;
|
|
||||||
curveNamesForCase.push_back(curve->curveName());
|
|
||||||
allCurveNames.push_back(curveNamesForCase);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::vector<double> curveYData = curve->yValues();
|
allCurveData[casePosInList].push_back(curveData);
|
||||||
allCurveData[casePosInList].push_back(curveYData);
|
|
||||||
|
|
||||||
QString curveName = curve->curveName();
|
|
||||||
allCurveNames[casePosInList].push_back(curveName);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t i = 0; i < timeSteps.size(); i++) //cases
|
for (size_t i = 0; i < timeSteps.size(); i++) //cases
|
||||||
{
|
{
|
||||||
|
// Data for export
|
||||||
|
std::vector<time_t> expTimeSteps;
|
||||||
|
std::vector<CurveData> expCurveData;
|
||||||
|
|
||||||
out += "\n\n";
|
out += "\n\n";
|
||||||
|
|
||||||
for (size_t j = 0; j < timeSteps[i].size(); j++) //time steps & data points
|
prepareCaseCurvesForExport(resamplingPeriod, timeSteps[i], allCurveData[i], &expTimeSteps, &expCurveData);
|
||||||
{
|
appendToExportData(out, expTimeSteps, expCurveData);
|
||||||
if (j == 0)
|
|
||||||
{
|
|
||||||
out += "Date and time";
|
|
||||||
for (size_t k = 0; k < allCurveNames[i].size(); k++) // curves
|
|
||||||
{
|
|
||||||
out += "\t" + (allCurveNames[i][k]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
out += "\n";
|
|
||||||
out += QDateTime::fromTime_t(timeSteps[i][j]).toUTC().toString("yyyy-MM-dd hh:mm:ss ");
|
|
||||||
|
|
||||||
for (size_t k = 0; k < allCurveData[i].size(); k++) // curves
|
|
||||||
{
|
|
||||||
out += "\t" + QString::number(allCurveData[i][k][j], 'g', 6);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1695,3 +1636,68 @@ void RimSummaryPlot::defineEditorAttribute(const caf::PdmFieldHandle* field, QSt
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void prepareCaseCurvesForExport(DateTimePeriod period,
|
||||||
|
const std::vector<time_t> &timeSteps, const std::vector<CurveData>& curveData,
|
||||||
|
std::vector<time_t>* resampledTimeSteps, std::vector<CurveData>* resampledCurveData)
|
||||||
|
{
|
||||||
|
RiaTimeHistoryCurveResampler resampler;
|
||||||
|
|
||||||
|
resampledTimeSteps->clear();
|
||||||
|
resampledCurveData->clear();
|
||||||
|
|
||||||
|
if (period != DateTimePeriod::NONE)
|
||||||
|
{
|
||||||
|
for (auto& curveDataItem : curveData)
|
||||||
|
{
|
||||||
|
resampler.setCurveData(curveDataItem.values, timeSteps);
|
||||||
|
|
||||||
|
if (curveDataItem.address.hasAccumulatedData()) resampler.resampleAndComputePeriodEndValues(period);
|
||||||
|
else resampler.resampleAndComputeWeightedMeanValues(period);
|
||||||
|
|
||||||
|
auto cd = curveDataItem;
|
||||||
|
cd.values = resampler.resampledValues();
|
||||||
|
resampledCurveData->push_back(cd);
|
||||||
|
}
|
||||||
|
|
||||||
|
*resampledTimeSteps = resampler.resampledTimeSteps();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*resampledTimeSteps = timeSteps;
|
||||||
|
*resampledCurveData = curveData;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void appendToExportData(QString& out, const std::vector<time_t>& timeSteps, const std::vector<CurveData>& curveData)
|
||||||
|
{
|
||||||
|
for (size_t j = 0; j < timeSteps.size(); j++) //time steps & data points
|
||||||
|
{
|
||||||
|
if (j == 0)
|
||||||
|
{
|
||||||
|
out += "Date and time";
|
||||||
|
for (size_t k = 0; k < curveData.size(); k++) // curves
|
||||||
|
{
|
||||||
|
out += "\t" + (curveData[k].name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out += "\n";
|
||||||
|
out += QDateTime::fromTime_t(timeSteps[j]).toUTC().toString("yyyy-MM-dd hh:mm:ss ");
|
||||||
|
|
||||||
|
for (size_t k = 0; k < curveData.size(); k++) // curves
|
||||||
|
{
|
||||||
|
QString valueText;
|
||||||
|
if (j < curveData[k].values.size())
|
||||||
|
{
|
||||||
|
valueText = QString::number(curveData[k].values[j], 'g', 6);
|
||||||
|
}
|
||||||
|
out += "\t" + valueText;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include "cafPdmChildArrayField.h"
|
#include "cafPdmChildArrayField.h"
|
||||||
|
|
||||||
#include "RiaDefines.h"
|
#include "RiaDefines.h"
|
||||||
|
#include "RiaQDateTimeTools.h"
|
||||||
|
|
||||||
#include "RifEclipseSummaryAddress.h"
|
#include "RifEclipseSummaryAddress.h"
|
||||||
|
|
||||||
@ -102,7 +103,7 @@ public:
|
|||||||
|
|
||||||
virtual QWidget* viewWidget() override;
|
virtual QWidget* viewWidget() override;
|
||||||
|
|
||||||
QString asciiDataForPlotExport() const;
|
QString asciiDataForPlotExport(DateTimePeriod resamplingPeriod = DateTimePeriod::NONE) const;
|
||||||
|
|
||||||
std::vector<RimSummaryCurve*> summaryAndEnsembleCurves() const;
|
std::vector<RimSummaryCurve*> summaryAndEnsembleCurves() const;
|
||||||
std::vector<RimSummaryCurve*> summaryCurves() const;
|
std::vector<RimSummaryCurve*> summaryCurves() const;
|
||||||
|
Loading…
Reference in New Issue
Block a user