tAdd unfinished implementation in C - cngf-pf - continuum model for granular fl… | |
git clone git://src.adamsgaard.dk/cngf-pf | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 461dca87e55ffa2b46791b589f65cb3b050b533f | |
parent 4e12789481a70d5f222312b833524be5d19963e2 | |
Author: Anders Damsgaard <[email protected]> | |
Date: Fri, 5 Apr 2019 13:32:41 +0200 | |
Add unfinished implementation in C | |
Diffstat: | |
A 1d_fd_simple_shear_damsgaard2013.h | 69 ++++++++++++++++++++++++++++++ | |
A 1d_fd_simple_shear_henann_kamrin20… | 35 +++++++++++++++++++++++++++… | |
A arrays.c | 65 +++++++++++++++++++++++++++++… | |
A arrays.h | 22 ++++++++++++++++++++++ | |
A main.c | 18 ++++++++++++++++++ | |
A simulation.c | 32 +++++++++++++++++++++++++++++… | |
A simulation.h | 66 +++++++++++++++++++++++++++++… | |
7 files changed, 307 insertions(+), 0 deletions(-) | |
--- | |
diff --git a/1d_fd_simple_shear_damsgaard2013.h b/1d_fd_simple_shear_damsgaard2… | |
t@@ -0,0 +1,69 @@ | |
+#ifndef ONED_FD_SIMPLE_SHEAR_ | |
+#define ONED_FD_SIMPLE_SHEAR_ | |
+ | |
+#include <math.h> | |
+#include "arrays.h" | |
+#include "simulation.h" | |
+ | |
+#define PI 3.14159265358979323846 | |
+#define DEG2RAD(x) (x*PI/180.0) | |
+ | |
+/* Simulation settings */ | |
+struct simulation init_sim(void) | |
+{ | |
+ struct simulation sim; | |
+ | |
+ sim.G = 9.81; | |
+ | |
+ sim.P_wall = 10e3; /* larger normal stress deepens the deformational depth… | |
+ sim.mu_wall = 0.40; | |
+ | |
+ sim.nz = 100; | |
+ | |
+ /* lower values of A mean that the velocity curve can have sharper curves, | |
+ * e.g. at the transition from μ ≈ μ_s */ | |
+ //sim.A = 0.48; /* Henann and Kamrin 2016 */ | |
+ sim.A = 0.40; /* Loose fit to Damsgaard et al 2013 */ | |
+ | |
+ /* lower values of b mean larger shear velocity for a given stress ratio a… | |
+ /* yield */ | |
+ sim.b = 0.9377; /* Henann and Kamrin 2016 */ | |
+ | |
+ /*sim.mu_s = 0.3819; // Henann and Kamrin 2016 */ | |
+ sim.mu_s = atan(DEG2RAD(22.0)); /* Damsgaard et al 2013 */ | |
+ | |
+ /*sim.phi = 0.38; // Henann and Kamrin 2016 */ | |
+ sim.phi = 0.25; /* Damsgaard et al 2013 */ | |
+ | |
+ /* lower values of d mean that the shear velocity curve can have sharper | |
+ * curves, e.g. at the transition from μ ≈ μ_s */ | |
+ /*sim.d = 1e-3; // Henann and Kamrin 2016 */ | |
+ sim.d = 0.04; /* Damsgaard et al 2013 */ | |
+ | |
+ /* grain material density [kg/m^3] */ | |
+ /*sim.rho_s = 2.485e3; // Henann and Kamrin 2016 */ | |
+ sim.rho_s = 2.6e3; /* Damsgaard et al 2013 */ | |
+ | |
+ /* Spatial settings */ | |
+ sim.origo_z = 0.0; | |
+ /*sim.L_z = 20.0*d; // Henann and Kamrin 2016 */ | |
+ sim.L_z = 0.7; /* Damsgaard et al 2013 */ | |
+ | |
+ return sim; | |
+} | |
+ | |
+void init_pressure(struct simulation* sim) | |
+{ | |
+ for (int i=0; i<sim->nz; ++i) | |
+ sim->p[i] = sim->P_wall + | |
+ (1.0 - sim->phi)*sim->rho_s*sim->G*(sim->L_z - sim->z[i]); | |
+} | |
+ | |
+void init_friction(struct simulation* sim) | |
+{ | |
+ for (int i=0; i<sim->nz; ++i) | |
+ sim->mu[i] = sim->mu_wall / | |
+ (1.0 + (1.0 - sim->phi)*sim->rho_s*sim->G*(sim->L_z - sim->z[i])); | |
+} | |
+ | |
+#endif | |
diff --git a/1d_fd_simple_shear_henann_kamrin2016.h b/1d_fd_simple_shear_henann… | |
t@@ -0,0 +1,35 @@ | |
+#ifndef ONED_FD_SIMPLE_SHEAR_ | |
+#define ONED_FD_SIMPLE_SHEAR_ | |
+ | |
+#include <math.h> | |
+#include "arrays.h" | |
+#include "simulation.h" | |
+ | |
+#define DEG2RAD(x) (x*M_PI/180.0) | |
+ | |
+/* Simulation settings */ | |
+struct simulation init_sim(void) | |
+{ | |
+ struct simulation sim; | |
+ | |
+ sim.G = 9.81; | |
+ | |
+ sim.P_wall = 10e3; /* larger normal stress deepens the deformational depth… | |
+ sim.mu_wall = 0.40; | |
+ | |
+ sim.nz = 100; | |
+ | |
+ sim.A = 0.48; | |
+ sim.b = 0.9377; | |
+ sim.mu_s = 0.3819; | |
+ sim.phi = 0.38; | |
+ sim.d = 1e-3; | |
+ sim.rho_s = 2.485e3; | |
+ | |
+ sim.origo_z = 0.0; | |
+ sim.L_z = 20.0*sim.d; | |
+ | |
+ return sim; | |
+} | |
+ | |
+#endif | |
diff --git a/arrays.c b/arrays.c | |
t@@ -0,0 +1,65 @@ | |
+#include <stdlib.h> | |
+ | |
+#define DEG2RAD(x) (x*M_PI/180.0) | |
+ | |
+// Translate a i,j,k index in grid with dimensions nx, ny, nz into a linear | |
+// index | |
+unsigned int idx3( | |
+ const unsigned int i, const unsigned int j, const unsigned int k, | |
+ const unsigned int nx, const unsigned int ny) | |
+{ | |
+ return i + nx*j + nx*ny*k; | |
+} | |
+ | |
+// Translate a i,j,k index in grid with dimensions nx, ny, nz and a padding of | |
+// single ghost nodes into a linear index | |
+unsigned int idx3g( | |
+ const unsigned int i, const unsigned int j, const unsigned int k, | |
+ const unsigned int nx, const unsigned int ny) | |
+{ | |
+ return i+1 + (nx+2)*(j+1) + (nx+2)*(ny+2)*(k+1); | |
+} | |
+ | |
+// Translate a i,j index in grid with dimensions nx, ny into a linear index | |
+unsigned int idx2( | |
+ const unsigned int i, const unsigned int j, const unsigned int nx) | |
+{ | |
+ return i + nx*j; | |
+} | |
+ | |
+// Translate a i,j index in grid with dimensions nx, ny and a padding of single | |
+// ghost nodes into a linear index | |
+unsigned int idx2g( | |
+ const unsigned int i, const unsigned int j, const unsigned int nx) | |
+{ | |
+ return i+1 + (nx+2)*(j+1); | |
+} | |
+ | |
+// Return an array of `n` linearly spaced values in the range [lower; upper] | |
+double* linspace(const double lower, const double upper, const int n) | |
+{ | |
+ double *x = malloc(n*sizeof(double)); | |
+ double dx = (upper - lower)/(double)n; | |
+ for (int i=0; i<n; ++i) | |
+ x[i] = lower + dx*i; | |
+ return x; | |
+} | |
+ | |
+// Return an array of `n` values with the value 0.0 | |
+double* zeros(const double n) | |
+{ | |
+ double *x = malloc(n*sizeof(double)); | |
+ for (int i=0; i<n; ++i) | |
+ x[i] = 0.0; | |
+ return x; | |
+} | |
+ | |
+// Return an array of `n` values with the value 1.0 | |
+double* ones(const double n) | |
+{ | |
+ double *x = malloc(n*sizeof(double)); | |
+ for (int i=0; i<n; ++i) | |
+ x[i] = 1.0; | |
+ return x; | |
+} | |
+ | |
diff --git a/arrays.h b/arrays.h | |
t@@ -0,0 +1,22 @@ | |
+#ifndef ARRAYS_ | |
+#define ARRAYS_ | |
+ | |
+unsigned int idx3( | |
+ const unsigned int i, const unsigned int j, const unsigned int k, | |
+ const unsigned int nx, const unsigned int ny); | |
+ | |
+unsigned int idx3g( | |
+ const unsigned int i, const unsigned int j, const unsigned int k, | |
+ const unsigned int nx, const unsigned int ny); | |
+ | |
+unsigned int idx2( | |
+ const unsigned int i, const unsigned int j, const unsigned int nx); | |
+ | |
+unsigned int idx2g( | |
+ const unsigned int i, const unsigned int j, const unsigned int nx); | |
+ | |
+double* linspace(const double lower, const double upper, const int n); | |
+double* zeros(const double n); | |
+double* ones(const double n); | |
+ | |
+#endif | |
diff --git a/main.c b/main.c | |
t@@ -0,0 +1,18 @@ | |
+#include <stdio.h> | |
+#include <math.h> | |
+ | |
+#include "simulation.h" | |
+ | |
+/* set up parameter values for this simulation */ | |
+#include "1d_fd_simple_shear_damsgaard2013.h" | |
+/* #include "1d_fd_simple_shear_henann_kamrin2016.h" */ | |
+ | |
+ | |
+int main(int argc, char** argv) { | |
+ | |
+ struct simulation sim = init_sim(); | |
+ prepare_arrays(&sim); | |
+ | |
+ free_arrays(&sim); | |
+ return 0; | |
+} | |
diff --git a/simulation.c b/simulation.c | |
t@@ -0,0 +1,32 @@ | |
+#include <stdlib.h> | |
+#include "arrays.h" | |
+#include "simulation.h" | |
+ | |
+void prepare_arrays(struct simulation* sim) | |
+{ | |
+ sim->z = linspace(sim->origo_z, sim->L_z, sim->nz); /* spatial coordinates… | |
+ sim->dz = sim->z[1] - sim->z[0]; /* cell spacing */ | |
+ sim->mu = zeros(sim->nz); /* local stress ratio */ | |
+ sim->p = zeros(sim->nz); /* local pressure */ | |
+ sim->v_x = zeros(sim->nz); /* local shear velocity */ | |
+ sim->g_ghost = zeros(sim->nz+2); /* local fluidity with ghost nodes */ | |
+} | |
+ | |
+void free_arrays(struct simulation* sim) | |
+{ | |
+ free(sim->z); | |
+ free(sim->mu); | |
+ free(sim->p); | |
+ free(sim->v_x); | |
+ free(sim->g_ghost); | |
+} | |
+ | |
+void shear_strain_rate_plastic( | |
+ const double* fluidity, | |
+ const double* friction, | |
+ double* shear_strain_rate, | |
+ const int n) | |
+{ | |
+ for (int i=0; i<n; ++i) | |
+ shear_strain_rate[i] = fluidity[i]*friction[i]; | |
+} | |
diff --git a/simulation.h b/simulation.h | |
t@@ -0,0 +1,66 @@ | |
+#ifndef SIMULATION_ | |
+#define SIMULATION_ | |
+ | |
+#include <math.h> | |
+#include "arrays.h" | |
+ | |
+/* Simulation settings */ | |
+struct simulation { | |
+ | |
+ /* gravitational acceleration magnitude [m/s^2] */ | |
+ double G; | |
+ | |
+ /* wall parameters */ | |
+ double P_wall; // normal stress from top wall [Pa] | |
+ | |
+ /* bottom velocity along x [m/s] */ | |
+ double v_x_bot; | |
+ | |
+ /* stress ratio at top wall */ | |
+ double mu_wall; | |
+ | |
+ /* nonlocal amplitude [-] */ | |
+ double A; | |
+ | |
+ /* rate dependence beyond yield [-] */ | |
+ double b; | |
+ | |
+ /* bulk and critical state static yield friction coefficient [-] */ | |
+ double mu_s; | |
+ | |
+ /* porosity [-] */ | |
+ double phi; | |
+ | |
+ /* representative grain size [m] */ | |
+ double d; | |
+ | |
+ /* grain material density [kg/m^3] */ | |
+ double rho_s; | |
+ | |
+ /* nodes along z */ | |
+ int nz; | |
+ | |
+ /* origo of axis */ | |
+ double origo_z; | |
+ | |
+ /* length of domain */ | |
+ double L_z; | |
+ | |
+ /* array of cell coordinates */ | |
+ double* z; | |
+ | |
+ /* cell spacin */ | |
+ double dz; | |
+ | |
+ /* other arrays */ | |
+ double* mu; | |
+ double* p; | |
+ double* v_x; | |
+ double* g_ghost; | |
+}; | |
+ | |
+ | |
+void prepare_arrays(struct simulation* sim); | |
+void free_arrays(struct simulation* sim); | |
+ | |
+#endif |