diff --git a/src/drift.h b/src/drift.h new file mode 100644 index 0000000000000000000000000000000000000000..73e909e31093f2461b78e7d378ba79aa0bc7e255 --- /dev/null +++ b/src/drift.h @@ -0,0 +1,106 @@ +/******************************************************************************* + * This file is part of SWIFT. + * Copyright (c) 2016 Matthieu Schaller (matthieu.schaller@durham.ac.uk) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + ******************************************************************************/ +#ifndef SWIFT_DRIFT_H +#define SWIFT_DRIFT_H + +/* Config parameters. */ +#include "../config.h" + +/* Local headers. */ +#include "const.h" +#include "debug.h" + +/** + * @brief Perform the 'drift' operation on a #gpart + * + * @param gp The #gpart to drift. + * @param dt The drift time-step + * @param timeBase The minimal allowed time-step size. + * @param ti_old Integer start of time-step + * @param ti_current Integer end of time-step + */ +__attribute__((always_inline)) INLINE static void drift_gpart(struct gpart* gp, + float dt, + double timeBase, + int ti_old, + int ti_current) { + /* Drift... */ + gp->x[0] += gp->v_full[0] * dt; + gp->x[1] += gp->v_full[1] * dt; + gp->x[2] += gp->v_full[2] * dt; + + /* Compute offset since last cell construction */ + gp->x_diff[0] -= gp->v_full[0] * dt; + gp->x_diff[1] -= gp->v_full[1] * dt; + gp->x_diff[2] -= gp->v_full[2] * dt; +} + +/** + * @brief Perform the 'drift' operation on a #part + * + * @param p The #part to drift. + * @param xp The #xpart of the particle. + * @param dt The drift time-step + * @param timeBase The minimal allowed time-step size. + * @param ti_old Integer start of time-step + * @param ti_current Integer end of time-step + */ +__attribute__((always_inline)) INLINE static void drift_part(struct part* p, + struct xpart* xp, + float dt, + double timeBase, + int ti_old, + int ti_current) { + /* Useful quantity */ + const float h_inv = 1.0f / p->h; + + /* Drift... */ + p->x[0] += xp->v_full[0] * dt; + p->x[1] += xp->v_full[1] * dt; + p->x[2] += xp->v_full[2] * dt; + + /* Predict velocities (for hydro terms) */ + p->v[0] += p->a_hydro[0] * dt; + p->v[1] += p->a_hydro[1] * dt; + p->v[2] += p->a_hydro[2] * dt; + + /* Predict smoothing length */ + const float w1 = p->h_dt * h_inv * dt; + if (fabsf(w1) < 0.2f) + p->h *= approx_expf(w1); /* 4th order expansion of exp(w) */ + else + p->h *= expf(w1); + + /* Predict density */ + const float w2 = -3.0f * p->h_dt * h_inv * dt; + if (fabsf(w2) < 0.2f) + p->rho *= approx_expf(w2); /* 4th order expansion of exp(w) */ + else + p->rho *= expf(w2); + + /* Predict the values of the extra fields */ + hydro_predict_extra(p, xp, ti_old, ti_current, timeBase); + + /* Compute offset since last cell construction */ + xp->x_diff[0] -= xp->v_full[0] * dt; + xp->x_diff[1] -= xp->v_full[1] * dt; + xp->x_diff[2] -= xp->v_full[2] * dt; +} + +#endif /* SWIFT_DRIFT_H */ diff --git a/src/runner.c b/src/runner.c index e0a52517d22fc991e3891a7868bc76c1f43e431f..c382da9b8eaed017ed84636f17d04c09f7cf3c5a 100644 --- a/src/runner.c +++ b/src/runner.c @@ -47,6 +47,7 @@ #include "gravity.h" #include "hydro_properties.h" #include "hydro.h" +#include "drift.h" #include "kick.h" #include "minmax.h" #include "scheduler.h" @@ -757,14 +758,7 @@ void runner_do_drift(struct runner *r, struct cell *c, int timer) { struct gpart *const gp = &gparts[k]; /* Drift... */ - gp->x[0] += gp->v_full[0] * dt; - gp->x[1] += gp->v_full[1] * dt; - gp->x[2] += gp->v_full[2] * dt; - - /* Compute offset since last cell construction */ - gp->x_diff[0] -= gp->v_full[0] * dt; - gp->x_diff[1] -= gp->v_full[1] * dt; - gp->x_diff[2] -= gp->v_full[2] * dt; + drift_gpart(gp, dt, timeBase, ti_old, ti_current); /* Compute (square of) motion since last cell construction */ const float dx2 = gp->x_diff[0] * gp->x_diff[0] + @@ -781,40 +775,8 @@ void runner_do_drift(struct runner *r, struct cell *c, int timer) { struct part *const p = &parts[k]; struct xpart *const xp = &xparts[k]; - /* Useful quantity */ - const float h_inv = 1.0f / p->h; - /* Drift... */ - p->x[0] += xp->v_full[0] * dt; - p->x[1] += xp->v_full[1] * dt; - p->x[2] += xp->v_full[2] * dt; - - /* Predict velocities (for hydro terms) */ - p->v[0] += p->a_hydro[0] * dt; - p->v[1] += p->a_hydro[1] * dt; - p->v[2] += p->a_hydro[2] * dt; - - /* Predict smoothing length */ - const float w1 = p->h_dt * h_inv * dt; - if (fabsf(w1) < 0.2f) - p->h *= approx_expf(w1); /* 4th order expansion of exp(w) */ - else - p->h *= expf(w1); - - /* Predict density */ - const float w2 = -3.0f * p->h_dt * h_inv * dt; - if (fabsf(w2) < 0.2f) - p->rho *= approx_expf(w2); /* 4th order expansion of exp(w) */ - else - p->rho *= expf(w2); - - /* Predict the values of the extra fields */ - hydro_predict_extra(p, xp, ti_old, ti_current, timeBase); - - /* Compute offset since last cell construction */ - xp->x_diff[0] -= xp->v_full[0] * dt; - xp->x_diff[1] -= xp->v_full[1] * dt; - xp->x_diff[2] -= xp->v_full[2] * dt; + drift_part(p, xp, dt, timeBase, ti_old, ti_current); /* Compute (square of) motion since last cell construction */ const float dx2 = xp->x_diff[0] * xp->x_diff[0] +