2012-05-18 09:45:23 +02:00
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2011-2012 Statoil ASA, Ceetron AS
//
// 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 "RIStdInclude.h"
#include "RIViewer.h"
#include "RimReservoirView.h"
#include "RIMainWindow.h"
#include "RigGridBase.h"
#include "RigReservoir.h"
#include "RIApplication.h"
2012-08-31 19:12:47 +02:00
#include "RIPreferences.h"
2012-05-18 09:45:23 +02:00
#include "cafEffectGenerator.h"
#include "cafFrameAnimationControl.h"
#include "RimCellRangeFilter.h"
#include "RimCellRangeFilterCollection.h"
#include "cvfStructGridGeometryGenerator.h"
#include "RigReservoirCellResults.h"
#include "RivCellEdgeEffectGenerator.h"
#include "RimCellEdgeResultSlot.h"
#include "cvfqtUtils.h"
#include "RivReservoirViewPartMgr.h"
#include "RivReservoirPipesPartMgr.h"
#include "cafCadNavigation.h"
#include "cafCeetronNavigation.h"
#include "RimReservoir.h"
2012-09-11 09:22:36 +02:00
#include "Rim3dOverlayInfoConfig.h"
2013-02-01 13:10:31 +01:00
#include "RigGridScalarDataAccess.h"
2012-05-18 09:45:23 +02:00
namespace caf {
template <>
void caf :: AppEnum < RimReservoirView :: MeshModeType >:: setUp ()
{
2012-10-24 11:23:40 +02:00
addItem ( RimReservoirView :: FULL_MESH , "FULL_MESH" , "All" );
addItem ( RimReservoirView :: FAULTS_MESH , "FAULTS_MESH" , "Faults only" );
addItem ( RimReservoirView :: NO_MESH , "NO_MESH" , "None" );
2012-05-18 09:45:23 +02:00
setDefault ( RimReservoirView :: FULL_MESH );
}
template <>
void caf :: AppEnum < RimReservoirView :: SurfaceModeType >:: setUp ()
{
addItem ( RimReservoirView :: SURFACE , "SURFACE" , "All" );
2012-10-24 11:23:40 +02:00
addItem ( RimReservoirView :: FAULTS , "FAULTS" , "Faults only" );
2012-05-18 09:45:23 +02:00
addItem ( RimReservoirView :: NO_SURFACE , "NO_SURFACE" , "None" );
setDefault ( RimReservoirView :: SURFACE );
}
} // End namespace caf
const cvf :: uint surfaceBit = 0x00000001 ;
const cvf :: uint meshSurfaceBit = 0x00000002 ;
const cvf :: uint faultBit = 0x00000004 ;
const cvf :: uint meshFaultBit = 0x00000008 ;
CAF_PDM_SOURCE_INIT ( RimReservoirView , "ReservoirView" );
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimReservoirView :: RimReservoirView ()
{
2012-10-12 15:05:42 +02:00
RIApplication * app = RIApplication :: instance ();
RIPreferences * preferences = app -> preferences ();
CVF_ASSERT ( preferences );
2012-05-18 09:45:23 +02:00
CAF_PDM_InitObject ( "Reservoir View" , ":/ReservoirView.png" , "" , "" );
CAF_PDM_InitFieldNoDefault ( & cellResult , "GridCellResult" , "Cell Result" , ":/CellResult.png" , "" , "" );
cellResult = new RimResultSlot ();
CAF_PDM_InitFieldNoDefault ( & cellEdgeResult , "GridCellEdgeResult" , "Cell Edge Result" , ":/EdgeResult_1.png" , "" , "" );
cellEdgeResult = new RimCellEdgeResultSlot ();
2012-09-11 09:22:36 +02:00
CAF_PDM_InitFieldNoDefault ( & overlayInfoConfig , "OverlayInfoConfig" , "Overlay Info" , "" , "" , "" );
overlayInfoConfig = new Rim3dOverlayInfoConfig ();
overlayInfoConfig -> setReservoirView ( this );
2012-05-18 09:45:23 +02:00
CAF_PDM_InitField ( & name , "UserDescription" , QString ( "" ), "Name" , "" , "" , "" );
2012-10-12 15:05:42 +02:00
double defaultScaleFactor = 1.0 ;
if ( preferences ) defaultScaleFactor = preferences -> defaultScaleFactorZ ;
CAF_PDM_InitField ( & scaleZ , "GridZScale" , defaultScaleFactor , "Z Scale" , "" , "Scales the scene in the Z direction" , "" );
2012-05-18 09:45:23 +02:00
CAF_PDM_InitField ( & showWindow , "ShowWindow" , true , "Show 3D viewer" , "" , "" , "" );
2012-06-26 16:10:41 +02:00
showWindow . setUiHidden ( true );
2012-05-18 09:45:23 +02:00
CAF_PDM_InitField ( & m_currentTimeStep , "CurrentTimeStep" , 0 , "Current Time Step" , "" , "" , "" );
2012-06-26 16:10:41 +02:00
m_currentTimeStep . setUiHidden ( true );
2012-05-18 09:45:23 +02:00
CAF_PDM_InitField ( & animationMode , "AnimationMode" , false , "Animation Mode" , "" , "" , "" );
2012-06-26 16:10:41 +02:00
animationMode . setUiHidden ( true );
2012-05-18 09:45:23 +02:00
CAF_PDM_InitFieldNoDefault ( & wellCollection , "WellCollection" , "Wells" , "" , "" , "" );
wellCollection = new RimWellCollection ;
CAF_PDM_InitFieldNoDefault ( & rangeFilterCollection , "RangeFilters" , "Range Filters" , ":/CellFilter_Range.png" , "" , "" );
rangeFilterCollection = new RimCellRangeFilterCollection ();
rangeFilterCollection -> setReservoirView ( this );
CAF_PDM_InitFieldNoDefault ( & propertyFilterCollection , "PropertyFilters" , "Property Filters" , "" , "" , "" );
propertyFilterCollection = new RimCellPropertyFilterCollection ();
propertyFilterCollection -> setReservoirView ( this );
2012-10-12 15:05:42 +02:00
caf :: AppEnum < RimReservoirView :: MeshModeType > defaultMeshType = NO_MESH ;
if ( preferences -> defaultGridLines ) defaultMeshType = FULL_MESH ;
CAF_PDM_InitField ( & meshMode , "MeshMode" , defaultMeshType , "Grid lines" , "" , "" , "" );
2012-05-18 09:45:23 +02:00
CAF_PDM_InitFieldNoDefault ( & surfaceMode , "SurfaceMode" , "Grid surface" , "" , "" , "" );
CAF_PDM_InitField ( & maximumFrameRate , "MaximumFrameRate" , 10 , "Maximum frame rate" , "" , "" , "" );
2012-06-26 16:10:41 +02:00
maximumFrameRate . setUiHidden ( true );
2012-05-18 09:45:23 +02:00
// Visualization fields
CAF_PDM_InitField ( & showMainGrid , "ShowMainGrid" , true , "Show Main Grid" , "" , "" , "" );
CAF_PDM_InitField ( & showInactiveCells , "ShowInactiveCells" , false , "Show Inactive Cells" , "" , "" , "" );
CAF_PDM_InitField ( & showInvalidCells , "ShowInvalidCells" , false , "Show Invalid Cells" , "" , "" , "" );
2013-02-05 16:35:04 +01:00
CAF_PDM_InitField ( & cameraPosition , "CameraPosition" , cvf :: Mat4d :: IDENTITY , "" , "" , "" , "" );
2012-05-18 09:45:23 +02:00
this -> cellResult () -> setReservoirView ( this );
this -> cellResult () -> legendConfig () -> setReservoirView ( this );
this -> cellResult () -> legendConfig () -> setPosition ( cvf :: Vec2ui ( 10 , 120 ));
this -> cellEdgeResult () -> setReservoirView ( this );
this -> cellEdgeResult () -> legendConfig () -> setReservoirView ( this );
this -> cellEdgeResult () -> legendConfig () -> setPosition ( cvf :: Vec2ui ( 10 , 320 ));
this -> cellEdgeResult () -> legendConfig () -> setColorRangeMode ( RimLegendConfig :: PINK_WHITE );
m_geometry = new RivReservoirViewPartMgr ( this );
m_pipesPartManager = new RivReservoirPipesPartMgr ( this );
m_reservoir = NULL ;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimReservoirView ::~ RimReservoirView ()
{
delete this -> cellResult ();
delete this -> cellEdgeResult ();
2012-09-11 09:22:36 +02:00
delete this -> overlayInfoConfig ();
2012-05-18 09:45:23 +02:00
delete rangeFilterCollection ();
delete propertyFilterCollection ();
2012-10-23 10:42:46 +02:00
delete wellCollection ();
2012-05-18 09:45:23 +02:00
if ( m_viewer )
{
RIMainWindow :: instance () -> removeViewer ( m_viewer );
}
m_geometry -> clearGeometryCache ();
delete m_viewer ;
m_reservoir = NULL ;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimReservoirView :: updateViewerWidget ()
{
if ( showWindow ())
{
bool isViewerCreated = false ;
if ( ! m_viewer )
{
QGLFormat glFormat ;
glFormat . setDirectRendering ( RIApplication :: instance () -> useShaders ());
m_viewer = new RIViewer ( glFormat , NULL );
m_viewer -> setOwnerReservoirView ( this );
RIMainWindow :: instance () -> addViewer ( m_viewer );
m_viewer -> setMinNearPlaneDistance ( 10 );
this -> cellResult () -> legendConfig -> recreateLegend ();
this -> cellEdgeResult () -> legendConfig -> recreateLegend ();
m_viewer -> setColorLegend1 ( this -> cellResult () -> legendConfig -> legend ());
m_viewer -> setColorLegend2 ( this -> cellEdgeResult () -> legendConfig -> legend ());
if ( RIApplication :: instance () -> navigationPolicy () == RIApplication :: NAVIGATION_POLICY_CEETRON )
{
m_viewer -> setNavigationPolicy ( new caf :: CeetronNavigation );
}
else
{
m_viewer -> setNavigationPolicy ( new caf :: CadNavigation );
}
m_viewer -> enablePerfInfoHud ( RIApplication :: instance () -> showPerformanceInfo ());
//m_viewer->layoutWidget()->showMaximized();
isViewerCreated = true ;
}
RIMainWindow :: instance () -> setActiveViewer ( m_viewer );
if ( isViewerCreated ) m_viewer -> mainCamera () -> setViewMatrix ( cameraPosition );
m_viewer -> update ();
}
else
{
if ( m_viewer )
{
if ( m_viewer -> layoutWidget () -> parentWidget ())
{
m_viewer -> layoutWidget () -> parentWidget () -> hide ();
}
else
{
m_viewer -> layoutWidget () -> hide ();
}
}
}
updateViewerWidgetWindowTitle ();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimReservoirView :: updateViewerWidgetWindowTitle ()
{
if ( m_viewer )
{
QString windowTitle ;
if ( m_reservoir . notNull ())
{
windowTitle = QString ( "%1 - %2" ). arg ( m_reservoir -> caseName ()). arg ( name );
}
else
{
windowTitle = name ;
}
m_viewer -> layoutWidget () -> setWindowTitle ( windowTitle );
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimReservoirView :: createDisplayModelAndRedraw ()
{
if ( m_viewer )
{
m_viewer -> animationControl () -> slotStop ();
createDisplayModel ();
updateDisplayModelVisibility ();
if ( m_currentTimeStep < 0 ) m_currentTimeStep = 0 ;
if ( ! this -> cellResult () -> hasResult () || cellResult -> hasStaticResult ())
{
m_currentTimeStep = 0 ;
}
if ( m_viewer -> frameCount () > 0 )
{
m_viewer -> animationControl () -> setCurrentFrame ( m_currentTimeStep );
}
}
RIMainWindow :: instance () -> refreshAnimationActions ();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimReservoirView :: setDefaultView ()
{
if ( m_viewer )
{
m_viewer -> setDefaultView ();
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimReservoirView :: fieldChangedByUi ( const caf :: PdmFieldHandle * changedField , const QVariant & oldValue , const QVariant & newValue )
{
if ( changedField == & scaleZ )
{
if ( scaleZ < 1 ) scaleZ = 1 ;
if ( m_viewer )
{
cvf :: Vec3d poi = m_viewer -> pointOfInterest ();
cvf :: Vec3d eye , dir , up ;
eye = m_viewer -> mainCamera () -> position ();
dir = m_viewer -> mainCamera () -> direction ();
up = m_viewer -> mainCamera () -> up ();
eye [ 2 ] = poi [ 2 ] * scaleZ () / m_geometry -> scaleTransform () -> worldTransform ()( 2 , 2 ) + ( eye [ 2 ] - poi [ 2 ]);
poi [ 2 ] = poi [ 2 ] * scaleZ () / m_geometry -> scaleTransform () -> worldTransform ()( 2 , 2 );
m_viewer -> mainCamera () -> setFromLookAt ( eye , eye + dir , up );
m_viewer -> setPointOfInterest ( poi );
updateScaleTransform ();
createDisplayModelAndRedraw ();
m_viewer -> update ();
}
}
else if ( changedField == & maximumFrameRate )
{
// !! Use cvf::UNDEFINED_INT or something if we end up with frame rate 0?
// !! Should be able to specify legal range for number properties
if ( m_viewer )
{
m_viewer -> animationControl () -> setTimeout ( maximumFrameRate != 0 ? 1000 / maximumFrameRate : INT_MAX );
}
}
else if ( changedField == & showWindow )
{
bool generateDisplayModel = ( viewer () == NULL );
updateViewerWidget ();
if ( generateDisplayModel )
{
createDisplayModelAndRedraw ();
}
}
else if ( changedField == & m_currentTimeStep )
{
if ( m_viewer )
{
m_viewer -> update ();
}
}
else if ( changedField == & showInvalidCells )
{
m_geometry -> scheduleGeometryRegen ( RivReservoirViewPartMgr :: INACTIVE );
m_geometry -> scheduleGeometryRegen ( RivReservoirViewPartMgr :: RANGE_FILTERED_INACTIVE );
createDisplayModelAndRedraw ();
}
else if ( changedField == & showInactiveCells )
{
createDisplayModelAndRedraw ();
}
else if ( changedField == & showMainGrid )
{
createDisplayModelAndRedraw ();
}
else if ( changedField == & rangeFilterCollection )
{
m_geometry -> scheduleGeometryRegen ( RivReservoirViewPartMgr :: RANGE_FILTERED );
m_geometry -> scheduleGeometryRegen ( RivReservoirViewPartMgr :: RANGE_FILTERED_INACTIVE );
createDisplayModelAndRedraw ();
}
else if ( changedField == & propertyFilterCollection )
{
m_geometry -> scheduleGeometryRegen ( RivReservoirViewPartMgr :: PROPERTY_FILTERED );
createDisplayModelAndRedraw ();
}
else if ( changedField == & meshMode )
{
updateDisplayModelVisibility ();
}
else if ( changedField == & surfaceMode )
{
updateDisplayModelVisibility ();
}
else if ( changedField == & name )
{
updateViewerWidgetWindowTitle ();
}
}
void RimReservoirView :: updateScaleTransform ()
{
CVF_ASSERT ( m_geometry . notNull ());
CVF_ASSERT ( m_pipesPartManager . notNull ());
cvf :: Mat4d scale = cvf :: Mat4d :: IDENTITY ;
scale ( 2 , 2 ) = scaleZ ();
m_geometry -> setScaleTransform ( scale );
m_pipesPartManager -> setScaleTransform ( m_geometry -> scaleTransform ());
if ( m_viewer ) m_viewer -> updateCachedValuesInScene ();
}
//--------------------------------------------------------------------------------------------------
/// Create display model,
/// or at least empty scenes as frames that is delivered to the viewer
/// The real geometry generation is done inside RivReservoirViewGeometry and friends
//--------------------------------------------------------------------------------------------------
void RimReservoirView :: createDisplayModel ()
{
if ( m_viewer . isNull ()) return ;
// static int callCount = 0;
// qDebug() << "RimReservoirView::createDisplayModel()" << callCount++;
if ( m_reservoir && m_reservoir -> reservoirData ())
{
// Define a vector containing time step indices to produce geometry for.
// First entry in this vector is used to define the geometry only result mode with no results.
std :: vector < size_t > timeStepIndices ;
// The one and only geometry entry
timeStepIndices . push_back ( 0 );
2012-06-26 16:10:41 +02:00
// Find the number of time frames the animation needs to show the requested data.
2012-05-18 09:45:23 +02:00
if ( this -> cellResult () -> hasDynamicResult ()
|| this -> propertyFilterCollection () -> hasActiveDynamicFilters ()
|| this -> wellCollection -> hasVisibleWellPipes ())
{
2012-06-26 16:10:41 +02:00
CVF_ASSERT ( gridCellResults ());
2012-05-18 09:45:23 +02:00
size_t i ;
2012-06-26 16:10:41 +02:00
for ( i = 0 ; i < gridCellResults () -> maxTimeStepCount (); i ++ )
2012-05-18 09:45:23 +02:00
{
timeStepIndices . push_back ( i );
}
}
else if ( this -> cellResult () -> hasStaticResult ()
|| this -> cellEdgeResult () -> hasResult ()
|| this -> propertyFilterCollection () -> hasActiveFilters ())
{
// The one and only result entry
timeStepIndices . push_back ( 0 );
}
updateLegends ();
cvf :: Collection < cvf :: ModelBasicList > frameModels ;
size_t timeIdx ;
for ( timeIdx = 0 ; timeIdx < timeStepIndices . size (); timeIdx ++ )
{
frameModels . push_back ( new cvf :: ModelBasicList );
}
// Remove all existing animation frames from the viewer.
// The parts are still cached in the RivReservoir geometry and friends
bool isAnimationActive = m_viewer -> isAnimationActive ();
m_viewer -> removeAllFrames ();
// Create vector of grid indices to render
std :: vector < size_t > gridIndices ;
this -> indicesToVisibleGrids ( & gridIndices );
///
// Get or create the parts for "static" type geometry. The same geometry is used
// for the different frames. updateCurrentTimeStep updates the colors etc.
// For property filtered geometry : just set all the models as empty scenes
// updateCurrentTimeStep requests the actual parts
if ( ! this -> propertyFilterCollection () -> hasActiveFilters ())
{
size_t frameIdx ;
for ( frameIdx = 0 ; frameIdx < frameModels . size (); ++ frameIdx )
{
if ( this -> rangeFilterCollection () -> hasActiveFilters () || this -> wellCollection () -> hasVisibleWellCells ())
{
m_geometry -> appendStaticGeometryPartsToModel ( frameModels [ frameIdx ]. p (), RivReservoirViewPartMgr :: VISIBLE_WELL_CELLS_OUTSIDE_RANGE_FILTER , gridIndices ); // Should be visible well cells outside range filter
m_geometry -> appendStaticGeometryPartsToModel ( frameModels [ frameIdx ]. p (), RivReservoirViewPartMgr :: VISIBLE_WELL_FENCE_CELLS_OUTSIDE_RANGE_FILTER , gridIndices ); // Should be visible well cells outside range filter
m_geometry -> appendStaticGeometryPartsToModel ( frameModels [ frameIdx ]. p (), RivReservoirViewPartMgr :: RANGE_FILTERED_WELL_CELLS , gridIndices );
m_geometry -> appendStaticGeometryPartsToModel ( frameModels [ frameIdx ]. p (), RivReservoirViewPartMgr :: RANGE_FILTERED , gridIndices );
if ( this -> showInactiveCells ())
{
m_geometry -> appendStaticGeometryPartsToModel ( frameModels [ frameIdx ]. p (), RivReservoirViewPartMgr :: RANGE_FILTERED_INACTIVE , gridIndices );
}
}
else
{
m_geometry -> appendStaticGeometryPartsToModel ( frameModels [ frameIdx ]. p (), RivReservoirViewPartMgr :: ALL_WELL_CELLS , gridIndices ); // Should be all well cells
m_geometry -> appendStaticGeometryPartsToModel ( frameModels [ frameIdx ]. p (), RivReservoirViewPartMgr :: ACTIVE , gridIndices );
if ( this -> showInactiveCells ())
{
m_geometry -> appendStaticGeometryPartsToModel ( frameModels [ frameIdx ]. p (), RivReservoirViewPartMgr :: INACTIVE , gridIndices );
}
}
// Set static colors
this -> updateStaticCellColors ();
}
}
// Compute triangle count, Debug only
if ( false )
{
size_t totalTriangleCount = 0 ;
{
size_t mIdx ;
for ( mIdx = 0 ; mIdx < frameModels . size (); mIdx ++ )
{
cvf :: Collection < cvf :: Part > partCollection ;
frameModels . at ( mIdx ) -> allParts ( & partCollection );
size_t modelTriangleCount = 0 ;
size_t pIdx ;
for ( pIdx = 0 ; pIdx < partCollection . size (); pIdx ++ )
{
modelTriangleCount += partCollection . at ( pIdx ) -> drawable () -> triangleCount ();
}
totalTriangleCount += modelTriangleCount ;
}
}
}
// Create Scenes from the frameModels
// Animation frames for results display, starts from frame 1
2012-06-26 16:10:41 +02:00
size_t frameIndex ;
for ( frameIndex = 0 ; frameIndex < frameModels . size (); frameIndex ++ )
2012-05-18 09:45:23 +02:00
{
2012-06-26 16:10:41 +02:00
cvf :: ModelBasicList * model = frameModels . at ( frameIndex );
2012-05-18 09:45:23 +02:00
model -> updateBoundingBoxesRecursive ();
cvf :: ref < cvf :: Scene > scene = new cvf :: Scene ;
scene -> addModel ( model );
2012-06-26 16:10:41 +02:00
if ( frameIndex == 0 )
2012-05-18 09:45:23 +02:00
m_viewer -> setMainScene ( scene . p ());
else
m_viewer -> addFrame ( scene . p ());
}
// If the animation was active before recreating everything, make viewer view current frame
if ( isAnimationActive )
{
m_viewer -> slotSetCurrentFrame ( m_currentTimeStep );
}
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimReservoirView :: updateCurrentTimeStep ()
{
std :: vector < RivReservoirViewPartMgr :: ReservoirGeometryCacheType > geometriesToRecolor ;
if ( this -> propertyFilterCollection () -> hasActiveFilters ())
{
cvf :: ref < cvf :: ModelBasicList > frameParts = new cvf :: ModelBasicList ;
std :: vector < size_t > gridIndices ;
this -> indicesToVisibleGrids ( & gridIndices );
geometriesToRecolor . push_back ( RivReservoirViewPartMgr :: PROPERTY_FILTERED );
m_geometry -> appendDynamicGeometryPartsToModel ( frameParts . p (), RivReservoirViewPartMgr :: PROPERTY_FILTERED , m_currentTimeStep , gridIndices );
geometriesToRecolor . push_back ( RivReservoirViewPartMgr :: PROPERTY_FILTERED_WELL_CELLS );
m_geometry -> appendDynamicGeometryPartsToModel ( frameParts . p (), RivReservoirViewPartMgr :: PROPERTY_FILTERED_WELL_CELLS , m_currentTimeStep , gridIndices );
// Set the transparency on all the Wellcell parts before setting the result color
float opacity = static_cast < float > ( 1 - cvf :: Math :: clamp ( this -> wellCollection () -> wellCellTransparencyLevel (), 0.0 , 1.0 ));
m_geometry -> updateCellColor ( RivReservoirViewPartMgr :: PROPERTY_FILTERED_WELL_CELLS , m_currentTimeStep , cvf :: Color4f ( cvf :: Color3f ( cvf :: Color3 :: WHITE ), opacity ));
if ( m_viewer )
{
cvf :: Scene * frameScene = m_viewer -> frame ( m_currentTimeStep );
if ( frameScene )
{
frameParts -> updateBoundingBoxesRecursive ();
frameScene -> removeAllModels ();
frameScene -> addModel ( frameParts . p ());
}
}
}
else if ( rangeFilterCollection -> hasActiveFilters () || this -> wellCollection () -> hasVisibleWellCells ())
{
geometriesToRecolor . push_back ( RivReservoirViewPartMgr :: RANGE_FILTERED );
geometriesToRecolor . push_back ( RivReservoirViewPartMgr :: RANGE_FILTERED_WELL_CELLS );
geometriesToRecolor . push_back ( RivReservoirViewPartMgr :: VISIBLE_WELL_CELLS_OUTSIDE_RANGE_FILTER );
geometriesToRecolor . push_back ( RivReservoirViewPartMgr :: VISIBLE_WELL_FENCE_CELLS_OUTSIDE_RANGE_FILTER );
}
else
{
geometriesToRecolor . push_back ( RivReservoirViewPartMgr :: ACTIVE );
geometriesToRecolor . push_back ( RivReservoirViewPartMgr :: ALL_WELL_CELLS );
}
2013-01-22 11:34:47 +01:00
for ( size_t i = 0 ; i < geometriesToRecolor . size (); ++ i )
2012-05-18 09:45:23 +02:00
{
if ( this -> animationMode () && this -> cellEdgeResult () -> hasResult ())
{
m_geometry -> updateCellEdgeResultColor ( geometriesToRecolor [ i ], m_currentTimeStep , this -> cellResult (), this -> cellEdgeResult ());
}
else if ( this -> animationMode () && this -> cellResult () -> hasResult ())
{
m_geometry -> updateCellResultColor ( geometriesToRecolor [ i ], m_currentTimeStep , this -> cellResult ());
}
else
{
this -> updateStaticCellColors ( geometriesToRecolor [ i ]);
}
}
// Well pipes
if ( m_viewer )
{
cvf :: Scene * frameScene = m_viewer -> frame ( m_currentTimeStep );
if ( frameScene )
{
2012-06-26 16:10:41 +02:00
cvf :: String modelName = "WellPipeModel" ;
std :: vector < cvf :: Model *> models ;
2013-01-22 11:34:47 +01:00
for ( cvf :: uint i = 0 ; i < frameScene -> modelCount (); i ++ )
2012-06-26 16:10:41 +02:00
{
if ( frameScene -> model ( i ) -> name () == modelName )
{
models . push_back ( frameScene -> model ( i ));
}
}
2013-01-22 11:34:47 +01:00
for ( size_t i = 0 ; i < models . size (); i ++ )
2012-06-26 16:10:41 +02:00
{
frameScene -> removeModel ( models [ i ]);
}
cvf :: ref < cvf :: ModelBasicList > pipeModel = new cvf :: ModelBasicList ;
pipeModel -> setName ( modelName );
m_pipesPartManager -> appendDynamicGeometryPartsToModel ( pipeModel . p (), m_currentTimeStep );
2012-05-18 09:45:23 +02:00
m_pipesPartManager -> updatePipeResultColor ( m_currentTimeStep );
2012-06-26 16:10:41 +02:00
pipeModel -> updateBoundingBoxesRecursive ();
frameScene -> addModel ( pipeModel . p ());
2012-05-18 09:45:23 +02:00
}
}
2012-06-26 16:10:41 +02:00
2012-09-11 09:22:36 +02:00
overlayInfoConfig () -> update3DInfo ();
2012-06-26 16:10:41 +02:00
updateLegends ();
2012-05-18 09:45:23 +02:00
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimReservoirView :: loadDataAndUpdate ()
{
updateScaleTransform ();
if ( m_reservoir )
{
if ( ! m_reservoir -> openEclipseGridFile ())
{
2012-06-26 16:10:41 +02:00
QMessageBox :: warning ( RIMainWindow :: instance (), "Error when opening project file" , "Could not open the Eclipse Grid file (EGRID/GRID): \n " + m_reservoir -> caseName ());
2012-05-18 09:45:23 +02:00
}
else
{
2012-08-31 19:12:47 +02:00
RIApplication * app = RIApplication :: instance ();
if ( app -> preferences () -> autocomputeSOIL )
{
2013-02-01 14:39:32 +01:00
RigReservoirCellResults * results = gridCellResults ();
CVF_ASSERT ( results );
2012-08-31 19:12:47 +02:00
results -> loadOrComputeSOIL ();
}
2012-05-18 09:45:23 +02:00
}
}
CVF_ASSERT ( this -> cellResult () != NULL );
this -> cellResult () -> loadResult ();
2013-02-05 14:45:35 +01:00
if ( m_reservoir -> reservoirData () -> mainGrid () -> globalFractureModelActiveCellCount () == 0 )
{
this -> cellResult -> porosityModel . setUiHidden ( true );
}
2012-05-18 09:45:23 +02:00
CVF_ASSERT ( this -> cellEdgeResult () != NULL );
this -> cellEdgeResult () -> loadResult ();
updateViewerWidget ();
this -> propertyFilterCollection () -> loadAndInitializePropertyFilters ();
m_geometry -> clearGeometryCache ();
syncronizeWellsWithResults ();
createDisplayModel ();
updateDisplayModelVisibility ();
2013-02-05 16:35:04 +01:00
if ( cameraPosition (). isIdentity ())
{
setDefaultView ();
}
2012-09-11 09:22:36 +02:00
overlayInfoConfig () -> update3DInfo ();
2012-05-18 09:45:23 +02:00
if ( animationMode && m_viewer )
{
m_viewer -> slotSetCurrentFrame ( m_currentTimeStep );
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimReservoirView :: initAfterRead ()
{
this -> cellResult () -> setReservoirView ( this );
this -> cellEdgeResult () -> setReservoirView ( this );
this -> rangeFilterCollection () -> setReservoirView ( this );
this -> propertyFilterCollection () -> setReservoirView ( this );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimReservoirView :: setCurrentTimeStep ( int frameIndex )
{
m_currentTimeStep = frameIndex ;
this -> animationMode = true ;
this -> updateCurrentTimeStep ();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimReservoirView :: endAnimation ()
{
this -> animationMode = false ;
this -> updateStaticCellColors ();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimReservoirView :: updateStaticCellColors ()
{
updateStaticCellColors ( RivReservoirViewPartMgr :: ACTIVE );
updateStaticCellColors ( RivReservoirViewPartMgr :: ALL_WELL_CELLS );
updateStaticCellColors ( RivReservoirViewPartMgr :: VISIBLE_WELL_CELLS );
updateStaticCellColors ( RivReservoirViewPartMgr :: VISIBLE_WELL_FENCE_CELLS );
updateStaticCellColors ( RivReservoirViewPartMgr :: VISIBLE_WELL_CELLS_OUTSIDE_RANGE_FILTER );
updateStaticCellColors ( RivReservoirViewPartMgr :: VISIBLE_WELL_FENCE_CELLS_OUTSIDE_RANGE_FILTER );
updateStaticCellColors ( RivReservoirViewPartMgr :: INACTIVE );
updateStaticCellColors ( RivReservoirViewPartMgr :: RANGE_FILTERED );
updateStaticCellColors ( RivReservoirViewPartMgr :: RANGE_FILTERED_WELL_CELLS );
updateStaticCellColors ( RivReservoirViewPartMgr :: RANGE_FILTERED_INACTIVE );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimReservoirView :: updateStaticCellColors ( unsigned short geometryType )
{
float opacity = static_cast < float > ( 1 - cvf :: Math :: clamp ( this -> wellCollection () -> wellCellTransparencyLevel (), 0.0 , 1.0 ));
cvf :: Color4f color ( cvf :: Color3 :: ORANGE );
switch ( geometryType )
{
case RivReservoirViewPartMgr :: ACTIVE : color = cvf :: Color4f ( cvf :: Color3 :: ORANGE ); break ;
case RivReservoirViewPartMgr :: ALL_WELL_CELLS : color = cvf :: Color4f ( cvf :: Color3f ( cvf :: Color3 :: BROWN ), opacity ); break ;
case RivReservoirViewPartMgr :: VISIBLE_WELL_CELLS : color = cvf :: Color4f ( cvf :: Color3f ( cvf :: Color3 :: BROWN ), opacity ); break ;
case RivReservoirViewPartMgr :: VISIBLE_WELL_FENCE_CELLS : color = cvf :: Color4f ( cvf :: Color3 :: ORANGE ); break ;
case RivReservoirViewPartMgr :: VISIBLE_WELL_CELLS_OUTSIDE_RANGE_FILTER :
color = cvf :: Color4f ( cvf :: Color3f ( cvf :: Color3 :: BROWN ), opacity ); break ;
case RivReservoirViewPartMgr :: VISIBLE_WELL_FENCE_CELLS_OUTSIDE_RANGE_FILTER :
color = cvf :: Color4f ( cvf :: Color3 :: ORANGE ); break ;
case RivReservoirViewPartMgr :: INACTIVE : color = cvf :: Color4f ( cvf :: Color3 :: LIGHT_GRAY ); break ;
case RivReservoirViewPartMgr :: RANGE_FILTERED : color = cvf :: Color4f ( cvf :: Color3 :: ORANGE ); break ;
case RivReservoirViewPartMgr :: RANGE_FILTERED_WELL_CELLS : color = cvf :: Color4f ( cvf :: Color3f ( cvf :: Color3 :: BROWN ), opacity ); break ;
case RivReservoirViewPartMgr :: RANGE_FILTERED_INACTIVE : color = cvf :: Color4f ( cvf :: Color3 :: LIGHT_GRAY ); break ;
}
m_geometry -> updateCellColor ( static_cast < RivReservoirViewPartMgr :: ReservoirGeometryCacheType > ( geometryType ), color );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RIViewer * RimReservoirView :: viewer ()
{
return m_viewer ;
}
//--------------------------------------------------------------------------------------------------
/// Get pick info text for given part ID, face index, and intersection point
//--------------------------------------------------------------------------------------------------
bool RimReservoirView :: pickInfo ( size_t gridIndex , size_t cellIndex , const cvf :: Vec3d & point , QString * pickInfoText ) const
{
CVF_ASSERT ( pickInfoText );
if ( m_reservoir )
{
const RigReservoir * reservoir = m_reservoir -> reservoirData ();
if ( reservoir )
{
size_t i = 0 ;
size_t j = 0 ;
size_t k = 0 ;
if ( reservoir -> grid ( gridIndex ) -> ijkFromCellIndex ( cellIndex , & i , & j , & k ))
{
// Adjust to 1-based Eclipse indexing
i ++ ;
j ++ ;
k ++ ;
cvf :: Vec3d domainCoord = point + reservoir -> grid ( gridIndex ) -> displayModelOffset ();
pickInfoText -> sprintf ( "Hit grid %u, cell [%u, %u, %u], intersection point: [E: %.2f, N: %.2f, Depth: %.2f]" , static_cast < unsigned int > ( gridIndex ), static_cast < unsigned int > ( i ), static_cast < unsigned int > ( j ), static_cast < unsigned int > ( k ), domainCoord . x (), domainCoord . y (), - domainCoord . z ());
return true ;
}
}
}
return false ;
}
//--------------------------------------------------------------------------------------------------
/// Get the current scalar value for the display face at the given index
//--------------------------------------------------------------------------------------------------
void RimReservoirView :: appendCellResultInfo ( size_t gridIndex , size_t cellIndex , QString * resultInfoText ) const
{
CVF_ASSERT ( resultInfoText );
if ( m_reservoir && m_reservoir -> reservoirData ())
{
const RigReservoir * reservoir = m_reservoir -> reservoirData ();
const RigGridBase * grid = reservoir -> grid ( gridIndex );
if ( this -> cellResult () -> hasResult ())
{
2013-02-01 14:39:32 +01:00
RifReaderInterface :: PorosityModelResultType porosityModel = RigReservoirCellResults :: convertFromProjectModelPorosityModel ( cellResult () -> porosityModel ());
cvf :: ref < RigGridScalarDataAccess > dataAccessObject = grid -> dataAccessObject ( porosityModel , m_currentTimeStep , this -> cellResult () -> gridScalarIndex ());
2013-02-01 13:10:31 +01:00
if ( dataAccessObject . notNull ())
{
double scalarValue = dataAccessObject -> cellScalar ( cellIndex );
resultInfoText -> append ( QString ( "Cell result : %1 \n " ). arg ( scalarValue ));
}
2012-05-18 09:45:23 +02:00
}
if ( this -> cellEdgeResult () -> hasResult ())
{
size_t resultIndices [ 6 ];
QStringList resultNames ;
this -> cellEdgeResult () -> gridScalarIndices ( resultIndices );
this -> cellEdgeResult () -> gridScalarResultNames ( & resultNames );
2013-01-22 11:34:47 +01:00
for ( int idx = 0 ; idx < 6 ; idx ++ )
2012-05-18 09:45:23 +02:00
{
if ( resultIndices [ idx ] == cvf :: UNDEFINED_SIZE_T ) continue ;
// Cell edge results are static, results are loaded for first time step only
2013-02-01 14:39:32 +01:00
RifReaderInterface :: PorosityModelResultType porosityModel = RigReservoirCellResults :: convertFromProjectModelPorosityModel ( cellResult () -> porosityModel ());
cvf :: ref < RigGridScalarDataAccess > dataAccessObject = grid -> dataAccessObject ( porosityModel , 0 , resultIndices [ idx ]);
2013-02-01 13:10:31 +01:00
if ( dataAccessObject . notNull ())
{
double scalarValue = dataAccessObject -> cellScalar ( cellIndex );
resultInfoText -> append ( QString ( "%1 : %2 \n " ). arg ( resultNames [ idx ]). arg ( scalarValue ));
}
2012-05-18 09:45:23 +02:00
}
}
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimReservoirView :: updateDisplayModelVisibility ()
{
if ( m_viewer . isNull ()) return ;
2012-10-24 11:23:40 +02:00
2012-10-24 12:54:57 +02:00
// Initialize the mask to show everything except the the bits controlled here
unsigned int mask = 0xffffffff & ~ surfaceBit & ~ faultBit & ~ meshSurfaceBit & ~ meshFaultBit ;
// Then turn the appropriate bits on according to the user settings
2012-05-18 09:45:23 +02:00
if ( surfaceMode == SURFACE )
{
2012-10-24 11:23:40 +02:00
mask |= surfaceBit ;
mask |= faultBit ;
2012-05-18 09:45:23 +02:00
}
else if ( surfaceMode == FAULTS )
{
2012-10-24 11:23:40 +02:00
mask |= faultBit ;
2012-05-18 09:45:23 +02:00
}
if ( meshMode == FULL_MESH )
{
2012-10-24 11:23:40 +02:00
mask |= meshSurfaceBit ;
mask |= meshFaultBit ;
2012-05-18 09:45:23 +02:00
}
2012-10-24 11:23:40 +02:00
else if ( meshMode == FAULTS_MESH )
2012-05-18 09:45:23 +02:00
{
2012-10-24 11:23:40 +02:00
mask |= meshFaultBit ;
2012-05-18 09:45:23 +02:00
}
m_viewer -> setEnableMask ( mask );
m_viewer -> update ();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimReservoirView :: setupBeforeSave ()
{
if ( m_viewer )
{
animationMode = m_viewer -> isAnimationActive ();
2013-02-05 16:35:04 +01:00
cameraPosition = m_viewer -> mainCamera () -> viewMatrix ();
2012-05-18 09:45:23 +02:00
}
}
//--------------------------------------------------------------------------------------------------
/// Convenience for quick access to results
//--------------------------------------------------------------------------------------------------
RigReservoirCellResults * RimReservoirView :: gridCellResults ()
{
if ( m_reservoir &&
m_reservoir -> reservoirData () &&
m_reservoir -> reservoirData () -> mainGrid ()
)
{
2013-02-01 14:39:32 +01:00
RifReaderInterface :: PorosityModelResultType porosityModel = RigReservoirCellResults :: convertFromProjectModelPorosityModel ( cellResult -> porosityModel ());
return m_reservoir -> reservoirData () -> mainGrid () -> results ( porosityModel );
2012-05-18 09:45:23 +02:00
}
return NULL ;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimReservoirView :: scheduleGeometryRegen ( unsigned short geometryType )
{
m_geometry -> scheduleGeometryRegen ( static_cast < RivReservoirViewPartMgr :: ReservoirGeometryCacheType > ( geometryType ));
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimReservoirView :: schedulePipeGeometryRegen ()
{
m_pipesPartManager -> scheduleGeometryRegen ();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimReservoirView :: updateCurrentTimeStepAndRedraw ()
{
this -> updateCurrentTimeStep ();
if ( m_viewer ) m_viewer -> update ();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimReservoirView :: indicesToVisibleGrids ( std :: vector < size_t >* gridIndices )
{
CVF_ASSERT ( gridIndices != NULL );
// Create vector of grid indices to render
std :: vector < RigGridBase *> grids ;
if ( this -> m_reservoir && this -> m_reservoir -> reservoirData () )
{
this -> m_reservoir -> reservoirData () -> allGrids ( & grids );
}
size_t i ;
for ( i = 0 ; i < grids . size (); i ++ )
{
if ( ! grids [ i ] -> isMainGrid () || this -> showMainGrid () )
{
gridIndices -> push_back ( i );
}
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimReservoirView :: updateLegends ()
{
if ( ! m_reservoir || ! m_viewer || ! m_reservoir -> reservoirData () )
{
return ;
}
RigReservoir * reservoir = m_reservoir -> reservoirData ();
CVF_ASSERT ( reservoir );
2013-02-01 14:39:32 +01:00
RifReaderInterface :: PorosityModelResultType porosityModel = RigReservoirCellResults :: convertFromProjectModelPorosityModel ( cellResult () -> porosityModel ());
RigReservoirCellResults * results = reservoir -> mainGrid () -> results ( porosityModel );
2012-05-18 09:45:23 +02:00
CVF_ASSERT ( results );
if ( this -> cellResult () -> hasResult ())
{
double globalMin , globalMax ;
results -> minMaxCellScalarValues ( this -> cellResult () -> gridScalarIndex (), globalMin , globalMax );
double localMin , localMax ;
if ( this -> cellResult () -> hasDynamicResult ())
{
results -> minMaxCellScalarValues ( this -> cellResult () -> gridScalarIndex (), m_currentTimeStep , localMin , localMax );
}
else
{
localMin = globalMin ;
localMax = globalMax ;
}
this -> cellResult () -> legendConfig -> setAutomaticRanges ( globalMin , globalMax , localMin , localMax );
m_viewer -> setColorLegend1 ( this -> cellResult () -> legendConfig -> legend ());
this -> cellResult () -> legendConfig -> legend () -> setTitle ( cvfqt :: Utils :: fromQString ( QString ( "Cell Results: \n " ) + this -> cellResult () -> resultVariable ));
}
else
{
this -> cellResult () -> legendConfig -> setAutomaticRanges ( cvf :: UNDEFINED_DOUBLE , cvf :: UNDEFINED_DOUBLE , cvf :: UNDEFINED_DOUBLE , cvf :: UNDEFINED_DOUBLE );
m_viewer -> setColorLegend1 ( NULL );
}
if ( this -> cellEdgeResult () -> hasResult ())
{
double globalMin , globalMax ;
2012-09-11 09:22:36 +02:00
this -> cellEdgeResult () -> minMaxCellEdgeValues ( globalMin , globalMax );
2012-05-18 09:45:23 +02:00
this -> cellEdgeResult () -> legendConfig -> setAutomaticRanges ( globalMin , globalMax , globalMin , globalMax );
m_viewer -> setColorLegend2 ( this -> cellEdgeResult () -> legendConfig -> legend ());
this -> cellEdgeResult () -> legendConfig -> legend () -> setTitle ( cvfqt :: Utils :: fromQString ( QString ( "Edge Results: \n " ) + this -> cellEdgeResult () -> resultVariable ));
}
else
{
m_viewer -> setColorLegend2 ( NULL );
this -> cellEdgeResult () -> legendConfig -> setAutomaticRanges ( cvf :: UNDEFINED_DOUBLE , cvf :: UNDEFINED_DOUBLE , cvf :: UNDEFINED_DOUBLE , cvf :: UNDEFINED_DOUBLE );
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimReservoirView :: setEclipseCase ( RimReservoir * reservoir )
{
m_reservoir = reservoir ;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimReservoir * RimReservoirView :: eclipseCase ()
{
return m_reservoir ;
}
//--------------------------------------------------------------------------------------------------
//
/*
wells vs wellres
For all wellres
find well
if no well, create new
connect well and wellres
for all wells not connected
Delete ?
*/
//--------------------------------------------------------------------------------------------------
void RimReservoirView :: syncronizeWellsWithResults ()
{
if ( ! ( m_reservoir && m_reservoir -> reservoirData ()) ) return ;
cvf :: Collection < RigWellResults > wellResults = m_reservoir -> reservoirData () -> wellResults ();
// Find corresponding well from well result, or create a new
size_t wIdx ;
for ( wIdx = 0 ; wIdx < wellResults . size (); ++ wIdx )
{
RimWell * well = this -> wellCollection () -> findWell ( wellResults [ wIdx ] -> m_wellName );
if ( ! well )
{
well = new RimWell ;
well -> name = wellResults [ wIdx ] -> m_wellName ;
this -> wellCollection () -> wells (). push_back ( well );
}
well -> setWellResults ( wellResults [ wIdx ]. p ());
}
// Remove all wells that does not have a result
for ( wIdx = 0 ; wIdx < this -> wellCollection () -> wells (). size (); ++ wIdx )
{
RimWell * well = this -> wellCollection () -> wells ()[ wIdx ];
RigWellResults * wellRes = well -> wellResults ();
if ( wellRes == NULL )
{
delete well ;
this -> wellCollection () -> wells (). erase ( wIdx );
}
}
// Make sure all the wells have their reservoirView ptr setup correctly
this -> wellCollection () -> setReservoirView ( this );
for ( wIdx = 0 ; wIdx < this -> wellCollection () -> wells (). size (); ++ wIdx )
{
this -> wellCollection () -> wells ()[ wIdx ] -> setReservoirView ( this );
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimReservoirView :: calculateVisibleWellCellsIncFence ( cvf :: UByteArray * visibleCells , RigGridBase * grid )
{
CVF_ASSERT ( visibleCells != NULL );
// Initialize the return array
if ( visibleCells -> size () != grid -> cellCount ())
{
visibleCells -> resize ( grid -> cellCount ());
}
visibleCells -> setAll ( false );
// If all wells are forced off, return
if ( this -> wellCollection () -> wellCellVisibility () == RimWellCollection :: FORCE_ALL_OFF ) return ;
// Loop over the wells and find their contribution
for ( size_t wIdx = 0 ; wIdx < this -> wellCollection () -> wells (). size (); ++ wIdx )
{
RimWell * well = this -> wellCollection () -> wells ()[ wIdx ];
if ( this -> wellCollection () -> wellCellVisibility () == RimWellCollection :: FORCE_ALL_ON || well -> showWellCells ())
{
RigWellResults * wres = well -> wellResults ();
if ( ! wres ) continue ;
const std :: vector < RigWellResultFrame >& wellResFrames = wres -> m_wellCellsTimeSteps ;
for ( size_t wfIdx = 0 ; wfIdx < wellResFrames . size (); ++ wfIdx )
{
// Add the wellhead cell
if ( wellResFrames [ wfIdx ]. m_wellHead . m_gridIndex == grid -> gridIndex ())
{
size_t gridCellIndex = wellResFrames [ wfIdx ]. m_wellHead . m_gridCellIndex ;
( * visibleCells )[ gridCellIndex ] = true ;
}
// Add all the cells from the branches
const std :: vector < RigWellResultBranch >& wellResSegments = wellResFrames [ wfIdx ]. m_wellResultBranches ;
for ( size_t wsIdx = 0 ; wsIdx < wellResSegments . size (); ++ wsIdx )
{
const std :: vector < RigWellResultCell >& wsResCells = wellResSegments [ wsIdx ]. m_wellCells ;
for ( size_t cIdx = 0 ; cIdx < wsResCells . size (); ++ cIdx )
{
if ( wsResCells [ cIdx ]. m_gridIndex == grid -> gridIndex ())
{
size_t gridCellIndex = wsResCells [ cIdx ]. m_gridCellIndex ;
( * visibleCells )[ gridCellIndex ] = true ;
// Calculate well fence cells
if ( well -> showWellCellFence () || this -> wellCollection () -> showWellCellFences ())
{
size_t i , j , k ;
grid -> ijkFromCellIndex ( gridCellIndex , & i , & j , & k );
size_t * pI = & i ;
size_t * pJ = & j ;
size_t * pK = & k ;
size_t cellCountFenceDirection = 0 ;
size_t fIdx = 0 ;
if ( this -> wellCollection () -> wellCellFenceType == RimWellCollection :: K_DIRECTION )
{
cellCountFenceDirection = grid -> cellCountK ();
pK = & fIdx ;
}
else if ( this -> wellCollection () -> wellCellFenceType == RimWellCollection :: J_DIRECTION )
{
cellCountFenceDirection = grid -> cellCountJ ();
pJ = & fIdx ;
}
else if ( this -> wellCollection () -> wellCellFenceType == RimWellCollection :: I_DIRECTION )
{
cellCountFenceDirection = grid -> cellCountI ();
pI = & fIdx ;
}
for ( fIdx = 0 ; fIdx < cellCountFenceDirection ; ++ fIdx )
{
size_t fenceCellIndex = grid -> cellIndexFromIJK ( * pI , * pJ , * pK );
2013-01-30 14:13:50 +01:00
if ( grid -> cell ( fenceCellIndex ). isActiveInMatrixModel ())
2012-05-18 09:45:23 +02:00
{
( * visibleCells )[ fenceCellIndex ] = true ;
}
}
}
}
}
}
}
}
}
}