adjust logic for choosing the communication cutoff to requests from @sjplimp

limit cases where warning about adjusting the comm cutoff is printed.
This commit is contained in:
Axel Kohlmeyer
2019-07-25 08:33:21 -04:00
parent d08477cc5f
commit 4586fd50af

View File

@ -588,39 +588,52 @@ void Comm::set_proc_grid(int outflag)
/* ----------------------------------------------------------------------
determine suitable communication cutoff.
it is the maximum of the user specified value and estimates based on
the maximum neighbor list cutoff and largest bond equilibrium length.
we use the 1.5x the bond equilibrium distance as cutoff, if only a
bond style exists or only bond and angle styles exists. If dihedrals
or impropers are present we multiply by 2.0. This plus the
"neighbor list skin" will become the default communication cutoff, if
no pair style is defined and thus avoids all kinds of unexpected behavior
for such systems. If a pair style exists, the result is the maximum of
the bond based cutoff and the largest pair cutoff and the user
specified communication cutoff.
use the larger of the user specified value and the cutoff required
by the neighborlist build for pair styles.
if bonded interactions exist, apply a heuristic based on the equilibrium
bond length (use 1.5x r_bond if no dihedral or improper style exists
otherwise 2x r_bond) plus neighbor list skin.
if no user specified communication cutoff is given include this
heuristic, otherwise ignore it.
print a warning, if a user specified communication cutoff is overridden.
------------------------------------------------------------------------- */
double Comm::get_comm_cutoff()
{
double maxcommcutoff = 0.0;
double maxbondcutoff = 0.0;
if (force->bond) {
int n = atom->nbondtypes;
for (int i = 1; i <= n; ++i)
maxcommcutoff = MAX(maxcommcutoff,force->bond->equilibrium_distance(i));
maxbondcutoff = MAX(maxbondcutoff,force->bond->equilibrium_distance(i));
if (force->dihedral || force->improper) {
maxcommcutoff *= 2.0;
maxbondcutoff *= 2.0;
} else {
maxcommcutoff *=1.5;
maxbondcutoff *=1.5;
}
maxcommcutoff += neighbor->skin;
maxbondcutoff += neighbor->skin;
}
maxcommcutoff = MAX(maxcommcutoff,neighbor->cutneighmax);
maxcommcutoff = MAX(maxcommcutoff,cutghostuser);
if ((me == 0) && (cutghostuser > 0.0) && (maxcommcutoff > cutghostuser)) {
char mesg[128];
snprintf(mesg,128,"Communication cutoff is changed to %g",maxcommcutoff);
error->warning(FLERR,mesg);
// always take the larger of max neighbor list and user specified cutoff
maxcommcutoff = MAX(cutghostuser,neighbor->cutneighmax);
// consider cutoff estimate from bond length only if no user specified cutoff
if (cutghostuser == 0.0) maxcommcutoff = MAX(maxcommcutoff,maxbondcutoff);
// print warning if neighborlist cutoff overrides user cutoff or
// applied bond based cutoff is larger than neighbor cutoff.
if (me == 0) {
if ( ((cutghostuser > 0.0) && (maxcommcutoff > cutghostuser))
|| ((cutghostuser == 0.0) && (maxcommcutoff == maxbondcutoff)) ) {
char mesg[128];
snprintf(mesg,128,"Communication cutoff adjusted to %g",maxcommcutoff);
error->warning(FLERR,mesg);
}
}
return maxcommcutoff;