42 void restrainLength(
const double R1[],
const double R2[],
double F1[],
43 double F2[],
double &u,
const double k,
const double r0);
47 void restrainAngle(
double const r1[],
double const r2[],
double const r3[],
48 double f1[],
double f2[],
double f3[],
double &u,
49 const double k,
const double aeq);
55 void calculateCentre(
double const r1[],
double const r2[],
double rc[]);
56 void calculateCentre(
double const r1[],
double const r2[],
double const r3[],
59 double const w3,
double const r1[],
60 double const r2[],
double const r3[],
63 double f2[],
double &u,
double const qq);
64 void coulomb(
const double r1[],
const double r2[],
double f1[],
double f2[],
65 double &u,
double const qq);
66 void coulomb(
double distance,
double &force,
double &energy,
double const qq);
67 void spreadForce(
double f1[],
double f2[],
double const fc[]);
68 void spreadForce(
double f1[],
double f2[],
double f3[],
double const fc[]);
70 double f1[],
double f2[],
double f3[],
72 template <
int N,
class R =
double (*const)[N],
class F =
double (*const)[N]>
78 template <
int N,
class R,
class F>
80 template <
int N,
class R,
class F>
82 double &energy,
double cutoff,
double switchingWidth);
86 static double epsilon(
double const A,
double const B);
89 void lennardJones(
const double R1[],
const double R2[],
double F1[],
90 double F2[],
double &E,
double const epsilon,
93 double f2[],
double &energy,
double const epsilon,
95 static double sigma(
double const A,
double const B);
96 static double smithKongEpsilon(
double sigma1,
double epsilon1,
double sigma2,
98 static double smithKongSigma(
double sigma1,
double epsilon1,
double sigma2,
101 void switching(
double const r1[],
double const r2[],
double f1[],
double f2[],
116 void distance(
const double x[],
const double y[],
double z[],
double &z1,
118 void distance(
const double x[],
const double y[],
double z[],
double &z1);
119 void distance(
const double x[],
const double y[],
double z[]);
120 void distance(
const double x[],
const double y[],
double &z1);
123 static double unBreak0(
double const r,
double const ref,
double const period);
124 static void unBreak0(
double r[],
double const ref[],
double const periods[]);
125 double unBreak1(
double const r,
double const ref,
int const axis);
126 void unBreak1(
double r[],
double const ref[]);
130 void computePt(
int const nAtoms,
double positions[],
double forces[],
131 double &energy,
double const periods[],
bool const fixed[]);
139 static inline void divide(
double v[],
double const divisor);
140 static inline double *
crossProduct(
const double v[],
const double w[],
142 static inline double dotProduct(
double const v[],
double const w[]);
143 static inline void multiply(
double v[],
double const factor);
144 static inline double norm(
double const v[]);
145 static inline void normalise(
double v[]);
156template <
int N,
class R,
class F>
162template <
int N,
class R,
class F>
165 double &energy,
double cutoff,
166 double switchingWidth) {
169 assert(z1 <= cutoff);
170 assert(z1 >= cutoff - switchingWidth);
171 double x = (z1 - cutoff + switchingWidth) / switchingWidth;
172 double S = (2 * x - 3) * x * x + 1;
173 double dS = 6 * x * (x - 1);
174 double const u = energy;
175 for (
int i = 0; i < N; ++i) {
176 for (
int k = 0; k < 3; ++k) {
178 g1.
force_[i][k] * S - u * dS / switchingWidth * z[k] / z1 / N;
180 g2.
force_[i][k] * S + u * dS / switchingWidth * z[k] / z1 / N;
193 const double w[],
double e[]) {
194 e[0] = v[1] * w[2] - v[2] * w[1];
195 e[1] = v[2] * w[0] - v[0] * w[2];
196 e[2] = v[0] * w[1] - v[1] * w[0];
218 return v[0] * w[0] + v[1] * w[1] + v[2] * w[2];
245 double const n =
norm(v);
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.
void addForces(ChargeGroup< N, R, F > const &g1, ChargeGroup< N, R, F > &g2)
Increment forces.
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 norm(double const v[])
Norm of 3D vector.
static void divide(double v[], double const divisor)
Divide vector.
static double dotProduct(double const v[], double const w[])
Dot product.
static void multiply(double v[], double const factor)
Multiply vector.
static double * crossProduct(const double v[], const double w[], double e[])
Cross product.
static void normalise(double v[])
Normalise 3D vector .
double const *const centre_
double _2
Vector's norm square.