Files
TDT4200/exercise1/wave_1d.c
2025-09-02 19:18:41 +02:00

109 lines
1.8 KiB
C

#define _XOPEN_SOURCE 600
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <math.h>
// 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.
const int_t
N = 1024,
max_iteration = 4000,
snapshot_freq = 10;
// Wave equation parameters, time step is derived from the space step.
const real_t
c = 1.0,
dx = 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) buffers[0][(i)+1]
#define U(i) buffers[1][(i)+1]
#define U_nxt(i) buffers[2][(i)+1]
// 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" );
fwrite ( &U(0), sizeof(real_t), N, out );
fclose ( out );
}
// TASK: T1
// Set up our three buffers, fill two with an initial cosine wave,
// and set the time step.
void domain_initialize ( void )
{
// BEGIN: T1
;
// END: T1
}
// TASK T2:
// Return the memory to the OS.
// BEGIN: T2
void domain_finalize ( void )
{
;
}
// END: T2
// TASK: T3
// Rotate the time step buffers.
// BEGIN: T3
;
// END: T3
// TASK: T4
// Derive step t+1 from steps t and t-1.
// BEGIN: T4
;
// END: T4
// TASK: T5
// Neumann (reflective) boundary condition.
// BEGIN: T5
;
// END: T5
// TASK: T6
// Main time integration.
void simulate( void )
{
// BEGIN: T6
int_t iteration=0;
domain_save ( iteration / snapshot_freq );
// END: T6
}
int main ( void )
{
domain_initialize();
simulate();
domain_finalize();
exit ( EXIT_SUCCESS );
}