Fixing comm and renaming bytype
This commit is contained in:
12
src/comm.cpp
12
src/comm.cpp
@ -76,7 +76,7 @@ Comm::Comm(LAMMPS *lmp) : Pointers(lmp)
|
||||
grid2proc = nullptr;
|
||||
xsplit = ysplit = zsplit = nullptr;
|
||||
rcbnew = 0;
|
||||
multi_bytype = 0;
|
||||
multi_tiered = 0;
|
||||
|
||||
// use of OpenMP threads
|
||||
// query OpenMP for number of threads/process set by user at run-time
|
||||
@ -241,6 +241,10 @@ void Comm::init()
|
||||
maxexchange_fix_dynamic = 0;
|
||||
for (int i = 0; i < nfix; i++)
|
||||
if (fix[i]->maxexchange_dynamic) maxexchange_fix_dynamic = 1;
|
||||
|
||||
// Can't used multi/tiered communication with Newton off
|
||||
if (force->newton == 0 && multi_tiered)
|
||||
error->all(FLERR,"Cannot use multi/tiered communication with Newton off");
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
@ -327,10 +331,10 @@ void Comm::modify_params(int narg, char **arg)
|
||||
for (i=nlo; i<=nhi; ++i)
|
||||
cutusermulti[i] = cut;
|
||||
iarg += 3;
|
||||
} else if (strcmp(arg[iarg],"cutoff/bytype") == 0) {
|
||||
} else if (strcmp(arg[iarg],"cutoff/tiered") == 0) {
|
||||
if (mode == Comm::SINGLE)
|
||||
error->all(FLERR,"Use cutoff/bytype in mode multi only");
|
||||
multi_bytype = 1;
|
||||
error->all(FLERR,"Use cutoff/tiered in mode multi only");
|
||||
multi_tiered = 1;
|
||||
iarg += 1;
|
||||
} else if (strcmp(arg[iarg],"vel") == 0) {
|
||||
if (iarg+2 > narg) error->all(FLERR,"Illegal comm_modify command");
|
||||
|
||||
@ -161,7 +161,7 @@ class Comm : protected Pointers {
|
||||
int (*)(int, char *, int &, int *&, char *&, void *),
|
||||
int, char *&, int, void *, int);
|
||||
void rendezvous_stats(int, int, int, int, int, int, bigint);
|
||||
int multi_bytype; // 1 if multi cutoff is intra-type cutoff
|
||||
int multi_tiered; // 1 if multi cutoff is intra-type cutoff
|
||||
|
||||
public:
|
||||
enum{MULTIPLE};
|
||||
@ -247,6 +247,10 @@ E: Processor count in z must be 1 for 2d simulation
|
||||
|
||||
Self-explanatory.
|
||||
|
||||
E: Cannot use multi/tiered communication with Newton off
|
||||
|
||||
Self-explanatory.
|
||||
|
||||
E: Cannot put data on ring from nullptr pointer
|
||||
|
||||
W: Communication cutoff is 0.0. No ghost atoms will be generated. Atoms may get lost.
|
||||
|
||||
@ -174,18 +174,25 @@ void CommBrick::setup()
|
||||
cutghost[0] = cutghost[1] = cutghost[2] = cut;
|
||||
|
||||
if (mode == Comm::MULTI) {
|
||||
double *cuttype = neighbor->cuttype;
|
||||
for (i = 1; i <= ntypes; i++) {
|
||||
cut = 0.0;
|
||||
if (cutusermulti) cut = cutusermulti[i];
|
||||
cutghostmulti[i][0] = MAX(cut,cuttype[i]);
|
||||
cutghostmulti[i][1] = MAX(cut,cuttype[i]);
|
||||
cutghostmulti[i][2] = MAX(cut,cuttype[i]);
|
||||
if (multi_bytype == 1) {
|
||||
// Set the BYTYPE cutoff
|
||||
cutghostmulti[i][0] = sqrt(neighbor->cutneighsq[i][i]);
|
||||
cutghostmulti[i][1] = sqrt(neighbor->cutneighsq[i][i]);
|
||||
cutghostmulti[i][2] = sqrt(neighbor->cutneighsq[i][i]);
|
||||
if (multi_tiered) {
|
||||
// If using tiered binlists, use the itype-itype interaction distance for communication
|
||||
double **cutneighsq = neighbor->cutneighsq;
|
||||
for (i = 1; i <= ntypes; i++) {
|
||||
cut = 0.0;
|
||||
if (cutusermulti) cut = cutusermulti[i];
|
||||
cutghostmulti[i][0] = MAX(cut,sqrt(cutneighsq[i][i]));
|
||||
cutghostmulti[i][1] = MAX(cut,sqrt(cutneighsq[i][i]));
|
||||
cutghostmulti[i][2] = MAX(cut,sqrt(cutneighsq[i][i]));
|
||||
}
|
||||
} else {
|
||||
// If using a single binlist, use the max itype-jtype interaction distance for communication
|
||||
double *cuttype = neighbor->cuttype;
|
||||
for (i = 1; i <= ntypes; i++) {
|
||||
cut = 0.0;
|
||||
if (cutusermulti) cut = cutusermulti[i];
|
||||
cutghostmulti[i][0] = MAX(cut,cuttype[i]);
|
||||
cutghostmulti[i][1] = MAX(cut,cuttype[i]);
|
||||
cutghostmulti[i][2] = MAX(cut,cuttype[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -204,13 +211,26 @@ void CommBrick::setup()
|
||||
cutghost[2] = cut * length2;
|
||||
|
||||
if (mode == Comm::MULTI) {
|
||||
double *cuttype = neighbor->cuttype;
|
||||
for (i = 1; i <= ntypes; i++) {
|
||||
cut = 0.0;
|
||||
if (cutusermulti) cut = cutusermulti[i];
|
||||
cutghostmulti[i][0] = length0 * MAX(cut,cuttype[i]);
|
||||
cutghostmulti[i][1] = length1 * MAX(cut,cuttype[i]);
|
||||
cutghostmulti[i][2] = length2 * MAX(cut,cuttype[i]);
|
||||
if (multi_tiered) {
|
||||
// If using tiered binlists, use the itype-itype interaction distance for communication
|
||||
double **cutneighsq = neighbor->cutneighsq;
|
||||
for (i = 1; i <= ntypes; i++) {
|
||||
cut = 0.0;
|
||||
if (cutusermulti) cut = cutusermulti[i];
|
||||
cutghostmulti[i][0] = length0 * MAX(cut,sqrt(cutneighsq[i][i]));
|
||||
cutghostmulti[i][1] = length1 * MAX(cut,sqrt(cutneighsq[i][i]));
|
||||
cutghostmulti[i][2] = length2 * MAX(cut,sqrt(cutneighsq[i][i]));
|
||||
}
|
||||
} else {
|
||||
// If using a single binlist, use the max itype-jtype interaction distance for communication
|
||||
double *cuttype = neighbor->cuttype;
|
||||
for (i = 1; i <= ntypes; i++) {
|
||||
cut = 0.0;
|
||||
if (cutusermulti) cut = cutusermulti[i];
|
||||
cutghostmulti[i][0] = length0 * MAX(cut,cuttype[i]);
|
||||
cutghostmulti[i][1] = length1 * MAX(cut,cuttype[i]);
|
||||
cutghostmulti[i][2] = length2 * MAX(cut,cuttype[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -175,19 +175,26 @@ void CommTiled::setup()
|
||||
// check that cutoff < any periodic box length
|
||||
|
||||
if (mode == Comm::MULTI) {
|
||||
double *cuttype = neighbor->cuttype;
|
||||
double cut;
|
||||
for (i = 1; i <= ntypes; i++) {
|
||||
cut = 0.0;
|
||||
if (cutusermulti) cut = cutusermulti[i];
|
||||
cutghostmulti[i][0] = MAX(cut,cuttype[i]);
|
||||
cutghostmulti[i][1] = MAX(cut,cuttype[i]);
|
||||
cutghostmulti[i][2] = MAX(cut,cuttype[i]);
|
||||
if (multi_bytype == 1) {
|
||||
// Set the BYTYPE cutoff
|
||||
cutghostmulti[i][0] = sqrt(neighbor->cutneighsq[i][i]);
|
||||
cutghostmulti[i][1] = sqrt(neighbor->cutneighsq[i][i]);
|
||||
cutghostmulti[i][2] = sqrt(neighbor->cutneighsq[i][i]);
|
||||
if (multi_tiered) {
|
||||
// If using tiered binlists, use the itype-itype interaction distance for communication
|
||||
double **cutneighsq = neighbor->cutneighsq;
|
||||
for (i = 1; i <= ntypes; i++) {
|
||||
cut = 0.0;
|
||||
if (cutusermulti) cut = cutusermulti[i];
|
||||
cutghostmulti[i][0] = MAX(cut,sqrt(cutneighsq[i][i]));
|
||||
cutghostmulti[i][1] = MAX(cut,sqrt(cutneighsq[i][i]));
|
||||
cutghostmulti[i][2] = MAX(cut,sqrt(cutneighsq[i][i]));
|
||||
}
|
||||
} else {
|
||||
// If using a single binlist, use the max itype-jtype interaction distance for communication
|
||||
double *cuttype = neighbor->cuttype;
|
||||
for (i = 1; i <= ntypes; i++) {
|
||||
cut = 0.0;
|
||||
if (cutusermulti) cut = cutusermulti[i];
|
||||
cutghostmulti[i][0] = MAX(cut,cuttype[i]);
|
||||
cutghostmulti[i][1] = MAX(cut,cuttype[i]);
|
||||
cutghostmulti[i][2] = MAX(cut,cuttype[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1620,12 +1620,12 @@ int Neighbor::choose_bin(NeighRequest *rq)
|
||||
if (!rq->kokkos_device != !(mask & NB_KOKKOS_DEVICE)) continue;
|
||||
if (!rq->kokkos_host != !(mask & NB_KOKKOS_HOST)) continue;
|
||||
|
||||
// neighbor style is BIN or MULTI or BYTYPE and must match
|
||||
// neighbor style is BIN or MULTI or MULTI/TIERED and must match
|
||||
|
||||
if (style == Neighbor::BIN || style == Neighbor::MULTI) {
|
||||
if (!(mask & NB_STANDARD)) continue;
|
||||
} else if (style == Neighbor::BYTYPE) {
|
||||
if (!(mask & NB_BYTYPE)) continue;
|
||||
} else if (style == Neighbor::MULTI_TIERED) {
|
||||
if (!(mask & NB_MULTI_TIERED)) continue;
|
||||
}
|
||||
|
||||
return i+1;
|
||||
@ -1698,14 +1698,14 @@ int Neighbor::choose_stencil(NeighRequest *rq)
|
||||
if (!rq->ghost != !(mask & NS_GHOST)) continue;
|
||||
if (!rq->ssa != !(mask & NS_SSA)) continue;
|
||||
|
||||
// neighbor style is one of BIN, MULTI or BYTYPE and must match
|
||||
// neighbor style is one of BIN, MULTI, or MULT/TIERED and must match
|
||||
|
||||
if (style == Neighbor::BIN) {
|
||||
if (!(mask & NS_BIN)) continue;
|
||||
} else if (style == Neighbor::MULTI) {
|
||||
if (!(mask & NS_MULTI)) continue;
|
||||
} else if (style == Neighbor::BYTYPE) {
|
||||
if (!(mask & NS_BYTYPE)) continue;
|
||||
} else if (style == Neighbor::MULT_TIERED) {
|
||||
if (!(mask & NS_MULT_TIERED)) continue;
|
||||
}
|
||||
|
||||
// dimension is 2 or 3 and must match
|
||||
@ -1835,7 +1835,7 @@ int Neighbor::choose_pair(NeighRequest *rq)
|
||||
if (!rq->halffull != !(mask & NP_HALF_FULL)) continue;
|
||||
if (!rq->off2on != !(mask & NP_OFF2ON)) continue;
|
||||
|
||||
// neighbor style is one of NSQ,BIN,MULTI or BYTYPE and must match
|
||||
// neighbor style is one of NSQ, BIN, MULTI, or MULTI/TIERED and must match
|
||||
|
||||
if (style == Neighbor::NSQ) {
|
||||
if (!(mask & NP_NSQ)) continue;
|
||||
@ -1843,8 +1843,8 @@ int Neighbor::choose_pair(NeighRequest *rq)
|
||||
if (!(mask & NP_BIN)) continue;
|
||||
} else if (style == Neighbor::MULTI) {
|
||||
if (!(mask & NP_MULTI)) continue;
|
||||
} else if (style == Neighbor::BYTYPE) {
|
||||
if (!(mask & NP_BYTYPE)) continue;
|
||||
} else if (style == Neighbor::MULT_TIERED) {
|
||||
if (!(mask & NP_MULT_TIERED)) continue;
|
||||
}
|
||||
|
||||
// domain triclinic flag is on or off and must match
|
||||
@ -2211,7 +2211,7 @@ void Neighbor::set(int narg, char **arg)
|
||||
if (strcmp(arg[1],"nsq") == 0) style = Neighbor::NSQ;
|
||||
else if (strcmp(arg[1],"bin") == 0) style = Neighbor::BIN;
|
||||
else if (strcmp(arg[1],"multi") == 0) style = Neighbor::MULTI;
|
||||
else if (strcmp(arg[1],"bytype") == 0) style = Neighbor::BYTYPE;
|
||||
else if (strcmp(arg[1],"multi/tiered") == 0) style = Neighbor::MULT_TIERED;
|
||||
else error->all(FLERR,"Illegal neighbor command");
|
||||
|
||||
if (style == Neighbor::MULTI && lmp->citeme) lmp->citeme->add(cite_neigh_multi);
|
||||
|
||||
@ -20,7 +20,7 @@ namespace LAMMPS_NS {
|
||||
|
||||
class Neighbor : protected Pointers {
|
||||
public:
|
||||
enum{NSQ,BIN,MULTI,BYTYPE};
|
||||
enum{NSQ,BIN,MULTI,MULTI_TIERED};
|
||||
int style; // 0,1,2 = nsq, bin, multi
|
||||
int every; // build every this many steps
|
||||
int delay; // delay build for this many steps
|
||||
@ -239,22 +239,22 @@ namespace NeighConst {
|
||||
static const int NB_KOKKOS_DEVICE = 1<<1;
|
||||
static const int NB_KOKKOS_HOST = 1<<2;
|
||||
static const int NB_SSA = 1<<3;
|
||||
static const int NB_BYTYPE = 1<<4;
|
||||
static const int NB_MULTI_TIERED = 1<<4;
|
||||
static const int NB_STANDARD = 1<<5;
|
||||
|
||||
static const int NS_BIN = 1<<0;
|
||||
static const int NS_MULTI = 1<<1;
|
||||
static const int NS_HALF = 1<<2;
|
||||
static const int NS_FULL = 1<<3;
|
||||
static const int NS_2D = 1<<4;
|
||||
static const int NS_3D = 1<<5;
|
||||
static const int NS_NEWTON = 1<<6;
|
||||
static const int NS_NEWTOFF = 1<<7;
|
||||
static const int NS_ORTHO = 1<<8;
|
||||
static const int NS_TRI = 1<<9;
|
||||
static const int NS_GHOST = 1<<10;
|
||||
static const int NS_SSA = 1<<11;
|
||||
static const int NS_BYTYPE = 1<<12;
|
||||
static const int NS_BIN = 1<<0;
|
||||
static const int NS_MULTI = 1<<1;
|
||||
static const int NS_HALF = 1<<2;
|
||||
static const int NS_FULL = 1<<3;
|
||||
static const int NS_2D = 1<<4;
|
||||
static const int NS_3D = 1<<5;
|
||||
static const int NS_NEWTON = 1<<6;
|
||||
static const int NS_NEWTOFF = 1<<7;
|
||||
static const int NS_ORTHO = 1<<8;
|
||||
static const int NS_TRI = 1<<9;
|
||||
static const int NS_GHOST = 1<<10;
|
||||
static const int NS_SSA = 1<<11;
|
||||
static const int NS_MULTI_TIERED = 1<<12;
|
||||
|
||||
static const int NP_NSQ = 1<<0;
|
||||
static const int NP_BIN = 1<<1;
|
||||
@ -281,7 +281,7 @@ namespace NeighConst {
|
||||
static const int NP_SKIP = 1<<22;
|
||||
static const int NP_HALF_FULL = 1<<23;
|
||||
static const int NP_OFF2ON = 1<<24;
|
||||
static const int NP_BYTYPE = 1<<25;
|
||||
static const int NP_MULTI_TIERED = 1<<25;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user