Commit 20e40ac2 authored by Taddeüs Kroes's avatar Taddeüs Kroes

Added animated plotting program.

parent d287e7ed
...@@ -2,8 +2,8 @@ CC=gcc ...@@ -2,8 +2,8 @@ CC=gcc
CFLAGS=-Wall -Wextra -pedantic -std=c99 -O0 -D_GNU_SOURCE CFLAGS=-Wall -Wextra -pedantic -std=c99 -O0 -D_GNU_SOURCE
LDFLAGS=-lm LDFLAGS=-lm
all: seq all: seq2
seq: seq.o seq2: seq2.o
clean: clean:
rm -vf *.o vibstring rm -vf *.o vibstring
#!/usr/bin/env python
from sys import stdin
from pylab import figure, plot, axis, draw, ion, clf
from time import sleep
# Collect data
y = []
lines = stdin.readlines()
x = map(float, lines[0].split(' '))
for line in lines[1:]:
y += [map(float, line.split(' '))]
# Find axis maxima
max_y = max([max(map(abs, y[i])) for i in range(len(y))])
ranges = [0, max(x), -max_y, max_y]
# Plot data in animation
try:
ion()
figure(1)
for i in range(len(y)):
clf()
plot(x, y[i], '-')
axis(ranges)
draw()
sleep(.01)
except KeyboardInterrupt:
print 'Quitting...'
#!/usr/bin/env python #!/usr/bin/env python
from sys import argv, stdin from sys import argv, stdin
from pylab import figure, plot, subplot, show, savefig, legend from pylab import figure, plot, subplot, show, savefig, legend, axis
from time import sleep from time import sleep
# Collect data # Collect data
...@@ -16,7 +16,7 @@ figure(len(t)) ...@@ -16,7 +16,7 @@ figure(len(t))
for i in range(len(t)): for i in range(len(t)):
subplot(2, 5, i + 1) subplot(2, 5, i + 1)
plot(y[i][0], y[i][1], 'x-', label='t = %.3f' % t[i]) plot(y[i][0], y[i][1], 'x-', label='t = %.3f' % t[i])
#legend() axis([0, 1, -1, 1])
if len(argv) == 2: if len(argv) == 2:
savefig(argv[1]) savefig(argv[1])
show() show()
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
double **create_y(int steps) {
double **y = (double **)malloc(3 * sizeof(double *));
int i;
if( y == NULL ) {
puts("Error: could not allocate memory.");
exit(EXIT_FAILURE);
}
for( i = 0; i < 3; i++ )
y[i] = (double *)malloc(steps * sizeof(double));
return y;
}
/*
*
*/
void init_sinus(double **y, int steps, double l, double dx, double n) {
for( int i = 0; i < steps; i++ )
y[0][i] = sin(n * M_PI * i * dx / l);
// The string is attached at both ends
y[2][0] = y[1][0] = y[0][0];
y[2][steps - 1] = y[1][steps - 1] = y[0][steps - 1];
}
/*
*
*/
void init_plucked(double **y, int steps, double l, double dx, double xp) {
double x;
for( int i = 0; i < steps; i++ ) {
x = i * dx;
y[0][i] = x < xp ? x / xp : (l - x) / (l - xp);
}
// The string is attached at both ends
y[2][0] = y[1][0] = y[0][0];
y[2][steps - 1] = y[1][steps - 1] = y[0][steps - 1];
}
#define VERBOSE
#ifdef VERBOSE
#define PRINT_FORMAT "%e"
void print(double *y, int string_steps) {
for( int i = 0; i < string_steps; i++ ) {
if( i )
printf(" ");
printf(PRINT_FORMAT, y[i]);
}
puts("");
}
#endif
/*
*
*/
void iterate(double **y, int string_steps, double dx, int calc_steps,
int print_resolution, double tau) {
double x;
int i, t, prev = 0, current = 1, next = 2;
// Calculate the position over the entire string at time dt using the
// position at t = 0 and the information that y(x, -dt) == y(x, dt)
for( i = 1; i < string_steps - 1; i++ ) {
x = i * dx;
y[1][i] = y[0][i] + .5 * tau * tau * (y[0][i-1] - 2 * y[0][i]
+ y[0][i+1]);
}
#ifdef VERBOSE
// Print x values (which are the same for every y-series)
for( i = 0; i < string_steps; i++ ) {
if( i )
printf(" ");
printf(PRINT_FORMAT, i * dx);
}
puts("");
// Print init states
print(y[prev], string_steps);
if( print_resolution == 1 )
print(y[current], string_steps);
#endif
// Iterate over the length of the string for each time interval step
for( t = 2; t < calc_steps; t++ ) {
for( i = 1; i < string_steps - 1; i++ ) {
y[next][i] = 2 * y[current][i] - y[prev][i] + tau * tau
* (y[current][i-1] - 2 * y[current][i] + y[current][i+1]);
}
#ifdef VERBOSE
if( !(t % print_resolution) )
print(y[next], string_steps);
#endif
prev = current;
current = next;
next = (next + 1) % 3;
}
}
int main(int argc, const char **argv) {
int x_steps, calc_steps, i, print_resolution;
void (*init_method)(double **, int, double, double, double);
double **y, l, dx, tau, constant;
if( argc < 8 ) {
printf("Usage: %s INIT_METHOD CALCULATION_STEPS PRINT_RESOLUTION LENGTH"
" DX TAU N|XP\n", argv[0]);
return EXIT_FAILURE;
}
if( !strcmp(argv[1], "sinus") ) {
init_method = init_sinus;
} else if( !strcmp(argv[1], "plucked") ) {
init_method = init_plucked;
} else {
printf("Unknown initialization method '%s'.\n", argv[1]);
return EXIT_FAILURE;
}
calc_steps = atoi(argv[2]);
print_resolution = atoi(argv[3]);
l = atof(argv[4]);
dx = atof(argv[5]);
tau = atof(argv[6]);
constant = atof(argv[7]);
x_steps = (int)ceil(l / dx);
y = create_y(x_steps);
(*init_method)(y, x_steps, l, dx, constant);
iterate(y, x_steps, dx, calc_steps, print_resolution, tau);
// Free allocated memory
for( i = 0; i < 3; i++ )
free(y[i]);
free(y);
return EXIT_SUCCESS;
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment