Formatted according to Lammps guidelines
This commit is contained in:
@ -40,23 +40,30 @@ using namespace MathConst;
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
ComputePairEntropyAtom::ComputePairEntropyAtom(LAMMPS *lmp, int narg, char **arg) :
|
||||
ComputePairEntropyAtom::
|
||||
ComputePairEntropyAtom(LAMMPS *lmp, int narg, char **arg) :
|
||||
Compute(lmp, narg, arg),
|
||||
pair_entropy(NULL), pair_entropy_avg(NULL)
|
||||
{
|
||||
if (narg < 5 || narg > 10)
|
||||
error->all(FLERR,"Illegal compute pentropy/atom command");
|
||||
error->all(FLERR,"Illegal compute pentropy/atom command; wrong number"
|
||||
" of arguments");
|
||||
|
||||
// Arguments are: sigma cutoff avg yes/no cutoff2
|
||||
// Arguments are: sigma cutoff avg yes/no cutoff2 local yes/no
|
||||
// sigma is the gaussian width
|
||||
// cutoff is the cutoff for the calculation of g(r)
|
||||
// avg is optional and it means averaginf the pair entropy over the neighbors
|
||||
// avg is optional and allows averaging the pair entropy over neighbors
|
||||
// the next argument should be yes or no
|
||||
// cutoff2 is the cutoff for the averaging
|
||||
// local is optional and allows using the local density to normalize
|
||||
// the g(r)
|
||||
|
||||
sigma = force->numeric(FLERR,arg[3]);
|
||||
if (sigma < 0.0) error->all(FLERR,"Illegal compute pentropy/atom"
|
||||
" command; negative sigma");
|
||||
cutoff = force->numeric(FLERR,arg[4]);
|
||||
if (cutoff < 0.0) error->all(FLERR,"Illegal compute pentropy/atom command; negative cutoff");
|
||||
if (cutoff < 0.0) error->all(FLERR,"Illegal compute pentropy/atom"
|
||||
" command; negative cutoff");
|
||||
|
||||
avg_flag = 0;
|
||||
local_flag = 0;
|
||||
@ -66,20 +73,25 @@ ComputePairEntropyAtom::ComputePairEntropyAtom(LAMMPS *lmp, int narg, char **arg
|
||||
while (iarg < narg) {
|
||||
if (strcmp(arg[iarg],"avg") == 0) {
|
||||
if (iarg+2 > narg)
|
||||
error->all(FLERR,"Illegal compute pentropy/atom missing arguments after avg");
|
||||
error->all(FLERR,"Illegal compute pentropy/atom;"
|
||||
" missing arguments after avg");
|
||||
if (strcmp(arg[iarg+1],"yes") == 0) avg_flag = 1;
|
||||
else if (strcmp(arg[iarg+1],"no") == 0) avg_flag = 0;
|
||||
else error->all(FLERR,"Illegal compute pentropy/atom argument after avg should be yes or no");
|
||||
else error->all(FLERR,"Illegal compute pentropy/atom;"
|
||||
" argument after avg should be yes or no");
|
||||
cutoff2 = force->numeric(FLERR,arg[iarg+2]);
|
||||
if (cutoff2 < 0.0) error->all(FLERR,"Illegal compute pentropy/atom command; negative cutoff2");
|
||||
if (cutoff2 < 0.0) error->all(FLERR,"Illegal compute pentropy/atom"
|
||||
" command; negative cutoff2");
|
||||
cutsq2 = cutoff2*cutoff2;
|
||||
iarg += 3;
|
||||
} else if (strcmp(arg[iarg],"local") == 0) {
|
||||
if (strcmp(arg[iarg+1],"yes") == 0) local_flag = 1;
|
||||
else if (strcmp(arg[iarg+1],"no") == 0) local_flag = 0;
|
||||
else error->all(FLERR,"Illegal compute pentropy/atom argument after local should be yes or no");
|
||||
else error->all(FLERR,"Illegal compute pentropy/atom;"
|
||||
" argument after local should be yes or no");
|
||||
iarg += 2;
|
||||
} else error->all(FLERR,"Illegal compute pentropy/atom argument after sigma and cutoff should be avg or local");
|
||||
} else error->all(FLERR,"Illegal compute pentropy/atom; argument after"
|
||||
" sigma and cutoff should be avg or local");
|
||||
}
|
||||
|
||||
|
||||
@ -87,7 +99,10 @@ ComputePairEntropyAtom::ComputePairEntropyAtom(LAMMPS *lmp, int narg, char **arg
|
||||
nbin = static_cast<int>(cutoff / sigma) + 1;
|
||||
nmax = 0;
|
||||
maxneigh = 0;
|
||||
deltabin = 2; // 2 seems a good compromise between speed and good mollification
|
||||
// Number of bins above and below the central one that will be
|
||||
// considered as affected by the gaussian kernel
|
||||
// 2 seems a good compromise between speed and good mollification
|
||||
deltabin = 2;
|
||||
deltar = sigma;
|
||||
peratom_flag = 1;
|
||||
size_peratom_cols = 0;
|
||||
@ -106,25 +121,16 @@ ComputePairEntropyAtom::~ComputePairEntropyAtom()
|
||||
void ComputePairEntropyAtom::init()
|
||||
{
|
||||
if (force->pair == NULL)
|
||||
error->all(FLERR,"Compute centro/atom requires a pair style be defined");
|
||||
|
||||
//double largest_cutsq;
|
||||
//largest_cutsq = cutsq;
|
||||
//if (cutsq2 > cutsq) largest_cutsq = cutsq2;
|
||||
error->all(FLERR,"Compute centro/atom requires a pair style be"
|
||||
" defined");
|
||||
|
||||
if ( (cutoff+cutoff2) > (force->pair->cutforce + neighbor->skin) )
|
||||
{
|
||||
//fprintf(screen, "%f %f %f %f \n", cutoff, cutoff2, (cutoff+cutoff2) , force->pair->cutforce + neighbor->skin );
|
||||
error->all(FLERR,"Compute pentropy/atom cutoff is longer than pairwise cutoff. Increase the neighbor list skin distance.");
|
||||
error->all(FLERR,"Compute pentropy/atom cutoff is longer than the"
|
||||
" pairwise cutoff. Increase the neighbor list skin"
|
||||
" distance.");
|
||||
}
|
||||
|
||||
/*
|
||||
if (2.0*sqrt(largest_cutsq) > force->pair->cutforce + neighbor->skin &&
|
||||
comm->me == 0)
|
||||
error->warning(FLERR,"Compute pentropy/atom cutoff may be too large to find "
|
||||
"ghost atom neighbors");
|
||||
*/
|
||||
|
||||
int count = 0;
|
||||
for (int i = 0; i < modify->ncompute; i++)
|
||||
if (strcmp(modify->compute[i]->style,"pentropy/atom") == 0) count++;
|
||||
@ -180,15 +186,12 @@ void ComputePairEntropyAtom::compute_peratom()
|
||||
memory->destroy(pair_entropy_avg);
|
||||
nmax = atom->nmax;
|
||||
memory->create(pair_entropy,nmax,"pentropy/atom:pair_entropy");
|
||||
memory->create(pair_entropy_avg,nmax,"pentropy/atom:pair_entropy_avg");
|
||||
memory->create(pair_entropy_avg,nmax,
|
||||
"pentropy/atom:pair_entropy_avg");
|
||||
vector_atom = pair_entropy_avg;
|
||||
}
|
||||
}
|
||||
|
||||
// invoke full neighbor list (will copy or build if necessary)
|
||||
|
||||
//neighbor->build_one(list);
|
||||
|
||||
inum = list->inum + list->gnum;
|
||||
ilist = list->ilist;
|
||||
numneigh = list->numneigh;
|
||||
@ -218,13 +221,16 @@ void ComputePairEntropyAtom::compute_peratom()
|
||||
// If local density is used, calculate it
|
||||
if (local_flag) {
|
||||
double neigh_cutoff = force->pair->cutforce + neighbor->skin;
|
||||
double volume = (4./3.)*MY_PI*neigh_cutoff*neigh_cutoff*neigh_cutoff;
|
||||
double volume =
|
||||
(4./3.)*MY_PI*neigh_cutoff*neigh_cutoff*neigh_cutoff;
|
||||
density = jnum / volume;
|
||||
}
|
||||
|
||||
// calculate kernel normalization
|
||||
double normConstantBase = 4*MY_PI*density; // Normalization of g(r)
|
||||
normConstantBase *= sqrt(2.*MY_PI)*sigma; // Normalization of gaussian
|
||||
// Normalization of g(r)
|
||||
double normConstantBase = 4*MY_PI*density;
|
||||
// Normalization of gaussian
|
||||
normConstantBase *= sqrt(2.*MY_PI)*sigma;
|
||||
double invNormConstantBase = 1./normConstantBase;
|
||||
|
||||
// loop over list of all neighbors within force cutoff
|
||||
@ -245,8 +251,7 @@ void ComputePairEntropyAtom::compute_peratom()
|
||||
// contribute to gofr
|
||||
double r=sqrt(rsq);
|
||||
int bin=floor(r/deltar);
|
||||
int minbin, maxbin; // These cannot be unsigned
|
||||
// Only consider contributions to g(r) of atoms less than n*sigma bins apart from the actual distance
|
||||
int minbin, maxbin;
|
||||
minbin=bin - deltabin;
|
||||
if (minbin < 0) minbin=0;
|
||||
if (minbin > (nbin-1)) minbin=nbin-1;
|
||||
@ -255,19 +260,11 @@ void ComputePairEntropyAtom::compute_peratom()
|
||||
for(int k=minbin;k<maxbin+1;k++) {
|
||||
double invNormKernel=invNormConstantBase/rbinsq[k];
|
||||
double distance = r - rbin[k];
|
||||
gofr[k] += invNormKernel*exp(-distance*distance/sigmasq2) ;
|
||||
gofr[k] += invNormKernel*exp(-distance*distance/sigmasq2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
if (ii==500) {
|
||||
for(int k=0;k<nbin;++k) {
|
||||
fprintf(screen,"%f %f \n",rbin[k], gofr[k]);
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
// Calculate integrand
|
||||
double integrand[nbin];
|
||||
for(int k=0;k<nbin;++k){
|
||||
@ -305,8 +302,8 @@ void ComputePairEntropyAtom::compute_peratom()
|
||||
|
||||
pair_entropy_avg[i] = pair_entropy[i];
|
||||
double counter = 1;
|
||||
|
||||
// loop over list of all neighbors within force cutoff
|
||||
|
||||
for (jj = 0; jj < jnum; jj++) {
|
||||
j = jlist[jj];
|
||||
j &= NEIGHMASK;
|
||||
|
||||
@ -59,21 +59,9 @@ Self-explanatory. Check the input script syntax and compare to the
|
||||
documentation for the command. You can use -echo screen as a
|
||||
command-line option when running LAMMPS to see the offending line.
|
||||
|
||||
E: Illegal compute pentropy/atom command3
|
||||
|
||||
UNDOCUMENTED
|
||||
|
||||
E: Illegal compute pentropy/atom command2
|
||||
|
||||
UNDOCUMENTED
|
||||
|
||||
E: Illegal compute pentropy/atom command1
|
||||
|
||||
UNDOCUMENTED
|
||||
|
||||
E: Compute pentropy/atom requires a pair style be defined
|
||||
|
||||
This is because the computation of the centro-symmetry values
|
||||
This is because the computation of the pair entropy values
|
||||
uses a pairwise neighbor list.
|
||||
|
||||
W: More than one compute pentropy/atom
|
||||
|
||||
Reference in New Issue
Block a user