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 Back to index

commit 7f9396087b7378a3afce69c99e3f64465b4af0e7
parent 3c3aa3031dee8ce14cd68d78c0092d6900dfb669
Author: Anders Damsgaard <anders@adamsgaard.dk>
Date:   Tue,  5 May 2020 22:27:26 +0200

Use consistent formatting style

Diffstat:
M1d_fd_simple_shear.c | 25+++++++++++++------------
Marrays.c | 153++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
Mfluid.c | 203+++++++++++++++++++++++++++++++++++++++++--------------------------------------
Mmax_depth_simple_shear.c | 96++++++++++++++++++++++++++++++++++++++++---------------------------------------
Mshear_flux.c | 4++--
Msimulation.c | 389+++++++++++++++++++++++++++++++++++++++----------------------------------------
6 files changed, 447 insertions(+), 423 deletions(-)

diff --git a/1d_fd_simple_shear.c b/1d_fd_simple_shear.c @@ -14,7 +14,7 @@ #define MAX_ITER_1D_FD_SIMPLE_SHEAR 100000 /* uncomment to print time spent per time step to stdout */ -/*#define BENCHMARK_PERFORMANCE*/ +/* #define BENCHMARK_PERFORMANCE */ char *argv0; @@ -63,15 +63,17 @@ usage(void) } int -main(int argc, char* argv[]) +main(int argc, char *argv[]) { int i, normalize; unsigned long iter; double new_phi, new_k, filetimeclock; struct simulation sim; + #ifdef BENCHMARK_PERFORMANCE clock_t t_begin, t_end; double t_elapsed; + #endif #ifdef __OpenBSD__ @@ -180,7 +182,8 @@ main(int argc, char* argv[]) argv[1]); return 1; } - argc--; argv++; + argc--; + argv++; break; case 's': sim.v_x_fix = atof(EARGF(usage())); @@ -201,7 +204,7 @@ main(int argc, char* argv[]) sim.v_x_bot = atof(EARGF(usage())); break; case 'v': - printf("%s-"VERSION"\n", argv0); + printf("%s-" VERSION "\n", argv0); return 0; case 'Y': sim.phi_max = atof(EARGF(usage())); @@ -209,7 +212,7 @@ main(int argc, char* argv[]) case 'y': sim.phi_min = atof(EARGF(usage())); break; - default: +default: usage(); } ARGEND; @@ -219,15 +222,15 @@ main(int argc, char* argv[]) usage(); if (sim.nz < 1) - sim.nz = (int)ceil(sim.L_z/sim.d); + sim.nz = (int) ceil(sim.L_z / sim.d); prepare_arrays(&sim); if (!isnan(new_phi)) - for (i=0; i<sim.nz; ++i) + for (i = 0; i < sim.nz; ++i) sim.phi[i] = new_phi; if (!isnan(new_k)) - for (i=0; i<sim.nz; ++i) + for (i = 0; i < sim.nz; ++i) sim.k[i] = new_k; lithostatic_pressure_distribution(&sim); @@ -257,20 +260,18 @@ main(int argc, char* argv[]) free_arrays(&sim); exit(10); } - #ifdef BENCHMARK_PERFORMANCE t_end = clock(); - t_elapsed = (double)(t_end - t_begin)/CLOCKS_PER_SEC; + t_elapsed = (double) (t_end - t_begin) / CLOCKS_PER_SEC; printf("time spent per time step = %g s\n", t_elapsed); #endif if ((filetimeclock >= sim.file_dt || iter == 1) && strncmp(sim.name, DEFAULT_SIMULATION_NAME, - sizeof(DEFAULT_SIMULATION_NAME)) != 0) { + sizeof(DEFAULT_SIMULATION_NAME)) != 0) { write_output_file(&sim, normalize); filetimeclock = 0.0; } - sim.t += sim.dt; filetimeclock += sim.dt; iter++; diff --git a/arrays.c b/arrays.c @@ -5,17 +5,17 @@ #define DEG2RAD(x) (x*M_PI/180.0) void -check_magnitude(const char* func_name, int limit, int value) +check_magnitude(const char *func_name, int limit, int value) { if (value < limit) { fprintf(stderr, "error: %s: input size %d is less than %d\n", - func_name, value, limit); + func_name, value, limit); exit(1); } } -/* Translate a i,j,k index in grid with dimensions nx, ny, nz into a linear - * index */ +/* 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, @@ -23,11 +23,11 @@ idx3(const unsigned int i, const unsigned int nx, const unsigned int ny) { - return i + nx*j + nx*ny*k; + 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 */ +/* 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, @@ -35,33 +35,36 @@ idx3g(const unsigned int i, const unsigned int nx, const unsigned int ny) { - return i+1 + (nx+2)*(j+1) + (nx+2)*(ny+2)*(k+1); + 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 */ +/* 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; + 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 */ +/* 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 i + 1 + (nx + 2) * (j + 1); } -/* Translate a i index in grid with a padding of single into a linear index */ +/* Translate a i index in grid with a padding of single into a linear + * index */ unsigned int idx1g(const unsigned int i) { - return i+1; + return i + 1; } -/* Return an array of `n` linearly spaced values in the range [lower; upper] */ -double* +/* Return an array of `n` linearly spaced values in the range [lower; + * upper] */ +double * linspace(const double lower, const double upper, const int n) { int i; @@ -69,205 +72,221 @@ linspace(const double lower, const double upper, const int n) double dx; check_magnitude(__func__, 1, n); - x = malloc(n*sizeof(double)); - dx = (upper - lower)/(double)(n-1); - for (i=0; i<n; ++i) - x[i] = lower + dx*i; + x = malloc(n * sizeof(double)); + dx = (upper - lower) / (double) (n - 1); + for (i = 0; i < n; ++i) + x[i] = lower + dx * i; + return x; } /* Return an array of `n-1` values with the intervals between `x` values */ -double* -spacing(const double* x, const int n) +double * +spacing(const double *x, const int n) { int i; double *dx; check_magnitude(__func__, 2, n); - dx = malloc((n-1)*sizeof(double)); - for (i=0; i<n-1; ++i) - dx[i] = x[i+1] - x[i]; + dx = malloc((n - 1) * sizeof(double)); + for (i = 0; i < n - 1; ++i) + dx[i] = x[i + 1] - x[i]; + return dx; } /* Return an array of `n` values with the value 0.0 */ -double* +double * zeros(const int n) { int i; double *x; check_magnitude(__func__, 1, n); - x = malloc(n*sizeof(double)); - for (i=0; i<n; ++i) + x = malloc(n * sizeof(double)); + for (i = 0; i < n; ++i) x[i] = 0.0; + return x; } /* Return an array of `n` values with the value 1.0 */ -double* +double * ones(const int n) { int i; double *x; check_magnitude(__func__, 1, n); - x = malloc(n*sizeof(double)); - for (i=0; i<n; ++i) + x = malloc(n * sizeof(double)); + for (i = 0; i < n; ++i) x[i] = 1.0; + return x; } /* Return an array of `n` values with a specified value */ -double* +double * initval(const double value, const int n) { int i; double *x; check_magnitude(__func__, 1, n); - x = malloc(n*sizeof(double)); - for (i=0; i<n; ++i) + x = malloc(n * sizeof(double)); + for (i = 0; i < n; ++i) x[i] = value; + return x; } /* Return an array of `n` uninitialized values */ -double* +double * empty(const int n) { check_magnitude(__func__, 1, n); - return malloc(n*sizeof(double)); + return malloc(n * sizeof(double)); } /* Return largest value in array `a` with size `n` */ double -max(const double* a, const int n) +max(const double *a, const int n) { int i; double maxval; check_magnitude(__func__, 1, n); maxval = -INFINITY; - for (i=0; i<n; ++i) + for (i = 0; i < n; ++i) if (a[i] > maxval) maxval = a[i]; + return maxval; } /* Return smallest value in array `a` with size `n` */ double -min(const double* a, const int n) +min(const double *a, const int n) { int i; double minval; check_magnitude(__func__, 1, n); minval = +INFINITY; - for (i=0; i<n; ++i) + for (i = 0; i < n; ++i) if (a[i] < minval) minval = a[i]; + return minval; } void -print_array(const double* a, const int n) +print_array(const double *a, const int n) { int i; + check_magnitude(__func__, 1, n); - for (i=0; i<n; ++i) + for (i = 0; i < n; ++i) printf("%.17g\n", a[i]); } void -print_arrays(const double* a, const double* b, const int n) +print_arrays(const double *a, const double *b, const int n) { int i; + check_magnitude(__func__, 1, n); - for (i=0; i<n; ++i) + for (i = 0; i < n; ++i) printf("%.17g\t%.17g\n", a[i], b[i]); } void -print_arrays_2nd_normalized(const double* a, const double* b, const int n) +print_arrays_2nd_normalized(const double *a, const double *b, const int n) { int i; double max_b; + check_magnitude(__func__, 1, n); max_b = max(b, n); - for (i=0; i<n; ++i) - printf("%.17g\t%.17g\n", a[i], b[i]/max_b); + for (i = 0; i < n; ++i) + printf("%.17g\t%.17g\n", a[i], b[i] / max_b); } void -print_three_arrays(const double* a, - const double* b, - const double* c, +print_three_arrays(const double *a, + const double *b, + const double *c, const int n) { int i; + check_magnitude(__func__, 1, n); - for (i=0; i<n; ++i) + for (i = 0; i < n; ++i) printf("%.17g\t%.17g\t%.17g\n", a[i], b[i], c[i]); } void -fprint_arrays(FILE* fp, const double* a, const double* b, const int n) +fprint_arrays(FILE *fp, const double *a, const double *b, const int n) { int i; + check_magnitude(__func__, 1, n); - for (i=0; i<n; ++i) + for (i = 0; i < n; ++i) fprintf(fp, "%.17g\t%.17g\n", a[i], b[i]); } void -fprint_three_arrays(FILE* fp, - const double* a, - const double* b, - const double* c, +fprint_three_arrays(FILE *fp, + const double *a, + const double *b, + const double *c, const int n) { int i; + check_magnitude(__func__, 1, n); - for (i=0; i<n; ++i) + for (i = 0; i < n; ++i) fprintf(fp, "%.17g\t%.17g\t%.17g\n", a[i], b[i], c[i]); } void -copy_values(const double* in, double* out, const int n) +copy_values(const double *in, double *out, const int n) { int i; + check_magnitude(__func__, 1, n); - for (i=0; i<n; ++i) + for (i = 0; i < n; ++i) out[i] = in[i]; } -double* -copy(const double* in, const int n) +double * +copy(const double *in, const int n) { double *out; + check_magnitude(__func__, 1, n); out = empty(n); copy_values(in, out, n); return out; } -double* -normalize(const double* in, const int n) +double * +normalize(const double *in, const int n) { int i; double max_val; double *out; check_magnitude(__func__, 1, n); - out = malloc(n*sizeof(double)); + out = malloc(n * sizeof(double)); copy_values(in, out, n); max_val = max(out, n); if (max_val == 0.0) max_val = 1.0; - for (i=0; i<n; ++i) + for (i = 0; i < n; ++i) out[i] /= max_val; + return out; } diff --git a/fluid.c b/fluid.c @@ -9,16 +9,17 @@ void hydrostatic_fluid_pressure_distribution(struct simulation *sim) { int i; - for (i=0; i<sim->nz; ++i) - sim->p_f_ghost[i+1] = sim->p_f_top - + sim->phi[i]*sim->rho_f*sim->G - *(sim->L_z - sim->z[i]); + + for (i = 0; i < sim->nz; ++i) + sim->p_f_ghost[i + 1] = sim->p_f_top + + sim->phi[i] * sim->rho_f * sim->G + * (sim->L_z - sim->z[i]); } -/* 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 compressibilities) - * change. The safety factor should be in ]0;1] */ +/* 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 + * compressibilities) change. The safety factor should be in ]0;1] */ int set_largest_fluid_timestep(struct simulation *sim, const double safety) { @@ -28,26 +29,29 @@ set_largest_fluid_timestep(struct simulation *sim, const double safety) dx = spacing(sim->z, sim->nz); dx_min = INFINITY; - for (i=0; i<sim->nz-1; ++i) { + for (i = 0; i < sim->nz - 1; ++i) { if (dx[i] < 0.0) { fprintf(stderr, "error: cell spacing negative (%g) in cell %d\n", dx[i], i); free(dx); return 1; } - if (dx[i] < dx_min) dx_min = dx[i]; + if (dx[i] < dx_min) + dx_min = dx[i]; } free(dx); diff_max = -INFINITY; - for (i=0; i<sim->nz; ++i) { - diff = sim->k[i]/(sim->phi[i]*sim->beta_f*sim->mu_f); - if (diff > diff_max) diff_max = diff; + for (i = 0; i < sim->nz; ++i) { + diff = sim->k[i] / (sim->phi[i] * sim->beta_f * sim->mu_f); + if (diff > diff_max) + diff_max = diff; } - sim->dt = safety*0.5*dx_min*dx_min/diff_max; - if (sim->file_dt*0.5 < sim->dt) + sim->dt = safety * 0.5 * dx_min * dx_min / diff_max; + if (sim->file_dt * 0.5 < sim->dt) sim->dt = sim->file_dt; + return 0; } @@ -57,7 +61,7 @@ sine_wave(const double time, const double freq, const double phase) { - return ampl*sin(2.0*PI*freq*time + phase); + return ampl * sin(2.0 * PI * freq * time + phase); } static double @@ -66,10 +70,10 @@ triangular_pulse(const double time, const double freq, const double peak_time) { - if (peak_time - 1.0/(2.0*freq) < time && time <= peak_time) - return peak_ampl*2.0*freq*(time - peak_time) + peak_ampl; - else if (peak_time < time && time < peak_time + 1.0/(2.0*freq)) - return peak_ampl*2.0*freq*(peak_time - time) + peak_ampl; + if (peak_time - 1.0 / (2.0 * freq) < time && time <= peak_time) + return peak_ampl * 2.0 * freq * (time - peak_time) + peak_ampl; + else if (peak_time < time && time < peak_time + 1.0 / (2.0 * freq)) + return peak_ampl * 2.0 * freq * (peak_time - time) + peak_ampl; else return 0.0; } @@ -80,8 +84,8 @@ square_pulse(const double time, const double freq, const double peak_time) { - if (peak_time - 1.0/(2.0*freq) < time && - time < peak_time + 1.0/(2.0*freq)) + if (peak_time - 1.0 / (2.0 * freq) < time && + time < peak_time + 1.0 / (2.0 * freq)) return peak_ampl; else return 0.0; @@ -91,52 +95,58 @@ static void set_fluid_bcs(struct simulation *sim, const double p_f_top) { set_bc_dirichlet(sim->p_f_ghost, sim->nz, +1, p_f_top); - sim->p_f_ghost[sim->nz] = p_f_top; /* Include top node in BC */ + sim->p_f_ghost[sim->nz] = p_f_top; /* Include top node in BC */ set_bc_neumann(sim->p_f_ghost, sim->nz, -1, - sim->phi[0]*sim->rho_f*sim->G, + sim->phi[0] * sim->rho_f * sim->G, sim->dz); } static double darcy_pressure_change_1d(const int i, - const int nz, - const double* p_f_ghost_in, - const double* phi, - const double* phi_dot, - const double* k, - const double dz, - const double beta_f, - const double mu_f) + const int nz, + const double *p_f_ghost_in, + const double *phi, + const double *phi_dot, + const double *k, + const double dz, + const double beta_f, + const double mu_f) { 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]; + 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); + 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]); + i, phi[i], div_k_grad_p, phi_dot[i]); #endif /* TODO: add advective term */ - return 1.0/(beta_f*phi[i]*mu_f)*div_k_grad_p - - 1.0/(beta_f*(1.0 - phi[i]))*phi_dot[i]; + return 1.0 / (beta_f * phi[i] * mu_f) * div_k_grad_p + - 1.0 / (beta_f * (1.0 - phi[i])) * phi_dot[i]; } int @@ -148,39 +158,36 @@ darcy_solver_1d(struct simulation *sim, double epsilon, theta, p_f_top, r_norm_max = NAN; double *dp_f_dt_expl; double *p_f_ghost_old, *dp_f_dt_impl, *p_f_ghost_new, *r_norm; - - /* choose integration method, parameter in [0.0; 1.0] - * epsilon = 0.0: explicit - * epsilon = 0.5: Crank-Nicolson - * epsilon = 1.0: implicit */ + + /* choose integration method, parameter in [0.0; 1.0] epsilon = + * 0.0: explicit epsilon = 0.5: Crank-Nicolson epsilon = 1.0: + * implicit */ epsilon = 0.5; - /* choose relaxation factor, parameter in ]0.0; 1.0] - * theta in ]0.0; 1.0]: underrelaxation - * theta = 1.0: Gauss-Seidel - * theta > 1.0: overrelaxation */ + /* choose relaxation factor, parameter in ]0.0; 1.0] theta in + * ]0.0; 1.0]: underrelaxation theta = 1.0: Gauss-Seidel theta > + * 1.0: overrelaxation */ /* TODO: values other than 1.0 do not work! */ theta = 1.0; if (isnan(sim->p_f_mod_pulse_time)) - p_f_top = sim->p_f_top - + sine_wave(sim->t, - sim->p_f_mod_ampl, - sim->p_f_mod_freq, - sim->p_f_mod_phase); + p_f_top = sim->p_f_top + + sine_wave(sim->t, + sim->p_f_mod_ampl, + sim->p_f_mod_freq, + sim->p_f_mod_phase); + else if (sim->p_f_mod_pulse_shape == 1) + p_f_top = sim->p_f_top + + square_pulse(sim->t, + sim->p_f_mod_ampl, + sim->p_f_mod_freq, + sim->p_f_mod_pulse_time); else - if (sim->p_f_mod_pulse_shape == 1) - p_f_top = sim->p_f_top - + square_pulse(sim->t, - sim->p_f_mod_ampl, - sim->p_f_mod_freq, - sim->p_f_mod_pulse_time); - else - p_f_top = sim->p_f_top - + triangular_pulse(sim->t, - sim->p_f_mod_ampl, - sim->p_f_mod_freq, - sim->p_f_mod_pulse_time); + p_f_top = sim->p_f_top + + triangular_pulse(sim->t, + sim->p_f_mod_ampl, + sim->p_f_mod_freq, + sim->p_f_mod_pulse_time); /* set fluid BCs (1 of 2) */ set_fluid_bcs(sim, p_f_top); @@ -188,7 +195,7 @@ darcy_solver_1d(struct simulation *sim, if (epsilon < 1.0) { /* compute explicit solution to pressure change */ dp_f_dt_expl = zeros(sim->nz); - for (i=0; i<sim->nz; ++i) + for (i = 0; i < sim->nz; ++i) dp_f_dt_expl[i] = darcy_pressure_change_1d(i, sim->nz, sim->p_f_ghost, @@ -199,25 +206,24 @@ darcy_solver_1d(struct simulation *sim, sim->beta_f, sim->mu_f); } - if (epsilon > 0.0) { /* compute implicit solution with Jacobian iterations */ dp_f_dt_impl = zeros(sim->nz); - p_f_ghost_new = zeros(sim->nz+2); + p_f_ghost_new = zeros(sim->nz + 2); r_norm = zeros(sim->nz); - p_f_ghost_old = empty(sim->nz+2); - copy_values(sim->p_f_ghost, p_f_ghost_old, sim->nz+2); + p_f_ghost_old = empty(sim->nz + 2); + copy_values(sim->p_f_ghost, p_f_ghost_old, sim->nz + 2); - for (iter=0; iter<max_iter; ++iter) { + for (iter = 0; iter < max_iter; ++iter) { /* set fluid BCs (2 of 2) */ set_fluid_bcs(sim, p_f_top); #ifdef DEBUG puts(".. p_f_ghost after BC:"); - print_array(sim->p_f_ghost, sim->nz+2); + print_array(sim->p_f_ghost, sim->nz + 2); #endif - for (i=0; i<sim->nz-1; ++i) + for (i = 0; i < sim->nz - 1; ++i) dp_f_dt_impl[i] = darcy_pressure_change_1d(i, sim->nz, sim->p_f_ghost, @@ -228,37 +234,37 @@ darcy_solver_1d(struct simulation *sim, sim->beta_f, sim->mu_f); - for (i=0; i<sim->nz-1; ++i) { + for (i = 0; i < sim->nz - 1; ++i) { #ifdef DEBUG printf("dp_f_expl[%d] = %g\ndp_f_impl[%d] = %g\n", - i, dp_f_dt_expl[i], i, dp_f_dt_impl[i]); + i, dp_f_dt_expl[i], i, dp_f_dt_impl[i]); #endif /* TODO */ - p_f_ghost_new[i+1] = p_f_ghost_old[i+1] - + epsilon*dp_f_dt_impl[i]*sim->dt; + p_f_ghost_new[i + 1] = p_f_ghost_old[i + 1] + + epsilon * dp_f_dt_impl[i] * sim->dt; if (epsilon < 1.0) - p_f_ghost_new[i+1] += (1.0 - epsilon) - *dp_f_dt_expl[i]*sim->dt; + p_f_ghost_new[i + 1] += (1.0 - epsilon) + * dp_f_dt_expl[i] * sim->dt; - p_f_ghost_new[i+1] = p_f_ghost_old[i+1]*(1.0 - theta) - + p_f_ghost_new[i+1]*theta; + p_f_ghost_new[i + 1] = p_f_ghost_old[i + 1] * (1.0 - theta) + + p_f_ghost_new[i + 1] * theta; - r_norm[i] = residual_normalized(p_f_ghost_new[i+1], - sim->p_f_ghost[i+1]); + r_norm[i] = residual_normalized(p_f_ghost_new[i + 1], + sim->p_f_ghost[i + 1]); } r_norm_max = max(r_norm, sim->nz); #ifdef DEBUG puts(".. p_f_ghost_new:"); - print_array(p_f_ghost_new, sim->nz+2); + print_array(p_f_ghost_new, sim->nz + 2); #endif - copy_values(p_f_ghost_new, sim->p_f_ghost, sim->nz+2); + copy_values(p_f_ghost_new, sim->p_f_ghost, sim->nz + 2); #ifdef DEBUG puts(".. p_f_ghost after update:"); - print_array(sim->p_f_ghost, sim->nz+2); + print_array(sim->p_f_ghost, sim->nz + 2); #endif if (r_norm_max <= rel_tol) { @@ -276,23 +282,24 @@ darcy_solver_1d(struct simulation *sim, if (!solved) { fprintf(stderr, "darcy_solver_1d: "); fprintf(stderr, "Solution did not converge after %d iterations\n", - iter); + iter); fprintf(stderr, ".. Residual normalized error: %f\n", r_norm_max); } } else { - for (i=0; i<sim->nz; ++i) - sim->p_f_ghost[i+1] += dp_f_dt_expl[i]*sim->dt; + for (i = 0; i < sim->nz; ++i) + sim->p_f_ghost[i + 1] += dp_f_dt_expl[i] * sim->dt; solved = 1; #ifdef DEBUG puts(".. dp_f_dt_expl:"); print_array(dp_f_dt_expl, sim->nz); puts(".. p_f_ghost after explicit solution:"); - print_array(sim->p_f_ghost, sim->nz+2); + print_array(sim->p_f_ghost, sim->nz + 2); #endif } set_fluid_bcs(sim, p_f_top); if (epsilon < 1.0) free(dp_f_dt_expl); + return solved - 1; } diff --git a/max_depth_simple_shear.c b/max_depth_simple_shear.c @@ -46,30 +46,30 @@ usage(void) static double skin_depth(const struct simulation *sim) { - return sqrt(sim->k[0]/ - (sim->phi[0]*sim->mu_f*sim->beta_f*M_PI*sim->p_f_mod_freq)); + return sqrt(sim->k[0] / + (sim->phi[0] * sim->mu_f * sim->beta_f * M_PI * sim->p_f_mod_freq)); } /* using alternate form: sin(x) + cos(x) = sqrt(2)*sin(x + pi/4) */ static double -eff_normal_stress_gradient(struct simulation *sim, double d_s, double z_) +eff_normal_stress_gradient(struct simulation * sim, double d_s, double z_) { - if (z_/d_s > 10.0) { + if (z_ / d_s > 10.0) { fprintf(stderr, "error: %s: unrealistic depth: %g m " - "relative to skin depth %g m\n", __func__, z_, d_s); + "relative to skin depth %g m\n", __func__, z_, d_s); free_arrays(sim); exit(10); } - - return sqrt(2.0)*sin((3.0*M_PI/2.0 - z_/d_s) + M_PI/4.0) - + (sim->rho_s - sim->rho_f)*sim->G*d_s/sim->p_f_mod_ampl*exp(z_/d_s); + return sqrt(2.0) * sin((3.0 * M_PI / 2.0 - z_ / d_s) + M_PI / 4.0) + + (sim->rho_s - sim->rho_f) * sim->G * d_s + / sim->p_f_mod_ampl * exp(z_ / d_s); } /* use Brent's method for finding roots (Press et al., 2007) */ static double zbrent(struct simulation *sim, double d_s, - double (*f)(struct simulation *sim, double, double), + double (*f) (struct simulation *sim, double, double), double x1, double x2, double tol) @@ -80,18 +80,18 @@ zbrent(struct simulation *sim, a = x1; b = x2; c = x2; - fa = (*f)(sim, d_s, a); - fb = (*f)(sim, d_s, b); + fa = (*f) (sim, d_s, a); + fb = (*f) (sim, d_s, b); if ((fa > 0.0 && fb > 0.0) || (fa < 0.0 && fb < 0.0)) { fprintf(stderr, - "error: %s: no root in range %g,%g m\n", - __func__, x1, x2); + "error: %s: no root in range %g,%g m\n", + __func__, x1, x2); free_arrays(sim); exit(11); } fc = fb; - for (iter=0; iter<MAX_ITER; iter++) { + for (iter = 0; iter < MAX_ITER; iter++) { if ((fb > 0.0 && fc > 0.0) || (fb < 0.0 && fc < 0.0)) { c = a; fc = fa; @@ -106,29 +106,29 @@ zbrent(struct simulation *sim, fb = fc; fc = fa; } - tol1 = 2.0*EPS*fabs(b) + 0.5*tol; - xm = 0.5*(c - b); + tol1 = 2.0 * EPS * fabs(b) + 0.5 * tol; + xm = 0.5 * (c - b); if (fabs(xm) <= tol1 || fb == 0.0) return b; if (fabs(e) >= tol1 && fabs(fa) > fabs(fb)) { - s = fb/fa; + s = fb / fa; if (a == c) { - p = 2.0*xm*s; + p = 2.0 * xm * s; q = 1.0 - s; } else { - q = fa/fc; - r = fb/fc; - p = s*(2.0*xm*q*(q - r) - (b - a)*(r - 1.0)); - q = (q - 1.0)*(r - 1.0)*(s - 1.0); + q = fa / fc; + r = fb / fc; + p = s * (2.0 * xm * q * (q - r) - (b - a) * (r - 1.0)); + q = (q - 1.0) * (r - 1.0) * (s - 1.0); } if (p > 0.0) q = -q; p = fabs(p); - min1 = 3.0*xm*q - fabs(tol1*q); - min2 = fabs(e*q); - if (2.0*p < (min1 < min2 ? min1 : min2)) { + min1 = 3.0 * xm * q - fabs(tol1 * q); + min2 = fabs(e * q); + if (2.0 * p < (min1 < min2 ? min1 : min2)) { e = d; - d = p/q; + d = p / q; } else { d = xm; e = d; @@ -143,26 +143,28 @@ zbrent(struct simulation *sim, b += d; else b += ((xm) >= 0.0 ? fabs(tol1) : -fabs(tol1)); - fb = (*f)(sim, d_s, b); + fb = (*f) (sim, d_s, b); } fprintf(stderr, - "error: %s: exceeded maximum number of iterations", - __func__); + "error: %s: exceeded maximum number of iterations", + __func__); free_arrays(sim); exit(12); return NAN; } int -main(int argc, char* argv[]) +main(int argc, char *argv[]) { int i; double new_phi, new_k; double d_s, depth, depth_limit1, depth_limit2; struct simulation sim; + #ifdef BENCHMARK_PERFORMANCE clock_t t_begin, t_end; double t_elapsed; + #endif #ifdef __OpenBSD__ @@ -211,7 +213,7 @@ main(int argc, char* argv[]) sim.rho_s = atof(EARGF(usage())); break; case 'v': - printf("%s-"VERSION"\n", argv0); + printf("%s-" VERSION "\n", argv0); return 0; break; default: @@ -225,10 +227,10 @@ main(int argc, char* argv[]) prepare_arrays(&sim); if (!isnan(new_phi)) - for (i=0; i<sim.nz; ++i) + for (i = 0; i < sim.nz; ++i) sim.phi[i] = new_phi; if (!isnan(new_k)) - for (i=0; i<sim.nz; ++i) + for (i = 0; i < sim.nz; ++i) sim.k[i] = new_k; check_simulation_parameters(&sim); @@ -240,32 +242,32 @@ main(int argc, char* argv[]) t_begin = clock(); #endif - /* deep deformatin does not occur with approximately zero amplitude in - * water pressure forcing, or if the stress gradient is positive at - * zero depth */ - if (fabs(sim.p_f_mod_ampl) > 1e-6 && - eff_normal_stress_gradient(&sim, d_s, 0.0) < 0.0) { + /* deep deformatin does not occur with approximately zero + * amplitude in water pressure forcing, or if the stress gradient + * is positive at zero depth */ + if (fabs(sim.p_f_mod_ampl) > 1e-6 && + eff_normal_stress_gradient(&sim, d_s, 0.0) < 0.0) { depth_limit1 = 0.0; - depth_limit2 = 5.0*d_s; + depth_limit2 = 5.0 * d_s; depth = zbrent(&sim, - d_s, - (double (*)(struct simulation*, double, double)) - eff_normal_stress_gradient, - depth_limit1, - depth_limit2, - TOL); + d_s, + (double (*) (struct simulation *, double, double)) + eff_normal_stress_gradient, + depth_limit1, + depth_limit2, + TOL); } - #ifdef BENCHMARK_PERFORMANCE t_end = clock(); - t_elapsed = (double)(t_end - t_begin)/CLOCKS_PER_SEC; + t_elapsed = (double) (t_end - t_begin) / CLOCKS_PER_SEC; printf("time spent = %g s\n", t_elapsed); #endif printf("%.17g\t%.17g\n", depth, d_s); free_arrays(&sim); + return 0; } diff --git a/shear_flux.c b/shear_flux.c @@ -29,7 +29,7 @@ find_flux(FILE *f) flux = 0.0; while (fscanf(f, "%lf\t%lf%*[^\n]", &pos, &vel) == 2) { if (i++ > 0) - flux += (vel + vel_prev)/2.0*(pos - pos_prev); + flux += (vel + vel_prev) / 2.0 * (pos - pos_prev); pos_prev = pos; vel_prev = vel; } @@ -40,7 +40,7 @@ find_flux(FILE *f) } int -main(int argc, char* argv[]) +main(int argc, char *argv[]) { int i; FILE *fp; diff --git a/simulation.c b/simulation.c @@ -35,15 +35,15 @@ init_sim(struct simulation *sim) sim->v_x_fix = NAN; sim->v_x_limit = NAN; - sim->nz = -1; /* cell size equals grain size if negative */ + sim->nz = -1; /* cell size equals grain size if negative */ - /* lower values of A mean that the velocity curve can have sharper curves, - * e.g. at the transition from μ ≈ μ_s */ - sim->A = 0.40; /* Loose fit to Damsgaard et al 2013 */ + /* lower values of A mean that the velocity curve can have sharper + * curves, e.g. at the transition from μ ≈ μ_s */ + sim->A = 0.40; /* Loose fit to Damsgaard et al 2013 */ - /* lower values of b mean larger shear velocity for a given stress ratio - * above yield */ - sim->b = 0.9377; /* Henann and Kamrin 2016 */ + /* lower values of b mean larger shear velocity for a given stress + * ratio above yield */ + sim->b = 0.9377; /* Henann and Kamrin 2016 */ /* Henann and Kamrin 2016 */ /* sim->mu_s = 0.3819; */ @@ -53,7 +53,7 @@ init_sim(struct simulation *sim) sim->mu_s = tan(DEG2RAD(22.0)); sim->C = 0.0; sim->phi = initval(0.25, 1); - sim->d = 0.04; /* Damsgaard et al 2013 */ + sim->d = 0.04; /* Damsgaard et al 2013 */ sim->transient = 0; sim->phi_min = 0.20; @@ -79,7 +79,7 @@ init_sim(struct simulation *sim) /* sim->d = ??; */ /* grain material density [kg/m^3] */ - sim->rho_s = 2.6e3; /* Damsgaard et al 2013 */ + sim->rho_s = 2.6e3; /* Damsgaard et al 2013 */ /* spatial settings */ sim->origo_z = 0.0; @@ -102,8 +102,8 @@ init_sim(struct simulation *sim) /* sim->mu_f = 1.0-3; */ /* Water at 0 deg C */ - sim->beta_f = 3.9e-10; /* doi:10.1063/1.1679903 */ - sim->mu_f = 1.787e-3; /* Cuffey and Paterson 2010 */ + sim->beta_f = 3.9e-10; /* doi:10.1063/1.1679903 */ + sim->mu_f = 1.787e-3; /* Cuffey and Paterson 2010 */ /* Damsgaard et al 2015 */ sim->k = initval(1.9e-15, 1); @@ -131,33 +131,32 @@ prepare_arrays(struct simulation *sim) { if (sim->nz < 2) { fprintf(stderr, "error: grid size (nz) must be at least 2 but is %d\n", - sim->nz); + sim->nz); exit(1); } - free(sim->phi); free(sim->k); - 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->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->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->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) */ } void @@ -184,29 +183,30 @@ free_arrays(struct simulation *sim) static void warn_parameter_value(const char message[], - const double value, - int* return_status) + const double value, + int *return_status) { fprintf(stderr, "check_simulation_parameters: %s (%.17g)\n", - message, - value); + message, value); *return_status = 1; } static void -check_float(const char name[], const double value, int* return_status) +check_float(const char name[], const double value, int *return_status) { #ifdef SHOW_PARAMETERS printf("%30s: %.17g\n", name, value); #endif if (isnan(value)) { char message[100]; + snprintf(message, sizeof(message), "%s is NaN", name); warn_parameter_value(message, value, return_status); *return_status = 1; } else if (isinf(value)) { char message[100]; + snprintf(message, sizeof(message), "%s is infinite", name); warn_parameter_value(message, value, return_status); *return_status = 1; @@ -225,14 +225,14 @@ check_simulation_parameters(struct simulation *sim) check_float("sim->P_wall", sim->P_wall, &return_status); if (sim->P_wall < 0.0) warn_parameter_value("sim->P_wall is negative", sim->P_wall, - &return_status); + &return_status); check_float("sim->v_x_bot", sim->v_x_bot, &return_status); check_float("sim->mu_wall", sim->mu_wall, &return_status); if (sim->mu_wall < 0.0) - warn_parameter_value("sim->mu_wall is negative", sim->mu_wall, - &return_status); + warn_parameter_value("sim->mu_wall is negative", sim->mu_wall, + &return_status); check_float("sim->A", sim->A, &return_status); if (sim->A < 0.0) @@ -245,125 +245,124 @@ check_simulation_parameters(struct simulation *sim) check_float("sim->mu_s", sim->mu_s, &return_status); if (sim->mu_s < 0.0) warn_parameter_value("sim->mu_s is negative", sim->mu_s, - &return_status); + &return_status); check_float("sim->C", 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, - &return_status); + &return_status); check_float("sim->rho_s", sim->rho_s, &return_status); if (sim->rho_s <= 0.0) warn_parameter_value("sim->rho_s is not a positive number", sim->rho_s, - &return_status); + &return_status); if (sim->nz <= 0) warn_parameter_value("sim->nz is not a positive number", sim->nz, - &return_status); + &return_status); check_float("sim->origo_z", sim->origo_z, &return_status); check_float("sim->L_z", sim->L_z, &return_status); if (sim->L_z <= sim->origo_z) warn_parameter_value("sim->L_z is smaller or equal to sim->origo_z", - sim->L_z, &return_status); + sim->L_z, &return_status); if (sim->nz <= 0) warn_parameter_value("sim->nz is not a positive number", sim->nz, - &return_status); + &return_status); check_float("sim->dz", sim->dz, &return_status); if (sim->dz <= 0.0) warn_parameter_value("sim->dz is not a positive number", sim->dz, - &return_status); + &return_status); check_float("sim->t", sim->t, &return_status); if (sim->t < 0.0) warn_parameter_value("sim->t is a negative number", - sim->t, &return_status); + sim->t, &return_status); check_float("sim->t_end", sim->t_end, &return_status); if (sim->t > sim->t_end) warn_parameter_value("sim->t_end is smaller than sim->t", - sim->t, &return_status); + sim->t, &return_status); check_float("sim->dt", sim->dt, &return_status); if (sim->dt <= 0.0) warn_parameter_value("sim->dt is not a positive number", - sim->dt, &return_status); + sim->dt, &return_status); check_float("sim->file_dt", sim->file_dt, &return_status); if (sim->file_dt < 0.0) warn_parameter_value("sim->file_dt is a negative number", - sim->file_dt, &return_status); + sim->file_dt, &return_status); check_float("sim->phi[0]", sim->phi[0], &return_status); if (sim->phi[0] < 0.0 || sim->phi[0] > 1.0) warn_parameter_value("sim->phi[0] is not within [0;1]", - sim->phi[0], &return_status); + sim->phi[0], &return_status); check_float("sim->phi_min", sim->phi_min, &return_status); if (sim->phi_min < 0.0 || sim->phi_min > 1.0) warn_parameter_value("sim->phi_min is not within [0;1]", - sim->phi_min, &return_status); + sim->phi_min, &return_status); check_float("sim->phi_max", sim->phi_max, &return_status); if (sim->phi_max < 0.0 || sim->phi_max > 1.0) warn_parameter_value("sim->phi_max is not within [0;1]", - sim->phi_max, &return_status); + 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); + sim->dilatancy_angle, &return_status); if (sim->fluid != 0 && sim->fluid != 1) warn_parameter_value("sim->fluid has an invalid value", - (double)sim->fluid, &return_status); + (double) sim->fluid, &return_status); if (sim->transient != 0 && sim->transient != 1) warn_parameter_value("sim->transient has an invalid value", - (double)sim->transient, &return_status); + (double) sim->transient, &return_status); if (sim->fluid) { check_float("sim->p_f_mod_ampl", sim->p_f_mod_ampl, &return_status); 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); + 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); + 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) - warn_parameter_value("sim->p_f_mod_freq is not a zero or positive", - sim->p_f_mod_freq, &return_status); + if (sim->p_f_mod_freq < 0.0) + warn_parameter_value("sim->p_f_mod_freq is not a zero or positive", + sim->p_f_mod_freq, &return_status); check_float("sim->beta_f", sim->beta_f, &return_status); - if (sim->beta_f <= 0.0) - warn_parameter_value("sim->beta_f is not positive", - sim->beta_f, &return_status); + if (sim->beta_f <= 0.0) + warn_parameter_value("sim->beta_f is not positive", + sim->beta_f, &return_status); check_float("sim->mu_f", sim->mu_f, &return_status); - if (sim->mu_f <= 0.0) - warn_parameter_value("sim->mu_f is not positive", - sim->mu_f, &return_status); + if (sim->mu_f <= 0.0) + warn_parameter_value("sim->mu_f is not positive", + sim->mu_f, &return_status); check_float("sim->rho_f", sim->rho_f, &return_status); - if (sim->rho_f <= 0.0) - warn_parameter_value("sim->rho_f is not positive", - sim->rho_f, &return_status); + if (sim->rho_f <= 0.0) + warn_parameter_value("sim->rho_f is not positive", + sim->rho_f, &return_status); check_float("sim->k[0]", sim->k[0], &return_status); - if (sim->k[0] <= 0.0) - warn_parameter_value("sim->k[0] is not positive", - sim->k[0], &return_status); + if (sim->k[0] <= 0.0) + warn_parameter_value("sim->k[0] is not positive", + sim->k[0], &return_status); } - if (return_status != 0) { fprintf(stderr, "error: aborting due to invalid parameter choices\n"); exit(return_status); @@ -374,10 +373,11 @@ void lithostatic_pressure_distribution(struct simulation *sim) { int i; - for (i=0; i<sim->nz; ++i) + + for (i = 0; i < sim->nz; ++i) sim->sigma_n[i] = sim->P_wall + - (1.0 - sim->phi[i])*sim->rho_s*sim->G* - (sim->L_z - sim->z[i]); + (1.0 - sim->phi[i]) * sim->rho_s * sim->G * + (sim->L_z - sim->z[i]); } /* NEW FUNCTIONS START */ @@ -386,42 +386,47 @@ void compute_inertia_number(struct simulation *sim) { int i; - for (i=0; i<sim->nz; ++i) - sim->I[i] = sim->gamma_dot_p[i]*sim->d - /sqrt(sim->sigma_n_eff[i]/sim->rho_s); + + for (i = 0; i < sim->nz; ++i) + sim->I[i] = sim->gamma_dot_p[i] * sim->d + / sqrt(sim->sigma_n_eff[i] / sim->rho_s); } + void 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]; + + for (i = 0; i < sim->nz; ++i) + sim->phi_c[i] = sim->phi_min + (sim->phi_max - sim->phi_min) *sim->I[i]; } void compute_critical_state_friction(struct simulation *sim) { int i; + if (sim->fluid) - for (i=0; i<sim->nz; ++i) - sim->mu_c[i] = sim->mu_wall/ - (sim->sigma_n_eff[i]/(sim->P_wall - sim->p_f_top)); + for (i = 0; i < sim->nz; ++i) + sim->mu_c[i] = sim->mu_wall / + (sim->sigma_n_eff[i] / (sim->P_wall - sim->p_f_top)); else - for (i=0; i<sim->nz; ++i) - sim->mu_c[i] = sim->mu_wall/ - (1.0 + (1.0 - sim->phi[i])*sim->rho_s*sim->G* - (sim->L_z - sim->z[i])/sim->P_wall); + for (i = 0; i < sim->nz; ++i) + sim->mu_c[i] = sim->mu_wall / + (1.0 + (1.0 - sim->phi[i]) * sim->rho_s * sim->G * + (sim->L_z - sim->z[i]) / sim->P_wall); } void compute_friction(struct simulation *sim) { int i; + if (sim->transient) - for (i=0; i<sim->nz; ++i) + for (i = 0; i < sim->nz; ++i) sim->mu[i] = sim->tan_psi[i] + sim->mu_c[i]; else - for (i=0; i<sim->nz; ++i) + for (i = 0; i < sim->nz; ++i) sim->mu[i] = sim->mu_c[i]; } @@ -429,17 +434,19 @@ 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]); + + for (i = 0; i < sim->nz; ++i) + sim->tan_psi[i] = sim->dilatancy_angle * (sim->phi_c[i] - sim->phi[i]); } void compute_porosity_change(struct simulation *sim) { int 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; + + 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; } } @@ -447,42 +454,29 @@ void compute_permeability(struct simulation *sim) { int i; - for (i=0; i<sim->nz; ++i) - sim->k[i] = pow(sim->d, 2.0)/180.0 - *pow(sim->phi[i], 3.0) - /pow(1.0 - sim->phi[i], 2.0); + + for (i = 0; i < sim->nz; ++i) + sim->k[i] = pow(sim->d, 2.0) / 180.0 + * pow(sim->phi[i], 3.0) + / pow(1.0 - sim->phi[i], 2.0); } /* NEW FUNCTIONS END */ -/*void -compute_friction(struct simulation *sim) -{ - int i; - if (sim->fluid) - for (i=0; i<sim->nz; ++i) - sim->mu[i] = sim->mu_wall/ - (sim->sigma_n_eff[i]/(sim->P_wall - sim->p_f_top)); - else - for (i=0; i<sim->nz; ++i) - sim->mu[i] = sim->mu_wall/ - (1.0 + (1.0 - sim->phi[i])*sim->rho_s*sim->G* - (sim->L_z - sim->z[i])/sim->P_wall); -}*/ - static double shear_strain_rate_plastic(const double fluidity, const double friction) { - return fluidity*friction; + return fluidity * friction; } void compute_shear_strain_rate_plastic(struct simulation *sim) { int i; - for (i=0; i<sim->nz; ++i) - sim->gamma_dot_p[i] = shear_strain_rate_plastic(sim->g_ghost[i+1], - sim->mu[i]); + + for (i = 0; i < sim->nz; ++i) + sim->gamma_dot_p[i] = shear_strain_rate_plastic(sim->g_ghost[i + 1], + sim->mu[i]); } void @@ -494,19 +488,20 @@ compute_shear_velocity(struct simulation *sim) /* Dirichlet BC at bottom */ sim->v_x[0] = sim->v_x_bot; - for (i=1; i<sim->nz; ++i) - sim->v_x[i] = sim->v_x[i-1] + sim->gamma_dot_p[i]*sim->dz; + for (i = 1; i < sim->nz; ++i) + sim->v_x[i] = sim->v_x[i - 1] + sim->gamma_dot_p[i] * sim->dz; } void compute_effective_stress(struct simulation *sim) { int i; + if (sim->fluid) - for (i=0; i<sim->nz; ++i) - sim->sigma_n_eff[i] = sim->sigma_n[i] - sim->p_f_ghost[i+1]; + for (i = 0; i < sim->nz; ++i) + sim->sigma_n_eff[i] = sim->sigma_n[i] - sim->p_f_ghost[i + 1]; else - for (i=0; i<sim->nz; ++i) + for (i = 0; i < sim->nz; ++i) sim->sigma_n_eff[i] = sim->sigma_n[i]; } @@ -518,14 +513,15 @@ cooperativity_length(const double A, const double mu_s, const double C) { - return A*d/sqrt(fabs((mu - C/p) - mu_s)); + return A * d / sqrt(fabs((mu - C / p) - mu_s)); } void compute_cooperativity_length(struct simulation *sim) { int i; - for (i=0; i<sim->nz; ++i) + + for (i = 0; i < sim->nz; ++i) sim->xi[i] = cooperativity_length(sim->A, sim->d, sim->mu[i], @@ -543,17 +539,18 @@ local_fluidity(const double p, const double rho_s, const double d) { - if (mu - C/p <= mu_s) - return 0.0; + if (mu - C / p <= mu_s) + return 0.0; else - return sqrt(p/rho_s*d*d)*((mu - C/p) - mu_s)/(b*mu); + return sqrt(p / rho_s * d * d) * ((mu - C / p) - mu_s) / (b * mu); } void compute_local_fluidity(struct simulation *sim) { int i; - for (i=0; i<sim->nz; ++i) + + for (i = 0; i < sim->nz; ++i) sim->g_local[i] = local_fluidity(sim->sigma_n_eff[i], sim->mu[i], sim->mu_s, @@ -564,16 +561,16 @@ compute_local_fluidity(struct simulation *sim) } void -set_bc_neumann(double* a, +set_bc_neumann(double *a, const int nz, const int boundary, const double df, const double dx) { if (boundary == -1) - a[0] = a[1] + df*dx; + a[0] = a[1] + df * dx; else if (boundary == +1) - a[nz+1] = a[nz] - df*dx; + a[nz + 1] = a[nz] - df * dx; else { fprintf(stderr, "set_bc_neumann: Unknown boundary %d\n", boundary); exit(1); @@ -581,7 +578,7 @@ set_bc_neumann(double* a, } void -set_bc_dirichlet(double* a, +set_bc_dirichlet(double *a, const int nz, const int boundary, const double value) @@ -589,7 +586,7 @@ set_bc_dirichlet(double* a, if (boundary == -1) a[0] = value; else if (boundary == +1) - a[nz+1] = value; + a[nz + 1] = value; else { fprintf(stderr, "set_bc_dirichlet: Unknown boundary %d\n", boundary); exit(1); @@ -599,33 +596,33 @@ set_bc_dirichlet(double* a, double residual_normalized(double new, double old) { - return fabs((new - old)/(old + 1e-16)); + return fabs((new - old) / (old + 1e-16)); } static void poisson_solver_1d_cell_update(int i, - const double* g_in, - const double* g_local, - double* g_out, - double* r_norm, + const double *g_in, + const double *g_local, + double *g_out, + double *r_norm, const double dz, - const double* xi) + const double *xi) { - double coorp_term = dz*dz/(2.0*pow(xi[i], 2.0)); + double coorp_term = dz * dz / (2.0 * pow(xi[i], 2.0)); - g_out[i+1] = 1.0/(1.0 + coorp_term) - *(coorp_term*g_local[i] + g_in[i+2]/2.0 + g_in[i]/2.0); + g_out[i + 1] = 1.0 / (1.0 + coorp_term) + * (coorp_term * g_local[i] + g_in[i + 2] / 2.0 + g_in[i] / 2.0); /* TODO: try out residual_normalized(..) */ - r_norm[i] = pow(g_out[i+1] - g_in[i+1], 2.0) - /(pow(g_out[i+1], 2.0) + 1e-16); + r_norm[i] = pow(g_out[i + 1] - g_in[i + 1], 2.0) + / (pow(g_out[i + 1], 2.0) + 1e-16); #ifdef DEBUG printf("-- %d --------------\n", i); printf("coorp_term: %g\n", coorp_term); printf(" g_local: %g\n", g_local[i]); - printf(" g_in: %g\n", g_in[i+1]); - printf(" g_out: %g\n", g_out[i+1]); + printf(" g_in: %g\n", g_in[i + 1]); + printf(" g_out: %g\n", g_out[i + 1]); printf(" r_norm: %g\n", r_norm[i]); #endif } @@ -637,9 +634,9 @@ implicit_1d_jacobian_poisson_solver(struct simulation *sim, { int iter, i; double r_norm_max = NAN; - double *g_ghost_out = empty(sim->nz+2), *r_norm = empty(sim->nz); + double *g_ghost_out = empty(sim->nz + 2), *r_norm = empty(sim->nz); - for (iter=0; iter<max_iter; ++iter) { + for (iter = 0; iter < max_iter; ++iter) { #ifdef DEBUG printf("\n@@@ ITERATION %d @@@\n", iter); #endif @@ -650,7 +647,7 @@ implicit_1d_jacobian_poisson_solver(struct simulation *sim, /* Neumann BCs resemble free surfaces */ /* set_bc_neumann(sim->g_ghost, sim->nz, +1, 0.0, sim->dz); */ - for (i=0; i<sim->nz; ++i) + for (i = 0; i < sim->nz; ++i) poisson_solver_1d_cell_update(i, sim->g_ghost, sim->g_local, @@ -660,14 +657,15 @@ implicit_1d_jacobian_poisson_solver(struct simulation *sim, sim->xi); r_norm_max = max(r_norm, sim->nz); - copy_values(g_ghost_out, sim->g_ghost, sim->nz+2); + copy_values(g_ghost_out, sim->g_ghost, sim->nz + 2); if (r_norm_max <= rel_tol) { set_bc_dirichlet(sim->g_ghost, sim->nz, -1, 0.0); set_bc_dirichlet(sim->g_ghost, sim->nz, +1, 0.0); free(g_ghost_out); free(r_norm); - /* printf(".. Solution converged after %d iterations\n", iter); */ + /* printf(".. Solution converged after %d + * iterations\n", iter); */ return 0; } } @@ -687,7 +685,7 @@ write_output_file(struct simulation *sim, const int normalize) FILE *fp; snprintf(outfile, sizeof(outfile), "%s.output%05d.txt", - sim->name, sim->n_file++); + sim->name, sim->n_file++); if ((fp = fopen(outfile, "w")) != NULL) { print_output(sim, fp, normalize); @@ -699,7 +697,7 @@ write_output_file(struct simulation *sim, const int normalize) } void -print_output(struct simulation *sim, FILE* fp, const int norm) +print_output(struct simulation *sim, FILE *fp, const int norm) { int i; double *v_x_out; @@ -709,7 +707,7 @@ print_output(struct simulation *sim, FILE* fp, const int norm) else v_x_out = copy(sim->v_x, sim->nz); - for (i=0; i<sim->nz; ++i) + for (i = 0; i < sim->nz; ++i) fprintf(fp, "%.17g\t%.17g\t%.17g\t" "%.17g\t%.17g\t%.17g\t" @@ -717,20 +715,20 @@ print_output(struct simulation *sim, FILE* fp, const int norm) sim->z[i], v_x_out[i], sim->sigma_n_eff[i], - sim->p_f_ghost[i+1], + sim->p_f_ghost[i + 1], sim->mu[i], sim->gamma_dot_p[i], sim->phi[i], sim->I[i], - sim->mu[i]*sim->sigma_n_eff[i]); + sim->mu[i] * sim->sigma_n_eff[i]); free(v_x_out); } int coupled_shear_solver(struct simulation *sim, - const int max_iter, - const double rel_tol) + const int max_iter, + const double rel_tol) { int i, coupled_iter, stress_iter = 0; double *r_norm, r_norm_max, *oldval; @@ -740,30 +738,29 @@ coupled_shear_solver(struct simulation *sim, r_norm = empty(sim->nz); oldval = empty(sim->nz); } - - do { /* stress iterations */ + do { /* stress iterations */ coupled_iter = 0; - do { /* coupled iterations */ + do { /* coupled iterations */ if (sim->transient) { copy_values(sim->gamma_dot_p, oldval, sim->nz); /* step 1 */ - compute_inertia_number(sim); /* Eq. 1 */ + compute_inertia_number(sim); /* Eq. 1 */ /* step 2 */ compute_critical_state_porosity(sim); /* Eq. 2 */ /* step 3 */ - compute_tan_dilatancy_angle(sim); /* Eq. 5 */ + compute_tan_dilatancy_angle(sim); /* Eq. 5 */ } - compute_critical_state_friction(sim); /* Eq. 7 */ + compute_critical_state_friction(sim); /* Eq. 7 */ /* step 4 */ if (sim->transient) { - compute_porosity_change(sim); /* Eq. 3 */ - compute_permeability(sim); /* Eq. 6 */ + compute_porosity_change(sim); /* Eq. 3 */ + compute_permeability(sim); /* Eq. 6 */ } - compute_friction(sim); /* Eq. 4 */ + compute_friction(sim); /* Eq. 4 */ /* step 5, Eq. 13 */ if (sim->fluid) @@ -771,16 +768,16 @@ coupled_shear_solver(struct simulation *sim, exit(11); /* step 6 */ - compute_effective_stress(sim); /* Eq. 9 */ + compute_effective_stress(sim); /* Eq. 9 */ /* step 7 */ - compute_local_fluidity(sim); /* Eq. 10 */ - compute_cooperativity_length(sim); /* Eq. 12 */ + compute_local_fluidity(sim); /* Eq. 10 */ + compute_cooperativity_length(sim); /* Eq. 12 */ /* step 8, Eq. 11 */ if (implicit_1d_jacobian_poisson_solver(sim, - MAX_ITER_GRANULAR, - RTOL_GRANULAR)) + MAX_ITER_GRANULAR, + RTOL_GRANULAR)) exit(12); /* step 9 */ @@ -789,7 +786,7 @@ coupled_shear_solver(struct simulation *sim, compute_shear_velocity(sim); #ifdef DEBUG - for (i=0; i<sim->nz) { + for (i = 0; i < sim->nz) { 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]); @@ -800,9 +797,10 @@ coupled_shear_solver(struct simulation *sim, printf("sim->mu[%d] = %g\n", i, sim->mu[i]); } #endif - /* stable velocity field == coupled solution converged */ + /* stable velocity field == coupled solution + * converged */ if (sim->transient) { - for (i=0; i<sim->nz; ++i) + for (i = 0; i < sim->nz; ++i) r_norm[i] = residual_normalized(sim->gamma_dot_p[i], oldval[i]); r_norm_max = max(r_norm, sim->nz); if (r_norm_max <= rel_tol) @@ -813,9 +811,9 @@ coupled_shear_solver(struct simulation *sim, free(oldval); fprintf(stderr, "coupled_shear_solver: "); fprintf(stderr, "Transient solution did not converge " - "after %d iterations\n", coupled_iter); + "after %d iterations\n", coupled_iter); fprintf(stderr, ".. Residual normalized error: %g\n", - r_norm_max); + r_norm_max); return 1; } } @@ -823,28 +821,26 @@ coupled_shear_solver(struct simulation *sim, if (!isnan(sim->v_x_limit) || !isnan(sim->v_x_fix)) { if (!isnan(sim->v_x_limit)) { - vel_res_norm = (sim->v_x_limit - sim->v_x[sim->nz-1]) - /(sim->v_x[sim->nz-1] + 1e-12); + vel_res_norm = (sim->v_x_limit - sim->v_x[sim->nz - 1]) + / (sim->v_x[sim->nz - 1] + 1e-12); if (vel_res_norm > 0.0) vel_res_norm = 0.0; } else { - vel_res_norm = (sim->v_x_fix - sim->v_x[sim->nz-1]) - /(sim->v_x[sim->nz-1] + 1e-12); + vel_res_norm = (sim->v_x_fix - sim->v_x[sim->nz - 1]) + / (sim->v_x[sim->nz - 1] + 1e-12); } - sim->mu_wall *= 1.0 + (vel_res_norm*1e-2); + sim->mu_wall *= 1.0 + (vel_res_norm * 1e-2); } - if (++stress_iter > MAX_ITER_STRESS) { fprintf(stderr, "error: stress solution did not converge:\n"); fprintf(stderr, "v_x=%g, v_x_fix=%g, v_x_limit=%g, " - "vel_res_norm=%g, mu_wall=%g\n", - sim->v_x[sim->nz-1], sim->v_x_fix, sim->v_x_limit, - vel_res_norm, sim->mu_wall); + "vel_res_norm=%g, mu_wall=%g\n", + sim->v_x[sim->nz - 1], sim->v_x_fix, sim->v_x_limit, + vel_res_norm, sim->mu_wall); return 10; } - } while ((!isnan(sim->v_x_fix) || !isnan(sim->v_x_limit)) - && fabs(vel_res_norm) > RTOL_STRESS); + && fabs(vel_res_norm) > RTOL_STRESS); if (!isnan(sim->v_x_limit)) sim->mu_wall = mu_wall_orig; @@ -853,18 +849,17 @@ coupled_shear_solver(struct simulation *sim, free(r_norm); free(oldval); } - return 0; } double -find_flux(const struct simulation* sim) +find_flux(const struct simulation *sim) { int i; double flux = 0.0; - for (i=1; i<sim->nz; ++i) - flux += (sim->v_x[i] + sim->v_x[i-1])/2.0*sim->dz; + for (i = 1; i < sim->nz; ++i) + flux += (sim->v_x[i] + sim->v_x[i - 1]) / 2.0 * sim->dz; return flux; }