cngf-pf

continuum model for granular flows with pore-pressure dynamics (renamed from 1d_fd_simple_shear)
git clone git://src.adamsgaard.dk/cngf-pf # fast
git clone https://src.adamsgaard.dk/cngf-pf.git # slow
Log | Files | Refs | README | LICENSE Back to index

commit e31d3345807d0cb55f417a1955a601fa4ee8b14f
parent f36482758fdcf502bc8934b5a14aa13604d01d7b
Author: Anders Damsgaard <anders@adamsgaard.dk>
Date:   Wed, 18 Nov 2020 10:28:15 +0100

fix transient porosity computations

Diffstat:
Mcngf-pf.1 | 4++--
Mcngf-pf.c | 3+--
Msimulation.c | 105+++++++++++++++++++++++++++++++++++++++++++++++--------------------------------
Msimulation.h | 22++++------------------
4 files changed, 70 insertions(+), 64 deletions(-)

diff --git a/cngf-pf.1 b/cngf-pf.1 @@ -108,8 +108,8 @@ Fluid dynamic viscosity [Pa*s] (1.787e-3). Only relevant with fluid dynamics enabled .Fl ( F ) . .It Fl K Ar dilatancy-constant -Factor relating dilatancy and shear stress [TODO] (default 1.0). -Only relevant with transient granular dynamics enabled +Factor relating dilatancy angle to the volume fraction [-] (default +4.09). Only relevant with transient granular dynamics enabled .Fl ( T ) . .It Fl k Ar fluid-permeability Darcian intrinsic permeability of granular material [m^2] (default diff --git a/cngf-pf.c b/cngf-pf.c @@ -137,7 +137,7 @@ main(int argc, char *argv[]) sim.mu_f = atof(EARGF(usage())); break; case 'K': - sim.dilatancy_angle = atof(EARGF(usage())); + sim.dilatancy_constant = atof(EARGF(usage())); break; case 'k': new_k = atof(EARGF(usage())); @@ -280,7 +280,6 @@ main(int argc, char *argv[]) write_output_file(&sim, normalize); filetimeclock = 0.0; } - sim.t += sim.dt; filetimeclock += sim.dt; iter++; diff --git a/simulation.c b/simulation.c @@ -58,7 +58,7 @@ init_sim(struct simulation *sim) sim->transient = 0; sim->phi_min = 0.20; sim->phi_max = 0.55; - sim->dilatancy_angle = 1.0; + sim->dilatancy_constant = 4.09; /* Pailha & Pouliquen 2009 */ /* Iverson et al 1997, 1998: Storglaciaren till */ /* sim->mu_s = tan(DEG2RAD(26.3)); */ @@ -141,26 +141,27 @@ prepare_arrays(struct simulation *sim) free(sim->phi); free(sim->k); - sim->z = linspace(sim->origo_z, /* spatial coordinates */ + sim->z = linspace(sim->origo_z, /* spatial coordinates */ sim->origo_z + sim->L_z, sim->nz); - sim->dz = sim->z[1] - sim->z[0]; /* cell spacing */ - sim->mu = zeros(sim->nz); /* stress ratio */ - sim->mu_c = zeros(sim->nz); /* critical-state stress ratio */ - sim->sigma_n_eff = zeros(sim->nz); /* effective normal stress */ - sim->sigma_n = zeros(sim->nz); /* normal stess */ + sim->dz = sim->z[1] - sim->z[0]; /* cell spacing */ + sim->mu = zeros(sim->nz); /* stress ratio */ + sim->mu_c = zeros(sim->nz); /* critical-state stress ratio */ + sim->sigma_n_eff = zeros(sim->nz); /* effective normal stress */ + sim->sigma_n = zeros(sim->nz); /* normal stess */ sim->p_f_ghost = zeros(sim->nz + 2); /* fluid pressure with ghost nodes */ - sim->phi = zeros(sim->nz); /* porosity */ - sim->phi_c = zeros(sim->nz); /* critical-state porosity */ - sim->phi_dot = zeros(sim->nz); /* rate of porosity change */ - sim->k = zeros(sim->nz);/* permeability */ - sim->xi = zeros(sim->nz); /* cooperativity length */ - sim->gamma_dot_p = zeros(sim->nz); /* shear velocity */ - sim->v_x = zeros(sim->nz); /* shear velocity */ - sim->g_local = zeros(sim->nz); /* local fluidity */ - sim->g_ghost = zeros(sim->nz + 2); /* fluidity with ghost nodes */ - sim->I = zeros(sim->nz);/* inertia number */ - sim->tan_psi = zeros(sim->nz); /* tan(dilatancy_angle) */ + sim->p_f_dot = zeros(sim->nz); /* fluid pressure change */ + sim->phi = zeros(sim->nz); /* porosity */ + sim->phi_c = zeros(sim->nz); /* critical-state porosity */ + sim->phi_dot = zeros(sim->nz); /* rate of porosity change */ + sim->k = zeros(sim->nz); /* permeability */ + sim->xi = zeros(sim->nz); /* cooperativity length */ + sim->gamma_dot_p = zeros(sim->nz); /* shear velocity */ + sim->v_x = zeros(sim->nz); /* shear velocity */ + sim->g_local = zeros(sim->nz); /* local fluidity */ + sim->g_ghost = zeros(sim->nz + 2); /* fluidity with ghost nodes */ + sim->I = zeros(sim->nz); /* inertia number */ + sim->tan_psi = zeros(sim->nz); /* tan(dilatancy_angle) */ } void @@ -172,6 +173,7 @@ free_arrays(struct simulation *sim) free(sim->sigma_n_eff); free(sim->sigma_n); free(sim->p_f_ghost); + free(sim->p_f_dot); free(sim->k); free(sim->phi); free(sim->phi_c); @@ -317,10 +319,10 @@ check_simulation_parameters(struct simulation *sim) warn_parameter_value("sim->phi_max is not within [0;1]", sim->phi_max, &return_status); - check_float("sim->dilatancy_angle", sim->dilatancy_angle, &return_status); - if (sim->dilatancy_angle < 0.0 || sim->dilatancy_angle > 100.0) - warn_parameter_value("sim->dilatancy_angle is not within [0;100]", - sim->dilatancy_angle, &return_status); + check_float("sim->dilatancy_constant", sim->dilatancy_constant, &return_status); + if (sim->dilatancy_constant < 0.0 || sim->dilatancy_constant > 100.0) + warn_parameter_value("sim->dilatancy_constant is not within [0;100]", + sim->dilatancy_constant, &return_status); if (sim->fluid != 0 && sim->fluid != 1) warn_parameter_value("sim->fluid has an invalid value", @@ -407,7 +409,8 @@ compute_critical_state_porosity(struct simulation *sim) int i; for (i = 0; i < sim->nz; ++i) - sim->phi_c[i] = sim->phi_min + (sim->phi_max - sim->phi_min) *sim->I[i]; + sim->phi_c[i] = sim->phi_min + + (sim->phi_max - sim->phi_min) * sim->I[i]; } void @@ -426,40 +429,38 @@ compute_critical_state_friction(struct simulation *sim) (sim->L_z - sim->z[i]) / sim->P_wall); } -void +static void compute_friction(struct simulation *sim) { int i; if (sim->transient) for (i = 0; i < sim->nz; ++i) - sim->mu[i] = sim->tan_psi[i] + sim->mu_c[i]; + sim->mu[i] = sim->mu_c[i] - sim->tan_psi[i]; else for (i = 0; i < sim->nz; ++i) sim->mu[i] = sim->mu_c[i]; } -void +static void compute_tan_dilatancy_angle(struct simulation *sim) { int i; for (i = 0; i < sim->nz; ++i) - sim->tan_psi[i] = sim->dilatancy_angle * (sim->phi_c[i] - sim->phi[i]); + sim->tan_psi[i] = sim->dilatancy_constant * (sim->phi_c[i] - sim->phi[i]); } -void +static void compute_porosity_change(struct simulation *sim) { int i; - for (i = 0; i < sim->nz; ++i) { + for (i = 0; i < sim->nz; ++i) sim->phi_dot[i] = sim->tan_psi[i] * sim->gamma_dot_p[i] * sim->phi[i]; - sim->phi[i] += sim->phi_dot[i] * sim->dt; - } } -void +static void compute_permeability(struct simulation *sim) { int i; @@ -478,7 +479,7 @@ shear_strain_rate_plastic(const double fluidity, const double friction) return fluidity * friction; } -void +static void compute_shear_strain_rate_plastic(struct simulation *sim) { int i; @@ -488,7 +489,7 @@ compute_shear_strain_rate_plastic(struct simulation *sim) sim->mu[i]); } -void +static void compute_shear_velocity(struct simulation *sim) { int i; @@ -525,7 +526,7 @@ cooperativity_length(const double A, return A * d / sqrt(fabs((mu - C / p) - mu_s)); } -void +static void compute_cooperativity_length(struct simulation *sim) { int i; @@ -554,7 +555,7 @@ local_fluidity(const double p, return sqrt(p / rho_s * d * d) * ((mu - C / p) - mu_s) / (b * mu); } -void +static void compute_local_fluidity(struct simulation *sim) { int i; @@ -734,6 +735,22 @@ print_output(struct simulation *sim, FILE *fp, const int norm) free(v_x_out); } +static void +temporal_increment(struct simulation *sim) +{ + int i; + + if (sim->transient) + for (i = 0; i < sim->nz; ++i) + sim->phi[i] += sim->phi_dot[i] * sim->dt; + + /*if (sim->fluid) + for (i = 1; i <= sim->nz; ++i) + sim->p_f_ghost[i] += sim->p_f_dot[i] * sim->dt;*/ + + sim->t += sim->dt; +} + int coupled_shear_solver(struct simulation *sim, const int max_iter, @@ -753,7 +770,7 @@ coupled_shear_solver(struct simulation *sim, do { /* coupled iterations */ if (sim->transient) { - copy_values(sim->gamma_dot_p, oldval, sim->nz); + copy_values(sim->phi_dot, oldval, sim->nz); /* step 1 */ compute_inertia_number(sim); /* Eq. 1 */ @@ -791,26 +808,27 @@ coupled_shear_solver(struct simulation *sim, /* step 9 */ compute_shear_strain_rate_plastic(sim); /* Eq. 8 */ - compute_inertia_number(sim); + compute_inertia_number(sim); /* Eq. 1 */ compute_shear_velocity(sim); #ifdef DEBUG - for (i = 0; i < sim->nz; ++i) { + /* for (i = 0; i < sim->nz; ++i) { */ + for (i = sim->nz-1; i < sim->nz; ++i) { printf("\nsim->t = %g s\n", sim->t); printf("sim->I[%d] = %g\n", i, sim->I[i]); printf("sim->phi_c[%d] = %g\n", i, sim->phi_c[i]); printf("sim->tan_psi[%d] = %g\n", i, sim->tan_psi[i]); printf("sim->mu_c[%d] = %g\n", i, sim->mu_c[i]); + printf("sim->phi[%d] = %g\n", i, sim->phi[i]); printf("sim->phi_dot[%d] = %g\n", i, sim->phi_dot[i]); printf("sim->k[%d] = %g\n", i, sim->k[i]); printf("sim->mu[%d] = %g\n", i, sim->mu[i]); } #endif - /* stable velocity field == coupled solution - * converged */ + /* stable porosity change field == coupled solution converged */ if (sim->transient) { for (i = 0; i < sim->nz; ++i) - r_norm[i] = fabs(residual(sim->gamma_dot_p[i], oldval[i])); + r_norm[i] = fabs(residual(sim->phi_dot[i], oldval[i])); r_norm_max = max(r_norm, sim->nz); if (r_norm_max <= rel_tol) break; @@ -858,6 +876,9 @@ coupled_shear_solver(struct simulation *sim, free(r_norm); free(oldval); } + + temporal_increment(sim); + return 0; } diff --git a/simulation.h b/simulation.h @@ -84,7 +84,7 @@ struct simulation { double transient; double phi_min; double phi_max; - double dilatancy_angle; + double dilatancy_constant; /* Fluid parameters */ int fluid; /* flag to switch fluid on (1) or off (0) */ @@ -93,9 +93,9 @@ struct simulation { double p_f_mod_freq; /* frequency of fluid pressure variations [s^-1] */ double p_f_mod_phase; /* phase of fluid pressure variations [s^-1] */ double p_f_mod_pulse_time; /* single pressure pulse at this time [s] */ - int p_f_mod_pulse_shape; /* waveform for fluid-pressure pulse */ + int p_f_mod_pulse_shape; /* waveform for fluid-pressure pulse */ double beta_f; /* adiabatic fluid compressibility [Pa^-1] */ - double alpha; /* adiabatic grain compressibility [Pa^-1] */ + 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 */ @@ -106,6 +106,7 @@ struct simulation { double *sigma_n_eff; /* effective normal pressure [Pa] */ double *sigma_n; /* normal stress [Pa] */ double *p_f_ghost; /* fluid pressure [Pa] */ + double *p_f_dot; /* fluid pressure change [Pa/s] */ double *k; /* hydraulic permeability [m^2] */ double *phi; /* porosity [-] */ double *phi_c; /* critical-state porosity [-] */ @@ -122,24 +123,9 @@ struct simulation { void init_sim(struct simulation *sim); void prepare_arrays(struct simulation *sim); void free_arrays(struct simulation *sim); - void check_simulation_parameters(struct simulation *sim); - void lithostatic_pressure_distribution(struct simulation *sim); - -void compute_inertia_number(struct simulation *sim); -void compute_critical_state_porosity(struct simulation *sim); -void compute_critical_state_friction(struct simulation *sim); -void compute_porosity_change(struct simulation *sim); -void compute_permeability(struct simulation *sim); -void compute_tan_dilatancy_angle(struct simulation *sim); - -void compute_cooperativity_length(struct simulation *sim); -void compute_local_fluidity(struct simulation *sim); -void compute_shear_strain_rate_plastic(struct simulation *sim); -void compute_shear_velocity(struct simulation *sim); void compute_effective_stress(struct simulation *sim); -void compute_friction(struct simulation *sim); void set_bc_neumann(double *a, const int nz,