commit 64a84fc4e4904e2645cf9202427d8796ee34ac9f
parent 561018bfb5915a45d9340eb3e1268a0c9e3a4b43
Author: Anders Damsgaard <anders@adamsgaard.dk>
Date: Wed, 6 May 2020 14:03:33 +0200
Swap array pointers instead of copying values in iterative solvers
Diffstat:
2 files changed, 11 insertions(+), 7 deletions(-)
diff --git a/fluid.c b/fluid.c
@@ -156,8 +156,8 @@ darcy_solver_1d(struct simulation *sim,
{
int i, iter, solved = 0;
double epsilon, theta, p_f_top, r_norm_max = NAN;
- double *dp_f_dt_expl;
- double *p_f_ghost_old, *dp_f_dt_impl, *p_f_ghost_new, *r_norm;
+ double *dp_f_dt_expl, *p_f_ghost_old, *dp_f_dt_impl, *p_f_ghost_new;
+ double *tmp, *r_norm;
/* choose integration method, parameter in [0.0; 1.0]
* epsilon = 0.0: explicit
@@ -260,7 +260,9 @@ darcy_solver_1d(struct simulation *sim,
print_array(p_f_ghost_new, sim->nz + 2);
#endif
- copy_values(p_f_ghost_new, sim->p_f_ghost, sim->nz + 2);
+ tmp = p_f_ghost_new;
+ p_f_ghost_new = sim->p_f_ghost;
+ sim->p_f_ghost = tmp;
#ifdef DEBUG
puts(".. p_f_ghost after update:");
print_array(sim->p_f_ghost, sim->nz + 2);
diff --git a/simulation.c b/simulation.c
@@ -634,7 +634,7 @@ implicit_1d_jacobian_poisson_solver(struct simulation *sim,
{
int iter, i;
double r_norm_max = NAN;
- double *g_ghost_out = empty(sim->nz + 2), *r_norm = empty(sim->nz);
+ double *tmp, *g_ghost_out = empty(sim->nz + 2), *r_norm = empty(sim->nz);
for (iter = 0; iter < max_iter; ++iter) {
#ifdef DEBUG
@@ -657,7 +657,9 @@ implicit_1d_jacobian_poisson_solver(struct simulation *sim,
sim->xi);
r_norm_max = max(r_norm, sim->nz);
- copy_values(g_ghost_out, sim->g_ghost, sim->nz + 2);
+ tmp = g_ghost_out;
+ g_ghost_out = sim->g_ghost;
+ sim->g_ghost = tmp;
if (r_norm_max <= rel_tol) {
set_bc_dirichlet(sim->g_ghost, sim->nz, -1, 0.0);
@@ -731,8 +733,8 @@ coupled_shear_solver(struct simulation *sim,
const double rel_tol)
{
int i, coupled_iter, stress_iter = 0;
- double *r_norm, r_norm_max, *oldval;
- double vel_res_norm = NAN, mu_wall_orig = sim->mu_wall;
+ double *r_norm, *tmp, *oldval;
+ double r_norm_max, vel_res_norm = NAN, mu_wall_orig = sim->mu_wall;
if (sim->transient) {
r_norm = empty(sim->nz);