VTK: Invert IJK indices to match ResInsight convention

VTK coordinates are negated (z positive downward) to match ResInsight
internal convention, which flips the IJK directions relative to what the
structured grid algorithm expects. Add invertIJK flag to RigFemPartGrid
and RigFemPart so the inversion is applied during struct grid construction.
This commit is contained in:
Magne Sjaastad committed 2026-04-14 14:56:43 +02:00
1 parent 1f0c47fb5f
commit fb6a0624c8
5 files changed
+34 -6

No files matched your search

@@ -30,6 +30,7 @@ RigFemPart::RigFemPart()
: m_elementPartId( -1 )
, m_characteristicElementSize( std::numeric_limits<float>::infinity() )
, m_enabled( true )
, m_invertIJKInStructGrid( false )
{
}
@@ -227,12 +228,20 @@ const RigFemPartGrid* RigFemPart::getOrCreateStructGrid() const
if ( m_structGrid.isNull() )
{
m_structGrid = new RigFemPartGrid();
m_structGrid->setFemPart( this );
m_structGrid->setFemPart( this, m_invertIJKInStructGrid );
}
return m_structGrid.p();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RigFemPart::setInvertIJKInStructGrid( bool invert )
{
m_invertIJKInStructGrid = invert;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -95,6 +95,7 @@ public:
cvf::Vec3f faceNormal( int elementIndex, int faceIndex ) const;
const RigFemPartGrid* getOrCreateStructGrid() const;
void setInvertIJKInStructGrid( bool invert );
const std::vector<int>& elementIdxToId() const;
void setName( std::string name );
@@ -111,6 +112,7 @@ private:
int m_elementPartId;
std::string m_name;
bool m_enabled;
bool m_invertIJKInStructGrid;
std::vector<int> m_elementId;
std::vector<RigElementType> m_elementTypes;
@@ -43,16 +43,16 @@ RigFemPartGrid::~RigFemPartGrid()
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RigFemPartGrid::setFemPart( const RigFemPart* femPart )
void RigFemPartGrid::setFemPart( const RigFemPart* femPart, bool invertIJK )
{
m_femPart = femPart;
generateStructGridData();
generateStructGridData( invertIJK );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RigFemPartGrid::generateStructGridData()
void RigFemPartGrid::generateStructGridData( bool invertIJK )
{
//[X] 1. Calculate neighbors for each element
//[X] record the ones with 3 or fewer neighbors as possible grid corners
@@ -179,6 +179,19 @@ void RigFemPartGrid::generateStructGridData()
m_elmIdxPrIJK.resize( m_elementIJKCounts[0], m_elementIJKCounts[1], m_elementIJKCounts[2] );
if ( invertIJK )
{
size_t iCount = m_elementIJKCounts[0];
size_t jCount = m_elementIJKCounts[1];
size_t kCount = m_elementIJKCounts[2];
for ( auto& ijk : m_ijkPrElement )
{
if ( ijk[0] >= 0 ) ijk[0] = static_cast<int>( iCount ) - 1 - ijk[0];
if ( ijk[1] >= 0 ) ijk[1] = static_cast<int>( jCount ) - 1 - ijk[1];
if ( ijk[2] >= 0 ) ijk[2] = static_cast<int>( kCount ) - 1 - ijk[2];
}
}
for ( int elmIdx = 0; elmIdx < m_femPart->elementCount(); ++elmIdx )
{
size_t i, j, k;
@@ -31,7 +31,7 @@ public:
RigFemPartGrid();
~RigFemPartGrid() override;
void setFemPart( const RigFemPart* femPart );
void setFemPart( const RigFemPart* femPart, bool invertIJK = false );
size_t cellCountI() const override;
size_t cellCountJ() const override;
@@ -47,7 +47,7 @@ public:
cvf::Vec3d cellCentroid( size_t cellIndex ) const override;
private:
void generateStructGridData();
void generateStructGridData( bool invertIJK );
int findElmIdxForIJK000();
int perpendicularFaceInDirection( cvf::Vec3f direction, int perpFaceIdx, int elmIdx );
@@ -191,6 +191,10 @@ bool RifVtkReader::readFemParts( RigFemPartCollection* femParts )
femPart->addElementSet( setName, elementSet );
}
// VTK coordinates are negated to match ResInsight internal convention (z positive downward),
// which flips the IJK directions. Invert all so IJK=0 is at the correct corner.
femPart->setInvertIJKInStructGrid( true );
femPart->setElementPartId( femParts->partCount() );
femParts->addFemPart( femPart );