Loading...
Searching...
No Matches
forcefields::Tip4p Class Reference

TIP4P forcefield with fexible molecules and group based cutoff. More...

#include <tip4p_ccl.hpp>

Inheritance diagram for forcefields::Tip4p:

Public Member Functions

 Tip4p ()
 Tip4p (double cutoff, double switchingWidth)
 ~Tip4p ()
void computeHH_O_ (const int nAtoms, const double R[], double F[], double &U, const double b[])
 Compute the forces and the energy.
void computeHH_O_ (const int nAtoms, const double R[], double F[], double &U, const double b[], const bool fixed[])
 Compute the forces and the energy (with fixed atom optimisation).
Public Member Functions inherited from forcefields::Ccl
 Ccl ()
void computeHH_O_ (const int nAtoms, const double R[], double F[], double &U, const double b[])
 Compute the forces and the energy.
void computeHH_O_ (const int nAtoms, const double R[], double F[], double &U, const double b[], const bool fixed[])
 Compute the forces and the energy (with fixed atom optimisation).
char const * getName () const
 Name of the potential.
Public Member Functions inherited from forcefields::PotentialBase
 PotentialBase ()
 Non bond interaction cutoff.
 PotentialBase (double cutoff, double switchingWidth)
virtual ~PotentialBase ()
double getCutoff () const
void setCutoff (double cutoff)
double getSwitchingWidth () const
 Width of the switching zone.
void setSwitchingWidth (double width)

Static Public Member Functions

static char const * getName ()
 Name of the potential.
static double applyPeriodicity0 (double r, double const period)
 Minimum image representation.
static void applyPeriodicity0 (double r[], double const periods[])
 Minimum image representation.

Private Member Functions

template<int H, int O>
void computeTemplate (const int nMolecules, const double(*const rh1)[H *3], const double(*const rh2)[H *3], const double(*const ro)[O *3], double(*const fh1)[H *3], double(*const fh2)[H *3], double(*const fo)[O *3], double &energy, double const b[], bool const (*const xh1)[H]=0, bool const (*const xh2)[H]=0, bool const (*const xo)[O]=0)
 Compute forces and energy.
void coulombWithCutoff (Water &w1, Water &w2, double &U)
 Interactions between two molecules.
void coulombFull (Water &w1, Water &w2, double &U)
 Interactions between two molecules.
void lennardJonesWithCutoff (Water &w1, Water &w2, double &U)
 Interactions between two molecules.

Additional Inherited Members

Protected Member Functions inherited from forcefields::Ccl
 Ccl (double cutoff, double switchingWidth)
 Constructor with cutoff for derived classes.
void intramolecular (double const rh1[], double const rh2[], double const ro[], double fh1[], double fh2[], double fo[], double &energy)
 Interactions inside one molecules.
void initialiseRho (Vector3 const &v, Rho &r)
 Initialise Rho.
void initialiseDtheta (Vector3 const &v1, Vector3 const &v2, Dtheta &dth, double const thetaEquilibrium)
 Initialise Dtheta.
void intramolecular (Rho const &ro1, Rho const &ro2, Dtheta const &dth, double &energy, double fh1[], double fh2[], double fo[])
 Compute intramolecular energy and forces.
Protected Member Functions inherited from forcefields::PotentialBase
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.
void calculateCentre (double const r1[], double const r2[], double rc[])
 Calculate centre of two points.
void calculateCentre (double const r1[], double const r2[], double const r3[], double rc[])
 Calculate centre of three points.
void calculateWeightedCentre (double const w1, double const w2, double const w3, double const r1[], double const r2[], double const r3[], double rc[])
 Calculate barycentre.
void coulombWithCutoff (const double r1[], const double r2[], double f1[], double f2[], double &u, double const qq)
 Coulomb interaction with single charge based 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 coulomb (double distance, double &force, double &energy, double const qq)
 Compute Coulomb interaction between two charges.
