From a701eb4ca31fd7837158bdd72280b693c1d10114 Mon Sep 17 00:00:00 2001 From: eap Date: Mon, 3 Apr 2006 06:05:56 +0000 Subject: [PATCH] PAL11736. fix reading/writting quadratic elements --- src/DriverUNV/DriverUNV_R_SMDS_Mesh.cxx | 72 ++++++++++++++----------- src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx | 31 +++++++---- 2 files changed, 61 insertions(+), 42 deletions(-) diff --git a/src/DriverUNV/DriverUNV_R_SMDS_Mesh.cxx b/src/DriverUNV/DriverUNV_R_SMDS_Mesh.cxx index 70a913602..e635874ff 100644 --- a/src/DriverUNV/DriverUNV_R_SMDS_Mesh.cxx +++ b/src/DriverUNV/DriverUNV_R_SMDS_Mesh.cxx @@ -74,7 +74,7 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() const TElementLab& aLabel = anIter->first; const TRecord& aRec = anIter->second; if(IsBeam(aRec.fe_descriptor_id)) { - if((aRec.fe_descriptor_id == 11) || (aRec.fe_descriptor_id == 21)) { + if(aRec.fe_descriptor_id == 11) { // edge with two nodes anElement = myMesh->AddEdgeWithID(aRec.node_labels[0], aRec.node_labels[1], @@ -83,8 +83,8 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() else { // quadratic edge (with 3 nodes) anElement = myMesh->AddEdgeWithID(aRec.node_labels[0], - aRec.node_labels[1], aRec.node_labels[2], + aRec.node_labels[1], aLabel); } } @@ -105,10 +105,10 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() case 42: // Plane Stress Quadratic Triangle - TRI6 case 92: // Thin Shell Quadratic Triangle - TRI6 anElement = myMesh->AddFaceWithID(aRec.node_labels[0], - aRec.node_labels[1], aRec.node_labels[2], - aRec.node_labels[3], aRec.node_labels[4], + aRec.node_labels[1], + aRec.node_labels[3], aRec.node_labels[5], aLabel); break; @@ -125,12 +125,12 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() case 45: // Plane Stress Quadratic Quadrilateral - QUAD8 case 95: // Thin Shell Quadratic Quadrilateral - QUAD8 anElement = myMesh->AddFaceWithID(aRec.node_labels[0], - aRec.node_labels[1], aRec.node_labels[2], - aRec.node_labels[3], aRec.node_labels[4], - aRec.node_labels[5], aRec.node_labels[6], + aRec.node_labels[1], + aRec.node_labels[3], + aRec.node_labels[5], aRec.node_labels[7], aLabel); break; @@ -149,15 +149,18 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() case 118: // Solid Quadratic Tetrahedron - TET10 anElement = myMesh->AddVolumeWithID(aRec.node_labels[0], - aRec.node_labels[2], - aRec.node_labels[1], - aRec.node_labels[3], - aRec.node_labels[6], - aRec.node_labels[5], aRec.node_labels[4], - aRec.node_labels[7], + aRec.node_labels[2], + aRec.node_labels[9], + + aRec.node_labels[5], + aRec.node_labels[3], + aRec.node_labels[1], + + aRec.node_labels[6], aRec.node_labels[8], + aRec.node_labels[7], aLabel); break; @@ -173,20 +176,24 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() case 113: // Solid Quadratic Prism - PRISM15 anElement = myMesh->AddVolumeWithID(aRec.node_labels[0], - aRec.node_labels[2], - aRec.node_labels[1], - aRec.node_labels[3], - aRec.node_labels[5], aRec.node_labels[4], + aRec.node_labels[2], + + aRec.node_labels[9], + aRec.node_labels[13], + aRec.node_labels[11], + + aRec.node_labels[5], + aRec.node_labels[3], + aRec.node_labels[1], + + aRec.node_labels[14], + aRec.node_labels[12], + aRec.node_labels[10], + + aRec.node_labels[6], aRec.node_labels[8], aRec.node_labels[7], - aRec.node_labels[6], - aRec.node_labels[11], - aRec.node_labels[10], - aRec.node_labels[9], - aRec.node_labels[12], - aRec.node_labels[14], - aRec.node_labels[13], aLabel); break; @@ -232,18 +239,19 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() case 114: // pyramid of 13 nodes (quadratic) - PIRA13 anElement = myMesh->AddVolumeWithID(aRec.node_labels[0], - aRec.node_labels[3], - aRec.node_labels[2], - aRec.node_labels[1], - aRec.node_labels[4], - aRec.node_labels[8], - aRec.node_labels[7], aRec.node_labels[6], + aRec.node_labels[4], + aRec.node_labels[2], + aRec.node_labels[7], aRec.node_labels[5], - aRec.node_labels[9], - aRec.node_labels[12], + aRec.node_labels[3], + aRec.node_labels[1], + + aRec.node_labels[8], aRec.node_labels[11], aRec.node_labels[10], + aRec.node_labels[9], + aRec.node_labels[12], aLabel); break; diff --git a/src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx b/src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx index a716945d9..fe181f78e 100644 --- a/src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx +++ b/src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx @@ -22,6 +22,8 @@ #include "DriverUNV_W_SMDS_Mesh.h" #include "SMDS_Mesh.hxx" +#include "SMDS_QuadraticEdge.hxx" +#include "SMDS_QuadraticFaceOfNodes.hxx" #include "utilities.h" @@ -86,15 +88,19 @@ Driver_Mesh::Status DriverUNV_W_SMDS_Mesh::Perform() int aNbNodes = anElem->NbNodes(); TRecord aRec; aRec.node_labels.reserve(aNbNodes); - SMDS_ElemIteratorPtr aNodesIter = anElem->nodesIterator(); + SMDS_ElemIteratorPtr aNodesIter; + if( anElem->IsQuadratic() ) { + aNodesIter = static_cast + ( anElem )->interlacedNodesElemIterator(); + aRec.fe_descriptor_id = 21; + } else { + aNodesIter = anElem->nodesIterator(); + aRec.fe_descriptor_id = 11; + } for(; aNodesIter->more();){ const SMDS_MeshElement* aNode = aNodesIter->next(); aRec.node_labels.push_back(aNode->GetID()); } - if(aNbNodes==2) - aRec.fe_descriptor_id = 11; - else - aRec.fe_descriptor_id = 21; aDataSet2412.insert(TDataSet::value_type(aLabel,aRec)); } MESSAGE("Perform - aDataSet2412.size() = "<NbNodes(); TRecord aRec; aRec.node_labels.reserve(aNbNodes); - SMDS_ElemIteratorPtr aNodesIter = anElem->nodesIterator(); + SMDS_ElemIteratorPtr aNodesIter; + if( anElem->IsQuadratic() ) + aNodesIter = static_cast + ( anElem )->interlacedNodesElemIterator(); + else + aNodesIter = anElem->nodesIterator(); for(; aNodesIter->more();){ const SMDS_MeshElement* aNode = aNodesIter->next(); aRec.node_labels.push_back(aNode->GetID()); @@ -170,25 +181,25 @@ Driver_Mesh::Status DriverUNV_W_SMDS_Mesh::Perform() break; } case 10: { - static int anIds[] = {0,2,1,3,6,5,4,7,9,8}; + static int anIds[] = {0,4,2,9,5,3, 1,6,8, 7}; aConn = anIds; anId = 118; break; } case 13: { - static int anIds[] = {0,3,2,1,4,8,7,6,5,9,12,11,10}; + static int anIds[] = {0,6,4,2,7,5,3,1,8,11,10,9,12}; aConn = anIds; anId = 114; break; } case 15: { - static int anIds[] = {0,2,1,3,5,4,8,7,6,11,10,9,12,14,13}; + static int anIds[] = {0,4,2,9,13,11,5,3,1,14,12,10,6,8,7}; aConn = anIds; anId = 113; break; } case 20: { - static int anIds[] = {0,3,2,1,4,7,6,5,11,10,9,8,15,14,13,12,16,19,18,17}; + static int anIds[] = {0,6, 4,2, 12,18,16,14,7, 5, 3, 1, 19,17,15,13,8, 11,10,9}; aConn = anIds; anId = 116; break;