Fixing misc valgrind issues, particularly with resizing ncollections

This commit is contained in:
Joel Clemmer
2021-02-07 20:38:24 -07:00
parent 952216033e
commit de1205c5a9
9 changed files with 105 additions and 65 deletions

View File

@ -58,6 +58,7 @@ Comm::Comm(LAMMPS *lmp) : Pointers(lmp)
bordergroup = 0; bordergroup = 0;
cutghostuser = 0.0; cutghostuser = 0.0;
cutusermulti = nullptr; cutusermulti = nullptr;
cutusermultiflag = 0;
cutusermultiold = nullptr; cutusermultiold = nullptr;
ncollections_prior = 0; ncollections_prior = 0;
ghost_velocity = 0; ghost_velocity = 0;
@ -348,6 +349,7 @@ void Comm::modify_params(int narg, char **arg)
// ncollections can be changed by neigh_modify commands // ncollections can be changed by neigh_modify commands
cut = utils::numeric(FLERR,arg[iarg+2],false,lmp); cut = utils::numeric(FLERR,arg[iarg+2],false,lmp);
cutghostuser = MAX(cutghostuser,cut); cutghostuser = MAX(cutghostuser,cut);
cutusermultiflag = 1;
if (cut < 0.0) if (cut < 0.0)
error->all(FLERR,"Invalid cutoff in comm_modify command"); error->all(FLERR,"Invalid cutoff in comm_modify command");
usermultiargs.emplace_back(arg[iarg+1], cut); usermultiargs.emplace_back(arg[iarg+1], cut);

View File

@ -33,6 +33,7 @@ class Comm : protected Pointers {
double cutghost[3]; // cutoffs used for acquiring ghost atoms double cutghost[3]; // cutoffs used for acquiring ghost atoms
double cutghostuser; // user-specified ghost cutoff (mode == 0) double cutghostuser; // user-specified ghost cutoff (mode == 0)
double *cutusermulti; // per collection user ghost cutoff (mode == 1) double *cutusermulti; // per collection user ghost cutoff (mode == 1)
int cutusermultiflag;
std::vector<std::pair<std::string, double>> usermultiargs; std::vector<std::pair<std::string, double>> usermultiargs;
// collection args for custom ghost cutoffs // collection args for custom ghost cutoffs
double *cutusermultiold; // per type user ghost cutoff (mode == 2) double *cutusermultiold; // per type user ghost cutoff (mode == 2)

View File

@ -142,6 +142,7 @@ void CommBrick::init()
// allocate in setup // allocate in setup
if (mode == Comm::MULTI && multilo == nullptr) { if (mode == Comm::MULTI && multilo == nullptr) {
ncollections = neighbor->ncollections;
allocate_multi(maxswap); allocate_multi(maxswap);
memory->create(cutghostmulti,ncollections,3,"comm:cutghostmulti"); memory->create(cutghostmulti,ncollections,3,"comm:cutghostmulti");
ncollections_prior = ncollections; ncollections_prior = ncollections;
@ -205,10 +206,12 @@ void CommBrick::setup()
allocate_multi(maxswap); allocate_multi(maxswap);
memory->create(cutghostmulti,ncollections,3,"comm:cutghostmulti"); memory->create(cutghostmulti,ncollections,3,"comm:cutghostmulti");
memory->grow(cutusermulti,ncollections,"comm:cutusermulti"); if(cutusermultiflag) {
for(i = ncollections_prior; i < ncollections; i++) memory->grow(cutusermulti,ncollections,"comm:cutusermulti");
cutusermulti[i] = -1.0; for(i = ncollections_prior; i < ncollections; i++)
cutusermulti[i] = -1.0;
}
ncollections_prior = ncollections; ncollections_prior = ncollections;
} }

View File

@ -104,6 +104,11 @@ void CommTiled::init_buffers()
cutghostmultiold = nullptr; cutghostmultiold = nullptr;
sendbox_multi = nullptr; sendbox_multi = nullptr;
sendbox_multiold = nullptr; sendbox_multiold = nullptr;
// initialize ncollections so grow_swap_send_multi() will not
// construct arrays in init() but will wait for setup()
ncollections = 0;
ncollections_prior = 0;
maxswap = 6; maxswap = 6;
allocate_swap(maxswap); allocate_swap(maxswap);
@ -194,10 +199,12 @@ void CommTiled::setup()
for(i = 0; i < maxswap; i ++) for(i = 0; i < maxswap; i ++)
grow_swap_send_multi(i,DELTA_PROCS); grow_swap_send_multi(i,DELTA_PROCS);
memory->grow(cutusermulti,ncollections,"comm:cutusermulti"); if(cutusermultiflag){
for(i = ncollections_prior; i < ncollections; i++) memory->grow(cutusermulti,ncollections,"comm:cutusermulti");
cutusermulti[i] = -1.0; for(i = ncollections_prior; i < ncollections; i++)
cutusermulti[i] = -1.0;
}
ncollections_prior = ncollections; ncollections_prior = ncollections;
} }

