tAdd cohesion as argument and in granular flow computations - cngf-pf - continuum model for granular flows with pore-pressure dynamics (renamed from 1d_fd_simple_shear)
 (HTM) git clone git://src.adamsgaard.dk/cngf-pf
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 6849a3075184bf86a78f553945099b8c3c250d58
 (DIR) parent 4d51b11991631dd7cb45ee6395c5288268bab329
 (HTM) 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:
         M main.c                              |       8 +++++++-
         M parameter_defaults.h                |       1 +
         M simulation.c                        |      40 +++++++++++++++++++++++--------
         M simulation.h                        |       3 +++
       
       4 files changed, 41 insertions(+), 11 deletions(-)
       ---
 (DIR) diff --git a/main.c b/main.c
       t@@ -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"
       t@@ -57,6 +58,7 @@ usage(void)
                        sim.A,
                        sim.b,
                        sim.mu_s,
       +                sim.C,
                        sim.phi[0],
                        sim.d,
                        sim.rho_s,
       t@@ -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'},
       t@@ -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'},
       t@@ -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;
 (DIR) diff --git a/parameter_defaults.h b/parameter_defaults.h
       t@@ -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 */
        
 (DIR) diff --git a/simulation.c b/simulation.c
       t@@ -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,
       t@@ -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)
       t@@ -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
       t@@ -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
       t@@ -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);
       t@@ -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,
       t@@ -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)
       t@@ -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);
        
       t@@ -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);
 (DIR) diff --git a/simulation.h b/simulation.h
       t@@ -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;