#define _XOPEN_SOURCE 600 #include #include #include #include #include #include // Convert 'struct timeval' into seconds in double prec. floating point #define WALLTIME(t) ((double)(t).tv_sec + 1e-6 * (double)(t).tv_usec) // Option to change numerical precision typedef int64_t int_t; typedef double real_t; // Simulation parameters: size, step count, and how often to save the state int_t N = 1024, M = 1024, max_iteration = 4000, snapshot_freq = 20; // Wave equation parameters, time step is derived from the space step const real_t c = 1.0, dx = 1.0, dy = 1.0; real_t dt; // Buffers for three time steps, indexed with 2 ghost points for the boundary real_t *buffers[3] = { NULL, NULL, NULL }; #define U_prv(i,j) buffers[0][((i)+1)*(N+2)+(j)+1] #define U(i,j) buffers[1][((i)+1)*(N+2)+(j)+1] #define U_nxt(i,j) buffers[2][((i)+1)*(N+2)+(j)+1] // Rotate the time step buffers. void move_buffer_window ( void ) { real_t *temp = buffers[0]; buffers[0] = buffers[1]; buffers[1] = buffers[2]; buffers[2] = temp; } // Save the present time step in a numbered file under 'data/' void domain_save ( int_t step ) { char filename[256]; sprintf ( filename, "data/%.5ld.dat", step ); FILE *out = fopen ( filename, "wb" ); for ( int_t i=0; i