View File

@ -146,7 +146,7 @@ void NBinMulti::setup_bins(int /*style*/)
// Identify smallest collection // Identify smallest collection
int icollectionmin = 0; int icollectionmin = 0;
for (n = 0; n < maxcollections; n++) for (n = 0; n < ncollections; n++)
if (cutcollectionsq[n][n] < cutcollectionsq[icollectionmin][icollectionmin]) if (cutcollectionsq[n][n] < cutcollectionsq[icollectionmin][icollectionmin])
icollectionmin = n; icollectionmin = n;
@ -188,7 +188,7 @@ void NBinMulti::setup_bins(int /*style*/)
double binsize_optimal, binsizeinv, coord; double binsize_optimal, binsizeinv, coord;
int mbinxhi,mbinyhi,mbinzhi; int mbinxhi,mbinyhi,mbinzhi;
for (n = 0; n < maxcollections; n++) { for (n = 0; n < ncollections; n++) {
// binsize_user only relates to smallest collection // binsize_user only relates to smallest collection
// optimal bin size is roughly 1/2 the collection-collection cutoff // optimal bin size is roughly 1/2 the collection-collection cutoff
// special case of all cutoffs = 0.0, binsize = box size // special case of all cutoffs = 0.0, binsize = box size
@ -296,7 +296,7 @@ void NBinMulti::bin_atoms()
int i,ibin,n; int i,ibin,n;
last_bin = update->ntimestep; last_bin = update->ntimestep;
for (n = 0; n < maxcollections; n++) { for (n = 0; n < ncollections; n++) {
for (i = 0; i < mbins_multi[n]; i++) binhead_multi[n][i] = -1; for (i = 0; i < mbins_multi[n]; i++) binhead_multi[n][i] = -1;
} }
// bin in reverse order so linked list will be in forward order // bin in reverse order so linked list will be in forward order

View File

@ -426,7 +426,7 @@ void Neighbor::init()
for(i = 1; i <= n; i++){ for(i = 1; i <= n; i++){
cuttmp = sqrt(cutneighsq[i][i]); cuttmp = sqrt(cutneighsq[i][i]);
for(icollection = 0; icollection < ncollections; icollection ++){ for(icollection = 0; icollection < ncollections; icollection ++){
if(collection2cut[icollection] > cuttmp) { if(collection2cut[icollection] >= cuttmp) {
type2collection[i] = icollection; type2collection[i] = icollection;
break; break;
} }
@ -2503,6 +2503,8 @@ void Neighbor::modify_params(int narg, char **arg)
if(iarg+2 > narg) if(iarg+2 > narg)
error->all(FLERR,"Invalid collection/interval command"); error->all(FLERR,"Invalid collection/interval command");
ncollections = utils::inumeric(FLERR,arg[iarg+1],false,lmp); ncollections = utils::inumeric(FLERR,arg[iarg+1],false,lmp);
if(ncollections < 1)
error->all(FLERR,"Invalid collection/interval command");
if(iarg+1+ncollections > narg) if(iarg+1+ncollections > narg)
error->all(FLERR,"Invalid collection/interval command"); error->all(FLERR,"Invalid collection/interval command");
@ -2511,8 +2513,7 @@ void Neighbor::modify_params(int narg, char **arg)
interval_collection_flag = 1; interval_collection_flag = 1;
custom_collection_flag = 1; custom_collection_flag = 1;
if(not collection2cut) memory->grow(collection2cut,ncollections,"neigh:collection2cut");
memory->create(collection2cut,ncollections,"neigh:collection2cut");
// Set upper cutoff for each collection // Set upper cutoff for each collection
char *id; char *id;
@ -2534,6 +2535,8 @@ void Neighbor::modify_params(int narg, char **arg)
if(iarg+2 > narg) if(iarg+2 > narg)
error->all(FLERR,"Invalid collection/type command"); error->all(FLERR,"Invalid collection/type command");
ncollections = utils::inumeric(FLERR,arg[iarg+1],false,lmp); ncollections = utils::inumeric(FLERR,arg[iarg+1],false,lmp);
if(ncollections < 1)
error->all(FLERR,"Invalid collection/interval command");
if(iarg+1+ncollections > narg) if(iarg+1+ncollections > narg)
error->all(FLERR,"Invalid collection/type command"); error->all(FLERR,"Invalid collection/type command");

View File

@ -82,6 +82,8 @@ NStencil::NStencil(LAMMPS *lmp) : Pointers(lmp)
flag_half_multi = nullptr; flag_half_multi = nullptr;
flag_skip_multi = nullptr; flag_skip_multi = nullptr;
bin_collection_multi = nullptr; bin_collection_multi = nullptr;
maxcollections = 0;
dimension = domain->dimension; dimension = domain->dimension;
} }
@ -105,15 +107,12 @@ NStencil::~NStencil()
delete [] distsq_multi_old; delete [] distsq_multi_old;
} }
if (stencil_multi) { if (maxstencil_multi) {
int n = ncollections;
memory->destroy(nstencil_multi); memory->destroy(nstencil_multi);
for (int i = 0; i < n; i++) { for (int i = 0; i < maxcollections; i++) {
for (int j = 0; j < n; j++) { for (int j = 0; j < maxcollections; j++)
if (! flag_skip_multi[i][j]) memory->destroy(stencil_multi[i][j]);
memory->destroy(stencil_multi[i][j]);
}
delete [] stencil_multi[i]; delete [] stencil_multi[i];
} }
delete [] stencil_multi; delete [] stencil_multi;
@ -275,47 +274,60 @@ void NStencil::create_setup()
if(nb) copy_bin_info_multi(); if(nb) copy_bin_info_multi();
// Allocate arrays to store stencil information // Deallocate arrays if previously allocated
memory->create(flag_half_multi, n, n, if(n > maxcollections and stencil_multi){
"neighstencil:flag_half_multi"); memory->destroy(nstencil_multi);
memory->create(flag_skip_multi, n, n, for (i = 0; i < maxcollections; i++) {
"neighstencil:flag_skip_multi"); for (j = 0; j < maxcollections; j++)
memory->create(bin_collection_multi, n, n, memory->destroy(stencil_multi[i][j]);
"neighstencil:bin_collection_multi"); delete [] stencil_multi[i];
memory->create(stencil_sx_multi, n, n,
"neighstencil:stencil_sx_multi");
memory->create(stencil_sy_multi, n, n,
"neighstencil:stencil_sy_multi");
memory->create(stencil_sz_multi, n, n,
"neighstencil:stencil_sz_multi");
memory->create(stencil_binsizex_multi, n, n,
"neighstencil:stencil_binsizex_multi");
memory->create(stencil_binsizey_multi, n, n,
"neighstencil:stencil_binsizey_multi");
memory->create(stencil_binsizez_multi, n, n,
"neighstencil:stencil_binsizez_multi");
memory->create(stencil_mbinx_multi, n, n,
"neighstencil:stencil_mbinx_multi");
memory->create(stencil_mbiny_multi, n, n,
"neighstencil:stencil_mbiny_multi");
memory->create(stencil_mbinz_multi, n, n,
"neighstencil:stencil_mbinz_multi");
// Skip all stencils by default, initialize smax
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
flag_skip_multi[i][j] = 1;
} }
} delete [] stencil_multi;
memory->destroy(maxstencil_multi);
memory->destroy(flag_half_multi);
memory->destroy(flag_skip_multi);
memory->destroy(bin_collection_multi);
memory->destroy(stencil_sx_multi);
memory->destroy(stencil_sy_multi);
memory->destroy(stencil_sz_multi);
memory->destroy(stencil_binsizex_multi);
memory->destroy(stencil_binsizey_multi);
memory->destroy(stencil_binsizez_multi);
memory->destroy(stencil_mbinx_multi);
memory->destroy(stencil_mbiny_multi);
memory->destroy(stencil_mbinz_multi);
}
// Determine which stencils need to be built // Allocate arrays
set_stencil_properties(); if(!maxstencil_multi) {
memory->create(flag_half_multi, n, n,
// Allocate arrays to store stencils "neighstencil:flag_half_multi");
if (!maxstencil_multi) { memory->create(flag_skip_multi, n, n,
"neighstencil:flag_skip_multi");
memory->create(bin_collection_multi, n, n,
"neighstencil:bin_collection_multi");
memory->create(stencil_sx_multi, n, n,
"neighstencil:stencil_sx_multi");
memory->create(stencil_sy_multi, n, n,
"neighstencil:stencil_sy_multi");
memory->create(stencil_sz_multi, n, n,
"neighstencil:stencil_sz_multi");
memory->create(stencil_binsizex_multi, n, n,
"neighstencil:stencil_binsizex_multi");
memory->create(stencil_binsizey_multi, n, n,
"neighstencil:stencil_binsizey_multi");
memory->create(stencil_binsizez_multi, n, n,
"neighstencil:stencil_binsizez_multi");
memory->create(stencil_mbinx_multi, n, n,
"neighstencil:stencil_mbinx_multi");
memory->create(stencil_mbiny_multi, n, n,
"neighstencil:stencil_mbiny_multi");
memory->create(stencil_mbinz_multi, n, n,
"neighstencil:stencil_mbinz_multi");
memory->create(maxstencil_multi, n, n, "neighstencil::maxstencil_multi"); memory->create(maxstencil_multi, n, n, "neighstencil::maxstencil_multi");
memory->create(nstencil_multi, n, n, "neighstencil::nstencil_multi"); memory->create(nstencil_multi, n, n, "neighstencil::nstencil_multi");
stencil_multi = new int**[n](); stencil_multi = new int**[n]();
@ -326,12 +338,22 @@ void NStencil::create_setup()
nstencil_multi[i][j] = 0; nstencil_multi[i][j] = 0;
stencil_multi[i][j] = nullptr; stencil_multi[i][j] = nullptr;
} }
}
maxcollections = n;
}
// Skip all stencils by default, initialize smax
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
flag_skip_multi[i][j] = 1;
} }
} }
// Determine which stencils need to be built
set_stencil_properties();
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) { for (j = 0; j < n; j++) {
// Skip creation of unused stencils // Skip creation of unused stencils
if (flag_skip_multi[i][j]) continue; if (flag_skip_multi[i][j]) continue;
@ -364,7 +386,8 @@ void NStencil::create_setup()
if (smax > maxstencil_multi[i][j]) { if (smax > maxstencil_multi[i][j]) {
maxstencil_multi[i][j] = smax; maxstencil_multi[i][j] = smax;
memory->destroy(stencil_multi[i][j]); if(stencil_multi[i][j])
memory->destroy(stencil_multi[i][j]);
memory->create(stencil_multi[i][j], smax, memory->create(stencil_multi[i][j], smax,
"neighstencil::stencil_multi"); "neighstencil::stencil_multi");
} }

View File

@ -33,6 +33,7 @@ class NStencil : protected Pointers {
int ** nstencil_multi; // # bins bins in each igroup-jgroup multi stencil int ** nstencil_multi; // # bins bins in each igroup-jgroup multi stencil
int *** stencil_multi; // list of bin offsets in each multi stencil int *** stencil_multi; // list of bin offsets in each multi stencil
int ** maxstencil_multi; // max stencil size for each multi stencil int ** maxstencil_multi; // max stencil size for each multi stencil
int maxcollections; // size of multi arrays
int sx,sy,sz; // extent of stencil in each dim int sx,sy,sz; // extent of stencil in each dim
int **stencil_sx_multi; // analogs for each multi stencil int **stencil_sx_multi; // analogs for each multi stencil
@ -42,7 +43,7 @@ class NStencil : protected Pointers {
double cutoff_custom; // cutoff set by requestor double cutoff_custom; // cutoff set by requestor
// Arrays to store options for multi itype-jtype stencils // Arrays to store options for multi itype-jtype stencils
bool **flag_half_multi; // flag creation of a half stencil for igroup-jgroup bool **flag_half_multi; // flag creation of a half stencil for icollection-jcollection
bool **flag_skip_multi; // skip creation of icollection-jcollection stencils (for newton on) bool **flag_skip_multi; // skip creation of icollection-jcollection stencils (for newton on)
int **bin_collection_multi; // what collection to use for bin information int **bin_collection_multi; // what collection to use for bin information

View File

@ -71,7 +71,7 @@ void NStencilHalfMulti2d::create()
if (flag_skip_multi[icollection][jcollection]) continue; if (flag_skip_multi[icollection][jcollection]) continue;
ns = 0; ns = 0;
sx = stencil_sx_multi[icollection][jcollection]; sx = stencil_sx_multi[icollection][jcollection];
sy = stencil_sy_multi[icollection][jcollection]; sy = stencil_sy_multi[icollection][jcollection];