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 1620e64a74db3220031e60593953ae346764d138
parent bf84e746592960c537206a8913ffbef07110f228
Author: Anders Damsgaard <anders@adamsgaard.dk>
Date:   Fri,  5 Apr 2019 16:11:36 +0200

Perform detailed comparison between implementations

Diffstat:
M1d_fd_simple_shear.jl | 47+++++++++++++++++++++++++++++++++++++----------
M1d_fd_simple_shear.png | 0
M1d_fd_simple_shear_damsgaard2013.h | 5++++-
M1d_fd_simple_shear_henann_kamrin2016.h | 1+
Marrays.c | 5+++--
Mmain.c | 1+
Msimulation.c | 19++++++++++++++-----
Msimulation.h | 1+
8 files changed, 61 insertions(+), 18 deletions(-)

diff --git a/1d_fd_simple_shear.jl b/1d_fd_simple_shear.jl @@ -14,7 +14,8 @@ G = 9.81 ### Effective normal stress exerted by top wall # A larger normal stress deepens the deformational depth -P_wall_ = [10, 20, 40, 60, 80, 120] .* 1e3 # normal stress [Pa] +#P_wall_ = [10, 20, 40, 60, 80, 120] .* 1e3 # normal stress [Pa] +P_wall_ = [10] .* 1e3 # normal stress [Pa] ### bottom velocity along x [m/s] v_x_bot = 0.0 @@ -23,7 +24,7 @@ v_x_bot = 0.0 μ_wall = 0.40 ### Nodes along z -nz = 100 +nz = 10 ## Material properties @@ -136,7 +137,7 @@ end ## Cartesian grid. The function returns the normalized residual value function poisson_solver_1d_iteration(g_in, g_out, r_norm, μ, p, i, Δz, - verbose=false) + verbose=true) coorp_term = Δz^2.0/(2.0*ξ(μ[i])^2.0) g_local_ = g_local(p[i], μ[i]) @@ -158,6 +159,7 @@ end function implicit_1d_jacobian_poisson_solver(g, p, μ, Δz, rel_tol=1e-5, max_iter=10_000, + #max_iter=1, verbose=false) # allocate second array of g for Jacobian solution procedure @@ -177,13 +179,13 @@ function implicit_1d_jacobian_poisson_solver(g, p, μ, Δz, for iter=1:max_iter - set_bc_neumann(g, "+z") set_bc_dirichlet(g, "-z") + set_bc_neumann(g, "+z") # Damsgaard et al 2013 include fixed grains in plot - for i=1:9 - set_bc_dirichlet(g, "-z", idx_offset=i) - end + # for i=1:9 + # set_bc_dirichlet(g, "-z", idx_offset=i) + # end if verbose println("g after BC: ") @@ -191,8 +193,8 @@ function implicit_1d_jacobian_poisson_solver(g, p, μ, Δz, end # perform a single jacobi iteration in each cell - #for iz=1:length(p) - for iz=10:length(p) + for iz=1:length(p) + #for iz=10:length(p) poisson_solver_1d_iteration(g, g_out, r_norm, μ, p, iz, Δz) end @@ -227,6 +229,20 @@ function implicit_1d_jacobian_poisson_solver(g, p, μ, Δz, @error "Solution didn't converge after $max_iter iterations ($r_norm_max)" end +function shear_velocity(γ_dot, Δz, v_x_bot) + + v_x = zero(γ_dot) + + # BC + v_x[1] = v_x_bot + + for i=2:length(v_x) + v_x[i] = v_x[i-1] + γ_dot[i]*Δz + end + + return v_x +end + function plot_profile(z, v, label, filename) PyPlot.figure(figsize=[4,4]) PyPlot.plot(v, z, "+k") @@ -248,13 +264,24 @@ for P_wall in P_wall_ ## calculate stresses p = p_lithostatic(P_wall, z) μ = init_μ(μ_wall, ϕ, ρ_s, G, z, P_wall) + println(".. z:") + println(z) + println(".. p:") + println(p) + println(".. mu:") + println(μ) ## solve for fluidity implicit_1d_jacobian_poisson_solver(g_ghost, p, μ, Δz) ## calculate shear velocitiesj - v_x = γ_dot_p(g_ghost[2:end-1], μ) + γ_dot = γ_dot_p(g_ghost[2:end-1], μ) + v_x = shear_velocity(γ_dot, Δz, v_x_bot) + println(".. g:") + println(g_ghost) + println(".. v_x:") + println(v_x) ## plot results P = Int(round(P_wall/1e3)) diff --git a/1d_fd_simple_shear.png b/1d_fd_simple_shear.png Binary files differ. diff --git a/1d_fd_simple_shear_damsgaard2013.h b/1d_fd_simple_shear_damsgaard2013.h @@ -2,6 +2,7 @@ #define ONED_FD_SIMPLE_SHEAR_ #include <math.h> +#include <stdio.h> #include "arrays.h" #include "simulation.h" @@ -17,6 +18,7 @@ struct simulation init_sim(void) sim.P_wall = 10e3; /* larger normal stress deepens the shear depth */ sim.mu_wall = 0.40; + sim.v_x_bot = 0.0; sim.nz = 10; @@ -57,7 +59,8 @@ void init_friction(struct simulation* sim) { for (int i=0; i<sim->nz; ++i) sim->mu[i] = sim->mu_wall / - (1.0 + (1.0 - sim->phi)*sim->rho_s*sim->G*(sim->L_z - sim->z[i])); + (1.0 + (1.0 - sim->phi)*sim->rho_s*sim->G*(sim->L_z - sim->z[i])/ + sim->P_wall); } #endif diff --git a/1d_fd_simple_shear_henann_kamrin2016.h b/1d_fd_simple_shear_henann_kamrin2016.h @@ -16,6 +16,7 @@ struct simulation init_sim(void) sim.P_wall = 10e3; /* larger normal stress deepens the deformational depth */ sim.mu_wall = 0.40; + sim.v_x_bot = 0.0; sim.nz = 100; diff --git a/arrays.c b/arrays.c @@ -47,9 +47,10 @@ unsigned int idx1g(const unsigned int i) double* linspace(const double lower, const double upper, const int n) { double *x = malloc(n*sizeof(double)); - double dx = (upper - lower)/(double)n; - for (int i=0; i<n; ++i) + double dx = (upper - lower)/(double)(n-1); + for (int i=0; i<n; ++i) { x[i] = lower + dx*i; + printf("x[%d] = %f\n", i, x[i]);} return x; } diff --git a/main.c b/main.c @@ -26,6 +26,7 @@ int main(int argc, char** argv) { exit(1); compute_shear_strain_rate_plastic(&sim); + compute_shear_velocity(&sim); puts("\n## After solver"); puts(".. g:"); print_array(sim.g_ghost, sim.nz+2); diff --git a/simulation.c b/simulation.c @@ -40,6 +40,15 @@ void compute_shear_strain_rate_plastic(struct simulation* sim) shear_strain_rate_plastic(sim->g_ghost[idx1g(i)], sim->mu[i]); } +void compute_shear_velocity(struct simulation* sim) +{ + // Dirichlet BC at bottom + sim->v_x[0] = sim->v_x_bot; + + for (int i=1; i<sim->nz; ++i) + sim->v_x[i] = sim->v_x[i-1] + sim->gamma_dot_p[i]*sim->dz; +} + double cooperativity_length( const double A, const double d, @@ -126,14 +135,14 @@ void poisson_solver_1d_cell_update( + g_in[gi+1]/2.0 + g_in[gi-1]/2.0); - r_norm[i] = pow(g_out[gi] - g_in[gi], 1.0) / (pow(g_out[gi], 2.0) + 1e-16); + r_norm[i] = pow(g_out[gi] - g_in[gi], 2.0) / (pow(g_out[gi], 2.0) + 1e-16); 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(" r_norm: %g\n", r_norm[gi]); + printf(" r_norm: %g\n", r_norm[i]); } int implicit_1d_jacobian_poisson_solver( @@ -144,14 +153,14 @@ int implicit_1d_jacobian_poisson_solver( double* g_ghost_out = empty(sim->nz); double* r_norm = empty(sim->nz); - set_bc_neumann(sim->g_ghost, sim->nz, +1); - set_bc_dirichlet(sim->g_ghost, sim->nz, -1, 0.0); - int iter; double r_norm_max = NAN; for (iter=0; iter<max_iter; ++iter) { + set_bc_dirichlet(sim->g_ghost, sim->nz, -1, 0.0); + set_bc_neumann(sim->g_ghost, sim->nz, +1); + for (int i=0; i<sim->nz; ++i) poisson_solver_1d_cell_update( i, diff --git a/simulation.h b/simulation.h @@ -78,6 +78,7 @@ void set_bc_dirichlet( void compute_cooperativity_length(struct simulation* sim); void compute_shear_strain_rate_plastic(struct simulation* sim); +void compute_shear_velocity(struct simulation* sim); int implicit_1d_jacobian_poisson_solver( struct simulation* sim,