commit e94f455468778b12e109147a3c3eb2732b554a9a
parent 464550e2aba5f3dcec7454d023843dae46aafc24
Author: Anders Damsgaard <anders@adamsgaard.dk>
Date:   Mon,  1 Jul 2019 11:10:36 +0200
Fix conditional operations depending on epsilon value
Diffstat:
| M | fluid.c | | | 69 | +++++++++++++++++++++++++++++++++++++++++++-------------------------- | 
1 file changed, 43 insertions(+), 26 deletions(-)
diff --git a/fluid.c b/fluid.c
@@ -112,7 +112,8 @@ darcy_solver_1d(struct simulation* sim,
 	 *     epsilon = 0.5: Crank-Nicolson
 	 *     epsilon = 1.0: implicit */
 	/* epsilon = 0.5; */
-	epsilon = 0.0;
+	/* epsilon = 0.0; */
+	epsilon = 1.0;
 
 	/* choose relaxation factor, parameter in ]0.0; 1.0]
 	 *     theta in ]0.0; 1.0]: underrelaxation
@@ -132,21 +133,23 @@ darcy_solver_1d(struct simulation* sim,
 	sim->p_f_ghost[idx1g(sim->nz-1)] = p_f_top; /* Include top node in BC */
 	set_bc_neumann(sim->p_f_ghost, sim->nz, -1);
 
-	/* compute explicit solution to pressure change */
-	solved = 1;
-	dp_f_dt_expl = zeros(sim->nz);
-	for (i=0; i<sim->nz; ++i)
-		dp_f_dt_expl[i] = darcy_pressure_change_1d(i,
-		                                           sim->nz,
-		                                           sim->p_f_ghost,
-		                                           sim->phi,
-		                                           sim->k,
-		                                           sim->dz,
-		                                           sim->beta_f,
-		                                           sim->mu_f);
-
-	if (epsilon > 1e-3) {
-		solved = 0;
+	solved = 0;
+
+	if (epsilon < 1.0) {
+		/* compute explicit solution to pressure change */
+		dp_f_dt_expl = zeros(sim->nz);
+		for (i=0; i<sim->nz; ++i)
+			dp_f_dt_expl[i] = darcy_pressure_change_1d(i,
+			                                           sim->nz,
+			                                           sim->p_f_ghost,
+			                                           sim->phi,
+			                                           sim->k,
+			                                           sim->dz,
+			                                           sim->beta_f,
+			                                           sim->mu_f);
+	}
+
+	if (epsilon > 0.0) {
 		/* compute implicit solution to pressure change */
 		dp_f_dt_impl = zeros(sim->nz);
 		p_f_ghost_out = zeros(sim->nz+2);
@@ -175,14 +178,17 @@ darcy_solver_1d(struct simulation* sim,
 			for (i=0; i<sim->nz-1; ++i) {
 #ifdef DEBUG
 				printf("dp_f_expl[%d] = %g\ndp_f_impl[%d] = %g\n",
-				       i, dp_f_expl[i], i, dp_f_impl[i]);
+				       i, dp_f_dt_expl[i], i, dp_f_dt_impl[i]);
 #endif
 
 				p_f = sim->p_f_ghost[idx1g(i)];
 
 				p_f_ghost_out[idx1g(i)] = p_f
-				                          + ((1.0 - epsilon)*dp_f_dt_expl[i]
-				                          + epsilon*dp_f_dt_impl[i])*sim->dt;
+				                          + epsilon*dp_f_dt_impl[i]*sim->dt;
+
+				if (epsilon < 1.0)
+					p_f_ghost_out[idx1g(i)] += (1.0 - epsilon)
+					                           *dp_f_dt_expl[i]*sim->dt;
 
 				/* apply relaxation */
 				p_f_ghost_out[idx1g(i)] = p_f*(1.0 - theta)
@@ -214,14 +220,25 @@ darcy_solver_1d(struct simulation* sim,
 		free(dp_f_dt_impl);
 		free(p_f_ghost_out);
 		free(r_norm);
+		if (!solved) {
+			fprintf(stderr, "darcy_solver_1d: ");
+			fprintf(stderr, "Solution did not converge after %d iterations\n",
+			        iter);
+			fprintf(stderr, ".. Residual normalized error: %f\n", r_norm_max);
+		}
+	} else {
+		for (i=0; i<sim->nz; ++i)
+			sim->p_f_ghost[idx1g(i)] += dp_f_dt_expl[i]*sim->dt;
+		solved = 1;
+#ifdef DEBUG
+		puts(".. dp_f_dt_expl:");
+		print_array(dp_f_dt_expl, sim->nz);
+		puts(".. p_f_ghost after explicit solution:");
+		print_array(sim->p_f_ghost, sim->nz+2);
+#endif
 	}
 
-	if (!solved) {
-		fprintf(stderr, "darcy_solver_1d: ");
-		fprintf(stderr, "Solution did not converge after %d iterations\n",
-		        iter);
-		fprintf(stderr, ".. Residual normalized error: %f\n", r_norm_max);
-	}
-	free(dp_f_dt_expl);
+	if (epsilon < 1.0)
+		free(dp_f_dt_expl);
 	return solved - 1;
 }