Add files via upload

This commit is contained in:
Nils Berglund
2023-01-22 16:49:04 +01:00
committed by GitHub
parent 59cc5fbcf3
commit e3a7a58057
21 changed files with 7632 additions and 620 deletions

View File

@@ -961,9 +961,9 @@ void draw_billiard_3d_front(int fade, double fade_value)
void compute_energy_field(double phi[NX*NY], double psi[NX*NY], short int xy_in[NX*NY], t_wave wave[NX*NY])
/* computes cosine of angle between normal vector and vector light */
{
int i, j;
int i, j, k;
static int first = 1;
double energy, logenergy;
double energy, logenergy, gx, gy, arg, mod, sum;
// printf("computing energy field\n");
// printf("COMPUTE_MEAN_ENERGY = %i\n", COMPUTE_MEAN_ENERGY);
@@ -1008,6 +1008,20 @@ void compute_energy_field(double phi[NX*NY], double psi[NX*NY], short int xy_in[
if (logenergy > LOG_ENERGY_FLOOR) wave[i*NY+j].log_mean_energy = LOG_SHIFT + PLOT_SCALE_LOG_ENERGY*logenergy;
else wave[i*NY+j].mean_energy = LOG_SHIFT + PLOT_SCALE_LOG_ENERGY*LOG_ENERGY_FLOOR;
}
if (COMPUTE_ENERGY_FLUX)
{
compute_energy_flux_mod(phi, psi, xy_in, i, j, &gx, &gy, &arg, &mod);
wave[i*NY+j].flux_direction = arg/DPI;
/* compute time-averaged flux intensity */
wave[i*NY+j].flux_int_table[wave[i*NY+j].flux_counter] = mod*FLUX_SCALE;
sum = 0.0;
for (k = 0; k < FLUX_WINDOW; k++) sum += wave[i*NY+j].flux_int_table[k];
wave[i*NY+j].flux_intensity = sum/(double)FLUX_WINDOW;
wave[i*NY+j].flux_counter++;
if (wave[i*NY+j].flux_counter == FLUX_WINDOW) wave[i*NY+j].flux_counter = 0;
}
}
else if (first)
{
@@ -1016,6 +1030,8 @@ void compute_energy_field(double phi[NX*NY], double psi[NX*NY], short int xy_in[
wave[i*NY+j].log_total_energy = LOG_ENERGY_FLOOR;
wave[i*NY+j].mean_energy = 0.0;
wave[i*NY+j].log_mean_energy = LOG_ENERGY_FLOOR;
wave[i*NY+j].flux_intensity = 0.0;
wave[i*NY+j].flux_direction = 0.0;
}
}
@@ -1099,9 +1115,12 @@ void compute_light_angle(short int xy_in[NX*NY], t_wave wave[NX*NY], int movie)
}
void compute_field_color(double value, int cplot, int palette, double rgb[3])
void compute_field_color(double value, double value2, int cplot, int palette, double rgb[3])
/* compute the color depending on the field value and color palette */
/* value2 is only used for flux representation */
{
int k;
switch (cplot) {
case (P_3D_AMP_ANGLE):
{
@@ -1110,7 +1129,7 @@ void compute_field_color(double value, int cplot, int palette, double rgb[3])
}
case (P_3D_ENERGY):
{
if (COLOR_PALETTE >= COL_TURBO) color_scheme_asym_palette(COLOR_SCHEME, palette, value, 1.0, 0, rgb);
if (COLOR_PALETTE >= COL_TURBO) color_scheme_asym_palette(COLOR_SCHEME, palette, VSCALE_ENERGY*value, 1.0, 0, rgb);
else color_scheme_palette(COLOR_SCHEME, palette, value, 1.0, 0, rgb);
break;
}
@@ -1121,7 +1140,7 @@ void compute_field_color(double value, int cplot, int palette, double rgb[3])
}
case (P_3D_TOTAL_ENERGY):
{
if (COLOR_PALETTE >= COL_TURBO) color_scheme_asym_palette(COLOR_SCHEME, palette, value, 1.0, 0, rgb);
if (COLOR_PALETTE >= COL_TURBO) color_scheme_asym_palette(COLOR_SCHEME, palette, VSCALE_ENERGY*value, 1.0, 0, rgb);
else color_scheme_palette(COLOR_SCHEME, palette, value, 1.0, 0, rgb);
break;
}
@@ -1132,7 +1151,7 @@ void compute_field_color(double value, int cplot, int palette, double rgb[3])
}
case (P_3D_MEAN_ENERGY):
{
if (COLOR_PALETTE >= COL_TURBO) color_scheme_asym_palette(COLOR_SCHEME, palette, value, 1.0, 0, rgb);
if (COLOR_PALETTE >= COL_TURBO) color_scheme_asym_palette(COLOR_SCHEME, palette, VSCALE_ENERGY*value, 1.0, 0, rgb);
else color_scheme_palette(COLOR_SCHEME, palette, value, 1.0, 0, rgb);
break;
}
@@ -1146,16 +1165,27 @@ void compute_field_color(double value, int cplot, int palette, double rgb[3])
amp_to_rgb_palette(value, rgb, palette);
break;
}
case (P_3D_FLUX_INTENSITY):
{
color_scheme_asym_palette(COLOR_SCHEME, palette, value*FLUX_SCALE, 1.0, 0, rgb);
break;
}
case (P_3D_FLUX_DIRECTION):
{
amp_to_rgb_palette(value, rgb, palette);
for (k=0; k<3; k++) rgb[k] *= tanh(value2*FLUX_CSCALE);
break;
}
}
}
double compute_interpolated_colors_wave(int i, int j, short int xy_in[NX*NY], t_wave wave[NX*NY], double palette, int cplot,
double rgb_e[3], double rgb_w[3], double rgb_n[3], double rgb_s[3],
int fade, double fade_value, int movie)
double compute_interpolated_colors_wave(int i, int j, short int xy_in[NX*NY], t_wave wave[NX*NY],
double palette, int cplot, double rgb_e[3], double rgb_w[3], double rgb_n[3], double rgb_s[3], int fade, double fade_value, int movie)
{
int k;
double cw, ce, cn, cs, c_sw, c_se, c_nw, c_ne, c_mid, ca, z_mid;
double cw2, ce2, cn2, cs2;
double *z_sw, *z_se, *z_nw, *z_ne;
z_sw = wave[i*NY+j].p_zfield[movie];
@@ -1177,10 +1207,26 @@ double compute_interpolated_colors_wave(int i, int j, short int xy_in[NX*NY], t_
cs = (c_sw + c_se + c_mid)/3.0;
cn = (c_nw + c_ne + c_mid)/3.0;
compute_field_color(ce, cplot, palette, rgb_e);
compute_field_color(cw, cplot, palette, rgb_w);
compute_field_color(cn, cplot, palette, rgb_n);
compute_field_color(cs, cplot, palette, rgb_s);
/* data for second color parameter */
if (CHANGE_LUMINOSITY)
{
c_sw = *wave[i*NY+j].p_cfield[movie+2];
c_se = *wave[(i+1)*NY+j].p_cfield[movie+2];
c_nw = *wave[i*NY+j+1].p_cfield[movie+2];
c_ne = *wave[(i+1)*NY+j+1].p_cfield[movie+2];
c_mid = 0.25*(c_sw + c_se + c_nw + c_ne);
cw2 = (c_sw + c_nw + c_mid)/3.0;
ce2 = (c_se + c_ne + c_mid)/3.0;
cs2 = (c_sw + c_se + c_mid)/3.0;
cn2 = (c_nw + c_ne + c_mid)/3.0;
}
compute_field_color(ce, ce2, cplot, palette, rgb_e);
compute_field_color(cw, cw2, cplot, palette, rgb_w);
compute_field_color(cn, cn2, cplot, palette, rgb_n);
compute_field_color(cs, cs2, cplot, palette, rgb_s);
if (SHADE_3D)
{
@@ -1229,9 +1275,9 @@ void compute_wave_fields(double phi[NX*NY], double psi[NX*NY], short int xy_in[N
void init_speed_dissipation(short int xy_in[NX*NY], double tc[NX*NY], double tcc[NX*NY], double tgamma[NX*NY])
/* initialise fields for wave speed and dissipation */
{
int i, j, k;
double courant2 = COURANT*COURANT, courantb2 = COURANTB*COURANTB;
double u, v, u1, x, y, xy[2], norm2, speed, r2, c;
int i, j, k, inlens;
double courant2 = COURANT*COURANT, courantb2 = COURANTB*COURANTB, lambda1, mu1;
double u, v, u1, x, y, xy[2], norm2, speed, r2, c, salpha, h, ll, ca, sa, x1, y1;
if (VARIABLE_IOR)
{
@@ -1327,6 +1373,47 @@ void init_speed_dissipation(short int xy_in[NX*NY], double tc[NX*NY], double tcc
}
break;
}
case (IOR_EXPLO_LENSING):
{
salpha = DPI/(double)NPOLY;
// lambda1 = LAMBDA;
// mu1 = LAMBDA;
lambda1 = 0.5*LAMBDA;
mu1 = 0.5*LAMBDA;
h = lambda1*tan(PI/(double)NPOLY);
if (h < mu1) ll = sqrt(mu1*mu1 - h*h);
else ll = 0.0;
// #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]) {
ij_to_xy(i, j, xy);
x = xy[0];
y = xy[1];
inlens = 0;
for (k=0; k<NPOLY; k++)
{
ca = cos(((double)k+0.5)*salpha + APOLY*PID);
sa = sin(((double)k+0.5)*salpha + APOLY*PID);
x1 = x*ca + y*sa;
y1 = -x*sa + y*ca;
if ((module2(x1 - lambda1 - ll, y1) < mu1)&&(module2(x1 - lambda1 + ll, y1) < mu1)) inlens = 1;
}
if (inlens) c = COURANTB;
else c = COURANT;
tc[i*NY+j] = c;
tcc[i*NY+j] = c*c;
tgamma[i*NY+j] = GAMMA;
}
else
{
tc[i*NY+j] = 0.0;
tcc[i*NY+j] = 0.0;
tgamma[i*NY+j] = 0.0;
}
}
break;
}
default:
{
for (i=0; i<NX; i++){
@@ -1417,6 +1504,18 @@ void init_zfield(double phi[NX*NY], double psi[NX*NY], short int xy_in[NX*NY], i
for (i=0; i<NX; i++) for (j=0; j<NY; j++) wave[i*NY+j].p_zfield[movie] = &wave[i*NY+j].phase;
break;
}
case (P_3D_FLUX_INTENSITY):
{
#pragma omp parallel for private(i,j)
for (i=0; i<NX; i++) for (j=0; j<NY; j++) wave[i*NY+j].p_zfield[movie] = &wave[i*NY+j].flux_intensity;
break;
}
case (P_3D_FLUX_DIRECTION):
{
#pragma omp parallel for private(i,j)
for (i=0; i<NX; i++) for (j=0; j<NY; j++) wave[i*NY+j].p_zfield[movie] = &wave[i*NY+j].flux_direction;
break;
}
}
}
@@ -1474,6 +1573,30 @@ void init_cfield(double phi[NX*NY], double psi[NX*NY], short int xy_in[NX*NY], i
for (i=0; i<NX; i++) for (j=0; j<NY; j++) wave[i*NY+j].p_cfield[movie] = &wave[i*NY+j].phase;
break;
}
case (P_3D_FLUX_INTENSITY):
{
#pragma omp parallel for private(i,j)
for (i=0; i<NX; i++) for (j=0; j<NY; j++) wave[i*NY+j].p_cfield[movie] = &wave[i*NY+j].flux_intensity;
break;
}
case (P_3D_FLUX_DIRECTION):
{
#pragma omp parallel for private(i,j)
for (i=0; i<NX; i++) for (j=0; j<NY; j++)
{
wave[i*NY+j].p_cfield[movie] = &wave[i*NY+j].flux_direction;
wave[i*NY+j].p_cfield[movie+2] = &wave[i*NY+j].flux_intensity;
/* information on intensity stored in second pointer to adjust luminosity */
}
break;
}
}
if (cplot != P_3D_FLUX_DIRECTION)
{
#pragma omp parallel for private(i,j)
for (i=0; i<NX; i++) for (j=0; j<NY; j++)
wave[i*NY+j].p_cfield[movie+2] = wave[i*NY+j].p_cfield[movie];
}
}
@@ -1487,7 +1610,7 @@ void compute_cfield(short int xy_in[NX*NY], int cplot, int palette, t_wave wave[
#pragma omp parallel for private(i,j,ca)
for (i=0; i<NX; i++) for (j=0; j<NY; j++)
{
compute_field_color(*wave[i*NY+j].p_cfield[movie], cplot, palette, wave[i*NY+j].rgb);
compute_field_color(*wave[i*NY+j].p_cfield[movie], *wave[i*NY+j].p_cfield[movie+2], cplot, palette, wave[i*NY+j].rgb);
if (SHADE_3D)
{
ca = wave[i*NY+j].cos_angle;
@@ -1613,8 +1736,7 @@ void draw_wave_3d_ij(int i, int j, int movie, double phi[NX*NY], double psi[NX*N
}
void draw_wave_3d(int movie, double phi[NX*NY], double psi[NX*NY], short int xy_in[NX*NY], t_wave wave[NX*NY],
int zplot, int cplot, int palette, int fade, double fade_value, int refresh)
void draw_wave_3d(int movie, double phi[NX*NY], double psi[NX*NY], short int xy_in[NX*NY], t_wave wave[NX*NY], int zplot, int cplot, int palette, int fade, double fade_value, int refresh)
{
int i, j;
double observer_angle;
@@ -1671,12 +1793,14 @@ void draw_wave_3d(int movie, double phi[NX*NY], double psi[NX*NY], short int xy_
if (DRAW_BILLIARD_FRONT) draw_billiard_3d_front(fade, fade_value);
}
void draw_color_scheme_palette_3d(double x1, double y1, double x2, double y2, int plot, double min, double max,
int palette, int fade, double fade_value)
void draw_color_scheme_palette_3d(double x1, double y1, double x2, double y2, int plot,
double min, double max, int palette, int fade, double fade_value)
{
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");
xy_to_ij(x1, y1, ij_botleft);
xy_to_ij(x2, y2, ij_topright);
@@ -1770,6 +1894,19 @@ void draw_color_scheme_palette_3d(double x1, double y1, double x2, double y2, in
color_scheme_palette(C_ONEDIM_LINEAR, palette, value, 1.0, 1, rgb);
break;
}
case (P_3D_FLUX_INTENSITY):
{
value = dy_e*(double)(j - jmin)*100.0/E_SCALE;
if (COLOR_PALETTE >= COL_TURBO) color_scheme_asym_palette(COLOR_SCHEME, palette, value, 1.0, 1, rgb);
else color_scheme_palette(COLOR_SCHEME, palette, value, 1.0, 1, rgb);
break;
}
case (P_3D_FLUX_DIRECTION):
{
value = 2.0*dy_phase*(double)(j - jmin);
color_scheme_palette(C_ONEDIM_LINEAR, palette, value, 1.0, 1, rgb);
break;
}
case (Z_EULER_VORTICITY):
{
value = min + 1.0*dy*(double)(j - jmin);
@@ -1788,6 +1925,20 @@ void draw_color_scheme_palette_3d(double x1, double y1, double x2, double y2, in
color_scheme_palette(COLOR_SCHEME, palette, 0.7*value, 1.0, 0, rgb);
break;
}
case (Z_EULER_LPRESSURE):
{
value = min + 1.0*dy*(double)(j - jmin);
color_scheme_palette(COLOR_SCHEME, palette, 0.7*value, 1.0, 0, rgb);
break;
}
case (Z_EULERC_VORTICITY):
{
value = min + 1.0*dy*(double)(j - jmin);
printf("Palette value %.3lg\n", value);
color_scheme_palette(COLOR_SCHEME, palette, 0.7*value, 1.0, 0, rgb);
break;
}
}
if (fade) for (k=0; k<3; k++) rgb[k] *= fade_value;
glColor3f(rgb[0], rgb[1], rgb[2]);
@@ -1837,3 +1988,18 @@ void print_speed_3d(double speed, int fade, double fade_value)
write_text(xlefttext + 0.28, y, message);
}
void init_wave_fields(t_wave wave[NX*NY])
/* initialize some auxiliary fields */
{
int i, k;
#pragma omp parallel for private(i)
for (i=0; i<NX*NY; i++)
{
wave[i].total_energy = 0.0;
wave[i].flux_counter = 0;
for (k=0; k<FLUX_WINDOW; k++)
wave[i].flux_int_table[k] = 0.0;
}
}