URI: 
       tAdd option to override individual hydraulic parameters with bulk diffusivity - cngf-pf - continuum model for granular flows with pore-pressure dynamics (renamed from 1d_fd_simple_shear)
  HTML git clone git://src.adamsgaard.dk/cngf-pf
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 2cb92cd64835afb9dc1a294082002be1d68be92b
   DIR parent 6391e0cc4a3206ad3e68fc78031e6dae4d9b9d47
  HTML Author: Anders Damsgaard <anders@adamsgaard.dk>
       Date:   Thu,  9 Jul 2020 17:11:03 +0200
       
       Add option to override individual hydraulic parameters with bulk diffusivity
       
       Diffstat:
         M 1d_fd_simple_shear.1                |       6 ++++++
         M 1d_fd_simple_shear.c                |       4 ++++
         M fluid.c                             |      78 +++++++++++++++++++------------
         M max_depth_simple_shear.1            |       6 ++++++
         M max_depth_simple_shear.c            |      10 ++++++++--
         M simulation.c                        |       2 ++
         M simulation.h                        |       1 +
       
       7 files changed, 75 insertions(+), 32 deletions(-)
       ---
   DIR diff --git a/1d_fd_simple_shear.1 b/1d_fd_simple_shear.1
       t@@ -14,6 +14,7 @@
        .Op Fl b Ar grain-rate-dependence
        .Op Fl C Ar fluid-compressibility
        .Op Fl c Ar grain-cohesion
       +.Op Fl D Ar fluid-diffusivity
        .Op Fl d Ar grain-size
        .Op Fl e Ar end-time
        .Op Fl F
       t@@ -73,6 +74,11 @@ Only relevant with fluid dynamics enabled
        .Fl ( F ) .
        .It Fl c Ar grain-cohesion
        Granular material cohesion [Pa] (default 0).
       +.It Fl D Ar fluid-diffusivity
       +Fluid diffusion coefficient [m^2/s] (default -1). Overrides fluid
       +permeability (-k), grain compressibility (-P), fluid compressibility
       +(-C), and fluid viscosity (-i). Do not use for transient simulations
       +(-T).  Disabled when set to a negative value.
        .It Fl d Ar grain-size
        Granular material representative grain size [m] (default 0.04).
        .It Fl e Ar end-time
   DIR diff --git a/1d_fd_simple_shear.c b/1d_fd_simple_shear.c
       t@@ -28,6 +28,7 @@ usage(void)
                        "[-C fluid-compressibility] "
                        "[-c grain-cohesion] "
                        "[-d grain-size] "
       +                "[-D fluid-diffusivity] "
                        "[-e end-time] "
                        "[-F] "
                        "[-f applied-shear-friction] "
       t@@ -108,6 +109,9 @@ main(int argc, char *argv[])
                case 'd':
                        sim.d = atof(EARGF(usage()));
                        break;
       +        case 'D':
       +                sim.D = atof(EARGF(usage()));
       +                break;
                case 'e':
                        sim.t_end = atof(EARGF(usage()));
                        break;
   DIR diff --git a/fluid.c b/fluid.c
       t@@ -16,6 +16,14 @@ hydrostatic_fluid_pressure_distribution(struct simulation *sim)
                                * (sim->L_z - sim->z[i]);
        }
        
       +static double
       +diffusivity(struct simulation *sim, int i) {
       +        if (sim->D > 0.0)
       +                return sim->D;
       +        else
       +                return sim->k[i]/((sim->alpha + sim->phi[i] * sim->beta_f) * sim->mu_f);
       +}
       +
        /* Determines the largest time step for the current simulation state. Note
         * that the time step should be recalculated if cell sizes or
         * diffusivities (i.e., permeabilities, porosities, viscosities, or
       t@@ -43,7 +51,7 @@ set_largest_fluid_timestep(struct simulation *sim, const double safety)
        
                diff_max = -INFINITY;
                for (i = 0; i < sim->nz; ++i) {
       -                diff = sim->k[i] / ((sim->alpha + sim->phi[i] * sim->beta_f) * sim->mu_f);
       +                diff = diffusivity(sim, i);
                        if (diff > diff_max)
                                diff_max = diff;
                }
       t@@ -113,41 +121,49 @@ darcy_pressure_change_1d(const int i,
                                 const double dz,
                                 const double beta_f,
                                 const double alpha,
       -                         const double mu_f)
       +                         const double mu_f,
       +                         const double D)
        {
       -        double k_ = k[i], div_k_grad_p, k_zn, k_zp;
       -
       -        if (i == 0)
       -                k_zn = k_;
       -        else
       -                k_zn = k[i - 1];
       -        if (i == nz - 1)
       -                k_zp = k_;
       -        else
       -                k_zp = k[i + 1];
       +        double k_, div_k_grad_p, k_zn, k_zp;
       +
       +        if (D > 0.0)
       +                return D*(p_f_ghost_in[i + 2] - 2.0 * p_f_ghost_in[i + 1] - p_f_ghost_in[i])/(dz*dz);
       +
       +        else {
       +
       +                k_ = k[i];
       +                if (i == 0)
       +                        k_zn = k_;
       +                else
       +                        k_zn = k[i - 1];
       +                if (i == nz - 1)
       +                        k_zp = k_;
       +                else
       +                        k_zp = k[i + 1];
        #ifdef DEBUG
       -        printf("%d->%d: p=[%g, %g, %g]\tk=[%g, %g, %g]\n",
       -               i, i + 1,
       -               p_f_ghost_in[i], p_f_ghost_in[i + 1], p_f_ghost_in[i + 2],
       -               k_zn, k_, k_zp);
       +                printf("%d->%d: p=[%g, %g, %g]\tk=[%g, %g, %g]\n",
       +                           i, i + 1,
       +                           p_f_ghost_in[i], p_f_ghost_in[i + 1], p_f_ghost_in[i + 2],
       +                           k_zn, k_, k_zp);
        #endif
        
       -        div_k_grad_p = (2.0 * k_zp * k_ / (k_zp + k_)
       -                        * (p_f_ghost_in[i + 2]
       -                           - p_f_ghost_in[i + 1]) / dz
       -                        - 2.0 * k_zn * k_ / (k_zn + k_)
       -                        * (p_f_ghost_in[i + 1]
       -                           - p_f_ghost_in[i]) / dz
       -                ) / dz;
       +                div_k_grad_p = (2.0 * k_zp * k_ / (k_zp + k_)
       +                                * (p_f_ghost_in[i + 2]
       +                                   - p_f_ghost_in[i + 1]) / dz
       +                                - 2.0 * k_zn * k_ / (k_zn + k_)
       +                                * (p_f_ghost_in[i + 1]
       +                                   - p_f_ghost_in[i]) / dz
       +                        ) / dz;
        
        #ifdef DEBUG
       -        printf("darcy_pressure_change [%d]: phi=%g\tdiv_k_grad_p=%g\tphi_dot=%g\n",
       -               i, phi[i], div_k_grad_p, phi_dot[i]);
       +                printf("darcy_pressure_change [%d]: phi=%g\tdiv_k_grad_p=%g\tphi_dot=%g\n",
       +                           i, phi[i], div_k_grad_p, phi_dot[i]);
        #endif
        
       -        /* TODO: add advective term */
       -        return 1.0 / ((alpha + beta_f * phi[i]) * mu_f) * div_k_grad_p
       -                - 1.0 / ((alpha + beta_f * phi[i]) * (1.0 - phi[i])) * phi_dot[i];
       +                /* TODO: add advective term */
       +                return 1.0 / ((alpha + beta_f * phi[i]) * mu_f) * div_k_grad_p
       +                        - 1.0 / ((alpha + beta_f * phi[i]) * (1.0 - phi[i])) * phi_dot[i];
       +        }
        }
        
        int
       t@@ -207,7 +223,8 @@ darcy_solver_1d(struct simulation *sim,
                                                                           sim->dz,
                                                                           sim->beta_f,
                                                                           sim->alpha,
       -                                                                   sim->mu_f);
       +                                                                   sim->mu_f,
       +                                                                                                           sim->D);
                }
                if (epsilon > 0.0) {
                        /* compute implicit solution with Jacobian iterations */
       t@@ -236,7 +253,8 @@ darcy_solver_1d(struct simulation *sim,
                                                                                   sim->dz,
                                                                                   sim->beta_f,
                                                                                   sim->alpha,
       -                                                                           sim->mu_f);
       +                                                                           sim->mu_f,
       +                                                                                                                   sim->D);
        
                                for (i = 0; i < sim->nz - 1; ++i) {
        #ifdef DEBUG
   DIR diff --git a/max_depth_simple_shear.1 b/max_depth_simple_shear.1
       t@@ -8,6 +8,7 @@
        .Nm
        .Op Fl a Ar fluid-pressure-ampl
        .Op Fl C Ar fluid-compressibility
       +.Op Fl D Ar fluid-diffusivity
        .Op Fl g Ar gravity-accel
        .Op Fl h
        .Op Fl i Ar fluid-viscosity
       t@@ -35,6 +36,11 @@ and are as follows:
        Amplitude of fluid-pressure perturbations [Pa] (default 0).
        .It Fl C Ar fluid-compressibility
        Fluid adiabatic compressibility [Pa^-1] (default 3.9e-10).
       +.It Fl D Ar fluid-diffusivity
       +Fluid diffusion coefficient [m^2/s] (default -1). Overrides fluid
       +permeability (-k), grain compressibility (-P), fluid compressibility
       +(-C), and fluid viscosity (-i). Disabled when set to a negative
       +value.
        .It Fl g Ar gravity-accel
        Gravity magnitude [m/s^2] (default 9.81).
        .It Fl h
   DIR diff --git a/max_depth_simple_shear.c b/max_depth_simple_shear.c
       t@@ -29,6 +29,7 @@ usage(void)
                fprintf(stderr, "usage: %s "
                        "[-a fluid-pressure-ampl] "
                        "[-C fluid-compressibility] "
       +                "[-D fluid-diffusivity] "
                        "[-g gravity-accel] "
                        "[-h] "
                        "[-i fluid-viscosity] "
       t@@ -47,8 +48,10 @@ usage(void)
        static double
        skin_depth(const struct simulation *sim)
        {
       -        return sqrt(sim->k[0] /
       -        (sim->mu_f * (sim->alpha + sim->phi[0] * sim->beta_f) * M_PI * sim->p_f_mod_freq));
       +        if (sim->D > 0.0)
       +                return sqrt(sim->D * M_PI * sim->p_f_mod_freq);
       +        else
       +                return sqrt(sim->k[0] / (sim->mu_f * (sim->alpha + sim->phi[0] * sim->beta_f) * M_PI * sim->p_f_mod_freq));
        }
        
        /* using alternate form: sin(x) + cos(x) = sqrt(2)*sin(x + pi/4) */
       t@@ -186,6 +189,9 @@ main(int argc, char *argv[])
                case 'C':
                        sim.beta_f = atof(EARGF(usage()));
                        break;
       +        case 'D':
       +                sim.D = atof(EARGF(usage()));
       +                break;
                case 'g':
                        sim.G = atof(EARGF(usage()));
                        break;
   DIR diff --git a/simulation.c b/simulation.c
       t@@ -107,6 +107,8 @@ init_sim(struct simulation *sim)
        
                sim->alpha = 1e-8;
        
       +        sim->D = -1.0;        /* disabled when negative */
       +
                /* Damsgaard et al 2015 */
                sim->k = initval(1.9e-15, 1);
        
   DIR diff --git a/simulation.h b/simulation.h
       t@@ -98,6 +98,7 @@ struct simulation {
                double alpha;        /* adiabatic grain compressibility [Pa^-1] */
                double mu_f;          /* fluid dynamic viscosity [Pa*s] */
                double rho_f;         /* fluid density [kg/m^3] */
       +        double D;             /* diffusivity [m^2/s], overrides k, beta_f, alpha, mu_f */
        
                /* arrays */
                double *mu;           /* static yield friction [-] */