Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/ElmerGUI/netgen/libsrc/interface/wuchemnitz.cpp
3206 views
1
// Write Chemnitz file format
2
3
4
#include <mystdlib.h>
5
6
#include <myadt.hpp>
7
8
#include <linalg.hpp>
9
#include <csg.hpp>
10
#include <meshing.hpp>
11
12
namespace netgen
13
{
14
15
class POINT3D
16
{
17
public:
18
POINT3D () { };
19
double x, y, z;
20
};
21
22
class VOLELEMENT
23
{
24
public:
25
VOLELEMENT () {};
26
int domnr, p1, p2, p3, p4;
27
int faces[4];
28
};
29
30
class SURFELEMENT
31
{
32
public:
33
SURFELEMENT () { };
34
int snr, p1, p2, p3;
35
};
36
37
38
class FACE
39
{
40
public:
41
FACE () { };
42
int p1, p2, p3;
43
int edges[3];
44
};
45
46
class EDGE
47
{
48
public:
49
EDGE () { };
50
int p1, p2;
51
};
52
53
static ARRAY<POINT3D> points;
54
static ARRAY<VOLELEMENT> volelements;
55
static ARRAY<SURFELEMENT> surfelements;
56
57
static ARRAY<FACE> faces;
58
static ARRAY<EDGE> edges;
59
60
61
void ReadFile (char * filename)
62
{
63
int i, n;
64
ifstream infile(filename);
65
char reco[100];
66
67
68
infile >> reco; // file format recognition
69
70
infile >> n; // number of surface elements
71
cout << n << " Surface elements" << endl;
72
73
for (i = 1; i <= n; i++)
74
{
75
SURFELEMENT sel;
76
infile >> sel.snr >> sel.p1 >> sel.p2 >> sel.p3;
77
surfelements.Append (sel);
78
}
79
80
infile >> n; // number of volume elements
81
cout << n << " Volume elements" << endl;
82
83
for (i = 1; i <= n; i++)
84
{
85
VOLELEMENT el;
86
infile >> el.p1 >> el.p2 >> el.p3 >> el.p4;
87
volelements.Append (el);
88
}
89
90
infile >> n; // number of points
91
cout << n << " Points" << endl;
92
93
for (i = 1; i <= n; i++)
94
{
95
POINT3D p;
96
infile >> p.x >> p.y >> p.z;
97
points.Append (p);
98
}
99
}
100
101
102
103
void ReadFileMesh (const Mesh & mesh)
104
{
105
int i, n;
106
107
n = mesh.GetNSE(); // number of surface elements
108
cout << n << " Surface elements" << endl;
109
110
for (i = 1; i <= n; i++)
111
{
112
SURFELEMENT sel;
113
const Element2d & el = mesh.SurfaceElement(i);
114
sel.snr = el.GetIndex();
115
sel.p1 = el.PNum(1);
116
sel.p2 = el.PNum(2);
117
sel.p3 = el.PNum(3);
118
surfelements.Append (sel);
119
}
120
121
n = mesh.GetNE(); // number of volume elements
122
cout << n << " Volume elements" << endl;
123
124
for (i = 1; i <= n; i++)
125
{
126
VOLELEMENT el;
127
const Element & nel = mesh.VolumeElement(i);
128
el.p1 = nel.PNum(1);
129
el.p2 = nel.PNum(2);
130
el.p3 = nel.PNum(3);
131
el.p4 = nel.PNum(4);
132
// infile >> el.p1 >> el.p2 >> el.p3 >> el.p4;
133
volelements.Append (el);
134
}
135
136
n = mesh.GetNP(); // number of points
137
cout << n << " Points" << endl;
138
139
for (i = 1; i <= n; i++)
140
{
141
POINT3D p;
142
Point3d mp = mesh.Point(i);
143
p.x = mp.X();
144
p.y = mp.Y();
145
p.z = mp.Z();
146
// infile >> p.x >> p.y >> p.z;
147
points.Append (p);
148
}
149
}
150
151
152
153
154
void Convert ()
155
{
156
int i, j, facei, edgei;
157
INDEX_3 i3;
158
INDEX_2 i2;
159
160
INDEX_3_HASHTABLE<int> faceindex(volelements.Size()/5 + 1);
161
INDEX_2_HASHTABLE<int> edgeindex(volelements.Size()/5 + 1);
162
163
for (i = 1; i <= volelements.Size(); i++)
164
{
165
for (j = 1; j <= 4; j++)
166
{
167
switch (j)
168
{
169
case 1:
170
i3.I1() = volelements.Get(i).p2;
171
i3.I2() = volelements.Get(i).p3;
172
i3.I3() = volelements.Get(i).p4;
173
break;
174
case 2:
175
i3.I1() = volelements.Get(i).p1;
176
i3.I2() = volelements.Get(i).p3;
177
i3.I3() = volelements.Get(i).p4;
178
break;
179
case 3:
180
i3.I1() = volelements.Get(i).p1;
181
i3.I2() = volelements.Get(i).p2;
182
i3.I3() = volelements.Get(i).p4;
183
break;
184
case 4:
185
i3.I1() = volelements.Get(i).p1;
186
i3.I2() = volelements.Get(i).p2;
187
i3.I3() = volelements.Get(i).p3;
188
break;
189
default:
190
i3.I1()=i3.I2()=i3.I3()=0;
191
}
192
i3.Sort();
193
if (faceindex.Used (i3))
194
facei = faceindex.Get(i3);
195
else
196
{
197
FACE fa;
198
fa.p1 = i3.I1();
199
fa.p2 = i3.I2();
200
fa.p3 = i3.I3();
201
facei = faces.Append (fa);
202
faceindex.Set (i3, facei);
203
}
204
205
volelements.Elem(i).faces[j-1] = facei;
206
}
207
208
}
209
210
211
for (i = 1; i <= faces.Size(); i++)
212
{
213
for (j = 1; j <= 3; j++)
214
{
215
switch (j)
216
{
217
case 1:
218
i2.I1() = faces.Get(i).p2;
219
i2.I2() = faces.Get(i).p3;
220
break;
221
case 2:
222
i2.I1() = faces.Get(i).p1;
223
i2.I2() = faces.Get(i).p3;
224
break;
225
case 3:
226
i2.I1() = faces.Get(i).p1;
227
i2.I2() = faces.Get(i).p2;
228
break;
229
default:
230
i2.I1()=i2.I2()=0;
231
}
232
if (i2.I1() > i2.I2()) swap (i2.I1(), i2.I2());
233
if (edgeindex.Used (i2))
234
edgei = edgeindex.Get(i2);
235
else
236
{
237
EDGE ed;
238
ed.p1 = i2.I1();
239
ed.p2 = i2.I2();
240
edgei = edges.Append (ed);
241
edgeindex.Set (i2, edgei);
242
}
243
244
faces.Elem(i).edges[j-1] = edgei;
245
}
246
247
}
248
249
}
250
251
252
void WriteFile (ostream & outfile)
253
{
254
int i;
255
256
outfile
257
<< "#VERSION: 1.0" << endl
258
<< "#PROGRAM: NETGEN" << endl
259
<< "#EQN_TYPE: POISSON" << endl
260
<< "#DIMENSION: 3D" << endl
261
<< "#DEG_OF_FREE: 1" << endl
262
<< "#DESCRIPTION: I don't know" << endl
263
<< "##RENUM: not done" << endl
264
<< "#USER: Kleinzen" << endl
265
<< "DATE: 10.06.1996" << endl;
266
267
outfile << "#HEADER: 8" << endl
268
<< points.Size() << " " << edges.Size() << " "
269
<< faces.Size() << " " << volelements.Size() << " 0 0 0 0" << endl;
270
271
outfile << "#VERTEX: " << points.Size() << endl;
272
for (i = 1; i <= points.Size(); i++)
273
outfile << " " << i << " " << points.Get(i).x << " " << points.Get(i).y
274
<< " " << points.Get(i).z << endl;
275
276
outfile << "#EDGE: " << edges.Size() << endl;
277
for (i = 1; i <= edges.Size(); i++)
278
outfile << " " << i << " 1 "
279
<< edges.Get(i).p1 << " "
280
<< edges.Get(i).p2
281
<< " 0" << endl;
282
283
outfile << "#FACE: " << faces.Size() << endl;
284
for (i = 1; i <= faces.Size(); i++)
285
outfile << " " << i << " 1 3 "
286
<< faces.Get(i).edges[0] << " "
287
<< faces.Get(i).edges[1] << " "
288
<< faces.Get(i).edges[2] << endl;
289
290
outfile << "#SOLID: " << volelements.Size() << endl;
291
for (i = 1; i <= volelements.Size(); i++)
292
outfile << " " << i << " 1 4 "
293
<< volelements.Get(i).faces[0] << " "
294
<< volelements.Get(i).faces[1] << " "
295
<< volelements.Get(i).faces[2] << " "
296
<< volelements.Get(i).faces[3] << endl;
297
298
outfile << "#END_OF_DATA" << endl;
299
}
300
301
302
void WriteUserChemnitz (const Mesh & mesh,
303
const string & filename)
304
{
305
ofstream outfile (filename.c_str());
306
307
ReadFileMesh (mesh);
308
Convert ();
309
310
WriteFile (outfile);
311
cout << "Wrote Chemnitz standard file" << endl;
312
}
313
}
314
315