52 std::cerr <<
"Error: getSwitchingWidth() > getCutoff()" << std::endl;
53 std::exit(EXIT_FAILURE);
86 if (not std::isinf(period)) {
87 double n = r / period + 0.5;
89 int m =
static_cast<int>(n);
105 for (
int i = 0; i < 3; ++i)
117 return 2.0 * length * std::sin(angle / 2.0);
131 double F1[],
double F2[],
double &u,
132 const double k,
const double req) {
161 double const r3[],
double f1[],
double f2[],
162 double f3[],
double &u,
const double k,
164 double r12[3], r12_1, r12_2, r23[3], r23_1, r23_2, cosa, a, m, d12, d23;
165 distance(r2, r1, r12, r12_1, r12_2);
166 distance(r3, r2, r23, r23_1, r23_2);
169 u += k * (a - aeq) * (a - aeq);
170 m = -2 * k * (a - aeq);
171 m /= -1 * std::sqrt(1 - cosa * cosa);
172 for (
int i = 0; i < 3; ++i) {
173 d12 = -cosa * r12[i] / r12_2 - r23[i] / r12_1 / r23_1;
174 d23 = -cosa * r23[i] / r23_2 - r12[i] / r12_1 / r23_1;
176 f2[i] += m * (d12 - d23);
190 for (
int i = 0; i < 3; ++i) {
191 rc[i] = (r1[i] +
unBreak1(r2[i], r1[i], i)) * 0.5;
197 double const r3[],
double rc[]) {
198 for (
int i = 0; i < 3; ++i) {
209 double const w3,
double const r1[],
211 double const r3[],
double rc[]) {
212 assert(std::fabs(w1 + w2 + w3 - 1.0) < 1e-9);
213 for (
int i = 0; i < 3; ++i) {
214 rc[i] = w1 * r1[i] + w2 *
unBreak1(r2[i], r1[i], i) +
230 double f1[],
double f2[],
double &energy,
239 for (
int l = 0; l < 3; ++l) {
240 f1[l] += f * d[l] / d1;
241 f2[l] -= f * d[l] / d1;
257 double f2[],
double &energy,
double qq) {
258 double d1, d[3], f, en;
262 for (
int l = 0; l < 3; ++l) {
263 f1[l] += f * d[l] / d1;
264 f2[l] -= f * d[l] / d1;
285 for (
int i = 0; i < 3; ++i) {
286 double const f = fc[i] / 2;
297 for (
int i = 0; i < 3; ++i) {
298 double const f = fc[i] / 3;
313 double const w3,
double f1[],
314 double f2[],
double f3[],
316 for (
int i = 0; i < 3; ++i) {
317 double const f = fc[i];
334 return B * B / A / 4.0;
351 energy = 4 *
epsilon * (x - 1) * x;
364 double F1[],
double F2[],
double &E,
398 double f1[],
double f2[],
399 double &energy,
double const epsilon,
400 double const sigma) {
401 double r12[3] = {0}, d = 0.0, f, en;
406 for (
int i = 0; i < 3; ++i) {
407 f1[i] -= f * r12[i] / d;
408 f2[i] += f * r12[i] / d;
424 return std::pow(A / B, 1.0 / 6.0);
434 double sigma2,
double epsilon2) {
436 double s1_2 = sigma1 * sigma1, sa6 = s1_2 * s1_2 * s1_2;
437 double s2_2 = sigma2 * sigma2, sb6 = s2_2 * s2_2 * s2_2;
438 n = 8192.0 * epsilon1 * sa6 * epsilon2 * sb6;
439 d = std::pow(epsilon1 * sa6 * sa6, 1.0 / 13.0) +
440 std::pow(epsilon2 * sb6 * sb6, 1.0 / 13.0);
456 double sigma2,
double epsilon2) {
457 double s1_2 = sigma1 * sigma1;
458 double const sa6 = s1_2 * s1_2 * s1_2;
459 double s2_2 = sigma2 * sigma2;
460 double const sb6 = s2_2 * s2_2 * s2_2;
462 n = std::pow(epsilon1 * sa6 * sa6, 1.0 / 13.0) +
463 std::pow(epsilon2 * sb6 * sb6, 1.0 / 13.0);
464 n = std::pow(n, 13.0);
465 d = 8192.0 * std::sqrt(epsilon1 * sa6 * epsilon2 * sb6);
466 return std::pow(n / d, 1.0 / 6.0);
489 double S = (2 * x - 3) * x * x + 1;
490 double dS = 6 * x * (x - 1);
491 double const u = energy;
512 double f2[],
double &energy) {
518 double S = (2 * x - 3) * x * x + 1;
519 double dS = 6 * x * (x - 1);
520 double const u = energy;
521 for (
int k = 0; k < 3; ++k) {
556 double &z1,
double &z2) {
560 for (
int i = 0; i < 3; ++i)
563 z2 = z[0] * z[0] + z[1] * z[1] + z[2] * z[2];
624 double const period) {
630 double const periods[]) {
631 for (
int a = 0; a < 3; ++a)
632 r[a] =
unBreak0(r[a], ref[a], periods[a]);
659 double forces[],
double &energy,
660 double const periods[],
bool const fixed[]) {
661 int const nCoord = 3 * nAtoms;
662 for (
int i = 0; i < nCoord; ++i)
665 double const(*r)[3] =
reinterpret_cast<double const(*)[3]
>(positions);
666 double (*f)[3] =
reinterpret_cast<double (*)[3]
>(forces);
669 for (
int i = nAtoms - 1; i > 0; --i) {
670 for (
int j = i - 1; j >= 0; --j) {
671 if (not fixed[i] and not fixed[j]) {
PotentialBase()
Non bond interaction cutoff.
static double sigma(double const A, double const B)
Conversion for Lennard-Jones.
void spreadWeightedForce(double const w1, double const w2, double const w3, double f1[], double f2[], double f3[], double const fc[])
Spread force on barycentre to atoms.
static double applyPeriodicity0(double r, double const period)
Minimum image representation.
double unBreak1(double const r, double const ref, int const axis)
Undo the separation of two atoms created by the periodic boundaries.
void switching(ChargeGroup< N, R, F > &g1, ChargeGroup< N, R, F > &g2, double &energy, double cutoff, double switchingWidth)
static double unBreak0(double const r, double const ref, double const period)
Undo the separation of two atoms created by the periodic boundaries.
void restrainLength(const double R1[], const double R2[], double F1[], double F2[], double &u, const double k, const double r0)
Compute quadratic restraints between two atoms.
void restrainAngle(double const r1[], double const r2[], double const r3[], double f1[], double f2[], double f3[], double &u, const double k, const double aeq)
Angular quadratic restraints.
static double smithKongSigma(double sigma1, double epsilon1, double sigma2, double epsilon2)
Smith and Kong combination rules.
void setCutoff(double cutoff)
void coulomb(const double r1[], const double r2[], double f1[], double f2[], double &u, double const qq)
Compute Coulomb interaction between two charges.
void lennardJones(double const distance, double &force, double &energy, double const epsilon, double const sigma)
Lennard-Jones 12-6 between two atoms.
void calculateCentre(double const r1[], double const r2[], double rc[])
Calculate centre of two points.
void setPeriodicity(const double periods[])
Set periodicity.
void distance(const double x[], const double y[], double z[], double &z1, double &z2)
Distance vector, norm and norm square.
void setSwitchingWidth(double width)
void lennardJonesWithCutoff(double const r1[], double const r2[], double f1[], double f2[], double &energy, double const epsilon, double const sigma)
Lennard Jones 12-6 Potential with cutoff.
static const double EPSILON_PT
Platinum Lennard-Jones.
double applyPeriodicity1(double r, int const axis)
Minimum image representation.
void computePt(int const nAtoms, double positions[], double forces[], double &energy, double const periods[], bool const fixed[])
Potential for Platinum.
static const double SIGMA_PT
static double smithKongEpsilon(double sigma1, double epsilon1, double sigma2, double epsilon2)
Smith and Kong combination rules.
static double epsilon(double const A, double const B)
Conversion for Lennard-Jones.
void spreadForce(double f1[], double f2[], double const fc[])
Spread force on centre to other points.
double getSwitchingWidth() const
Width of the switching zone.
void coulombWithCutoff(const double r1[], const double r2[], double f1[], double f2[], double &u, double const qq)
Coulomb interaction with single charge based cutoff.
static double isoscelesBase(double length, double angle)
Calculate the base of an isosceles triangle.
void calculateWeightedCentre(double const w1, double const w2, double const w3, double const r1[], double const r2[], double const r3[], double rc[])
Calculate barycentre.
static const double ONE_OVER_4_PI_EPSILON0
static double dotProduct(double const v[], double const w[])
Dot product.
Basic tools to write potentials.
double _2
Vector's norm square.