git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@11757 f3b2605a-c512-4ea7-a41b-209d697bcdaa

This commit is contained in:
sjplimp 2014-04-09 16:51:15 +00:00
parent c0fbdbefaa
commit bfd3e3a684
2 changed files with 59 additions and 15 deletions

View File

@ -26,6 +26,8 @@
using namespace LAMMPS_NS;
#define SMALL 0.00001
/* ---------------------------------------------------------------------- */
KSpace::KSpace(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp)
@ -243,6 +245,40 @@ void KSpace::ev_setup(int eflag, int vflag)
}
}
/* ----------------------------------------------------------------------
compute qsum,qsqsum,q2 and give error/warning if not charge neutral
only called initially or when particle count changes
------------------------------------------------------------------------- */
void KSpace::qsum_qsq(int flag)
{
qsum = qsqsum = 0.0;
for (int i = 0; i < atom->nlocal; i++) {
qsum += atom->q[i];
qsqsum += atom->q[i]*atom->q[i];
}
double tmp;
MPI_Allreduce(&qsum,&tmp,1,MPI_DOUBLE,MPI_SUM,world);
qsum = tmp;
MPI_Allreduce(&qsqsum,&tmp,1,MPI_DOUBLE,MPI_SUM,world);
qsqsum = tmp;
if (qsqsum == 0.0)
error->all(FLERR,"Cannot use kspace solver on system with no charge");
q2 = qsqsum * force->qqrd2e;
// not yet sure of the correction needed for non-neutral systems
if (fabs(qsum) > SMALL) {
char str[128];
sprintf(str,"System is not charge neutral, net charge = %g",qsum);
if (flag) error->all(FLERR,str);
else if (comm->me == 0) error->warning(FLERR,str);
}
}
/* ----------------------------------------------------------------------
estimate the accuracy of the short-range coulomb tables
------------------------------------------------------------------------- */
@ -335,7 +371,8 @@ void KSpace::lamda2xvector(double *lamda, double *v)
coords and return the tight (axis-aligned) bounding box, does not
preserve vector magnitude
see http://www.loria.fr/~shornus/ellipsoid-bbox.html and
http://yiningkarlli.blogspot.com/2013/02/bounding-boxes-for-ellipsoidsfigure.html
http://yiningkarlli.blogspot.com/2013/02/
bounding-boxes-for-ellipsoidsfigure.html
------------------------------------------------------------------------- */
void KSpace::kspacebbox(double r, double *b)

View File

@ -45,8 +45,10 @@ class KSpace : protected Pointers {
int tip4pflag; // 1 if a TIP4P solver
int dipoleflag; // 1 if a dipole solver
int differentiation_flag;
int neighrequest_flag; // used to avoid obsolete construction of neighbor lists
int mixflag; // 1 if geometric mixing rules are enforced for LJ coefficients
int neighrequest_flag; // used to avoid obsolete construction
// of neighbor lists
int mixflag; // 1 if geometric mixing rules are enforced
// for LJ coefficients
int slabflag;
int scalar_pressure_flag; // 1 if using MSM fast scalar pressure
double slab_volfactor;
@ -57,8 +59,10 @@ class KSpace : protected Pointers {
double accuracy_absolute; // user-specifed accuracy in force units
double accuracy_relative; // user-specified dimensionless accuracy
// accurary = acc_rel * two_charge_force
double accuracy_real_6; // real space accuracy for dispersion solver (force units)
double accuracy_kspace_6; // reciprocal space accuracy for dispersion solver (force units)
double accuracy_real_6; // real space accuracy for
// dispersion solver (force units)
double accuracy_kspace_6; // reciprocal space accuracy for
// dispersion solver (force units)
double two_charge_force; // force in user units of two point
// charges separated by 1 Angstrom
@ -77,7 +81,7 @@ class KSpace : protected Pointers {
int collective_flag; // 1 if use MPI collectives for FFT/remap
int stagger_flag; // 1 if using staggered PPPM grids
double splittol; // tolerance for when to truncate the splitting
double splittol; // tolerance for when to truncate splitting
KSpace(class LAMMPS *, int, char **);
virtual ~KSpace();
@ -116,19 +120,19 @@ class KSpace : protected Pointers {
see Eq 4 from Parallel Computing 35 (2009) 164–177
------------------------------------------------------------------------- */
double gamma(const double &rho) const {
double gamma(const double &rho) const
{
if (rho <= 1.0) {
const int split_order = order/2;
const double rho2 = rho*rho;
double g = gcons[split_order][0];
double rho_n = rho2;
for (int n=1; n<=split_order; n++) {
for (int n = 1; n <= split_order; n++) {
g += gcons[split_order][n]*rho_n;
rho_n *= rho2;
}
return g;
} else
return (1.0/rho);
} else return (1.0/rho);
}
/* ----------------------------------------------------------------------
@ -136,19 +140,19 @@ class KSpace : protected Pointers {
see Eq 4 from Parallel Computing 35 (2009) 164-177
------------------------------------------------------------------------- */
double dgamma(const double &rho) const {
double dgamma(const double &rho) const
{
if (rho <= 1.0) {
const int split_order = order/2;
const double rho2 = rho*rho;
double dg = dgcons[split_order][0]*rho;
double rho_n = rho*rho2;
for (int n=1; n<split_order; n++) {
for (int n = 1; n < split_order; n++) {
dg += dgcons[split_order][n]*rho_n;
rho_n *= rho2;
}
return dg;
} else
return (-1.0/rho/rho);
} else return (-1.0/rho/rho);
}
double **get_gcons() { return gcons; }
@ -160,7 +164,9 @@ class KSpace : protected Pointers {
int minorder,overlap_allowed;
int adjust_cutoff_flag;
int suffix_flag; // suffix compatibility flag
double scale;
bigint natoms_original;
double scale,qqrd2e;
double qsum,qsqsum,q2;
double **gcons,**dgcons; // accumulated per-atom energy/virial
int evflag,evflag_atom;
@ -171,6 +177,7 @@ class KSpace : protected Pointers {
int kewaldflag; // 1 if kspace range set for Ewald sum
int kx_ewald,ky_ewald,kz_ewald; // kspace settings for Ewald sum
void qsum_qsq(int);
void pair_check();
void ev_setup(int, int);
double estimate_table_accuracy(double, double);