1d_fd_simple_shear_transient

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

commit aa7e4acb6d8f1d2cda21c117a363184f94ed2499
parent 231ab304381ef266046dffb7a26abc5833c32c7b
Author: Anders Damsgaard <anders@adamsgaard.dk>
Date:   Fri, 30 Aug 2019 12:58:03 +0200

Speed up code by avoiding use of index function idx1g

Diffstat:
MMakefile | 2+-
Mfluid.c | 75+++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------
Mmain.c | 1+
Msimulation.c | 34++++++++++++++++------------------
4 files changed, 73 insertions(+), 39 deletions(-)

diff --git a/Makefile b/Makefile @@ -1,4 +1,4 @@ -CFLAGS = -g -std=c99 -pedantic -Wall +CFLAGS = -std=c99 -pedantic -Wall -O3 LDFLAGS = -lm SRC = $(wildcard *.c) OBJ = $(patsubst %.c,%.o,$(SRC)) diff --git a/fluid.c b/fluid.c @@ -10,9 +10,9 @@ hydrostatic_fluid_pressure_distribution(struct simulation* sim) { int i; for (i=0; i<sim->nz; ++i) - sim->p_f_ghost[idx1g(i)] = sim->p_f_top + - sim->phi[i]*sim->rho_f*sim->G* - (sim->L_z - sim->z[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 @@ -64,7 +64,7 @@ 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[idx1g(sim->nz-1)] = 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, @@ -82,24 +82,24 @@ darcy_pressure_change_1d(const int i, const double beta_f, const double mu_f) { - double p, p_zn, p_zp, k_, div_k_grad_p, k_zn, k_zp; - - p = p_f_ghost_in[idx1g(i)]; - p_zn = p_f_ghost_in[idx1g(i-1)]; - p_zp = p_f_ghost_in[idx1g(i+1)]; + double k_, div_k_grad_p, k_zn, k_zp; 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, idx1g(i), + i, i+1, p_zn, p, p_zp, k_zn, k_, k_zp); #endif - div_k_grad_p = (2.0*k_zp*k_/(k_zp + k_) * (p_zp - p)/dz - - 2.0*k_zn*k_/(k_zn + k_) * (p - p_zn)/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 @@ -110,6 +110,38 @@ darcy_pressure_change_1d(const int i, return 1.0/(beta_f*phi[i]*mu_f)*div_k_grad_p; } +/*void +darcy_pressure_change_1d(double* dp_f_dt, + const int nz, + const double* p_f_ghost_in, + const double* phi, + const double* k, + const double dz, + const double beta_f, + const double mu_f) +{ + int i; + double k_, div_k_grad_p, k_zn, k_zp; + +#pragma omp parallel for private(i, k_, div_k_grad_p, k_zn, k_zp) if(nz>12) + for (i=0; i<nz; ++i) { + + 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]; + + 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; + + dp_f_dt[i] = 1.0/(beta_f*phi[i]*mu_f)*div_k_grad_p; + } +}*/ + int darcy_solver_1d(struct simulation* sim, const int max_iter, @@ -119,6 +151,8 @@ darcy_solver_1d(struct simulation* sim, double epsilon, theta, p_f_top, r_norm_max; double *dp_f_dt_expl; double *p_f_ghost_old, *dp_f_dt_impl, *p_f_ghost_new, *r_norm; + + r_norm_max = NAN; /* choose integration method, parameter in [0.0; 1.0] * epsilon = 0.0: explicit @@ -184,25 +218,26 @@ darcy_solver_1d(struct simulation* sim, sim->dz, sim->beta_f, sim->mu_f); + 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]); #endif - p_f_ghost_new[idx1g(i)] = p_f_ghost_old[idx1g(i)] + 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[idx1g(i)] += (1.0 - epsilon) + p_f_ghost_new[i+1] += (1.0 - epsilon) *dp_f_dt_expl[i]*sim->dt; - p_f_ghost_new[idx1g(i)] = p_f_ghost_old[idx1g(i)]*(1.0 - theta) - + p_f_ghost_new[idx1g(i)]*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] = (p_f_ghost_new[idx1g(i)] - - sim->p_f_ghost[idx1g(i)]) - /(sim->p_f_ghost[idx1g(i)] + 1e-16); + r_norm[i] = (p_f_ghost_new[i+1] + - sim->p_f_ghost[i+1]) + /(sim->p_f_ghost[i+1] + 1e-16); } r_norm_max = max(r_norm, sim->nz); @@ -237,7 +272,7 @@ darcy_solver_1d(struct simulation* sim, } } else { for (i=0; i<sim->nz; ++i) - sim->p_f_ghost[idx1g(i)] += dp_f_dt_expl[i]*sim->dt; + sim->p_f_ghost[i+1] += dp_f_dt_expl[i]*sim->dt; solved = 1; #ifdef DEBUG puts(".. dp_f_dt_expl:"); diff --git a/main.c b/main.c @@ -311,6 +311,7 @@ main(int argc, char* argv[]) filetimeclock = 0.0; iter = 0; mu_wall_orig = sim.mu_wall; + res_norm = NAN; while (sim.t <= sim.t_end) { stressiter = 0; diff --git a/simulation.c b/simulation.c @@ -253,7 +253,7 @@ 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[idx1g(i)], + sim->gamma_dot_p[i] = shear_strain_rate_plastic(sim->g_ghost[i+1], sim->mu[i]); } @@ -276,7 +276,7 @@ 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[idx1g(i)]; + sim->sigma_n_eff[i] = sim->sigma_n[i] - sim->p_f_ghost[i+1]; else for (i=0; i<sim->nz; ++i) sim->sigma_n_eff[i] = sim->sigma_n[i]; @@ -326,13 +326,13 @@ compute_local_fluidity(struct simulation* sim) { int i; for (i=0; i<sim->nz; ++i) - 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); + sim->g_ghost[i+1] = local_fluidity(sim->sigma_n_eff[i], + sim->mu[i], + sim->mu_s, + sim->C, + sim->b, + sim->rho_s, + sim->d); } void @@ -384,23 +384,21 @@ poisson_solver_1d_cell_update(int i, const double d) { double coorp_term; - int gi; 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* + g_out[i+1] = 1.0/(1.0 + coorp_term)*(coorp_term* 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); + + g_in[i+2]/2.0 + + g_in[i]/2.0); - r_norm[i] = pow(g_out[gi] - g_in[gi], 2.0) / (pow(g_out[gi], 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", local_fluidity(p[i], mu[i], mu_s, b, rho_s, d)); - printf(" g_in: %g\n", g_in[gi]); - printf(" g_out: %g\n", g_out[gi]); + 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 } @@ -521,7 +519,7 @@ print_wet_output(FILE* fp, struct simulation* sim, const int norm) sim->z[i], v_x_out[i], sim->sigma_n_eff[i], - sim->p_f_ghost[idx1g(i)], + sim->p_f_ghost[i+1], sim->mu[i], sim->gamma_dot_p[i]);