mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
Cell filter performance improvement (#10550)
* Speed up eclipse and geomech cell filters
This commit is contained in:
@@ -54,34 +54,61 @@ void RivFemElmVisibilityCalculator::computeAllVisible( cvf::UByteArray* elmVisib
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RivFemElmVisibilityCalculator::computeRangeVisibility( cvf::UByteArray* elmVisibilities,
|
||||
const RigFemPart* femPart,
|
||||
const cvf::CellRangeFilter& rangeFilter )
|
||||
const cvf::CellRangeFilter& rangeFilter,
|
||||
const cvf::UByteArray* indexIncludeVisibility,
|
||||
const cvf::UByteArray* indexExcludeVisibility,
|
||||
bool useIndexInclude )
|
||||
{
|
||||
elmVisibilities->resize( femPart->elementCount() );
|
||||
|
||||
const RigFemPartGrid* grid = femPart->getOrCreateStructGrid();
|
||||
|
||||
size_t mainGridI;
|
||||
size_t mainGridJ;
|
||||
size_t mainGridK;
|
||||
|
||||
if ( rangeFilter.hasIncludeRanges() )
|
||||
{
|
||||
for ( int elmIdx = 0; elmIdx < femPart->elementCount(); ++elmIdx )
|
||||
if ( useIndexInclude )
|
||||
{
|
||||
size_t mainGridI;
|
||||
size_t mainGridJ;
|
||||
size_t mainGridK;
|
||||
|
||||
grid->ijkFromCellIndex( elmIdx, &mainGridI, &mainGridJ, &mainGridK );
|
||||
( *elmVisibilities )[elmIdx] = rangeFilter.isCellVisible( mainGridI, mainGridJ, mainGridK, false );
|
||||
for ( int elmIdx = 0; elmIdx < femPart->elementCount(); ++elmIdx )
|
||||
{
|
||||
grid->ijkFromCellIndex( elmIdx, &mainGridI, &mainGridJ, &mainGridK );
|
||||
( *elmVisibilities )[elmIdx] =
|
||||
( ( *indexIncludeVisibility )[elmIdx] || rangeFilter.isCellVisible( mainGridI, mainGridJ, mainGridK, false ) ) &&
|
||||
( *indexExcludeVisibility )[elmIdx];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for ( int elmIdx = 0; elmIdx < femPart->elementCount(); ++elmIdx )
|
||||
{
|
||||
grid->ijkFromCellIndex( elmIdx, &mainGridI, &mainGridJ, &mainGridK );
|
||||
( *elmVisibilities )[elmIdx] = rangeFilter.isCellVisible( mainGridI, mainGridJ, mainGridK, false ) &&
|
||||
( *indexExcludeVisibility )[elmIdx];
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for ( int elmIdx = 0; elmIdx < femPart->elementCount(); ++elmIdx )
|
||||
if ( useIndexInclude )
|
||||
{
|
||||
size_t mainGridI;
|
||||
size_t mainGridJ;
|
||||
size_t mainGridK;
|
||||
|
||||
grid->ijkFromCellIndex( elmIdx, &mainGridI, &mainGridJ, &mainGridK );
|
||||
( *elmVisibilities )[elmIdx] = !rangeFilter.isCellExcluded( mainGridI, mainGridJ, mainGridK, false );
|
||||
for ( int elmIdx = 0; elmIdx < femPart->elementCount(); ++elmIdx )
|
||||
{
|
||||
grid->ijkFromCellIndex( elmIdx, &mainGridI, &mainGridJ, &mainGridK );
|
||||
( *elmVisibilities )[elmIdx] = ( *indexIncludeVisibility )[elmIdx] &&
|
||||
!rangeFilter.isCellExcluded( mainGridI, mainGridJ, mainGridK, false ) &&
|
||||
( *indexExcludeVisibility )[elmIdx];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for ( int elmIdx = 0; elmIdx < femPart->elementCount(); ++elmIdx )
|
||||
{
|
||||
grid->ijkFromCellIndex( elmIdx, &mainGridI, &mainGridJ, &mainGridK );
|
||||
( *elmVisibilities )[elmIdx] = !rangeFilter.isCellExcluded( mainGridI, mainGridJ, mainGridK, false ) &&
|
||||
( *indexExcludeVisibility )[elmIdx];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,7 +36,12 @@ class RivFemElmVisibilityCalculator
|
||||
{
|
||||
public:
|
||||
static void computeAllVisible( cvf::UByteArray* elmVisibilities, const RigFemPart* femPart );
|
||||
static void computeRangeVisibility( cvf::UByteArray* elmVisibilities, const RigFemPart* femPart, const cvf::CellRangeFilter& rangeFilter );
|
||||
static void computeRangeVisibility( cvf::UByteArray* elmVisibilities,
|
||||
const RigFemPart* femPart,
|
||||
const cvf::CellRangeFilter& rangeFilter,
|
||||
const cvf::UByteArray* indexIncludeVisibility,
|
||||
const cvf::UByteArray* indexExcludeVisibility,
|
||||
bool useIndexInclude );
|
||||
|
||||
static void computePropertyVisibility( cvf::UByteArray* cellVisibility,
|
||||
const RigFemPart* grid,
|
||||
|
||||
@@ -239,7 +239,19 @@ RivGeoMechPartMgr* RivGeoMechVizLogic::getUpdatedPartMgr( RivGeoMechPartMgrCache
|
||||
{
|
||||
cvf::CellRangeFilter cellRangeFilter;
|
||||
m_geomechView->cellFilterCollection()->compoundCellRangeFilter( &cellRangeFilter, femPartIdx );
|
||||
RivFemElmVisibilityCalculator::computeRangeVisibility( elmVisibility.p(), caseData->femParts()->part( femPartIdx ), cellRangeFilter );
|
||||
|
||||
auto femPart = caseData->femParts()->part( femPartIdx );
|
||||
|
||||
cvf::UByteArray indexIncludeVisibility( femPart->elementCount() );
|
||||
cvf::UByteArray indexExcludeVisibility( femPart->elementCount() );
|
||||
m_geomechView->cellFilterCollection()->updateCellVisibilityByIndex( &indexIncludeVisibility, &indexExcludeVisibility, femPartIdx );
|
||||
|
||||
RivFemElmVisibilityCalculator::computeRangeVisibility( elmVisibility.p(),
|
||||
femPart,
|
||||
cellRangeFilter,
|
||||
&indexIncludeVisibility,
|
||||
&indexExcludeVisibility,
|
||||
m_geomechView->cellFilterCollection()->hasActiveIncludeIndexFilters() );
|
||||
}
|
||||
else if ( pMgrKey.geometryType() == PROPERTY_FILTERED )
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user