Adding custom grouping option

This commit is contained in:
Joel Clemmer
2020-12-26 11:03:29 -07:00
parent b421c3d676
commit 2458eaf4f9
30 changed files with 599 additions and 551 deletions

View File

@ -38,7 +38,7 @@ void NBinMulti::bin_atoms_setup(int nall)
{
// binhead_multi[n] = per-bin vector mbins in length mbins_multi[n]
for (int n = 1; n <= maxtypes; n++) {
for (int n = 0; n < maxgroups; n++) {
if (mbins_multi[n] > maxbins_multi[n]) {
maxbins_multi[n] = mbins_multi[n];
memory->destroy(binhead_multi[n]);
@ -48,10 +48,12 @@ void NBinMulti::bin_atoms_setup(int nall)
// bins_multi[n] and atom2bin_multi[n] = per-atom vectors
// for both local and ghost atoms
// TODO: maxatom should be maxatom per group
if (nall > maxatom) {
maxatom = nall;
for (int n = 1; n <= maxtypes; n++) {
for (int n = 0; n < maxgroups; n++) {
memory->destroy(bins_multi[n]);
memory->destroy(atom2bin_multi[n]);
memory->create(bins_multi[n], maxatom, "neigh:bin_multi");
@ -61,23 +63,16 @@ void NBinMulti::bin_atoms_setup(int nall)
}
/* ---------------------------------------------------------------------
Identify index of type with smallest cutoff
Identify index of group with smallest cutoff
------------------------------------------------------------------------ */
int NBinMulti::itype_min() {
int NBinMulti::igroup_min()
{
int imin = 0;
for (int n = 0; n < maxgroups; n++)
if (cutmultisq[n][n] < cutmultisq[imin][imin]) imin = n;
int itypemin = 1;
double ** cutneighsq;
cutneighsq = neighbor->cutneighsq;
for (int n = 1; n <= atom->ntypes; n++) {
if (cutneighsq[n][n] < cutneighsq[itypemin][itypemin]) {
itypemin = n;
}
}
return itypemin;
return imin;
}
/* ----------------------------------------------------------------------
@ -87,15 +82,15 @@ int NBinMulti::itype_min() {
void NBinMulti::setup_bins(int style)
{
int n;
int itypemin;
int igroupmin;
// Initialize arrays
if (atom->ntypes > maxtypes) {
if (n_multi_groups > maxgroups) {
// Clear any/all memory for existing types
for (n = 1; n <= maxtypes; n++) {
for (n = 0; n < maxgroups; n++) {
memory->destroy(atom2bin_multi[n]);
memory->destroy(binhead_multi[n]);
memory->destroy(bins_multi[n]);
@ -106,59 +101,60 @@ void NBinMulti::setup_bins(int style)
// Realloacte at updated maxtypes
maxtypes = atom->ntypes;
maxgroups = n_multi_groups;
atom2bin_multi = new int*[maxtypes+1]();
binhead_multi = new int*[maxtypes+1]();
bins_multi = new int*[maxtypes+1]();
atom2bin_multi = new int*[maxgroups]();
binhead_multi = new int*[maxgroups]();
bins_multi = new int*[maxgroups]();
memory->destroy(nbinx_multi);
memory->destroy(nbiny_multi);
memory->destroy(nbinz_multi);
memory->create(nbinx_multi, maxtypes+1, "neigh:nbinx_multi");
memory->create(nbiny_multi, maxtypes+1, "neigh:nbiny_multi");
memory->create(nbinz_multi, maxtypes+1, "neigh:nbinz_multi");
memory->create(nbinx_multi, maxgroups, "neigh:nbinx_multi");
memory->create(nbiny_multi, maxgroups, "neigh:nbiny_multi");
memory->create(nbinz_multi, maxgroups, "neigh:nbinz_multi");
memory->destroy(mbins_multi);
memory->destroy(mbinx_multi);
memory->destroy(mbiny_multi);
memory->destroy(mbinz_multi);
memory->create(mbins_multi, maxtypes+1, "neigh:mbins_multi");
memory->create(mbinx_multi, maxtypes+1, "neigh:mbinx_multi");
memory->create(mbiny_multi, maxtypes+1, "neigh:mbiny_multi");
memory->create(mbinz_multi, maxtypes+1, "neigh:mbinz_multi");
memory->create(mbins_multi, maxgroups, "neigh:mbins_multi");
memory->create(mbinx_multi, maxgroups, "neigh:mbinx_multi");
memory->create(mbiny_multi, maxgroups, "neigh:mbiny_multi");
memory->create(mbinz_multi, maxgroups, "neigh:mbinz_multi");
memory->destroy(mbinxlo_multi);
memory->destroy(mbinylo_multi);
memory->destroy(mbinzlo_multi);
memory->create(mbinxlo_multi, maxtypes+1, "neigh:mbinxlo_multi");
memory->create(mbinylo_multi, maxtypes+1, "neigh:mbinylo_multi");
memory->create(mbinzlo_multi, maxtypes+1, "neigh:mbinzlo_multi");
memory->create(mbinxlo_multi, maxgroups, "neigh:mbinxlo_multi");
memory->create(mbinylo_multi, maxgroups, "neigh:mbinylo_multi");
memory->create(mbinzlo_multi, maxgroups, "neigh:mbinzlo_multi");
memory->destroy(binsizex_multi);
memory->destroy(binsizey_multi);
memory->destroy(binsizez_multi);
memory->create(binsizex_multi, maxtypes+1, "neigh:binsizex_multi");
memory->create(binsizey_multi, maxtypes+1, "neigh:binsizey_multi");
memory->create(binsizez_multi, maxtypes+1, "neigh:binsizez_multi");
memory->create(binsizex_multi, maxgroups, "neigh:binsizex_multi");
memory->create(binsizey_multi, maxgroups, "neigh:binsizey_multi");
memory->create(binsizez_multi, maxgroups, "neigh:binsizez_multi");
memory->destroy(bininvx_multi);
memory->destroy(bininvy_multi);
memory->destroy(bininvz_multi);
memory->create(bininvx_multi, maxtypes+1, "neigh:bininvx_multi");
memory->create(bininvy_multi, maxtypes+1, "neigh:bininvy_multi");
memory->create(bininvz_multi, maxtypes+1, "neigh:bininvz_multi");
memory->create(bininvx_multi, maxgroups, "neigh:bininvx_multi");
memory->create(bininvy_multi, maxgroups, "neigh:bininvy_multi");
memory->create(bininvz_multi, maxgroups, "neigh:bininvz_multi");
memory->destroy(maxbins_multi);
memory->create(maxbins_multi, maxtypes+1, "neigh:maxbins_multi");
memory->create(maxbins_multi, maxgroups, "neigh:maxbins_multi");
// make sure reallocation occurs in bin_atoms_setup()
for (n = 1; n <= maxtypes; n++) {
for (n = 0; n < maxgroups; n++) {
maxbins_multi[n] = 0;
}
maxatom = 0;
}
itypemin = itype_min();
igroupmin = igroup_min();
// bbox = size of bbox of entire domain
// bsubbox lo/hi = bounding box of my subdomain extended by comm->cutghost
@ -193,16 +189,16 @@ void NBinMulti::setup_bins(int style)
bbox[1] = bboxhi[1] - bboxlo[1];
bbox[2] = bboxhi[2] - bboxlo[2];
// For each type...
// For each grouping...
for (n = 1; n <= atom->ntypes; n++) {
for (n = 0; n < maxgroups; n++) {
// binsize_user only relates to smallest type
// optimal bin size is roughly 1/2 the type-type cutoff
// special case of all cutoffs = 0.0, binsize = box size
double binsize_optimal;
if (n == itypemin && binsizeflag) binsize_optimal = binsize_user;
else binsize_optimal = 0.5*sqrt(neighbor->cutneighsq[n][n]);
if (n == igroupmin && binsizeflag) binsize_optimal = binsize_user;
else binsize_optimal = 0.5*sqrt(cutmultisq[n][n]);
if (binsize_optimal == 0.0) binsize_optimal = bbox[0];
double binsizeinv = 1.0/binsize_optimal;
@ -306,7 +302,7 @@ void NBinMulti::bin_atoms()
int i,ibin,n;
last_bin = update->ntimestep;
for (n = 1; n <= maxtypes; n++) {
for (n = 0; n < maxgroups; n++) {
for (i = 0; i < mbins_multi[n]; i++) binhead_multi[n][i] = -1;
}
@ -323,7 +319,7 @@ void NBinMulti::bin_atoms()
int bitmask = group->bitmask[includegroup];
for (i = nall-1; i >= nlocal; i--) {
if (mask[i] & bitmask) {
n = type[i];
n = map_type_multi[type[i]];
ibin = coord2bin_multi(x[i], n);
atom2bin_multi[n][i] = ibin;
bins_multi[n][i] = binhead_multi[n][ibin];
@ -331,7 +327,7 @@ void NBinMulti::bin_atoms()
}
}
for (i = atom->nfirst-1; i >= 0; i--) {
n = type[i];
n = map_type_multi[type[i]];
ibin = coord2bin_multi(x[i], n);
atom2bin_multi[n][i] = ibin;
bins_multi[n][i] = binhead_multi[n][ibin];
@ -339,7 +335,7 @@ void NBinMulti::bin_atoms()
}
} else {
for (i = nall-1; i >= 0; i--) {
n = type[i];
n = map_type_multi[type[i]];
ibin = coord2bin_multi(x[i], n);
atom2bin_multi[n][i] = ibin;
bins_multi[n][i] = binhead_multi[n][ibin];
@ -354,7 +350,7 @@ double NBinMulti::memory_usage()
{
double bytes = 0;
for (int m = 1; m < maxtypes; m++) {
for (int m = 0; m < maxgroups; m++) {
bytes += maxbins_multi[m]*sizeof(int);
bytes += 2*maxatom*sizeof(int);
}