2017-10-05 02:29:19 -05:00
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2017 Statoil ASA
//
// ResInsight is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.
//
// See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
# include "RimWellLogRftCurve.h"
2017-10-12 06:37:03 -05:00
# include "RiaApplication.h"
2017-10-05 03:49:26 -05:00
# include "RiaEclipseUnitTools.h"
2017-10-05 02:29:19 -05:00
# include "RimEclipseResultCase.h"
2017-10-12 06:37:03 -05:00
# include "RimMainPlotCollection.h"
# include "RimProject.h"
2017-10-05 02:29:19 -05:00
# include "RimTools.h"
2017-10-05 03:49:26 -05:00
# include "RimWellLogPlot.h"
2017-10-12 06:37:03 -05:00
# include "RimWellLogPlotCollection.h"
# include "RimWellPath.h"
2017-10-05 03:49:26 -05:00
# include "RigEclipseCaseData.h"
2017-10-12 06:37:03 -05:00
# include "RigEclipseWellLogExtractor.h"
# include "RigMainGrid.h"
2017-10-05 03:49:26 -05:00
# include "RigWellLogCurveData.h"
2017-10-12 06:37:03 -05:00
# include "RigWellPath.h"
# include "RigWellPathIntersectionTools.h"
2017-10-05 03:49:26 -05:00
# include "RiuLineSegmentQwtPlotCurve.h"
2017-10-05 02:29:19 -05:00
2017-10-06 06:35:49 -05:00
# include "RifEclipseRftAddress.h"
2017-10-12 06:37:03 -05:00
# include "RifReaderEclipseRft.h"
2017-10-05 02:29:19 -05:00
# include "cafPdmObject.h"
2017-10-12 06:37:03 -05:00
# include "cafVecIjk.h"
2017-10-05 02:29:19 -05:00
# include "cvfAssert.h"
2017-10-06 02:32:27 -05:00
# include <qwt_plot.h>
2017-10-05 06:49:49 -05:00
# include <QString>
2017-10-12 06:37:03 -05:00
# include <numeric>
# include <vector>
2017-10-06 06:35:49 -05:00
namespace caf
{
template < >
void caf : : AppEnum < RifEclipseRftAddress : : RftWellLogChannelName > : : setUp ( )
{
addItem ( RifEclipseRftAddress : : NONE , " NONE " , " None " ) ;
addItem ( RifEclipseRftAddress : : DEPTH , " DEPTH " , " Depth " ) ;
addItem ( RifEclipseRftAddress : : PRESSURE , " PRESSURE " , " Pressure " ) ;
addItem ( RifEclipseRftAddress : : SWAT , " SWAT " , " Water Saturation " ) ;
addItem ( RifEclipseRftAddress : : SOIL , " SOIL " , " Oil Saturation " ) ;
addItem ( RifEclipseRftAddress : : SGAS , " SGAS " , " Gas Saturation " ) ;
addItem ( RifEclipseRftAddress : : WRAT , " WRAT " , " Water Flow " ) ;
addItem ( RifEclipseRftAddress : : ORAT , " ORAT " , " Oil Flow " ) ;
addItem ( RifEclipseRftAddress : : GRAT , " GRAT " , " Gas flow " ) ;
setDefault ( RifEclipseRftAddress : : NONE ) ;
}
}
2017-10-05 02:29:19 -05:00
CAF_PDM_SOURCE_INIT ( RimWellLogRftCurve , " WellLogRftCurve " ) ;
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimWellLogRftCurve : : RimWellLogRftCurve ( )
{
CAF_PDM_InitObject ( " Well Log RFT Curve " , " " , " " , " " ) ;
CAF_PDM_InitFieldNoDefault ( & m_eclipseResultCase , " CurveEclipseResultCase " , " Eclipse Result Case " , " " , " " , " " ) ;
m_eclipseResultCase . uiCapability ( ) - > setUiTreeChildrenHidden ( true ) ;
CAF_PDM_InitFieldNoDefault ( & m_timeStep , " TimeStep " , " Time Step " , " " , " " , " " ) ;
CAF_PDM_InitFieldNoDefault ( & m_wellName , " WellName " , " Well Name " , " " , " " , " " ) ;
2017-10-06 06:35:49 -05:00
2017-10-05 02:29:19 -05:00
CAF_PDM_InitFieldNoDefault ( & m_wellLogChannelName , " WellLogChannelName " , " Well Property " , " " , " " , " " ) ;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimWellLogRftCurve : : ~ RimWellLogRftCurve ( )
{
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RimWellLogRftCurve : : wellName ( ) const
{
return m_wellName ;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RimWellLogRftCurve : : wellLogChannelName ( ) const
{
2017-10-06 06:35:49 -05:00
return m_wellLogChannelName ( ) . text ( ) ;
2017-10-05 02:29:19 -05:00
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
2017-10-05 06:49:49 -05:00
void RimWellLogRftCurve : : setEclipseResultCase ( RimEclipseResultCase * eclipseResultCase )
2017-10-05 02:29:19 -05:00
{
2017-10-05 06:49:49 -05:00
m_eclipseResultCase = eclipseResultCase ;
2017-10-05 02:29:19 -05:00
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
2017-10-05 06:49:49 -05:00
RimEclipseResultCase * RimWellLogRftCurve : : eclipseResultCase ( ) const
2017-10-05 02:29:19 -05:00
{
2017-10-05 06:49:49 -05:00
return m_eclipseResultCase ;
2017-10-05 02:29:19 -05:00
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
2017-10-05 06:49:49 -05:00
void RimWellLogRftCurve : : setRftAddress ( RifEclipseRftAddress address )
2017-10-05 02:29:19 -05:00
{
2017-10-05 06:49:49 -05:00
m_timeStep = address . timeStep ( ) ;
m_wellName = address . wellName ( ) ;
m_wellLogChannelName = address . wellLogChannelName ( ) ;
2017-10-05 02:29:19 -05:00
}
//--------------------------------------------------------------------------------------------------
2017-10-06 07:20:01 -05:00
///
//--------------------------------------------------------------------------------------------------
RifEclipseRftAddress RimWellLogRftCurve : : rftAddress ( ) const
{
return RifEclipseRftAddress ( m_wellName , m_timeStep , m_wellLogChannelName ( ) ) ;
}
2017-10-09 05:03:18 -05:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimWellLogRftCurve : : setDefaultAddress ( QString wellName )
{
RifReaderEclipseRft * reader = rftReader ( ) ;
if ( ! reader ) return ;
bool wellNameHasRftData = false ;
std : : set < QString > wellNames = reader - > wellNames ( ) ;
for ( const QString & wellNameWithRft : wellNames )
{
if ( wellName = = wellNameWithRft )
{
wellNameHasRftData = true ;
m_wellName = wellName ;
break ;
}
}
2017-11-01 05:47:47 -05:00
if ( ! wellNameHasRftData )
{
m_wellLogChannelName = RifEclipseRftAddress : : NONE ;
m_timeStep = QDateTime ( ) ;
return ;
}
2017-10-09 05:03:18 -05:00
m_wellLogChannelName = RifEclipseRftAddress : : PRESSURE ;
std : : vector < QDateTime > timeSteps = reader - > availableTimeSteps ( m_wellName , m_wellLogChannelName ( ) ) ;
if ( timeSteps . size ( ) > 0 )
{
m_timeStep = timeSteps [ 0 ] ;
}
2017-10-27 05:15:48 -05:00
else
{
m_timeStep = QDateTime ( ) ;
}
2017-10-09 05:03:18 -05:00
}
2017-10-10 01:46:12 -05:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimWellLogRftCurve : : updateWellChannelNameAndTimeStep ( )
{
if ( ! m_timeStep ( ) . isValid ( ) | | m_wellLogChannelName ( ) = = RifEclipseRftAddress : : NONE )
{
setDefaultAddress ( m_wellName ) ;
return ;
}
RifReaderEclipseRft * reader = rftReader ( ) ;
if ( ! reader ) return ;
2017-10-31 09:06:17 -05:00
std : : vector < RifEclipseRftAddress : : RftWellLogChannelName > channelNames = reader - > availableWellLogChannels ( m_wellName ) ;
2017-10-10 01:46:12 -05:00
2017-10-31 09:06:17 -05:00
if ( channelNames . empty ( ) )
2017-10-10 01:46:12 -05:00
{
2017-10-31 09:06:17 -05:00
m_wellLogChannelName = RifEclipseRftAddress : : NONE ;
2017-10-10 01:46:12 -05:00
}
2017-10-31 09:06:17 -05:00
else if ( std : : find ( channelNames . begin ( ) , channelNames . end ( ) , m_wellLogChannelName ( ) ) = = channelNames . end ( ) )
2017-10-10 01:46:12 -05:00
{
2017-10-31 09:06:17 -05:00
m_wellLogChannelName = RifEclipseRftAddress : : PRESSURE ;
2017-10-10 01:46:12 -05:00
}
2017-10-31 09:06:17 -05:00
std : : vector < QDateTime > timeSteps = reader - > availableTimeSteps ( m_wellName , m_wellLogChannelName ( ) ) ;
2017-10-10 01:46:12 -05:00
2017-10-31 09:06:17 -05:00
if ( timeSteps . empty ( ) )
2017-10-10 01:46:12 -05:00
{
2017-10-31 09:06:17 -05:00
m_timeStep = QDateTime ( ) ;
2017-10-10 01:46:12 -05:00
}
2017-10-31 09:06:17 -05:00
else if ( std : : find ( timeSteps . begin ( ) , timeSteps . end ( ) , m_timeStep ( ) ) = = timeSteps . end ( ) )
2017-10-10 01:46:12 -05:00
{
2017-10-31 09:06:17 -05:00
m_timeStep = timeSteps [ 0 ] ;
2017-10-10 01:46:12 -05:00
}
}
2017-10-06 07:20:01 -05:00
//--------------------------------------------------------------------------------------------------
2017-10-05 02:29:19 -05:00
///
//--------------------------------------------------------------------------------------------------
QString RimWellLogRftCurve : : createCurveAutoName ( )
{
2017-10-06 07:38:20 -05:00
QString name ;
if ( m_eclipseResultCase )
{
name + = m_eclipseResultCase - > caseName ( ) ;
}
if ( wellName ( ) ! = " " )
{
name + = " , " ;
name + = wellName ( ) ;
}
if ( wellLogChannelName ( ) ! = caf : : AppEnum < RifEclipseRftAddress : : RftWellLogChannelName > : : text ( RifEclipseRftAddress : : NONE ) )
{
name + = " , " ;
RifEclipseRftAddress : : RftWellLogChannelName channelNameEnum = caf : : AppEnum < RifEclipseRftAddress : : RftWellLogChannelName > : : fromText ( wellLogChannelName ( ) ) ;
name + = caf : : AppEnum < RifEclipseRftAddress : : RftWellLogChannelName > : : uiText ( channelNameEnum ) ;
}
if ( ! m_timeStep ( ) . isNull ( ) )
{
QString dateFormat = " dd MMM yyyy " ;
name + = " , " ;
name + = m_timeStep ( ) . toString ( dateFormat ) ;
}
2017-10-05 02:29:19 -05:00
return name ;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimWellLogRftCurve : : onLoadDataAndUpdate ( bool updateParentPlot )
{
2017-10-05 03:49:26 -05:00
RimWellLogCurve : : updateCurvePresentation ( ) ;
if ( isCurveVisible ( ) )
{
m_curveData = new RigWellLogCurveData ;
RimWellLogPlot * wellLogPlot ;
firstAncestorOrThisOfType ( wellLogPlot ) ;
CVF_ASSERT ( wellLogPlot ) ;
2017-10-12 06:37:03 -05:00
std : : vector < double > measuredDepthVector = measuredDepthValues ( ) ;
2017-10-31 09:06:17 -05:00
std : : vector < double > tvDepthVector = tvDepthValues ( ) ;
std : : vector < double > values = xValues ( ) ;
2017-10-05 14:25:45 -05:00
2017-11-01 07:58:46 -05:00
if ( values . empty ( ) | |
values . size ( ) ! = tvDepthVector . size ( ) | |
values . size ( ) ! = measuredDepthVector . size ( ) )
{
this - > detachQwtCurve ( ) ;
return ;
}
2017-10-12 06:37:03 -05:00
m_curveData - > setValuesWithTVD ( values , measuredDepthVector , tvDepthVector , RiaEclipseUnitTools : : depthUnit ( m_eclipseResultCase - > eclipseCaseData ( ) - > unitsType ( ) ) , false ) ;
2017-10-05 03:49:26 -05:00
RiaDefines : : DepthUnitType displayUnit = RiaDefines : : UNIT_METER ;
if ( wellLogPlot )
{
displayUnit = wellLogPlot - > depthUnit ( ) ;
}
2017-10-12 06:37:03 -05:00
if ( wellLogPlot - > depthType ( ) = = RimWellLogPlot : : MEASURED_DEPTH )
{
m_qwtPlotCurve - > setSamples ( m_curveData - > xPlotValues ( ) . data ( ) , m_curveData - > measuredDepthPlotValues ( displayUnit ) . data ( ) , static_cast < int > ( m_curveData - > xPlotValues ( ) . size ( ) ) ) ;
}
else
{
m_qwtPlotCurve - > setSamples ( m_curveData - > xPlotValues ( ) . data ( ) , m_curveData - > trueDepthPlotValues ( displayUnit ) . data ( ) , static_cast < int > ( m_curveData - > xPlotValues ( ) . size ( ) ) ) ;
}
2017-10-05 03:49:26 -05:00
m_qwtPlotCurve - > setLineSegmentStartStopIndices ( m_curveData - > polylineStartStopIndices ( ) ) ;
2017-10-05 02:29:19 -05:00
2017-10-05 03:49:26 -05:00
updateZoomInParentPlot ( ) ;
2017-10-06 02:32:27 -05:00
if ( m_parentQwtPlot ) m_parentQwtPlot - > replot ( ) ;
2017-10-05 03:49:26 -05:00
}
2017-10-05 02:29:19 -05:00
}
2017-10-05 06:49:49 -05:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimWellLogRftCurve : : defineUiOrdering ( QString uiConfigName , caf : : PdmUiOrdering & uiOrdering )
{
RimPlotCurve : : updateOptionSensitivity ( ) ;
caf : : PdmUiGroup * curveDataGroup = uiOrdering . addNewGroup ( " Curve Data " ) ;
2017-10-05 14:25:45 -05:00
curveDataGroup - > add ( & m_eclipseResultCase ) ;
2017-10-05 06:49:49 -05:00
curveDataGroup - > add ( & m_wellName ) ;
curveDataGroup - > add ( & m_wellLogChannelName ) ;
curveDataGroup - > add ( & m_timeStep ) ;
caf : : PdmUiGroup * appearanceGroup = uiOrdering . addNewGroup ( " Appearance " ) ;
RimPlotCurve : : appearanceUiOrdering ( * appearanceGroup ) ;
caf : : PdmUiGroup * nameGroup = uiOrdering . addNewGroup ( " Curve Name " ) ;
nameGroup - > add ( & m_showLegend ) ;
RimPlotCurve : : curveNameUiOrdering ( * nameGroup ) ;
}
2017-10-05 02:29:19 -05:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QList < caf : : PdmOptionItemInfo > RimWellLogRftCurve : : calculateValueOptions ( const caf : : PdmFieldHandle * fieldNeedingOptions , bool * useOptionsOnly )
{
QList < caf : : PdmOptionItemInfo > options ;
options = RimWellLogCurve : : calculateValueOptions ( fieldNeedingOptions , useOptionsOnly ) ;
if ( options . size ( ) > 0 ) return options ;
if ( fieldNeedingOptions = = & m_eclipseResultCase )
{
RimTools : : caseOptionItems ( & options ) ;
options . push_front ( caf : : PdmOptionItemInfo ( " None " , nullptr ) ) ;
}
2017-10-05 14:25:45 -05:00
else if ( fieldNeedingOptions = = & m_wellName )
2017-10-05 06:49:49 -05:00
{
2017-10-06 02:32:27 -05:00
options . push_back ( caf : : PdmOptionItemInfo ( " None " , " " ) ) ;
2017-10-05 14:25:45 -05:00
RifReaderEclipseRft * reader = rftReader ( ) ;
if ( reader )
{
std : : set < QString > wellNames = reader - > wellNames ( ) ;
for ( const QString & name : wellNames )
{
options . push_back ( caf : : PdmOptionItemInfo ( name , name , false , QIcon ( " :/Well.png " ) ) ) ;
}
}
}
else if ( fieldNeedingOptions = = & m_wellLogChannelName )
{
2017-10-06 06:35:49 -05:00
RifReaderEclipseRft * reader = rftReader ( ) ;
if ( reader )
2017-10-05 14:25:45 -05:00
{
2017-10-06 06:35:49 -05:00
for ( const RifEclipseRftAddress : : RftWellLogChannelName & channelName : reader - > availableWellLogChannels ( m_wellName ) )
{
options . push_back ( caf : : PdmOptionItemInfo ( caf : : AppEnum < RifEclipseRftAddress : : RftWellLogChannelName > : : uiText ( channelName ) , channelName ) ) ;
}
2017-10-05 14:25:45 -05:00
}
2017-10-27 09:00:47 -05:00
if ( options . empty ( ) )
{
options . push_back ( caf : : PdmOptionItemInfo ( caf : : AppEnum < RifEclipseRftAddress : : RftWellLogChannelName > : : uiText ( RifEclipseRftAddress : : NONE ) , RifEclipseRftAddress : : NONE ) ) ;
}
2017-10-05 06:49:49 -05:00
}
2017-10-05 14:25:45 -05:00
else if ( fieldNeedingOptions = = & m_timeStep )
2017-10-05 06:49:49 -05:00
{
2017-10-05 14:25:45 -05:00
RifReaderEclipseRft * reader = rftReader ( ) ;
if ( reader )
{
2017-10-06 07:38:20 -05:00
QString dateFormat = " dd MMM yyyy " ;
2017-10-06 06:35:49 -05:00
std : : vector < QDateTime > timeStamps = reader - > availableTimeSteps ( m_wellName , m_wellLogChannelName ( ) ) ;
2017-10-05 14:25:45 -05:00
for ( const QDateTime & dt : timeStamps )
{
2017-10-06 07:38:20 -05:00
options . push_back ( caf : : PdmOptionItemInfo ( dt . toString ( dateFormat ) , dt ) ) ;
2017-10-05 14:25:45 -05:00
}
}
2017-10-05 06:49:49 -05:00
2017-10-06 02:32:27 -05:00
options . push_back ( caf : : PdmOptionItemInfo ( " None " , QDateTime ( ) ) ) ;
2017-10-05 06:49:49 -05:00
}
2017-10-05 02:29:19 -05:00
return options ;
}
2017-10-05 04:08:30 -05:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimWellLogRftCurve : : fieldChangedByUi ( const caf : : PdmFieldHandle * changedField , const QVariant & oldValue , const QVariant & newValue )
{
2017-10-31 09:06:17 -05:00
m_idxInWellPathToIdxInRftFile . clear ( ) ;
2017-10-05 04:08:30 -05:00
RimWellLogCurve : : fieldChangedByUi ( changedField , oldValue , newValue ) ;
2017-10-05 14:25:45 -05:00
if ( changedField = = & m_eclipseResultCase )
{
2017-10-10 01:46:12 -05:00
m_timeStep = QDateTime ( ) ;
m_wellName = " " ;
m_wellLogChannelName = RifEclipseRftAddress : : NONE ;
2017-10-05 14:25:45 -05:00
this - > loadDataAndUpdate ( true ) ;
}
else if ( changedField = = & m_wellName )
2017-10-05 04:08:30 -05:00
{
2017-10-10 01:46:12 -05:00
updateWellChannelNameAndTimeStep ( ) ;
2017-10-05 04:08:30 -05:00
this - > loadDataAndUpdate ( true ) ;
}
else if ( changedField = = & m_wellLogChannelName )
{
2017-10-27 05:15:48 -05:00
if ( m_wellLogChannelName = = RifEclipseRftAddress : : NONE )
{
m_timeStep = QDateTime ( ) ;
}
2017-10-05 04:08:30 -05:00
this - > loadDataAndUpdate ( true ) ;
}
else if ( changedField = = & m_timeStep )
{
this - > loadDataAndUpdate ( true ) ;
}
}
2017-10-05 02:29:19 -05:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RifReaderEclipseRft * RimWellLogRftCurve : : rftReader ( ) const
{
if ( ! m_eclipseResultCase ( ) ) return nullptr ;
return m_eclipseResultCase ( ) - > rftReader ( ) ;
2017-10-05 04:08:30 -05:00
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
2017-10-31 09:06:17 -05:00
RigEclipseWellLogExtractor * RimWellLogRftCurve : : extractor ( )
2017-10-05 04:08:30 -05:00
{
RifReaderEclipseRft * reader = rftReader ( ) ;
2017-10-31 09:06:17 -05:00
if ( ! reader ) return nullptr ;
2017-10-05 04:08:30 -05:00
2017-10-31 09:06:17 -05:00
RimMainPlotCollection * mainPlotCollection ;
this - > firstAncestorOrThisOfTypeAsserted ( mainPlotCollection ) ;
2017-10-05 04:08:30 -05:00
2017-10-31 09:06:17 -05:00
RimWellLogPlotCollection * wellLogCollection = mainPlotCollection - > wellLogPlotCollection ( ) ;
if ( ! wellLogCollection ) return nullptr ;
2017-10-05 04:08:30 -05:00
2017-10-31 09:06:17 -05:00
RigEclipseWellLogExtractor * eclExtractor = nullptr ;
2017-10-05 04:08:30 -05:00
2017-10-31 09:06:17 -05:00
RimProject * proj = RiaApplication : : instance ( ) - > project ( ) ;
RimWellPath * wellPath = proj - > wellPathFromSimulationWell ( m_wellName ( ) ) ;
eclExtractor = wellLogCollection - > findOrCreateExtractor ( wellPath , m_eclipseResultCase ) ;
if ( ! eclExtractor )
{
std : : vector < const RigWellPath * > wellPaths = proj - > simulationWellBranches ( m_wellName ( ) ) ;
if ( wellPaths . size ( ) = = 0 ) return nullptr ;
eclExtractor = wellLogCollection - > findOrCreateSimWellExtractor ( m_wellName ( ) , QString ( " Find or create sim well extractor " ) , wellPaths [ 0 ] , m_eclipseResultCase - > eclipseCaseData ( ) ) ;
}
return eclExtractor ;
2017-10-05 04:08:30 -05:00
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
2017-10-31 09:06:17 -05:00
bool RimWellLogRftCurve : : createWellPathIdxToRftFileIdxMapping ( )
2017-10-05 04:08:30 -05:00
{
2017-10-31 09:06:17 -05:00
if ( ! m_idxInWellPathToIdxInRftFile . empty ( ) )
{
return true ;
}
RigEclipseWellLogExtractor * eclExtractor = extractor ( ) ;
if ( ! eclExtractor ) return false ;
2017-10-05 04:08:30 -05:00
2017-10-31 09:06:17 -05:00
std : : vector < CellIntersectionInfo > intersections = eclExtractor - > intersectionInfo ( ) ;
2017-11-01 05:47:47 -05:00
if ( intersections . empty ( ) ) return false ;
2017-10-31 09:06:17 -05:00
std : : map < size_t , size_t > globCellIndicesToIndexInWell ;
2017-11-01 05:47:47 -05:00
for ( size_t idx = 0 ; idx < intersections . size ( ) ; idx + + )
2017-10-31 09:06:17 -05:00
{
2017-11-01 05:47:47 -05:00
globCellIndicesToIndexInWell [ intersections [ idx ] . globCellIndex ] = idx ;
2017-10-31 09:06:17 -05:00
}
2017-10-05 04:08:30 -05:00
2017-10-12 06:37:03 -05:00
RifEclipseRftAddress depthAddress ( m_wellName ( ) , m_timeStep , RifEclipseRftAddress : : DEPTH ) ;
2017-10-31 09:06:17 -05:00
std : : vector < caf : : VecIjk > rftIndices ;
rftReader ( ) - > cellIndices ( depthAddress , & rftIndices ) ;
const RigMainGrid * mainGrid = eclExtractor - > caseData ( ) - > mainGrid ( ) ;
2017-11-01 05:47:47 -05:00
for ( size_t idx = 0 ; idx < rftIndices . size ( ) ; idx + + )
2017-10-31 09:06:17 -05:00
{
2017-11-01 05:47:47 -05:00
caf : : VecIjk ijkIndex = rftIndices [ idx ] ;
2017-10-31 09:06:17 -05:00
size_t globalCellIndex = mainGrid - > cellIndexFromIJK ( ijkIndex . i ( ) , ijkIndex . j ( ) , ijkIndex . k ( ) ) ;
2017-10-05 04:08:30 -05:00
2017-11-01 05:47:47 -05:00
if ( globCellIndicesToIndexInWell . find ( globalCellIndex ) ! = globCellIndicesToIndexInWell . end ( ) )
{
m_idxInWellPathToIdxInRftFile [ globCellIndicesToIndexInWell [ globalCellIndex ] ] = idx ;
}
2017-10-31 09:06:17 -05:00
}
return true ;
2017-10-12 06:37:03 -05:00
}
2017-10-31 09:06:17 -05:00
2017-10-12 06:37:03 -05:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
2017-10-31 09:06:17 -05:00
size_t RimWellLogRftCurve : : rftFileIndex ( size_t wellPathIndex )
2017-10-12 06:37:03 -05:00
{
2017-10-31 09:06:17 -05:00
if ( m_idxInWellPathToIdxInRftFile . empty ( ) )
{
createWellPathIdxToRftFileIdxMapping ( ) ;
}
2017-10-05 04:08:30 -05:00
2017-10-31 09:06:17 -05:00
if ( m_idxInWellPathToIdxInRftFile . find ( wellPathIndex ) = = m_idxInWellPathToIdxInRftFile . end ( ) )
{
return cvf : : UNDEFINED_SIZE_T ;
}
2017-10-12 06:37:03 -05:00
2017-10-31 09:06:17 -05:00
return m_idxInWellPathToIdxInRftFile [ wellPathIndex ] ;
}
2017-10-12 06:37:03 -05:00
2017-10-31 09:06:17 -05:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std : : vector < size_t > RimWellLogRftCurve : : sortedIndicesInRftFile ( )
{
if ( m_idxInWellPathToIdxInRftFile . empty ( ) )
{
createWellPathIdxToRftFileIdxMapping ( ) ;
}
2017-10-12 06:37:03 -05:00
2017-10-31 09:06:17 -05:00
std : : vector < size_t > indices ;
for ( auto it = m_idxInWellPathToIdxInRftFile . begin ( ) ; it ! = m_idxInWellPathToIdxInRftFile . end ( ) ; it + + )
{
indices . push_back ( it - > second ) ;
}
2017-10-12 06:37:03 -05:00
2017-10-31 09:06:17 -05:00
return indices ;
}
2017-10-12 06:37:03 -05:00
2017-10-31 09:06:17 -05:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std : : vector < double > RimWellLogRftCurve : : xValues ( )
{
RifReaderEclipseRft * reader = rftReader ( ) ;
std : : vector < double > values ;
2017-10-12 06:37:03 -05:00
2017-10-31 09:06:17 -05:00
if ( ! reader ) return values ;
2017-10-12 06:37:03 -05:00
2017-10-31 09:06:17 -05:00
RifEclipseRftAddress address ( m_wellName ( ) , m_timeStep , m_wellLogChannelName ( ) ) ;
2017-10-12 06:37:03 -05:00
2017-10-31 09:06:17 -05:00
reader - > values ( address , & values ) ;
2017-10-12 06:37:03 -05:00
2017-10-31 09:06:17 -05:00
bool wellPathExists = createWellPathIdxToRftFileIdxMapping ( ) ;
2017-10-12 06:37:03 -05:00
2017-10-31 09:06:17 -05:00
if ( wellPathExists )
{
std : : vector < double > valuesSorted ;
2017-10-12 06:37:03 -05:00
2017-10-31 09:06:17 -05:00
for ( size_t idx : sortedIndicesInRftFile ( ) )
{
if ( idx < values . size ( ) )
{
valuesSorted . push_back ( ( values . at ( idx ) ) ) ;
}
}
return valuesSorted ;
}
else
2017-10-12 06:37:03 -05:00
{
2017-10-31 09:06:17 -05:00
return values ;
2017-10-12 06:37:03 -05:00
}
2017-10-31 09:06:17 -05:00
}
2017-10-12 06:37:03 -05:00
2017-10-31 09:06:17 -05:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std : : vector < double > RimWellLogRftCurve : : tvDepthValues ( )
{
RifReaderEclipseRft * reader = rftReader ( ) ;
std : : vector < double > values ;
if ( ! reader ) return values ;
2017-10-12 06:37:03 -05:00
RifEclipseRftAddress depthAddress ( m_wellName ( ) , m_timeStep , RifEclipseRftAddress : : DEPTH ) ;
2017-10-31 09:06:17 -05:00
reader - > values ( depthAddress , & values ) ;
2017-10-12 06:37:03 -05:00
2017-10-31 09:06:17 -05:00
bool wellPathExists = createWellPathIdxToRftFileIdxMapping ( ) ;
if ( wellPathExists )
2017-10-12 06:37:03 -05:00
{
2017-10-31 09:06:17 -05:00
std : : vector < double > valuesSorted ;
for ( size_t idx : sortedIndicesInRftFile ( ) )
{
if ( idx < values . size ( ) )
{
valuesSorted . push_back ( ( values . at ( idx ) ) ) ;
}
}
return valuesSorted ;
}
else
{
return values ;
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std : : vector < double > RimWellLogRftCurve : : measuredDepthValues ( )
{
std : : vector < double > measuredDepthForCells ;
RigEclipseWellLogExtractor * eclExtractor = extractor ( ) ;
2017-10-12 06:37:03 -05:00
2017-10-31 09:06:17 -05:00
if ( ! eclExtractor ) return measuredDepthForCells ;
2017-10-12 06:37:03 -05:00
2017-10-31 09:06:17 -05:00
std : : vector < double > measuredDepthForIntersections = eclExtractor - > measuredDepth ( ) ;
2017-11-01 05:47:47 -05:00
if ( measuredDepthForIntersections . empty ( ) )
{
return measuredDepthForCells ;
}
2017-10-31 09:06:17 -05:00
std : : vector < size_t > globCellIndices = eclExtractor - > intersectedCellsGlobIdx ( ) ;
2017-11-01 05:47:47 -05:00
2017-10-31 09:06:17 -05:00
for ( size_t i = 0 ; i < globCellIndices . size ( ) - 1 ; i = i + 2 )
{
double sum = measuredDepthForIntersections [ i ] + measuredDepthForIntersections [ i + 1 ] ;
measuredDepthForCells . push_back ( sum / 2.0 ) ;
}
std : : vector < double > measuredDepthForCellsWhichHasRftData ;
for ( size_t i = 0 ; i < measuredDepthForCells . size ( ) ; i + + )
{
if ( rftFileIndex ( i ) ! = cvf : : UNDEFINED_SIZE_T )
{
measuredDepthForCellsWhichHasRftData . push_back ( measuredDepthForCells [ i ] ) ;
}
2017-10-12 06:37:03 -05:00
}
2017-10-31 09:06:17 -05:00
return measuredDepthForCellsWhichHasRftData ;
2017-10-12 06:37:03 -05:00
}