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 e94f455468778b12e109147a3c3eb2732b554a9a
parent 464550e2aba5f3dcec7454d023843dae46aafc24
Author: Anders Damsgaard <anders@adamsgaard.dk>
Date:   Mon,  1 Jul 2019 11:10:36 +0200

Fix conditional operations depending on epsilon value

Diffstat:
Mfluid.c | 69+++++++++++++++++++++++++++++++++++++++++++--------------------------
1 file changed, 43 insertions(+), 26 deletions(-)

diff --git a/fluid.c b/fluid.c @@ -112,7 +112,8 @@ darcy_solver_1d(struct simulation* sim, * epsilon = 0.5: Crank-Nicolson * epsilon = 1.0: implicit */ /* epsilon = 0.5; */ - epsilon = 0.0; + /* epsilon = 0.0; */ + epsilon = 1.0; /* choose relaxation factor, parameter in ]0.0; 1.0] * theta in ]0.0; 1.0]: underrelaxation @@ -132,21 +133,23 @@ darcy_solver_1d(struct simulation* sim, sim->p_f_ghost[idx1g(sim->nz-1)] = p_f_top; /* Include top node in BC */ set_bc_neumann(sim->p_f_ghost, sim->nz, -1); - /* compute explicit solution to pressure change */ - solved = 1; - dp_f_dt_expl = zeros(sim->nz); - for (i=0; i<sim->nz; ++i) - dp_f_dt_expl[i] = darcy_pressure_change_1d(i, - sim->nz, - sim->p_f_ghost, - sim->phi, - sim->k, - sim->dz, - sim->beta_f, - sim->mu_f); - - if (epsilon > 1e-3) { - solved = 0; + solved = 0; + + if (epsilon < 1.0) { + /* compute explicit solution to pressure change */ + dp_f_dt_expl = zeros(sim->nz); + for (i=0; i<sim->nz; ++i) + dp_f_dt_expl[i] = darcy_pressure_change_1d(i, + sim->nz, + sim->p_f_ghost, + sim->phi, + sim->k, + sim->dz, + sim->beta_f, + sim->mu_f); + } + + if (epsilon > 0.0) { /* compute implicit solution to pressure change */ dp_f_dt_impl = zeros(sim->nz); p_f_ghost_out = zeros(sim->nz+2); @@ -175,14 +178,17 @@ darcy_solver_1d(struct simulation* sim, 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_expl[i], i, dp_f_impl[i]); + i, dp_f_dt_expl[i], i, dp_f_dt_impl[i]); #endif p_f = sim->p_f_ghost[idx1g(i)]; p_f_ghost_out[idx1g(i)] = p_f - + ((1.0 - epsilon)*dp_f_dt_expl[i] - + epsilon*dp_f_dt_impl[i])*sim->dt; + + epsilon*dp_f_dt_impl[i]*sim->dt; + + if (epsilon < 1.0) + p_f_ghost_out[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) @@ -214,14 +220,25 @@ darcy_solver_1d(struct simulation* sim, free(dp_f_dt_impl); free(p_f_ghost_out); free(r_norm); + if (!solved) { + fprintf(stderr, "darcy_solver_1d: "); + fprintf(stderr, "Solution did not converge after %d iterations\n", + iter); + fprintf(stderr, ".. Residual normalized error: %f\n", r_norm_max); + } + } else { + for (i=0; i<sim->nz; ++i) + sim->p_f_ghost[idx1g(i)] += 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); +#endif } - if (!solved) { - fprintf(stderr, "darcy_solver_1d: "); - fprintf(stderr, "Solution did not converge after %d iterations\n", - iter); - fprintf(stderr, ".. Residual normalized error: %f\n", r_norm_max); - } - free(dp_f_dt_expl); + if (epsilon < 1.0) + free(dp_f_dt_expl); return solved - 1; }