-
Notifications
You must be signed in to change notification settings - Fork 44
/
Copy pathglobal_pdes.c
487 lines (405 loc) · 25.1 KB
/
global_pdes.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
/* Global variables and parameters for wave_billiard, heat and schrodinger */
// #include "hsluv.c"
/* Basic math */
#define PI 3.141592654
#define DPI 6.283185307
#define PID 1.570796327
/* shape of domain */
#define D_NOTHING 999 /* no boundaries */
#define D_RECTANGLE 0 /* rectangular domain */
#define D_ELLIPSE 1 /* elliptical domain */
#define D_EXT_ELLIPSE 199 /* exterior of elliptical domain */
#define D_EXT_ELLIPSE_CURVED 198 /* exterior of curved elliptical domain */
#define D_EXT_ELLIPSE_CURVED_BDRY 197 /* exterior of curved elliptical domain, with horizontal boundaries */
#define D_STADIUM 2 /* stadium-shaped domain */
#define D_SINAI 3 /* Sinai billiard */
#define D_DIAMOND 4 /* diamond-shaped billiard */
#define D_TRIANGLE 5 /* triangular billiard */
#define D_FLAT 6 /* flat interface */
#define D_ANNULUS 7 /* annulus */
#define D_POLYGON 8 /* polygon */
#define D_YOUNG 9 /* Young diffraction slits */
#define D_GRATING 10 /* diffraction grating */
#define D_EHRENFEST 11 /* Ehrenfest urn type geometry */
/* The following 3 types are superseded by D_CIRCLES and can be removed later */
#define D_DISK_GRID 12 /* grid of disks */
#define D_DISK_HEX 13 /* haxagonl grid of disks */
#define D_DISK_PERCOL 14 /* random grid of percolation type */
#define D_MENGER 15 /* Menger-Sierpinski carpet */
#define D_JULIA_INT 16 /* interior of Julia set */
#define D_MENGER_ROTATED 17 /* rotated Menger-Sierpinski carpet */
#define D_PARABOLA 18 /* parabolic domain */
#define D_TWO_PARABOLAS 19 /* two facing parabolic antennas */
#define D_CIRCLES 20 /* several circles */
#define D_CIRCLES_IN_RECT 201 /* several circles in a rectangle */
#define D_FOUR_PARABOLAS 31 /* four parabolas with axes in NSEW directions */
#define D_POLY_PARABOLAS 32 /* polygon with parabolic sides */
#define D_PENROSE 33 /* Penrose unilluminable room */
#define D_HYPERBOLA 34 /* one branch of hyperbola */
#define D_TOKARSKY 35 /* Tokarsky unilluminable room */
#define D_TOKA_PRIME 36 /* Tokarsky room made of 86 triangles */
#define D_ISOSPECTRAL 37 /* isospectral billiards */
#define D_HOMOPHONIC 38 /* homophonic billiards */
#define D_POLYGONS 40 /* several polygons */
#define D_VONKOCH 41 /* von Koch snowflake fractal */
#define D_STAR 42 /* star shape */
#define D_FRESNEL 43 /* Fresnel lens */
#define D_NOISEPANEL 44 /* zigzag noise insulating panel */
#define D_NOISEPANEL_RECT 441 /* comparison between zigzag noise insulating panel and flat walls */
#define D_DOUBLE_FRESNEL 45 /* two facing Fresnel lenses */
#define D_QRD 46 /* quadratic resonance diffuser */
#define D_QRD_ASYM 461 /* asymmetric quadratic resonance diffuser */
#define D_CIRCLE_SEGMENT 47 /* lens-shaped circular segment */
#define D_GROOVE 48 /* groove array supposed to induce polaritons */
#define D_FABRY_PEROT 49 /* Fabry-Perrot cavity (in fact simply a vertical slab) */
#define D_LSHAPE 50 /* L-shaped billiard (surface of genus 2) */
#define D_WAVEGUIDE 51 /* wave guide */
#define D_WAVEGUIDE_W 52 /* W-shaped wave guide */
#define D_WAVEGUIDES_W 521 /* two W-shaped wave guides */
#define D_WAVEGUIDES_COUPLED 522 /* two coupled wave guides */
#define D_WAVEGUIDE_S 523 /* S-shaped wave guide */
#define D_WAVEGUIDE_S_SHORT 524 /* short S-shaped wave guide */
#define D_WAVEGUIDES_COUPLED_N 525 /* two coupled wave guides, narrow variant */
#define D_WAVEGUIDE_BADSPLICE 526 /* badly spliced fibers, to use with IOR_WAVE_GUIDE_COATED */
#define D_MAZE 53 /* maze */
#define D_MAZE_CLOSED 54 /* closed maze */
#define D_MAZE_CHANNELS 541 /* maze with two channels attached */
#define D_MAZE_CHANNELS_INT 542 /* maze with two channels attached, distance defined from interior of cells */
#define D_CHESSBOARD 55 /* chess board configuration */
#define D_TRIANGLE_TILES 56 /* triangular tiling */
#define D_HEX_TILES 57 /* honeycomb tiling */
#define D_FUNNELS 58 /* two funnels */
#define D_ONE_FUNNEL 581 /* one funnel */
#define D_LENSES_RING 59 /* several lenses forming a ring */
#define D_MAZE_CIRCULAR 60 /* circular maze */
#define D_LENS 61 /* symmetric lens made of circular faces */
#define D_LENS_WALL 62 /* symmetric lens made of circular faces with separating wall (to use with IOR_LENS_WALL) */
#define D_TWO_LENSES_WALL 63 /* two lenses separated by a wall with a hole (to use with IOR_LENS_WALL) */
#define D_TWO_LENSES_OBSTACLE 64 /* two lenses with an obstacle in between (to use with IOR_LENS_OBSTACLE) */
#define D_FRESNEL_ZONE_PLATE 65 /* Fresnel zone plate */
#define D_FRESNEL_ZONE_PLATE_INV 66 /* Fresnel zone plate, with central hole */
#define D_LENS_ROTATED 67 /* rotated lens */
#define D_LENS_CONCAVE 68 /* biconcave lens (to use with IOR_LENS_CONCAVE) */
#define D_LENS_CONVEX_CONCAVE 69 /* a convex and a biconcave lens (to use with IOR_LENS_CONVEX_CONCAVE) */
#define D_WING 70 /* complement of wing-shaped domain */
#define D_TESLA 71 /* Tesla valve */
#define D_TESLA_FOUR 72 /* four Tesla valves */
#define D_TREE 73 /* Christmas tree, to use with IOR_TREE */
#define D_MICHELSON 74 /* Michelson interferometer, to use with IOR_MICHELSON */
#define D_MICHELSON_MOVING 741 /* moving Michelson interferometer, to use with IOR_MICHELSON */
#define D_RITCHEY_CHRETIEN_SPHERICAL 75 /* Ritchey-Chrétien telescope with spherical mirrors */
#define D_RITCHEY_CHRETIEN_HYPERBOLIC 751 /* Ritchey-Chrétien telescope with hyperbolic mirrors */
#define D_GRADIENT_INDEX_LENS 76 /* gradient index lens (only affects draw_billiard) */
#define D_IMAGE 77 /* Taken from image file */
#define D_MAGNETRON 78 /* simplified magnetron */
#define D_MAGNETRON_CATHODE 781 /* simplified magnetron with central cathode */
#define D_TWOCIRCLES 79 /* two circles of different size */
#define D_POLYCIRCLES 791 /* one large circle and NPOLY small ones */
#define D_POLYCIRCLES_ANGLED 792 /* variant of D_POLYCIRCLES with angled small cavities */
#define D_TWOCIRCLES_ELLIPSE 793 /* ellipse with two adjacent circular cavities */
#define D_CIRCLES_ELLIPSE 794 /* ellipse with NPOLY adjacent circles */
#define D_CARDIOID 90 /* cardioid */
#define D_NEPHROID 91 /* nephroid */
#define D_EPICYCLOID 92 /* epicycloid */
/* for wave_sphere.c */
#define D_LATITUDE 80 /* strip between two latitudes */
#define D_SPHERE_CIRCLES 81 /* circles on the sphere */
#define D_SPHERE_JULIA 82 /* Julia set on Riemann sphere */
#define D_SPHERE_JULIA_INV 83 /* inverted Julia set on Riemann sphere */
#define D_SPHERE_EARTH 84 /* map of the Earth */
#define D_SPHERE_JULIA_CUBIC 85 /* Julia set for cubic polynomial on Riemann sphere */
#define D_SPHERE_MARS 86 /* map of Mars */
#define D_SPHERE_MOON 87 /* map of the Moon */
#define D_SPHERE_VENUS 88 /* map of Venus */
#define D_SPHERE_MERCURY 89 /* map of Mercury */
#define D_SPHERE_MAZE 100 /* circular maze on the sphere */
#define D_SPHERE_MAZE_SPIRAL 101 /* circular maze on the sphere with slanted walls */
#define D_SPHERE_MAZE_WAVE 102 /* circular maze on the sphere with wavy walls */
/* image files for D_IMAGE option */
#define IM_PHOTONS 0 /* word "photons" */
#define IM_GUITAR 1 /* guitar shape */
#define IM_GUITAR_NOHOLE 11 /* guitar shape without sound hole or neck */
#define IM_EGUITAR 2 /* electric guitar shape */
#define IM_HAPPY_NEW_YEAR 3 /* "Happy New Year 2025" */
#define IM_DICKSON 4 /* Dickson fjord and others nearbys in Greenland */
#define IM_DICKSON_ZOOM 5 /* zoom on Dickson fjord in Greenland */
#define NMAXCIRCLES 10000 /* total number of circles/polygons (must be at least NCX*NCY for square grid) */
#define NMAXPOLY 50000 /* maximal number of vertices of polygonal lines (for von Koch et al) */
#define NMAXSOURCES 30 /* maximal number of sources */
#define C_SQUARE 0 /* square grid of circles */
#define C_HEX 1 /* hexagonal/triangular grid of circles */
#define C_RAND_DISPLACED 2 /* randomly displaced square grid */
#define C_RAND_PERCOL 3 /* random percolation arrangement */
#define C_RAND_POISSON 4 /* random Poisson point process */
#define C_CLOAK 5 /* invisibility cloak */
#define C_CLOAK_A 6 /* first optimized invisibility cloak */
#define C_LASER 7 /* laser fight in a room of mirrors */
#define C_POISSON_DISC 8 /* Poisson disc sampling */
#define C_GOLDEN_MEAN 10 /* pattern based on vertical shifts by golden mean */
#define C_GOLDEN_SPIRAL 11 /* spiral pattern based on golden mean */
#define C_SQUARE_HEX 12 /* alternating between square and hexagonal/triangular */
#define C_HEX_NONUNIF 13 /* triangular grid with non-constant column distance */
#define C_RINGS 20 /* obstacles arranged in concentric rings */
#define C_RINGS_T 201 /* obstacles arranged in concentric rings, triangular lattice */
#define C_RINGS_SPIRAL 202 /* obstacles arranged on a "sunflower" spiral, similar to C_GOLDEN_SPIRAL */
#define C_RINGS_POISSONDISC 203 /* obstacles arranged in a Poisson disc pattern */
#define C_RINGS_LOGSPIRAL 204 /* logarithmic spirals */
#define C_HEX_BOTTOM 101 /* hex/triangular lattice in lower half */
#define C_HEX_BOTTOM2 102 /* smaller hex/triangular lattice in lower half */
#define C_SQUARE_BOTTOM 103 /* square lattice in lower half */
#define C_SPH_DODECA 30 /* dodecahedron (on sphere) */
#define C_SPH_ICOSA 31 /* icosahedron (on sphere) */
#define C_SPH_OCTA 32 /* octahedron (on sphere) */
#define C_SPH_CUBE 33 /* cube (on sphere) */
#define C_ONE 97 /* one single circle, as for Sinai */
#define C_TWO 98 /* two concentric circles of different type */
#define C_NOTHING 99 /* no circle at all, for comparisons */
/* Billiard tables for heat equation */
#define D_ANNULUS_HEATED 21 /* annulus with different temperatures */
#define D_MENGER_HEATED 22 /* Menger gasket with different temperatures */
#define D_MENGER_H_OPEN 23 /* Menger gasket with different temperatures and larger domain */
#define D_MANDELBROT 24 /* Mandelbrot set */
#define D_JULIA 25 /* Julia set */
#define D_MANDELBROT_CIRCLE 26 /* Mandelbrot set with circular conductor */
#define D_VONKOCH_HEATED 27 /* von Koch snowflake in larger circle */
/* Variable index of refraction */
#define IOR_MANDELBROT 1 /* index of refraction depends on escape time in Mandelbrot set (log) */
#define IOR_MANDELBROT_LIN 100 /* index of refraction depends on escape time in Mandelbrot set (linear) */
#define IOR_MANDELBROT_MOD 101 /* index of refraction depends on escape time in Mandelbrot set (linear) */
#define IOR_EARTH 2 /* index of refraction models speed of seismic waves */
#define IOR_EXPLO_LENSING 3 /* explosive lensing */
#define IOR_PERIODIC_WELLS 4 /* periodic superposition of "wells" */
#define IOR_RANDOM_WELLS 5 /* random superposition of "wells" */
#define IOR_PERIODIC_WELLS_ROTATING 6 /* periodic superposition rotating in time */
#define IOR_PERIODIC_WELLS_ROTATING_LARGE 7 /* periodic superposition rotating in time, larger area */
#define IOR_POISSON_WELLS 8 /* wells located on a random Poisson disc process */
#define IOR_PPP_WELLS 9 /* wells located on a Poisson point process */
#define IOR_LENS_WALL 10 /* lens with separating wall (to use with D_LENS_WALL) */
#define IOR_LENS_OBSTACLE 11 /* lens with separating wall (to use with D_TWO_LENSES_OBSTACLE) */
#define IOR_LENS_CONCAVE 12 /* lens with separating wall (to use with D_LENS_CONCAVE) */
#define IOR_LENS_CONVEX_CONCAVE 13 /* lens with separating wall (to use with D_LENS_CONVEX_CONCAVE) */
#define IOR_TREE 14 /* Christmas tree, to use with D_TREE */
#define IOR_WAVE_GUIDES_COUPLED 15 /* coupled wave guides */
#define IOR_WAVE_GUIDES_COUPLED_B 151 /* coupled wave guides, variant where only corners are reflecting */
#define IOR_WAVE_GUIDE_COATED 16 /* short coated S-shaped optical fiber, to use with D_WAVEGUIDE_S_SHORT */
#define IOR_MICHELSON 17 /* Michelson interferometer, to use with D_MICHELSON */
#define IOR_GRADIENT_INDEX_LENS 18 /* gradient index lens (parabolic c(r)^2) */
#define IOR_GRADIENT_INDEX_LENS_B 181 /* gradient index lens (parabolic c(r)) */
#define IOR_LINEAR_X_A 19 /* IoR depending linearly on x */
#define IOR_LINEAR_X_B 191 /* IoR depending linearly on x, with correct boundary values */
#define IOR_EARTH_DEM 20 /* digital elevation model (for waves on sphere) */
/* Boundary conditions */
#define BC_DIRICHLET 0 /* Dirichlet boundary conditions */
#define BC_PERIODIC 1 /* periodic boundary conditions */
#define BC_ABSORBING 2 /* absorbing boundary conditions (beta version) */
#define BC_VPER_HABS 3 /* vertically periodic and horizontally absorbing boundary conditions */
#define BC_ABS_REFLECT 4 /* absorbing boundary conditions, except reflecting at y=0, for comparisons */
#define BC_LSHAPE 10 /* L-shaped boundary conditions (surface of genus 2) */
// #define BC_OSCILL_ABSORB 5 /* oscillating boundary condition on the left, absorbing on other walls */
/* Oscillating boundary conditions */
#define OSC_PERIODIC 0 /* periodic oscillation */
#define OSC_SLOWING 1 /* oscillation of slowing frequency (anti-chirp) */
#define OSC_WAVE_PACKET 2 /* Gaussian wave packet */
#define OSC_WAVE_PACKETS 21 /* Gaussian wave packets */
#define OSC_CHIRP 3 /* chirp (linearly accelerating frequency) */
#define OSC_BEAM 4 /* periodic oscillation modulated by y cut-off */
#define OSC_BEAM_GAUSSIAN 41 /* periodic oscillation modulated by Gaussian in y */
#define OSC_BEAM_SINE 42 /* periodic oscillation modulated by sine in y */
#define OSC_BEAM_TWOPERIODS 5 /* sum of two periodic oscillations modulated by y cut-off */
#define OSC_TWO_WAVES 6 /* two linear waves at an angle, separate */
#define OSC_TWO_WAVES_ADDED 61 /* two linear waves at an angle, superimposed */
/* Wave packet types */
#define WP_RANDOM1 0 /* random, variant 1 */
#define WP_RANDOM2 1 /* random, variant 2 */
#define WP_PAIR 2 /* 2 sources */
#define WP_FIVE 3 /* 5 sources with different envelope */
/* Wave packet envelope types */
#define WE_SINE 0 /* sine envelope */
#define WE_CUTOFF 1 /* sharp cut-off */
#define WE_CONSTANT 2 /* constant envelope */
/* For debugging purposes only */
// #define FLOOR 0 /* set to 1 to limit wave amplitude to VMAX */
// #define VMAX 10.0 /* max value of wave amplitude */
/* Plot types */
/* For wave equation */
#define P_AMPLITUDE 0 /* plot amplitude of wave */
#define P_ENERGY 1 /* plot energy of wave */
#define P_MIXED 2 /* plot amplitude in upper half, energy in lower half */
#define P_MEAN_ENERGY 3 /* energy averaged over time */
#define P_LOG_ENERGY 4 /* log of energy averaged over time */
#define P_LOG_MEAN_ENERGY 5 /* log of energy averaged over time */
#define P_ENERGY_FLUX 6 /* energy flux */
#define P_TOTAL_ENERGY_FLUX 7 /* energy flux averaged over time */
#define P_AVERAGE_ENERGY 8 /* energy averaged over sliding window */
#define P_LOG_AVERAGE_ENERGY 9 /* log of energy averaged over sliding window */
/* For Schrodinger equation */
#define P_MODULE 10 /* plot module of wave function squared */
#define P_PHASE 11 /* plot phase of wave function */
#define P_REAL 12 /* plot real part */
#define P_IMAGINARY 13 /* plot imaginary part */
/* plot types used by wave_3d */
#define P_3D_AMPLITUDE 101 /* height/color depends on amplitude - DEPRECATED, instead use set SHADE_3D to 0 */
#define P_3D_ANGLE 102 /* height/color depends on angle with fixed direction - TODO */
#define P_3D_AMP_ANGLE 103 /* height/color depends on amplitude, luminosity depends on angle */
#define P_3D_ENERGY 104 /* height/color depends on energy, luminosity depends on angle */
#define P_3D_LOG_ENERGY 105 /* height/color depends on logarithm of energy, luminosity depends on angle */
#define P_3D_TOTAL_ENERGY 106 /* height/color depends on total energy over time, luminosity depends on angle */
#define P_3D_LOG_TOTAL_ENERGY 107 /* height/color depends on log on total energy over time, luminosity depends on angle */
#define P_3D_MEAN_ENERGY 108 /* height/color depends on energy averaged over time, luminosity depends on angle */
#define P_3D_LOG_MEAN_ENERGY 109 /* height/color depends on log on energy averaged over time, luminosity depends on angle */
#define P_3D_PHASE 111 /* phase of wave */
#define P_3D_FLUX_INTENSITY 112 /* energy flux intensity */
#define P_3D_FLUX_DIRECTION 113 /* energy flux direction */
/* Color schemes */
#define C_LUM 0 /* color scheme modifies luminosity (with slow drift of hue) */
#define C_HUE 1 /* color scheme modifies hue */
#define C_PHASE 2 /* color scheme shows phase */
#define C_ONEDIM 3 /* use preset 1d color scheme (for Turbo, Viridis, Magma, Inferno, Plasma) */
#define C_ONEDIM_LINEAR 4 /* use preset 1d color scheme with linear scale */
/* Color palettes */
#define COL_JET 0 /* JET color palette */
#define COL_HSLUV 1 /* HSLUV color palette (perceptually uniform) */
#define COL_GRAY 2 /* grayscale */
#define COL_TURBO 10 /* TURBO color palette (by Anton Mikhailov) */
#define COL_VIRIDIS 11 /* Viridis color palette */
#define COL_MAGMA 12 /* Magma color palette */
#define COL_INFERNO 13 /* Inferno color palette */
#define COL_PLASMA 14 /* Plasma color palette */
#define COL_CIVIDIS 15 /* Cividis color palette */
#define COL_PARULA 16 /* Parula color palette */
#define COL_TWILIGHT 17 /* Twilight color palette */
#define COL_TWILIGHT_SHIFTED 18 /* Shifted twilight color palette */
#define COL_TURBO_CYCLIC 101 /* TURBO color palette (by Anton Mikhailov) corrected to be cyclic, beta */
#define NPWIDTH 0.02 /* width of noise panel separation */
/* plot types used by rde */
#define Z_AMPLITUDE 0 /* amplitude of first field */
#define Z_RGB 20 /* RGB plot */
#define Z_POLAR 21 /* polar angle associated with RBG plot */
#define Z_NORM_GRADIENT 22 /* gradient of polar angle */
#define Z_ANGLE_GRADIENT 221 /* direction of polar angle */
#define Z_NORM_GRADIENTX 23 /* norm of gradient of u */
#define Z_ANGLE_GRADIENTX 231 /* direction of gradient of u */
#define Z_NORM_GRADIENT_INTENSITY 24 /* gradient and intensity of polar angle */
#define Z_VORTICITY 25 /* curl of polar angle */
#define Z_VORTICITY_ABS 251 /* absolute value of curl of polar angle */
#define Z_MAXTYPE_RPS 26 /* color or type with maximal density */
// #define Z_ZERO 99 /* return zero */
/* for Schrodinger equation */
#define Z_MODULE 30 /* module squared of first two fields */
#define Z_ARGUMENT 31 /* argument of first two fields, with luminosity depending on module */
#define Z_REALPART 32 /* first field, with luminosity depending on module */
/* for RPSLZ equation */
#define Z_MAXTYPE_RPSLZ 40 /* color of type with maximal density */
#define Z_THETA_RPSLZ 41 /* polar angle */
#define Z_NORM_GRADIENT_RPSLZ 42 /* gradient of polar angle */
#define Z_NORM_GRADIENT_RPSLZ_ASYM 43 /* gradient of polar angle */
/* for Euler incompressible Euler equation */
#define Z_EULER_VORTICITY 50 /* vorticity of velocity */
#define Z_EULER_LOG_VORTICITY 51 /* log of vorticity of velocity */
#define Z_EULER_VORTICITY_ASYM 52 /* vorticity of velocity */
#define Z_EULER_LPRESSURE 53 /* Laplacian of pressure */
#define Z_EULER_PRESSURE 54 /* pressure */
/* for compressible Euler equation */
#define Z_EULER_DENSITY 60 /* density */
#define Z_EULER_SPEED 61 /* norm of velocity */
#define Z_EULERC_VORTICITY 62 /* vorticity of velocity */
#define Z_EULER_DIRECTION 63 /* direction of velocity */
#define Z_EULER_DIRECTION_SPEED 64 /* hue for direction of velocity, luminosity for speed */
/* for shallow water equation */
#define Z_SWATER_HEIGHT 70 /* height */
#define Z_SWATER_SPEED 71 /* speed */
#define Z_SWATER_DIRECTION_SPEED 74 /* hue for direction of velocity, luminosity for speed */
/* special boundary conditions for Euler equation */
#define BCE_TOPBOTTOM 1 /* special flow at top and bottom */
#define BCE_TOPBOTTOMLEFT 2 /* special flow at top, bottom and left side */
#define BCE_CHANNELS 3 /* special flow in channels at left and right */
#define BCE_MIDDLE_STRIP 4 /* special flow in horizontal strip in the middle */
#define BCE_LEFT 5 /* special flow at left side */
#define BCE_FOUR_CHANNELS 6 /* special flow in four channels at left and right */
/* flow types for boundary conditions in Euler equation */
#define BCF_LAMINAR 0 /* laminar flow */
#define BCF_PRESSURE 1 /* laminar flow with pressure gradient */
typedef struct
{
double xc, yc, radius; /* center and radius of circle */
short int active, top; /* circle is active, circle is in top half */
} t_circle;
typedef struct
{
double xc, yc, radius, angle; /* center, radius and angle of polygon */
int nsides; /* number of sides of polygon */
short int active, top; /* polygon is active, polygon is in top half */
} t_polygon;
typedef struct
{
double x, y; /* (x,y) coordinates of vertex */
double posi, posj; /* (i,j) coordinates of vertex */
} t_vertex;
typedef struct
{
double x1, y1, x2, y2; /* (x,y) coordinates of vertices */
double posi1, posj1, posi2, posj2; /* (i,j) coordinates of vertices */
} t_rectangle;
typedef struct
{
double x1, y1, x2, y2; /* (x,y) coordinates of long symmetry axis */
double width; /* width of rectangle */
double posi1, posj1, posi2, posj2; /* (i,j) coordinates of vertices */
double posi3, posj3, posi4, posj4; /* (i,j) coordinates of vertices */
} t_rect_rotated;
typedef struct
{
double xc, yc; /* (x,y) coordinates of center */
double r, width; /* radius and width of arc */
double angle1, dangle; /* start angle and angular width */
double posi1, posj1; /* (i,j) coordinates of center */
// double posi3, posj3, posi4, posj4; /* (i,j) coordinates of vertices */
} t_arc;
typedef struct
{
int nneighb; /* number of neighbours to compute Laplacian */
double *nghb[4]; /* pointers to neighbours */
} t_laplacian;
typedef struct
{
double xc, yc; /* (x,y) coordinates of center */
int ix, iy; /* lattice coordinates of center */
double period, amp; /* period and amplitude */
double phase; /* phase shift */
double var_envelope; /* variance of Gaussian envelope */
int time_shift; /* time shift */
} t_wave_packet;
typedef struct
{
double xc, yc; /* (x,y) coordinates of center */
double phase; /* phase of source */
double amp; /* amplitude */
int sign;
} t_wave_source;
int ncircles = NMAXCIRCLES; /* actual number of circles, can be decreased e.g. for random patterns */
int npolyline = NMAXPOLY; /* actual length of polyline */
int npolyrect = NMAXPOLY; /* actual number of polyrect */
int npolyrect_rot = NMAXPOLY; /* actual number of rotated polyrect */
int npolyarc = NMAXPOLY; /* actual number of arcs */
short int input_signal[NSTEPS]; /* time-dependent source signal */
t_circle circles[NMAXCIRCLES]; /* circular scatterers */
t_polygon polygons[NMAXCIRCLES]; /* polygonal scatterers */
t_vertex polyline[NMAXPOLY]; /* vertices of polygonal line */
t_rectangle polyrect[NMAXPOLY]; /* vertices of rectangles */
t_rect_rotated polyrectrot[NMAXPOLY]; /* data of rotated rectangles */
t_arc polyarc[NMAXPOLY]; /* data of arcs */
/* the same for comparisons between different domains */
int ncircles_b = NMAXCIRCLES; /* actual number of circles, can be decreased e.g. for random patterns */
int npolyline_b = NMAXPOLY; /* actual length of polyline */
t_circle circles_b[NMAXCIRCLES]; /* circular scatterers */
t_polygon polygons_b[NMAXCIRCLES]; /* polygonal scatterers */
t_vertex polyline_b[NMAXPOLY]; /* vertices of polygonal line */
double courant2, courantb2; /* Courant parameters squared */
// double julia_x = -0.5, julia_y = 0.5; /* parameters for Julia sets */
// double julia_x = 0.33267, julia_y = 0.06395; /* parameters for Julia sets */
double julia_x = 0.37468, julia_y = 0.21115; /* parameters for Julia sets */
double wave_source_x[NMAXSOURCES], wave_source_y[NMAXSOURCES]; /* position of wave source */
double focus_x = XMAX; /* position of focus */
double michelson_position = 0.0; /* position of mirror in Michelson interferometer */
#define NEPICYCLOID 2000 /* number of sampled values for epicycloid */
double epicycloid_phi_to_r[NEPICYCLOID]; /* angles for epicycloid */