Add files via upload
This commit is contained in:
parent
b2d7f56e1c
commit
b809ce9e55
12146
Parameters.md
12146
Parameters.md
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -81,6 +81,9 @@
|
|||
#define I_LJ_DIPOLE 5 /* Lennard-Jones with a dipolar angle dependence */
|
||||
#define I_LJ_QUADRUPOLE 6 /* Lennard-Jones with a quadropolar angle dependence */
|
||||
#define I_LJ_WATER 7 /* model for water molecule */
|
||||
#define I_VICSEK 8 /* Vicsek-type interaction */
|
||||
#define I_VICSEK_REPULSIVE 9 /* Vicsek-type interaction with harmonic repulsion */
|
||||
#define I_VICSEK_SPEED 10 /* Vicsek-type interaction with speed adjustment */
|
||||
|
||||
/* Boundary conditions */
|
||||
|
||||
|
@ -159,6 +162,8 @@
|
|||
#define IC_CATALYSIS 4 /* mix of 1 and 2 in left half, only 1 in right half */
|
||||
#define IC_LAYERS 5 /* layer of 2 below 1 */
|
||||
#define IC_BZ 6 /* initial state for BZ reaction */
|
||||
#define IC_SIGNX 7 /* type 1 or 2 depending on sign of x */
|
||||
#define IC_TWOROCKETS 8 /* type 1 or 2 depending on rocket position */
|
||||
|
||||
/* Plot types */
|
||||
|
||||
|
@ -201,6 +206,7 @@
|
|||
|
||||
#define COL_TURBO_CYCLIC 101 /* TURBO color palette (by Anton Mikhailov) corrected to be cyclic, beta */
|
||||
|
||||
#define VICSEK_INT ((INTERACTION == I_VICSEK)||(INTERACTION == I_VICSEK_REPULSIVE)||(INTERACTION == I_VICSEK_SPEED))
|
||||
|
||||
typedef struct
|
||||
{
|
||||
|
@ -216,6 +222,7 @@ typedef struct
|
|||
double fx; /* x component of force on particle */
|
||||
double fy; /* y component of force on particle */
|
||||
double torque; /* torque on particle */
|
||||
int close_to_boundary; /* has value 1 if particle is close to a boundary */
|
||||
short int thermostat; /* whether particle is coupled to thermostat */
|
||||
int hashcell; /* hash cell in which particle is located */
|
||||
int neighb; /* number of neighbours within given distance */
|
||||
|
|
|
@ -79,6 +79,7 @@
|
|||
|
||||
#define D_WING 70 /* complement of wing-shaped domain */
|
||||
#define D_TESLA 71 /* Tesla valve */
|
||||
#define D_TESLA_FOUR 72 /* four Tesla valves */
|
||||
|
||||
#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) */
|
||||
|
@ -120,6 +121,7 @@
|
|||
/* 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" */
|
||||
|
@ -235,11 +237,16 @@
|
|||
#define Z_EULER_DIRECTION_SPEED 64 /* hut for direction of velocity, luminosity for speed */
|
||||
|
||||
/* special boundary conditions for Euler equation */
|
||||
#define BCE_TOPBOTTOM 1 /* laminar flow at top and bottom */
|
||||
#define BCE_TOPBOTTOMLEFT 2 /* laminar flow at top, bottom and left side */
|
||||
#define BCE_CHANNELS 3 /* laminar flow in channels at left and right */
|
||||
#define BCE_MIDDLE_STRIP 4 /* laminar flow in horizontal strip in the middle */
|
||||
#define BCE_LEFT 5 /* laminar flow at left side */
|
||||
#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
|
||||
{
|
||||
|
@ -300,6 +307,14 @@ typedef struct
|
|||
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 */
|
||||
|
|
148
lennardjones.c
148
lennardjones.c
|
@ -37,14 +37,14 @@
|
|||
#include <time.h>
|
||||
|
||||
#define MOVIE 0 /* set to 1 to generate movie */
|
||||
#define DOUBLE_MOVIE 0 /* set to 1 to produce movies for wave height and energy simultaneously */
|
||||
#define DOUBLE_MOVIE 1 /* set to 1 to produce movies for wave height and energy simultaneously */
|
||||
#define SAVE_MEMORY 1 /* set to 1 to save memory while saving frames */
|
||||
#define NO_EXTRA_BUFFER_SWAP 0 /* some OS require one less buffer swap when recording images */
|
||||
#define NO_EXTRA_BUFFER_SWAP 1 /* some OS require one less buffer swap when recording images */
|
||||
|
||||
#define TIME_LAPSE 1 /* set to 1 to add a time-lapse movie at the end */
|
||||
#define TIME_LAPSE 0 /* set to 1 to add a time-lapse movie at the end */
|
||||
/* so far incompatible with double movie */
|
||||
#define TIME_LAPSE_FACTOR 3 /* factor of time-lapse movie */
|
||||
#define TIME_LAPSE_FIRST 1 /* set to 1 to show time-lapse version first */
|
||||
#define TIME_LAPSE_FIRST 0 /* set to 1 to show time-lapse version first */
|
||||
|
||||
#define SAVE_TIME_SERIES 0 /* set to 1 to save time series of particle positions */
|
||||
|
||||
|
@ -90,22 +90,22 @@
|
|||
#define CENTER_PY 0 /* set to 1 to center vertical momentum */
|
||||
#define CENTER_PANGLE 0 /* set to 1 to center angular momentum */
|
||||
|
||||
#define INTERACTION 1 /* particle interaction, see list in global_ljones.c */
|
||||
#define INTERACTION 10 /* particle interaction, see list in global_ljones.c */
|
||||
#define INTERACTION_B 1 /* particle interaction for second type of particle, see list in global_ljones.c */
|
||||
#define SPIN_INTER_FREQUENCY 5.0 /* angular frequency of spin-spin interaction */
|
||||
#define SPIN_INTER_FREQUENCY 1.0 /* angular frequency of spin-spin interaction */
|
||||
#define SPIN_INTER_FREQUENCY_B 2.0 /* angular frequency of spin-spin interaction for second particle type */
|
||||
|
||||
#define P_PERCOL 0.25 /* probability of having a circle in C_RAND_PERCOL arrangement */
|
||||
#define NPOISSON 100 /* number of points for Poisson C_RAND_POISSON arrangement */
|
||||
#define PDISC_DISTANCE 4.2 /* minimal distance in Poisson disc process, controls density of particles */
|
||||
#define PDISC_DISTANCE 1.3 /* minimal distance in Poisson disc process, controls density of particles */
|
||||
#define PDISC_CANDIDATES 100 /* number of candidates in construction of Poisson disc process */
|
||||
#define RANDOM_POLY_ANGLE 0 /* set to 1 to randomize angle of polygons */
|
||||
|
||||
#define LAMBDA 0.5 /* parameter controlling the dimensions of domain */
|
||||
#define MU 0.008 /* parameter controlling radius of particles */
|
||||
#define MU 0.035 /* parameter controlling radius of particles */
|
||||
#define MU_B 0.012 /* parameter controlling radius of particles of second type */
|
||||
#define NPOLY 25 /* number of sides of polygon */
|
||||
#define APOLY 0.666666666 /* angle by which to turn polygon, in units of Pi/2 */
|
||||
#define APOLY 0.0 /* angle by which to turn polygon, in units of Pi/2 */
|
||||
#define MDEPTH 4 /* depth of computation of Menger gasket */
|
||||
#define MRATIO 3 /* ratio defining Menger gasket */
|
||||
#define MANDELLEVEL 1000 /* iteration level for Mandelbrot set */
|
||||
|
@ -125,11 +125,10 @@
|
|||
|
||||
/* Parameters for length and speed of simulation */
|
||||
|
||||
#define NSTEPS 5000 /* number of frames of movie */
|
||||
// #define NSTEPS 3000 /* number of frames of movie */
|
||||
#define NVID 175 /* number of iterations between images displayed on screen */
|
||||
#define NSTEPS 3800 /* number of frames of movie */
|
||||
#define NVID 50 /* number of iterations between images displayed on screen */
|
||||
#define NSEG 250 /* number of segments of boundary */
|
||||
#define INITIAL_TIME 20 /* time after which to start saving frames */
|
||||
#define INITIAL_TIME 10 /* time after which to start saving frames */
|
||||
#define OBSTACLE_INITIAL_TIME 200 /* time after which to start moving obstacle */
|
||||
#define BOUNDARY_WIDTH 1 /* width of particle boundary */
|
||||
#define LINK_WIDTH 2 /* width of links between particles */
|
||||
|
@ -144,22 +143,22 @@
|
|||
|
||||
/* Boundary conditions, see list in global_ljones.c */
|
||||
|
||||
#define BOUNDARY_COND 0
|
||||
#define BOUNDARY_COND 3
|
||||
|
||||
/* Plot type, see list in global_ljones.c */
|
||||
|
||||
#define PLOT 5
|
||||
#define PLOT_B 0 /* plot type for second movie */
|
||||
#define PLOT 4
|
||||
#define PLOT_B 6 /* plot type for second movie */
|
||||
|
||||
#define DRAW_BONDS 1 /* set to 1 to draw bonds between neighbours */
|
||||
#define COLOR_BONDS 1 /* set to 1 to color bonds according to length */
|
||||
#define FILL_TRIANGLES 1 /* set to 1 to fill triangles between neighbours */
|
||||
#define FILL_TRIANGLES 0 /* set to 1 to fill triangles between neighbours */
|
||||
#define ALTITUDE_LINES 0 /* set to 1 to add horizontal lines to show altitude */
|
||||
#define COLOR_SEG_GROUPS 0 /* set to 1 to collor segment groups differently */
|
||||
|
||||
/* Color schemes */
|
||||
|
||||
#define COLOR_PALETTE 10 /* Color palette, see list in global_ljones.c */
|
||||
#define COLOR_PALETTE 0 /* Color palette, see list in global_ljones.c */
|
||||
|
||||
#define BLACK 1 /* background */
|
||||
|
||||
|
@ -193,27 +192,30 @@
|
|||
|
||||
#define RANDOM_RADIUS 0 /* set to 1 for random circle radius */
|
||||
#define DT_PARTICLE 3.0e-6 /* time step for particle displacement */
|
||||
#define KREPEL 12.0 /* constant in repelling force between particles */
|
||||
#define KREPEL 0.1 /* constant in repelling force between particles */
|
||||
#define EQUILIBRIUM_DIST 2.0 /* Lennard-Jones equilibrium distance */
|
||||
#define EQUILIBRIUM_DIST_B 2.0 /* Lennard-Jones equilibrium distance for second type of particle */
|
||||
#define REPEL_RADIUS 15.0 /* radius in which repelling force acts (in units of particle radius) */
|
||||
#define DAMPING 200.0 /* damping coefficient of particles */
|
||||
#define INITIAL_DAMPING 1000.0 /* damping coefficient of particles during initial phase */
|
||||
#define PARTICLE_MASS 1.0 /* mass of particle of radius MU */
|
||||
#define DAMPING 0.0 /* damping coefficient of particles */
|
||||
#define INITIAL_DAMPING 50.0 /* damping coefficient of particles during initial phase */
|
||||
#define DAMPING_ROT 100.0 /* dampint coefficient for rotation of particles */
|
||||
#define PARTICLE_MASS 0.25 /* mass of particle of radius MU */
|
||||
#define PARTICLE_MASS_B 0.5 /* mass of particle of radius MU */
|
||||
#define PARTICLE_INERTIA_MOMENT 0.02 /* moment of inertia of particle */
|
||||
#define PARTICLE_INERTIA_MOMENT 0.5 /* moment of inertia of particle */
|
||||
#define PARTICLE_INERTIA_MOMENT_B 0.02 /* moment of inertia of second type of particle */
|
||||
#define V_INITIAL 0.0 /* initial velocity range */
|
||||
#define OMEGA_INITIAL 10.0 /* initial angular velocity range */
|
||||
#define V_INITIAL 20.0 /* initial velocity range */
|
||||
#define OMEGA_INITIAL 5.0 /* initial angular velocity range */
|
||||
#define VICSEK_VMIN 1.0 /* minimal speed of particles in Vicsek model */
|
||||
#define VICSEK_VMAX 40.0 /* minimal speed of particles in Vicsek model */
|
||||
|
||||
#define THERMOSTAT 1 /* set to 1 to switch on thermostat */
|
||||
#define THERMOSTAT 0 /* set to 1 to switch on thermostat */
|
||||
#define VARY_THERMOSTAT 0 /* set to 1 for time-dependent thermostat schedule */
|
||||
#define SIGMA 5.0 /* noise intensity in thermostat */
|
||||
#define BETA 0.002 /* initial inverse temperature */
|
||||
#define MU_XI 0.01 /* friction constant in thermostat */
|
||||
#define KSPRING_BOUNDARY 1.0e7 /* confining harmonic potential outside simulation region */
|
||||
#define KSPRING_OBSTACLE 1.0e11 /* harmonic potential of obstacles */
|
||||
#define NBH_DIST_FACTOR 10.0 /* radius in which to count neighbours */
|
||||
#define NBH_DIST_FACTOR 3.0 /* radius in which to count neighbours */
|
||||
#define GRAVITY 0.0 /* gravity acting on all particles */
|
||||
#define GRAVITY_X 0.0 /* horizontal gravity acting on all particles */
|
||||
#define INCREASE_GRAVITY 0 /* set to 1 to increase gravity during the simulation */
|
||||
|
@ -221,17 +223,19 @@
|
|||
#define GRAVITY_FACTOR 100.0 /* factor by which to increase gravity */
|
||||
#define GRAVITY_INITIAL_TIME 200 /* time at start of simulation with constant gravity */
|
||||
#define GRAVITY_RESTORE_TIME 700 /* time at end of simulation with gravity restored to initial value */
|
||||
#define KSPRING_VICSEK 0.2 /* spring constant for I_VICSEK_SPEED interaction */
|
||||
|
||||
#define ROTATION 1 /* set to 1 to include rotation of particles */
|
||||
#define COUPLE_ANGLE_TO_THERMOSTAT 0 /* set to 1 to couple angular degrees of freedom to thermostat */
|
||||
#define DIMENSION_FACTOR 1.0 /* scaling factor taking into account number of degrees of freedom */
|
||||
#define KTORQUE 100.0 /* force constant in angular dynamics */
|
||||
#define KTORQUE 2.0e3 /* force constant in angular dynamics */
|
||||
#define KTORQUE_B 10.0 /* force constant in angular dynamics */
|
||||
#define KTORQUE_DIFF 150.0 /* force constant in angular dynamics for different particles */
|
||||
#define KTORQUE_BOUNDARY 1.0e6 /* constant in torque from the boundary */
|
||||
#define DRAW_SPIN 0 /* set to 1 to draw spin vectors of particles */
|
||||
#define DRAW_SPIN_B 0 /* set to 1 to draw spin vectors of particles */
|
||||
#define DRAW_CROSS 1 /* set to 1 to draw cross on particles of second type */
|
||||
#define SPIN_RANGE 7.0 /* range of spin-spin interaction */
|
||||
#define SPIN_RANGE 10.0 /* range of spin-spin interaction */
|
||||
#define SPIN_RANGE_B 5.0 /* range of spin-spin interaction for second type of particle */
|
||||
#define QUADRUPOLE_RATIO 0.6 /* anisotropy in quadrupole potential */
|
||||
|
||||
|
@ -326,7 +330,7 @@
|
|||
#define POSITION_Y_DEPENDENCE 0 /* set to 1 for the separation between particles to be horizontal */
|
||||
#define PRINT_ENTROPY 0 /* set to 1 to compute entropy */
|
||||
|
||||
#define REACTION_DIFFUSION 1 /* set to 1 to simulate a chemical reaction (particles may change type) */
|
||||
#define REACTION_DIFFUSION 0 /* set to 1 to simulate a chemical reaction (particles may change type) */
|
||||
#define RD_REACTION 15 /* type of reaction, see list in global_ljones.c */
|
||||
#define RD_TYPES 5 /* number of types in reaction-diffusion equation */
|
||||
#define RD_INITIAL_COND 2 /* initial condition of particles */
|
||||
|
@ -339,7 +343,7 @@
|
|||
#define COLLISION_TIME 15 /* time during which collisions are shown */
|
||||
|
||||
#define PRINT_PARTICLE_NUMBER 0 /* set to 1 to print total number of particles */
|
||||
#define PLOT_PARTICLE_NUMBER 1 /* set to 1 to make of plot of particle number over time */
|
||||
#define PLOT_PARTICLE_NUMBER 0 /* set to 1 to make of plot of particle number over time */
|
||||
#define PARTICLE_NB_PLOT_FACTOR 0.5 /* expected final number of particles over initial number */
|
||||
#define PRINT_LEFT 1 /* set to 1 to print certain parameters at the top left instead of right */
|
||||
#define PLOT_SPEEDS 0 /* set to 1 to add a plot of obstacle speeds (e.g. for rockets) */
|
||||
|
@ -361,14 +365,15 @@
|
|||
#define MAZE_MAX_NGBH 4 /* max number of neighbours of maze cell */
|
||||
#define RAND_SHIFT 200 /* seed of random number generator */
|
||||
#define MAZE_XSHIFT 0.0 /* horizontal shift of maze */
|
||||
#define MAZE_WIDTH 0.01 /* width of maze walls */
|
||||
|
||||
#define FLOOR_FORCE 1 /* set to 1 to limit force on particle to FMAX */
|
||||
#define FMAX 1.0e10 /* maximal force */
|
||||
#define FLOOR_OMEGA 0 /* set to 1 to limit particle momentum to PMAX */
|
||||
#define PMAX 1000.0 /* maximal force */
|
||||
|
||||
#define HASHX 100 /* size of hashgrid in x direction */
|
||||
#define HASHY 50 /* size of hashgrid in y direction */
|
||||
#define HASHX 60 /* size of hashgrid in x direction */
|
||||
#define HASHY 30 /* size of hashgrid in y direction */
|
||||
#define HASHMAX 100 /* maximal number of particles per hashgrid cell */
|
||||
#define HASHGRID_PADDING 0.1 /* padding of hashgrid outside simulation window */
|
||||
|
||||
|
@ -703,12 +708,13 @@ double evolve_particles(t_particle particle[NMAXCIRCLES], t_hashgrid hashgrid[HA
|
|||
{
|
||||
px[j] *= exp(- 0.5*DT_PARTICLE*xi);
|
||||
py[j] *= exp(- 0.5*DT_PARTICLE*xi);
|
||||
if (!COUPLE_ANGLE_TO_THERMOSTAT) pangle[j] *= exp(- DT_PARTICLE*DAMPING_ROT);
|
||||
}
|
||||
else
|
||||
{
|
||||
px[j] *= exp(- DT_PARTICLE*damping);
|
||||
py[j] *= exp(- DT_PARTICLE*damping);
|
||||
pangle[j] *= exp(- DT_PARTICLE*damping);
|
||||
pangle[j] *= exp(- DT_PARTICLE*DAMPING_ROT);
|
||||
}
|
||||
if ((THERMOSTAT_ON)&&(COUPLE_ANGLE_TO_THERMOSTAT)&&(particle[j].thermostat))
|
||||
pangle[j] *= exp(- 0.5*DT_PARTICLE*xi);
|
||||
|
@ -895,7 +901,15 @@ void evolve_segment_groups(t_segment segment[NMAXSEGMENTS], int time, t_group_se
|
|||
double fx[NMAXGROUPS], fy[NMAXGROUPS], torque[NMAXGROUPS], dx[NMAXGROUPS], dy[NMAXGROUPS], dalpha[NMAXGROUPS];
|
||||
double x, y, dx0, dy0, padding, proj, distance, f, xx[2], yy[2], xmean = 0.0, ymean = 0.0;
|
||||
int i, j, k, group = 0;
|
||||
static double maxdepth, saturation_depth;
|
||||
static double maxdepth, saturation_depth, xmax;
|
||||
static int first = 1;
|
||||
|
||||
if (first)
|
||||
{
|
||||
xmax = XMAX - TRACK_X_PADDING;
|
||||
if ((PLOT_SPEEDS)||(PLOT_TRAJECTORIES)) xmax -= 1.8;
|
||||
first = 0;
|
||||
}
|
||||
|
||||
maxdepth = 0.5*GROUP_WIDTH;
|
||||
saturation_depth = 0.1*GROUP_WIDTH;
|
||||
|
@ -1038,8 +1052,8 @@ void evolve_segment_groups(t_segment segment[NMAXSEGMENTS], int time, t_group_se
|
|||
ymean = ymean/((double)(ngroups-1));
|
||||
|
||||
if (ymean > ytrack) ytrack = ymean;
|
||||
if (xmean > XMAX - TRACK_X_PADDING)
|
||||
xtrack = xmean - XMAX + TRACK_X_PADDING;
|
||||
if (xmean > xmax)
|
||||
xtrack = xmean - xmax;
|
||||
else if (xmean < XMIN + TRACK_X_PADDING)
|
||||
xtrack = xmean - XMIN - TRACK_X_PADDING;
|
||||
}
|
||||
|
@ -1048,10 +1062,8 @@ void evolve_segment_groups(t_segment segment[NMAXSEGMENTS], int time, t_group_se
|
|||
|
||||
void animation()
|
||||
{
|
||||
double time, scale, diss, rgb[3], dissip, gradient[2], x, y, dx, dy, dt, xleft, xright, a, b,
|
||||
length, fx, fy, force[2], totalenergy = 0.0, krepel = KREPEL, pos[2], prop, vx,
|
||||
beta = BETA, xi = 0.0, xmincontainer = BCXMIN, xmaxcontainer = BCXMAX, torque, torque_ij,
|
||||
fboundary = 0.0, pleft = 0.0, pright = 0.0, entropy[2], mean_energy, gravity = GRAVITY, speed_ratio, ymin, ymax, delta_energy;
|
||||
double time, scale, diss, rgb[3], dissip, gradient[2], x, y, dx, dy, dt, xleft, xright,
|
||||
a, b, length, fx, fy, force[2], totalenergy = 0.0, krepel = KREPEL, pos[2], prop, vx, beta = BETA, xi = 0.0, xmincontainer = BCXMIN, xmaxcontainer = BCXMAX, torque, torque_ij, fboundary = 0.0, pleft = 0.0, pright = 0.0, entropy[2], mean_energy, gravity = GRAVITY, speed_ratio, ymin, ymax, delta_energy, speed, ratio = 1.0, ratioc;
|
||||
double *qx, *qy, *px, *py, *qangle, *pangle, *pressure, *obstacle_speeds;
|
||||
int i, j, k, n, m, s, ij[2], i0, iplus, iminus, j0, jplus, jminus, p, q, p1, q1, p2, q2, total_neighbours = 0,
|
||||
min_nb, max_nb, close, wrapx = 0, wrapy = 0, nactive = 0, nadd_particle = 0, nmove = 0, nsuccess = 0,
|
||||
|
@ -1070,7 +1082,8 @@ void animation()
|
|||
t_hashgrid *hashgrid;
|
||||
char message[100];
|
||||
|
||||
|
||||
ratioc = 1.0 - ratio;
|
||||
|
||||
particle = (t_particle *)malloc(NMAXCIRCLES*sizeof(t_particle)); /* particles */
|
||||
if (ADD_FIXED_OBSTACLES) obstacle = (t_obstacle *)malloc(NMAXOBSTACLES*sizeof(t_obstacle)); /* circular obstacles */
|
||||
if (ADD_FIXED_SEGMENTS)
|
||||
|
@ -1127,9 +1140,9 @@ void animation()
|
|||
|
||||
|
||||
|
||||
// printf("1\n");
|
||||
printf("Initializing configuration\n");
|
||||
|
||||
nactive = initialize_configuration(particle, hashgrid, obstacle, px, py, pangle, tracer_n);
|
||||
nactive = initialize_configuration(particle, hashgrid, obstacle, px, py, pangle, tracer_n, segment);
|
||||
|
||||
// xi = 0.0;
|
||||
|
||||
|
@ -1140,8 +1153,9 @@ void animation()
|
|||
sleep(1);
|
||||
|
||||
update_hashgrid(particle, hashgrid, 1);
|
||||
printf("Updated hashgrid\n");
|
||||
compute_relative_positions(particle, hashgrid);
|
||||
|
||||
printf("Computed relative positions\n");
|
||||
blank();
|
||||
// glColor3f(0.0, 0.0, 0.0);
|
||||
|
||||
|
@ -1166,9 +1180,12 @@ void animation()
|
|||
thermostat_on = thermostat_schedule(i);
|
||||
printf("Termostat: %i\n", thermostat_on);
|
||||
}
|
||||
|
||||
|
||||
/* deactivate some segments */
|
||||
if ((ADD_FIXED_SEGMENTS)&&(DEACTIVATE_SEGMENT)&&(i == INITIAL_TIME + SEGMENT_DEACTIVATION_TIME + 1))
|
||||
for (j=0; j<nsegments; j++) if (segment[j].inactivate) segment[j].active = 0;
|
||||
|
||||
/* recolor particles in case if P_INITIAL_POS color code */
|
||||
if ((i <= INITIAL_TIME-1)&&(i%10 == 0)&&((PLOT == P_INITIAL_POS)||(PLOT_B == P_INITIAL_POS)))
|
||||
{
|
||||
|
@ -1184,7 +1201,7 @@ void animation()
|
|||
particle[j].color_hue = 360.0*(particle[j].yc - ymin)/(ymax - ymin);
|
||||
}
|
||||
|
||||
blank();
|
||||
blank();
|
||||
|
||||
fboundary = 0.0;
|
||||
pleft = 0.0;
|
||||
|
@ -1212,7 +1229,6 @@ void animation()
|
|||
segment[j].torque = 0.0;
|
||||
}
|
||||
|
||||
|
||||
compute_relative_positions(particle, hashgrid);
|
||||
update_hashgrid(particle, hashgrid, 0);
|
||||
|
||||
|
@ -1225,10 +1241,27 @@ void animation()
|
|||
|
||||
/* compute force from other particles */
|
||||
compute_particle_force(j, krepel, particle, hashgrid);
|
||||
|
||||
|
||||
/* take care of boundary conditions */
|
||||
fboundary += compute_boundary_force(j, particle, obstacle, segment, xmincontainer, xmaxcontainer, &pleft, &pright, pressure, wall);
|
||||
|
||||
/* align velocities in case of Vicsek models */
|
||||
// if (VICSEK_INT)
|
||||
if ((VICSEK_INT)&&(!particle[j].close_to_boundary))
|
||||
{
|
||||
speed = module2(particle[j].vx,particle[j].vy);
|
||||
if ((VICSEK_VMIN > 0.0)&&(speed < VICSEK_VMIN)) speed = VICSEK_VMIN;
|
||||
if (speed > VICSEK_VMAX) speed = 0.5*(speed + VICSEK_VMAX);
|
||||
particle[j].vx = speed*cos(particle[j].angle);
|
||||
particle[j].vy = speed*sin(particle[j].angle);
|
||||
|
||||
speed = module2(px[j],py[j]);
|
||||
if ((VICSEK_VMIN > 0.0)&&(speed < VICSEK_VMIN)) speed = VICSEK_VMIN;
|
||||
if (speed > VICSEK_VMAX) speed = 0.5*(speed + VICSEK_VMAX);
|
||||
px[j] = speed*cos(particle[j].angle);
|
||||
py[j] = speed*sin(particle[j].angle);
|
||||
}
|
||||
|
||||
/* add gravity */
|
||||
if (INCREASE_GRAVITY) particle[j].fy -= gravity/particle[j].mass_inv;
|
||||
else
|
||||
|
@ -1260,7 +1293,9 @@ void animation()
|
|||
}
|
||||
if ((MOVE_BOUNDARY)&&(i > OBSTACLE_INITIAL_TIME)) evolve_segments(segment, i);
|
||||
|
||||
if ((MOVE_SEGMENT_GROUPS)&&(i > OBSTACLE_INITIAL_TIME)) evolve_segment_groups(segment, i, segment_group);
|
||||
if ((MOVE_SEGMENT_GROUPS)&&(i > INITIAL_TIME + SEGMENT_DEACTIVATION_TIME)) evolve_segment_groups(segment, i, segment_group);
|
||||
|
||||
// if ((MOVE_SEGMENT_GROUPS)&&(i > OBSTACLE_INITIAL_TIME)) evolve_segment_groups(segment, i, segment_group);
|
||||
} /* end of for (n=0; n<NVID; n++) */
|
||||
|
||||
if ((i>INITIAL_TIME)&&(SAVE_TIME_SERIES))
|
||||
|
@ -1305,7 +1340,7 @@ void animation()
|
|||
// if ((PARTIAL_THERMO_COUPLING))
|
||||
if ((PARTIAL_THERMO_COUPLING)&&(i>N_T_AVERAGE))
|
||||
{
|
||||
nthermo = partial_thermostat_coupling(particle, xshift + PARTIAL_THERMO_SHIFT);
|
||||
nthermo = partial_thermostat_coupling(particle, xshift + PARTIAL_THERMO_SHIFT, segment);
|
||||
printf("%i particles coupled to thermostat out of %i active\n", nthermo, nactive);
|
||||
mean_energy = compute_mean_energy(particle);
|
||||
}
|
||||
|
@ -1326,7 +1361,6 @@ void animation()
|
|||
while (particle[j].angle < 0.0) particle[j].angle += DPI;
|
||||
}
|
||||
|
||||
|
||||
/* update tracer particle trajectory */
|
||||
if ((TRACER_PARTICLE)&&(i > INITIAL_TIME))
|
||||
{
|
||||
|
@ -1347,7 +1381,7 @@ void animation()
|
|||
printf("Boundary force: %.3f\n", fboundary/(double)(ncircles*NVID));
|
||||
if (RESAMPLE_Y) printf("%i succesful moves out of %i trials\n", nsuccess, nmove);
|
||||
if (INCREASE_GRAVITY) printf("Gravity: %.3f\n", gravity);
|
||||
|
||||
|
||||
total_neighbours = 0;
|
||||
min_nb = 100;
|
||||
max_nb = 0;
|
||||
|
@ -1509,6 +1543,7 @@ void animation()
|
|||
{
|
||||
if (DOUBLE_MOVIE)
|
||||
{
|
||||
blank();
|
||||
if (TRACER_PARTICLE) draw_trajectory(trajectory, traj_position, traj_length);
|
||||
draw_particles(particle, PLOT, beta, collisions, ncollisions);
|
||||
draw_container(xmincontainer, xmaxcontainer, obstacle, segment, wall);
|
||||
|
@ -1528,9 +1563,14 @@ void animation()
|
|||
else if (PRINT_PARTICLE_SPEEDS) print_particles_speeds(particle);
|
||||
else if (PRINT_SEGMENTS_SPEEDS) print_segment_group_speeds(segment_group);
|
||||
// print_segments_speeds(vxsegments, vysegments);
|
||||
glutSwapBuffers();
|
||||
// glutSwapBuffers();
|
||||
}
|
||||
for (i=0; i<MID_FRAMES; i++) save_frame_lj();
|
||||
for (i=0; i<MID_FRAMES; i++)
|
||||
{
|
||||
save_frame_lj();
|
||||
if (!NO_EXTRA_BUFFER_SWAP) glutSwapBuffers();
|
||||
}
|
||||
glutSwapBuffers();
|
||||
if (DOUBLE_MOVIE)
|
||||
{
|
||||
if (TRACER_PARTICLE) draw_trajectory(trajectory, traj_position, traj_length);
|
||||
|
|
218
rde.c
218
rde.c
|
@ -50,32 +50,17 @@
|
|||
#define WINHEIGHT 1150 /* window height */
|
||||
#define NX 960 /* number of grid points on x axis */
|
||||
#define NY 575 /* number of grid points on y axis */
|
||||
// #define NX 480 /* number of grid points on x axis */
|
||||
// #define NY 250 /* number of grid points on y axis */
|
||||
|
||||
// #define WINWIDTH 1280 /* window width */
|
||||
// #define WINHEIGHT 720 /* window height */
|
||||
// #define NX 640 /* number of grid points on x axis */
|
||||
// #define NY 360 /* number of grid points on y axis */
|
||||
|
||||
#define XMIN -2.0
|
||||
#define XMAX 2.0 /* x interval */
|
||||
#define YMIN -1.197916667
|
||||
#define YMAX 1.197916667 /* y interval for 9/16 aspect ratio */
|
||||
|
||||
// #define WINWIDTH 1280 /* window width */
|
||||
// #define WINHEIGHT 720 /* window height */
|
||||
//
|
||||
// // #define NX 320 /* number of grid points on x axis */
|
||||
// // #define NY 180 /* number of grid points on y axis */
|
||||
// #define NX 640 /* number of grid points on x axis */
|
||||
// #define NY 360 /* number of grid points on y axis */
|
||||
// // #define NX 960 /* number of grid points on x axis */
|
||||
// // #define NY 540 /* number of grid points on y axis */
|
||||
//
|
||||
// // #define NX 1280 /* number of grid points on x axis */
|
||||
// // #define NY 720 /* number of grid points on y axis */
|
||||
//
|
||||
// #define XMIN -2.0
|
||||
// #define XMAX 2.0 /* x interval */
|
||||
// #define YMIN -1.125
|
||||
// #define YMAX 1.125 /* y interval for 9/16 aspect ratio */
|
||||
|
||||
/* Choice of simulated equation */
|
||||
|
||||
#define RDE_EQUATION 7 /* choice of reaction term, see list in global_3d.c */
|
||||
|
@ -84,15 +69,16 @@
|
|||
|
||||
#define ADD_POTENTIAL 0 /* set to 1 to add a potential (for Schrodinger equation) */
|
||||
#define ADD_MAGNETIC_FIELD 0 /* set to 1 to add a magnetic field (for Schrodinger equation) - then set POTENTIAL 1 */
|
||||
#define ADD_FORCE_FIELD 1 /* set to 1 to add a foce field (for compressible Euler equation) */
|
||||
#define ADD_FORCE_FIELD 0 /* set to 1 to add a foce field (for compressible Euler equation) */
|
||||
#define POTENTIAL 7 /* type of potential or vector potential, see list in global_3d.c */
|
||||
#define FORCE_FIELD 5 /* type of force field, see list in global_3d.c */
|
||||
#define ADD_CORIOLIS_FORCE 1 /* set to 1 to add Coriolis force (quasigeostrophic Euler equations) */
|
||||
|
||||
#define ANTISYMMETRIZE_WAVE_FCT 0 /* set tot 1 to make wave function antisymmetric */
|
||||
#define ADAPT_STATE_TO_BC 1 /* to smoothly adapt initial state to obstacles */
|
||||
#define OBSTACLE_GEOMETRY 71 /* geometry of obstacles, as in B_DOMAIN */
|
||||
// #define BC_STIFFNESS 100.0 /* controls region of boundary condition control */
|
||||
#define ADAPT_STATE_TO_BC 0 /* to smoothly adapt initial state to obstacles */
|
||||
#define OBSTACLE_GEOMETRY 72 /* geometry of obstacles, as in B_DOMAIN */
|
||||
#define BC_STIFFNESS 50.0 /* controls region of boundary condition control */
|
||||
// #define BC_STIFFNESS 100.0 /* controls region of boundary condition control */
|
||||
|
||||
#define JULIA_SCALE 0.5 /* scaling for Julia sets */
|
||||
|
||||
|
@ -152,7 +138,9 @@
|
|||
#define BZQ 0.0008 /* parameter in BZ equation */
|
||||
#define BZF 1.2 /* parameter in BZ equation */
|
||||
#define B_FIELD 10.0 /* magnetic field */
|
||||
#define G_FIELD 2.0e-5 /* gravity/constant in repulsive field from obstacles */
|
||||
#define G_FIELD 0.004 /* gravity/constant in repulsive field from obstacles */
|
||||
// #define G_FIELD 1.0e-4 /* gravity/constant in repulsive field from obstacles */
|
||||
// #define G_FIELD 2.0e-5 /* gravity/constant in repulsive field from obstacles */
|
||||
#define AB_RADIUS 0.2 /* radius of region with magnetic field for Aharonov-Bohm effect */
|
||||
#define K_EULER 50.0 /* constant in stream function integration of Euler equation */
|
||||
#define K_EULER_INC 0.5 /* constant in incompressible Euler equation */
|
||||
|
@ -189,14 +177,15 @@
|
|||
#define RPSLZB_FINAL_TIME 500 /* final time during which rpslzb remains constant */
|
||||
|
||||
#define CHANGE_FLOW_SPEED 0 /* set to 1 to change speed of laminar flow */
|
||||
#define IN_OUT_FLOW_BC 3 /* type of in-flow/out-flow boundary conditions for Euler equation */
|
||||
#define IN_OUT_BC_FACTOR 0.01 /* factor of convex combination between old and new flow */
|
||||
|
||||
#define IN_OUT_FLOW_BC 0 /* type of in-flow/out-flow boundary conditions for Euler equation, 0 for no b.c. */
|
||||
#define IN_OUT_BC_FACTOR 0.001 /* factor of convex combination between old and new flow */
|
||||
#define BC_FLOW_TYPE 1 /* type of initial condition */
|
||||
/* see list in global_pdes.c */
|
||||
#define IN_OUT_FLOW_MIN_AMP 0.45 /* amplitude of in-flow/out-flow boundary conditions (for Euler equation) - min value */
|
||||
#define IN_OUT_FLOW_MIN_AMP 0.45 /* amplitude of in-flow/out-flow boundary conditions (for Euler equation) - min value */
|
||||
#define IN_OUT_FLOW_AMP 0.45 /* amplitude of in-flow/out-flow boundary conditions (for Euler equation) - max value */
|
||||
#define LAMINAR_FLOW_MODULATION 0.05 /* asymmetry of laminar flow */
|
||||
#define LAMINAR_FLOW_MODULATION 0.01 /* asymmetry of laminar flow */
|
||||
#define LAMINAR_FLOW_YPERIOD 1.0 /* period of laminar flow in y direction */
|
||||
#define PRESSURE_GRADIENT 0.3 /* amplitude of pressure gradient for Euler equation */
|
||||
|
||||
#define EULER_GRADIENT_YSHIFT 0.0 /* y-shift in computation of gradient in Euler equation */
|
||||
|
||||
|
@ -206,8 +195,8 @@
|
|||
|
||||
/* Parameters for length and speed of simulation */
|
||||
|
||||
#define NSTEPS 2000 /* number of frames of movie */
|
||||
// #define NSTEPS 100 /* number of frames of movie */
|
||||
#define NSTEPS 2250 /* number of frames of movie */
|
||||
// #define NSTEPS 500 /* number of frames of movie */
|
||||
#define NVID 100 /* number of iterations between images displayed on screen */
|
||||
#define ACCELERATION_FACTOR 1.0 /* factor by which to increase NVID in course of simulation */
|
||||
#define DT_ACCELERATION_FACTOR 1.0 /* factor by which to increase time step in course of simulation */
|
||||
|
@ -235,14 +224,13 @@
|
|||
|
||||
/* Plot type - color scheme */
|
||||
|
||||
#define CPLOT 61
|
||||
#define CPLOT 64
|
||||
#define CPLOT_B 62
|
||||
|
||||
/* Plot type - height of 3D plot */
|
||||
|
||||
#define ZPLOT 61 /* z coordinate in 3D plot */
|
||||
// #define ZPLOT 32 /* z coordinate in 3D plot */
|
||||
#define ZPLOT_B 62 /* z coordinate in second 3D plot */
|
||||
#define ZPLOT_B 64 /* z coordinate in second 3D plot */
|
||||
|
||||
#define AMPLITUDE_HIGH_RES 1 /* set to 1 to increase resolution of P_3D_AMPLITUDE plot */
|
||||
#define SHADE_3D 1 /* set to 1 to change luminosity according to normal vector */
|
||||
|
@ -261,6 +249,8 @@
|
|||
#define PRINT_PROBABILITIES 0 /* set to 1 to print probabilities (for Ehrenfest urn configuration) */
|
||||
#define PRINT_NOISE 0 /* set to 1 to print noise intensity */
|
||||
#define PRINT_FLOW_SPEED 0 /* set to 1 to print speed of flow */
|
||||
#define PRINT_AVERAGE_SPEED 0 /* set to 1 to print average speed of flow */
|
||||
#define PRINT_LEFT 1 /* set to 1 to print parameters at left side */
|
||||
|
||||
#define DRAW_FIELD_LINES 0 /* set to 1 to draw field lines */
|
||||
#define FIELD_LINE_WIDTH 1 /* width of field lines */
|
||||
|
@ -279,7 +269,7 @@
|
|||
|
||||
/* Color schemes, see list in global_pdes.c */
|
||||
|
||||
#define COLOR_PALETTE 13 /* Color palette, see list in global_pdes.c */
|
||||
#define COLOR_PALETTE 17 /* Color palette, see list in global_pdes.c */
|
||||
#define COLOR_PALETTE_B 10 /* Color palette, see list in global_pdes.c */
|
||||
|
||||
#define BLACK 1 /* black background */
|
||||
|
@ -296,8 +286,8 @@
|
|||
#define RESCALE_COLOR_IN_CENTER 0 /* set to 1 to decrease color intentiy in the center (for wave escaping ring) */
|
||||
#define SLOPE_SCHROD_LUM 50.0 /* sensitivity of luminosity on module, for color scheme Z_ARGUMENT */
|
||||
#define MIN_SCHROD_LUM 0.2 /* minimal luminosity in color scheme Z_ARGUMENT*/
|
||||
#define VSCALE_PRESSURE 0.5 /* additional scaling factor for color scheme Z_EULER_PRESSURE */
|
||||
#define PRESSURE_SHIFT 25.0 /* shift for color scheme Z_EULER_PRESSURE */
|
||||
#define VSCALE_PRESSURE 2.0 /* additional scaling factor for color scheme Z_EULER_PRESSURE */
|
||||
#define PRESSURE_SHIFT 10.0 /* shift for color scheme Z_EULER_PRESSURE */
|
||||
#define PRESSURE_LOG_SHIFT -2.5 /* shift for color scheme Z_EULER_PRESSURE */
|
||||
|
||||
#define COLORHUE 260 /* initial hue of water color for scheme C_LUM */
|
||||
|
@ -311,12 +301,12 @@
|
|||
#define LOG_SCALE 0.5 /* scaling factor for energy log representation */
|
||||
#define LOG_SHIFT 1.0
|
||||
#define LOG_MIN 1.0e-3 /* floor value for log vorticity plot */
|
||||
#define VSCALE_SPEED 15.0 /* additional scaling factor for color scheme Z_EULER_SPEED */
|
||||
#define VSCALE_SPEED 10.0 /* additional scaling factor for color scheme Z_EULER_SPEED */
|
||||
#define VMEAN_SPEED 0.0 /* mean value around which to scale for color scheme Z_EULER_SPEED */
|
||||
#define SHIFT_DENSITY 1.1 /* shift for color scheme Z_EULER_DENSITY */
|
||||
#define VSCALE_DENSITY 10.0 /* additional scaling factor for color scheme Z_EULER_DENSITY */
|
||||
#define VSCALE_VORTICITY 10.0 /* additional scaling factor for color scheme Z_EULERC_VORTICITY */
|
||||
#define VORTICITY_SHIFT 0.3 /* vertical shift of vorticity */
|
||||
#define SHIFT_DENSITY 2.6 /* shift for color scheme Z_EULER_DENSITY */
|
||||
#define VSCALE_DENSITY 7.5 /* additional scaling factor for color scheme Z_EULER_DENSITY */
|
||||
#define VSCALE_VORTICITY 20.0 /* additional scaling factor for color scheme Z_EULERC_VORTICITY */
|
||||
#define VORTICITY_SHIFT 0.0 /* vertical shift of vorticity */
|
||||
#define ZSCALE_SPEED 1.0 /* additional scaling factor for z-coord Z_EULER_SPEED */
|
||||
|
||||
#define NXMAZE 13 /* width of maze */
|
||||
|
@ -327,8 +317,8 @@
|
|||
#define MAZE_WIDTH 0.03 /* half width of maze walls */
|
||||
|
||||
#define DRAW_COLOR_SCHEME 1 /* set to 1 to plot the color scheme */
|
||||
#define COLORBAR_RANGE 2.0 /* scale of color scheme bar */
|
||||
#define COLORBAR_RANGE_B 2.0 /* scale of color scheme bar for 2nd part */
|
||||
#define COLORBAR_RANGE 2.5 /* scale of color scheme bar */
|
||||
#define COLORBAR_RANGE_B 2.5 /* scale of color scheme bar for 2nd part */
|
||||
#define ROTATE_COLOR_SCHEME 0 /* set to 1 to draw color scheme horizontally */
|
||||
|
||||
/* only for compatibility with wave_common.c */
|
||||
|
@ -382,7 +372,7 @@ int reset_view = 0; /* switch to reset 3D view parameters (for option RO
|
|||
|
||||
#define REFRESH_B (ZPLOT_B != ZPLOT)||(CPLOT_B != CPLOT) /* to save computing time, to be improved */
|
||||
#define COMPUTE_WRAP_ANGLE ((WRAP_ANGLE)&&((cplot == Z_ANGLE_GRADIENT)||(cplot == Z_ANGLE_GRADIENTX)||(cplot == Z_ARGUMENT)||(cplot == Z_ANGLE_GRADIENTX)))
|
||||
#define PRINT_PARAMETERS ((PRINT_TIME)||(PRINT_VISCOSITY)||(PRINT_RPSLZB)||(PRINT_PROBABILITIES)||(PRINT_NOISE)||(PRINT_FLOW_SPEED))
|
||||
#define PRINT_PARAMETERS ((PRINT_TIME)||(PRINT_VISCOSITY)||(PRINT_RPSLZB)||(PRINT_PROBABILITIES)||(PRINT_NOISE)||(PRINT_FLOW_SPEED)||(PRINT_AVERAGE_SPEED))
|
||||
#define COMPUTE_PRESSURE ((ZPLOT == Z_EULER_PRESSURE)||(CPLOT == Z_EULER_PRESSURE)||(ZPLOT_B == Z_EULER_PRESSURE)||(CPLOT_B == Z_EULER_PRESSURE))
|
||||
|
||||
#define ASYM_SPEED_COLOR (VMEAN_SPEED == 0.0)
|
||||
|
@ -609,7 +599,7 @@ void initialize_vector_potential(double vpotential_field[2*NX*NY])
|
|||
}
|
||||
}
|
||||
|
||||
void initialize_gfield(double gfield[2*NX*NY], double bc_field[NX*NY])
|
||||
void initialize_gfield(double gfield[2*NX*NY], double bc_field[NX*NY], double bc_field2[NX*NY])
|
||||
/* initialize the exterior field, e.g. for the compressible Euler equation */
|
||||
{
|
||||
int i, j;
|
||||
|
@ -623,9 +613,9 @@ void initialize_gfield(double gfield[2*NX*NY], double bc_field[NX*NY])
|
|||
#pragma omp parallel for private(i,j)
|
||||
for (i=1; i<NX-1; i++){
|
||||
for (j=1; j<NY-1; j++){
|
||||
gfield[i*NY+j] = G_FIELD*(bc_field[(i+1)*NY+j] - bc_field[(i-1)*NY+j])/dx;
|
||||
gfield[NX*NY+i*NY+j] = G_FIELD*(bc_field[i*NY+j+1] - bc_field[i*NY+j-1])/dy;
|
||||
printf("gfield at (%i,%i): (%.3lg, %.3lg)\n", i, j, gfield[i*NY+j], gfield[NX*NY+i*NY+j]);
|
||||
gfield[i*NY+j] = G_FIELD*(bc_field2[(i+1)*NY+j] - bc_field2[(i-1)*NY+j])/dx;
|
||||
gfield[NX*NY+i*NY+j] = G_FIELD*(bc_field2[i*NY+j+1] - bc_field2[i*NY+j-1])/dy;
|
||||
// printf("gfield at (%i,%i): (%.3lg, %.3lg)\n", i, j, gfield[i*NY+j], gfield[NX*NY+i*NY+j]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -662,13 +652,13 @@ void evolve_wave_half(double *phi_in[NFIELDS], double *phi_out[NFIELDS], short i
|
|||
double gfield[2*NX*NY], t_rde rde[NX*NY])
|
||||
/* time step of field evolution */
|
||||
{
|
||||
int i, j, k, iplus, iminus, jplus, jminus, ropening;
|
||||
int i, j, k, iplus, iminus, jplus, jminus, ropening, w;
|
||||
double x, y, z, deltax, deltay, deltaz, rho, rhox, rhoy, pot, u, v, ux, uy, vx, vy, test = 0.0, dx, dy, xy[2], padding, a;
|
||||
double *delta_phi[NLAPLACIANS], *nabla_phi, *nabla_psi, *nabla_omega, *delta_vorticity, *delta_pressure, *delta_p, *delta_u, *delta_v, *nabla_rho, *nabla_u, *nabla_v;
|
||||
// double u_bc[NY], v_bc[NY];
|
||||
static double invsqr3 = 0.577350269; /* 1/sqrt(3) */
|
||||
static double stiffness = 2.0; /* stiffness of Poisson equation solver */
|
||||
static int smooth = 0, y_channels, imin, imax, first = 1;
|
||||
static int smooth = 0, y_channels, y_channels1, imin, imax, first = 1;
|
||||
|
||||
if (first) /* for D_MAZE_CHANNELS boundary conditions in Euler equation */
|
||||
{
|
||||
|
@ -678,7 +668,6 @@ void evolve_wave_half(double *phi_in[NFIELDS], double *phi_out[NFIELDS], short i
|
|||
y = YMIN + 0.02 + dy*((double)ropening);
|
||||
x = YMAX - padding + MAZE_XSHIFT;
|
||||
xy_to_pos(x, y, xy);
|
||||
y_channels = xy[1] - 5;
|
||||
if ((B_DOMAIN == D_MAZE_CHANNELS)||(OBSTACLE_GEOMETRY == D_MAZE_CHANNELS))
|
||||
{
|
||||
imax = xy[0] + 2;
|
||||
|
@ -687,15 +676,6 @@ void evolve_wave_half(double *phi_in[NFIELDS], double *phi_out[NFIELDS], short i
|
|||
imin = xy[0] - 2;
|
||||
if (imin < 5) imin = 5;
|
||||
}
|
||||
else if (OBSTACLE_GEOMETRY == D_TESLA)
|
||||
{
|
||||
imin = 0;
|
||||
imax = NX;
|
||||
y = -a;
|
||||
xy_to_pos(XMIN, y, xy);
|
||||
y_channels = xy[1];
|
||||
printf("y_channels = %i\n", y_channels);
|
||||
}
|
||||
else
|
||||
{
|
||||
imin = 0;
|
||||
|
@ -912,6 +892,11 @@ void evolve_wave_half(double *phi_in[NFIELDS], double *phi_out[NFIELDS], short i
|
|||
phi_out[1][i*NY+j] += intstep*gfield[i*NY+j];
|
||||
phi_out[2][i*NY+j] += intstep*gfield[NX*NY+i*NY+j];
|
||||
}
|
||||
if (ADD_CORIOLIS_FORCE)
|
||||
{
|
||||
phi_out[1][i*NY+j] += intstep*G_FIELD*v;
|
||||
phi_out[2][i*NY+j] -= intstep*G_FIELD*u;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -920,51 +905,15 @@ void evolve_wave_half(double *phi_in[NFIELDS], double *phi_out[NFIELDS], short i
|
|||
|
||||
/* in-flow/out-flow b.c. for incompressible Euler equation */
|
||||
if (((RDE_EQUATION == E_EULER_INCOMP)||(RDE_EQUATION == E_EULER_COMP))&&(IN_OUT_FLOW_BC > 0))
|
||||
{
|
||||
switch (IN_OUT_FLOW_BC) {
|
||||
case (BCE_LEFT):
|
||||
{
|
||||
set_boundary_laminar_flow(flow_speed, LAMINAR_FLOW_MODULATION, 0.02, 0.1, 1.0, 0.0, 0.1, phi_out, xy_in, 0, 5, 0, NY, IN_OUT_BC_FACTOR);
|
||||
break;
|
||||
}
|
||||
case (BCE_TOPBOTTOM):
|
||||
{
|
||||
set_boundary_laminar_flow(flow_speed, LAMINAR_FLOW_MODULATION, 0.02, LAMINAR_FLOW_YPERIOD, 1.0, -0.1, 0.1, phi_out, xy_in, 0, NX, 0, 10, IN_OUT_BC_FACTOR);
|
||||
set_boundary_laminar_flow(flow_speed, LAMINAR_FLOW_MODULATION, 0.02, LAMINAR_FLOW_YPERIOD, 1.0, -0.1, 0.1, phi_out, xy_in, 0, NX, NY-10, NY, IN_OUT_BC_FACTOR);
|
||||
break;
|
||||
}
|
||||
case (BCE_TOPBOTTOMLEFT):
|
||||
{
|
||||
set_boundary_laminar_flow(flow_speed, LAMINAR_FLOW_MODULATION, 0.02, LAMINAR_FLOW_YPERIOD, 1.0, -0.1, 0.1, phi_out, xy_in, 0, NX, 0, 10, IN_OUT_BC_FACTOR);
|
||||
set_boundary_laminar_flow(flow_speed, LAMINAR_FLOW_MODULATION, 0.02, LAMINAR_FLOW_YPERIOD, 1.0, -0.1, 0.1, phi_out, xy_in, 0, NX, NY-10, NY, IN_OUT_BC_FACTOR);
|
||||
set_boundary_laminar_flow(flow_speed, LAMINAR_FLOW_MODULATION, 0.02, LAMINAR_FLOW_YPERIOD, 1.0, -0.1, 0.1, phi_out, xy_in, 0, 2, 0, NY, IN_OUT_BC_FACTOR);
|
||||
break;
|
||||
}
|
||||
case (BCE_CHANNELS):
|
||||
{
|
||||
set_boundary_laminar_flow(flow_speed, LAMINAR_FLOW_MODULATION, 0.02, LAMINAR_FLOW_YPERIOD, 1.0, 0.0, 0.1, phi_out, xy_in, 0, imin+5, NY - y_channels, y_channels, IN_OUT_BC_FACTOR);
|
||||
set_boundary_laminar_flow(flow_speed, LAMINAR_FLOW_MODULATION, 0.02, LAMINAR_FLOW_YPERIOD, 1.0, 0.0, 0.1, phi_out, xy_in, imax-5, NX - 1, NY- y_channels, y_channels, IN_OUT_BC_FACTOR);
|
||||
// set_boundary_laminar_flow(flow_speed, LAMINAR_FLOW_MODULATION, 0.02, LAMINAR_FLOW_YPERIOD, 1.0, 0.0, 0.1, phi_out, xy_in, imin-5, imin+10, NY - y_channels, y_channels);
|
||||
// set_boundary_laminar_flow(flow_speed, LAMINAR_FLOW_MODULATION, 0.02, LAMINAR_FLOW_YPERIOD, 1.0, 0.0, 0.1, phi_out, xy_in, imax-10, imax+5, NY- y_channels, y_channels);
|
||||
break;
|
||||
}
|
||||
case (BCE_MIDDLE_STRIP):
|
||||
{
|
||||
set_boundary_laminar_flow(flow_speed, LAMINAR_FLOW_MODULATION, 0.02, LAMINAR_FLOW_YPERIOD, 1.0, 0.0, 0.1, phi_out, xy_in, 0, NX, NY/2 - 10, NY/2 + 10, IN_OUT_BC_FACTOR);
|
||||
set_boundary_laminar_flow(flow_speed, LAMINAR_FLOW_MODULATION, 0.02, LAMINAR_FLOW_YPERIOD, 1.0, 0.0, 0.1, phi_out, xy_in, 0, 2, 0, NY, IN_OUT_BC_FACTOR);
|
||||
set_boundary_laminar_flow(flow_speed, LAMINAR_FLOW_MODULATION, 0.02, LAMINAR_FLOW_YPERIOD, 1.0, 0.0, 0.1, phi_out, xy_in, NX-2, NX, 0, NY, IN_OUT_BC_FACTOR);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
set_in_out_flow_bc(phi_out, xy_in, flow_speed);
|
||||
|
||||
if (TEST_GRADIENT) {
|
||||
// if (TEST_GRADIENT) {
|
||||
// test = 0.0;
|
||||
// for (i=0; i<NX*NY; i++){
|
||||
// test += delta_phi[0][i] + phi_out[1][i]*dx*dx;
|
||||
// }
|
||||
// printf("Delta psi + omega = %.5lg\n", test/((double)NX*NY));
|
||||
}
|
||||
// }
|
||||
|
||||
if (FLOOR) for (i=0; i<NX; i++){
|
||||
for (j=0; j<NY; j++){
|
||||
|
@ -992,8 +941,6 @@ void evolve_wave_half(double *phi_in[NFIELDS], double *phi_out[NFIELDS], short i
|
|||
else if (RDE_EQUATION == E_EULER_COMP)
|
||||
{
|
||||
free(nabla_rho);
|
||||
// free(nabla_u);
|
||||
// free(nabla_v);
|
||||
}
|
||||
|
||||
if (COMPUTE_PRESSURE)
|
||||
|
@ -1096,10 +1043,10 @@ void print_level(int level)
|
|||
|
||||
|
||||
|
||||
void print_parameters(t_rde rde[NX*NY], short int xy_in[NX*NY], double time, short int left, double viscosity, double noise)
|
||||
void print_parameters(double *phi[NFIELDS], t_rde rde[NX*NY], short int xy_in[NX*NY], double time, short int left, double viscosity, double noise)
|
||||
{
|
||||
char message[100];
|
||||
double density, hue, rgb[3], logratio, x, y, pos[2], probas[2];
|
||||
char message[100], message2[100];
|
||||
double density, hue, rgb[3], logratio, x, y, pos[2], probas[2], speed1, speed2;
|
||||
static double xbox, xtext, boxwidth, boxheight;
|
||||
static int first = 1;
|
||||
|
||||
|
@ -1172,11 +1119,25 @@ void print_parameters(t_rde rde[NX*NY], short int xy_in[NX*NY], double time, sho
|
|||
else if (PRINT_RPSLZB) sprintf(message, "b = %.3f", rpslzb);
|
||||
else if (PRINT_NOISE) sprintf(message, "noise %.3f", noise);
|
||||
else if (PRINT_FLOW_SPEED) sprintf(message, "Speed %.3f", flow_speed);
|
||||
else if (PRINT_AVERAGE_SPEED)
|
||||
{
|
||||
compute_average_speeds(phi, rde, &speed1, &speed2);
|
||||
sprintf(message, "Average vx %.3f", speed2);
|
||||
sprintf(message2, "Average vx %.3f", speed1);
|
||||
}
|
||||
if (PLOT_3D) write_text(xtext, y, message);
|
||||
else
|
||||
{
|
||||
xy_to_pos(xtext, y, pos);
|
||||
write_text(pos[0], pos[1], message);
|
||||
if (PRINT_AVERAGE_SPEED)
|
||||
{
|
||||
y = YMIN + 0.1;
|
||||
erase_area_hsl(xbox, y + 0.02, boxwidth, boxheight, 0.0, 0.9, 0.0);
|
||||
glColor3f(1.0, 1.0, 1.0);
|
||||
xy_to_pos(xtext, y, pos);
|
||||
write_text(pos[0], pos[1], message2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1278,7 +1239,7 @@ void animation()
|
|||
{
|
||||
double time = 0.0, scale, dx, var, jangle, cosj, sinj, sqrintstep,
|
||||
intstep0, viscosity_printed, fade_value, noise = NOISE_INTENSITY;
|
||||
double *phi[NFIELDS], *phi_tmp[NFIELDS], *potential_field, *vector_potential_field, *tracers, *gfield, *bc_field;
|
||||
double *phi[NFIELDS], *phi_tmp[NFIELDS], *potential_field, *vector_potential_field, *tracers, *gfield, *bc_field, *bc_field2;
|
||||
short int *xy_in;
|
||||
int i, j, k, s, nvid, field;
|
||||
static int counter = 0;
|
||||
|
@ -1316,12 +1277,13 @@ void animation()
|
|||
if (ADAPT_STATE_TO_BC)
|
||||
{
|
||||
bc_field = (double *)malloc(NX*NY*sizeof(double));
|
||||
initialize_bcfield(bc_field, polyrect);
|
||||
bc_field2 = (double *)malloc(NX*NY*sizeof(double));
|
||||
initialize_bcfield(bc_field, bc_field2, polyrect);
|
||||
}
|
||||
if (ADD_FORCE_FIELD)
|
||||
{
|
||||
gfield = (double *)malloc(2*NX*NY*sizeof(double));
|
||||
initialize_gfield(gfield, bc_field);
|
||||
initialize_gfield(gfield, bc_field, bc_field2);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1349,13 +1311,23 @@ void animation()
|
|||
// init_fermion_state(-0.5, 0.5, 2.0, 0.0, 0.1, phi, xy_in);
|
||||
// init_boson_state(-0.5, 0.5, 2.0, 0.0, 0.1, phi, xy_in);
|
||||
|
||||
// init_vortex_state(0.1, 0.4, 0.0, 0.3, -0.1, phi, xy_in);
|
||||
// add_vortex_state(0.1, -0.4, 0.0, 0.3, 0.1, phi, xy_in);
|
||||
// init_vortex_state(0.1, 0.4, 0.1, 0.3, -0.1, phi, xy_in);
|
||||
// add_vortex_state(0.15, -0.4, -0.1, 0.4, 0.1, phi, xy_in);
|
||||
|
||||
// init_shear_flow(1.0, 0.02, 0.15, 1, 1, phi, xy_in);
|
||||
// init_laminar_flow(flow_speed_schedule(0), LAMINAR_FLOW_MODULATION, LAMINAR_FLOW_YPERIOD, 0.0, phi, xy_in);
|
||||
// init_laminar_flow(IN_OUT_FLOW_AMP, LAMINAR_FLOW_MODULATION, 0.02, 0.1, 1.0, 0.0, 0.1, phi, xy_in);
|
||||
init_laminar_flow(flow_speed_schedule(0), LAMINAR_FLOW_MODULATION, 0.02, 0.1, 1.0, 0.0, 0.1, phi, xy_in);
|
||||
init_laminar_flow(0.05, LAMINAR_FLOW_MODULATION, 0.015, 0.1, 1.0, 0.0, 0.1, phi, xy_in);
|
||||
// add_vortex_state(0.2, -0.4, -0.1, 0.3, -2.0, phi, xy_in);
|
||||
// add_vortex_state(0.2, -1.0, -0.1, 0.3, -0.5, phi, xy_in);
|
||||
|
||||
// init_vortex_state(0.1, 1.0, 0.1, 0.3, -0.4, phi, xy_in);
|
||||
// add_vortex_state(0.15, -1.0, -0.1, 0.4, 0.5, phi, xy_in);
|
||||
|
||||
add_vortex_state(0.2, 0.75, 0.1, 0.3, -0.5, phi, xy_in);
|
||||
add_vortex_state(-0.35, -0.75, -0.1, 0.4, 0.5, phi, xy_in);
|
||||
add_vortex_state(0.1, -0.3, 0.7, 0.1, -0.5, phi, xy_in);
|
||||
|
||||
// init_pressure_gradient_flow(flow_speed_schedule(0), 1.0 + PRESSURE_GRADIENT, 1.0 - PRESSURE_GRADIENT, phi, xy_in, bc_field);
|
||||
|
||||
// init_shear_flow(-1.0, 0.1, 0.2, 1, 1, 0.2, phi, xy_in);
|
||||
// init_shear_flow(1.0, 0.02, 0.15, 1, 1, 0.0, phi, xy_in);
|
||||
|
@ -1386,7 +1358,7 @@ void animation()
|
|||
printf("Drawing wave\n");
|
||||
draw_wave_rde(0, phi, xy_in, rde, potential_field, ZPLOT, CPLOT, COLOR_PALETTE, 0, 1.0, 1);
|
||||
// draw_billiard();
|
||||
if (PRINT_PARAMETERS) print_parameters(rde, xy_in, time, 0, VISCOSITY, noise);
|
||||
if (PRINT_PARAMETERS) print_parameters(phi, rde, xy_in, time, PRINT_LEFT, VISCOSITY, noise);
|
||||
if (DRAW_COLOR_SCHEME) draw_color_bar_palette(CPLOT, COLORBAR_RANGE, COLOR_PALETTE, 0, 1.0);
|
||||
|
||||
|
||||
|
@ -1487,7 +1459,7 @@ void animation()
|
|||
time += nvid*intstep;
|
||||
|
||||
// draw_billiard();
|
||||
if (PRINT_PARAMETERS) print_parameters(rde, xy_in, time, 0, viscosity_printed, noise);
|
||||
if (PRINT_PARAMETERS) print_parameters(phi, rde, xy_in, time, PRINT_LEFT, viscosity_printed, noise);
|
||||
if (DRAW_COLOR_SCHEME) draw_color_bar_palette(CPLOT, COLORBAR_RANGE, COLOR_PALETTE, 0, 1.0);
|
||||
|
||||
// print_level(MDEPTH);
|
||||
|
@ -1513,7 +1485,7 @@ void animation()
|
|||
draw_wave_rde(1, phi, xy_in, rde, potential_field, ZPLOT_B, CPLOT_B, COLOR_PALETTE_B, 0, 1.0, REFRESH_B);
|
||||
if (ADD_TRACERS) draw_tracers(phi, tracers, i, 0, 1.0);
|
||||
// draw_billiard();
|
||||
if (PRINT_PARAMETERS) print_parameters(rde, xy_in, time, 0, viscosity_printed, noise);
|
||||
if (PRINT_PARAMETERS) print_parameters(phi, rde, xy_in, time, PRINT_LEFT, viscosity_printed, noise);
|
||||
if (DRAW_COLOR_SCHEME) draw_color_bar_palette(CPLOT_B, COLORBAR_RANGE_B, COLOR_PALETTE_B, 0, 1.0);
|
||||
glutSwapBuffers();
|
||||
// if (NO_EXTRA_BUFFER_SWAP) glutSwapBuffers();
|
||||
|
@ -1545,7 +1517,7 @@ void animation()
|
|||
draw_wave_rde(0, phi, xy_in, rde, potential_field, ZPLOT, CPLOT, COLOR_PALETTE, 0, 1.0, 1);
|
||||
if (ADD_TRACERS) draw_tracers(phi, tracers, NSTEPS, 0, 1.0);
|
||||
// draw_billiard();
|
||||
if (PRINT_PARAMETERS) print_parameters(rde, xy_in, time, 0, viscosity_printed, noise);
|
||||
if (PRINT_PARAMETERS) print_parameters(phi, rde, xy_in, time, PRINT_LEFT, viscosity_printed, noise);
|
||||
if (DRAW_COLOR_SCHEME) draw_color_bar_palette(CPLOT, COLORBAR_RANGE, COLOR_PALETTE, 0, 1.0);
|
||||
// if (!NO_EXTRA_BUFFER_SWAP) glutSwapBuffers();
|
||||
glutSwapBuffers();
|
||||
|
@ -1557,14 +1529,14 @@ void animation()
|
|||
draw_wave_rde(0, phi, xy_in, rde, potential_field, ZPLOT, CPLOT, COLOR_PALETTE, 1, fade_value, 0);
|
||||
if (ADD_TRACERS) draw_tracers(phi, tracers, NSTEPS, 1, fade_value);
|
||||
// draw_billiard();
|
||||
if (PRINT_PARAMETERS) print_parameters(rde, xy_in, time, 0, viscosity_printed, noise);
|
||||
if (PRINT_PARAMETERS) print_parameters(phi, rde, xy_in, time, PRINT_LEFT, viscosity_printed, noise);
|
||||
if (DRAW_COLOR_SCHEME) draw_color_bar_palette(CPLOT, COLORBAR_RANGE, COLOR_PALETTE, 1, fade_value);
|
||||
if (!NO_EXTRA_BUFFER_SWAP) glutSwapBuffers();
|
||||
save_frame_counter(NSTEPS + i + 1);
|
||||
}
|
||||
draw_wave_rde(1, phi, xy_in, rde, potential_field, ZPLOT_B, CPLOT_B, COLOR_PALETTE_B, 0, 1.0, REFRESH_B);
|
||||
if (ADD_TRACERS) draw_tracers(phi, tracers, NSTEPS, 0, 1.0);
|
||||
if (PRINT_PARAMETERS) print_parameters(rde, xy_in, time, 0, viscosity_printed, noise);
|
||||
if (PRINT_PARAMETERS) print_parameters(phi, rde, xy_in, time, PRINT_LEFT, viscosity_printed, noise);
|
||||
if (DRAW_COLOR_SCHEME) draw_color_bar_palette(CPLOT_B, COLORBAR_RANGE_B, COLOR_PALETTE_B, 0, 1.0);
|
||||
glutSwapBuffers();
|
||||
|
||||
|
@ -1574,7 +1546,7 @@ void animation()
|
|||
fade_value = 1.0 - (double)i/(double)END_FRAMES;
|
||||
draw_wave_rde(1, phi, xy_in, rde, potential_field, ZPLOT_B, CPLOT_B, COLOR_PALETTE_B, 1, fade_value, 0);
|
||||
if (ADD_TRACERS) draw_tracers(phi, tracers, NSTEPS, 1, fade_value);
|
||||
if (PRINT_PARAMETERS) print_parameters(rde, xy_in, time, 0, viscosity_printed, noise);
|
||||
if (PRINT_PARAMETERS) print_parameters(phi, rde, xy_in, time, PRINT_LEFT, viscosity_printed, noise);
|
||||
if (DRAW_COLOR_SCHEME) draw_color_bar_palette(CPLOT_B, COLORBAR_RANGE_B, COLOR_PALETTE_B, 1, fade_value);
|
||||
glutSwapBuffers();
|
||||
save_frame_counter(NSTEPS + MID_FRAMES + 1 + counter + i);
|
||||
|
@ -1611,7 +1583,11 @@ void animation()
|
|||
}
|
||||
if (ADD_TRACERS) free(tracers);
|
||||
if (ADD_FORCE_FIELD) free(gfield);
|
||||
if (ADAPT_STATE_TO_BC) free(bc_field);
|
||||
if (ADAPT_STATE_TO_BC)
|
||||
{
|
||||
free(bc_field);
|
||||
free(bc_field2);
|
||||
}
|
||||
|
||||
printf("Time %.5lg\n", time);
|
||||
|
||||
|
|
|
@ -459,12 +459,14 @@ int wrap_particle(t_particle* particle, double *px, double *py)
|
|||
x1 += BCXMAX - BCXMIN;
|
||||
y1 = -y1;
|
||||
*py *= -1.0;
|
||||
particle->angle = DPI - particle->angle;
|
||||
move++;
|
||||
}
|
||||
else if (x > BCXMAX)
|
||||
{
|
||||
x1 += BCXMIN - BCXMAX;
|
||||
y1 = -y1;
|
||||
particle->angle = DPI - particle->angle;
|
||||
*py *= -1.0;
|
||||
move++;
|
||||
}
|
||||
|
|
228
sub_lj.c
228
sub_lj.c
|
@ -511,6 +511,24 @@ void set_type_color(int type, double lum, double rgb[3])
|
|||
glColor3f(lum*rgb[0], lum*rgb[1], lum*rgb[2]);
|
||||
}
|
||||
|
||||
double distance_to_segment(double x, double y, double x1, double y1, double x2, double y2)
|
||||
/* distance of (x,y) to segment from (x1,y1) to (x2,y2) */
|
||||
{
|
||||
double xp, yp, angle, length, ca, sa;
|
||||
|
||||
angle = argument(x2 - x1, y2 - y1);
|
||||
length = module2(x2 - x1, y2 - y1);
|
||||
|
||||
ca = cos(angle);
|
||||
sa = sin(angle);
|
||||
|
||||
xp = ca*(x - x1) + sa*(y - y1);
|
||||
yp = -sa*(x - x1) + ca*(y - y1);
|
||||
|
||||
if ((xp >= 0)&&(xp <= length)) return(vabs(yp));
|
||||
else if (xp < 0) return(module2(xp, yp));
|
||||
else return(module2(xp-length, yp));
|
||||
}
|
||||
|
||||
|
||||
void init_particle_config(t_particle particles[NMAXCIRCLES])
|
||||
|
@ -1207,7 +1225,7 @@ void add_rocket_to_segments(t_segment segment[NMAXSEGMENTS], double x0, double y
|
|||
case (RCK_RECT_HAT): /* rectangular chamber with a hat */
|
||||
{
|
||||
a = 0.5*LAMBDA;
|
||||
b = 0.49*PI*LAMBDA;
|
||||
b = (0.49*PI-0.25)*LAMBDA;
|
||||
add_rotated_angle_to_segments(x0+nozx, nozy, x0+a, nozy, 0.02, segment, 0);
|
||||
add_rotated_angle_to_segments(x0+a, nozy, x0+a, nozy+b, 0.02, segment, 0);
|
||||
add_rotated_angle_to_segments(x0+a, nozy+b, x0, nozy+b+a, 0.02, segment, 0);
|
||||
|
@ -1262,7 +1280,7 @@ int init_maze_segments(t_segment segment[NMAXSEGMENTS])
|
|||
{
|
||||
t_maze* maze;
|
||||
int i, j, n;
|
||||
double x1, y1, x2, y2, dx, dy, padding = 0.02, width = 0.01;
|
||||
double x1, y1, x2, y2, dx, dy, padding = 0.02, width = MAZE_WIDTH;
|
||||
|
||||
maze = (t_maze *)malloc(NXMAZE*NYMAZE*sizeof(t_maze));
|
||||
|
||||
|
@ -2085,7 +2103,8 @@ int in_rocket(double x, double y, int rocket_shape)
|
|||
{
|
||||
l = 0.7*LAMBDA;
|
||||
y1 = y - YMIN - 1.7*LAMBDA;
|
||||
return ((x*x + y1*y1)/(l*l) + MU*MU < 0.925);
|
||||
return ((x*x + y1*y1)/(l*l) + MU*MU < 0.875);
|
||||
// return ((x*x + y1*y1)/(l*l) + MU*MU < 0.925*LAMBDA*LAMBDA);
|
||||
}
|
||||
case (RCK_RECT) :
|
||||
{
|
||||
|
@ -2096,20 +2115,23 @@ int in_rocket(double x, double y, int rocket_shape)
|
|||
}
|
||||
case (RCK_RECT_HAT) :
|
||||
{
|
||||
// printf("(%.2lg,%.2lg) in rocket?\n", x, y);
|
||||
a = 0.5*LAMBDA;
|
||||
b = 0.49*PI*LAMBDA;
|
||||
b = (0.49*PI-0.25)*LAMBDA;
|
||||
y1 = y - YMIN - LAMBDA;
|
||||
if (vabs(x) > 0.95*a) return(0);
|
||||
if (y1 < 0.05) return(0);
|
||||
if (y1 < b - 0.05) return(1);
|
||||
return(y1 < a + b - 0.05 - vabs(x));
|
||||
// return(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int in_segment_region(double x, double y)
|
||||
int in_segment_region(double x, double y, t_segment segment[NMAXSEGMENTS])
|
||||
/* returns 1 if (x,y) is inside region delimited by obstacle segments */
|
||||
{
|
||||
int i;
|
||||
double angle, dx, height, width, theta, lx, ly, x1, y1, x2, y2, padding;
|
||||
|
||||
if (x >= BCXMAX) return(0);
|
||||
|
@ -2231,8 +2253,8 @@ int in_segment_region(double x, double y)
|
|||
else if ((y1 > YMIN + 3.5*LAMBDA)&&(y2 > YMIN + 3.5*LAMBDA)) return(0);
|
||||
else
|
||||
{
|
||||
if (in_rocket(x - xsegments[0], y1, ROCKET_SHAPE)) return(1);
|
||||
if (in_rocket(x - xsegments[1], y2, ROCKET_SHAPE_B)) return(1);
|
||||
if (in_rocket(x - xsegments[0], y1, ROCKET_SHAPE_B)) return(1);
|
||||
if (in_rocket(x - xsegments[1], y2, ROCKET_SHAPE)) return(1);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
@ -2263,6 +2285,14 @@ int in_segment_region(double x, double y)
|
|||
if ((y > 1.0 - LAMBDA + padding)&&(vabs(x) < LAMBDA - padding)) return(1);
|
||||
return(0);
|
||||
}
|
||||
case (S_MAZE):
|
||||
{
|
||||
for (i=0; i<nsegments; i++)
|
||||
{
|
||||
if (distance_to_segment(x, y, segment[i].x1, segment[i].y1, segment[i].x2, segment[i].y2) < 5.0*MAZE_WIDTH) return(0);
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
default: return(1);
|
||||
}
|
||||
}
|
||||
|
@ -2409,6 +2439,45 @@ double lennard_jones_force(double r, t_particle particle)
|
|||
}
|
||||
}
|
||||
|
||||
double harmonic_force(double r, t_particle particle)
|
||||
{
|
||||
int i;
|
||||
double rmin = 0.01, rplus, ratio = 1.0;
|
||||
|
||||
if (r > REPEL_RADIUS*particle.radius) return(0.0);
|
||||
else
|
||||
{
|
||||
// if (r > rmin) rplus = r;
|
||||
// else rplus = rmin;
|
||||
// ratio = rplus/particle.eq_dist*particle.radius;
|
||||
|
||||
ratio = r/particle.eq_dist*particle.radius;
|
||||
|
||||
if (ratio < 1.0) return(ratio - 1.0);
|
||||
else return(0.0);
|
||||
}
|
||||
}
|
||||
|
||||
double coulomb_force(double r, t_particle particle)
|
||||
{
|
||||
int i;
|
||||
double rmin = 0.01, rplus, ratio = 1.0;
|
||||
|
||||
if (r > REPEL_RADIUS*particle.radius) return(0.0);
|
||||
else
|
||||
{
|
||||
// if (r > rmin) rplus = r;
|
||||
// else rplus = rmin;
|
||||
// ratio = rplus/particle.eq_dist*particle.radius;
|
||||
|
||||
ratio = r/particle.eq_dist*particle.radius;
|
||||
|
||||
return(-1.0/(ratio*ratio + rmin*rmin));
|
||||
// if (ratio < 1.0) return(ratio - 1.0);
|
||||
// else return(0.0);
|
||||
}
|
||||
}
|
||||
|
||||
void aniso_lj_force(double r, double ca, double sa, double ca_rel, double sa_rel, double force[2], t_particle particle)
|
||||
{
|
||||
int i;
|
||||
|
@ -2844,7 +2913,7 @@ int compute_particle_interaction(int i, int k, double force[2], double *torque,
|
|||
{
|
||||
double x1, y1, x2, y2, r, f, angle, aniso, fx, fy, ff[2], dist_scaled, spin_f, ck, sk, ck_rel, sk_rel;
|
||||
static double dxhalf = 0.5*(BCXMAX - BCXMIN), dyhalf = 0.5*(BCYMAX - BCYMIN);
|
||||
int wwrapx, wwrapy;
|
||||
int wwrapx, wwrapy, twrapx, twrapy;
|
||||
|
||||
if (BOUNDARY_COND == BC_GENUS_TWO)
|
||||
{
|
||||
|
@ -2859,6 +2928,8 @@ int compute_particle_interaction(int i, int k, double force[2], double *torque,
|
|||
|
||||
wwrapx = ((BOUNDARY_COND == BC_KLEIN)||(BOUNDARY_COND == BC_BOY)||(BOUNDARY_COND == BC_GENUS_TWO))&&(vabs(x2 - x1) > dxhalf);
|
||||
wwrapy = ((BOUNDARY_COND == BC_BOY)||(BOUNDARY_COND == BC_GENUS_TWO))&&(vabs(y2 - y1) > dyhalf);
|
||||
twrapx = ((BOUNDARY_COND == BC_KLEIN)||(BOUNDARY_COND == BC_BOY))&&(vabs(x2 - x1) > dxhalf);
|
||||
twrapy = (BOUNDARY_COND == BC_BOY)&&(vabs(y2 - y1) > dyhalf);
|
||||
|
||||
switch (particle[k].interaction) {
|
||||
case (I_COULOMB):
|
||||
|
@ -2917,6 +2988,28 @@ int compute_particle_interaction(int i, int k, double force[2], double *torque,
|
|||
force[1] = f*sa;
|
||||
break;
|
||||
}
|
||||
case (I_VICSEK):
|
||||
{
|
||||
force[0] = 0.0;
|
||||
force[1] = 0.0;
|
||||
break;
|
||||
}
|
||||
case (I_VICSEK_REPULSIVE):
|
||||
{
|
||||
f = krepel*coulomb_force(distance, particle[k]);
|
||||
// f = krepel*harmonic_force(distance, particle[k]);
|
||||
// f = krepel*lennard_jones_force(distance, particle[k]);
|
||||
force[0] = f*ca;
|
||||
force[1] = f*sa;
|
||||
break;
|
||||
}
|
||||
case (I_VICSEK_SPEED):
|
||||
{
|
||||
f = cos(0.5*(particle[k].angle - particle[i].angle));
|
||||
force[0] = f*KSPRING_VICSEK*(particle[k].vx - particle[i].vx);
|
||||
force[1] = f*KSPRING_VICSEK*(particle[k].vy - particle[i].vy);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (ROTATION)
|
||||
|
@ -2939,10 +3032,31 @@ int compute_particle_interaction(int i, int k, double force[2], double *torque,
|
|||
// printf("force = (%.3lg, %.3lg)\n", ff[0], ff[1]);
|
||||
break;
|
||||
}
|
||||
case (I_VICSEK):
|
||||
{
|
||||
if (dist_scaled > 1.0) *torque = 0.0;
|
||||
else if (twrapx||twrapy) *torque = sin(-particle[k].angle - particle[i].angle);
|
||||
else *torque = sin(particle[k].angle - particle[i].angle);
|
||||
break;
|
||||
}
|
||||
case (I_VICSEK_REPULSIVE):
|
||||
{
|
||||
if (dist_scaled > 1.0) *torque = 0.0;
|
||||
else if (twrapx||twrapy) *torque = sin(-particle[k].angle - particle[i].angle);
|
||||
else *torque = sin(particle[k].angle - particle[i].angle);
|
||||
break;
|
||||
}
|
||||
case (I_VICSEK_SPEED):
|
||||
{
|
||||
if (dist_scaled > 1.0) *torque = 0.0;
|
||||
else if (twrapx||twrapy) *torque = sin(-particle[k].angle - particle[i].angle);
|
||||
else *torque = sin(particle[k].angle - particle[i].angle);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
spin_f = particle[i].spin_freq;
|
||||
if (wwrapx||wwrapy) *torque = sin(spin_f*(-particle[k].angle - particle[i].angle))/(1.0e-8 + dist_scaled*dist_scaled);
|
||||
if (twrapx||twrapy) *torque = sin(spin_f*(-particle[k].angle - particle[i].angle))/(1.0e-8 + dist_scaled*dist_scaled);
|
||||
else
|
||||
*torque = sin(spin_f*(particle[k].angle - particle[i].angle))/(1.0e-8 + dist_scaled*dist_scaled);
|
||||
}
|
||||
|
@ -3897,7 +4011,7 @@ void draw_one_particle(t_particle particle, double xc, double yc, double radius,
|
|||
/* specific shapes for chemical reactions */
|
||||
if (REACTION_DIFFUSION) cont = draw_special_particle(particle, xc1, yc1, radius, angle, nsides, rgb, 1);
|
||||
|
||||
if ((particle.interaction == I_LJ_QUADRUPOLE)||(particle.interaction == I_LJ_DIPOLE))
|
||||
if ((particle.interaction == I_LJ_QUADRUPOLE)||(particle.interaction == I_LJ_DIPOLE)||(particle.interaction == I_VICSEK)||(particle.interaction == I_VICSEK_REPULSIVE)||(particle.interaction == I_VICSEK_SPEED))
|
||||
draw_colored_rhombus(xc1, yc1, radius, angle + APOLY*PID, rgb);
|
||||
else if (cont) draw_colored_polygon(xc1, yc1, radius, nsides, angle + APOLY*PID, rgb);
|
||||
|
||||
|
@ -3927,7 +4041,7 @@ void draw_one_particle(t_particle particle, double xc, double yc, double radius,
|
|||
glColor3f(1.0, 1.0, 1.0);
|
||||
if (REACTION_DIFFUSION) cont = draw_special_particle(particle, xc1, yc1, radius, angle, nsides, rgb, 0);
|
||||
|
||||
if ((particle.interaction == I_LJ_QUADRUPOLE)||(particle.interaction == I_LJ_DIPOLE))
|
||||
if ((particle.interaction == I_LJ_QUADRUPOLE)||(particle.interaction == I_LJ_DIPOLE)||(particle.interaction == I_VICSEK)||(particle.interaction == I_VICSEK_REPULSIVE)||(particle.interaction == I_VICSEK_SPEED))
|
||||
draw_rhombus(xc1, yc1, radius, angle + APOLY*PID);
|
||||
else if (cont) draw_polygon(xc1, yc1, radius, nsides, angle + APOLY*PID);
|
||||
|
||||
|
@ -3946,14 +4060,28 @@ void draw_collisions(t_collision *collisions, int ncollisions)
|
|||
/* draw discs where collisions happen */
|
||||
{
|
||||
int i, j;
|
||||
double rgb[3], lum;
|
||||
double rgb[3], lum, x, y, x1, y1;
|
||||
|
||||
|
||||
|
||||
for (i=0; i<ncollisions; i++) if (collisions[i].time > 0)
|
||||
{
|
||||
lum = (double)collisions[i].time/(double)COLLISION_TIME;
|
||||
if (collisions[i].color == 0.0) for (j=0; j<3; j++) rgb[j] = lum;
|
||||
else hsl_to_rgb_palette(collisions[i].color, 0.9, lum, rgb, COLOR_PALETTE);
|
||||
draw_colored_polygon(collisions[i].x, collisions[i].y, 5.0*MU, NSEG, 0.0, rgb);
|
||||
x = collisions[i].x;
|
||||
y = collisions[i].y;
|
||||
|
||||
if (CENTER_VIEW_ON_OBSTACLE) x1 = x - xshift;
|
||||
else x1 = x;
|
||||
if (TRACK_SEGMENT_GROUPS)
|
||||
{
|
||||
x1 -= xtrack;
|
||||
y1 = y - ytrack;
|
||||
}
|
||||
else y1 = y;
|
||||
|
||||
draw_colored_polygon(x1, y1, 5.0*MU, NSEG, 0.0, rgb);
|
||||
collisions[i].time--;
|
||||
}
|
||||
|
||||
|
@ -4939,8 +5067,16 @@ void print_segment_group_speeds(t_group_segments *segment_group)
|
|||
av_vy *= inv_t_window;
|
||||
av_omega *= inv_t_window;
|
||||
|
||||
xbox = xleftbox + (xrightbox - xleftbox)*(group-1)/(ngroups-2);
|
||||
xtext = xlefttext + (xrighttext - xlefttext)*(group-1)/(ngroups-2);
|
||||
if (ngroups > 2)
|
||||
{
|
||||
xbox = xleftbox + (xrightbox - xleftbox)*(group-1)/(ngroups-2);
|
||||
xtext = xlefttext + (xrighttext - xlefttext)*(group-1)/(ngroups-2);
|
||||
}
|
||||
else
|
||||
{
|
||||
xbox = xrightbox - 0.2;
|
||||
xtext = xrighttext - 0.2;
|
||||
}
|
||||
|
||||
// printf("xbox = %.2f, xtext = %.2f, av_vy = %.2f\n", xbox, xtext, av_vy);
|
||||
|
||||
|
@ -5013,8 +5149,7 @@ double compute_boundary_force(int j, t_particle particle[NMAXCIRCLES], t_obstacl
|
|||
double xleft, double xright, double *pleft, double *pright, double pressure[N_PRESSURES], int wall)
|
||||
{
|
||||
int i, k;
|
||||
double xmin, xmax, ymin, ymax, padding, r, rp, r2, cphi, sphi, f, fperp = 0.0, x, y, xtube, distance, dx, dy,
|
||||
width, ybin, angle, x1, x2, h, ytop, norm, dleft, dplus, dminus, tmp_pleft = 0.0, tmp_pright = 0.0, proj;
|
||||
double xmin, xmax, ymin, ymax, padding, r, rp, r2, cphi, sphi, f, fperp = 0.0, x, y, xtube, distance, dx, dy, width, ybin, angle, x1, x2, h, ytop, norm, dleft, dplus, dminus, tmp_pleft = 0.0, tmp_pright = 0.0, proj, pscal, pvect, pvmin;
|
||||
|
||||
/* compute force from fixed circular obstacles */
|
||||
if (ADD_FIXED_OBSTACLES) for (i=0; i<nobstacles; i++)
|
||||
|
@ -5035,6 +5170,7 @@ double compute_boundary_force(int j, t_particle particle[NMAXCIRCLES], t_obstacl
|
|||
}
|
||||
}
|
||||
/* compute force from fixed linear obstacles */
|
||||
particle[j].close_to_boundary = 0;
|
||||
if (ADD_FIXED_SEGMENTS) for (i=0; i<nsegments; i++) if (segment[i].active)
|
||||
{
|
||||
x = particle[j].xc;
|
||||
|
@ -5042,13 +5178,19 @@ double compute_boundary_force(int j, t_particle particle[NMAXCIRCLES], t_obstacl
|
|||
proj = (segment[i].ny*(x - segment[i].x1) - segment[i].nx*(y - segment[i].y1))/segment[i].length;
|
||||
if ((proj > 0.0)&&(proj < 1.0))
|
||||
{
|
||||
// distance = segment[i].nx*x + segment[i].ny*y - segment[i].c;
|
||||
distance = segment[i].nx*x + segment[i].ny*y - segment[i].c;
|
||||
r = 1.5*particle[j].radius;
|
||||
if (vabs(distance) < r)
|
||||
{
|
||||
particle[j].close_to_boundary = 1;
|
||||
|
||||
f = KSPRING_OBSTACLE*(r - distance);
|
||||
particle[j].fx += f*segment[i].nx;
|
||||
particle[j].fy += f*segment[i].ny;
|
||||
|
||||
|
||||
|
||||
if ((MOVE_BOUNDARY)||(MOVE_SEGMENT_GROUPS))
|
||||
{
|
||||
segment[i].fx -= f*segment[i].nx;
|
||||
|
@ -5056,6 +5198,15 @@ double compute_boundary_force(int j, t_particle particle[NMAXCIRCLES], t_obstacl
|
|||
segment[i].torque -= (x - segment[i].xc)*f*segment[i].ny - (y - segment[i].yc)*f*segment[i].nx;
|
||||
}
|
||||
}
|
||||
if ((VICSEK_INT)&&(vabs(distance) < 1.5*r))
|
||||
{
|
||||
pvmin = 2.0;
|
||||
pvect = cos(particle[j].angle)*segment[i].ny - sin(particle[j].angle)*segment[i].nx;
|
||||
if ((pvect > 0.0)&&(pvect < pvmin)) pvect = pvmin;
|
||||
else if ((pvect < 0.0)&&(pvect > -pvmin)) pvect = -pvmin;
|
||||
// particle[j].torque += KTORQUE_BOUNDARY*pvect;
|
||||
particle[j].torque += KTORQUE_BOUNDARY*pvect*(1.5*r - vabs(distance));
|
||||
}
|
||||
}
|
||||
|
||||
/* compute force from concave corners */
|
||||
|
@ -5531,7 +5682,7 @@ void compute_particle_force(int j, double krepel, t_particle particle[NMAXCIRCLE
|
|||
|
||||
|
||||
int reorder_particles(t_particle particle[NMAXCIRCLES], double py[NMAXCIRCLES], double pangle[NMAXCIRCLES])
|
||||
/* keep only active particles */
|
||||
/* keep only active particles, beta */
|
||||
{
|
||||
int i, k, new = 0, nactive = 0;
|
||||
|
||||
|
@ -5580,7 +5731,8 @@ int reorder_particles(t_particle particle[NMAXCIRCLES], double py[NMAXCIRCLES],
|
|||
|
||||
|
||||
int initialize_configuration(t_particle particle[NMAXCIRCLES], t_hashgrid hashgrid[HASHX*HASHY],
|
||||
t_obstacle obstacle[NMAXOBSTACLES], double px[NMAXCIRCLES], double py[NMAXCIRCLES], double pangle[NMAXCIRCLES], int tracer_n[N_TRACER_PARTICLES])
|
||||
t_obstacle obstacle[NMAXOBSTACLES], double px[NMAXCIRCLES], double py[NMAXCIRCLES], double pangle[NMAXCIRCLES], int tracer_n[N_TRACER_PARTICLES],
|
||||
t_segment segment[NMAXSEGMENTS])
|
||||
/* initialize all particles, obstacles, and the hashgrid */
|
||||
{
|
||||
int i, j, k, n, nactive = 0;
|
||||
|
@ -5599,6 +5751,7 @@ int initialize_configuration(t_particle particle[NMAXCIRCLES], t_hashgrid hashgr
|
|||
particle[i].neighb = 0;
|
||||
particle[i].diff_neighb = 0;
|
||||
particle[i].thermostat = 1;
|
||||
particle[i].close_to_boundary = 0;
|
||||
|
||||
// particle[i].energy = 0.0;
|
||||
// y = particle[i].yc;
|
||||
|
@ -5671,6 +5824,7 @@ int initialize_configuration(t_particle particle[NMAXCIRCLES], t_hashgrid hashgr
|
|||
particle[i].eq_dist = EQUILIBRIUM_DIST;
|
||||
particle[i].spin_range = SPIN_RANGE;
|
||||
particle[i].spin_freq = SPIN_INTER_FREQUENCY;
|
||||
particle[i].close_to_boundary = 0;
|
||||
}
|
||||
|
||||
/* add particles at the bottom as seed */
|
||||
|
@ -5803,7 +5957,7 @@ int initialize_configuration(t_particle particle[NMAXCIRCLES], t_hashgrid hashgr
|
|||
|
||||
/* case of segment obstacles */
|
||||
if (ADD_FIXED_SEGMENTS) for (i=0; i< ncircles; i++)
|
||||
if (!in_segment_region(particle[i].xc, particle[i].yc))
|
||||
if (!in_segment_region(particle[i].xc, particle[i].yc, segment))
|
||||
particle[i].active = 0;
|
||||
|
||||
/* case of reaction-diffusion equation/chemical reactions */
|
||||
|
@ -5910,6 +6064,27 @@ int initialize_configuration(t_particle particle[NMAXCIRCLES], t_hashgrid hashgr
|
|||
}
|
||||
break;
|
||||
}
|
||||
case (IC_SIGNX):
|
||||
{
|
||||
if (particle[i].xc < 0.0) particle[i].type = 1;
|
||||
else
|
||||
{
|
||||
particle[i].type = 2;
|
||||
particle[i].radius = MU_B;
|
||||
particle[i].mass_inv = 1.0/PARTICLE_MASS_B;
|
||||
}
|
||||
break;
|
||||
}case (IC_TWOROCKETS):
|
||||
{
|
||||
if (vabs(particle[i].xc) < SEGMENTS_X0) particle[i].type = 1;
|
||||
else
|
||||
{
|
||||
particle[i].type = 2;
|
||||
particle[i].radius = MU_B;
|
||||
particle[i].mass_inv = 1.0/PARTICLE_MASS_B;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -6012,7 +6187,7 @@ int floor_momentum(double p[NMAXCIRCLES])
|
|||
return (floor);
|
||||
}
|
||||
|
||||
int partial_thermostat_coupling(t_particle particle[NMAXCIRCLES], double xmin)
|
||||
int partial_thermostat_coupling(t_particle particle[NMAXCIRCLES], double xmin, t_segment segment[NMAXSEGMENTS])
|
||||
/* only couple particles satisfying condition PARTIAL_THERMO_REGION to thermostat */
|
||||
{
|
||||
int condition, i, nthermo = 0;
|
||||
|
@ -6049,7 +6224,7 @@ int partial_thermostat_coupling(t_particle particle[NMAXCIRCLES], double xmin)
|
|||
}
|
||||
case (TH_INSEGMENT):
|
||||
{
|
||||
condition = (in_segment_region(particle[i].xc, particle[i].yc));
|
||||
condition = (in_segment_region(particle[i].xc, particle[i].yc, segment));
|
||||
// condition = (in_segment_region(particle[i].xc - xsegments[0], particle[i].yc - ysegments[0]));
|
||||
// // condition = (in_segment_region(particle[i].xc - xsegments[0], particle[i].yc - ysegments[0]));
|
||||
// if (TWO_OBSTACLES)
|
||||
|
@ -6776,7 +6951,7 @@ int chem_catalytic_convert(int i, int type2, int newtype, t_particle particle[NM
|
|||
int update_types(t_particle particle[NMAXCIRCLES], t_collision *collisions, int ncollisions, int *particle_numbers, int time, double *delta_e)
|
||||
/* update the types in case of reaction-diffusion equation */
|
||||
{
|
||||
int i, j, k, n, n3, n4, type, oldncollisions;
|
||||
int i, j, k, n, n3, n4, type, oldncollisions, delta_n;
|
||||
double distance, rnd, p1, p2;
|
||||
static double inv_masses[RD_TYPES+1], radii[RD_TYPES+1];
|
||||
static int first = 1;
|
||||
|
@ -6819,7 +6994,10 @@ int update_types(t_particle particle[NMAXCIRCLES], t_collision *collisions, int
|
|||
for (i=0; i<ncircles; i++) if ((particle[i].active)&&(particle[i].type == 1))
|
||||
ncollisions = chem_merge(i, 2, 3, particle, collisions, ncollisions, inv_masses, radii);
|
||||
printf("%i collisions\n", ncollisions);
|
||||
if (EXOTHERMIC) *delta_e = (double)(ncollisions - oldncollisions)*DELTA_EKIN;
|
||||
delta_n = ncollisions - oldncollisions;
|
||||
printf("delta_n = %i\n", delta_n);
|
||||
// if (delta_n > 1) delta_n = 1;
|
||||
if (EXOTHERMIC) *delta_e = (double)(delta_n)*DELTA_EKIN;
|
||||
return(ncollisions);
|
||||
}
|
||||
case (CHEM_A2BC):
|
||||
|
@ -7223,6 +7401,8 @@ void draw_trajectory_plot(t_group_data *group_speeds, int i)
|
|||
|
||||
glLineWidth(2);
|
||||
|
||||
printf("ngroups = %i\n", ngroups);
|
||||
|
||||
/* plot trajectories */
|
||||
for (group=1; group<ngroups; group++)
|
||||
{
|
||||
|
|
292
sub_rde.c
292
sub_rde.c
|
@ -441,8 +441,8 @@ void add_vortex_state(double amp, double x, double y, double scale, double densi
|
|||
// phi[0][i*NY+j] = 1.0;
|
||||
/* nonconstant density to make things more interesting */
|
||||
phi[0][i*NY+j] += 0.5 + density_mod*sign*module/amp;
|
||||
phi[1][i*NY+j] += sign*module*(xy[1]-y)/vabs(scale);
|
||||
phi[2][i*NY+j] -= sign*module*(xy[0]-x)/vabs(scale);
|
||||
phi[1][i*NY+j] -= sign*module*(xy[1]-y)/vabs(scale);
|
||||
phi[2][i*NY+j] += sign*module*(xy[0]-x)/vabs(scale);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -511,7 +511,7 @@ void init_shear_flow(double amp, double delta, double rho, int nx, int ny, doubl
|
|||
}
|
||||
|
||||
void set_boundary_laminar_flow(double amp, double xmodulation, double ymodulation, double xperiod, double yperiod, double yshift, double density_mod, double *phi[NFIELDS], short int xy_in[NX*NY], int imin, int imax, int jmin, int jmax, double factor)
|
||||
/* enfoce laminar flow in x direction on top and bottom boundaries */
|
||||
/* enforce laminar flow in x direction in specified region */
|
||||
/* phi[0] is stream function, phi[1] is vorticity */
|
||||
/* amp is global amplitude */
|
||||
{
|
||||
|
@ -631,6 +631,74 @@ void init_laminar_flow(double amp, double xmodulation, double ymodulation, doubl
|
|||
}
|
||||
}
|
||||
|
||||
void set_boundary_pressure_gradient_flow(double vx, double pmax, double pmin, double *phi[NFIELDS], short int xy_in[NX*NY], int imin, int imax, int jmin, int jmax, double factor)
|
||||
/* enforce laminar flow in x direction in specified region */
|
||||
/* pressure/density interpolates between maxamp and minamp */
|
||||
{
|
||||
int i, j;
|
||||
double xy[2], a, comp_factor, cutoff;
|
||||
|
||||
comp_factor = 1.0 - factor;
|
||||
|
||||
a = (pmax - pmin)/(XMAX - XMIN);
|
||||
|
||||
for (i=imin; i<imax; i++)
|
||||
for (j=jmin; j<jmax; j++)
|
||||
{
|
||||
ij_to_xy(i, j, xy);
|
||||
xy_in[i*NY+j] = xy_in_billiard(xy[0],xy[1]);
|
||||
|
||||
if (xy[0] < 0.0) cutoff = tanh(20.0*(xy[0] - XMIN));
|
||||
else cutoff = tanh(10.0*(XMAX - xy[0]));
|
||||
|
||||
if (xy_in[i*NY+j])
|
||||
{
|
||||
phi[0][i*NY+j] *= 1.0 - cutoff*factor;
|
||||
phi[1][i*NY+j] *= 1.0 - cutoff*factor;
|
||||
phi[2][i*NY+j] *= 1.0 - cutoff*factor;
|
||||
phi[0][i*NY+j] += cutoff*factor*(pmax - a*(xy[0] - XMIN));
|
||||
phi[1][i*NY+j] += cutoff*factor*vx;
|
||||
}
|
||||
else
|
||||
{
|
||||
phi[0][i*NY+j] = 1.0;
|
||||
phi[1][i*NY+j] = 0.0;
|
||||
phi[2][i*NY+j] = 0.0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void init_pressure_gradient_flow(double vx, double pmax, double pmin, double *phi[NFIELDS], short int xy_in[NX*NY], double bc_field[NX*NY])
|
||||
/* initialise field with a laminar flow in x direction */
|
||||
/* pressure/density interpolates between maxamp and minamp */
|
||||
{
|
||||
int i, j;
|
||||
double xy[2], a;
|
||||
|
||||
a = (pmax - pmin)/(XMAX - XMIN);
|
||||
|
||||
for (i=0; i<NX; i++)
|
||||
for (j=0; j<NY; j++)
|
||||
{
|
||||
ij_to_xy(i, j, xy);
|
||||
xy_in[i*NY+j] = xy_in_billiard(xy[0],xy[1]);
|
||||
|
||||
if (xy_in[i*NY+j])
|
||||
{
|
||||
// phi[0][i*NY+j] = pmax - a*(xy[0] - XMIN);
|
||||
phi[0][i*NY+j] = (pmax - a*(xy[0] - XMIN))*bc_field[i*NY+j] + pmax*(1.0 - bc_field[i*NY+j]);
|
||||
phi[1][i*NY+j] = vx;
|
||||
phi[2][i*NY+j] = 0.0;
|
||||
}
|
||||
else
|
||||
{
|
||||
phi[0][i*NY+j] = 1.0;
|
||||
phi[1][i*NY+j] = 0.0;
|
||||
phi[2][i*NY+j] = 0.0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
double distance_to_segment(double x, double y, double x1, double y1, double x2, double y2)
|
||||
/* distance of (x,y) to segment from (x1,y1) to (x2,y2) */
|
||||
{
|
||||
|
@ -705,10 +773,10 @@ double tesla_distance(double x, double y, double a, double l, double theta)
|
|||
return(dmin);
|
||||
}
|
||||
|
||||
void initialize_bcfield(double bc_field[NX*NY], t_rectangle polyrect[NMAXPOLY])
|
||||
void initialize_bcfield(double bc_field[NX*NY], double bc_field2[NX*NY], t_rectangle polyrect[NMAXPOLY])
|
||||
/* apply smooth modulation to adapt initial state to obstacles */
|
||||
{
|
||||
int i, j, nsides, s;
|
||||
int i, j, nsides, s, i1, j1, shiftx;
|
||||
double xy[2], x, y, r, f, a, l, theta, x1, x2, y1, y2, distance, d, d0, length, height, mid, fmin, ct, st;
|
||||
|
||||
switch (OBSTACLE_GEOMETRY) {
|
||||
|
@ -817,6 +885,63 @@ void initialize_bcfield(double bc_field[NX*NY], t_rectangle polyrect[NMAXPOLY])
|
|||
|
||||
f = 0.5*(1.0 + tanh(BC_STIFFNESS*r));
|
||||
bc_field[i*NY+j] = f;
|
||||
bc_field2[i*NY+j] = f;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case (D_TESLA_FOUR):
|
||||
{
|
||||
a = 0.16;
|
||||
l = 1.7;
|
||||
shiftx = NX/50;
|
||||
theta = PID/5.0;
|
||||
ct = cos(theta);
|
||||
st = sin(theta);
|
||||
|
||||
for (i=0; i<NX; i++)
|
||||
for (j=0; j<NY; j++)
|
||||
{
|
||||
i1 = i - shiftx;
|
||||
i1 *= 2;
|
||||
|
||||
j1 = j;
|
||||
if (j1 > NY/2) j1 -= NY/2;
|
||||
j1 *= 2;
|
||||
|
||||
ij_to_xy(i1, j1, xy);
|
||||
xy[1] -= 1.5*a;
|
||||
if (j > NY/2)
|
||||
{
|
||||
xy[0] *= -1.0;
|
||||
xy[0] += 2.0*l*ct;
|
||||
}
|
||||
|
||||
d0 = tesla_distance(xy[0] +l*ct, xy[1], a, l, theta);
|
||||
|
||||
d = tesla_distance(xy[0], -l*st-xy[1]-0.5*a, a, l, theta);
|
||||
if (d < d0) d0 = d;
|
||||
|
||||
d = tesla_distance(xy[0] - l*ct -0.2*a, xy[1], a, l, theta);
|
||||
if (d < d0) d0 = d;
|
||||
|
||||
d = tesla_distance(xy[0] - 2.0*l*ct -0.2*a, -l*st-xy[1]-0.5*a, a, l, theta);
|
||||
if (d < d0) d0 = d;
|
||||
|
||||
if ((xy[0] < -l*ct)||(xy[0] > 3*l*ct))
|
||||
{
|
||||
d = vabs(xy[1]);
|
||||
if (d < d0) d0 = d;
|
||||
}
|
||||
|
||||
r = a - d0;
|
||||
|
||||
f = 0.5*(1.0 + tanh(BC_STIFFNESS*r));
|
||||
bc_field[i*NY+j] = f;
|
||||
|
||||
r = 0.9*a - d0;
|
||||
|
||||
f = 0.5*(1.0 + tanh(0.5*BC_STIFFNESS*r));
|
||||
bc_field2[i*NY+j] = f;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -886,6 +1011,9 @@ void initialize_bcfield(double bc_field[NX*NY], t_rectangle polyrect[NMAXPOLY])
|
|||
if (distance < d0) f = fmin*distance/d0;
|
||||
else f = 0.5*(1.0 + tanh(BC_STIFFNESS*(distance - 1.25*MAZE_WIDTH)));
|
||||
bc_field[i*NY+j] = f;
|
||||
|
||||
if (distance >= d0) f = 0.5*(1.0 + tanh(BC_STIFFNESS*(distance - 1.5*MAZE_WIDTH)));
|
||||
bc_field2[i*NY+j] = f;
|
||||
// printf("distance = %.5lg, bcfield = %.5lg\n", distance, f);
|
||||
}
|
||||
}
|
||||
|
@ -897,12 +1025,15 @@ void adapt_state_to_bc(double *phi[NFIELDS], double bc_field[NX*NY], short int x
|
|||
/* apply smooth modulation to adapt initial state to obstacles */
|
||||
{
|
||||
int i, j, field;
|
||||
double xy[2], r, f;
|
||||
double xy[2], r, f;
|
||||
// double ratio = 1.0e-1;
|
||||
|
||||
#pragma omp parallel for private(i,j)
|
||||
for (i=0; i<NX; i++)
|
||||
for (j=0; j<NY; j++) if (xy_in[i*NY+j])
|
||||
{
|
||||
// phi[0][i*NY+j] = 1.3 - bc_field[i*NY+j] + bc_field[i*NY+j]*phi[0][i*NY+j];
|
||||
// phi[0][i*NY+j] = (1.0 - bc_field[i*NY+j]) + bc_field[i*NY+j]*phi[0][i*NY+j];
|
||||
for (field = 1; field < NFIELDS; field++)
|
||||
phi[field][i*NY+j] *= bc_field[i*NY+j];
|
||||
}
|
||||
|
@ -1537,7 +1668,7 @@ void compute_direction(double *phi[NFIELDS], t_rde rde[NX*NY])
|
|||
}
|
||||
|
||||
void compute_vorticity(t_rde rde[NX*NY])
|
||||
/* compute the log of a field */
|
||||
/* compute the vorticity of a field */
|
||||
{
|
||||
int i, j;
|
||||
double value;
|
||||
|
@ -2837,3 +2968,150 @@ void draw_tracers(double *phi[NFIELDS], double tracers[2*N_TRACERS*NSTEPS], int
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
void compute_average_speeds(double *phi[NFIELDS], t_rde rde[NX*NY], double *speed1, double *speed2)
|
||||
{
|
||||
int i, j;
|
||||
double sp1, sp2;
|
||||
static double ratio;
|
||||
static int first = 1;
|
||||
|
||||
if (first)
|
||||
{
|
||||
ratio = 100.0/(double)(NX*NY);
|
||||
first = 0;
|
||||
}
|
||||
|
||||
sp1 = 0.0;
|
||||
sp2 = 0.0;
|
||||
|
||||
// #pragma omp parallel for private(i,j)
|
||||
for (i=0; i<NX; i++)
|
||||
{
|
||||
for (j=0; j<NY/2; j++) sp1 += phi[1][i*NY+j];
|
||||
for (j=NY/2; j<NY; j++) sp2 += phi[1][i*NY+j];
|
||||
// for (j=0; j<NY/2; j++) *speed1 += rde[i*NY+j].field_norm;
|
||||
// for (j=NY/2; j<NY; j++) *speed2 += rde[i*NY+j].field_norm;
|
||||
}
|
||||
|
||||
*speed1 = sp1*ratio;
|
||||
*speed2 = sp2*ratio;
|
||||
}
|
||||
|
||||
void set_bc_flow(double flow_speed, double yshift, double *phi_out[NFIELDS], short int xy_in[NX*NY], int imin, int imax, int jmin, int jmax)
|
||||
/* set fields in given rectangular region */
|
||||
{
|
||||
switch (BC_FLOW_TYPE)
|
||||
{
|
||||
case (BCF_LAMINAR):
|
||||
{
|
||||
set_boundary_laminar_flow(flow_speed, LAMINAR_FLOW_MODULATION, 0.02, yshift, 1.0, 0.0, 0.1, phi_out, xy_in, imin, imax, jmin, jmax, IN_OUT_BC_FACTOR);
|
||||
break;
|
||||
}
|
||||
case (BCF_PRESSURE):
|
||||
{
|
||||
set_boundary_pressure_gradient_flow(IN_OUT_FLOW_AMP, 1.0 + PRESSURE_GRADIENT, 1.0 - PRESSURE_GRADIENT, phi_out, xy_in, imin, imax, jmin, jmax, IN_OUT_BC_FACTOR);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void set_in_out_flow_bc(double *phi_out[NFIELDS], short int xy_in[NX*NY], double flow_speed)
|
||||
/* set fields for particular boundary conditions (flowing in and out for Euler equations) */
|
||||
{
|
||||
int ropening, w;
|
||||
double x, y, dy, xy[2], padding, a;
|
||||
static int y_channels, y_channels1, imin, imax, first = 1;
|
||||
|
||||
if (first) /* for D_MAZE_CHANNELS boundary conditions in Euler equation */
|
||||
{
|
||||
ropening = (NYMAZE+1)/2;
|
||||
padding = 0.02;
|
||||
dy = (YMAX - YMIN - 2.0*padding)/(double)(NYMAZE);
|
||||
y = YMIN + 0.02 + dy*((double)ropening);
|
||||
x = YMAX - padding + MAZE_XSHIFT;
|
||||
xy_to_pos(x, y, xy);
|
||||
y_channels = xy[1] - 5;
|
||||
if ((B_DOMAIN == D_MAZE_CHANNELS)||(OBSTACLE_GEOMETRY == D_MAZE_CHANNELS))
|
||||
{
|
||||
imax = xy[0] + 2;
|
||||
x = YMIN + padding + MAZE_XSHIFT;
|
||||
xy_to_pos(x, y, xy);
|
||||
imin = xy[0] - 2;
|
||||
if (imin < 5) imin = 5;
|
||||
}
|
||||
else if (OBSTACLE_GEOMETRY == D_TESLA)
|
||||
{
|
||||
imin = 0;
|
||||
imax = NX;
|
||||
y = -a;
|
||||
xy_to_pos(XMIN, y, xy);
|
||||
y_channels = xy[1];
|
||||
printf("y_channels = %i\n", y_channels);
|
||||
}
|
||||
else if (OBSTACLE_GEOMETRY == D_TESLA_FOUR)
|
||||
{
|
||||
imin = 0;
|
||||
imax = NX;
|
||||
a = 0.16;
|
||||
// y = YMIN + 0.25*(YMAX-YMIN) - 0.5*a;
|
||||
y = YMIN + 0.25*(YMAX-YMIN) + 0.75*a;
|
||||
xy_to_pos(XMIN, y, xy);
|
||||
y_channels = xy[1];
|
||||
y_channels1 = NY/2 + y_channels;
|
||||
|
||||
printf("y_channels = %i, interval [%i, %i]\n", y_channels, NY/2 - y_channels, y_channels);
|
||||
printf("y_channels1 = %i, interval [%i, %i]\n", y_channels1, NY - y_channels1, y_channels1);
|
||||
}
|
||||
else
|
||||
{
|
||||
imin = 0;
|
||||
imax = NX;
|
||||
}
|
||||
first = 0;
|
||||
}
|
||||
|
||||
switch (IN_OUT_FLOW_BC) {
|
||||
case (BCE_LEFT):
|
||||
{
|
||||
set_bc_flow(flow_speed, 0.1, phi_out, xy_in, 0, 5, 0, NY);
|
||||
break;
|
||||
}
|
||||
case (BCE_TOPBOTTOM):
|
||||
{
|
||||
set_bc_flow(flow_speed, 0.1, phi_out, xy_in, 0, NX, 0, 10);
|
||||
set_bc_flow(flow_speed, 0.1, phi_out, xy_in, 0, NX, NY-10, NY);
|
||||
break;
|
||||
}
|
||||
case (BCE_TOPBOTTOMLEFT):
|
||||
{
|
||||
set_bc_flow(flow_speed, 0.1, phi_out, xy_in, 0, NX, 0, 10);
|
||||
set_bc_flow(flow_speed, 0.1, phi_out, xy_in, 0, NX, NY-10, NY);
|
||||
set_bc_flow(flow_speed, 0.1, phi_out, xy_in, 0, 2, 0, NY);
|
||||
break;
|
||||
}
|
||||
case (BCE_CHANNELS):
|
||||
{
|
||||
set_bc_flow(flow_speed, 0.1, phi_out, xy_in, 0, imin+5, NY - y_channels, y_channels);
|
||||
set_bc_flow(flow_speed, 0.1, phi_out, xy_in, imax-5, NX - 1, NY- y_channels, y_channels);
|
||||
break;
|
||||
}
|
||||
case (BCE_FOUR_CHANNELS):
|
||||
{
|
||||
w = 3;
|
||||
set_bc_flow(flow_speed, 0.0, phi_out, xy_in, 0, imin+5, y_channels-w, y_channels+w);
|
||||
set_bc_flow(flow_speed, 0.0, phi_out, xy_in, imax-5, NX - 1, y_channels-w, y_channels+w);
|
||||
set_bc_flow(flow_speed, 0.0, phi_out, xy_in, 0, imin+5, y_channels1-w, y_channels1+w);
|
||||
set_bc_flow(flow_speed, 0.0, phi_out, xy_in, imax-5, NX - 1, y_channels1-w, y_channels1+w);
|
||||
break;
|
||||
}
|
||||
case (BCE_MIDDLE_STRIP):
|
||||
{
|
||||
set_bc_flow(flow_speed, 0.1, phi_out, xy_in, 0, NX, NY/2 - 10, NY/2 + 10);
|
||||
set_bc_flow(flow_speed, 0.1, phi_out, xy_in, 0, 2, 0, NY);
|
||||
set_bc_flow(flow_speed, 0.1, phi_out, xy_in, NX-2, NX, 0, NY);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
21
sub_wave.c
21
sub_wave.c
|
@ -5077,6 +5077,27 @@ void print_speed(double speed, int fade, double fade_value)
|
|||
write_text(pos[0], pos[1], message);
|
||||
}
|
||||
|
||||
void print_frequency(double phase_shift, int fade, double fade_value)
|
||||
{
|
||||
char message[100];
|
||||
double y = YMAX - 0.1, pos[2];
|
||||
static double xleftbox, xlefttext;
|
||||
static int first = 1;
|
||||
|
||||
if (first)
|
||||
{
|
||||
xleftbox = XMIN + 0.3;
|
||||
xlefttext = xleftbox - 0.45;
|
||||
first = 0;
|
||||
}
|
||||
|
||||
erase_area_hsl(xleftbox, y + 0.025, 0.22, 0.05, 0.0, 0.9, 0.0);
|
||||
if (fade) glColor3f(fade_value, fade_value, fade_value);
|
||||
else glColor3f(1.0, 1.0, 1.0);
|
||||
xy_to_pos(xlefttext + 0.28, y, pos);
|
||||
sprintf(message, "Frequency %.2f", 25.0*phase_shift);
|
||||
write_text(pos[0], pos[1], message);
|
||||
}
|
||||
|
||||
void init_laplacian_coords(t_laplacian laplace[NX*NY], double phi[NX*NY])
|
||||
/* compute coordinates of neighbours to compute Laplacian */
|
||||
|
|
|
@ -1374,6 +1374,44 @@ void init_speed_dissipation(short int xy_in[NX*NY], double tc[NX*NY], double tcc
|
|||
}
|
||||
break;
|
||||
}
|
||||
case (IOR_MANDELBROT_MOD):
|
||||
{
|
||||
#pragma omp parallel for private(i,j)
|
||||
for (i=0; i<NX; i++){
|
||||
for (j=0; j<NY; j++){
|
||||
ij_to_xy(i, j, xy);
|
||||
x = xy[0];
|
||||
y = xy[1];
|
||||
u = 0.0;
|
||||
v = 0.0;
|
||||
k = 0;
|
||||
while ((k<MANDELLEVEL)&&(u*u+v*v < 1000.0*MANDELLIMIT))
|
||||
{
|
||||
u1 = u*u - v*v + x;
|
||||
v = 2.0*u*v + y;
|
||||
u = u1;
|
||||
k++;
|
||||
}
|
||||
if (k >= MANDELLEVEL)
|
||||
{
|
||||
tc[i*NY+j] = COURANT;
|
||||
tcc[i*NY+j] = courant2;
|
||||
tgamma[i*NY+j] = GAMMA;
|
||||
}
|
||||
else
|
||||
{
|
||||
// speed = 5.0 - 4.0*pow((double)k/(double)MANDELLEVEL, 0.1);
|
||||
speed = 1.0 + 4.0*log(1.0 - 0.1*log((double)k/(double)MANDELLEVEL));
|
||||
if (speed < 1.0e-10) speed = 1.0e-10;
|
||||
else if (speed > 10.0) speed = 10.0;
|
||||
tcc[i*NY+j] = courantb2*speed;
|
||||
tc[i*NY+j] = COURANTB*sqrt(speed);
|
||||
tgamma[i*NY+j] = GAMMAB;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case (IOR_EARTH):
|
||||
{
|
||||
for (i=0; i<NX; i++){
|
||||
|
@ -1432,6 +1470,39 @@ void init_speed_dissipation(short int xy_in[NX*NY], double tc[NX*NY], double tcc
|
|||
}
|
||||
break;
|
||||
}
|
||||
case (IOR_PERIODIC_WELLS):
|
||||
{
|
||||
dx = (XMAX - XMIN)/(double)NGRIDX;
|
||||
dy = (YMAX - YMIN)/(double)NGRIDY;
|
||||
sigma = 0.2*dx*dx;
|
||||
for (i=0; i<NGRIDX; i++)
|
||||
for (j=0; j<NGRIDY; j++)
|
||||
{
|
||||
|
||||
n = j*NGRIDX + i;
|
||||
xc[n] = XMIN + dx*((double)i + 0.5);
|
||||
yc[n] = YMIN + dy*((double)j + 0.5);
|
||||
if (j%2 == 1) yc[n] += 0.5*dx;
|
||||
}
|
||||
|
||||
for (i=0; i<NX; i++){
|
||||
for (j=0; j<NY; j++){
|
||||
ij_to_xy(i, j, xy);
|
||||
x = xy[0];
|
||||
y = xy[1];
|
||||
sum = 0.0;
|
||||
for (n = 0; n<NGRIDX*NGRIDY; n++)
|
||||
{
|
||||
r2 = (x - xc[n])*(x - xc[n]) + (y - yc[n])*(y - yc[n]);
|
||||
sum += exp(-r2/(sigma));
|
||||
}
|
||||
tc[i*NY+j] = COURANT*sum + COURANTB*(1.0-sum);
|
||||
tcc[i*NY+j] = COURANT*sum + COURANTB*(1.0-sum);
|
||||
tgamma[i*NY+j] = GAMMA;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case (IOR_RANDOM_WELLS):
|
||||
{
|
||||
dx = (XMAX - XMIN)/(double)NGRIDX;
|
||||
|
@ -1884,7 +1955,7 @@ void draw_color_scheme_palette_3d(double x1, double y1, double x2, double y2, in
|
|||
int j, k, ij_botleft[2], ij_topright[2], imin, imax, jmin, jmax;
|
||||
double y, dy, dy_e, dy_phase, rgb[3], value, lum, amp;
|
||||
|
||||
printf("Drawing color bar\n");
|
||||
// printf("Drawing color bar\n");
|
||||
|
||||
xy_to_ij(x1, y1, ij_botleft);
|
||||
xy_to_ij(x2, y2, ij_topright);
|
||||
|
@ -1988,7 +2059,7 @@ void draw_color_scheme_palette_3d(double x1, double y1, double x2, double y2, in
|
|||
}
|
||||
case (P_3D_FLUX_DIRECTION):
|
||||
{
|
||||
value = 2.0*dy_phase*(double)(j - jmin);
|
||||
value = dy_phase*(double)(j - jmin);
|
||||
color_scheme_palette(C_ONEDIM_LINEAR, palette, value, 1.0, 1, rgb);
|
||||
break;
|
||||
}
|
||||
|
|
175
wave_3d.c
175
wave_3d.c
|
@ -50,37 +50,45 @@
|
|||
|
||||
/* General geometrical parameters */
|
||||
|
||||
// #define WINWIDTH 1920 /* window width */
|
||||
// #define WINHEIGHT 1150 /* window height */
|
||||
// // // // #define NX 2500 /* number of grid points on x axis */
|
||||
// // // // #define NY 1250 /* number of grid points on y axis */
|
||||
#define WINWIDTH 1920 /* window width */
|
||||
#define WINHEIGHT 1150 /* window height */
|
||||
// // // #define NX 2500 /* number of grid points on x axis */
|
||||
// // // #define NY 1250 /* number of grid points on y axis */
|
||||
// #define NX 2840 /* number of grid points on x axis */
|
||||
// #define NY 2300 /* number of grid points on y axis */
|
||||
//
|
||||
// #define NX 2500 /* number of grid points on x axis */
|
||||
// #define NY 1250 /* number of grid points on y axis */
|
||||
#define NX 1700 /* number of grid points on x axis */
|
||||
#define NY 1700 /* number of grid points on y axis */
|
||||
|
||||
// #define XMIN -2.0
|
||||
// #define XMAX 2.0 /* x interval */
|
||||
// #define YMIN -1.041666667
|
||||
// #define YMAX 1.041666667 /* y interval for 9/16 aspect ratio */
|
||||
#define XMIN -1.5
|
||||
#define XMAX 1.5 /* x interval */
|
||||
#define YMIN -1.5
|
||||
#define YMAX 1.5 /* y interval for 9/16 aspect ratio */
|
||||
|
||||
#define HIGHRES 0 /* set to 1 if resolution of grid is double that of displayed image */
|
||||
|
||||
#define WINWIDTH 1280 /* window width */
|
||||
#define WINHEIGHT 720 /* window height */
|
||||
|
||||
// #define NX 1280 /* number of grid points on x axis */
|
||||
// #define NX 720 /* number of grid points on x axis */
|
||||
// #define NY 720 /* number of grid points on y axis */
|
||||
#define NX 2560 /* number of grid points on x axis */
|
||||
// #define NX 1440 /* number of grid points on x axis */
|
||||
#define NY 1440 /* number of grid points on y axis */
|
||||
|
||||
// #define NX 360 /* number of grid points on x axis */
|
||||
// #define NY 360 /* number of grid points on y axis */
|
||||
|
||||
#define XMIN -2.0
|
||||
#define XMAX 2.0 /* x interval */
|
||||
#define YMIN -1.125
|
||||
#define YMAX 1.125 /* y interval for 9/16 aspect ratio */
|
||||
// #define WINWIDTH 1280 /* window width */
|
||||
// #define WINHEIGHT 720 /* window height */
|
||||
//
|
||||
// // #define NX 1280 /* number of grid points on x axis */
|
||||
// // #define NX 720 /* number of grid points on x axis */
|
||||
// // #define NY 720 /* number of grid points on y axis */
|
||||
// #define NX 2560 /* number of grid points on x axis */
|
||||
// // #define NX 1440 /* number of grid points on x axis */
|
||||
// #define NY 1440 /* number of grid points on y axis */
|
||||
//
|
||||
// // #define NX 360 /* number of grid points on x axis */
|
||||
// // #define NY 360 /* number of grid points on y axis */
|
||||
//
|
||||
// #define XMIN -2.0
|
||||
// #define XMAX 2.0 /* x interval */
|
||||
// #define YMIN -1.125
|
||||
// #define YMAX 1.125 /* y interval for 9/16 aspect ratio */
|
||||
|
||||
#define JULIA_SCALE 0.8 /* scaling for Julia sets */
|
||||
|
||||
|
@ -94,8 +102,8 @@
|
|||
#define B_DOMAIN_B 20 /* second domain shape, for comparisons */
|
||||
#define CIRCLE_PATTERN_B 0 /* second pattern of circles or polygons */
|
||||
|
||||
#define VARIABLE_IOR 1 /* set to 1 for a variable index of refraction */
|
||||
#define IOR 5 /* choice of index of refraction, see list in global_pdes.c */
|
||||
#define VARIABLE_IOR 0 /* set to 1 for a variable index of refraction */
|
||||
#define IOR 101 /* choice of index of refraction, see list in global_pdes.c */
|
||||
#define IOR_TOTAL_TURNS 1.0 /* total angle of rotation for IOR_PERIODIC_WELLS_ROTATING */
|
||||
#define MANDEL_IOR_SCALE -0.05 /* parameter controlling dependence of IoR on Mandelbrot escape speed */
|
||||
|
||||
|
@ -109,10 +117,10 @@
|
|||
#define APOLY 0.0 /* angle by which to turn polygon, in units of Pi/2 */
|
||||
#define MDEPTH 7 /* depth of computation of Menger gasket */
|
||||
#define MRATIO 3 /* ratio defining Menger gasket */
|
||||
#define MANDELLEVEL 1000 /* iteration level for Mandelbrot set */
|
||||
#define MANDELLIMIT 10.0 /* limit value for approximation of Mandelbrot set */
|
||||
#define MANDELLEVEL 2000 /* iteration level for Mandelbrot set */
|
||||
#define MANDELLIMIT 20.0 /* limit value for approximation of Mandelbrot set */
|
||||
#define FOCI 1 /* set to 1 to draw focal points of ellipse */
|
||||
#define NGRIDX 14 /* number of grid point for grid of disks */
|
||||
#define NGRIDX 8 /* number of grid point for grid of disks */
|
||||
#define NGRIDY 8 /* number of grid point for grid of disks */
|
||||
|
||||
#define X_SHOOTER -0.2
|
||||
|
@ -138,14 +146,13 @@
|
|||
#define OSCILLATION_SCHEDULE 3 /* oscillation schedule, see list in global_pdes.c */
|
||||
|
||||
#define OMEGA 0.001 /* frequency of periodic excitation */
|
||||
// #define OMEGA 0.0005 /* frequency of periodic excitation */
|
||||
#define AMPLITUDE 0.8 /* amplitude of periodic excitation */
|
||||
#define ACHIRP 0.2 /* acceleration coefficient in chirp */
|
||||
#define DAMPING 0.0 /* damping of periodic excitation */
|
||||
#define COURANT 0.05 /* Courant number */
|
||||
#define COURANTB 0.0 /* Courant number in medium B */
|
||||
#define COURANT 0.06 /* Courant number */
|
||||
#define COURANTB 0.06 /* Courant number in medium B */
|
||||
#define GAMMA 0.0 /* damping factor in wave equation */
|
||||
#define GAMMAB 0.0 /* damping factor in wave equation */
|
||||
#define GAMMAB 1.0e-6 /* damping factor in wave equation */
|
||||
#define GAMMA_SIDES 1.0e-4 /* damping factor on boundary */
|
||||
#define GAMMA_TOPBOT 1.0e-7 /* damping factor on boundary */
|
||||
#define KAPPA 0.0 /* "elasticity" term enforcing oscillations */
|
||||
|
@ -157,7 +164,7 @@
|
|||
/* For similar wave forms, COURANT^2*GAMMA should be kept constant */
|
||||
|
||||
#define ADD_OSCILLATING_SOURCE 1 /* set to 1 to add an oscillating wave source */
|
||||
#define OSCILLATING_SOURCE_PERIOD 75 /* period of oscillating source */
|
||||
#define OSCILLATING_SOURCE_PERIOD 2 /* period of oscillating source */
|
||||
#define ALTERNATE_OSCILLATING_SOURCE 1 /* set to 1 to alternate sign of oscillating source */
|
||||
|
||||
#define ADD_WAVE_PACKET_SOURCES 0 /* set to 1 to add several sources emitting wave packets */
|
||||
|
@ -174,10 +181,11 @@
|
|||
|
||||
/* Parameters for length and speed of simulation */
|
||||
|
||||
#define NSTEPS 2200 /* number of frames of movie */
|
||||
// #define NSTEPS 500 /* number of frames of movie */
|
||||
#define NVID 4 /* number of iterations between images displayed on screen */
|
||||
#define NSEG 1000 /* number of segments of boundary */
|
||||
#define NSTEPS 2450 /* number of frames of movie */
|
||||
// #define NSTEPS 500 /* number of frames of movie */
|
||||
#define NVID 5 /* number of iterations between images displayed on screen */
|
||||
// #define NVID 10 /* number of iterations between images displayed on screen */
|
||||
#define NSEG 1000 /* number of segments of boundary */
|
||||
#define INITIAL_TIME 0 /* time after which to start saving frames */
|
||||
#define BOUNDARY_WIDTH 2 /* width of billiard boundary */
|
||||
#define PRINT_SPEED 0 /* set to 1 to print speed of moving source */
|
||||
|
@ -193,22 +201,18 @@
|
|||
|
||||
/* Parameters of initial condition */
|
||||
|
||||
#define INITIAL_AMP 0.25 /* amplitude of initial condition */
|
||||
#define INITIAL_VARIANCE 0.00015 /* variance of initial condition */
|
||||
#define INITIAL_WAVELENGTH 0.0075 /* wavelength of initial condition */
|
||||
|
||||
// #define INITIAL_AMP 0.02 /* amplitude of initial condition */
|
||||
#define INITIAL_AMP 0.007 /* amplitude of initial condition */
|
||||
#define INITIAL_VARIANCE 0.0003 /* variance of initial condition */
|
||||
#define INITIAL_WAVELENGTH 0.015 /* wavelength of initial condition */
|
||||
|
||||
/* Plot type, see list in global_pdes.c */
|
||||
|
||||
#define ZPLOT 103 /* wave height */
|
||||
#define CPLOT 103 /* color scheme */
|
||||
// #define ZPLOT 104 /* wave height */
|
||||
// #define CPLOT 104 /* color scheme */
|
||||
|
||||
#define ZPLOT_B 108
|
||||
#define CPLOT_B 108 /* plot type for second movie */
|
||||
|
||||
|
||||
#define ZPLOT_B 112
|
||||
#define CPLOT_B 113 /* plot type for second movie */
|
||||
|
||||
#define CHANGE_LUMINOSITY 1 /* set to 1 to let luminosity depend on energy flux intensity */
|
||||
#define FLUX_WINDOW 30 /* size of averaging window of flux intensity */
|
||||
|
@ -222,8 +226,8 @@
|
|||
#define FADE_IN_OBSTACLE 1 /* set to 1 to fade color inside obstacles */
|
||||
#define DRAW_OUTSIDE_GRAY 0 /* experimental, draw outside of billiard in gray */
|
||||
|
||||
#define PLOT_SCALE_ENERGY 0.1 /* vertical scaling in energy plot */
|
||||
#define PLOT_SCALE_LOG_ENERGY 0.2 /* vertical scaling in log energy plot */
|
||||
#define PLOT_SCALE_ENERGY 0.4 /* vertical scaling in energy plot */
|
||||
#define PLOT_SCALE_LOG_ENERGY 0.5 /* vertical scaling in log energy plot */
|
||||
|
||||
/* 3D representation */
|
||||
|
||||
|
@ -232,23 +236,23 @@
|
|||
#define REP_AXO_3D 0 /* linear projection (axonometry) */
|
||||
#define REP_PROJ_3D 1 /* projection on plane orthogonal to observer line of sight */
|
||||
|
||||
#define ROTATE_VIEW 1 /* set to 1 to rotate position of observer */
|
||||
#define ROTATE_VIEW 0 /* set to 1 to rotate position of observer */
|
||||
#define ROTATE_ANGLE 360.0 /* total angle of rotation during simulation */
|
||||
// #define ROTATE_ANGLE 45.0 /* total angle of rotation during simulation */
|
||||
|
||||
/* Color schemes */
|
||||
|
||||
#define COLOR_PALETTE 11 /* Color palette, see list in global_pdes.c */
|
||||
#define COLOR_PALETTE_B 14 /* Color palette, see list in global_pdes.c */
|
||||
#define COLOR_PALETTE 15 /* Color palette, see list in global_pdes.c */
|
||||
#define COLOR_PALETTE_B 10 /* Color palette, see list in global_pdes.c */
|
||||
|
||||
#define BLACK 1 /* background */
|
||||
|
||||
#define COLOR_SCHEME 3 /* choice of color scheme, see list in global_pdes.c */
|
||||
|
||||
#define SCALE 0 /* set to 1 to adjust color scheme to variance of field */
|
||||
#define SLOPE 1.0 /* sensitivity of color on wave amplitude */
|
||||
#define VSCALE_AMPLITUDE 3.0 /* additional scaling factor for color scheme P_3D_AMPLITUDE */
|
||||
#define VSCALE_ENERGY 25.0 /* additional scaling factor for color scheme P_3D_ENERGY */
|
||||
#define SLOPE 1.0 /* sensitivity of color on wave amplitude */
|
||||
#define VSCALE_AMPLITUDE 2.0 /* additional scaling factor for color scheme P_3D_AMPLITUDE */
|
||||
#define VSCALE_ENERGY 15.0 /* additional scaling factor for color scheme P_3D_ENERGY */
|
||||
#define PHASE_FACTOR 20.0 /* factor in computation of phase in color scheme P_3D_PHASE */
|
||||
#define PHASE_SHIFT 0.0 /* shift of phase in color scheme P_3D_PHASE */
|
||||
#define ATTENUATION 0.0 /* exponential attenuation coefficient of contrast with time */
|
||||
|
@ -257,8 +261,8 @@
|
|||
#define LOG_SHIFT 0.5 /* shift of colors on log scale */
|
||||
#define LOG_ENERGY_FLOOR -10.0 /* floor value for log of (total) energy */
|
||||
#define LOG_MEAN_ENERGY_SHIFT 1.0 /* additional shift for log of mean energy */
|
||||
#define FLUX_SCALE 20.0 /* scaling factor for energy flux representation */
|
||||
#define FLUX_CSCALE 500.0 /* scaling factor for color in energy flux representation */
|
||||
#define FLUX_SCALE 4000.0 /* scaling factor for energy flux representation */
|
||||
#define FLUX_CSCALE 2.0 /* scaling factor for color in energy flux representation */
|
||||
#define RESCALE_COLOR_IN_CENTER 0 /* set to 1 to decrease color intentiy in the center (for wave escaping ring) */
|
||||
|
||||
#define COLORHUE 260 /* initial hue of water color for scheme C_LUM */
|
||||
|
@ -282,10 +286,10 @@
|
|||
|
||||
#define SAVE_TIME_SERIES 0 /* set to 1 to save wave time series at a point */
|
||||
|
||||
#define ADD_POTENTIAL 0 /* set to 1 to add potential to z coordinate */
|
||||
#define ADD_POTENTIAL 1 /* set to 1 to add potential to z coordinate */
|
||||
// #define POT_MAZE 7
|
||||
#define POTENTIAL 10
|
||||
#define POT_FACT 30.0
|
||||
#define POT_FACT 400.0
|
||||
/* end of constants only used by sub_wave and sub_maze */
|
||||
|
||||
|
||||
|
@ -299,14 +303,14 @@ double u_3d[2] = {0.75, -0.45}; /* projections of basis vectors for REP_AXO_
|
|||
double v_3d[2] = {-0.75, -0.45};
|
||||
double w_3d[2] = {0.0, 0.015};
|
||||
double light[3] = {0.816496581, -0.40824829, 0.40824829}; /* vector of "light" direction for P_3D_ANGLE color scheme */
|
||||
double observer[3] = {8.0, 8.0, 7.0}; /* location of observer for REP_PROJ_3D representation */
|
||||
double observer[3] = {8.0, 8.0, 8.0}; /* location of observer for REP_PROJ_3D representation */
|
||||
int reset_view = 0; /* switch to reset 3D view parameters (for option ROTATE_VIEW) */
|
||||
|
||||
#define Z_SCALING_FACTOR 0.15 /* overall scaling factor of z axis for REP_PROJ_3D representation */
|
||||
#define Z_SCALING_FACTOR 0.5 /* overall scaling factor of z axis for REP_PROJ_3D representation */
|
||||
#define XY_SCALING_FACTOR 1.8 /* overall scaling factor for on-screen (x,y) coordinates after projection */
|
||||
#define ZMAX_FACTOR 1.0 /* max value of z coordinate for REP_PROJ_3D representation */
|
||||
#define XSHIFT_3D -0.1 /* overall x shift for REP_PROJ_3D representation */
|
||||
#define YSHIFT_3D 0.1 /* overall y shift for REP_PROJ_3D representation */
|
||||
#define YSHIFT_3D 0.2 /* overall y shift for REP_PROJ_3D representation */
|
||||
|
||||
|
||||
#include "global_pdes.c" /* constants and global variables */
|
||||
|
@ -945,15 +949,16 @@ void viewpoint_schedule(int i)
|
|||
|
||||
void animation()
|
||||
{
|
||||
double time, scale, ratio, startleft[2], startright[2], sign = 1.0, r2, xy[2], fade_value, yshift, speed = 0.0, a, b, c, angle, lambda1, y, x1, sign1;
|
||||
double time, scale, ratio, startleft[2], startright[2], sign = 1.0, r2, xy[2], fade_value, yshift, speed = 0.0, a, b, c, angle = 0.0, lambda1, y, x1, sign1, omega, phase_shift;
|
||||
double *phi, *psi, *tmp, *color_scale, *tc, *tcc, *tgamma;
|
||||
// double *total_energy;
|
||||
short int *xy_in;
|
||||
int i, j, s, sample_left[2], sample_right[2], period = 0, fade, source_counter = 0, k, p, q;
|
||||
static int counter = 0;
|
||||
static int counter = 0, first_source = 1;
|
||||
long int wave_value;
|
||||
t_wave *wave;
|
||||
t_laplacian *laplace, *laplace1, *laplace2;
|
||||
t_wave_source wave_source[25];
|
||||
|
||||
if (SAVE_TIME_SERIES)
|
||||
{
|
||||
|
@ -1063,6 +1068,7 @@ void animation()
|
|||
// add_circular_wave_mod(1.0, lambda1*cos(((double)j+0.5)*angle), lambda1*sin(((double)j+0.5)*angle), phi, psi, xy_in);
|
||||
|
||||
init_wave_flat_mod(phi, psi, xy_in);
|
||||
// init_circular_wave_mod(0.0, 0.0, phi, psi, xy_in);
|
||||
// add_circular_wave_mod(1.0, 1.0, 0.0, phi, psi, xy_in);
|
||||
|
||||
// printf("Wave initialized\n");
|
||||
|
@ -1146,8 +1152,47 @@ void animation()
|
|||
// if ((ADD_OSCILLATING_SOURCE)&&(i%OSCILLATING_SOURCE_PERIOD == OSCILLATING_SOURCE_PERIOD - 1))
|
||||
if ((ADD_OSCILLATING_SOURCE)&&(i%OSCILLATING_SOURCE_PERIOD == 1))
|
||||
{
|
||||
if (ALTERNATE_OSCILLATING_SOURCE) sign = -sign;
|
||||
add_circular_wave_mod(sign, 0.0, 0.0, phi, psi, xy_in);
|
||||
// if (ALTERNATE_OSCILLATING_SOURCE) sign = -sign;
|
||||
// add_circular_wave_mod(sign, 0.0, 0.0, phi, psi, xy_in);
|
||||
|
||||
phase_shift = 1/30.0;
|
||||
// phase_shift = 1/60.0;
|
||||
|
||||
if (first_source) for (k=0; k<25; k++)
|
||||
{
|
||||
angle = 0.0;
|
||||
omega = DPI/25.0;
|
||||
wave_source[k].xc = 0.05*cos((double)k*omega);;
|
||||
wave_source[k].yc = 0.05*sin((double)k*omega);
|
||||
wave_source[k].phase = 0.99 - 1.4*sin(0.7*(1.0 + wave_source[k].xc/0.05));
|
||||
wave_source[k].amp = 1.0;
|
||||
// if (wave_source[k].phase > 0.0) wave_source[k].sign = 1;
|
||||
// else wave_source[k].sign = -1;
|
||||
wave_source[k].sign = 1;
|
||||
}
|
||||
first_source = 0;
|
||||
|
||||
for (k=0; k<25; k++)
|
||||
wave_source[k].phase += 1.4*sin(0.7*(1.0 + wave_source[k].xc*cos(angle)/0.05 + wave_source[k].yc*sin(angle)/0.05));
|
||||
|
||||
angle = DPI*(double)i/(double)NSTEPS;
|
||||
// phase_shift = 0.02 + 0.08*(double)i/(double)NSTEPS;
|
||||
// printf("Phase shift = %.3lg\n", phase_shift);
|
||||
|
||||
for (k=0; k<25; k++)
|
||||
{
|
||||
// wave_source[k].phase += 0.07;
|
||||
wave_source[k].phase += phase_shift;
|
||||
wave_source[k].phase -= 1.4*sin(0.7*(1.0 + wave_source[k].xc*cos(angle)/0.05 + wave_source[k].yc*sin(angle)/0.05));
|
||||
|
||||
if (wave_source[k].phase > 1.0)
|
||||
{
|
||||
add_circular_wave_mod((double)wave_source[k].sign*wave_source[k].amp, wave_source[k].xc, wave_source[k].yc, phi, psi, xy_in);
|
||||
printf("Adding wave at (%.2lg, %.2lg)\n", wave_source[k].xc, wave_source[k].yc);
|
||||
wave_source[k].phase -= 1.0;
|
||||
wave_source[k].sign *= -1;
|
||||
}
|
||||
}
|
||||
|
||||
// for (j=0; j<NPOLY; j++)
|
||||
// add_circular_wave_mod(sign, lambda1*cos(((double)j+0.5)*angle), lambda1*sin(((double)j+0.5)*angle), phi, psi, xy_in);
|
||||
|
|
124
wave_billiard.c
124
wave_billiard.c
|
@ -48,40 +48,40 @@
|
|||
#define SAVE_MEMORY 1 /* set to 1 to save memory when writing tiff images */
|
||||
#define NO_EXTRA_BUFFER_SWAP 1 /* some OS require one less buffer swap when recording images */
|
||||
|
||||
#define VARIABLE_IOR 1 /* set to 1 for a variable index of refraction */
|
||||
#define IOR 5 /* choice of index of refraction, see list in global_pdes.c */
|
||||
#define VARIABLE_IOR 0 /* set to 1 for a variable index of refraction */
|
||||
#define IOR 7 /* choice of index of refraction, see list in global_pdes.c */
|
||||
#define IOR_TOTAL_TURNS 1.5 /* total angle of rotation for IOR_PERIODIC_WELLS_ROTATING */
|
||||
#define MANDEL_IOR_SCALE -0.05 /* parameter controlling dependence of IoR on Mandelbrot escape speed */
|
||||
|
||||
|
||||
/* General geometrical parameters */
|
||||
|
||||
// #define WINWIDTH 1920 /* window width */
|
||||
// #define WINHEIGHT 1150 /* window height */
|
||||
// #define NX 3840 /* number of grid points on x axis */
|
||||
// #define NY 2300 /* number of grid points on y axis */
|
||||
//
|
||||
// #define XMIN -2.0
|
||||
// #define XMAX 2.0 /* x interval */
|
||||
// #define YMIN -1.197916667
|
||||
// #define YMAX 1.197916667 /* y interval for 9/16 aspect ratio */
|
||||
#define WINWIDTH 1920 /* window width */
|
||||
#define WINHEIGHT 1150 /* window height */
|
||||
#define NX 3840 /* number of grid points on x axis */
|
||||
#define NY 2300 /* number of grid points on y axis */
|
||||
|
||||
#define XMIN -2.0
|
||||
#define XMAX 2.0 /* x interval */
|
||||
#define YMIN -1.197916667
|
||||
#define YMAX 1.197916667 /* y interval for 9/16 aspect ratio */
|
||||
|
||||
#define HIGHRES 1 /* set to 1 if resolution of grid is double that of displayed image */
|
||||
|
||||
#define WINWIDTH 1280 /* window width */
|
||||
#define WINHEIGHT 720 /* window height */
|
||||
|
||||
// #define NX 640 /* number of grid points on x axis */
|
||||
// #define NY 360 /* number of grid points on y axis */
|
||||
// #define NX 1280 /* number of grid points on x axis */
|
||||
// #define NY 720 /* number of grid points on y axis */
|
||||
#define NX 2560 /* number of grid points on x axis */
|
||||
#define NY 1440 /* number of grid points on y axis */
|
||||
|
||||
#define XMIN -2.0
|
||||
#define XMAX 2.0 /* x interval */
|
||||
#define YMIN -1.125
|
||||
#define YMAX 1.125 /* y interval for 9/16 aspect ratio */
|
||||
// #define WINWIDTH 1280 /* window width */
|
||||
// #define WINHEIGHT 720 /* window height */
|
||||
//
|
||||
// // #define NX 640 /* number of grid points on x axis */
|
||||
// // #define NY 360 /* number of grid points on y axis */
|
||||
// // #define NX 1280 /* number of grid points on x axis */
|
||||
// // #define NY 720 /* number of grid points on y axis */
|
||||
// #define NX 2560 /* number of grid points on x axis */
|
||||
// #define NY 1440 /* number of grid points on y axis */
|
||||
//
|
||||
// #define XMIN -2.0
|
||||
// #define XMAX 2.0 /* x interval */
|
||||
// #define YMIN -1.125
|
||||
// #define YMAX 1.125 /* y interval for 9/16 aspect ratio */
|
||||
|
||||
#define JULIA_SCALE 1.0 /* scaling for Julia sets */
|
||||
|
||||
|
@ -136,7 +136,7 @@
|
|||
#define AMPLITUDE 0.8 /* amplitude of periodic excitation */
|
||||
#define ACHIRP 0.25 /* acceleration coefficient in chirp */
|
||||
#define DAMPING 0.0 /* damping of periodic excitation */
|
||||
#define COURANT 0.04 /* Courant number */
|
||||
#define COURANT 0.06 /* Courant number */
|
||||
#define COURANTB 0.0 /* Courant number in medium B */
|
||||
#define GAMMA 0.0 /* damping factor in wave equation */
|
||||
#define GAMMAB 0.0 /* damping factor in wave equation */
|
||||
|
@ -151,7 +151,7 @@
|
|||
/* For similar wave forms, COURANT^2*GAMMA should be kept constant */
|
||||
|
||||
#define ADD_OSCILLATING_SOURCE 1 /* set to 1 to add an oscillating wave source */
|
||||
#define OSCILLATING_SOURCE_PERIOD 50 /* period of oscillating source */
|
||||
#define OSCILLATING_SOURCE_PERIOD 2 /* period of oscillating source */
|
||||
#define ALTERNATE_OSCILLATING_SOURCE 1 /* set to 1 to alternate sign of oscillating source */
|
||||
|
||||
#define ADD_WAVE_PACKET_SOURCES 0 /* set to 1 to add several sources emitting wave packets */
|
||||
|
@ -165,13 +165,14 @@
|
|||
|
||||
/* Parameters for length and speed of simulation */
|
||||
|
||||
#define NSTEPS 1800 /* number of frames of movie */
|
||||
// #define NSTEPS 500 /* number of frames of movie */
|
||||
#define NSTEPS 2750 /* number of frames of movie */
|
||||
// #define NSTEPS 2100 /* number of frames of movie */
|
||||
#define NVID 10 /* number of iterations between images displayed on screen */
|
||||
#define NSEG 1000 /* number of segments of boundary */
|
||||
#define INITIAL_TIME 0 /* time after which to start saving frames */
|
||||
#define BOUNDARY_WIDTH 2 /* width of billiard boundary */
|
||||
#define PRINT_SPEED 0 /* print speed of moving source */
|
||||
#define PRINT_FREQUENCY 0 /* print frequency (for phased array) */
|
||||
|
||||
#define PAUSE 200 /* number of frames after which to pause */
|
||||
#define PSLEEP 1 /* sleep time during pause */
|
||||
|
@ -183,7 +184,7 @@
|
|||
|
||||
/* Parameters of initial condition */
|
||||
|
||||
#define INITIAL_AMP 0.5 /* amplitude of initial condition */
|
||||
#define INITIAL_AMP 0.007 /* amplitude of initial condition */
|
||||
#define INITIAL_VARIANCE 0.0003 /* variance of initial condition */
|
||||
#define INITIAL_WAVELENGTH 0.015 /* wavelength of initial condition */
|
||||
|
||||
|
@ -192,24 +193,24 @@
|
|||
#define PLOT 0
|
||||
// #define PLOT 7
|
||||
|
||||
#define PLOT_B 5 /* plot type for second movie */
|
||||
#define PLOT_B 7 /* plot type for second movie */
|
||||
|
||||
/* Color schemes */
|
||||
|
||||
// #define COLOR_PALETTE 15 /* Color palette, see list in global_pdes.c */
|
||||
#define COLOR_PALETTE 17 /* Color palette, see list in global_pdes.c */
|
||||
#define COLOR_PALETTE_B 13 /* Color palette, see list in global_pdes.c */
|
||||
#define COLOR_PALETTE 11 /* Color palette, see list in global_pdes.c */
|
||||
#define COLOR_PALETTE_B 0 /* Color palette, see list in global_pdes.c */
|
||||
|
||||
#define BLACK 1 /* background */
|
||||
|
||||
#define COLOR_SCHEME 3 /* choice of color scheme, see list in global_pdes.c */
|
||||
|
||||
#define SCALE 0 /* set to 1 to adjust color scheme to variance of field */
|
||||
#define SLOPE 0.75 /* sensitivity of color on wave amplitude */
|
||||
#define SLOPE 1.0 /* sensitivity of color on wave amplitude */
|
||||
#define PHASE_FACTOR 1.0 /* factor in computation of phase in color scheme P_3D_PHASE */
|
||||
#define PHASE_SHIFT 0.0 /* shift of phase in color scheme P_3D_PHASE */
|
||||
#define ATTENUATION 0.0 /* exponential attenuation coefficient of contrast with time */
|
||||
#define E_SCALE 60.0 /* scaling factor for energy representation */
|
||||
#define E_SCALE 100.0 /* scaling factor for energy representation */
|
||||
#define LOG_SCALE 1.0 /* scaling factor for energy log representation */
|
||||
#define LOG_SHIFT 3.5 /* shift of colors on log scale */
|
||||
#define FLUX_SCALE 5.0e3 /* scaling factor for enegy flux represtnation */
|
||||
|
@ -222,8 +223,8 @@
|
|||
#define HUEMEAN 180.0 /* mean value of hue for color scheme C_HUE */
|
||||
#define HUEAMP -180.0 /* amplitude of variation of hue for color scheme C_HUE */
|
||||
|
||||
#define DRAW_COLOR_SCHEME 0 /* set to 1 to plot the color scheme */
|
||||
#define COLORBAR_RANGE 2.0 /* scale of color scheme bar */
|
||||
#define DRAW_COLOR_SCHEME 1 /* set to 1 to plot the color scheme */
|
||||
#define COLORBAR_RANGE 2.5 /* scale of color scheme bar */
|
||||
#define COLORBAR_RANGE_B 0.1 /* scale of color scheme bar for 2nd part */
|
||||
#define ROTATE_COLOR_SCHEME 0 /* set to 1 to draw color scheme horizontally */
|
||||
|
||||
|
@ -581,13 +582,14 @@ void draw_color_bar_palette(int plot, double range, int palette, int fade, doubl
|
|||
|
||||
void animation()
|
||||
{
|
||||
double time, scale, ratio, startleft[2], startright[2], sign = 1.0, r2, xy[2], fade_value, yshift, speed = 0.0, a, b, c, x, y, angle, x1, sign1, ior_angle = 0.0;
|
||||
double time, scale, ratio, startleft[2], startright[2], sign = 1.0, r2, xy[2], fade_value, yshift, speed = 0.0, a, b, c, x, y, angle = 0.0, x1, sign1, ior_angle = 0.0, omega, phase_shift;
|
||||
double *phi[NX], *psi[NX], *tmp[NX], *total_energy[NX], *color_scale[NX], *total_flux, *tcc_table[NX];
|
||||
short int *xy_in[NX];
|
||||
int i, j, k, s, sample_left[2], sample_right[2], period = 0, fade, source_counter = 0, p, q;
|
||||
int i, j, k, s, sample_left[2], sample_right[2], period = 0, fade, source_counter = 0, p, q, first_source = 1;
|
||||
static int counter = 0;
|
||||
long int wave_value;
|
||||
t_wave_packet *packet;
|
||||
t_wave_source wave_source[25];
|
||||
|
||||
if (SAVE_TIME_SERIES)
|
||||
{
|
||||
|
@ -787,10 +789,44 @@ void animation()
|
|||
/* add oscillating waves */
|
||||
if ((ADD_OSCILLATING_SOURCE)&&(i%OSCILLATING_SOURCE_PERIOD == 1))
|
||||
{
|
||||
if (ALTERNATE_OSCILLATING_SOURCE) sign = -sign;
|
||||
add_circular_wave(sign, 0.0, 0.0, phi, psi, xy_in);
|
||||
// if (ALTERNATE_OSCILLATING_SOURCE) sign = -sign;
|
||||
// add_circular_wave(sign, 0.0, 0.0, phi, psi, xy_in);
|
||||
|
||||
// p = phased_array_schedule(i);
|
||||
|
||||
// phase_shift = 0.02 + 0.06*(double)i/(double)NSTEPS;
|
||||
|
||||
if (first_source) for (k=0; k<25; k++)
|
||||
{
|
||||
omega = DPI/25.0;
|
||||
wave_source[k].xc = 0.05*cos((double)k*omega);;
|
||||
wave_source[k].yc = 0.05*sin((double)k*omega);
|
||||
wave_source[k].phase = 0.99 - 1.4*sin(0.7*(1.0 + wave_source[k].xc/0.05));
|
||||
wave_source[k].amp = 1.0;
|
||||
if (wave_source[k].phase) wave_source[k].sign = 1;
|
||||
else wave_source[k].sign = -1;
|
||||
first_source = 0;
|
||||
}
|
||||
|
||||
for (k=0; k<25; k++)
|
||||
wave_source[k].phase += 1.4*sin(0.7*(1.0 + wave_source[k].xc*cos(angle)/0.05 + wave_source[k].yc*sin(angle)/0.05));
|
||||
|
||||
angle = DPI*(double)i/(double)NSTEPS;
|
||||
|
||||
for (k=0; k<25; k++)
|
||||
{
|
||||
wave_source[k].phase += 0.07;
|
||||
wave_source[k].phase -= 1.4*sin(0.7*(1.0 + wave_source[k].xc*cos(angle)/0.05 + wave_source[k].yc*sin(angle)/0.05));
|
||||
|
||||
if (wave_source[k].phase > 1.0)
|
||||
{
|
||||
add_circular_wave((double)wave_source[k].sign*wave_source[k].amp, wave_source[k].xc, wave_source[k].yc, phi, psi, xy_in);
|
||||
printf("Adding wave at (%.2lg, %.2lg)\n", wave_source[k].xc, wave_source[k].yc);
|
||||
wave_source[k].phase -= 1.0;
|
||||
wave_source[k].sign *= -1;
|
||||
}
|
||||
}
|
||||
|
||||
// p = 3;
|
||||
// y = -1.0;
|
||||
// sign1 = sign;
|
||||
|
@ -834,6 +870,7 @@ void animation()
|
|||
}
|
||||
if (ADD_WAVE_PACKET_SOURCES) add_wave_packets(phi, psi, xy_in, packet, i, WAVE_PACKET_RADIUS, 0, 10, 1);
|
||||
if (PRINT_SPEED) print_speed(speed, 0, 1.0);
|
||||
if (PRINT_FREQUENCY) print_frequency(phase_shift, 0, 1.0);
|
||||
if ((VARIABLE_IOR)&&(REFRESH_IOR)&&(i%3 == 0))
|
||||
{
|
||||
ior_angle = ior_angle_schedule(i);
|
||||
|
@ -858,6 +895,7 @@ void animation()
|
|||
draw_billiard(0, 1.0);
|
||||
if (DRAW_COLOR_SCHEME) draw_color_bar_palette(PLOT_B, COLORBAR_RANGE_B, COLOR_PALETTE_B, 0, 1.0);
|
||||
if (PRINT_SPEED) print_speed(speed, 0, 1.0);
|
||||
if (PRINT_FREQUENCY) print_frequency(phase_shift, 0, 1.0);
|
||||
glutSwapBuffers();
|
||||
save_frame_counter(NSTEPS + MID_FRAMES + 1 + counter);
|
||||
counter++;
|
||||
|
@ -886,6 +924,7 @@ void animation()
|
|||
draw_billiard(0, 1.0);
|
||||
if (DRAW_COLOR_SCHEME) draw_color_bar_palette(PLOT, COLORBAR_RANGE, COLOR_PALETTE, 0, 1.0);
|
||||
if (PRINT_SPEED) print_speed(speed, 0, 1.0);
|
||||
if (PRINT_FREQUENCY) print_frequency(phase_shift, 0, 1.0);
|
||||
glutSwapBuffers();
|
||||
}
|
||||
if (!FADE) for (i=0; i<MID_FRAMES; i++) save_frame();
|
||||
|
@ -898,6 +937,7 @@ void animation()
|
|||
draw_billiard(1, fade_value);
|
||||
if (DRAW_COLOR_SCHEME) draw_color_bar_palette(PLOT, COLORBAR_RANGE, COLOR_PALETTE, 1, fade_value);
|
||||
if (PRINT_SPEED) print_speed(speed, 1, fade_value);
|
||||
if (PRINT_FREQUENCY) print_frequency(phase_shift, 1, fade_value);
|
||||
if (!NO_EXTRA_BUFFER_SWAP) glutSwapBuffers();
|
||||
save_frame_counter(NSTEPS + i + 1);
|
||||
}
|
||||
|
@ -910,6 +950,7 @@ void animation()
|
|||
draw_billiard(0, 1.0);
|
||||
if (DRAW_COLOR_SCHEME) draw_color_bar_palette(PLOT_B, COLORBAR_RANGE_B, COLOR_PALETTE_B, 0, 1.0);
|
||||
if (PRINT_SPEED) print_speed(speed, 0, 1.0);
|
||||
if (PRINT_FREQUENCY) print_frequency(phase_shift, 0, 1.0);
|
||||
glutSwapBuffers();
|
||||
|
||||
if (!FADE) for (i=0; i<END_FRAMES; i++) save_frame_counter(NSTEPS + MID_FRAMES + 1 + counter + i);
|
||||
|
@ -922,6 +963,7 @@ void animation()
|
|||
draw_billiard(1, fade_value);
|
||||
if (DRAW_COLOR_SCHEME) draw_color_bar_palette(PLOT_B, COLORBAR_RANGE_B, COLOR_PALETTE_B, 1, fade_value);
|
||||
if (PRINT_SPEED) print_speed(speed, 1, fade_value);
|
||||
if (PRINT_FREQUENCY) print_frequency(phase_shift, 0, 1.0);
|
||||
glutSwapBuffers();
|
||||
save_frame_counter(NSTEPS + MID_FRAMES + 1 + counter + i);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue