tFirst try at a more appropriate time step when coupling the fluid and transient solvers. - cngf-pf - continuum model for granular flows with pore-pressure dynamics (renamed from 1d_fd_simple_shear) (HTM) git clone git://src.adamsgaard.dk/cngf-pf (DIR) Log (DIR) Files (DIR) Refs (DIR) README (DIR) LICENSE --- (DIR) commit cc5fef7b04e30a4b6c1d41c4e3d47dddd2e45173 (DIR) parent a91a9d97e214821989e66263c3de85574dc6871e (HTM) Author: Ian Madden <iamadden@stanford.edu> Date: Thu, 11 Feb 2021 09:41:27 -0800 First try at a more appropriate time step when coupling the fluid and transient solvers. Signed-off-by: Anders Damsgaard <anders@adamsgaard.dk> Diffstat: M cngf-pf.c | 5 +++++ M simulation.c | 24 +++++++++++++++++++++++- M simulation.h | 2 ++ 3 files changed, 30 insertions(+), 1 deletion(-) --- (DIR) diff --git a/cngf-pf.c b/cngf-pf.c t@@ -254,8 +254,13 @@ main(int argc, char *argv[]) free_arrays(&sim); return 20; } + if (sim.transient) { + set_coupled_fluid_transient_timestep(&sim, 0.5); + } } } + fprintf(stderr, "t_val = %g \n", sim.dt); + if (sim.dt > sim.file_dt) sim.dt = sim.file_dt; (DIR) diff --git a/simulation.c b/simulation.c t@@ -834,6 +834,7 @@ coupled_shear_solver(struct simulation *sim, printf("sim->mu[%d] = %g\n", i, sim->mu[i]); } #endif + /* stable porosity change field == coupled solution converged */ if (sim->transient) { for (i = 0; i < sim->nz; ++i) t@@ -852,7 +853,6 @@ coupled_shear_solver(struct simulation *sim, } } } while (sim->transient); - 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]) t@@ -895,3 +895,25 @@ find_flux(const struct simulation *sim) return flux; } + +int set_coupled_fluid_transient_timestep(struct simulation *sim, const double safety) { + // Compute Maximum Strain Rate Expected + double max_gamma_dot = 1/sim->d; + if (!isnan(sim->v_x_fix)) max_gamma_dot = sim->v_x_fix / sim->dz; + if (!isnan(sim->v_x_limit)) max_gamma_dot = sim->v_x_limit / sim->dz; + // Compute estimate for mu for cooperativity length + double mu = (sim->mu_wall / ((sim->sigma_n[sim->nz-1]- sim->p_f_mod_ampl)/ (sim->P_wall - sim->p_f_top))) + sim->dilatancy_constant * sim->phi[sim->nz-1]; + // Compute estimate for cooperativity length + double xi = cooperativity_length(sim->A, + sim->d, + mu, + (sim->sigma_n[sim->nz-1]- sim->p_f_mod_ampl), + sim->mu_s, + sim->C); + // Compute Maximum Expected Inertia Number + double max_I = max_gamma_dot * sim->d / sqrt((sim->sigma_n[sim->nz-1]- sim->p_f_mod_ampl) / sim->rho_s); + double t_val = xi *(sim->alpha + sim->phi[sim->nz-1]*sim->beta_f) * sim->mu_f + / (sim->phi[sim->nz-1] * sim->phi[sim->nz-1]* sim->phi[sim->nz-1]*sim->L_z* max_I); + if (sim->dt > safety * t_val) sim->dt = safety * t_val; + return 0; +} (DIR) diff --git a/simulation.h b/simulation.h t@@ -153,6 +153,8 @@ void print_output(struct simulation *sim, FILE *fp, const int normalize); int coupled_shear_solver(struct simulation *sim, const int max_iter, const double rel_tol); + +int set_coupled_fluid_transient_timestep(struct simulation *sim, const double safety); double find_flux(const struct simulation *sim);