2
/// This file is part of Rheolef.
4
/// Copyright (C) 2000-2009 Pierre Saramito <Pierre.Saramito@imag.fr>
6
/// Rheolef is free software; you can redistribute it and/or modify
7
/// it under the terms of the GNU General Public License as published by
8
/// the Free Software Foundation; either version 2 of the License, or
9
/// (at your option) any later version.
11
/// Rheolef is distributed in the hope that it will be useful,
12
/// but WITHOUT ANY WARRANTY; without even the implied warranty of
13
/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
/// GNU General Public License for more details.
16
/// You should have received a copy of the GNU General Public License
17
/// along with Rheolef; if not, write to the Free Software
18
/// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
/// =========================================================================
21
# include <rheolef/compiler.h>
22
using namespace rheolef;
25
// generate a mesh for a cube
26
// ----------------------------
38
# define no(i,j,k) ((i)+(nx+1)*((j)+(ny+1)*(k)))
40
void usage (const char* prog)
42
cerr << "uniform grid nx*ny*nz for the [a,b]x[c,d]x[e,f] parallelotope" << endl
46
<< "[nx=10][ny=nx][nz=ny] "
47
<< "[-a float="<< A <<"] "
48
<< "[-b float="<< B <<"] "
49
<< "[-c float="<< C <<"] "
50
<< "[-d float="<< D <<"] "
51
<< "[-f float="<< F <<"] "
52
<< "[-g float="<< G <<"] "
54
<< "example: " << endl
55
<< prog << " 10 " << endl
56
<< prog << " 10 20 " << endl
57
<< prog << " 10 20 15" << endl
61
void print_tetra (int p0, int p1, int p2, int p3)
64
<< p0 << " " << p1 << " "
65
<< p2 << " " << p3 << endl;
67
void print_penta (int type, int p0, int p1, int p2, int p3, int p4, int p5)
71
<< p0 << " " << p1 << " "
72
<< p2 << " " << p3 << " "
73
<< p4 << " " << p5 << endl;
75
print_tetra (p0, p1, p2, p3);
76
print_tetra (p4, p1, p3, p5);
77
print_tetra (p5, p1, p3, p2);
80
void print_triangle (int p0, int p1, int p2) {
81
cout << "t\t" << p0 << " " << p1 << " " << p2 << endl;
83
void print_rectangle (int p0, int p1, int p2, int p3) {
84
cout << "q\t" << p0 << " " << p1 << " " << p2 << " " << p3 << endl;
86
void print_hexa (int type, int p0, int p1, int p2, int p3, int p4, int p5, int p6, int p7)
90
<< p0 << " " << p1 << " "
91
<< p2 << " " << p3 << " "
92
<< p4 << " " << p5 << " "
93
<< p6 << " " << p7 << endl;
94
else if (type == PENTA) {
95
print_penta (type, p0, p1, p2, p4, p5, p6);
96
print_penta (type, p7, p6, p4, p3, p2, p0);
98
print_tetra (p1, p2, p0, p5);
99
print_tetra (p6, p5, p4, p2);
100
print_tetra (p4, p2, p5, p0);
102
print_tetra (p7, p6, p4, p3);
103
print_tetra (p0, p4, p2, p3);
104
print_tetra (p6, p2, p4, p3);
107
void print_domain (const char* name, int nface) {
108
cout << "domain" << endl
110
<< "1 2 " << nface << endl;
113
main (int argc, char**argv)
115
char* prog = argv[0];
116
bool boundary = false;
119
if (argc == 1) usage(prog);
121
// machine-dependent precision
122
int digits10 = numeric_limits<Float>::digits10;
123
cout << setprecision(digits10);
128
// default nb edge on x axis
130
int has_reset_nx = 0;
132
// default nb edge on y axis
134
int has_reset_ny = 0;
136
// default nb edge on z axis
141
// parse command line
142
for (i = 1; i < argc; i++) {
144
switch (argv[i][0]) {
147
if (strcmp (argv[i], "-boundary") == 0) { boundary = true; }
148
else if (strcmp (argv[i], "-region") == 0) { region = true; }
149
else if (strcmp (argv[i], "-corner") == 0) { corner = true; }
150
else switch (argv[i][1]) {
159
if (j >= argc) usage(prog);
160
switch (argv[i][1]) {
161
case 'a' : A = atof(argv[j]);
163
case 'b' : B = atof(argv[j]);
165
case 'c' : C = atof(argv[j]);
167
case 'd' : D = atof(argv[j]);
169
case 'f' : F = atof(argv[j]);
171
case 'g' : G = atof(argv[j]);
173
default : usage(prog);
185
} else if (has_reset_nx) {
186
nz = ny = atoi(argv[i]);
189
nz = ny = nx = atoi(argv[i]);
196
if (A >= B || C >= D || F >= G) {
197
cerr << prog << ": [a,b]x[c,d]x[f,g] may be non-empty.\n";
200
if (region && nx % 2 != 0) {
201
cerr << prog << ": region: nx may be an even number.\n";
204
int np = (nx+1)*(ny+1)*(nz+1);
208
else if (type == PENTA)
214
cout << "mesh" << endl
215
<< "1 3 " << np << " " << ne << endl
220
for (k = 0; k <= nz; k++)
221
for (j = 0; j <= ny; j++)
222
for (i = 0; i <= nx; i++)
223
cout << A+(B-A)*i/Float(nx) << " "
224
<< C+(D-C)*j/Float(ny) << " "
225
<< F+(G-F)*k/Float(nz) << endl;
227
for (i = 0; i < nx; i++)
228
for (j = 0; j < ny; j++)
229
for (k = 0; k < nz; k++)
231
no(i,j,k), no(i+1,j,k), no(i+1,j+1,k), no(i,j+1,k),
232
no(i,j,k+1), no(i+1,j,k+1), no(i+1,j+1,k+1), no(i,j+1,k+1));
237
if (type == HEXA) print_domain("boundary", 6*nx*ny);
238
if (type == PENTA) print_domain("boundary", 8*nx*ny);
239
if (type == TETRA) print_domain("boundary", 12*nx*ny);
241
print_domain("bottom", (type != HEXA) ? 2*nx*ny : nx*ny);
243
for (i = 0; i < nx; i++) {
244
for (j = 0; j < ny; j++) {
246
print_triangle (no(i,j,0), no(i+1,j+1,0), no(i+1,j,0));
247
print_triangle (no(i,j,0), no(i,j+1,0), no(i+1,j+1,0));
249
print_rectangle (no(i,j,0), no(i,j+1,0), no(i+1,j+1,0), no(i+1,j,0));
255
print_domain("top", (type != HEXA) ? 2*nx*ny : nx*ny);
257
for (i = 0; i < nx; i++) {
258
for (j = 0; j < ny; j++) {
260
print_triangle(no(i,j,nz), no(i+1,j,nz), no(i+1,j+1,nz));
261
print_triangle(no(i,j,nz), no(i+1,j+1,nz), no(i,j+1,nz));
263
print_rectangle (no(i,j,nz), no(i+1,j,nz), no(i+1,j+1,nz), no(i,j+1,nz));
269
print_domain("left", (type == TETRA) ? 2*nx*ny : nx*ny);
271
for (i = 0; i < nx; i++) {
272
for (k = 0; k < nz; k++) {
274
print_triangle(no(i,0,k), no(i+1,0,k), no(i+1,0,k+1));
275
print_triangle(no(i,0,k), no(i+1,0,k+1), no(i,0,k+1));
277
print_rectangle (no(i,0,k), no(i+1,0,k), no(i+1,0,k+1), no(i,0,k+1));
283
print_domain("front", (type == TETRA) ? 2*nx*ny : nx*ny);
285
for (j = 0; j < ny; j++) {
286
for (k = 0; k < nz; k++) {
288
print_triangle(no(nx,j,k), no(nx,j+1,k), no(nx,j,k+1));
289
print_triangle(no(nx,j+1,k), no(nx,j+1,k+1), no(nx,j,k+1));
291
print_rectangle (no(nx,j,k), no(nx,j+1,k), no(nx,j+1,k+1), no(nx,j,k+1));
297
print_domain("right", (type == TETRA) ? 2*nx*ny : nx*ny);
299
for (i = 0; i < nx; i++) {
300
for (k = 0; k < nz; k++) {
302
print_triangle(no(i,ny,k), no(i+1,ny,k+1), no(i+1,ny,k));
303
print_triangle(no(i,ny,k), no(i,ny,k+1), no(i+1,ny,k+1));
305
print_rectangle (no(i,ny,k), no(i,ny,k+1), no(i+1,ny,k+1), no(i+1,ny,k));
311
print_domain("back", (type == TETRA) ? 2*nx*ny : nx*ny);
313
for (j = 0; j < ny; j++) {
314
for (k = 0; k < nz; k++) {
316
print_triangle(no(0,j,k), no(0,j,k+1), no(0,j+1,k));
317
print_triangle(no(0,j+1,k), no(0,j,k+1), no(0,j+1,k+1));
319
print_rectangle (no(0,j,k), no(0,j,k+1), no(0,j+1,k+1), no(0,j+1,k));
329
else if (type == PENTA)
334
cout << "\ndomain\nwest\n1 3 " << nvol << "\n" ;
335
for (i = 0; i < nx/2; i++)
336
for (j = 0; j < ny; j++)
337
for (k = 0; k < nz; k++)
339
no(i,j,k), no(i+1,j,k), no(i+1,j+1,k), no(i,j+1,k),
340
no(i,j,k+1), no(i+1,j,k+1), no(i+1,j+1,k+1), no(i,j+1,k+1));
343
cout << "\ndomain\neast\n1 3 " << nvol << "\n" ;
344
for (i = nx/2; i < nx; i++)
345
for (j = 0; j < ny; j++)
346
for (k = 0; k < nz; k++)
348
no(i,j,k), no(i+1,j,k), no(i+1,j+1,k), no(i,j+1,k),
349
no(i,j,k+1), no(i+1,j,k+1), no(i+1,j+1,k+1), no(i,j+1,k+1));
352
// corners = 4 0d-domains
354
cout << "\ndomain\nleft_bottom_back\n1 0 1\n" << no( 0, 0, 0) << endl
355
<< "\ndomain\nright_bottom_back\n1 0 1\n" << no(nx, 0, 0) << endl
356
<< "\ndomain\nleft_top_back\n1 0 1\n" << no(0, ny, 0) << endl
357
<< "\ndomain\nright_top_back\n1 0 1\n" << no(nx,ny, 0) << endl
358
<< "\ndomain\nleft_bottom_front\n1 0 1\n" << no( 0, 0,nz) << endl
359
<< "\ndomain\nright_bottom_front\n1 0 1\n" << no(nx, 0,nz) << endl
360
<< "\ndomain\nleft_top_front\n1 0 1\n" << no(0, ny,nz) << endl
361
<< "\ndomain\nright_top_front\n1 0 1\n" << no(nx,ny,nz) << endl