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

This commit is contained in:
sjplimp
2014-04-09 16:50:23 +00:00
parent 5e3ff6cffd
commit c0fbdbefaa
14 changed files with 107 additions and 170 deletions

View File

@ -48,8 +48,8 @@ using namespace MathSpecial;
#define MAXORDER 7
#define OFFSET 16384
#define SMALL 0.00001
#define LARGE 10000.0
#define SMALL 0.00001
#define EPS_HOC 1.0e-7
enum{REVERSE_RHO};
@ -203,8 +203,6 @@ void PPPM::init()
// extract short-range Coulombic cutoff from pair style
triclinic = domain->triclinic;
scale = 1.0;
pair_check();
int itmp = 0;
@ -250,26 +248,10 @@ void PPPM::init()
// compute qsum & qsqsum and warn if not charge-neutral
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;
q2 = qsqsum * force->qqrd2e;
if (qsqsum == 0.0)
error->all(FLERR,"Cannot use kspace solver on system with no charge");
if (fabs(qsum) > SMALL && me == 0) {
char str[128];
sprintf(str,"System is not charge neutral, net charge = %g",qsum);
error->warning(FLERR,str);
}
scale = 1.0;
qqrd2e = force->qqrd2e;
qsum_qsq(0);
natoms_original = atom->natoms;
// set accuracy (force units) from accuracy_relative or accuracy_absolute
@ -678,14 +660,20 @@ void PPPM::compute(int eflag, int vflag)
if (evflag_atom) fieldforce_peratom();
// sum global energy across procs and add in volume-dependent term
// reset qsum and qsqsum if atom count has changed
const double qscale = force->qqrd2e * scale;
const double qscale = qqrd2e * scale;
if (eflag_global) {
double energy_all;
MPI_Allreduce(&energy,&energy_all,1,MPI_DOUBLE,MPI_SUM,world);
energy = energy_all;
if (atom->natoms != natoms_original) {
qsum_qsq(0);
natoms_original = atom->natoms;
}
energy *= 0.5*volume;
energy -= g_ewald*qsqsum/MY_PIS +
MY_PI2*qsum*qsum / (g_ewald*g_ewald*volume);
@ -2460,7 +2448,7 @@ void PPPM::fieldforce_ik()
// convert E-field to force
const double qfactor = force->qqrd2e * scale * q[i];
const double qfactor = qqrd2e * scale * q[i];
f[i][0] += qfactor*ekx;
f[i][1] += qfactor*eky;
if (slabflag != 2) f[i][2] += qfactor*ekz;
@ -2531,7 +2519,7 @@ void PPPM::fieldforce_ad()
// convert E-field to force and substract self forces
const double qfactor = force->qqrd2e * scale;
const double qfactor = qqrd2e * scale;
s1 = x[i][0]*hx_inv;
s2 = x[i][1]*hy_inv;
@ -2954,7 +2942,7 @@ void PPPM::slabcorr()
const double e_slabcorr = MY_2PI*(dipole_all*dipole_all -
qsum*dipole_r2 - qsum*qsum*zprd*zprd/12.0)/volume;
const double qscale = force->qqrd2e * scale;
const double qscale = qqrd2e * scale;
if (eflag_global) energy += qscale * e_slabcorr;
@ -3141,7 +3129,7 @@ void PPPM::compute_group_group(int groupbit_A, int groupbit_B, int AA_flag)
poisson_groups(AA_flag);
const double qscale = force->qqrd2e * scale;
const double qscale = qqrd2e * scale;
// total group A <--> group B energy
// self and boundary correction terms are in compute_group_group.cpp
@ -3487,7 +3475,7 @@ void PPPM::slabcorr_groups(int groupbit_A, int groupbit_B, int AA_flag)
// compute corrections
const double qscale = force->qqrd2e * scale;
const double qscale = qqrd2e * scale;
const double efact = qscale * MY_2PI/volume;
e2group += efact * (dipole_A*dipole_B - 0.5*(qsum_A*dipole_r2_B +