1d_fd_simple_shear

Continuum model for granular flows with pore-pressure dynamics
git clone git://src.adamsgaard.dk/1d_fd_simple_shear
Log | Files | Refs | README | LICENSE

commit 6849a3075184bf86a78f553945099b8c3c250d58
parent 4d51b11991631dd7cb45ee6395c5288268bab329
Author: Anders Damsgaard <anders@adamsgaard.dk>
Date:   Mon,  8 Jul 2019 12:19:07 +0200

Add cohesion as argument and in granular flow computations

Diffstat:
Mmain.c | 8+++++++-
Mparameter_defaults.h | 1+
Msimulation.c | 40++++++++++++++++++++++++++++++----------
Msimulation.h | 3+++
4 files changed, 41 insertions(+), 11 deletions(-)

diff --git a/main.c b/main.c @@ -30,6 +30,7 @@ usage(void) " -A, --nonlocal-amplitude VAL amplitude of nonlocality [-] (default %g)\n" " -b, --rate-dependence VAL rate dependence beyond yield [-] (default %g)\n" " -f, --friction-coefficient VAL grain friction coefficient [-] (default %g)\n" + " -C, --cohesion VAL grain cohesion [Pa] (default %g)\n" " -p, --porosity VAL porosity fraction [-] (default %g)\n" " -d, --grain-size VAL representative grain size [m] (default %g)\n" " -r, --density VAL grain material density [kg/m^3] (default %g)\n" @@ -57,6 +58,7 @@ usage(void) sim.A, sim.b, sim.mu_s, + sim.C, sim.phi[0], sim.d, sim.rho_s, @@ -102,7 +104,7 @@ main(int argc, char* argv[]) norm = 0; - optstring = "hvNn:G:P:m:V:A:b:f:Fp:d:r:o:L:c:i:R:k:O:a:q:H:t:T:D:I:"; + optstring = "hvNn:G:P:m:V:A:b:f:C:Fp:d:r:o:L:c:i:R:k:O:a:q:H:t:T:D:I:"; const struct option longopts[] = { {"help", no_argument, NULL, 'h'}, {"version", no_argument, NULL, 'v'}, @@ -114,6 +116,7 @@ main(int argc, char* argv[]) {"nonlocal-amplitude", required_argument, NULL, 'A'}, {"rate-dependence", required_argument, NULL, 'b'}, {"friction-coefficient", required_argument, NULL, 'f'}, + {"cohesion", required_argument, NULL, 'C'}, {"porosity", required_argument, NULL, 'p'}, {"grain-size", required_argument, NULL, 'd'}, {"density", required_argument, NULL, 'r'}, @@ -180,6 +183,9 @@ main(int argc, char* argv[]) case 'f': sim.mu_s = atof(optarg); break; + case 'C': + sim.C = atof(optarg); + break; case 'p': new_phi = atof(optarg); break; diff --git a/parameter_defaults.h b/parameter_defaults.h @@ -32,6 +32,7 @@ struct simulation init_sim(void) sim.b = 0.9377; /* Henann and Kamrin 2016 */ sim.mu_s = atan(DEG2RAD(22.0)); /* Damsgaard et al 2013 */ + sim.C = 0.0; /* Damsgaard et al 2013 */ sim.phi = initval(0.25, 1); /* Damsgaard et al 2013 */ diff --git a/simulation.c b/simulation.c @@ -99,6 +99,11 @@ check_simulation_parameters(const struct simulation* sim) warn_parameter_value("sim.mu_s is negative", sim->mu_s, &return_status); + check_float("sim.C", sim->C, &return_status); + if (sim->C < 0.0) + warn_parameter_value("sim.C is negative", sim->C, + &return_status); + check_float("sim.d", sim->d, &return_status); if (sim->d <= 0.0) warn_parameter_value("sim.d is not a positive number", sim->d, @@ -163,6 +168,11 @@ check_simulation_parameters(const struct simulation* sim) if (sim->p_f_mod_ampl < 0.0) warn_parameter_value("sim.p_f_mod_ampl is not a zero or positive", sim->p_f_mod_ampl, &return_status); + + if (sim->P_wall - sim->p_f_mod_ampl < 0.0) + warn_parameter_value("sim.P_wall - sim.p_f_mod_ampl is negative", + sim->P_wall - sim->p_f_mod_ampl, + &return_status); check_float("sim.p_f_mod_freq", sim->p_f_mod_freq, &return_status); if (sim->p_f_mod_freq < 0.0) @@ -261,13 +271,15 @@ compute_effective_stress(struct simulation* sim) sim->sigma_n_eff[i] = sim->sigma_n[i]; } -double +static double cooperativity_length(const double A, const double d, const double mu, - const double mu_s) + const double p, + const double mu_s, + const double C) { - return A*d/sqrt(fabs(mu - mu_s)); + return A*d/sqrt(fabs((mu - C/p) - mu_s)); } void @@ -275,22 +287,27 @@ compute_cooperativity_length(struct simulation* sim) { int i; for (i=0; i<sim->nz; ++i) - sim->xi[i] = cooperativity_length(sim->A, sim->d, sim->mu[i], - sim->mu_s); + sim->xi[i] = cooperativity_length(sim->A, + sim->d, + sim->mu[i], + sim->sigma_n_eff[i], + sim->mu_s, + sim->C); } -double +static double local_fluidity(const double p, const double mu, const double mu_s, + const double C, const double b, const double rho_s, const double d) { - if (mu <= mu_s) + if (mu - C/p <= mu_s) return 0.0; else - return sqrt(p/rho_s*d*d) * (mu - mu_s)/(b*mu); + return sqrt(p/rho_s*d*d) * ((mu - C/p) - mu_s)/(b*mu); } void @@ -301,6 +318,7 @@ compute_local_fluidity(struct simulation* sim) sim->g_ghost[idx1g(i)] = local_fluidity(sim->sigma_n_eff[i], sim->mu[i], sim->mu_s, + sim->C, sim->b, sim->rho_s, sim->d); @@ -339,7 +357,7 @@ set_bc_dirichlet(double* g_ghost, } } -void +static void poisson_solver_1d_cell_update(int i, const double* g_in, double* g_out, @@ -349,6 +367,7 @@ poisson_solver_1d_cell_update(int i, const double* p, const double* xi, const double mu_s, + const double C, const double b, const double rho_s, const double d) @@ -359,7 +378,7 @@ poisson_solver_1d_cell_update(int i, coorp_term = dz*dz/(2.0*pow(xi[i], 2.0)); gi = idx1g(i); g_out[gi] = 1.0/(1.0 + coorp_term)*(coorp_term* - local_fluidity(p[i], mu[i], mu_s, b, rho_s, d) + local_fluidity(p[i], mu[i], mu_s, C, b, rho_s, d) + g_in[gi+1]/2.0 + g_in[gi-1]/2.0); @@ -409,6 +428,7 @@ implicit_1d_jacobian_poisson_solver(struct simulation* sim, sim->sigma_n_eff, sim->xi, sim->mu_s, + sim->C, sim->b, sim->rho_s, sim->d); diff --git a/simulation.h b/simulation.h @@ -33,6 +33,9 @@ struct simulation { /* bulk and critical state static yield friction coefficient [-] */ double mu_s; + /* material cohesion [Pa] */ + double C; + /* representative grain size [m] */ double d;