void spreadForce (double f1[], double f2[], double const fc[])
 Spread force on centre to other points.
void spreadForce (double f1[], double f2[], double f3[], double const fc[])
 Spread force on centre to other points.
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.
template<int N, class R, class F>
void addForces (ChargeGroup< N, R, F > const &g1, ChargeGroup< N, R, F > &g2)
 Increment forces.
template<int N, class R, class F>
void switching (ChargeGroup< N, R, F > &g1, ChargeGroup< N, R, F > &g2, double &energy, double cutoff, double switchingWidth)
void computePt (int const nAtoms, double positions[], double forces[], double &energy, double const periods[], bool const fixed[])
 Potential for Platinum.
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 lennardJones (double const distance, double &force, double &energy, double const epsilon, double const sigma)
 Lennard-Jones 12-6 between two atoms.
void lennardJones (const double R1[], const double R2[], double F1[], double F2[], double &E, double const epsilon, double const sigma)
 Lennard-Jones 12-6 between two atoms.
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 switching (double const distance, double &force, double &energy)
 Smooth cutoff switch off.
void switching (double const r1[], double const r2[], double f1[], double f2[], double &energy)
 Smooth cutoff switch off.
double applyPeriodicity1 (double r, int const axis)
 Minimum image representation.
void applyPeriodicity1 (double r[])
 Minimum image representation.
void distance (const double x[], const double y[], double z[], double &z1, double &z2)
 Distance vector, norm and norm square.
void distance (const double x[], const double y[], double z[], double &z1)
 Distance.
void distance (const double x[], const double y[], double z[])
 Distance vector, norm.
void distance (const double x[], const double y[], double &z1)
 Distance.
void distance (const double x[], const double y[], Vector3 &z)
 Distance vector, norm and norm square.
void setPeriodicity (const double periods[])
 Set periodicity.
double unBreak1 (double const r, double const ref, int const axis)
 Undo the separation of two atoms created by the periodic boundaries.
void unBreak1 (double r[], double const ref[])
 Undo the separation of two atoms created by the periodic boundaries.
Static Protected Member Functions inherited from forcefields::PotentialBase
static void divide (double v[], double const divisor)
 Divide vector.
static double * crossProduct (const double v[], const double w[], double e[])
 Cross product.
static double dotProduct (double const v[], double const w[])
 Dot product.
static void multiply (double v[], double const factor)
 Multiply vector.
static double norm (double const v[])
 Norm of 3D vector.
static void normalise (double v[])
 Normalise 3D vector \( \frac{\mathbf v}{ |\mathbf v|} \).
static double isoscelesBase (double length, double angle)
 Calculate the base of an isosceles triangle.
static double epsilon (double const A, double const B)
 Conversion for Lennard-Jones.
static double sigma (double const A, double const B)
 Conversion for Lennard-Jones.
static double smithKongEpsilon (double sigma1, double epsilon1, double sigma2, double epsilon2)
 Smith and Kong combination rules.
static double smithKongSigma (double sigma1, double epsilon1, double sigma2, double epsilon2)
 Smith and Kong combination rules.
static double unBreak0 (double const r, double const ref, double const period)
 Undo the separation of two atoms created by the periodic boundaries.
static void unBreak0 (double r[], double const ref[], double const periods[])
 Undo the separation of two atoms created by the periodic boundaries.
Protected Attributes inherited from forcefields::PotentialBase
double cutoff_
double periods_ [3]
double switchingWidth_
Static Protected Attributes inherited from forcefields::Ccl
static double const re_ = ::re_
 Distance OH at equilibrium.
static double const thetae_ = ::thetae_
 Distance OH at equilibrium.
static const double ONE_OVER_4_PI_EPSILON0
static const double EPSILON_PT = 0.68165797577788501
 Platinum Lennard-Jones.
static const double SIGMA_PT = 2.54

Detailed Description

TIP4P forcefield with fexible molecules and group based cutoff.

