commit 6cb6fc35f0aa16cadba133b4bd63f7376c7cdc58
parent 1620e64a74db3220031e60593953ae346764d138
Author: Anders Damsgaard <anders@adamsgaard.dk>
Date: Fri, 5 Apr 2019 20:08:43 +0200
Implement final fixes, minimize stdout output
Diffstat:
5 files changed, 33 insertions(+), 22 deletions(-)
diff --git a/1d_fd_simple_shear.jl b/1d_fd_simple_shear.jl
@@ -140,7 +140,6 @@ function poisson_solver_1d_iteration(g_in, g_out, r_norm,
verbose=true)
coorp_term = Δz^2.0/(2.0*ξ(μ[i])^2.0)
- 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)
r_norm[i] = (g_out[i+1] - g_in[i+1])^2.0 / (g_out[i+1]^2.0 + 1e-16)
@@ -148,7 +147,7 @@ function poisson_solver_1d_iteration(g_in, g_out, r_norm,
if verbose
println("-- $i -----------------")
println("coorp_term: $coorp_term")
- println(" g_local: $g_local_")
+ println(" g_local: $(g_local(p[i], μ[i]))")
println(" g_in: $(g_in[i+1])")
println(" g_out: $(g_out[i+1])")
println(" r_norm: $(r_norm[i])")
@@ -178,6 +177,7 @@ function implicit_1d_jacobian_poisson_solver(g, p, μ, Δz,
r_norm_max = 0.0
for iter=1:max_iter
+ println("\n@@@ ITERATION $iter @@@")
set_bc_dirichlet(g, "-z")
set_bc_neumann(g, "+z")
@@ -200,15 +200,6 @@ function implicit_1d_jacobian_poisson_solver(g, p, μ, Δz,
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
diff --git a/arrays.c b/arrays.c
@@ -48,9 +48,8 @@ double* linspace(const double lower, const double upper, const int n)
{
double *x = malloc(n*sizeof(double));
double dx = (upper - lower)/(double)(n-1);
- for (int i=0; i<n; ++i) {
+ for (int i=0; i<n; ++i)
x[i] = lower + dx*i;
- printf("x[%d] = %f\n", i, x[i]);}
return x;
}
@@ -101,5 +100,17 @@ double min(const double* a, const int n)
void print_array(const double* a, const int n)
{
for (int i=0; i<n; ++i)
- printf("%g\n", a[i]);
+ printf("%.17g\n", a[i]);
+}
+
+void print_arrays(const double* a, const double* b, const int n)
+{
+ for (int i=0; i<n; ++i)
+ printf("%.17g\t%.17g\n", a[i], b[i]);
+}
+
+void copy_values(const double* in, double* out, const int n)
+{
+ for (int i=0; i<n; ++i)
+ out[i] = in[i];
}
diff --git a/arrays.h b/arrays.h
@@ -26,5 +26,8 @@ double max(const double* a, const int n);
double min(const double* a, const int n);
void print_array(const double* a, const int n);
+void print_arrays(const double* a, const double* b, const int n);
+
+void copy_values(const double* in, double* out, const int n);
#endif
diff --git a/main.c b/main.c
@@ -18,9 +18,11 @@ int main(int argc, char** argv) {
init_friction(&sim);
compute_cooperativity_length(&sim);
+#ifdef DEBUG
puts("\n## Before solver");
puts(".. p:"); print_array(sim.p, sim.nz);
puts(".. mu:"); print_array(sim.mu, sim.nz);
+#endif
if (implicit_1d_jacobian_poisson_solver(&sim, 10000, 1e-5))
exit(1);
@@ -28,9 +30,7 @@ int main(int argc, char** argv) {
compute_shear_strain_rate_plastic(&sim);
compute_shear_velocity(&sim);
- puts("\n## After solver");
- puts(".. g:"); print_array(sim.g_ghost, sim.nz+2);
- puts(".. v_x:"); print_array(sim.v_x, sim.nz);
+ print_arrays(sim.z, sim.v_x, sim.nz);
free_arrays(&sim);
return 0;
diff --git a/simulation.c b/simulation.c
@@ -42,6 +42,7 @@ void compute_shear_strain_rate_plastic(struct simulation* sim)
void compute_shear_velocity(struct simulation* sim)
{
+ // TODO: implement iterative solver
// Dirichlet BC at bottom
sim->v_x[0] = sim->v_x_bot;
@@ -91,7 +92,7 @@ void set_bc_neumann(double* g_ghost, const int nz, const int boundary)
if (boundary == -1)
g_ghost[0] = g_ghost[1];
else if (boundary == +1)
- g_ghost[idx1g(nz)+1] = g_ghost[idx1g(nz)];
+ g_ghost[nz+1] = g_ghost[nz];
else {
fprintf(stderr, "set_bc_neumann: Unknown boundary %d\n", boundary);
exit(1);
@@ -137,12 +138,14 @@ void poisson_solver_1d_cell_update(
r_norm[i] = pow(g_out[gi] - g_in[gi], 2.0) / (pow(g_out[gi], 2.0) + 1e-16);
+#ifdef DEBUG
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[i]);
+#endif
}
int implicit_1d_jacobian_poisson_solver(
@@ -157,6 +160,9 @@ int implicit_1d_jacobian_poisson_solver(
double r_norm_max = NAN;
for (iter=0; iter<max_iter; ++iter) {
+#ifdef DEBUG
+ printf("\n@@@ ITERATION %d @@@\n", iter);
+#endif
set_bc_dirichlet(sim->g_ghost, sim->nz, -1, 0.0);
set_bc_neumann(sim->g_ghost, sim->nz, +1);
@@ -177,14 +183,14 @@ int implicit_1d_jacobian_poisson_solver(
sim->d);
r_norm_max = max(r_norm, sim->nz);
- double* tmp = sim->g_ghost;
- sim->g_ghost = g_ghost_out;
- g_ghost_out = tmp;
+ copy_values(g_ghost_out, sim->g_ghost, sim->nz+2);
if (r_norm_max <= rel_tol) {
+ set_bc_dirichlet(sim->g_ghost, sim->nz, -1, 0.0);
+ set_bc_neumann(sim->g_ghost, sim->nz, +1);
free(g_ghost_out);
free(r_norm);
- printf(".. Solution converged after %d iterations\n", iter);
+ /* printf(".. Solution converged after %d iterations\n", iter); */
return 0;
}
}