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:
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,