8#ifndef SRC_PARTICLECONTAINER_LINKEDCELLTRAVERSALS_C04CELLPAIRTRAVERSAL_H_
9#define SRC_PARTICLECONTAINER_LINKEDCELLTRAVERSALS_C04CELLPAIRTRAVERSAL_H_
11#include "C08BasedTraversals.h"
12#include "utils/GetChunkSize.h"
13#include "utils/mardyn_assert.h"
14#include "utils/threeDimensionalMapping.h"
19template <
class CellTemplate>
23 const std::array<unsigned long, 3>& dims) :
25 computeOffsets32Pack();
30 virtual void rebuild(std::vector<CellTemplate> &cells,
31 const std::array<unsigned long, 3> &dims,
double cellLength[3],
double cutoff,
34 computeOffsets32Pack();
39 void traverseCellPairsInner(
CellProcessor& cellProcessor,
unsigned stage,
unsigned stageCount) {}
43 const std::array<long, 3>& start,
44 const std::array<long, 3>& end);
48 const std::array<long, 3>& start,
49 const std::array<long, 3>& end);
52 const std::array<long, 3>& base3DIndex,
53 const std::array<long, 3>& start,
54 const std::array<long, 3>& end)
const;
56 void computeOffsets32Pack();
58 long parity(
long x,
long y,
long z)
const {
59 return (x + y + z + 24) % 8;
63 std::array<std::array<long, 3>, 32> _cellOffsets32Pack;
66template<
class CellTemplate>
69 std::array<long, 3> start, end;
70 for (
int d = 0; d < 3; ++d) {
72 end[d] =
static_cast<long>(this->_dims[d]) - 1;
74 traverseCellPairsBackend(cellProcessor, start, end);
77template<
class CellTemplate>
79 using threeDimensionalMapping::threeToOneD;
84 _cellOffsets32Pack[i++] = {1l, 1l, z};
85 _cellOffsets32Pack[i++] = {1l, 2l, z};
86 _cellOffsets32Pack[i++] = {2l, 1l, z};
87 _cellOffsets32Pack[i++] = {2l, 2l, z};
90 for (z = 1l; z < 3l; ++z) {
91 for (
long y = 0l; y < 4l; y++) {
92 for (
long x = 0l; x < 4l; x++) {
93 if ((x == 0l and y == 0l) or
94 (x == 3l and y == 0l) or
95 (x == 0l and y == 3l) or
96 (x == 3l and y == 3l)) {
99 _cellOffsets32Pack[i++] = {x, y, z};
106 _cellOffsets32Pack[i++] = {1l, 1l, z};
107 _cellOffsets32Pack[i++] = {1l, 2l, z};
108 _cellOffsets32Pack[i++] = {2l, 1l, z};
109 _cellOffsets32Pack[i++] = {2l, 2l, z};
111 mardyn_assert(i == 32);
115template<
class CellTemplate>
118 const std::array<long, 3>& base3DIndex,
119 const std::array<long, 3>& start,
120 const std::array<long, 3>& end
122 using threeDimensionalMapping::threeToOneD;
123 std::array<long, 3> index;
124 std::array<long, 3> signedDims;
125 for (
int d = 0; d < 3; ++d) {
126 signedDims[d] =
static_cast<long>(this->_dims[d]);
129 for (
auto Offset32Pack : _cellOffsets32Pack) {
132 for (
int d = 0; d < 3; ++d) {
133 index[d] = base3DIndex[d] + Offset32Pack[d];
134 isIn = isIn and (index[d] >= start[d]) and (index[d] < end[d]);
138 unsigned long ulIndex =
static_cast<unsigned long>(threeToOneD(index, signedDims));
146template<
class CellTemplate>
149 const std::array<long, 3>& start,
150 const std::array<long, 3>& end) {
157 for (
int color = 0; color < 4; ++color) {
159 traverseSingleColor(cellProcessor, color, start, end);
170template<
class CellTemplate>
173 const std::array<long, 3>& start,
174 const std::array<long, 3>& end) {
176 std::array<long, 3> intersectionStart;
177 for (
int d = 0; d < 3; ++d) {
178 intersectionStart[d] = start[d] - 2;
187 std::array<long, 3> startOfThisColor {0l, 0l, 0l};
192 startOfThisColor = intersectionStart;
196 startOfThisColor = start;
199 mardyn_assert(
false);
203 correctParity = parity(startOfThisColor[0], startOfThisColor[1], startOfThisColor[2]);
209 const long startX = startOfThisColor[0], endX = end[0];
210 const long startY = startOfThisColor[1], endY = end[1];
211 const long startZ = startOfThisColor[2], endZ = end[2];
213 const auto loop_size =
static_cast<size_t>(std::ceil(
static_cast<double>(endX - startX) / 4) *
214 std::ceil(
static_cast<double>(endY - startY) / 4) *
215 std::ceil(
static_cast<double>(endZ - startZ) / 4));
219 const int chunk_size = chunk_size::getChunkSize(loop_size, 10000, 20);
223 #pragma omp for schedule(dynamic, chunk_size) collapse(3) nowait
225 for (
long z = startZ; z < endZ; z += 4) {
226 for (
long y = startY; y < endY; y += 4) {
227 for (
long x = startX; x < endX; x += 4) {
229 long par = parity(x, y, z);
231 if (par != correctParity) {
235 std::array<long, 3> base3DIndex = {x, y, z};
236 processBasePack32(cellProcessor, base3DIndex, start, end);
Definition: C04CellPairTraversal.h:20
virtual void rebuild(std::vector< CellTemplate > &cells, const std::array< unsigned long, 3 > &dims, double cellLength[3], double cutoff, CellPairTraversalData *data)
Definition: C04CellPairTraversal.h:30
Definition: C08BasedTraversals.h:17
virtual void rebuild(std::vector< CellTemplate > &cells, const std::array< unsigned long, 3 > &dims, double cellLength[3], double cutoff, CellPairTraversalData *data)
Definition: C08BasedTraversals.h:28
Definition: CellProcessor.h:29
Definition: C04CellPairTraversal.h:16
Definition: CellPairTraversals.h:16