The function computing the forces and energy is compute(). Parameters for the forcefield were taken from Abascal et al.. The parameters are those of TIP4P (original version). TIP4P is a potential for constrained molecules of water. In this implementation quadratic restraints were added to bonds OH and HH inside molecules of water. So the potential can be used without constraints. The potential has a cutoff for long range interaction. The cutoff can be changed by setCutoff(). There is also and switching zone at the edge of the cutoff to cut off the interactions smoothly. The width of this switching zone is controlled by setSwitchingWidth().
The unit system for this potential is eV (electron volt), Angstrom, e (e charge).

References

A general purpose model for the condensed phases of water: TIP4P/2005, J.L.F. Abascal and C. Vega, J. Chem. Phys. (2005) vol. 123, p. 234505.

Definition at line 23 of file tip4p_ccl.hpp.

Constructor & Destructor Documentation

◆ Tip4p() [1/2]

Tip4p::Tip4p ( )

Definition at line 67 of file tip4p_ccl.cpp.

68 : Ccl() {}

◆ Tip4p() [2/2]

Tip4p::Tip4p ( double cutoff,
double switchingWidth )

Definition at line 70 of file tip4p_ccl.cpp.

71 : Ccl(cutoff, switchingWidth) {}

◆ ~Tip4p()

forcefields::Tip4p::~Tip4p ( )
inline

Definition at line 27 of file tip4p_ccl.hpp.

27{}

Member Function Documentation

◆ computeHH_O_() [1/2]

void Tip4p::computeHH_O_ ( const int nAtoms,
const double R[],
double F[],
double & U,
const double b[] )

Compute the forces and the energy.

The order of the atoms is very important. For this function the order is H1, H1, H2, H2, etc ... , O1, O2, etc ... The numbers are for the molecules. The suffix HH_O_ is to reminds the ordering of the atoms. It indicates the position of the atoms of the first molecule, while the underscore marks the locations of other atoms.

Parameters
[in]nAtomsNumber of Atoms.
[in]Rcoordinates.
[out]FForces.
[out]UPotential energy.
[in]bPeriodic boundaries.
Warning
Be careful with the order of the atoms.

Definition at line 85 of file tip4p_ccl.cpp.

86 {
87 computeHH_O_(nAtoms, R, F, U, b, 0);
88}
void computeHH_O_(const int nAtoms, const double R[], double F[], double &U, const double b[])
Compute the forces and the energy.
Definition tip4p_ccl.cpp:85

◆ computeHH_O_() [2/2]

void Tip4p::computeHH_O_ ( const int nAtoms,
const double R[],
double F[],
double & U,
const double b[],
const bool fixed[] )

Compute the forces and the energy (with fixed atom optimisation).

In a simulation, some atoms may be fixed (not allowed to move). Computing the interaction between two fixed atoms is useless. When the potential knows which atoms are fixed, it can avoid these useless computations.

Parameters
[in]nAtomsNumber of Atoms.
[in]Rcoordinates.
[out]FForces.
[out]UPotential energy.
[in]bPeriodic boundaries.
[in]fixedThe length of the array must be equal to nAtoms in compute(). True when atom is fixed, false otherwise.
See also
Check compute() for the order of the atoms.

Definition at line 103 of file tip4p_ccl.cpp.

