Performance: Cellcount functions are used in many loops, and must be as fast as possible

cellCountIJK was computed based on the value of griPointDimensions. These converstion turned up during profiling. Change implementation to have cellcount as a member variable instead of being computed every time.
This commit is contained in:
Magne Sjaastad
2024-01-21 21:00:18 +01:00
parent 663c3f31b9
commit 833a0e8584
8 changed files with 92 additions and 97 deletions

View File

@@ -362,30 +362,6 @@ int RigFemPartGrid::perpendicularFaceInDirection( cvf::Vec3f direction, int perp
return bestFace;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
size_t RigFemPartGrid::gridPointCountI() const
{
return m_elementIJKCounts[0] + 1;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
size_t RigFemPartGrid::gridPointCountJ() const
{
return m_elementIJKCounts[1] + 1;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
size_t RigFemPartGrid::gridPointCountK() const
{
return m_elementIJKCounts[2] + 1;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -491,6 +467,30 @@ cvf::Vec3d RigFemPartGrid::cellCentroid( size_t cellIndex ) const
return centroid / 8.0;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
size_t RigFemPartGrid::cellCountI() const
{
return m_elementIJKCounts[0];
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
size_t RigFemPartGrid::cellCountJ() const
{
return m_elementIJKCounts[1];
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
size_t RigFemPartGrid::cellCountK() const
{
return m_elementIJKCounts[2];
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------

View File

@@ -31,13 +31,13 @@ public:
void setFemPart( const RigFemPart* femPart );
size_t cellCountI() const override;
size_t cellCountJ() const override;
size_t cellCountK() const override;
bool ijkFromCellIndex( size_t cellIndex, size_t* i, size_t* j, size_t* k ) const override;
size_t cellIndexFromIJK( size_t i, size_t j, size_t k ) const override;
size_t gridPointCountI() const override;
size_t gridPointCountJ() const override;
size_t gridPointCountK() const override;
cvf::Vec3i findMainIJKFaces( int elementIndex ) const;
std::pair<cvf::Vec3st, cvf::Vec3st> reservoirIJKBoundingBox() const;

View File

@@ -271,7 +271,7 @@ QList<caf::PdmOptionItemInfo> RimGeoMechResultDefinition::calculateValueOptions(
{
if ( m_geomCase->geoMechData() )
{
size_t kCount = m_geomCase->geoMechData()->femParts()->part( 0 )->getOrCreateStructGrid()->gridPointCountK() - 1;
size_t kCount = m_geomCase->geoMechData()->femParts()->part( 0 )->getOrCreateStructGrid()->cellCountK();
for ( size_t layerIdx = 0; layerIdx < kCount; ++layerIdx )
{
options.push_back( caf::PdmOptionItemInfo( QString::number( layerIdx + 1 ), (int)layerIdx ) );

View File

@@ -585,7 +585,7 @@ QList<caf::PdmOptionItemInfo> RimMudWeightWindowParameters::calculateValueOption
{
if ( geoMechCase->geoMechData() )
{
size_t kCount = geoMechCase->geoMechData()->femParts()->part( 0 )->getOrCreateStructGrid()->gridPointCountK() - 1;
size_t kCount = geoMechCase->geoMechData()->femParts()->part( 0 )->getOrCreateStructGrid()->cellCountK();
for ( size_t layerIdx = 0; layerIdx < kCount; ++layerIdx )
{
options.push_back( caf::PdmOptionItemInfo( QString::number( layerIdx + 1 ), (int)layerIdx ) );

View File

@@ -49,6 +49,26 @@ RigGridBase::~RigGridBase()
{
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RigGridBase::setGridPointDimensions( const cvf::Vec3st& gridDimensions )
{
m_gridPointDimensions = gridDimensions;
m_cellCount.x() = ( m_gridPointDimensions.x() > 0 ? m_gridPointDimensions.x() - 1 : 0 );
m_cellCount.y() = ( m_gridPointDimensions.y() > 0 ? m_gridPointDimensions.y() - 1 : 0 );
m_cellCount.z() = ( m_gridPointDimensions.z() > 0 ? m_gridPointDimensions.z() - 1 : 0 );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
cvf::Vec3st RigGridBase::gridPointDimensions()
{
return m_gridPointDimensions;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -299,30 +319,6 @@ cvf::Vec3d RigGridBase::minCoordinate() const
return v;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
size_t RigGridBase::gridPointCountI() const
{
return m_gridPointDimensions.x();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
size_t RigGridBase::gridPointCountJ() const
{
return m_gridPointDimensions.y();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
size_t RigGridBase::gridPointCountK() const
{
return m_gridPointDimensions.z();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -512,6 +508,38 @@ cvf::BoundingBox RigGridBase::boundingBox()
return m_boundingBox;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
size_t RigGridBase::cellCountI() const
{
return m_cellCount.x();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
size_t RigGridBase::cellCountJ() const
{
return m_cellCount.y();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
size_t RigGridBase::cellCountK() const
{
return m_cellCount.z();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
size_t RigGridBase::cellCount() const
{
return cellCountI() * cellCountJ() * cellCountK();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------

View File

@@ -43,8 +43,12 @@ public:
explicit RigGridBase( RigMainGrid* mainGrid );
~RigGridBase() override;
void setGridPointDimensions( const cvf::Vec3st& gridDimensions ) { m_gridPointDimensions = gridDimensions; }
cvf::Vec3st gridPointDimensions() { return m_gridPointDimensions; }
void setGridPointDimensions( const cvf::Vec3st& gridDimensions );
cvf::Vec3st gridPointDimensions();
size_t cellCountI() const override;
size_t cellCountJ() const override;
size_t cellCountK() const override;
size_t cellCount() const { return cellCountI() * cellCountJ() * cellCountK(); }
RigCell& cell( size_t gridLocalCellIndex );
@@ -84,10 +88,6 @@ protected:
// Interface implementation
public:
size_t gridPointCountI() const override;
size_t gridPointCountJ() const override;
size_t gridPointCountK() const override;
cvf::Vec3d minCoordinate() const override;
cvf::Vec3d maxCoordinate() const override;
cvf::Vec3d displayModelOffset() const override;
@@ -116,6 +116,7 @@ public:
private:
std::string m_gridName;
cvf::Vec3st m_gridPointDimensions;
cvf::Vec3st m_cellCount;
size_t m_indexToStartOfCells; ///< Index into the global cell array stored in main-grid where this grids cells starts.
size_t m_gridIndex; ///< The LGR index of this grid. Starts with 1. Main grid has index 0.
int m_gridId; ///< The LGR id of this grid. Main grid has id 0.

View File

@@ -67,36 +67,6 @@ StructGridInterface::StructGridInterface()
m_characteristicCellSizeK = cvf::UNDEFINED_DOUBLE;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
size_t StructGridInterface::cellCountI() const
{
if ( gridPointCountI() == 0 ) return 0;
return gridPointCountI() - 1;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
size_t StructGridInterface::cellCountJ() const
{
if ( gridPointCountJ() == 0 ) return 0;
return gridPointCountJ() - 1;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
size_t StructGridInterface::cellCountK() const
{
if ( gridPointCountK() == 0 ) return 0;
return gridPointCountK() - 1;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------

View File

@@ -77,13 +77,9 @@ public:
public:
StructGridInterface();
virtual size_t gridPointCountI() const = 0;
virtual size_t gridPointCountJ() const = 0;
virtual size_t gridPointCountK() const = 0;
size_t cellCountI() const;
size_t cellCountJ() const;
size_t cellCountK() const;
virtual size_t cellCountI() const = 0;
virtual size_t cellCountJ() const = 0;
virtual size_t cellCountK() const = 0;
virtual bool isCellValid( size_t i, size_t j, size_t k ) const = 0;