init exercise1

This commit is contained in:
2025-09-02 19:08:54 +02:00
parent 213613e008
commit 1dd44db0a5
4 changed files with 137 additions and 0 deletions

15
exercise1/Makefile Normal file
View File

@@ -0,0 +1,15 @@
CFLAGS+= -std=c99 -O2 -Wall -Wextra
LDLIBS+= -lm
TARGETS=wave_1d
IMAGES=$(shell find data -type f | sed s/\\.dat/.png/g | sed s/data/images/g )
.PHONY: all clean dirs plot movie
all: dirs ${TARGETS}
dirs:
mkdir -p data images
plot: ${IMAGES}
images/%.png: data/%.dat
./plot_image.sh $<
movie: ${IMAGES}
ffmpeg -y -an -i images/%5d.png -vcodec libx264 -pix_fmt yuv420p -profile:v baseline -level 3 -r 12 wave.mp4
clean:
-rm -fr ${TARGETS} data images wave.mp4

4
exercise1/README.md Normal file
View File

@@ -0,0 +1,4 @@
* make : builds the executable 'wave_1d'
* ./wave\_1d : fills the 'data/' directory with stored time steps
* make plot : converts saved time steps to png files under 'images/', using gnuplot. Runs faster if launched with e.g. 4 threads (make -j4 plot).
* make movie : converts collection of png files under 'images' into an mp4 movie file

10
exercise1/plot_image.sh Normal file
View File

@@ -0,0 +1,10 @@
#! /usr/bin/env bash
SIZE=1024
DATAFILE=$1
IMAGEFILE=`echo $1 | sed s/dat$/png/ | sed s/data/images/`
cat <<END_OF_SCRIPT | gnuplot -
set term png
set output "$IMAGEFILE"
set yrange[-1:1]
plot "$DATAFILE" binary array=${SIZE} format='%double' with lines
END_OF_SCRIPT

108
exercise1/wave_1d.c Normal file
View File

@@ -0,0 +1,108 @@
#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 );
}