Skip to content

Commit

Permalink
second try to implement changes suggested in issue #888
Browse files Browse the repository at this point in the history
In src/rcb.cpp:460 there is an if (smaller > largest).
now if we have one particle you will see that lo[] = hi[] and because
of this smaller == largest == 0 for all values of dim. This causes
this particular part of the code to never be run. In particular the
memcpy inside this if is never executed. This causes an unitialized
memory access in line 472. Additionally, dim is initialized with -1
and thus the accesses in 484 and 485 are problematic. Additionally,
valuehalf_select is never initialized either.

closes #888
  • Loading branch information
akohlmey committed May 18, 2018
1 parent ae45dfa commit 4bdc2b2
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 1 deletion.
14 changes: 14 additions & 0 deletions src/balance.cpp
Expand Up @@ -28,6 +28,7 @@
#include "rcb.h"
#include "irregular.h"
#include "domain.h"
#include "neighbor.h"
#include "force.h"
#include "update.h"
#include "group.h"
Expand Down Expand Up @@ -643,6 +644,19 @@ int *Balance::bisection(int sortflag)
double *shrinklo = &shrinkall[0];
double *shrinkhi = &shrinkall[3];

// ensure that that the box has at least some extent.
const double nproc_rt = domain->dimension == 3 ?
cbrt(static_cast<double>(comm->nprocs)) :
sqrt(static_cast<double>(comm->nprocs));
const double min_extent = ceil(nproc_rt)*neighbor->skin;
for (int i = 0; i < domain->dimension; i++) {
if (shrinkall[3+i]-shrinkall[i] < min_extent) {
const double mid = 0.5*(shrinkall[3+i]+shrinkall[i]);
shrinkall[3+i] = std::min(mid + min_extent*0.5, boxhi[i]);
shrinkall[i] = std::max(mid - min_extent*0.5, boxlo[i]);
}
}

// invoke RCB
// then invert() to create list of proc assignments for my atoms
// NOTE: (3/2017) can remove undocumented "old" option at some point
Expand Down
2 changes: 1 addition & 1 deletion src/rcb.cpp
Expand Up @@ -243,7 +243,7 @@ void RCB::compute(int dimension, int n, double **x, double *wt,
// dotmark_select = dot markings in that dimension

int dim_select = -1;
double largest = 0.0;
double largest = -1.0;

for (dim = 0; dim < dimension; dim++) {

Expand Down

0 comments on commit 4bdc2b2

Please sign in to comment.