/*******************************************************************************
* This file is part of SWIFT.
* Copyright (c) 2018 Pedro Gonnet (pedro.gonnet@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 .
*
******************************************************************************/
#ifndef SWIFT_SPACE_GETSID_H
#define SWIFT_SPACE_GETSID_H
/* Config parameters. */
#include
/* Some standard headers. */
#include
/* Includes. */
#include "cell.h"
#include "runner.h"
#include "space.h"
/**
* @brief Get the shift-id of the given pair of cells, swapping them
* if need be.
*
* WARNING: This function may swap the cells ci and cj.
*
* @param s The space
* @param ci Pointer to first #cell.
* @param cj Pointer second #cell.
* @param shift (return) Vector from ci to cj.
*
* @return The shift ID and set shift, may or may not swap ci and cj.
*/
__attribute__((always_inline, nonnull)) INLINE static int
space_getsid_and_swap_cells(const struct space *s, struct cell **ci,
struct cell **cj, double shift[3]) {
/* Get the relative distance between the pairs, wrapping. */
const int periodic = s->periodic;
double dx[3];
for (int k = 0; k < 3; k++) {
dx[k] = (*cj)->loc[k] - (*ci)->loc[k];
if (periodic && dx[k] < -s->dim[k] / 2)
shift[k] = s->dim[k];
else if (periodic && dx[k] > s->dim[k] / 2)
shift[k] = -s->dim[k];
else
shift[k] = 0.0;
dx[k] += shift[k];
}
/* Get the sorting index. */
int sid = 0;
for (int k = 0; k < 3; k++)
sid = 3 * sid + ((dx[k] < 0.0) ? 0 : ((dx[k] > 0.0) ? 2 : 1));
/* Switch the cells around? */
if (runner_flip[sid]) {
struct cell *temp = *ci;
*ci = *cj;
*cj = temp;
for (int k = 0; k < 3; k++) shift[k] = -shift[k];
}
sid = sortlistID[sid];
/* Return the sort ID. */
return sid;
}
#endif /* SWIFT_SPACE_GETSID_H */