Updating examples, updating multi in info, fixing memory issues in comm/neighbor

This commit is contained in:
Joel Clemmer
2021-02-08 10:50:57 -07:00
parent de1205c5a9
commit 58e4938b0f
5 changed files with 60 additions and 8 deletions

View File

@ -298,18 +298,32 @@ void Comm::modify_params(int narg, char **arg)
// need to reset cutghostuser when switching comm mode
if (mode == Comm::MULTI) cutghostuser = 0.0;
if (mode == Comm::MULTIOLD) cutghostuser = 0.0;
if(cutusermulti){
memory->destroy(cutusermulti);
cutusermulti = nullptr;
}
if(cutusermultiold){
memory->destroy(cutusermultiold);
cutusermultiold = nullptr;
}
mode = Comm::SINGLE;
} else if (strcmp(arg[iarg+1],"multi") == 0) {
// need to reset cutghostuser when switching comm mode
if (mode == Comm::SINGLE) cutghostuser = 0.0;
if (mode == Comm::MULTIOLD) cutghostuser = 0.0;
if(cutusermultiold){
memory->destroy(cutusermultiold);
cutusermultiold = nullptr;
}
mode = Comm::MULTI;
} else if (strcmp(arg[iarg+1],"multi/old") == 0) {
// need to reset cutghostuser when switching comm mode
if (mode == Comm::SINGLE) cutghostuser = 0.0;
if (mode == Comm::MULTI) cutghostuser = 0.0;
if(cutusermulti){
memory->destroy(cutusermulti);
cutusermulti = nullptr;
}
mode = Comm::MULTIOLD;
} else error->all(FLERR,"Illegal comm_modify command");
iarg += 2;

View File

@ -145,6 +145,12 @@ void CommBrick::init()
ncollections = neighbor->ncollections;
allocate_multi(maxswap);
memory->create(cutghostmulti,ncollections,3,"comm:cutghostmulti");
if(cutusermultiflag) {
memory->grow(cutusermulti,ncollections,"comm:cutusermulti");
for(int i = ncollections_prior; i < ncollections; i++)
cutusermulti[i] = -1.0;
}
ncollections_prior = ncollections;
}
if ((mode == Comm::SINGLE or mode == Comm::MULTIOLD) && multilo) {
@ -218,7 +224,7 @@ void CommBrick::setup()
// parse any cutoff/multi commands
int nhi, nlo;
for(auto it = usermultiargs.begin(); it != usermultiargs.end(); it ++) {
utils::bounds(FLERR,it->first,1,ncollections,nlo,nhi,error);
utils::bounds(FLERR,it->first,0,ncollections,nlo,nhi,error);
if(nhi >= ncollections)
error->all(FLERR, "Unused collection id in comm_modify cutoff/multi command");
for (j=nlo; j<=nhi; ++j)
@ -898,6 +904,22 @@ void CommBrick::borders()
if (nsend == maxsendlist[iswap]) grow_list(iswap,nsend);
sendlist[iswap][nsend++] = i;
}
} else if (mode == Comm::MULTI) {
ngroup = atom->nfirst;
for (i = 0; i < ngroup; i++) {
icollection = collection[i];
if (x[i][dim] >= mlo[icollection] && x[i][dim] <= mhi[icollection]) {
if (nsend == maxsendlist[iswap]) grow_list(iswap,nsend);
sendlist[iswap][nsend++] = i;
}
}
for (i = atom->nlocal; i < nlast; i++) {
icollection = collection[i];
if (x[i][dim] >= mlo[icollection] && x[i][dim] <= mhi[icollection]) {
if (nsend == maxsendlist[iswap]) grow_list(iswap,nsend);
sendlist[iswap][nsend++] = i;
}
}
} else {
ngroup = atom->nfirst;
for (i = 0; i < ngroup; i++) {

View File

@ -198,7 +198,6 @@ void CommTiled::setup()
for(i = 0; i < maxswap; i ++)
grow_swap_send_multi(i,DELTA_PROCS);
if(cutusermultiflag){
memory->grow(cutusermulti,ncollections,"comm:cutusermulti");
for(i = ncollections_prior; i < ncollections; i++)
@ -211,7 +210,7 @@ void CommTiled::setup()
// parse any cutoff/multi commands
int nhi, nlo;
for(auto it = usermultiargs.begin(); it != usermultiargs.end(); it ++) {
utils::bounds(FLERR,it->first,1,ncollections,nlo,nhi,error);
utils::bounds(FLERR,it->first,0,ncollections,nlo,nhi,error);
if(nhi >= ncollections)
error->all(FLERR, "Unused collection id in comm_modify cutoff/multi command");
@ -224,6 +223,7 @@ void CommTiled::setup()
// If using multi/reduce, communicate particles a distance equal
// to the max cutoff with equally sized or smaller collections
// If not, communicate the maximum cutoff of the entire collection
for (i = 0; i < ncollections; i++) {
if (cutusermulti) {
cutghostmulti[i][0] = cutusermulti[i];

View File

@ -414,9 +414,24 @@ void Info::command(int narg, char **arg)
if (comm->mode == 1) {
fputs("Communication mode = multi\n",out);
double cut;
for (int i=0; i < neighbor->ncollections; ++i) {
if (comm->cutusermulti) cut = comm->cutusermulti[i];
else cut = 0.0;
for (int j=0; j < neighbor->ncollections; ++j) {
cut = MAX(cut,sqrt(neighbor->cutcollectionsq[i][j]));
}
if (comm->cutusermulti) cut = MAX(cut,comm->cutusermulti[i]);
fmt::print(out,"Communication cutoff for collection {} = {:.8}\n", i, cut);
}
}
if (comm->mode == 2) {
fputs("Communication mode = multi/old\n",out);
double cut;
for (int i=1; i <= atom->ntypes && neighbor->cuttype; ++i) {
cut = neighbor->cuttype[i];
if (comm->cutusermulti) cut = MAX(cut,comm->cutusermulti[i]);
if (comm->cutusermultiold) cut = MAX(cut,comm->cutusermultiold[i]);
fmt::print(out,"Communication cutoff for type {} = {:.8}\n", i, cut);
}
}

View File

@ -366,6 +366,7 @@ void Neighbor::init()
if(not custom_collection_flag) {
ncollections = n;
interval_collection_flag = 0;
if(not type2collection)
memory->create(type2collection,n+1,"neigh:type2collection");
for(i = 1; i <= n; i++)
type2collection[i] = i-1;