mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
Interpolating MDvalues
This commit is contained in:
@@ -450,6 +450,7 @@ void RimWellRftPlot::updateCurvesInPlot(const std::set<RiaRftPltCurveDefinition>
|
||||
auto rftCase = curveDefToAdd.address().summaryCase();
|
||||
curve->setSummaryCase(rftCase);
|
||||
curve->setEnsemble(curveDefToAdd.address().ensemble());
|
||||
curve->setObservedFmuRftData(this->findObservedFmuData(m_wellPathNameOrSimWellName, curveDefToAdd.timeStep()));
|
||||
RifEclipseRftAddress address(m_wellPathNameOrSimWellName, curveDefToAdd.timeStep(), RifEclipseRftAddress::PRESSURE);
|
||||
curve->setRftAddress(address);
|
||||
curve->setZOrder(1);
|
||||
@@ -472,6 +473,7 @@ void RimWellRftPlot::updateCurvesInPlot(const std::set<RiaRftPltCurveDefinition>
|
||||
plotTrack->addCurve(curve);
|
||||
curve->setEnsemble(ensemble);
|
||||
curve->setRftAddress(rftAddress);
|
||||
curve->setObservedFmuRftData(this->findObservedFmuData(m_wellPathNameOrSimWellName, curveDefToAdd.timeStep()));
|
||||
curve->setZOrder(RiuQwtPlotCurve::Z_ENSEMBLE_STAT_CURVE);
|
||||
applyCurveAppearance(curve);
|
||||
auto symbol = statisticsCurveSymbolFromAddress(rftAddress);
|
||||
@@ -731,7 +733,7 @@ QList<caf::PdmOptionItemInfo> RimWellRftPlot::calculateValueOptions(const caf::P
|
||||
item.setLevel(1);
|
||||
options.push_back(item);
|
||||
}
|
||||
const std::vector<RimObservedFmuRftData*> observedFmuRftCases = RimWellPlotTools::observedFmuRftDataForWell(m_wellPathNameOrSimWellName);
|
||||
const std::vector<RimObservedFmuRftData*> observedFmuRftCases = RimWellPlotTools::observedFmuRftDataForWell(m_wellPathNameOrSimWellName);
|
||||
if (!observedFmuRftCases.empty())
|
||||
{
|
||||
options.push_back(caf::PdmOptionItemInfo::createHeader(
|
||||
@@ -1124,3 +1126,19 @@ void RimWellRftPlot::defineCurveColorsAndSymbols(const std::set<RiaRftPltCurveDe
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
RimObservedFmuRftData* RimWellRftPlot::findObservedFmuData(const QString& wellPathName, const QDateTime& timeStep) const
|
||||
{
|
||||
auto allObservedDataForWell = RimWellPlotTools::observedFmuRftDataForWell(wellPathName);
|
||||
for (auto observedData : allObservedDataForWell)
|
||||
{
|
||||
if (observedData->rftReader()->availableTimeSteps(wellPathName).count(timeStep))
|
||||
{
|
||||
return observedData;
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -116,6 +116,8 @@ private:
|
||||
void syncCurvesFromUiSelection();
|
||||
void assignWellPathToExtractionCurves();
|
||||
|
||||
RimObservedFmuRftData* findObservedFmuData(const QString& wellPathName, const QDateTime& timeStep) const;
|
||||
|
||||
std::set<RiaRftPltCurveDefinition> selectedCurveDefs() const;
|
||||
std::set<RiaRftPltCurveDefinition> curveDefsFromCurves() const;
|
||||
|
||||
@@ -161,5 +163,4 @@ private:
|
||||
std::map<RifDataSourceForRftPlt, cvf::Color3f> m_dataSourceColors;
|
||||
std::map<QDateTime, RiuQwtSymbol::PointSymbolEnum> m_timeStepSymbols;
|
||||
bool m_isOnLoad;
|
||||
|
||||
};
|
||||
|
||||
@@ -72,12 +72,12 @@ RifReaderRftInterface* RimObservedFmuRftData::rftReader()
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
bool RimObservedFmuRftData::hasWell(const QString& simWellName) const
|
||||
bool RimObservedFmuRftData::hasWell(const QString& wellPathName) const
|
||||
{
|
||||
std::vector<QString> allWells = wells();
|
||||
for (const QString& well : allWells)
|
||||
{
|
||||
if (well == simWellName)
|
||||
if (well == wellPathName)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -36,9 +36,11 @@ public:
|
||||
void createRftReaderInterface();
|
||||
RifReaderRftInterface* rftReader();
|
||||
|
||||
bool hasWell(const QString& simWellName) const;
|
||||
bool hasWell(const QString& wellPathName) const;
|
||||
std::vector<QString> wells() const;
|
||||
|
||||
std::vector<std::pair<double, double>> derivedWellPathTvdMd(const QString& wellPathName) const;
|
||||
|
||||
private:
|
||||
cvf::ref<RifReaderFmuRft> m_fmuRftReader;
|
||||
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
#include "RigMainGrid.h"
|
||||
#include "RigWellLogCurveData.h"
|
||||
#include "RigWellPath.h"
|
||||
#include "RigWellPathGeometryTools.h"
|
||||
#include "RigWellPathIntersectionTools.h"
|
||||
|
||||
#include "RimEclipseResultCase.h"
|
||||
@@ -119,6 +120,7 @@ RimWellLogRftCurve::RimWellLogRftCurve()
|
||||
CAF_PDM_InitFieldNoDefault(&m_wellLogChannelName, "WellLogChannelName", "Well Property", "", "", "");
|
||||
|
||||
m_isUsingPseudoLength = false;
|
||||
m_derivingMDFromObservedData = false;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@@ -405,6 +407,15 @@ void RimWellLogRftCurve::onLoadDataAndUpdate(bool updateParentPlot)
|
||||
CVF_ASSERT(false && "Need to have either an eclipse result case, a summary case or an ensemble");
|
||||
}
|
||||
|
||||
if (tvDepthVector.size() != measuredDepthVector.size())
|
||||
{
|
||||
measuredDepthVector = interpolatedMeasuredDepthValuesFromObservedData(tvDepthVector);
|
||||
if (measuredDepthVector.size() == tvDepthVector.size())
|
||||
{
|
||||
m_derivingMDFromObservedData = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (tvDepthVector.size() != measuredDepthVector.size())
|
||||
{
|
||||
m_isUsingPseudoLength = true;
|
||||
@@ -432,9 +443,10 @@ void RimWellLogRftCurve::onLoadDataAndUpdate(bool updateParentPlot)
|
||||
m_curveData->trueDepthPlotValues(displayUnit).data(),
|
||||
static_cast<int>(m_curveData->xPlotValues().size()));
|
||||
m_isUsingPseudoLength = false;
|
||||
m_derivingMDFromObservedData = false;
|
||||
}
|
||||
|
||||
if (m_isUsingPseudoLength)
|
||||
if (m_isUsingPseudoLength || m_derivingMDFromObservedData)
|
||||
{
|
||||
RimWellLogTrack* wellLogTrack;
|
||||
firstAncestorOrThisOfType(wellLogTrack);
|
||||
@@ -443,7 +455,10 @@ void RimWellLogRftCurve::onLoadDataAndUpdate(bool updateParentPlot)
|
||||
RiuWellLogTrack* viewer = wellLogTrack->viewer();
|
||||
if (viewer)
|
||||
{
|
||||
viewer->setDepthTitle("PL/" + wellLogPlot->depthPlotTitle());
|
||||
if (m_derivingMDFromObservedData)
|
||||
viewer->setDepthTitle("OBS/" + wellLogPlot->depthPlotTitle());
|
||||
else
|
||||
viewer->setDepthTitle("PL/" + wellLogPlot->depthPlotTitle());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -835,7 +850,7 @@ std::vector<double> RimWellLogRftCurve::tvDepthValues()
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
std::vector<double> RimWellLogRftCurve::measuredDepthValues()
|
||||
{
|
||||
if (m_observedFmuRftData)
|
||||
if (m_observedFmuRftData && !m_ensemble && !m_summaryCase)
|
||||
{
|
||||
RifReaderRftInterface* reader = rftReader();
|
||||
std::vector<double> values;
|
||||
@@ -881,3 +896,29 @@ std::vector<double> RimWellLogRftCurve::measuredDepthValues()
|
||||
|
||||
return measuredDepthForCellsWhichHasRftData;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
std::vector<double> RimWellLogRftCurve::interpolatedMeasuredDepthValuesFromObservedData(const std::vector<double>& tvDepthValues)
|
||||
{
|
||||
std::vector<double> interpolatedMdValues;
|
||||
if (m_observedFmuRftData)
|
||||
{
|
||||
RifReaderRftInterface* reader = m_observedFmuRftData->rftReader();
|
||||
if (reader)
|
||||
{
|
||||
std::vector<double> tvdValuesOfObbservedData;
|
||||
std::vector<double> mdValuesOfObbservedData;
|
||||
|
||||
RifEclipseRftAddress tvdAddress(m_wellName(), m_timeStep, RifEclipseRftAddress::TVD);
|
||||
RifEclipseRftAddress mdAddress(m_wellName(), m_timeStep, RifEclipseRftAddress::MD);
|
||||
|
||||
reader->values(tvdAddress, &tvdValuesOfObbservedData);
|
||||
reader->values(mdAddress, &mdValuesOfObbservedData);
|
||||
interpolatedMdValues = RigWellPathGeometryTools::interpolateMdFromTvd(mdValuesOfObbservedData, tvdValuesOfObbservedData, tvDepthValues);
|
||||
CVF_ASSERT(interpolatedMdValues.size() == tvDepthValues.size());
|
||||
}
|
||||
}
|
||||
return interpolatedMdValues;
|
||||
}
|
||||
|
||||
@@ -96,6 +96,7 @@ private:
|
||||
std::vector<double> xValues();
|
||||
std::vector<double> tvDepthValues();
|
||||
std::vector<double> measuredDepthValues();
|
||||
std::vector<double> interpolatedMeasuredDepthValuesFromObservedData(const std::vector<double>& tvDepthValues);
|
||||
|
||||
private:
|
||||
caf::PdmPtrField<RimEclipseResultCase*> m_eclipseResultCase;
|
||||
@@ -109,6 +110,7 @@ private:
|
||||
|
||||
std::map<size_t, size_t> m_idxInWellPathToIdxInRftFile;
|
||||
bool m_isUsingPseudoLength;
|
||||
bool m_derivingMDFromObservedData;
|
||||
caf::PdmField<caf::AppEnum<RifEclipseRftAddress::RftWellLogChannelType>> m_wellLogChannelName;
|
||||
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user