commit aa7e4acb6d8f1d2cda21c117a363184f94ed2499
parent 231ab304381ef266046dffb7a26abc5833c32c7b
Author: Anders Damsgaard <anders@adamsgaard.dk>
Date: Fri, 30 Aug 2019 12:58:03 +0200
Speed up code by avoiding use of index function idx1g
Diffstat:
M | Makefile | | | 2 | +- |
M | fluid.c | | | 75 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------- |
M | main.c | | | 1 | + |
M | simulation.c | | | 34 | ++++++++++++++++------------------ |
4 files changed, 73 insertions(+), 39 deletions(-)
diff --git a/Makefile b/Makefile
@@ -1,4 +1,4 @@
-CFLAGS = -g -std=c99 -pedantic -Wall
+CFLAGS = -std=c99 -pedantic -Wall -O3
LDFLAGS = -lm
SRC = $(wildcard *.c)
OBJ = $(patsubst %.c,%.o,$(SRC))
diff --git a/fluid.c b/fluid.c
@@ -10,9 +10,9 @@ hydrostatic_fluid_pressure_distribution(struct simulation* sim)
{
int i;
for (i=0; i<sim->nz; ++i)
- sim->p_f_ghost[idx1g(i)] = sim->p_f_top +
- sim->phi[i]*sim->rho_f*sim->G*
- (sim->L_z - sim->z[i]);
+ sim->p_f_ghost[i+1] = sim->p_f_top +
+ sim->phi[i]*sim->rho_f*sim->G*
+ (sim->L_z - sim->z[i]);
}
/* Determines the largest time step for the current simulation state. Note
@@ -64,7 +64,7 @@ static void
set_fluid_bcs(struct simulation* sim, const double p_f_top)
{
set_bc_dirichlet(sim->p_f_ghost, sim->nz, +1, p_f_top);
- sim->p_f_ghost[idx1g(sim->nz-1)] = p_f_top; /* Include top node in BC */
+ sim->p_f_ghost[sim->nz] = p_f_top; /* Include top node in BC */
set_bc_neumann(sim->p_f_ghost,
sim->nz,
-1,
@@ -82,24 +82,24 @@ darcy_pressure_change_1d(const int i,
const double beta_f,
const double mu_f)
{
- double p, p_zn, p_zp, k_, div_k_grad_p, k_zn, k_zp;
-
- p = p_f_ghost_in[idx1g(i)];
- p_zn = p_f_ghost_in[idx1g(i-1)];
- p_zp = p_f_ghost_in[idx1g(i+1)];
+ double k_, div_k_grad_p, k_zn, k_zp;
k_ = k[i];
if (i==0) k_zn = k_; else k_zn = k[i-1];
if (i==nz-1) k_zp = k_; else k_zp = k[i+1];
#ifdef DEBUG
printf("%d->%d: p=[%g, %g, %g]\tk=[%g, %g, %g]\n",
- i, idx1g(i),
+ i, i+1,
p_zn, p, p_zp,
k_zn, k_, k_zp);
#endif
- div_k_grad_p = (2.0*k_zp*k_/(k_zp + k_) * (p_zp - p)/dz -
- 2.0*k_zn*k_/(k_zn + k_) * (p - p_zn)/dz
+ div_k_grad_p = (2.0*k_zp*k_/(k_zp + k_)
+ * (p_f_ghost_in[i+2]
+ - p_f_ghost_in[i+1])/dz
+ - 2.0*k_zn*k_/(k_zn + k_)
+ * (p_f_ghost_in[i+1]
+ - p_f_ghost_in[i])/dz
)/dz;
#ifdef DEBUG
@@ -110,6 +110,38 @@ darcy_pressure_change_1d(const int i,
return 1.0/(beta_f*phi[i]*mu_f)*div_k_grad_p;
}
+/*void
+darcy_pressure_change_1d(double* dp_f_dt,
+ const int nz,
+ const double* p_f_ghost_in,
+ const double* phi,
+ const double* k,
+ const double dz,
+ const double beta_f,
+ const double mu_f)
+{
+ int i;
+ double k_, div_k_grad_p, k_zn, k_zp;
+
+#pragma omp parallel for private(i, k_, div_k_grad_p, k_zn, k_zp) if(nz>12)
+ for (i=0; i<nz; ++i) {
+
+ k_ = k[i];
+ if (i==0) k_zn = k_; else k_zn = k[i-1];
+ if (i==nz-1) k_zp = k_; else k_zp = k[i+1];
+
+ div_k_grad_p = (2.0*k_zp*k_/(k_zp + k_)
+ * (p_f_ghost_in[i+2]
+ - p_f_ghost_in[i+1])/dz
+ - 2.0*k_zn*k_/(k_zn + k_)
+ * (p_f_ghost_in[i+1]
+ - p_f_ghost_in[i])/dz
+ )/dz;
+
+ dp_f_dt[i] = 1.0/(beta_f*phi[i]*mu_f)*div_k_grad_p;
+ }
+}*/
+
int
darcy_solver_1d(struct simulation* sim,
const int max_iter,
@@ -119,6 +151,8 @@ darcy_solver_1d(struct simulation* sim,
double epsilon, theta, p_f_top, r_norm_max;
double *dp_f_dt_expl;
double *p_f_ghost_old, *dp_f_dt_impl, *p_f_ghost_new, *r_norm;
+
+ r_norm_max = NAN;
/* choose integration method, parameter in [0.0; 1.0]
* epsilon = 0.0: explicit
@@ -184,25 +218,26 @@ darcy_solver_1d(struct simulation* sim,
sim->dz,
sim->beta_f,
sim->mu_f);
+
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_dt_expl[i], i, dp_f_dt_impl[i]);
#endif
- p_f_ghost_new[idx1g(i)] = p_f_ghost_old[idx1g(i)]
+ p_f_ghost_new[i+1] = p_f_ghost_old[i+1]
+ epsilon*dp_f_dt_impl[i]*sim->dt;
if (epsilon < 1.0)
- p_f_ghost_new[idx1g(i)] += (1.0 - epsilon)
+ p_f_ghost_new[i+1] += (1.0 - epsilon)
*dp_f_dt_expl[i]*sim->dt;
- p_f_ghost_new[idx1g(i)] = p_f_ghost_old[idx1g(i)]*(1.0 - theta)
- + p_f_ghost_new[idx1g(i)]*theta;
+ p_f_ghost_new[i+1] = p_f_ghost_old[i+1]*(1.0 - theta)
+ + p_f_ghost_new[i+1]*theta;
- r_norm[i] = (p_f_ghost_new[idx1g(i)]
- - sim->p_f_ghost[idx1g(i)])
- /(sim->p_f_ghost[idx1g(i)] + 1e-16);
+ r_norm[i] = (p_f_ghost_new[i+1]
+ - sim->p_f_ghost[i+1])
+ /(sim->p_f_ghost[i+1] + 1e-16);
}
r_norm_max = max(r_norm, sim->nz);
@@ -237,7 +272,7 @@ darcy_solver_1d(struct simulation* sim,
}
} else {
for (i=0; i<sim->nz; ++i)
- sim->p_f_ghost[idx1g(i)] += dp_f_dt_expl[i]*sim->dt;
+ sim->p_f_ghost[i+1] += dp_f_dt_expl[i]*sim->dt;
solved = 1;
#ifdef DEBUG
puts(".. dp_f_dt_expl:");
diff --git a/main.c b/main.c
@@ -311,6 +311,7 @@ main(int argc, char* argv[])
filetimeclock = 0.0;
iter = 0;
mu_wall_orig = sim.mu_wall;
+ res_norm = NAN;
while (sim.t <= sim.t_end) {
stressiter = 0;
diff --git a/simulation.c b/simulation.c
@@ -253,7 +253,7 @@ compute_shear_strain_rate_plastic(struct simulation* sim)
{
int i;
for (i=0; i<sim->nz; ++i)
- sim->gamma_dot_p[i] = shear_strain_rate_plastic(sim->g_ghost[idx1g(i)],
+ sim->gamma_dot_p[i] = shear_strain_rate_plastic(sim->g_ghost[i+1],
sim->mu[i]);
}
@@ -276,7 +276,7 @@ compute_effective_stress(struct simulation* sim)
int i;
if (sim->fluid)
for (i=0; i<sim->nz; ++i)
- sim->sigma_n_eff[i] = sim->sigma_n[i] - sim->p_f_ghost[idx1g(i)];
+ sim->sigma_n_eff[i] = sim->sigma_n[i] - sim->p_f_ghost[i+1];
else
for (i=0; i<sim->nz; ++i)
sim->sigma_n_eff[i] = sim->sigma_n[i];
@@ -326,13 +326,13 @@ compute_local_fluidity(struct simulation* sim)
{
int i;
for (i=0; i<sim->nz; ++i)
- sim->g_ghost[idx1g(i)] = local_fluidity(sim->sigma_n_eff[i],
- sim->mu[i],
- sim->mu_s,
- sim->C,
- sim->b,
- sim->rho_s,
- sim->d);
+ sim->g_ghost[i+1] = local_fluidity(sim->sigma_n_eff[i],
+ sim->mu[i],
+ sim->mu_s,
+ sim->C,
+ sim->b,
+ sim->rho_s,
+ sim->d);
}
void
@@ -384,23 +384,21 @@ poisson_solver_1d_cell_update(int i,
const double d)
{
double coorp_term;
- int gi;
coorp_term = dz*dz/(2.0*pow(xi[i], 2.0));
- gi = idx1g(i);
- g_out[gi] = 1.0/(1.0 + coorp_term)*(coorp_term*
+ g_out[i+1] = 1.0/(1.0 + coorp_term)*(coorp_term*
local_fluidity(p[i], mu[i], mu_s, C, b, rho_s, d)
- + g_in[gi+1]/2.0
- + g_in[gi-1]/2.0);
+ + g_in[i+2]/2.0
+ + g_in[i]/2.0);
- r_norm[i] = pow(g_out[gi] - g_in[gi], 2.0) / (pow(g_out[gi], 2.0) + 1e-16);
+ r_norm[i] = pow(g_out[i+1] - g_in[i+1], 2.0) / (pow(g_out[i+1], 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(" g_in: %g\n", g_in[i+1]);
+ printf(" g_out: %g\n", g_out[i+1]);
printf(" r_norm: %g\n", r_norm[i]);
#endif
}
@@ -521,7 +519,7 @@ print_wet_output(FILE* fp, struct simulation* sim, const int norm)
sim->z[i],
v_x_out[i],
sim->sigma_n_eff[i],
- sim->p_f_ghost[idx1g(i)],
+ sim->p_f_ghost[i+1],
sim->mu[i],
sim->gamma_dot_p[i]);