From: eap Date: Thu, 16 May 2013 16:38:48 +0000 (+0000) Subject: 0022100: EDF 2413 SMESH: Take into account TRIA7 X-Git-Tag: V7_3_0a1~463 X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=commitdiff_plain;h=6d0acadd44c80b820b712557cfa7f286a46d9e8c 0022100: EDF 2413 SMESH: Take into account TRIA7 --- diff --git a/src/DriverCGNS/DriverCGNS_Write.cxx b/src/DriverCGNS/DriverCGNS_Write.cxx index 440330754..12cea95ac 100644 --- a/src/DriverCGNS/DriverCGNS_Write.cxx +++ b/src/DriverCGNS/DriverCGNS_Write.cxx @@ -81,6 +81,8 @@ namespace 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 }; @@ -341,9 +343,12 @@ Driver_Mesh::Status DriverCGNS_Write::Perform() 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 )); @@ -351,7 +356,7 @@ Driver_Mesh::Status DriverCGNS_Write::Perform() elem = elemIt->more() ? elemIt->next() : 0; } while ( elem && elem->GetEntityType() == elemType ); - + } else if ( elemType == SMDSEntity_Polygon ) // POLYGONS do { diff --git a/src/DriverGMF/DriverGMF_Write.cxx b/src/DriverGMF/DriverGMF_Write.cxx index c0542620e..d4f474771 100644 --- a/src/DriverGMF/DriverGMF_Write.cxx +++ b/src/DriverGMF/DriverGMF_Write.cxx @@ -155,8 +155,8 @@ Driver_Mesh::Status DriverGMF_Write::Perform() 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 diff --git a/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx b/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx index a7527fb97..cd6243d16 100644 --- a/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx +++ b/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx @@ -431,6 +431,7 @@ DriverMED_R_SMESHDS_Mesh 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; @@ -552,6 +553,24 @@ DriverMED_R_SMESHDS_Mesh 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) diff --git a/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx b/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx index ade26b2b7..a3d934c84 100644 --- a/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx +++ b/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx @@ -532,28 +532,33 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() 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 ) - @@ -578,25 +583,25 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform() 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 ), diff --git a/src/DriverUNV/DriverUNV_R_SMDS_Mesh.cxx b/src/DriverUNV/DriverUNV_R_SMDS_Mesh.cxx index 6856037fa..d1c984595 100644 --- a/src/DriverUNV/DriverUNV_R_SMDS_Mesh.cxx +++ b/src/DriverUNV/DriverUNV_R_SMDS_Mesh.cxx @@ -198,23 +198,32 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() 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 @@ -227,29 +236,41 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() 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], diff --git a/src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx b/src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx index d83601308..b981927bc 100644 --- a/src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx +++ b/src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx @@ -106,17 +106,16 @@ Driver_Mesh::Status DriverUNV_W_SMDS_Mesh::Perform() 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); } @@ -135,29 +134,18 @@ Driver_Mesh::Status DriverUNV_W_SMDS_Mesh::Perform() 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; } @@ -173,11 +161,9 @@ Driver_Mesh::Status DriverUNV_W_SMDS_Mesh::Perform() 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; @@ -196,6 +182,7 @@ Driver_Mesh::Status DriverUNV_W_SMDS_Mesh::Perform() 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();