static int ids[] = { 0, 2, 1, 5, 4, 3 };
interlaces[SMDSEntity_Quad_Triangle] = ids;
cgTypes [SMDSEntity_Quad_Triangle] = CGNS_ENUMV( TRI_6 );
+ interlaces[SMDSEntity_BiQuad_Triangle] = ids;
+ cgTypes [SMDSEntity_BiQuad_Triangle] = CGNS_ENUMV( TRI_6 );
}
{
static int ids[] = { 0, 3, 2, 1 };
startID = cgID;
if ( interlace ) // STANDARD elements
+ {
+ int cgnsNbNodes; // get nb nodes by element type, that can be less that elem->NbNodes()
+ cg_npe( cgType, &cgnsNbNodes );
do
{
- for ( int i = 0, nb = elem->NbNodes(); i < nb; ++i )
+ for ( int i = 0; i < cgnsNbNodes; ++i )
elemData.push_back( cgnsID( elem->GetNode( interlace[i] ), n2cgID ));
if ( elem->GetID() != cgID )
elem2cgID.insert( elem2cgID.end(), make_pair( elem, cgID ));
elem = elemIt->more() ? elemIt->next() : 0;
}
while ( elem && elem->GetEntityType() == elemType );
-
+ }
else if ( elemType == SMDSEntity_Polygon ) // POLYGONS
do
{
GmfExtraVerticesAtTriangles, tria )
node2IdMap[ tria->GetNode( 3 )],
node2IdMap[ tria->GetNode( 4 )],
- node2IdMap[ tria->GetNode( 5 )]
- //node2IdMap[ tria->GetNodeWrap( 6 )] // for TRIA7
+ node2IdMap[ tria->GetNode( 5 )],
+ node2IdMap[ tria->GetNodeWrap( 6 )] // for TRIA7
END_EXTRA_VERTICES_WRITE();
// quadrangles
case eSEG3: aNbNodes = 3; break;
case eTRIA3: aNbNodes = 3; break;
case eTRIA6: aNbNodes = 6; break;
+ case eTRIA7: aNbNodes = 7; break;
case eQUAD4: aNbNodes = 4; break;
case eQUAD8: aNbNodes = 8; break;
case eQUAD9: aNbNodes = 9; break;
isRenum = anIsElemNum;
}
break;
+ case eTRIA7:
+ aNbNodes = 7;
+ if(anIsElemNum)
+ anElement = myMesh->AddFaceWithID(aNodeIds[0], aNodeIds[1],
+ aNodeIds[2], aNodeIds[3],
+ aNodeIds[4], aNodeIds[5], aNodeIds[6],
+ aCellInfo->GetElemNum(iElem));
+ if (!anElement) {
+ anElement = myMesh->AddFace(FindNode(myMesh,aNodeIds[0]),
+ FindNode(myMesh,aNodeIds[1]),
+ FindNode(myMesh,aNodeIds[2]),
+ FindNode(myMesh,aNodeIds[3]),
+ FindNode(myMesh,aNodeIds[4]),
+ FindNode(myMesh,aNodeIds[5]),
+ FindNode(myMesh,aNodeIds[6]));
+ isRenum = anIsElemNum;
+ }
+ break;
case eQUAD4:
aNbNodes = 4;
if(anIsElemNum)
anEntity = eARETE;
#endif
aTElemTypeDatas.push_back( TElemTypeData(anEntity,
- eSEG2,
- nbElemInfo.NbEdges( ORDER_LINEAR ),
- SMDSAbs_Edge));
+ eSEG2,
+ nbElemInfo.NbEdges( ORDER_LINEAR ),
+ SMDSAbs_Edge));
aTElemTypeDatas.push_back( TElemTypeData(anEntity,
- eSEG3,
- nbElemInfo.NbEdges( ORDER_QUADRATIC ),
- SMDSAbs_Edge));
+ eSEG3,
+ nbElemInfo.NbEdges( ORDER_QUADRATIC ),
+ SMDSAbs_Edge));
#ifdef _ELEMENTS_BY_DIM_
anEntity = eFACE;
#endif
aTElemTypeDatas.push_back( TElemTypeData(anEntity,
- eTRIA3,
- nbElemInfo.NbTriangles( ORDER_LINEAR ),
- SMDSAbs_Face));
+ eTRIA3,
+ nbElemInfo.NbTriangles( ORDER_LINEAR ),
+ SMDSAbs_Face));
aTElemTypeDatas.push_back( TElemTypeData(anEntity,
- eTRIA6,
- nbElemInfo.NbTriangles( ORDER_QUADRATIC ),
- SMDSAbs_Face));
+ eTRIA6,
+ nbElemInfo.NbTriangles( ORDER_QUADRATIC ) -
+ nbElemInfo.NbBiQuadTriangles(),
+ SMDSAbs_Face));
aTElemTypeDatas.push_back( TElemTypeData(anEntity,
- eQUAD4,
- nbElemInfo.NbQuadrangles( ORDER_LINEAR ),
- SMDSAbs_Face));
+ eTRIA7,
+ nbElemInfo.NbBiQuadTriangles(),
+ SMDSAbs_Face));
+ aTElemTypeDatas.push_back( TElemTypeData(anEntity,
+ eQUAD4,
+ nbElemInfo.NbQuadrangles( ORDER_LINEAR ),
+ SMDSAbs_Face));
aTElemTypeDatas.push_back( TElemTypeData(anEntity,
eQUAD8,
nbElemInfo.NbQuadrangles( ORDER_QUADRATIC ) -
anEntity = eMAILLE;
#endif
aTElemTypeDatas.push_back( TElemTypeData(anEntity,
- eTETRA4,
- nbElemInfo.NbTetras( ORDER_LINEAR ),
- SMDSAbs_Volume));
+ eTETRA4,
+ nbElemInfo.NbTetras( ORDER_LINEAR ),
+ SMDSAbs_Volume));
aTElemTypeDatas.push_back( TElemTypeData(anEntity,
- eTETRA10,
- nbElemInfo.NbTetras( ORDER_QUADRATIC ),
- SMDSAbs_Volume));
+ eTETRA10,
+ nbElemInfo.NbTetras( ORDER_QUADRATIC ),
+ SMDSAbs_Volume));
aTElemTypeDatas.push_back( TElemTypeData(anEntity,
- ePYRA5,
- nbElemInfo.NbPyramids( ORDER_LINEAR ),
- SMDSAbs_Volume));
+ ePYRA5,
+ nbElemInfo.NbPyramids( ORDER_LINEAR ),
+ SMDSAbs_Volume));
aTElemTypeDatas.push_back( TElemTypeData(anEntity,
- ePYRA13,
- nbElemInfo.NbPyramids( ORDER_QUADRATIC ),
- SMDSAbs_Volume));
+ ePYRA13,
+ nbElemInfo.NbPyramids( ORDER_QUADRATIC ),
+ SMDSAbs_Volume));
aTElemTypeDatas.push_back( TElemTypeData(anEntity,
- ePENTA6,
- nbElemInfo.NbPrisms( ORDER_LINEAR ),
- SMDSAbs_Volume));
+ ePENTA6,
+ nbElemInfo.NbPrisms( ORDER_LINEAR ),
+ SMDSAbs_Volume));
aTElemTypeDatas.push_back( TElemTypeData(anEntity,
ePENTA15,
nbElemInfo.NbPrisms( ORDER_QUADRATIC ),
aRec.node_labels[2],
aRec.label);
break;
-
+
case 42: // Plane Stress Parabolic Triangle
case 52: // Plane Strain Parabolic Triangle
case 62: // Plate Parabolic Triangle
case 72: // Membrane Parabolic Triangle
case 82: // Axisymetric Solid Parabolic Triangle
- case 92: // Thin Shell Parabolic Triangle
- //MESSAGE("add face " << aRec.label << " " << aRec.node_labels[0] << " " << aRec.node_labels[1] << " " << aRec.node_labels[2] << " " << aRec.node_labels[3] << " " << aRec.node_labels[4] << " " << aRec.node_labels[5]);
- anElement = myMesh->AddFaceWithID(aRec.node_labels[0],
- aRec.node_labels[2],
- aRec.node_labels[4],
- aRec.node_labels[1],
- aRec.node_labels[3],
- aRec.node_labels[5],
- aRec.label);
+ case 92: // Thin Shell Parabolic Triangle
+ if ( aRec.node_labels.size() == 7 )
+ anElement = myMesh->AddFaceWithID(aRec.node_labels[0],
+ aRec.node_labels[2],
+ aRec.node_labels[4],
+ aRec.node_labels[1],
+ aRec.node_labels[3],
+ aRec.node_labels[5],
+ aRec.node_labels[6],
+ aRec.label);
+ else
+ anElement = myMesh->AddFaceWithID(aRec.node_labels[0],
+ aRec.node_labels[2],
+ aRec.node_labels[4],
+ aRec.node_labels[1],
+ aRec.node_labels[3],
+ aRec.node_labels[5],
+ aRec.label);
break;
-
+
case 44: // Plane Stress Linear Quadrilateral
case 54: // Plane Strain Linear Quadrilateral
case 64: // Plate Linear Quadrilateral
aRec.node_labels[3],
aRec.label);
break;
-
+
case 45: // Plane Stress Parabolic Quadrilateral
case 55: // Plane Strain Parabolic Quadrilateral
case 65: // Plate Parabolic Quadrilateral
case 75: // Membrane Parabolic Quadrilateral
case 85: // Axisymetric Solid Parabolic Quadrilateral
case 95: // Thin Shell Parabolic Quadrilateral
- anElement = myMesh->AddFaceWithID(aRec.node_labels[0],
- aRec.node_labels[2],
- aRec.node_labels[4],
- aRec.node_labels[6],
- aRec.node_labels[1],
- aRec.node_labels[3],
- aRec.node_labels[5],
- aRec.node_labels[7],
- aRec.label);
+ if ( aRec.node_labels.size() == 9 )
+ anElement = myMesh->AddFaceWithID(aRec.node_labels[0],
+ aRec.node_labels[2],
+ aRec.node_labels[4],
+ aRec.node_labels[6],
+ aRec.node_labels[1],
+ aRec.node_labels[3],
+ aRec.node_labels[5],
+ aRec.node_labels[7],
+ aRec.node_labels[8],
+ aRec.label);
+ else
+ anElement = myMesh->AddFaceWithID(aRec.node_labels[0],
+ aRec.node_labels[2],
+ aRec.node_labels[4],
+ aRec.node_labels[6],
+ aRec.node_labels[1],
+ aRec.node_labels[3],
+ aRec.node_labels[5],
+ aRec.node_labels[7],
+ aRec.label);
break;
}
}
else if(IsVolume(aRec.fe_descriptor_id)){
//MESSAGE("add volume " << aRec.label);
switch(aRec.fe_descriptor_id){
-
+
case 111: // Solid Linear Tetrahedron - TET4
anElement = myMesh->AddVolumeWithID(aRec.node_labels[0],
aRec.node_labels[2],
TRecord aRec;
aRec.label = anElem->GetID();
aRec.node_labels.reserve(aNbNodes);
- SMDS_ElemIteratorPtr aNodesIter;
- aNodesIter = anElem->nodesIteratorToUNV();
if( anElem->IsQuadratic() ) {
aRec.fe_descriptor_id = 22;
} else {
aRec.fe_descriptor_id = 11;
}
+ SMDS_NodeIteratorPtr aNodesIter = anElem->nodesIteratorToUNV();
while( aNodesIter->more())
{
- const SMDS_MeshElement* aNode = aNodesIter->next();
- aRec.node_labels.push_back(aNode->GetID());
+ const SMDS_MeshNode* aNode = aNodesIter->next();
+ aRec.node_labels.push_back( aNode->GetID() );
}
aDataSet2412.push_back(aRec);
}
TRecord aRec;
aRec.label = anElem->GetID();
aRec.node_labels.reserve(aNbNodes);
- SMDS_ElemIteratorPtr aNodesIter;
- aNodesIter = anElem->nodesIteratorToUNV();
- for(; aNodesIter->more();){
- const SMDS_MeshElement* aNode = aNodesIter->next();
- aRec.node_labels.push_back(aNode->GetID());
+ SMDS_NodeIteratorPtr aNodesIter = anElem->nodesIteratorToUNV();
+ while( aNodesIter->more() ) {
+ const SMDS_MeshNode* aNode = aNodesIter->next();
+ aRec.node_labels.push_back( aNode->GetID() );
}
- switch(aNbNodes){
- case 3:
- aRec.fe_descriptor_id = 41;
- break;
- case 4:
- aRec.fe_descriptor_id = 44;
- break;
- case 6:
- aRec.fe_descriptor_id = 42;
- break;
- case 8:
- aRec.fe_descriptor_id = 45;
- break;
- case 9:
- aRec.fe_descriptor_id = 45;
- aRec.node_labels.resize( 8 );
- break;
+ switch ( aNbNodes ) {
+ case 3: aRec.fe_descriptor_id = 41; break;
+ case 4: aRec.fe_descriptor_id = 44; break;
+ case 6: aRec.fe_descriptor_id = 42; break;
+ case 7: aRec.fe_descriptor_id = 42; break;
+ case 8: aRec.fe_descriptor_id = 45; break;
+ case 9: aRec.fe_descriptor_id = 45; aRec.node_labels.resize( 8 ); break;
default:
continue;
}
while ( anIter->more())
{
const SMDS_MeshVolume* anElem = anIter->next();
- int aNbNodes = anElem->NbNodes();
- SMDS_ElemIteratorPtr aNodesIter = anElem->nodesIteratorToUNV();
- if ( anElem->IsPoly() ) {
+ if ( anElem->IsPoly() )
continue;
- }
+ int aNbNodes = anElem->NbNodes();
int anId = -1;
switch(aNbNodes) {
case 4: anId = 111; break;
aRec.label = anElem->GetID();
aRec.fe_descriptor_id = anId;
aRec.node_labels.reserve(aNbNodes);
+ SMDS_NodeIteratorPtr aNodesIter = anElem->nodesIteratorToUNV();
while ( aNodesIter->more() && aRec.node_labels.size() < aNbNodes )
{
const SMDS_MeshElement* aNode = aNodesIter->next();