Skip to content
Snippets Groups Projects
Commit 2cc2d44c authored by James Willis's avatar James Willis
Browse files

Only use the last active particle in range when calculating the loop bounds.

parent 41d13d04
No related branches found
No related tags found
1 merge request!396Avx512 fixes
......@@ -265,10 +265,17 @@ __attribute__((always_inline)) INLINE static void populate_max_d_no_cache(
int first_pi = 0, last_pj = cj->count - 1;
int temp;
/* Find the leftmost particle in cell i that interacts with any particle in cell j. */
/* Find the leftmost active particle in cell i that interacts with any particle in cell j. */
first_pi = ci->count;
while(first_pi > 0 && sort_i[first_pi - 1].d + dx_max + hi_max > dj_min)
int active_id = first_pi;
while(first_pi > 0 && sort_i[first_pi - 1].d + dx_max + hi_max > dj_min) {
first_pi--;
/* Store the index of the particle if it is active. */
if (part_is_active(&parts_i[sort_i[first_pi].i], e)) active_id = first_pi;
}
/* Set the first active pi in range of any particle in cell j. */
first_pi = active_id;
/* Find the maximum index into cell j for each particle in range in cell i. */
if(first_pi < ci->count) {
......@@ -300,10 +307,17 @@ __attribute__((always_inline)) INLINE static void populate_max_d_no_cache(
max_index_i[ci->count - 1] = 0;
}
/* Find the rightmost particle in cell j that interacts with any particle in cell i. */
/* Find the rightmost active particle in cell j that interacts with any particle in cell i. */
last_pj = 0;
while(last_pj < cj->count && sort_j[last_pj].d - hj_max - dx_max < di_max)
active_id = last_pj;
while(last_pj < cj->count && sort_j[last_pj].d - hj_max - dx_max < di_max) {
last_pj++;
/* Store the index of the particle if it is active. */
if (part_is_active(&parts_j[sort_j[last_pj - 1].i], e)) active_id = last_pj - 1;
}
/* Set the last active pj in range of any particle in cell i. */
last_pj = active_id + 1;
/* Find the maximum index into cell i for each particle in range in cell j. */
if(last_pj > 0 ) {
......@@ -317,7 +331,7 @@ __attribute__((always_inline)) INLINE static void populate_max_d_no_cache(
const struct part *pj = &parts_j[sort_j[last_pj].i];
/* Loop through particles in cell i until they are not in range of pj. */
while(temp >= 0 && sort_j[last_pj].d - dx_max - (pj->h * kernel_gamma) < sort_i[temp].d - rshift)
while(temp > 0 && sort_j[last_pj].d - dx_max - (pj->h * kernel_gamma) < sort_i[temp].d - rshift)
temp--;
max_index_j[last_pj] = temp;
......@@ -326,7 +340,7 @@ __attribute__((always_inline)) INLINE static void populate_max_d_no_cache(
for(int i = last_pj - 1; i>=0; i--) {
temp = max_index_j[i + 1];
while(temp >= 0 && sort_j[i].d - dx_max - (pj->h * kernel_gamma) < sort_i[temp].d - rshift)
while(temp > 0 && sort_j[i].d - dx_max - (pj->h * kernel_gamma) < sort_i[temp].d - rshift)
temp--;
max_index_j[i] = temp;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment