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

commit 599c08baed18df47fd5a6fac8b587e5d51553519
parent 802c24eb1aed07014ed6c8f0ba825298b24a8325
Author: Anders Damsgaard <anders@adamsgaard.dk>
Date:   Mon,  1 Jul 2019 21:12:56 +0200

Rename p_f_ghost_out to p_f_ghost_new, and add p_f_ghost_old with old vals saved

Diffstat:
Mfluid.c | 33++++++++++++++++++++-------------
1 file changed, 20 insertions(+), 13 deletions(-)

diff --git a/fluid.c b/fluid.c @@ -117,7 +117,8 @@ darcy_solver_1d(struct simulation* sim, { int i, iter, solved; double epsilon, theta, p_f, p_f_top, r_norm_max; - double *dp_f_dt_expl, *dp_f_dt_impl, *p_f_ghost_out, *r_norm; + 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 @@ -162,8 +163,10 @@ darcy_solver_1d(struct simulation* sim, if (epsilon > 0.0) { /* compute implicit solution with Jacobian iterations */ dp_f_dt_impl = zeros(sim->nz); - p_f_ghost_out = 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); for (iter=0; iter<max_iter; ++iter) { @@ -189,29 +192,32 @@ darcy_solver_1d(struct simulation* sim, i, dp_f_dt_expl[i], i, dp_f_dt_impl[i]); #endif - p_f = sim->p_f_ghost[idx1g(i)]; + p_f_old = sim->p_f_ghost[idx1g(i)]; - p_f_ghost_out[idx1g(i)] = p_f + /* I keep adding dp/dt with every iteration + * p_f_old is not the value from the previous time step, + * but the value from the previous iteration. */ + p_f_ghost_new[idx1g(i)] = p_f_old + epsilon*dp_f_dt_impl[i]*sim->dt; if (epsilon < 1.0) - p_f_ghost_out[idx1g(i)] += (1.0 - epsilon) + p_f_ghost_new[idx1g(i)] += (1.0 - epsilon) *dp_f_dt_expl[i]*sim->dt; - /* apply relaxation */ - p_f_ghost_out[idx1g(i)] = p_f*(1.0 - theta) - + p_f_ghost_out[idx1g(i)]*theta; + p_f_ghost_new[idx1g(i)] = p_f_old*(1.0 - theta) + + p_f_ghost_new[idx1g(i)]*theta; - r_norm[i] = (p_f_ghost_out[idx1g(i)] - p_f)/(p_f + 1e-16); + r_norm[i] = (p_f_ghost_new[idx1g(i)] - p_f_old) + /(p_f_old + 1e-16); } r_norm_max = max(r_norm, sim->nz); #ifdef DEBUG - puts(".. p_f_ghost_out:"); - print_array(p_f_ghost_out, sim->nz+2); + puts(".. p_f_ghost_new:"); + print_array(p_f_ghost_new, sim->nz+2); #endif - copy_values(p_f_ghost_out, 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); @@ -226,8 +232,9 @@ darcy_solver_1d(struct simulation* sim, } } free(dp_f_dt_impl); - free(p_f_ghost_out); + free(p_f_ghost_new); free(r_norm); + free(p_f_ghost_old); if (!solved) { fprintf(stderr, "darcy_solver_1d: "); fprintf(stderr, "Solution did not converge after %d iterations\n",