Evaluate the CV.
88 auto n = snapshot.GetNumAtoms();
89 const auto& pos = snapshot.GetPositions();
90 auto& comm = snapshot.GetCommunicator();
96 Vector3 xi{0, 0, 0}, xj{0, 0, 0}, xk{0, 0, 0};
98 auto iindex = snapshot.GetLocalIndex(
atomids_[0]);
99 auto jindex = snapshot.GetLocalIndex(
atomids_[1]);
100 auto kindex = snapshot.GetLocalIndex(
atomids_[2]);
102 if(iindex != -1) xi = pos[iindex];
103 if(jindex != -1) xj = pos[jindex];
104 if(kindex != -1) xk = pos[kindex];
108 MPI_Allreduce(MPI_IN_PLACE, xi.data(), 3, MPI_DOUBLE, MPI_SUM, comm);
109 MPI_Allreduce(MPI_IN_PLACE, xj.data(), 3, MPI_DOUBLE, MPI_SUM, comm);
110 MPI_Allreduce(MPI_IN_PLACE, xk.data(), 3, MPI_DOUBLE, MPI_SUM, comm);
113 auto rij = snapshot.ApplyMinimumImage(xi - xj);
114 auto rkj = snapshot.ApplyMinimumImage(xk - xj);
116 auto dotP = rij.dot(rkj);
117 auto nrij = rij.norm();
118 auto nrkj = rkj.norm();
120 val_ = acos(dotP/(nrij*nrkj));
123 auto prefactor = -1.0/(sqrt(1. - dotP/(nrij*nrkj))*nrij*nrkj);
125 Vector3 gradi{0, 0, 0}, gradk{0, 0, 0};
126 if(iindex != -1) gradi = prefactor*(rkj - dotP*rij/(nrij*nrij));
127 if(kindex != -1) gradk = prefactor*(rij - dotP*rkj/(nrkj*nrkj));
128 MPI_Allreduce(MPI_IN_PLACE, gradi.data(), 3, MPI_DOUBLE, MPI_SUM, comm);
129 MPI_Allreduce(MPI_IN_PLACE, gradk.data(), 3, MPI_DOUBLE, MPI_SUM, comm);
130 if(iindex != -1)
grad_[iindex] = gradi;
131 if(kindex != -1)
grad_[kindex] = gradk;
132 if(jindex != -1)
grad_[jindex] = -gradi - gradk;
std::vector< Vector3 > grad_
Gradient vector dCv/dxi.
Label atomids_
Vector of 3 atom ID's of interest.
Eigen::Vector3d Vector3
Three-dimensional vector.
double val_
Current value of CV.