104 {
105 int const nMolecules = nAtoms / 3;
106 const double (*const rh1)[6] = reinterpret_cast<const double (*)[6]>(R);
107 const double (*const rh2)[6] = reinterpret_cast<const double (*)[6]>(&R[3]);
108 const double (*const ro)[3] =
109 reinterpret_cast<const double (*)[3]>(&R[nMolecules * 6]);
110 double (*const fh1)[6] = reinterpret_cast<double (*)[6]>(F);
111 double (*const fh2)[6] = reinterpret_cast<double (*)[6]>(&F[3]);
112 double (*const fo)[3] = reinterpret_cast<double (*)[3]>(&F[nMolecules * 6]);
113 bool const(*const xh1)[2] = reinterpret_cast<bool const(*)[2]>(fixed);
114 bool const(*const xh2)[2] = reinterpret_cast<bool const(*)[2]>(&fixed[1]);
115 bool const(*const xo)[1] =
116 reinterpret_cast<bool const(*)[1]>(&fixed[nMolecules * 2]);
117 computeTemplate(nMolecules, rh1, rh2, ro, fh1, fh2, fo, U, b, xh1, xh2, xo);
118}
void computeTemplate(const int nMolecules, const double(*const rh1)[H *3], const double(*const rh2)[H *3], const double(*const ro)[O *3], double(*const fh1)[H *3], double(*const fh2)[H *3], double(*const fo)[O *3], double &energy, double const b[], bool const (*const xh1)[H]=0, bool const (*const xh2)[H]=0, bool const (*const xo)[O]=0)
Compute forces and energy.

◆ computeTemplate()

template<int H, int O>
void Tip4p::computeTemplate ( const int nMolecules,
const double(*) rh1[H *3],
const double(*) rh2[H *3],
const double(*) ro[O *3],
double(*) fh1[H *3],
double(*) fh2[H *3],
double(*) fo[O *3],
double & energy,
double const b[],
bool const (*) xh1[H] = 0,
bool const (*) xh2[H] = 0,
bool const (*) xo[O] = 0 )
private

Compute forces and energy.

The function calculates and returns the energy and forces applied on each atom. The function has preconditions with which the user must comply before calling this function. The periodic boundaries must set with (setPeriodicity()). The content of and arrays fh1 , fh2 , fo must be zero for all elements.
Arrays ending in h1 are for the hydrogen one of the molecules and those ending in h2 for hydrogen 2.

Parameters
[in]nMoleculesNumber of molecules.
[in]rh1, rh2, roPositions of hydrogens and oxygens.
[in,out]fh1, fh2, foForces on hydrogens and oxygens.
[in,out]energyPotential energy.
[in]bPeriodic boundaries.
[in]xh1, xh2, xoTell which atoms are fixed and which are movable. This parameter are optional. When provided, interaction between fixed atoms are skipped. The three arrays xh1, xh2, xo must be provided for the optimisation to work.
Warning
Remember the preconditions.

Definition at line 157 of file tip4p_ccl.cpp.

