Cell filter performance improvement (#10550)

* Speed up eclipse and geomech cell filters
This commit is contained in:
jonjenssen
2023-08-29 14:41:55 +02:00
committed by GitHub
parent 81809efee9
commit 0a807618b9
14 changed files with 217 additions and 50 deletions

View File

@@ -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];
}
}
}
}

View File

@@ -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,

View File

@@ -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 )
{