mirror of
https://github.com/OPM/ResInsight.git
synced 2026-10-03 12:16:45 -05:00
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:
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 );
|
||||
|
||||
|
||||
Reference in new issue
Block a user