From b9b3af112da57064b63a2b2c9644edcc808c1116 Mon Sep 17 00:00:00 2001 From: eap Date: Mon, 20 Jan 2014 10:32:49 +0000 Subject: [PATCH] 22316: EDF 2719 SMESH: Split hexas into prisms + static int GetOppFaceIndexOfHex( int faceIndex ); --- src/SMDS/SMDS_VolumeTool.cxx | 52 +++++++++++++++++++++++++++--------- src/SMDS/SMDS_VolumeTool.hxx | 6 ++++- 2 files changed, 44 insertions(+), 14 deletions(-) diff --git a/src/SMDS/SMDS_VolumeTool.cxx b/src/SMDS/SMDS_VolumeTool.cxx index 56e7a3132..d773413e3 100644 --- a/src/SMDS/SMDS_VolumeTool.cxx +++ b/src/SMDS/SMDS_VolumeTool.cxx @@ -132,8 +132,6 @@ static int Penta_nbN [] = { 3, 3, 4, 4, 4 }; // / | / | // N4+----------+N7 | // | | | | HEXAHEDRON -// | | | | -// | | | | // | N1+------|---+N2 // | / | / // | / | / @@ -155,6 +153,7 @@ static int Hexa_RE [6][5] = { // REVERSED -> EXTERNAL { 3, 7, 6, 2, 3 }, { 0, 4, 7, 3, 0 }}; static int Hexa_nbN [] = { 4, 4, 4, 4, 4, 4 }; +static int Hexa_oppF[] = { 1, 0, 4, 5, 2, 3 }; // oppopsite facet indices /* // N8 +------+ N9 @@ -279,7 +278,7 @@ static int QuadPyram_nbN [] = { 8, 6, 6, 6, 6 }; */ static int QuadPenta_F [5][9] = { // FORWARD { 0, 6, 1, 7, 2, 8, 0, 0, 0 }, - { 3,11, 5, 10,4, 9, 3, 3, 3 }, + { 3, 11,5, 10,4, 9, 3, 3, 3 }, { 0, 12,3, 9, 4, 13,1, 6, 0 }, { 1, 13,4, 10,5, 14,2, 7, 1 }, { 0, 8, 2, 14,5, 11,3, 12,0 }}; @@ -1147,12 +1146,7 @@ int SMDS_VolumeTool::GetOppFaceIndex( int faceIndex ) const break; case 20: case 27: - if ( faceIndex <= 1 ) // top or bottom - ind = 1 - faceIndex; - else { - const int nbSideFaces = myAllFacesNbNodes[0] / 2; - ind = ( faceIndex - nbHoriFaces + nbSideFaces/2 ) % nbSideFaces + nbHoriFaces; - } + ind = GetOppFaceIndexOfHex( faceIndex ); break; default:; } @@ -1160,6 +1154,16 @@ int SMDS_VolumeTool::GetOppFaceIndex( int faceIndex ) const return ind; } +//======================================================================= +//function : GetOppFaceIndexOfHex +//purpose : Return index of the opposite face of the hexahedron +//======================================================================= + +int SMDS_VolumeTool::GetOppFaceIndexOfHex( int faceIndex ) +{ + return Hexa_oppF[ faceIndex ]; +} + //======================================================================= //function : IsLinked //purpose : return true if theNode1 is linked with theNode2 @@ -1660,16 +1664,38 @@ bool SMDS_VolumeTool::IsFreeFaceAdv( int faceIndex, const SMDS_MeshElement** oth //purpose : Return index of a face formed by theFaceNodes //======================================================================= -int SMDS_VolumeTool::GetFaceIndex( const set& theFaceNodes ) const +int SMDS_VolumeTool::GetFaceIndex( const set& theFaceNodes, + const int theFaceIndexHint ) const { + if ( theFaceIndexHint >= 0 ) + { + int nbNodes = NbFaceNodes( theFaceIndexHint ); + if ( nbNodes == (int) theFaceNodes.size() ) + { + const SMDS_MeshNode** nodes = GetFaceNodes( theFaceIndexHint ); + while ( nbNodes ) + if ( theFaceNodes.count( nodes[ nbNodes-1 ])) + --nbNodes; + else + break; + if ( nbNodes == 0 ) + return theFaceIndexHint; + } + } for ( int iFace = 0; iFace < myNbFaces; iFace++ ) { - const int nbNodes = NbFaceNodes( iFace ); + if ( iFace == theFaceIndexHint ) + continue; + int nbNodes = NbFaceNodes( iFace ); if ( nbNodes == (int) theFaceNodes.size() ) { const SMDS_MeshNode** nodes = GetFaceNodes( iFace ); - set nodeSet( nodes, nodes + nbNodes); - if ( theFaceNodes == nodeSet ) + while ( nbNodes ) + if ( theFaceNodes.count( nodes[ nbNodes-1 ])) + --nbNodes; + else + break; + if ( nbNodes == 0 ) return iFace; } } diff --git a/src/SMDS/SMDS_VolumeTool.hxx b/src/SMDS/SMDS_VolumeTool.hxx index bde071fde..f09704edd 100644 --- a/src/SMDS/SMDS_VolumeTool.hxx +++ b/src/SMDS/SMDS_VolumeTool.hxx @@ -201,7 +201,8 @@ class SMDS_EXPORT SMDS_VolumeTool int GetCenterNodeIndex( int faceIndex ) const; // Return index of the node located at face center of a quadratic element like HEX27 - int GetFaceIndex( const std::set& theFaceNodes ) const; + int GetFaceIndex( const std::set& theFaceNodes, + const int theFaceIndexHint=-1) const; // Return index of a face formed by theFaceNodes. // Return -1 if a face not found @@ -238,6 +239,9 @@ class SMDS_EXPORT SMDS_VolumeTool static int NbCornerNodes(VolumeType type); // Useful to know nb of corner nodes of a quadratic volume + static int GetOppFaceIndexOfHex( int faceIndex ); + // Return index of the opposite face of the hexahedron + private: bool setFace( int faceIndex ) const; -- 2.39.2