tadded output file time parameter - ns2dfd - 2D finite difference Navier Stokes solver for fluid dynamics
(HTM) git clone git://src.adamsgaard.dk/ns2dfd
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) LICENSE
---
(DIR) commit 3eba95c436a2e58872c5a56f133fa08df65a214a
(DIR) parent 08a48407f92cd5c0c603c8e5207ab92b8a5df5a5
(HTM) Author: Anders Damsgaard <anders.damsgaard@geo.au.dk>
Date: Sun, 2 Mar 2014 21:12:11 +0100
added output file time parameter
Diffstat:
M ns2dfd.py | 17 ++++++++++++++---
M src/file_io.c | 6 ++++--
M src/file_io.h | 4 ++--
M src/main.c | 34 +++++++++++++++++++++++--------
M src/utility.c | 13 ++++++++++++-
5 files changed, 57 insertions(+), 17 deletions(-)
---
(DIR) diff --git a/ns2dfd.py b/ns2dfd.py
t@@ -16,6 +16,7 @@ class fluid:
self.init_grid()
self.current_time()
self.end_time()
+ self.file_time()
self.safety_factor()
self.max_iterations()
self.tolerance_criteria()
t@@ -61,6 +62,14 @@ class fluid:
'''
self.t_end = numpy.asarray(t_end)
+ def file_time(self, t_file = 0.1):
+ '''
+ Set the simulation output file interval.
+ :param t_file: The time when to stop the simulation.
+ :type t_file: float
+ '''
+ self.t_file = numpy.asarray(t_file)
+
def safety_factor(self, tau = 0.5):
'''
Define the safety factor for the time step size control. Default value =
t@@ -150,9 +159,10 @@ class fluid:
print('Input file: ' + targetfile)
fh = open(targetfile, 'rb')
- self.t = numpy.fromfile(fh, dtype=numpy.float64, count=1)
- self.t_end = numpy.fromfile(fh, dtype=numpy.float64, count=1)
- self.tau = numpy.fromfile(fh, dtype=numpy.float64, count=1)
+ self.t = numpy.fromfile(fh, dtype=numpy.float64, count=1)
+ self.t_end = numpy.fromfile(fh, dtype=numpy.float64, count=1)
+ self.t_file = numpy.fromfile(fh, dtype=numpy.float64, count=1)
+ self.tau = numpy.fromfile(fh, dtype=numpy.float64, count=1)
self.itermax = numpy.fromfile(fh, dtype=numpy.int32, count=1)
self.epsilon = numpy.fromfile(fh, dtype=numpy.float64, count=1)
t@@ -209,6 +219,7 @@ class fluid:
fh.write(self.t.astype(numpy.float64))
fh.write(self.t_end.astype(numpy.float64))
+ fh.write(self.t_file.astype(numpy.float64))
fh.write(self.tau.astype(numpy.float64))
fh.write(self.itermax.astype(numpy.int32))
(DIR) diff --git a/src/file_io.c b/src/file_io.c
t@@ -3,7 +3,7 @@
/* Read the variable values from a file on disk */
int read_file(char *path,
- double *t, double *t_end, double *tau, int *itermax,
+ double *t, double *t_end, double *t_file, double *tau, int *itermax,
double *epsilon, double *omega, double *gamma,
double *gx, double *gy, double *re,
int *w_left, int *w_right, int *w_top, int *w_bottom,
t@@ -21,6 +21,7 @@ int read_file(char *path,
fread(t, sizeof(double), 1, fp);
fread(t_end, sizeof(double), 1, fp);
+ fread(t_file, sizeof(double), 1, fp);
fread(tau, sizeof(double), 1, fp);
fread(itermax, sizeof(int), 1, fp);
t@@ -72,7 +73,7 @@ int read_file(char *path,
/* Write the variable values to a file on disk */
int write_file(char *path,
- double *t, double *t_end, double *tau, int *itermax,
+ double *t, double *t_end, double *t_file, double *tau, int *itermax,
double *epsilon, double *omega, double *gamma,
double *gx, double *gy, double *re,
int *w_left, int *w_right, int *w_top, int *w_bottom,
t@@ -90,6 +91,7 @@ int write_file(char *path,
fwrite(t, sizeof(double), 1, fp);
fwrite(t_end, sizeof(double), 1, fp);
+ fwrite(t_file, sizeof(double), 1, fp);
fwrite(tau, sizeof(double), 1, fp);
fwrite(itermax, sizeof(int), 1, fp);
(DIR) diff --git a/src/file_io.h b/src/file_io.h
t@@ -2,7 +2,7 @@
#define FILE_IO_H_
int read_file(char *path,
- double *t, double *t_end, double *tau, int *itermax,
+ double *t, double *t_end, double *t_file, double *tau, int *itermax,
double *epsilon, double *omega, double *gamma,
double *gx, double *gy, double *re,
int *w_left, int *w_right, int *w_top, int *w_bottom,
t@@ -11,7 +11,7 @@ int read_file(char *path,
double ***P, double ***U, double ***V);
int write_file(char *path,
- double *t, double *t_end, double *tau, int *itermax,
+ double *t, double *t_end, double *t_file, double *tau, int *itermax,
double *epsilon, double *omega, double *gamma,
double *gx, double *gy, double *re,
int *w_left, int *w_right, int *w_top, int *w_bottom,
(DIR) diff --git a/src/main.c b/src/main.c
t@@ -2,6 +2,7 @@
#include <stdlib.h>
#include <ctype.h>
#include <unistd.h>
+#include <string.h>
#include "file_io.h"
#include "utility.h"
t@@ -9,7 +10,7 @@
int main(int argc, char** argv)
{
- double t, t_end, tau;
+ double t, t_file, t_end, tau;
int itermax;
double epsilon, omega, gamma;
double gx, gy, re;
t@@ -20,6 +21,10 @@ int main(int argc, char** argv)
double dt;
long n = 0;
+ int nfile = 0;
+ double t_file_elapsed = 0.0;
+ char filename[50];
+ char *simulation_id;
int c;
while ((c = getopt(argc, argv, "hv")) != -1)
t@@ -51,7 +56,7 @@ int main(int argc, char** argv)
}
if (optind == argc - 1) {
- read_file(argv[optind], &t, &t_end, &tau, &itermax,
+ read_file(argv[optind], &t, &t_end, &t_file, &tau, &itermax,
&epsilon, &omega, &gamma,
&gx, &gy, &re, &w_left, &w_right, &w_top, &w_bottom,
&dx, &dy, &nx, &ny, &P, &U, &V);
t@@ -60,20 +65,31 @@ int main(int argc, char** argv)
return 1;
}
- /*write_file("unnamed2.dat", &t, &t_end, &tau, &itermax,
- &epsilon, &omega, &gamma,
- &gx, &gy, &re, &w_left, &w_right, &w_top, &w_bottom,
- &dx, &dy, &nx, &ny, &P, &U, &V);*/
+ simulation_id = argv[optind];
+ char* dot = strchr(simulation_id, '.');
+ dot = '\0';
- /*while (t < t_end) {*/
+ printf("%s\n", simulation_id);
+
+ while (t < t_end) {
dt = select_time_step(tau, re, dx, dy, nx, ny, U, V);
printf("dt = %f\n", dt);
- /*t += dt;
+ if (t_file_elapsed >= t_file) {
+ write_file("unnamed2.dat", &t, &t_end, &t_file, &tau, &itermax,
+ &epsilon, &omega, &gamma,
+ &gx, &gy, &re, &w_left, &w_right, &w_top, &w_bottom,
+ &dx, &dy, &nx, &ny, &P, &U, &V);
+ t_file_elapsed = 0.0;
+ }
+
+ t += dt;
n++;
- }*/
+ t_file_elapsed += dt;
+ break;
+ }
free_memory(P, U, V, nx);
return 0;
(DIR) diff --git a/src/utility.c b/src/utility.c
t@@ -68,6 +68,7 @@ double select_time_step(double tau, double re, double dx, double dy,
{
double t_diff, t_adv_u, t_adv_v;
double u_max, v_max;
+ double dt;
u_max = max_abs_value(U, nx, ny);
v_max = max_abs_value(V, nx, ny);
t@@ -75,5 +76,15 @@ double select_time_step(double tau, double re, double dx, double dy,
t_adv_u = dx/(u_max + 1.0e-12);
t_adv_v = dx/(v_max + 1.0e-12);
- return fmin(t_diff, fmin(t_adv_u, t_adv_v));
+ dt = fmin(t_diff, fmin(t_adv_u, t_adv_v));
+
+ if (dt < 1.0e-12) {
+ fprintf(stderr, "select_time_step: Error, the time step is too small: "
+ "%f s.\n"
+ "tau = %f, Re = %f, u_max = %f, v_max = %f\n"
+ "t_diff = %f s, t_adv_u = %f s, t_adv_v = %f s\n",
+ dt, tau, re, u_max, v_max, t_diff, t_adv_u, t_adv_v);
+ exit(1);
+ }
+ return dt;
}