Salome HOME
DCQ : Merge with Ecole_Ete_a6.
[modules/smesh.git] / src / DriverUNV / DriverUNV_W_SMESHDS_Mesh.cxx
1 using namespace std;
2 #include "DriverUNV_W_SMESHDS_Mesh.h"
3 #include "DriverUNV_W_SMDS_Mesh.h"
4
5 #include "SMDS_MeshElement.hxx"
6 #include "SMDS_MeshNode.hxx"
7
8
9
10
11
12 #include "utilities.h"
13
14 #define sNODE_UNV_ID "  2411"
15 #define sELT_UNV_ID  "  2412"
16 #define sUNV_SEPARATOR "    -1"
17 #define sNODE_UNV_DESCR "%10d         1         1        11\n"
18 #define sELT_SURF_DESC  "%10d        %2d         1         1        11         %1d\n"
19 #define sELT_VOLU_DESC  "%10d        %2d         1         1         9         %1d\n"
20 #define sELT_BEAM_DESC1 "%10d        %2d         1         1         7         %1d\n"
21 #define sELT_BEAM_DESC2 "         0         1         1\n"
22
23 DriverUNV_W_SMESHDS_Mesh::DriverUNV_W_SMESHDS_Mesh()
24 {
25         ;
26 }
27
28 DriverUNV_W_SMESHDS_Mesh::~DriverUNV_W_SMESHDS_Mesh()
29 {
30         ;
31 }
32
33 void DriverUNV_W_SMESHDS_Mesh::SetMesh(SMDS_Mesh * aMesh)
34 {
35         //myMesh = SMESHDS_Mesh *::DownCast(aMesh);
36         myMesh = aMesh;
37 }
38
39 void DriverUNV_W_SMESHDS_Mesh::SetFile(string aFile)
40 {
41         myFile = aFile;
42 }
43
44 void DriverUNV_W_SMESHDS_Mesh::SetFileId(FILE * aFileId)
45 {
46         myFileId = aFileId;
47 }
48
49 void DriverUNV_W_SMESHDS_Mesh::SetMeshId(int aMeshId)
50 {
51         myMeshId = aMeshId;
52 }
53
54 void DriverUNV_W_SMESHDS_Mesh::Write()
55 {
56
57         string myClass = string("SMDS_Mesh");
58         string myExtension = string("UNV");
59
60         DriverUNV_W_SMDS_Mesh *myWriter = new DriverUNV_W_SMDS_Mesh;
61
62         myWriter->SetMesh(myMesh);
63         myWriter->SetFile(myFile);
64         myWriter->SetMeshId(myMeshId);
65         //myWriter->SetFileId(myFileId);
66
67         myWriter->Write();
68
69 }
70
71 void DriverUNV_W_SMESHDS_Mesh::Add()
72 {
73         int nbNodes, nbCells;
74         int i;
75
76         char *file2Read = (char *)myFile.c_str();
77         myFileId = fopen(file2Read, "w+");
78         if (myFileId < 0)
79         {
80                 fprintf(stderr, ">> ERREUR : ouverture du fichier %s \n", file2Read);
81                 exit(EXIT_FAILURE);
82         }
83
84   /****************************************************************************
85   *                       NOMBRES D'OBJETS                                    *
86   ****************************************************************************/
87         fprintf(stdout, "\n(****************************)\n");
88         fprintf(stdout, "(* INFORMATIONS GENERALES : *)\n");
89         fprintf(stdout, "(****************************)\n");
90
91         /* Combien de noeuds ? */
92         nbNodes = myMesh->NbNodes();
93
94         /* Combien de mailles, faces ou aretes ? */
95         int nb_of_nodes, nb_of_edges, nb_of_faces, nb_of_volumes;
96         nb_of_edges = myMesh->NbEdges();
97         nb_of_faces = myMesh->NbFaces();
98         nb_of_volumes = myMesh->NbVolumes();
99         nbCells = nb_of_edges + nb_of_faces + nb_of_volumes;
100
101         fprintf(stdout, "%d %d\n", nbNodes, nbCells);
102 //fprintf(myFileId,"%d %d\n",nbNodes,nbCells);
103
104   /****************************************************************************
105   *                       ECRITURE DES NOEUDS                                 *
106   ****************************************************************************/
107         fprintf(stdout, "\n(************************)\n");
108         fprintf(stdout, "(* NOEUDS DU MAILLAGE : *)\n");
109         fprintf(stdout, "(************************)\n");
110
111
112         fprintf(myFileId, "%s\n", sUNV_SEPARATOR);
113         fprintf(myFileId, "%s\n", sNODE_UNV_ID);
114
115         SMDS_NodeIteratorPtr itNodes=myMesh->nodesIterator();
116         while(itNodes->more())
117         {
118                 const SMDS_MeshNode * node = itNodes->next(); 
119
120                 fprintf(myFileId, sNODE_UNV_DESCR, node->GetID());
121                 fprintf(myFileId, "%25.16E%25.16E%25.16E\n", node->X(), node->Y(),
122                         node->Z());
123         }
124         fprintf(myFileId, "%s\n", sUNV_SEPARATOR);
125
126   /****************************************************************************
127   *                       ECRITURE DES ELEMENTS                                *
128   ****************************************************************************/
129         fprintf(stdout, "\n(**************************)\n");
130         fprintf(stdout, "(* ELEMENTS DU MAILLAGE : *)\n");
131         fprintf(stdout, "(**************************)");
132         /* Ecriture des connectivites, noms, numeros des mailles */
133
134         fprintf(myFileId, "%s\n", sUNV_SEPARATOR);
135         fprintf(myFileId, "%s\n", sELT_UNV_ID);
136
137         SMDS_EdgeIteratorPtr itEdges=myMesh->edgesIterator();
138         while(itEdges->more())
139         {
140                 const SMDS_MeshEdge * elem = itEdges->next();
141                 SMDS_ElemIteratorPtr itn=elem->nodesIterator();
142
143                 switch (elem->NbNodes())
144                 {
145                 case 2:
146                         fprintf(myFileId, sELT_BEAM_DESC1, elem->GetID(), 21,
147                                 elem->NbNodes());
148                         fprintf(myFileId, sELT_BEAM_DESC2);
149                         fprintf(myFileId, "%10d%10d\n", itn->next()->GetID(),
150                                 itn->next()->GetID());
151                         break;
152
153                 case 3:
154                         fprintf(myFileId, sELT_BEAM_DESC1, elem->GetID(), 24,
155                                 elem->NbNodes());
156                         fprintf(myFileId, sELT_BEAM_DESC2);
157                         fprintf(myFileId, "%10d%10d%10d\n", itn->next()->GetID(),
158                                 itn->next()->GetID(), itn->next()->GetID());
159                         break;
160                 }
161         }
162
163         SMDS_FaceIteratorPtr itFaces=myMesh->facesIterator();
164         while(itFaces->more())
165         {
166                 const SMDS_MeshElement * elem = itFaces->next();
167
168                 switch (elem->NbNodes())
169                 {
170                 case 3:
171                         // linear triangle
172                         fprintf(myFileId, sELT_SURF_DESC, elem->GetID(), 74,
173                                 elem->NbNodes());
174                         break;
175                 case 4:
176                         // linear quadrilateral
177                         fprintf(myFileId, sELT_SURF_DESC, elem->GetID(), 71,
178                                 elem->NbNodes());
179                         break;
180                 case 6:
181                         // parabolic triangle
182                         fprintf(myFileId, sELT_SURF_DESC, elem->GetID(), 72,
183                                 elem->NbNodes());
184                         break;
185                 case 8:
186                         // parabolic quadrilateral
187                         fprintf(myFileId, sELT_SURF_DESC, elem->GetID(), 75,
188                                 elem->NbNodes());
189                         break;
190                 default:
191                         fprintf(myFileId, "element not registered\n");
192                 }
193
194                 SMDS_ElemIteratorPtr itn=elem->nodesIterator();
195                 while(itn->more()) fprintf(myFileId, "%10d", itn->next()->GetID());
196
197                 fprintf(myFileId, "\n");
198         }
199
200         SMDS_VolumeIteratorPtr itVolumes=myMesh->volumesIterator();
201         while(itVolumes->more())
202         {
203                 const SMDS_MeshElement * elem = itVolumes->next();
204
205                 switch (elem->NbNodes())
206                 {
207                 case 4:
208                         // linear tetrahedron
209                         fprintf(myFileId, sELT_SURF_DESC, elem->GetID(), 111,
210                                 elem->NbNodes());
211                         break;
212                 case 6:
213                         // linear tetrahedron
214                         fprintf(myFileId, sELT_SURF_DESC, elem->GetID(), 112,
215                                 elem->NbNodes());
216                         break;
217                 case 8:
218                         // linear brick
219                         fprintf(myFileId, sELT_SURF_DESC, elem->GetID(), 115,
220                                 elem->NbNodes());
221                         break;
222                 }
223
224                 SMDS_ElemIteratorPtr itn=elem->nodesIterator();
225                 while(itn->more()) fprintf(myFileId, "%10d", itn->next()->GetID());
226
227                 fprintf(myFileId, "\n");
228         }
229         fprintf(myFileId, "%s\n", sUNV_SEPARATOR);
230
231         fclose(myFileId);
232 }