commit 4def6527e85a80d0dc2b52f51aa376c782d296d4
parent f65899ee85de5ed0234d7b2164c22ff80b25a978
Author: Anders Damsgaard <anders@adamsgaard.dk>
Date:   Thu,  4 Apr 2019 16:29:15 +0200
Add working script
Diffstat:
| M | 1d_fd_simple_shear.jl | | | 94 | ++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------- | 
1 file changed, 60 insertions(+), 34 deletions(-)
diff --git a/1d_fd_simple_shear.jl b/1d_fd_simple_shear.jl
@@ -9,13 +9,14 @@ import PyPlot
 const G = 9.81
 
 ## Wall parameters
-const P_wall = 10.0e3 # normal stress [Pa]
+const P_wall = 1.0e3  # normal stress [Pa]
 # const v_x_wall = 1e-0 # wall velocity along x [m/s]
 const v_x_bot = 0.0   # bottom velocity along x [m/s]
-const μ_wall = 0.382  # stress ratio at top wall
+#const μ_wall = 0.392  # stress ratio at top wall
+const μ_wall = 0.52  # stress ratio at top wall
 
 ## Nodes along z
-const nz = 10
+const nz = 100
 
 ## Material properties
 const A = 0.48        # nonlocal amplitude [-]
@@ -71,22 +72,22 @@ function g_set_bc_neumann(g_ghost)
 end
 
 ## Compute shear stress from velocity gradient using finite differences
-function shear_stress(v, Δz)
-    τ = zero(v)
-
-    # compute inner values with central differences
-    for i=2:length(v)-1
-        τ[i] = (v[i+1] - v[i-1])/(2.0*Δz)
-    end
-
-    # use forward/backward finite differences at edges
-    τ[1] = (v[2] - v[1])/Δz
-    τ[end] = (v[end] - v[end-1])/Δz
-
-    return τ
-end
+# function shear_stress(v, Δz)
+#     τ = zero(v)
+#
+#     # compute inner values with central differences
+#     for i=2:length(v)-1
+#         τ[i] = (v[i+1] - v[i-1])/(2.0*Δz)
+#     end
+#
+#     # use forward/backward finite differences at edges
+#     τ[1] = (v[2] - v[1])/Δz
+#     τ[end] = (v[end] - v[end-1])/Δz
+#
+#     return τ
+# end
 
-friction(τ, p) = τ./(p .+ 1e-16)
+#friction(τ, p) = τ./(p .+ 1e-16)
 
 ## Fluidity
 #fluidity(p, μ, g) = 1.0./(ξ.(μ).^2.0) .* (g .- g_local.(p, μ))
@@ -102,38 +103,57 @@ friction(τ, p) = τ./(p .+ 1e-16)
 
 ## A single iteration for solving a Poisson equation Laplace(phi) = f on a
 ## Cartesian grid. The function returns the normalized residual value
-# TODO f is not used?
-function poisson_solver_1d_iteration(g_in, g_out, μ, p, i, Δz)
+function poisson_solver_1d_iteration(g_in, g_out, μ, p, i, Δz, verbose=false)
 
     coorp_term = Δz^2.0/(2.0*ξ(μ[i])^2.0)
-    g_out[i] = 1.0/(1.0 + coorp_term) * (coorp_term*g_local(p[i], μ[i])
-                                         + g_in[i+1]/2.0 + g_in[i-1]/2.0)
-
-    return (g_out[i] - g_in[i])^2.0 / (g_out[i]^2.0 + 1e-16)
+    g_local_ = g_local(p[i], μ[i])
+    g_out[i+1] = 1.0/(1.0 + coorp_term) * (coorp_term*g_local(p[i], μ[i])
+                                           + g_in[i+1+1]/2.0 + g_in[i-1+1]/2.0)
+    res_norm = (g_out[i+1] - g_in[i+1])^2.0 / (g_out[i+1]^2.0 + 1e-16)
+
+    if verbose
+        println("-- $i -----------------")
+        println("coorp_term: $coorp_term")
+        println("   g_local: $g_local_")
+        println("      g_in: $(g_in[i+1])")
+        println("     g_out: $(g_out[i+1])")
+        println("  res_norm: $res_norm")
+    end
+    return res_norm
 end
 
 ## Iteratively solve the system laplace(phi) = f
 function implicit_1d_jacobian_poisson_solver(g, p, μ, Δz,
-                                             rel_tol=1e-4,
+                                             rel_tol=1e-5,
                                              #max_iter=10_000,
                                              max_iter=10,
-                                             verbose=true)
+                                             verbose=false)
 
     # allocate second array of g for Jacobian solution procedure
     g_out = g
 
-    # transfer ghost node values
-    g_out[1] = g[1]
-    g_out[end] = g[end]
+    if verbose
+        println("g: ")
+        println(g)
+        println()
+        println("g_out: ")
+        println(g_out)
+    end
 
     # array of normalized residuals
     local r_norm = zero(g)
 
     for iter=1:max_iter
 
+        g_set_bc_neumann(g)
+        if verbose
+            println("g after BC: ")
+            println(g)
+        end
+
         # perform a single jacobi iteration in each cell
         # if iter%2 == 0
-            for iz=2:length(g)-2
+            for iz=1:length(p)
                 r_norm[iz] = poisson_solver_1d_iteration(g, g_out, μ, p, iz, Δz)
             end
         # else  # reverse direction every second time
@@ -142,9 +162,17 @@ function implicit_1d_jacobian_poisson_solver(g, p, μ, Δz,
         #                                                  f, iz, Δz)
         #     end
         # end
-
         r_norm_max = maximum(r_norm)
 
+        if verbose
+            println("g after jacobi iteration $iter: ")
+            println(g)
+            println("r_norm:")
+            println(r_norm)
+            println("r_norm_max:")
+            println(r_norm_max)
+        end
+
         # Flip-flop arrays
         tmp = g
         g = g_out
@@ -187,13 +215,11 @@ v_x[1] = v_x_bot
 ## Calculate stressses
 p = p_lithostatic(P_wall, z)
 μ = init_μ(μ_wall, ϕ, ρ_s, G, z, P_wall)
-τ = shear_stress(v_x, Δz)
+#τ = shear_stress(v_x, Δz)
 
 #f = forcing(p, μ, g_ghost)
 #g_ghost[2:end-1] = f
 
-g_set_bc_neumann(g_ghost)
-
 implicit_1d_jacobian_poisson_solver(g_ghost, p, μ, Δz)
 
 v_x = γ_dot_p(g_ghost[2:end-1], μ)