tAdd automatic timestep - cngf-pf - continuum model for granular flows with por… | |
git clone git://src.adamsgaard.dk/cngf-pf | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 7b1e7bc6cab88ecaeb000a5c84ff018460b22387 | |
parent 7dd82629ef1e91bacda6383fc6223e4c806e4049 | |
Author: Anders Damsgaard <[email protected]> | |
Date: Fri, 28 Jun 2019 10:34:43 +0200 | |
Add automatic timestep | |
Diffstat: | |
M arrays.c | 13 +++++++++++++ | |
M arrays.h | 1 + | |
M fluid.c | 16 ++++++++++++---- | |
3 files changed, 26 insertions(+), 4 deletions(-) | |
--- | |
diff --git a/arrays.c b/arrays.c | |
t@@ -65,6 +65,19 @@ linspace(const double lower, const double upper, const int … | |
return x; | |
} | |
+/* Return an array of `n-1` values with the intervals between `x` values */ | |
+double* | |
+spacing(const double* x, const int n) | |
+{ | |
+ int i; | |
+ double *dx; | |
+ | |
+ dx = malloc((n-1)*sizeof(double)); | |
+ for (i=0; i<n-1; ++i) | |
+ dx[i] = x[i+i] - x[i]; | |
+ return dx; | |
+} | |
+ | |
/* Return an array of `n` values with the value 0.0 */ | |
double* | |
zeros(const int n) | |
diff --git a/arrays.h b/arrays.h | |
t@@ -19,6 +19,7 @@ unsigned int idx2g( | |
unsigned int idx1g(const unsigned int i); | |
+double* spacing(const double* x, const int n); | |
double* linspace(const double lower, const double upper, const int n); | |
double* zeros(const int n); | |
double* ones(const int n); | |
diff --git a/fluid.c b/fluid.c | |
t@@ -20,13 +20,21 @@ hydrostatic_fluid_pressure_distribution(struct simulation*… | |
void | |
set_largest_fluid_timestep(struct simulation* sim, const double safety) | |
{ | |
- double dx_min, diff_max; | |
+ int i; | |
+ double dx_min, diff, diff_max; | |
+ double *dx; | |
- /* determine smallest cell size */ | |
- dx_min = 0.0; | |
+ dx = spacing(sim->z, sim->nz); | |
+ dx_min = INFINITY; | |
+ for (i=0; i<sim->nz-1; ++i) | |
+ if (dx[i] < dx_min) dx_min = dx[i]; | |
/* determine largest diffusion size */ | |
- diff_max = 0.0; | |
+ diff_max = -INFINITY; | |
+ for (i=0; i<sim->nz; ++i) { | |
+ diff = sim->k[i]/(sim->phi[i]*sim->beta_f*sim->mu_f); | |
+ if (diff > diff_max) diff_max = diff; | |
+ } | |
sim->dt = safety*0.5*dx_min*dx_min/diff_max; | |
} |