163 {
164 for (int i = 0; i < nMolecules; ++i) {
165 for (int a = 0; a < 3; a++) {
166 fh1[i][a] = 0.0;
167 fh2[i][a] = 0.0;
168 fo[i][a] = 0.0;
169 };
170 };
171 energy = 0.0;
173 for (int i = nMolecules - 1; i >= 0; --i) {
174 double rc1[3], rn1[3], fn1[3] = {0}; // rn position charge N, rc centre of
175 // charge for groupbased cutoff.
176 calculateWeightedCentre(wo_, wh_, wh_, ro[i], rh1[i], rh2[i], rn1);
177 calculateCentre(rn1, rh1[i], rh2[i], rc1);
178 Water w1 = {rh1[i], rh2[i], ro[i], rn1, rc1, fh1[i], fh2[i], fo[i], fn1};
179 intramolecular(rh1[i], rh2[i], ro[i], fh1[i], fh2[i], fo[i], energy);
180 for (int j = i - 1; j >= 0; --j) {
181 bool areFixed = false;
182 if (xh1 and xh2 and xo) {
183 areFixed = xh1[i][0] and xh2[i][0] and xo[i][0];
184 // check if all the atoms of molecule j are fixed.
185 areFixed &= xh1[j][0] and xh2[j][0] and xo[j][0];
186 };
187 // if both molecules are fixed skip force calculation
188 if (not areFixed) {
189 double rc2[3], rn2[3], fn2[3] = {0};
190 calculateWeightedCentre(wo_, wh_, wh_, ro[j], rh1[j], rh2[j], rn2);
191 calculateCentre(rn2, rh1[j], rh2[j], rc2);
192 Water w2 = {rh1[j], rh2[j], ro[j], rn2, rc2,
193 fh1[j], fh2[j], fo[j], fn2};
194 coulombWithCutoff(w1, w2, energy);
195 spreadWeightedForce(wo_, wh_, wh_, w2.fo_, w2.fh1_, w2.fh2_, w2.fn_);
196 lennardJonesWithCutoff(w1, w2, energy);
197 };
198 };
199 spreadWeightedForce(wo_, wh_, wh_, w1.fo_, w1.fh1_, w1.fh2_, w1.fn_);
200 };
201 assert(not std::isnan(energy) and not std::isinf(energy));
202}
void intramolecular(double const rh1[], double const rh2[], double const ro[], double fh1[], double fh2[], double fo[], double &energy)
Interactions inside one molecules.
Definition ccl.cpp:238
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.
void calculateCentre(double const r1[], double const r2[], double rc[])
Calculate centre of two points.
void setPeriodicity(const double periods[])
Set periodicity.
void calculateWeightedCentre(double const w1, double const w2, double const w3, double const r1[], double const r2[], double const r3[], double rc[])
Calculate barycentre.
void coulombWithCutoff(Water &w1, Water &w2, double &U)
Interactions between two molecules.
void lennardJonesWithCutoff(Water &w1, Water &w2, double &U)
Interactions between two molecules.

◆ coulombFull()

void Tip4p::coulombFull ( Water & w1,
Water & w2,
double & U )
private

Interactions between two molecules.

Coulomb interaction between two molecules. Full interaction (i.e. no cutoff).

Parameters
[in,out]w1Molecule 1.
[in,out]w2Molecule 2.
[in,out]UAdd the potential energy to U.
See also
intermolecularFull() and intermolecularSwitching().
Note
The function add the force on charge N to Water::fn_ but does not spread it to Water::fh1_, etc ...
See also
spreadN().

Definition at line 252 of file tip4p_ccl.cpp.

252 {
253 // Coulomb interactions between hydrogens
254 coulomb(w1.rh1_, w2.rh1_, w1.fh1_, w2.fh1_, U, charge2_);
255 coulomb(w1.rh1_, w2.rh2_, w1.fh1_, w2.fh2_, U, charge2_);
256 coulomb(w1.rh2_, w2.rh1_, w1.fh2_, w2.fh1_, U, charge2_);
257 coulomb(w1.rh2_, w2.rh2_, w1.fh2_, w2.fh2_, U, charge2_);
258 // interactions between H and N.
259 coulomb(w1.rn_, w2.rh1_, w1.fn_, w2.fh1_, U, -2.0 * charge2_);
260 coulomb(w1.rn_, w2.rh2_, w1.fn_, w2.fh2_, U, -2.0 * charge2_);
261 coulomb(w1.rh1_, w2.rn_, w1.fh1_, w2.fn_, U, -2.0 * charge2_);
262 coulomb(w1.rh2_, w2.rn_, w1.fh2_, w2.fn_, U, -2.0 * charge2_);
263 // interactions between N1, N2
264 coulomb(w1.rn_, w2.rn_, w1.fn_, w2.fn_, U, 4.0 * charge2_);
265}
void coulomb(const double r1[], const double r2[], double f1[], double f2[], double &u, double const qq)
Compute Coulomb interaction between two charges.

◆ coulombWithCutoff()

void Tip4p::coulombWithCutoff ( Water & w1,
Water & w2,
double & U )
private

Interactions between two molecules.

Coulomb interaction between two molecules of water with molecules-based cutoff

Parameters
[in,out]w1Molecule 1.
[in,out]w2Molecule 2.
[in,out]UAdd the potential energy to U.

Definition at line 210 of file tip4p_ccl.cpp.

