Commit c9fce26c authored by Taddeüs Kroes's avatar Taddeüs Kroes

ModSim ass4 taddeus: Source code cleanup.

parent 2ea1c77f
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
#include <math.h> #include <math.h>
double **create_y(int steps) { double **create_y(int steps) {
double **y = (double **)malloc(steps * sizeof(double *)); double **y = (double **)malloc(3 * sizeof(double *));
int i; int i;
if( y == NULL ) { if( y == NULL ) {
...@@ -12,8 +12,8 @@ double **create_y(int steps) { ...@@ -12,8 +12,8 @@ double **create_y(int steps) {
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
for( i = 0; i < steps; i++ ) for( i = 0; i < 3; i++ )
y[i] = (double *)malloc(3 * sizeof(double)); y[i] = (double *)malloc(steps * sizeof(double));
return y; return y;
} }
...@@ -23,11 +23,11 @@ double **create_y(int steps) { ...@@ -23,11 +23,11 @@ double **create_y(int steps) {
*/ */
void init_sinus(double **y, int steps, double l, double dx, double n) { void init_sinus(double **y, int steps, double l, double dx, double n) {
for( int i = 0; i < steps; i++ ) for( int i = 0; i < steps; i++ )
y[i][0] = sin(n * M_PI * i * dx / l); y[0][i] = sin(n * M_PI * i * dx / l);
// The string is attached at both ends // The string is attached at both ends
y[0][2] = y[0][1] = y[0][0]; y[2][0] = y[1][0] = y[0][0];
y[steps - 1][2] = y[steps - 1][1] = y[steps - 1][0]; y[2][steps - 1] = y[1][steps - 1] = y[0][steps - 1];
} }
/* /*
...@@ -38,64 +38,63 @@ void init_plucked(double **y, int steps, double l, double dx, double xp) { ...@@ -38,64 +38,63 @@ void init_plucked(double **y, int steps, double l, double dx, double xp) {
for( int i = 0; i < steps; i++ ) { for( int i = 0; i < steps; i++ ) {
x = i * dx; x = i * dx;
y[i][0] = x < xp ? x / xp : (l - x) / (l - xp); y[0][i] = x < xp ? x / xp : (l - x) / (l - xp);
} }
// The string is attached at both ends // The string is attached at both ends
y[0][2] = y[0][1] = y[0][0]; y[2][0] = y[1][0] = y[0][0];
y[steps - 1][2] = y[steps - 1][1] = y[steps - 1][0]; y[2][steps - 1] = y[1][steps - 1] = y[0][steps - 1];
} }
#define VERBOSE #define VERBOSE
#ifdef VERBOSE
#define PRINT_FORMAT "%e" #define PRINT_FORMAT "%e"
void print(double **y, int time_step, int t, int string_steps, double dx) {
printf("%d", time_step);
for( int i = 0; i < string_steps; i++ )
printf(" " PRINT_FORMAT " " PRINT_FORMAT, i * dx, y[t][i]);
puts("");
}
#endif
/* /*
* *
*/ */
void iterate(double **y, int string_steps, double dx, int time_steps, double dt, void iterate(double **y, int string_steps, double dx, int count, int stride,
double theta) { double tau) {
double x; double x;
int i, t, prev = 0, current = 1, next = 2; int i, t, prev = 0, current = 1, next = 2, time_steps = count * stride;
// Calculate the position over the entire string at time dt using the // 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) // position at t = 0 and the information that y(x, -dt) == y(x, dt)
for( i = 1; i < string_steps - 1; i++ ) { for( i = 1; i < string_steps - 1; i++ ) {
x = i * dx; x = i * dx;
y[i][1] = y[i][0] + .5 * theta * theta * (y[i-1][0] - 2 * y[i][0] y[1][i] = y[0][i] + .5 * tau * tau * (y[0][i-1] - 2 * y[0][i]
+ y[i+1][0]); + y[0][i+1]);
} }
// Print init states
#ifdef VERBOSE #ifdef VERBOSE
for( t = 0; t < 2; t++ ) { // Print init states
printf(PRINT_FORMAT, t * dt); print(y, 0, 0, string_steps, dx);
for( i = 0; i < string_steps; i++ )
printf(" " PRINT_FORMAT " " PRINT_FORMAT, i * dx, y[i][t]);
puts(""); if( stride == 1 )
} print(y, 1, 1, string_steps, dx);
#endif #endif
// Iterate over the length of the string for each time interval step // Iterate over the length of the string for each time interval step
for( t = 2; t < time_steps; t++ ) { for( t = 2; t < time_steps; t++ ) {
#ifdef VERBOSE
printf(PRINT_FORMAT " " PRINT_FORMAT " " PRINT_FORMAT, t * dt, .0,
y[0][next]);
#endif
for( i = 1; i < string_steps - 1; i++ ) { for( i = 1; i < string_steps - 1; i++ ) {
y[i][next] = 2 * y[i][current] - y[i][prev] + theta * theta y[next][i] = 2 * y[current][i] - y[prev][i] + tau * tau
* (y[i-1][current] - 2 * y[i][current] + y[i+1][current]); * (y[current][i-1] - 2 * y[current][i] + y[current][i+1]);
#ifdef VERBOSE
printf(" " PRINT_FORMAT " " PRINT_FORMAT, i * dx, y[i][next]);
#endif
} }
#ifdef VERBOSE #ifdef VERBOSE
printf(" " PRINT_FORMAT " " PRINT_FORMAT "\n", (string_steps - 1) * dx, if( !(t % stride) )
y[string_steps - 1][next]); print(y, t, next, string_steps, dx);
#endif #endif
prev = current; prev = current;
...@@ -105,12 +104,12 @@ void iterate(double **y, int string_steps, double dx, int time_steps, double dt, ...@@ -105,12 +104,12 @@ void iterate(double **y, int string_steps, double dx, int time_steps, double dt,
} }
int main(int argc, const char **argv) { int main(int argc, const char **argv) {
int steps, i; int steps, i, count, stride;
void (*init_method)(double **, int, double, double, double); void (*init_method)(double **, int, double, double, double);
double **y, t, dt, l, dx, theta, constant; double **y, l, dx, tau, constant;
if( argc < 8 ) { if( argc < 8 ) {
printf("Usage: %s INIT_METHOD TIME DT LENGTH DX THETA N|XP\n", argv[0]); printf("Usage: %s INIT_METHOD COUNT STRIDE LENGTH DX TAU N|XP\n", argv[0]);
return EXIT_FAILURE; return EXIT_FAILURE;
} }
...@@ -123,19 +122,19 @@ int main(int argc, const char **argv) { ...@@ -123,19 +122,19 @@ int main(int argc, const char **argv) {
return EXIT_FAILURE; return EXIT_FAILURE;
} }
t = atof(argv[2]); count = atoi(argv[2]);
dt = atof(argv[3]); stride = atoi(argv[3]);
l = atof(argv[4]); l = atof(argv[4]);
dx = atof(argv[5]); dx = atof(argv[5]);
theta = atof(argv[6]); tau = atof(argv[6]);
constant = atof(argv[7]); constant = atof(argv[7]);
y = create_y(steps = (int)ceil(l / dx)); y = create_y(steps = (int)ceil(l / dx));
(*init_method)(y, steps, l, dx, constant); (*init_method)(y, steps, l, dx, constant);
iterate(y, steps, dx, (int)ceil(t / dt), dt, theta); iterate(y, steps, dx, count, stride, tau);
// Free allocated memory // Free allocated memory
for( i = 0; i < steps; i++ ) for( i = 0; i < 3; i++ )
free(y[i]); free(y[i]);
free(y); free(y);
......
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