Add contribution to virial and atom virial

This commit is contained in:
Mingjian Wen
2019-04-17 10:05:05 -05:00
parent 82a87322ed
commit cb30414820
2 changed files with 203 additions and 95 deletions

View File

@ -65,8 +65,11 @@ PairDRIP::PairDRIP(LAMMPS *lmp) : Pair(lmp)
nearest3neigh = NULL;
//no_virial_fdotr_compute = 1;
// set comm size needed by this Pair
comm_forward = 39;
//comm_forward = 39;
}
/* ---------------------------------------------------------------------- */
@ -108,6 +111,7 @@ void PairDRIP::init_style()
neighbor->requests[irequest]->full = 1;
neighbor->requests[irequest]->ghost = 1;
// TODO this can be deleted
// local DRIP neighbor list
// create pages if first time or if neighbor pgsize/oneatom has changed
@ -373,70 +377,70 @@ void PairDRIP::read_file(char *filename)
/* ---------------------------------------------------------------------- */
int PairDRIP::pack_forward_comm(int n, int *list, double *buf,
int /*pbc_flag*/, int * /*pbc*/)
{
int i,j,m,l,ip,id;
m = 0;
// for (i = 0; i < n; i++) {
// j = list[i];
// buf[m++] = normal[j][0];
// buf[m++] = normal[j][1];
// buf[m++] = normal[j][2];
// buf[m++] = dnormdri[0][0][j];
// buf[m++] = dnormdri[0][1][j];
// buf[m++] = dnormdri[0][2][j];
// buf[m++] = dnormdri[1][0][j];
// buf[m++] = dnormdri[1][1][j];
// buf[m++] = dnormdri[1][2][j];
// buf[m++] = dnormdri[2][0][j];
// buf[m++] = dnormdri[2][1][j];
// buf[m++] = dnormdri[2][2][j];
// for (l = 0; l < 3; l++){
// for (id = 0; id < 3; id++){
// for (ip = 0; ip < 3; ip++){
// buf[m++] = dnormal[id][ip][l][j];
// }
// }
// }
// }
return m;
}
//int PairDRIP::pack_forward_comm(int n, int *list, double *buf,
// int /*pbc_flag*/, int * /*pbc*/)
//{
// int i,j,m,l,ip,id;
//
// m = 0;
//// for (i = 0; i < n; i++) {
//// j = list[i];
//// buf[m++] = normal[j][0];
//// buf[m++] = normal[j][1];
//// buf[m++] = normal[j][2];
//// buf[m++] = dnormdri[0][0][j];
//// buf[m++] = dnormdri[0][1][j];
//// buf[m++] = dnormdri[0][2][j];
//// buf[m++] = dnormdri[1][0][j];
//// buf[m++] = dnormdri[1][1][j];
//// buf[m++] = dnormdri[1][2][j];
//// buf[m++] = dnormdri[2][0][j];
//// buf[m++] = dnormdri[2][1][j];
//// buf[m++] = dnormdri[2][2][j];
//// for (l = 0; l < 3; l++){
//// for (id = 0; id < 3; id++){
//// for (ip = 0; ip < 3; ip++){
//// buf[m++] = dnormal[id][ip][l][j];
//// }
//// }
//// }
//// }
//
// return m;
//}
/* ---------------------------------------------------------------------- */
void PairDRIP::unpack_forward_comm(int n, int first, double *buf)
{
int i,m,last,l,ip,id;
// m = 0;
// last = first + n;
// for (i = first; i < last; i++) {
// normal[i][0] = buf[m++];
// normal[i][1] = buf[m++];
// normal[i][2] = buf[m++];
// dnormdri[0][0][i] = buf[m++];
// dnormdri[0][1][i] = buf[m++];
// dnormdri[0][2][i] = buf[m++];
// dnormdri[1][0][i] = buf[m++];
// dnormdri[1][1][i] = buf[m++];
// dnormdri[1][2][i] = buf[m++];
// dnormdri[2][0][i] = buf[m++];
// dnormdri[2][1][i] = buf[m++];
// dnormdri[2][2][i] = buf[m++];
// for (l = 0; l < 3; l++){
// for (id = 0; id < 3; id++){
// for (ip = 0; ip < 3; ip++){
// dnormal[id][ip][l][i] = buf[m++];
// }
// }
// }
// }
//
}
//void PairDRIP::unpack_forward_comm(int n, int first, double *buf)
//{
// int i,m,last,l,ip,id;
//
//// m = 0;
//// last = first + n;
//// for (i = first; i < last; i++) {
//// normal[i][0] = buf[m++];
//// normal[i][1] = buf[m++];
//// normal[i][2] = buf[m++];
//// dnormdri[0][0][i] = buf[m++];
//// dnormdri[0][1][i] = buf[m++];
//// dnormdri[0][2][i] = buf[m++];
//// dnormdri[1][0][i] = buf[m++];
//// dnormdri[1][1][i] = buf[m++];
//// dnormdri[1][2][i] = buf[m++];
//// dnormdri[2][0][i] = buf[m++];
//// dnormdri[2][1][i] = buf[m++];
//// dnormdri[2][2][i] = buf[m++];
//// for (l = 0; l < 3; l++){
//// for (id = 0; id < 3; id++){
//// for (ip = 0; ip < 3; ip++){
//// dnormal[id][ip][l][i] = buf[m++];
//// }
//// }
//// }
//// }
////
//}
//
/* ---------------------------------------------------------------------- */
@ -457,6 +461,9 @@ void PairDRIP::compute(int eflag, int vflag)
evdwl = 0.0;
ev_init(eflag,vflag);
// TODO
//vflag_global = 1;
double **x = atom->x;
double **f = atom->f;
int *type = atom->type;
@ -475,7 +482,7 @@ void PairDRIP::compute(int eflag, int vflag)
//TODO what does this comm do?
// communicate the normal vector and its derivatives
comm->forward_comm_pair(this);
// comm->forward_comm_pair(this);
// loop over neighbors of my atoms
for (ii = 0; ii < inum; ii++) {
@ -492,6 +499,7 @@ void PairDRIP::compute(int eflag, int vflag)
// normal and its derivatives w.r.t. atom i and its 3 nearest neighs
calc_normal(i, nbi1, nbi2, nbi3, ni, dni_dri,dni_drnb1, dni_drnb2, dni_drnb3);
double fi[DIM] = {0., 0., 0.};
for (jj = 0; jj < jnum; jj++) {
j = jlist[jj];
@ -522,10 +530,13 @@ void PairDRIP::compute(int eflag, int vflag)
// only include the interation between different layers
if (rsq < rcutsq && atom->molecule[i] != atom->molecule[j]) {
double fj[DIM] = {0., 0., 0.};
double rvec[DIM] = {delx, dely, delz};
double phi_attr = calc_attractive(i,j,p, rsq, rvec);
double phi_repul = calc_repulsive(evflag, i, j, p, rsq, rvec, nbi1, nbi2,
nbi3, ni, dni_dri, dni_drnb1, dni_drnb2, dni_drnb3);
double phi_attr = calc_attractive(i,j,p, rsq, rvec, fi, fj);
double phi_repul = calc_repulsive(i, j, p, rsq, rvec, nbi1, nbi2,
nbi3, ni, dni_dri, dni_drnb1, dni_drnb2, dni_drnb3, fi, fj);
if (eflag) evdwl = HALF * (phi_repul + phi_attr);
@ -534,21 +545,83 @@ void PairDRIP::compute(int eflag, int vflag)
if (evflag) ev_tally(i,j,nlocal,newton_pair, evdwl,0.0,0,0,0,0);
// ev_tally_xyz(int i, int j, int nlocal, int newton_pair,
// double evdwl, double ecoul,
// double fx, double fy, double fz,
// double delx, double dely, double delz)
// void ev_tally_xyz_full(int i, double evdwl, double ecoul,
// double fx, double fy, double fz,
// double delx, double dely, double delz)
f[j][0] += fj[0];
f[j][1] += fj[1];
f[j][2] += fj[2];
// *2 since v_tally has a 0.5 coeff
fj[0] *= 2; fj[1] *= 2; fj[2] *= 2;
if (vflag_atom) v_tally(j, fj, x[j]);
}
} //loop over jj
f[i][0] += fi[0];
f[i][1] += fi[1];
f[i][2] += fi[2];
// *2 since v_tally has a 0.5 coeff
fi[0] *= 2; fi[1] *= 2; fi[2] *= 2;
if (vflag_atom) v_tally(i, fi, x[i]);
} // loop over ii
if (vflag_fdotr)
virial_fdotr_compute();
printf("@@@ evflags in compute\n");
printf("@@@ eflag_either=%d\n", eflag_either);
printf("@@@ eflag_global=%d\n", eflag_global);
printf("@@@ eflag_atom=%d\n", eflag_atom);
printf("@@@ vflag_either=%d\n", vflag_either);
printf("@@@ vflag_global=%d\n", vflag_global);
printf("@@@ vflag_atom=%d\n", vflag_atom);
printf("@@@ vflag_fdotr=%d\n", vflag_fdotr);
printf("@@@@@@@@@@@@@@@@@@@@@@@ virial\n");
printf("%f, %f, %f, %f, %f, %f\n", virial[0], virial[1], virial[2], virial[3], virial[4], virial[5]);
printf("@@@@@@@@@@@@@@@@@@@@@@@ virial fdotr\n");
virial[0]= virial[1]= virial[2]= virial[3]= virial[4]= virial[5]=0.;
virial_fdotr_compute();
printf("%f, %f, %f, %f, %f, %f\n", virial[0], virial[1], virial[2], virial[3], virial[4], virial[5]);
printf("@@@@@@@@@@@@@@@@@@@@@@@ virial from atom virial\n");
int allnum = list->inum + list->gnum;
double v[6] = {0., 0., 0., 0., 0., 0.};
for (int kk=0; kk<allnum; kk++) {
for (int kkk=0; kkk<6; kkk++) {
v[kkk] += vatom[kk][kkk];
}
}
printf("%f, %f, %f, %f, %f, %f\n", v[0], v[1], v[2], v[3], v[4], v[5]);
printf("@@@@@@@@@@@@@@@@@@@@@@@ leave compute\n");
}
/* ---------------------------------------------------------------------- */
double PairDRIP::calc_attractive(int const i, int const j, Param& p,
double const rsq, double const * rvec)
double const rsq, double const * rvec, double * const fi, double * const fj)
{
double **f = atom->f;
double const z0 = p.z0;
double const A = p.A;
double const cutoff = p.rcut;
@ -562,26 +635,26 @@ double PairDRIP::calc_attractive(int const i, int const j, Param& p,
double phi = -r6 * tp;
double fpair = -HALF * (r6 * dtp + dr6 * tp);
f[i][0] += rvec[0] * fpair / r;
f[i][1] += rvec[1] * fpair / r;
f[i][2] += rvec[2] * fpair / r;
f[j][0] -= rvec[0] * fpair / r;
f[j][1] -= rvec[1] * fpair / r;
f[j][2] -= rvec[2] * fpair / r;
fi[0] += rvec[0] * fpair / r;
fi[1] += rvec[1] * fpair / r;
fi[2] += rvec[2] * fpair / r;
fj[0] -= rvec[0] * fpair / r;
fj[1] -= rvec[1] * fpair / r;
fj[2] -= rvec[2] * fpair / r;
return phi;
}
/* ---------------------------------------------------------------------- */
double PairDRIP::calc_repulsive(int const evflag, int const i, int const j,
double PairDRIP::calc_repulsive(int const i, int const j,
Param& p, double const rsq, double const * rvec,
int const nbi1, int const nbi2, int const nbi3, double const * ni,
V3 const * dni_dri, V3 const * dni_drnb1, V3 const * dni_drnb2,
V3 const * dni_drnb3)
V3 const * dni_drnb3, double * const fi, double * const fj)
{
double **f = atom->f;
double r = sqrt(rsq);
double **x = atom->x;
// params
double C0 = p.C0;
@ -598,6 +671,14 @@ double PairDRIP::calc_repulsive(int const evflag, int const i, int const j,
int nbj2 = nearest3neigh[j][1];
int nbj3 = nearest3neigh[j][2];
double r = sqrt(rsq);
double fnbi1[DIM];
double fnbi2[DIM];
double fnbi3[DIM];
double fnbj1[DIM];
double fnbj2[DIM];
double fnbj3[DIM];
V3 dgij_dri;
V3 dgij_drj;
V3 dgij_drk1;
@ -606,7 +687,6 @@ double PairDRIP::calc_repulsive(int const evflag, int const i, int const j,
V3 dgij_drl1;
V3 dgij_drl2;
V3 dgij_drl3;
V3 drhosqij_dri;
V3 drhosqij_drj;
V3 drhosqij_drnb1;
@ -645,23 +725,51 @@ double PairDRIP::calc_repulsive(int const evflag, int const i, int const j,
// forces due to derivatives of tap and V1
double tmp = HALF * (dtp * V1 + tp * dV1) * V2 * rvec[k] / r;
f[i][k] += tmp;
f[j][k] -= tmp;
fi[k] += tmp;
fj[k] -= tmp;
// the following incldue the transverse decay part tdij and the dihedral part gij
// derivative of V2 contribute to atoms i, j
f[i][k] -= HALF * tp * V1 * ((dtdij + dgij_drhosq) * drhosqij_dri[k] + dgij_dri[k]);
f[j][k] -= HALF * tp * V1 * ((dtdij + dgij_drhosq) * drhosqij_drj[k] + dgij_drj[k]);
fi[k] -= HALF * tp * V1 * ((dtdij + dgij_drhosq) * drhosqij_dri[k] + dgij_dri[k]);
fj[k] -= HALF * tp * V1 * ((dtdij + dgij_drhosq) * drhosqij_drj[k] + dgij_drj[k]);
// derivative of V2 contribute to neighs of atom i
f[nbi1][k] -= HALF * tp * V1 * ((dtdij + dgij_drhosq) * drhosqij_drnb1[k] + dgij_drk1[k]);
f[nbi2][k] -= HALF * tp * V1 * ((dtdij + dgij_drhosq) * drhosqij_drnb2[k] + dgij_drk2[k]);
f[nbi3][k] -= HALF * tp * V1 * ((dtdij + dgij_drhosq) * drhosqij_drnb3[k] + dgij_drk3[k]);
fnbi1[k] =- HALF * tp * V1 * ((dtdij + dgij_drhosq) * drhosqij_drnb1[k] + dgij_drk1[k]);
fnbi2[k] =- HALF * tp * V1 * ((dtdij + dgij_drhosq) * drhosqij_drnb2[k] + dgij_drk2[k]);
fnbi3[k] =- HALF * tp * V1 * ((dtdij + dgij_drhosq) * drhosqij_drnb3[k] + dgij_drk3[k]);
// derivative of V2 contribute to neighs of atom j
f[nbj1][k] -= HALF * tp * V1 * dgij_drl1[k];
f[nbj2][k] -= HALF * tp * V1 * dgij_drl2[k];
f[nbj3][k] -= HALF * tp * V1 * dgij_drl3[k];
fnbj1[k] =- HALF * tp * V1 * dgij_drl1[k];
fnbj2[k] =- HALF * tp * V1 * dgij_drl2[k];
fnbj3[k] =- HALF * tp * V1 * dgij_drl3[k];
}
for (int k = 0; k < DIM; k++) {
f[nbi1][k] += fnbi1[k];
f[nbi2][k] += fnbi2[k];
f[nbi3][k] += fnbi3[k];
f[nbj1][k] += fnbj1[k];
f[nbj2][k] += fnbj2[k];
f[nbj3][k] += fnbj3[k];
}
if (vflag_atom) {
// *2 since v_tally has a 0.5 coeff
for (int k = 0; k < DIM; k++) {
fnbi1[k]*=2;
fnbi2[k]*=2;
fnbi3[k]*=2;
fnbj1[k]*=2;
fnbj2[k]*=2;
fnbj3[k]*=2;
}
v_tally(nbi1, fnbi1, x[nbi1]);
v_tally(nbi2, fnbi2, x[nbi2]);
v_tally(nbi3, fnbi3, x[nbi3]);
v_tally(nbj1, fnbj1, x[nbj1]);
v_tally(nbj2, fnbj2, x[nbj2]);
v_tally(nbj3, fnbj3, x[nbj3]);
}
return phi;