Salome HOME
*** empty log message ***
[modules/smesh.git] / src / DriverUNV / DriverUNV_R_SMDS_Mesh.cxx
1 #include "DriverUNV_R_SMDS_Mesh.h"
2 #include "SMDS_Mesh.hxx"
3
4 #include "utilities.h"
5
6 #include "UNV2411_Structure.hxx"
7 #include "UNV2412_Structure.hxx"
8 #include "UNV_Utilities.hxx"
9
10 using namespace std;
11
12
13 #ifdef _DEBUG_
14 static int MYDEBUG = 0;
15 #else
16 static int MYDEBUG = 0;
17 #endif
18
19
20 Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform()
21 {
22   Status aResult = DRS_OK;
23   std::ifstream in_stream(myFile.c_str());
24   try{
25     {
26       using namespace UNV2411;
27       TDataSet aDataSet2411;
28       UNV2411::Read(in_stream,aDataSet2411);
29       if(MYDEBUG) MESSAGE("Perform - aDataSet2411.size() = "<<aDataSet2411.size());
30       TDataSet::const_iterator anIter = aDataSet2411.begin();
31       for(; anIter != aDataSet2411.end(); anIter++){
32         const TNodeLab& aLabel = anIter->first;
33         const TRecord& aRec = anIter->second;
34         myMesh->AddNodeWithID(aRec.coord[0],aRec.coord[1],aRec.coord[2],aLabel);
35       }
36     }
37     {
38       using namespace UNV2412;
39       in_stream.seekg(0);
40       TDataSet aDataSet2412;
41       UNV2412::Read(in_stream,aDataSet2412);
42       TDataSet::const_iterator anIter = aDataSet2412.begin();
43       if(MYDEBUG) MESSAGE("Perform - aDataSet2412.size() = "<<aDataSet2412.size());
44       for(; anIter != aDataSet2412.end(); anIter++){
45         SMDS_MeshElement* anElement = NULL;
46         const TElementLab& aLabel = anIter->first;
47         const TRecord& aRec = anIter->second;
48         if(IsBeam(aRec.fe_descriptor_id)){
49           anElement = myMesh->AddEdgeWithID(aRec.node_labels[0],
50                                             aRec.node_labels[1],
51                                             aLabel);
52         }else if(IsFace(aRec.fe_descriptor_id)){
53           switch(aRec.fe_descriptor_id){
54           case 71: // TRI3
55           case 72:
56           case 74:
57             
58           case 41: // Plane Stress Linear Triangle - TRI3
59           case 91: // Thin Shell Linear Triangle - TRI3
60             
61           case 42: // Plane Stress Quadratic Triangle - TRI6
62           case 92: // Thin Shell Quadratic Triangle - TRI6
63             
64             anElement = myMesh->AddFaceWithID(aRec.node_labels[0],
65                                               aRec.node_labels[1],
66                                               aRec.node_labels[2],
67                                               aLabel);
68             break;
69             
70           case 44: // Plane Stress Linear Quadrilateral - QUAD4
71           case 94: // Thin Shell   Linear Quadrilateral -  QUAD4
72             
73           case 45: // Plane Stress Quadratic Quadrilateral - QUAD8
74           case 95: // Thin Shell   Quadratic Quadrilateral - QUAD8
75             anElement = myMesh->AddFaceWithID(aRec.node_labels[0],
76                                               aRec.node_labels[1],
77                                               aRec.node_labels[2],
78                                               aRec.node_labels[3],
79                                               aLabel);
80             break;
81           }
82         }else if(IsVolume(aRec.fe_descriptor_id)){
83           switch(aRec.fe_descriptor_id){
84             
85           case 111: // Solid Linear Tetrahedron - TET4
86           case 118: // Solid Quadratic Tetrahedron - TET10
87             
88             anElement = myMesh->AddVolumeWithID(aRec.node_labels[0],
89                                                 aRec.node_labels[2],
90                                                 aRec.node_labels[1],
91                                                 aRec.node_labels[3],
92                                                 aLabel);
93             break;
94             
95           case 112: // Solid Linear Prism - PRISM6
96             
97             anElement = myMesh->AddVolumeWithID(aRec.node_labels[0],
98                                                 aRec.node_labels[2],
99                                                 aRec.node_labels[1],
100                                                 aRec.node_labels[3],
101                                                 aRec.node_labels[5],
102                                                 aRec.node_labels[4],
103                                                 aLabel);
104             break;
105             
106           case 113: // Solid Quadratic Prism - PRISM15
107             
108             anElement = myMesh->AddVolumeWithID(aRec.node_labels[0],
109                                                 aRec.node_labels[4],
110                                                 aRec.node_labels[2],
111                                                 aRec.node_labels[9],
112                                                 aRec.node_labels[13],
113                                                 aRec.node_labels[11],
114                                                 aLabel);
115             break;
116             
117           case 115: // Solid Linear Brick - HEX8
118             anElement = myMesh->AddVolumeWithID(aRec.node_labels[0],
119                                                 aRec.node_labels[3],
120                                                 aRec.node_labels[2],
121                                                 aRec.node_labels[1],
122                                                 aRec.node_labels[4],
123                                                 aRec.node_labels[7],
124                                                 aRec.node_labels[6],
125                                                 aRec.node_labels[5],
126                                                 aLabel);
127             break;
128
129           case 116: // Solid Quadratic Brick - HEX20
130             
131             anElement = myMesh->AddVolumeWithID(aRec.node_labels[0],
132                                                 aRec.node_labels[6],
133                                                 aRec.node_labels[4],
134                                                 aRec.node_labels[2],
135                                                 aRec.node_labels[12],
136                                                 aRec.node_labels[18],
137                                                 aRec.node_labels[16],
138                                                 aRec.node_labels[14],
139                                                 aLabel);
140             break;
141           }
142         }
143         if(!anElement)
144           MESSAGE("DriverUNV_R_SMDS_Mesh::Perform - can not add element with ID = "<<aLabel<<" and type = "<<aRec.fe_descriptor_id);
145       }
146     }
147   }catch(const std::exception& exc){
148     INFOS("Follow exception was cought:\n\t"<<exc.what());
149   }catch(...){
150     INFOS("Unknown exception was cought !!!");
151   }
152   return aResult;
153 }