Fixing misc valgrind issues, particularly with resizing ncollections
This commit is contained in:
@ -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);
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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");
|
||||||
|
|
||||||
|
|||||||
121
src/nstencil.cpp
121
src/nstencil.cpp
@ -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");
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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];
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user