210 {
211 double z[3], z1, z2;
212 distance(w1.rc_, w2.rc_, z, z1, z2);
213 if (z1 <= cutoff_ - switchingWidth_) {
214 coulombFull(w1, w2, U);
215 } else if (z1 < cutoff_) {
216 double f1[3][3] = {{0}}, f2[3][3] = {{0}};
217 // f1[0], f1[1], 0, f1[2] are respectively, H1, H2, O, N. There is no charge
218 // on O.
219 Water v1 = {w1.rh1_, w1.rh2_, w1.ro_, w1.rn_, w1.rc_,
220 f1[0], f1[1], 0, f1[2]};
221 Water v2 = {w2.rh1_, w2.rh2_, w2.ro_, w2.rn_, w2.rc_,
222 f2[0], f2[1], 0, f2[2]};
223 double energy = 0.0;
224 coulombFull(v1, v2, energy);
225 ChargeGroup<3> g1 = {v1.rc_, 0, f1};
226 ChargeGroup<3> g2 = {v2.rc_, 0, f2};
227 // Calculate the weakened forces and energy.
228 switching(g1, g2, energy, cutoff_, switchingWidth_);
229 // add weakened force and energy to those of other interactions.
230 U += energy;
231 for (int i = 0; i < 3; ++i) {
232 w1.fh1_[i] += v1.fh1_[i];
233 w1.fh2_[i] += v1.fh2_[i];
234 w1.fn_[i] += v1.fn_[i];
235 w2.fh1_[i] += v2.fh1_[i];
236 w2.fh2_[i] += v2.fh2_[i];
237 w2.fn_[i] += v2.fn_[i];
238 };
239 }
240}
void switching(ChargeGroup< N, R, F > &g1, ChargeGroup< N, R, F > &g2, double &energy, double cutoff, double switchingWidth)
void distance(const double x[], const double y[], double z[], double &z1, double &z2)
Distance vector, norm and norm square.
void coulombFull(Water &w1, Water &w2, double &U)
Interactions between two molecules.

◆ getName()

char const * Tip4p::getName ( )
static

Name of the potential.

Definition at line 121 of file tip4p_ccl.cpp.

121{ return "Tip4p"; }

◆ lennardJonesWithCutoff()

void Tip4p::lennardJonesWithCutoff ( Water & w1,
Water & w2,
double & U )
private

Interactions between two molecules.

Lennard Jones between oxygen only with cutoff

Parameters
[in,out]w1Molecule of water 1.
[in,out]w2Molecule of water 2.
[in,out]UAdd the potential energy to U.
See also
intermolecularFull() and intermolecularSwitching().

Definition at line 274 of file tip4p_ccl.cpp.

274 {
275 double z[3], z1;
276 distance(w1.ro_, w2.ro_, z, z1);
277 if (z1 <= cutoff_ - switchingWidth_) {
278 lennardJones(w1.ro_, w2.ro_, w1.fo_, w2.fo_, U, epsilon_, sigma_);
279 } else if (z1 < cutoff_) {
280 double f1[3] = {0}, f2[3] = {0};
281 double energy = 0.0;
282 lennardJones(w1.ro_, w2.ro_, f1, f2, energy, epsilon_, sigma_);
283 switching(w1.ro_, w2.ro_, f1, f2, energy);
284 U += energy;
285 for (int i = 0; i < 3; i++) {
286 w1.fo_[i] += f1[i];
287 w2.fo_[i] += f2[i];
288 };
289 };
290}
void lennardJones(double const distance, double &force, double &energy, double const epsilon, double const sigma)
Lennard-Jones 12-6 between two atoms.

The documentation for this class was generated from the following files:
  • /home/runner/work/eOn/eOn/include/eon/potentials/Water/tip4p_ccl.hpp
  • /home/runner/work/eOn/eOn/client/potentials/Water/tip4p_ccl.cpp