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 ;
}
}
if ( ! wellNameHasRftData ) return ;
m_wellLogChannelName = RifEclipseRftAddress : : PRESSURE ;
std : : vector < QDateTime > timeSteps = reader - > availableTimeSteps ( m_wellName , m_wellLogChannelName ( ) ) ;
if ( timeSteps . size ( ) > 0 )
{
m_timeStep = timeSteps [ 0 ] ;
}
}
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 ;
std : : vector < QDateTime > timeSteps = reader - > availableTimeSteps ( m_wellName , m_wellLogChannelName ( ) ) ;
if ( timeSteps . empty ( ) )
{
m_timeStep = QDateTime ( ) ;
}
else if ( std : : find ( timeSteps . begin ( ) , timeSteps . end ( ) , m_timeStep ( ) ) = = timeSteps . end ( ) )
{
m_timeStep = timeSteps [ 0 ] ;
}
std : : vector < RifEclipseRftAddress : : RftWellLogChannelName > channelNames = reader - > availableWellLogChannels ( m_wellName ) ;
if ( channelNames . empty ( ) )
{
m_wellLogChannelName = RifEclipseRftAddress : : NONE ;
}
else if ( std : : find ( channelNames . begin ( ) , channelNames . end ( ) , m_wellLogChannelName ( ) ) = = channelNames . end ( ) )
{
m_wellLogChannelName = RifEclipseRftAddress : : PRESSURE ;
}
}
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 ) ;
std : : vector < double > values = xValues ( ) ;
2017-10-12 06:37:03 -05:00
std : : vector < double > tvDepthVector = tvDepthValues ( ) ;
std : : vector < double > measuredDepthVector = measuredDepthValues ( ) ;
2017-10-05 14:25:45 -05:00
2017-10-12 06:37:03 -05:00
if ( values . empty ( ) ) return ;
if ( values . size ( ) ! = tvDepthVector . size ( ) ) return ;
if ( values . size ( ) ! = measuredDepthVector . size ( ) ) return ;
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
options . push_back ( caf : : PdmOptionItemInfo ( caf : : AppEnum < RifEclipseRftAddress : : RftWellLogChannelName > : : uiText ( RifEclipseRftAddress : : NONE ) , RifEclipseRftAddress : : NONE ) ) ;
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-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 )
{
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 )
{
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-05 04:13:15 -05:00
std : : vector < double > RimWellLogRftCurve : : xValues ( ) const
2017-10-05 04:08:30 -05:00
{
RifReaderEclipseRft * reader = rftReader ( ) ;
std : : vector < double > values ;
if ( ! reader ) return values ;
2017-10-05 06:49:49 -05:00
RifEclipseRftAddress address ( m_wellName ( ) , m_timeStep , m_wellLogChannelName ( ) ) ;
2017-10-05 04:08:30 -05:00
reader - > values ( address , & values ) ;
return values ;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
2017-10-12 06:37:03 -05:00
std : : vector < double > RimWellLogRftCurve : : tvDepthValues ( ) const
2017-10-05 04:08:30 -05:00
{
RifReaderEclipseRft * reader = rftReader ( ) ;
2017-10-12 06:37:03 -05:00
std : : vector < double > tvDepthValues ;
2017-10-05 04:08:30 -05:00
2017-10-12 06:37:03 -05:00
if ( ! reader ) return tvDepthValues ;
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-05 04:08:30 -05:00
2017-10-12 06:37:03 -05:00
reader - > values ( depthAddress , & tvDepthValues ) ;
return tvDepthValues ;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std : : vector < double > RimWellLogRftCurve : : measuredDepthValues ( ) const
{
std : : vector < double > measuredDepthForCells ;
RifReaderEclipseRft * reader = rftReader ( ) ;
if ( ! reader ) return measuredDepthForCells ;
2017-10-05 04:08:30 -05:00
2017-10-12 06:37:03 -05:00
RimMainPlotCollection * mainPlotCollection ;
this - > firstAncestorOrThisOfTypeAsserted ( mainPlotCollection ) ;
RimWellLogPlotCollection * wellLogCollection = mainPlotCollection - > wellLogPlotCollection ( ) ;
if ( ! wellLogCollection ) return measuredDepthForCells ;
RigEclipseWellLogExtractor * eclExtractor = nullptr ;
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 measuredDepthForCells ;
eclExtractor = wellLogCollection - > findOrCreateSimWellExtractor ( m_wellName ( ) , QString ( " Find or create sim well extractor " ) , wellPaths [ 0 ] , m_eclipseResultCase - > eclipseCaseData ( ) ) ;
}
if ( ! eclExtractor ) return measuredDepthForCells ;
std : : vector < double > measuredDepthForIntersections = eclExtractor - > measuredDepth ( ) ;
std : : vector < size_t > globCellIndices = eclExtractor - > intersectedCellsGlobIdx ( ) ;
std : : map < size_t , std : : vector < double > > globCellIdToIntersectionDepthsMap ;
for ( size_t iIdx = 0 ; iIdx < measuredDepthForIntersections . size ( ) ; + + iIdx )
{
globCellIdToIntersectionDepthsMap [ globCellIndices [ iIdx ] ] . push_back ( measuredDepthForIntersections [ iIdx ] ) ;
}
const RigMainGrid * mainGrid = eclExtractor - > caseData ( ) - > mainGrid ( ) ;
RifEclipseRftAddress depthAddress ( m_wellName ( ) , m_timeStep , RifEclipseRftAddress : : DEPTH ) ;
std : : vector < caf : : VecIjk > indices ;
rftReader ( ) - > cellIndices ( depthAddress , & indices ) ;
for ( const caf : : VecIjk & ijkIndex : indices )
{
size_t globalCellIndex = mainGrid - > cellIndexFromIJK ( ijkIndex . i ( ) , ijkIndex . j ( ) , ijkIndex . k ( ) ) ;
double sum = std : : accumulate ( globCellIdToIntersectionDepthsMap [ globalCellIndex ] . begin ( ) , globCellIdToIntersectionDepthsMap [ globalCellIndex ] . end ( ) , 0 ) ;
measuredDepthForCells . push_back ( sum / ( double ) globCellIdToIntersectionDepthsMap [ globalCellIndex ] . size ( ) ) ;
}
return measuredDepthForCells ;
}