X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FDriverUNV%2FDriverUNV_R_SMDS_Mesh.cxx;h=0ad1f8beec51033887f87d5f8d3aad78c21288ea;hb=43db13f33a1d75fae36db8f06fa378ed7906a332;hp=24150eeda41d13b8ceef0f078128ef4db97c508a;hpb=d8f644ca3d4ce62f2ef41d4aacb52f5bb1221df3;p=modules%2Fsmesh.git diff --git a/src/DriverUNV/DriverUNV_R_SMDS_Mesh.cxx b/src/DriverUNV/DriverUNV_R_SMDS_Mesh.cxx index 24150eeda..0ad1f8bee 100644 --- a/src/DriverUNV/DriverUNV_R_SMDS_Mesh.cxx +++ b/src/DriverUNV/DriverUNV_R_SMDS_Mesh.cxx @@ -1,23 +1,23 @@ -// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE // -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS // -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. // -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. // -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // #include "DriverUNV_R_SMDS_Mesh.h" @@ -26,9 +26,11 @@ #include "utilities.h" +#include "UNV164_Structure.hxx" #include "UNV2411_Structure.hxx" #include "UNV2412_Structure.hxx" #include "UNV2417_Structure.hxx" +#include "UNV2420_Structure.hxx" #include "UNV_Utilities.hxx" #include @@ -37,11 +39,57 @@ using namespace std; #ifdef _DEBUG_ -static int MYDEBUG = 0; +static int MYDEBUG = 1; #else static int MYDEBUG = 0; #endif +namespace +{ + /*! + * \brief Move node coordinates to the global Cartesian CS + */ + void transformNodes( UNV2411::TDataSet::const_iterator fromNode, + UNV2411::TDataSet::const_iterator endNode, + const UNV2420::TRecord & csRecord ) + { + const int csLabel = fromNode->exp_coord_sys_num; + + UNV2411::TDataSet::const_iterator nodeIt; + + // apply Transformation Matrix + if ( !csRecord.isIdentityMatrix() ) + { + for ( nodeIt = fromNode; nodeIt != endNode; ++nodeIt ) + { + const UNV2411::TRecord& nodeRec = *nodeIt; + if ( nodeRec.exp_coord_sys_num == csLabel ) + csRecord.ApplyMatrix( (double*) nodeRec.coord ); + } + } + + // transform from Cylindrical CS + if ( csRecord.coord_sys_type == UNV2420::Cylindrical ) + { + for ( nodeIt = fromNode; nodeIt != endNode; ++nodeIt ) + { + const UNV2411::TRecord& nodeRec = *nodeIt; + if ( nodeRec.exp_coord_sys_num == csLabel ) + csRecord.FromCylindricalCS( (double*) nodeRec.coord ); + } + } + // transform from Spherical CS + else if ( csRecord.coord_sys_type == UNV2420::Spherical ) + { + for ( nodeIt = fromNode; nodeIt != endNode; ++nodeIt ) + { + const UNV2411::TRecord& nodeRec = *nodeIt; + if ( nodeRec.exp_coord_sys_num == csLabel ) + csRecord.FromSphericalCS( (double*) nodeRec.coord ); + } + } + } +} DriverUNV_R_SMDS_Mesh::~DriverUNV_R_SMDS_Mesh() { @@ -55,45 +103,89 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() Kernel_Utils::Localizer loc; Status aResult = DRS_OK; std::ifstream in_stream(myFile.c_str()); - try{ + try + { { + // Read Units + UNV164::TRecord aUnitsRecord; + UNV164::Read( in_stream, aUnitsRecord ); + + // Read Coordinate systems + UNV2420::TDataSet aCoordSysDataSet; + UNV2420::Read(in_stream, myMeshName, aCoordSysDataSet); + + // Read nodes using namespace UNV2411; TDataSet aDataSet2411; UNV2411::Read(in_stream,aDataSet2411); if(MYDEBUG) MESSAGE("Perform - aDataSet2411.size() = "<exp_coord_sys_num == csIter->coord_sys_label ) + { + transformNodes( nodeIter, aDataSet2411.end(), *csIter ); + break; + } + } + } + // Move nodes to SI unit system + const double lenFactor = aUnitsRecord.factors[ UNV164::LENGTH_FACTOR ]; + if ( lenFactor != 1. ) + { + TDataSet::iterator nodeIter = aDataSet2411.begin(), nodeEnd; + for ( nodeEnd = aDataSet2411.end(); nodeIter != nodeEnd; nodeIter++) + { + UNV2411::TRecord& nodeRec = *nodeIter; + nodeRec.coord[0] *= lenFactor; + nodeRec.coord[1] *= lenFactor; + nodeRec.coord[2] *= lenFactor; + } + } + + // Create nodes in the mesh TDataSet::const_iterator anIter = aDataSet2411.begin(); - for(; anIter != aDataSet2411.end(); anIter++){ - const TNodeLab& aLabel = anIter->first; - const TRecord& aRec = anIter->second; - myMesh->AddNodeWithID(aRec.coord[0],aRec.coord[1],aRec.coord[2],aLabel); + for(; anIter != aDataSet2411.end(); anIter++) + { + const TRecord& aRec = *anIter; + myMesh->AddNodeWithID(aRec.coord[0],aRec.coord[1],aRec.coord[2],aRec.label); } } { using namespace UNV2412; - in_stream.seekg(0); TDataSet aDataSet2412; UNV2412::Read(in_stream,aDataSet2412); TDataSet::const_iterator anIter = aDataSet2412.begin(); if(MYDEBUG) MESSAGE("Perform - aDataSet2412.size() = "<first; - const TRecord& aRec = anIter->second; + const TRecord& aRec = *anIter; if(IsBeam(aRec.fe_descriptor_id)) { switch ( aRec.node_labels.size() ) { case 2: // edge with two nodes + //MESSAGE("add edge " << aLabel << " " << aRec.node_labels[0] << " " << aRec.node_labels[1]); anElement = myMesh->AddEdgeWithID(aRec.node_labels[0], aRec.node_labels[1], - aLabel); + aRec.label); break; case 3: // quadratic edge (with 3 nodes) + //MESSAGE("add edge " << aRec.label << " " << aRec.node_labels[0] << " " << aRec.node_labels[1] << " " << aRec.node_labels[2]); anElement = myMesh->AddEdgeWithID(aRec.node_labels[0], aRec.node_labels[2], aRec.node_labels[1], - aLabel); + aRec.label); } } else if(IsFace(aRec.fe_descriptor_id)) { + //MESSAGE("add face " << aRec.label); switch(aRec.fe_descriptor_id){ case 41: // Plane Stress Linear Triangle case 51: // Plane Strain Linear Triangle @@ -104,7 +196,7 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() anElement = myMesh->AddFaceWithID(aRec.node_labels[0], aRec.node_labels[1], aRec.node_labels[2], - aLabel); + aRec.label); break; case 42: // Plane Stress Parabolic Triangle @@ -113,13 +205,14 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() 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], - aLabel); + aRec.label); break; case 44: // Plane Stress Linear Quadrilateral @@ -132,7 +225,7 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() aRec.node_labels[1], aRec.node_labels[2], aRec.node_labels[3], - aLabel); + aRec.label); break; case 45: // Plane Stress Parabolic Quadrilateral @@ -149,11 +242,12 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() aRec.node_labels[3], aRec.node_labels[5], aRec.node_labels[7], - aLabel); + 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 @@ -161,7 +255,7 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() aRec.node_labels[2], aRec.node_labels[1], aRec.node_labels[3], - aLabel); + aRec.label); break; case 118: // Solid Quadratic Tetrahedron - TET10 @@ -178,7 +272,7 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() aRec.node_labels[6], aRec.node_labels[8], aRec.node_labels[7], - aLabel); + aRec.label); break; case 112: // Solid Linear Prism - PRISM6 @@ -188,7 +282,7 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() aRec.node_labels[3], aRec.node_labels[5], aRec.node_labels[4], - aLabel); + aRec.label); break; case 113: // Solid Quadratic Prism - PRISM15 @@ -211,7 +305,7 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() aRec.node_labels[6], aRec.node_labels[8], aRec.node_labels[7], - aLabel); + aRec.label); break; case 115: // Solid Linear Brick - HEX8 @@ -223,7 +317,7 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() aRec.node_labels[7], aRec.node_labels[6], aRec.node_labels[5], - aLabel); + aRec.label); break; case 116: // Solid Quadratic Brick - HEX20 @@ -251,7 +345,7 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() aRec.node_labels[11], aRec.node_labels[10], aRec.node_labels[9], - aLabel); + aRec.label); break; case 114: // pyramid of 13 nodes (quadratic) - PIRA13 @@ -269,18 +363,17 @@ Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() aRec.node_labels[10], aRec.node_labels[9], aRec.node_labels[12], - aLabel); + aRec.label); break; } } - // if(!anElement) - // MESSAGE("DriverUNV_R_SMDS_Mesh::Perform - can not add element with ID = "<compactMesh(); return aResult; }