#!/usr/bin/env python
"""
Lammps potentital types.
"""
[docs]class BondPotential(object):
"""
Class to hold bond styles that are implemented in lammps
Purpose is to store info that the user wants to use to overwrite standard UFF output of lammps_interface
"""
[docs] class Class2(object):
"""Potential defined as
E = K2*(r-R0)^2 + K3*(r-R0)^3 + K4*(r-R0)^4
Input parameters: R0, K2, K3, K4.
"""
[docs] def __init__(self):
self.name = "class2"
self.R0 = 0.
self.K2 = 0.
self.K3 = 0.
self.K4 = 0.
self.reduced = False
[docs] def __str__(self):
if self.reduced:
return "%15.6f %15.6f %15.6f %15.6f"%(self.R0, self.K2, self.K3,self.K4)
return "%28s %15.6f %15.6f %15.6f %15.6f"%(self.name, self.R0, self.K2, self.K3, self.K4)
[docs] class Fene(object):
"""Potential defined as
E = -0.5*K*R0^2 * ln[1-(r/R0)^2] + 4*eps*[(sig/r)^12 - (sig/r)^6] + eps
Input parameters: K, R0, eps, sig
"""
[docs] def __init__(self):
self.name = "fene" # NB: fene/omp and fene/kk exist
self.K = 0.
self.R0 = 0.
self.eps = 0.
self.sig = 0.
[docs] def __str__(self):
return ""
[docs] class FeneExpand(object):
"""Potential defined as
E = -0.5*K*R0^2 * ln[1-(r-delta/R0)^2] +
4*eps*[(sig/r-delta)^12 - (sig/r-delta)^6] + eps
Input parameters: K, R0, eps, sig, delta
"""
[docs] def __init__(self):
self.name = "fene/expand" # NB: fene/expand/omp exists
self.K = 0.
self.R0 = 0.
self.eps = 0.
self.sig = 0.
self.delta = 0.
[docs] def __str__(self):
return ""
[docs] class Harmonic(object):
"""Potential defined as
E = K*(r - R0)^2
Input parameters: K, R0
special_flag is used to distinguish
any extra inputs required for LAMMPS
to run properly.
eg. special_flag="shake"
will flag this bond potential as
a shake bond.
"""
[docs] def __init__(self):
self.name = "harmonic" # harmonic/kk and harmonic/omp exist
self.K = 0.
self.R0 = 0.
self.reduced = False
self.special_flag = ""
[docs] def __str__(self):
special_flag = self.special_flag
if special_flag:
special_flag = "# "+self.special_flag
if self.reduced:
return "%15.6f %15.6f %s"%(self.K, self.R0, special_flag)
return "%28s %15.6f %15.6f %s"%(self.name, self.K, self.R0, special_flag)
[docs] class Morse(object):
"""Potential defined as
E = D*[1 - e^(-alpha*(r-R0))]^2
Input parameters: D, alpha, R0
"""
[docs] def __init__(self):
self.name = "morse" # morse/omp exists
self.D = 0.
self.alpha = 0.
self.R0 = 0.
self.reduced = False
[docs] def __str__(self):
if self.reduced:
return "%15.6f %15.6f %15.6f"%(self.D, self.alpha, self.R0)
return "%28s %15.6f %15.6f %15.6f"%(self.name, self.D, self.alpha, self.R0)
[docs] class NonLinear(object):
"""Potential defined as
E = eps*(r-R0)^2 / [lamb^2 - (r-R0)^2]
Input parameters: eps, R0, lamb
"""
[docs] def __init__(self):
self.name = "nonlinear" # nonlinear/omp exists
self.eps = 0.
self.R0 = 0.
self.lamb = 0.
[docs] def __str__(self):
return ""
[docs] class Quartic(object):
"""Potential defined as
E = K*(r-Rc)^2 * (r - Rc - B1) * (r - Rc - B2) + U0 +
4*eps*[(sig/r)^12 - (sig/r)^6] + eps
Input parameters: K, B1, B2, Rc, U0
"""
[docs] def __init__(self):
self.name = "quartic" # quartic/omp exists
self.K = 0.
self.B1 = 0.
self.B2 = 0.
self.Rc = 0.
self.U0 = 0.
[docs] def __str__(self):
return ""
[docs] class Table(object):
"""Potential read from file."""
[docs] def __init__(self):
raise NotImplementedError ("Have not implemented the table funtion for lammps yet.")
[docs] class HarmonicShift(object):
"""Potential defined as
E = Umin/(R0 - Rc)^2 * [(r-R0)^2 - (Rc - R0)^2]
Input parameters: Umin, R0, Rc
"""
[docs] def __init__(self):
self.name = "harmonic/shift" # harmonic/shift/omp exists
self.Umin = 0.
self.R0 = 0.
self.Rc = 0.
[docs] def __str__(self):
return ""
[docs] class HarmonicShiftCut(object):
"""Potential defined as
E = Umin/(R0 - Rc)^2 * [(r-R0)^2 - (Rc - R0)^2]
Input parameters: Umin, R0, Rc
"""
[docs] def __init__(self):
self.name = "harmonic/shift/cut" # harmonic/shift/cut/omp exists
self.Umin = 0.
self.R0 = 0.
self.Rc = 0.
[docs] def __str__(self):
return ""
[docs]class AnglePotential(object):
"""
Class to hold angle styles that are implemented in lammps
"""
[docs] class Charmm(object):
"""Potential defined as
E = K*(theta - theta0)^2 + Kub*(r - Rub)^2
Input parameters: K, theta0, Kub, Rub
"""
[docs] def __init__(self):
self.name = "charmm" # charmm/kk and charmm/omp exist
self.K = 0.
self.theta0 = 0.
self.Kub = 0.
self.Rub = 0.
[docs] def __str__(self):
return ""
[docs] class Class2(object):
"""Potential defined as
E = Ea + Ebb + Eba
Ea = K2*(theta - theta0)^2 + K3*(theta - theta0)^3 + K4*(theta - theta0)^4
Ebb = M*(r_ij - r1)*(r_jk - r2)
Eba = N1*(r_ij - r1)*(theta - theta0) + N2*(rjk - r2)*(theta - theta0)
Input parameters for each potential:
Angle: theta0 (degrees), K2(energy/rad^2), K3(energy/rad^3),K4(energy/rad^4)
BondBond: bb, M(energy/distance^2), r1(distance), r2(distance)
BondAngle: ba, N1(energy/distance^2), N2(energy/distance^2),r1(distance), r2(distance)
"""
# Ebb and Eba are in BondBond and BondAngle classes respectively
[docs] class BondBond(object):
"""Potential defined as
----> Ebb = M*(r_ij - r1)*(r_jk - r2) <----
"""
[docs] def __init__(self):
self.name = "class2"
self.M = 0.
self.r1 = 0.
self.r2 = 0.
self.reduced = False
[docs] def __str__(self):
if self.reduced:
return "%15.6f %15.6f %15.6f"%(self.M,
self.r1,
self.r2)
return "%s %15.6f %15.6f %15.6f"%(self.name,
self.M,
self.r1,
self.r2)
[docs] class BondAngle(object):
"""Potential defined as
----> Eba = N1*(r_ij - r1)*(theta - theta0) + N2*(r_jk - r2)*(theta - theta0) <----
"""
[docs] def __init__(self):
self.name = "class2"
self.N1 = 0.
self.N2 = 0.
self.r1 = 0.
self.r2 = 0.
self.reduced = False
[docs] def __str__(self):
if self.reduced:
return "%15.6f %15.6f %15.6f %15.6f"%(self.N1,
self.N2,
self.r1,
self.r2)
return "%s %15.6f %15.6f %15.6f %15.6f"%(self.name,
self.N1,
self.N2,
self.r1,
self.r2)
[docs] def __init__(self):
self.name = "class2"
self.theta0 = 0.
self.K2 = 0.
self.K3 = 0.
self.K4 = 0.
self.bb = self.BondBond()
self.ba = self.BondAngle()
self.reduced=False
[docs] def __str__(self):
if self.reduced:
return "%15.6f %15.6f %15.6f %15.6f"%(self.theta0,
self.K2,
self.K3,
self.K4)
return "%28s %15.6f %15.6f %15.6f %15.6f"%(self.name,
self.theta0,
self.K2,
self.K3,
self.K4)
[docs] class Cosine(object):
"""Potential defined as
E = K*[1 - cos(theta)]
Input parameters: K
"""
[docs] def __init__(self):
self.name = "cosine" # cosine/omp exists
self.K = 0.
self.reduced = False
[docs] def __str__(self):
if self.reduced:
return "%15.6f"%(self.K)
return "%28s %15.6f"%(self.name,
self.K)
[docs] class CosineDelta(object):
"""Potential defined as
E = K*[1 - cos(theta-theta0)]
Input parameters: K, theta0
"""
[docs] def __init__(self):
self.name = "cosine/delta" # cosine/delta/omp exists
self.K = 0.
self.theta0 = 0.
[docs] def __str__(self):
return ""
[docs] class CosinePeriodic(object):
"""Potential defined as
E = C*[1 - B*(-1)^n*cos(n*theta)]
Input parameters: C, B, n
"""
[docs] def __init__(self):
self.name = "cosine/periodic" # cosine/periodic/omp exists
self.C = 0.
self.B = 0
self.n = 0
self.reduced = False
[docs] def __str__(self):
if self.reduced:
return "%15.6f %15i %15i"%(self.C,
self.B,
self.n)
return "%28s %15.6f %15i %15i"%(self.name,
self.C,
self.B,
self.n)
[docs] class CosineSquared(object):
"""Potential defined as
E = K*[cos(theta) - cos(theta0)]^2
Input parameters: K, theta0
"""
[docs] def __init__(self):
self.name = "cosine/squared" # cosine/squared/omp exists
self.K = 0.
self.theta0 = 0.
self.reduced = False
[docs] def __str__(self):
if self.reduced:
return "%15.6f %15.6f"%(self.K,
self.theta0)
return "%28s %15.6f %15.6f"%(self.name,
self.K,
self.theta0)
[docs] class Harmonic(object):
"""Potential defined as
E = K*(theta - theta0)^2
Input parameters: K, theta0
special_flag is used to distinguish
any extra inputs required for LAMMPS
to run properly.
eg. special_flag="shake"
will flag this angle potential as
a shake angle.
"""
[docs] def __init__(self):
self.name = "harmonic" # harmonic/kk and harmonic/omp exist
self.K = 0.
self.theta0 = 0.
self.reduced = False
self.special_flag = ""
[docs] def __str__(self):
special_flag = self.special_flag
if special_flag:
special_flag = "# "+self.special_flag
if self.reduced:
return "%15.6f %15.6f %s"%(self.K, self.theta0, special_flag)
return "%28s %15.6f %15.6f %s"%(self.name, self.K,self.theta0, special_flag)
[docs] class Table(object):
[docs] def __init__(self):
raise NotImplementedError ("Have not implemented the table funtion for lammps yet.")
[docs] class CosineShift(object):
"""Potential defined as
E = -Umin/2 * [1 + cos(theta - theta0)]
Input parameters: Umin, theta0
"""
[docs] def __init__(self):
self.name = "cosine/shift" # cosine/shift/omp exists
self.Umin = 0.
self.theta0 = 0.
[docs] def __str__(self):
return ""
[docs] class CosineShiftExp(object):
"""Potential defined as
E = -Umin * [e^{-a*U(theta,theta0)} - 1] / [e^a - 1]
where U(theta,theta0) = -0.5*(1 + cos(theta - theta0))
Input parameters: Umin, theta0, a
"""
[docs] def __init__(self):
self.name = "cosine/shift/exp" # cosine/shift/exp/omp exists
self.Umin = 0.
self.theta0 = 0.
self.a = 0.
[docs] def __str__(self):
return ""
[docs] class Dipole(object):
"""Potential defined as
E = K*(cos(gamma) - cos(gamma0))^2
Input parameters: K, gamma0
"""
[docs] def __init__(self):
self.name = "dipole" # dipole/omp exists
self.K = 0.
self.gamma0 = 0.
[docs] def __str__(self):
return ""
[docs] class Fourier(object):
"""Potential defined as
E = K*[C0 + C1*cos(theta) + C2*cos(2*theta)]
Input parameters: K, C0, C1, C2
"""
[docs] def __init__(self):
self.name = "fourier" # fourier/omp exists
self.K = 0.
self.C0 = 0.
self.C1 = 0.
self.C2 = 0.
self.reduced = False
[docs] def __str__(self):
if self.reduced:
return "%15.6f %15.6f %15.6f %15.6f"%(self.K,
self.C0,
self.C1,
self.C2)
return "%28s %15.6f %15.6f %15.6f %15.6f"%(self.name, self.K,
self.C0, self.C1, self.C2)
[docs] class FourierSimple(object):
"""Potential defined as
E = K*[1 + c*cos(n*theta)]
Input parameters: K, c, n
"""
[docs] def __init__(self):
self.name = "fourier/simple" # fourier/simple/omp exists
self.K = 0.
self.c = 0.
self.n = 0.
self.reduced = False
[docs] def __str__(self):
if self.reduced:
return "%15.6f %15.6f %15.6f"%(self.K,
self.c,
self.n)
return "%28s %15.6f %15.6f %15.6f"%(self.name, self.K,
self.c, self.n)
[docs] class Quartic(object):
"""Potential defined as
E = K2*(theta - theta0)^2 + K3*(theta - theta0)^3 + K4(theta - theta0)^4
Input parameters: theta0, K2, K3, K4
"""
[docs] def __init__(self):
self.name = "quartic" # quartic/omp exists
self.theta0 = 0.
self.K2 = 0.
self.K3 = 0.
self.K4 = 0.
[docs] def __str__(self):
return ""
[docs] class Sdk(object):
"""Potential defined as
E = K*(theta - theta0)^2
Input parameters: K, theta0
"""
[docs] def __init__(self):
self.name = "sdk"
self.K = 0.
self.theta0 = 0.
[docs] def __str__(self):
return ""
[docs]class DihedralPotential(object):
"""
Class to hold dihedral styles that are implemented in lammps
"""
[docs] class Charmm(object):
"""Potential defined as
E = K*[1 + cos(n*phi - d)]
Input parameters: K, n, d, w (weighting for 1 - 4 non-bonded interactions)
"""
[docs] def __init__(self):
self.name = "charmm" # charm/kk and charmm/omp exist
self.K = 0.
self.n = 0
self.d = 0
self.w = 0. # should be kept at 0 for charmm force fields
self.reduced = False
[docs] def __str__(self):
if self.reduced:
return "%15.6f %15i %15i %15.6f"%(self.K, self.n, self.d, self.w)
return "%28s %15.6f %15i %15i %15.6f"%(self.name, self.K, self.n, self.d, self.w)
[docs] class Class2(object):
"""
Potential deined as
E = Ed + Embt + Eebt + Eat + Eaat + Ebb13
Ed = K1*[1 - cos(phi - phi1)] + K2*[1 - cos(2*phi - phi2)] + K3*[1 - cos(3*phi - phi3)]
Embt = (r_jk - r2)*[A1*cos(phi) + A2*cos(2phi) + A3*cos(3phi)]
Eebt = (r_ij - r1)*[B1*cos(phi) + B2*cos(2phi) + B3*cos(3phi)] + (r_kl - r3)*[C1*cos(phi) + C2*cos(2phi) + C3*cos(3phi)]
Eat = (theta_ijk - theta1)*[D1*cos(phi) + D2*cos(2*phi) + D3*cos(3*phi)] + (theta_jkl - theta2)*[E1*cos(phi) + E2*cos(2*phi) + E3*cos(3phi)]
Eaa = M*(theta_ijk - theta1)*(theta_jkl - theta2)*cos(phi)
Ebb13 = N*(r_ij-r1)*(r_kl-r3)
"""
[docs] class MiddleBondTorsion(object):
"""
Embt = (r_jk - r2)*[A1*cos(phi) + A2*cos(2phi) + A3*cos(3phi)]
"""
[docs] def __init__(self):
self.name = "mbt"
self.A1 = 0.
self.A2 = 0.
self.A3 = 0.
self.r2 = 0.
self.reduced=False
[docs] def __str__(self):
if self.reduced:
return "%15.6f %15.6f %15.6f %15.6f"%(self.A1, self.A2, self.A3, self.r2)
return "%s %15.6f %15.6f %15.6f %15.6f"%(self.name, self.A1, self.A2, self.A3, self.r2)
[docs] class EndBondTorsion(object):
"""
Eebt = (r_ij - r1)*[B1*cos(phi) + B2*cos(2phi) + B3*cos(3phi)] + (r_kl - r3)*[C1*cos(phi) + C2*cos(2phi) + C3*cos(3phi)]
"""
[docs] def __init__(self):
self.name = "ebt"
self.B1 = 0.
self.B2 = 0.
self.B3 = 0.
self.C1 = 0.
self.C2 = 0.
self.C3 = 0.
self.r1 = 0.
self.r3 = 0.
self.reduced=False
[docs] def __str__(self):
if self.reduced:
return "%15.6f %15.6f %15.6f %15.6f %15.6f %15.6f %15.6f %15.6f"%(self.B1,
self.B2,
self.B3,
self.C1,
self.C2,
self.C3,
self.r1,
self.r3)
return "%s %15.6f %15.6f %15.6f %15.6f %15.6f %15.6f %15.6f %15.6f"%(self.name,
self.B1,
self.B2,
self.B3,
self.C1,
self.C2,
self.C3,
self.r1,
self.r3)
[docs] class AngleTorsion(object):
"""
Eat = (theta_ijk - theta1)*[D1*cos(phi) + D2*cos(2*phi) + D3*cos(3*phi)] + (theta_jkl - theta2)*[E1*cos(phi) + E2*cos(2*phi) + E3*cos(3phi)]
"""
[docs] def __init__(self):
self.name = "at"
self.D1 = 0.
self.D2 = 0.
self.D3 = 0.
self.E1 = 0.
self.E2 = 0.
self.E3 = 0.
self.theta1 = 0.
self.theta2 = 0.
self.reduced=False
[docs] def __str__(self):
if self.reduced:
return "%15.6f %15.6f %15.6f %15.6f %15.6f %15.6f %15.6f %15.6f"%(self.D1,
self.D2,
self.D3,
self.E1,
self.E2,
self.E3,
self.theta1,
self.theta2)
return "%s %15.6f %15.6f %15.6f %15.6f %15.6f %15.6f %15.6f %15.6f"%(self.name,
self.D1,
self.D2,
self.D3,
self.E1,
self.E2,
self.E3,
self.theta1,
self.theta2)
[docs] class AngleAngleTorsion(object):
"""
Eaa = M*(theta_ijk - theta1)*(theta_jkl - theta2)*cos(phi)
"""
[docs] def __init__(self):
self.name = "aat"
self.M = 0.
self.theta1 = 0.
self.theta2 = 0.
self.reduced=False
[docs] def __str__(self):
if self.reduced:
return "%15.6f %15.6f %15.6f"%(self.M,
self.theta1,
self.theta2)
return "%s %15.6f %15.6f %15.6f"%(self.name,
self.M,
self.theta1,
self.theta2)
[docs] class BondBond13(object):
"""
Ebb13 = N*(r_ij-r1)*(r_kl-r3)
"""
[docs] def __init__(self):
self.name = "bb13"
self.N = 0.
self.r1 = 0.
self.r3 = 0.
self.reduced=False
[docs] def __str__(self):
if self.reduced:
return "%15.6f %15.6f %15.6f"%(self.N,
self.r1,
self.r3)
return "%s %15.6f %15.6f %15.6f"%(self.name,
self.N,
self.r1,
self.r3)
[docs] def __init__(self):
self.name = "class2"
self.K1 = 0.
self.phi1= 0.
self.K2 = 0.
self.phi2= 0.
self.K3 = 0.
self.phi3= 0.
self.mbt = self.MiddleBondTorsion()
self.ebt = self.EndBondTorsion()
self.at = self.AngleTorsion()
self.aat = self.AngleAngleTorsion()
self.bb13 = self.BondBond13()
self.reduced=False
[docs] def __str__(self):
if self.reduced:
return "%15.6f %15.6f %15.6f %15.6f %15.6f %15.6f"%(self.K1,
self.phi1,
self.K2,
self.phi2,
self.K3,
self.phi3)
return "%s %15.6f %15.6f %15.6f %15.6f %15.6f %15.6f"%(self.name,
self.K1,
self.phi1,
self.K2,
self.phi2,
self.K3,
self.phi3)
[docs] class Harmonic(object):
"""Potential defined as
E = K*[1 + d*cos(n*phi)]
Input parameters: K, d, n
"""
[docs] def __init__(self):
self.name = "harmonic" # harmonic/omp exists
self.K = 0.
self.d = 0
self.n = 0
self.reduced = False
[docs] def __str__(self):
if self.reduced:
return "%15.6f %15i %15i"%(self.K, self.d, self.n)
return "%28s %15.6f %15i %15i"%(self.name, self.K, self.d, self.n)
[docs] class Helix(object):
"""Potential defined as
E = A*[1 - cos(theta)] + B*[1 + cos(3*theta)] + C*[1 + cos(theta + pi/4)]
Input parameters: A, B, C
"""
[docs] def __init__(self):
self.name = "helix" # helix/omp exists
self.A = 0.
self.B = 0.
self.C = 0.
[docs] def __str__(self):
return ""
[docs] class MultiHarmonic(object):
"""Potential defined as
E = sum_n=1,5{ An*cos^(n-1)(theta)}
Input parameters: A1, A2, A3, A4, A5
"""
[docs] def __init__(self):
self.name = "multi/harmonic" # multi/harmonic/omp exists
self.A1 = 0.
self.A2 = 0.
self.A3 = 0.
self.A4 = 0.
self.A5 = 0.
[docs] def __str__(self):
return ""
[docs] class Opls(object):
"""Potential defined as
E = 0.5*K1*[1 + cos(theta)] + 0.5*K2*[1 - cos(2*theta)] +
0.5*K3*[1 + cos(3*theta)] + 0.5*K4*[1 - cos(4*theta)]
Input parameters: K1, K2, K3, K4
"""
[docs] def __init__(self):
self.name = "opls" # opls/kk and opls/omp exist
self.K1 = 0.
self.K2 = 0.
self.K3 = 0.
self.K4 = 0.
[docs] def __str__(self):
return ""
[docs] class CosineShiftExp(object):
"""Potential defined as
E = -Umin*[e^{-a*U(theta,theta0)} - 1] / (e^a -1)
where U(theta, theta0) = -0.5*(1 + cos(theta-theta0))
Input parameters: Umin, theta0, a
"""
[docs] def __init__(self):
self.name = "cosine/shift/exp" # cosine/shift/exp/omp exists
self.Umin = 0.
self.theta0 = 0.
self.a = 0.
[docs] def __str__(self):
return ""
[docs] class Fourier(object):
"""Potential defined as
E = sum_i=1,m { Ki*[1.0 + cos(ni*theta - di)] }
Input parameters: m, Ki, ni, di
NB m is an integer dictating how many terms to sum, there should be 3*m + 1
total parameters.
"""
[docs] def __init__(self):
self.name = "fourier" # fourier/omp exists
self.m = 0
self.Ki = []
self.ni = []
self.di = []
self.reduced = False
[docs] def __str__(self):
self.m=len(self.Ki)
vstr = "%5d"%self.m
for k,n,d in zip(self.Ki,self.ni,self.di):
vstr+="%15.6f %5d %5d"%(k,n,d)
if self.reduced:
return vstr
return "%28s %s"%(self.name,vstr)
[docs] class nHarmonic(object):
"""Potential defined as
E = sum_i=1,n { Ai*cos^{i-1}(theta)
Input parameters: n, Ai
NB n is an integer dictating how many terms to sum, there should be n + 1
total parameters.
"""
[docs] def __init__(self):
self.name = "nharmonic" # nharmonic/omp exists
self.n = 0
self.Ai = []
[docs] def __str__(self):
return ""
[docs] class Quadratic(object):
"""Potential defined as
E = K*(theta - theta0)^2
Input parameters: K, phi0
"""
[docs] def __init__(self):
self.name = "quadratic" # quadratic/omp exists
self.K = 0.
self.phi0 = 0.
self.redueced = False
[docs] def __str__(self):
return ""
[docs] class Table(object):
"""Potential read from file."""
[docs] def __init__(self):
raise NotImplementedError ("Have not implemented the table funtion for lammps yet.")
[docs]class ImproperPotential(object):
"""
Class to hold improper styles that are implemented in lammps
"""
[docs] class Class2(object):
"""Potential defined as
E = Ei + Eaa
Ei = K*[(chi_ijkl + chi_kjli + chi_ljik)/3 - chi0]^2
Eaa = M1*(theta_ijk - theta1)*(theta_kjl - theta3) +
M2*(theta_ijk - theta1)*(theta_ijl - theta2) +
M3*(theta_ijl - theta2)*(theta_kjl - theta3)
Input parameters: K, chi0
"""
[docs] class AngleAngle(object):
"""Potential defined as
Eaa = M1*(theta_ijk - theta1)*(theta_kjl - theta3) +
M2*(theta_ijk - theta1)*(theta_ijl - theta2) +
M3*(theta_ijl - theta2)*(theta_kjl - theta3)
Input parameters: M1 M2 M3 theta1 theta2 theta3
"""
[docs] def __init__(self):
self.name = "class2"
self.M1 = 0.
self.M2 = 0.
self.M3 = 0.
self.theta1 = 0.
self.theta2 = 0.
self.theta3 = 0.
self.reduced=False
[docs] def __str__(self):
if self.reduced:
return "%15.6f %15.6f %15.6f %15.6f %15.6f %15.6f"%(self.M1,
self.M2,
self.M3,
self.theta1,
self.theta2,
self.theta3)
return "%s %15.6f %15.6f %15.6f %15.6f %15.6f %15.6f"%(self.name,
self.M1,
self.M2,
self.M3,
self.theta1,
self.theta2,
self.theta3)
[docs] def __init__(self):
self.name = "class2"
self.K = 0.
self.chi0 = 0.
self.reduced=False
self.aa = self.AngleAngle()
[docs] def __str__(self):
if self.reduced:
return "%15.6f %15.6f"%(self.K,
self.chi0)
return "%s %15.6f %15.6f"%(self.name,
self.K,
self.chi0)
[docs] class Cvff(object):
"""Potential defined as
E = K*[1 + d*cos(n*theta)]
Input parameters: K, d, n
"""
[docs] def __init__(self):
self.name = "cvff" # cvff/omp exists
self.K = 0.
self.d = 0
self.n = 0
self.reduced = False
[docs] def __str__(self):
if self.reduced:
return "%15.6f %15i %15i "%(self.K,
self.d,
self.n)
return "%28s %15.6f %15i %15i"%(self.name,
self.K,
self.d,
self.n)
[docs] class Harmonic(object):
"""Potential defined as
E = K*(chi - chi0)^2
Input parameters: K, chi0
"""
[docs] def __init__(self):
self.name = "harmonic" # harmonic/kk and harmonic/omp exist
self.K = 0.
self.chi0 = 0.
self.reduced=False
[docs] def __str__(self):
if self.reduced:
return "%15.6f %15.6f "%(self.K, self.chi0)
return "%28s %15.6f %15.6f"%(self.name,self.K, self.chi0)
[docs] class Umbrella(object):
"""Potential defined as
E = 0.5*K*[1 + cos(omega0)/sin(omega0)]^2 * [cos(omega) - cos(omega0)] if omega0 .ne. 0 (deg)
E = K*[1 - cos(omega)] if omega0 = 0 (deg)
Input parameters: K, omega0
"""
[docs] def __init__(self):
self.name = "umbrella" # umbrella/omp exists
self.K = 0.
self.omega0 = 0.
self.reduced = True # Is this correct ??
[docs] def __str__(self):
if self.reduced:
return "%15.6f %15.6f "%(self.K,
self.omega0)
return "%28s %15.6f %15.6f"%(self.name,
self.K,
self.omega0)
[docs] class Cossq(object):
"""Potential defined as
E = 0.5*K*cos^2(chi - chi0)
Input parameters: K, chi0
"""
[docs] def __init__(self):
self.name = "cossq" # cossq/omp exists
self.K = 0.
self.chi0 = 0.
[docs] def __str__(self):
return ""
[docs] class Fourier(object):
"""Potential defined as
E = K*[C0 + C1*cos(omega) + C2*cos(2*omega)]
Input parameters: K, C0, C1, C2, a
the parameter a allows all three angles to be taken into account in an
improper dihedral. It is not clear in the lammps manual what to set this
to to turn it off/on, but the usual assumptions are 0/1.
"""
[docs] def __init__(self):
self.name = "fourier" # fourier/omp exists
self.K = 0.
self.C0 = 0.
self.C1 = 0.
self.C2 = 0.
self.a = 0
self.reduced = False
[docs] def __str__(self):
if self.reduced:
return "%15.6f %15.6f %15.6f %15.6f %15i"%(self.K,
self.C0,
self.C1,
self.C2,
self.a)
return "%28s %15.6f %15.6f %15.6f %15.6f %15i"%(self.name,
self.K,
self.C0,
self.C1,
self.C2,
self.a)
[docs] class Ring(object):
"""Potential defined as
E = 1/6*K*(delta_ijl + delta_ijk + delta_kjl)^6
where delta_ijl = cos(theta_ijl) - cos(theta0)
Input parameters: K, theta0
"""
[docs] def __init__(self):
self.name = "ring" # ring/omp exists
self.K = 0.
self.theta0 = 0.
[docs] def __str__(self):
return ""
[docs]class PairPotential(object):
"""
Class to hold Pair styles that are implemented in lammps
NB: list here is HUGE, update as needed..
"""
[docs] class Table(object):
"""A tabulated potential is used
LAMMPS keyword arguments are passes as kwargs
"""
[docs] def __init__(self):
self.name = "table"
self.style = None
self.N = 0
self.keyword = ""
self.filename = ""
self.entry = ""
self.cutoff = 0.0
self.reduced = False
[docs] def __str__(self):
str = ""
if self.reduced:
return "%s %s %.2f"%(self.filename, self.entry, self.cutoff)
return "%28s %s %s %.2f"%(self.name, self.filename, self.entry, self.cutoff)
[docs] def __repr__(self):
return "%s %s %i %s"%(self.name, self.style, self.N, self.keyword)
[docs] class LjCutTip4pLong(object):
"""Potential defined as
E = 4*eps*[(sig/r)^12 - (sig/r)^6] r < rc
and coulombic terms dealt with a kspace solver
TIP4P water implicit charge points are included in
ewald sum.
"""
[docs] def __init__(self):
self.name = "lj/cut/tip4p/long"
self.eps = 0.
self.sig = 0.
self.reduced = False
self.cutoff = 0.
self.otype = 0
self.htype = 0
self.btype = 0
self.atype = 0
self.qdist = 0.
[docs] def __str__(self):
if self.reduced:
return "%15.6f %15.6f"%(self.eps,
self.sig)
return "%28s %15.6f %15.6f"%(self.name,
self.eps,
self.sig)
[docs] def __repr__(self):
return "%s %i %i %i %i %.4f %.3f"%(self.name, self.otype, self.htype, self.btype,
self.atype, self.qdist, self.cutoff)
[docs] class LjCutCoulLong(object):
"""Potential defined as
E = 4*eps*[(sig/r)^12 - (sig/r)^6] r < rc
and coulombic terms dealt with a kspace solver
"""
[docs] def __init__(self):
self.name = "lj/cut/coul/long"
self.eps = 0.
self.sig = 0.
self.reduced = False
self.cutoff = 0.
[docs] def __str__(self):
if self.reduced:
return "%15.6f %15.6f"%(self.eps,
self.sig)
return "%28s %15.6f %15.6f"%(self.name,
self.eps,
self.sig)
[docs] def __repr__(self):
return "%s %.3f"%(self.name, self.cutoff)
[docs] class LjCut(object):
"""Potential defined as
E = 4*eps*[(sig/r)^12 - (sig/r)^6] r < rc
"""
[docs] def __init__(self):
self.name = "lj/cut"
self.eps = 0.
self.sig = 0.
self.reduced = False
self.cutoff = 0.
[docs] def __str__(self):
if self.reduced:
return "%15.6f %15.6f"%(self.eps,
self.sig)
return "%28s %15.6f %15.6f"%(self.name,
self.eps,
self.sig)
[docs] def __repr__(self):
return "%s %.3f"%(self.name, self.cutoff)
[docs] class LjCharmmCoulLong(object):
"""Potential defined as
E = 4*eps*[(sig/r)^12 - (sig/r)^6] r < rc
and coulombic terms dealt with a kspace solver
"""
[docs] def __init__(self):
self.name = "lj/charmm/coul/long"
self.eps = 0.
self.eps14 = 0.
self.sig = 0.
self.sig14 = 0.
self.reduced = False
self.cutoff = 0.
[docs] def __str__(self):
if self.reduced:
return "%15.6f %15.6f %15.6f %15.6f"%(self.eps,
self.sig,
self.eps14,
self.sig14)
return "%28s %15.6f %15.6f %15.6f %15.6f"%(self.name,
self.eps,
self.sig,
self.eps14,
self.sig14)
[docs] def __repr__(self):
# typical to set the inner cutoff difference of about 1 angstrom
return "%s %.3f %.3f"%(self.name, self.cutoff - 1.0, self.cutoff)
[docs] class Buck(object):
"""Potential defined as
E = A*exp{-r/rho} - C/r^{6}
"""
[docs] def __init__(self):
self.name = "buck"
self.sig = 0.0
self.eps = 0.0
self.A = 0.0
self.rho = 0.0
self.C = 0.0
self.reduced = False
self.cutoff = 0.
[docs] def __str__(self):
if self.reduced:
return "%15.6f %15.6f %15.6f"%(self.A,
self.rho,
self.C)
return "%28s %15.6f %15.6f %15.6f"%(self.name,
self.A,
self.rho,
self.C)
[docs] def __repr__(self):
return "%s %.3f"%(self.name, self.cutoff)
[docs] class BuckCoulLong(object):
"""Potential defined as
E = A*exp{-r/rho} - C/r^{6}
"""
[docs] def __init__(self):
self.name = "buck/coul/long"
self.sig = 0.0
self.eps = 0.0
self.A = 0.0
self.rho = 0.0
self.C = 0.0
self.reduced = False
self.cutoff = 0.
[docs] def __str__(self):
if self.reduced:
return "%15.6f %15.6f %15.6f"%(self.A,
self.rho,
self.C)
return "%28s %15.6f %15.6f %15.6f"%(self.name,
self.A,
self.rho,
self.C)
[docs] def __repr__(self):
return "%s %.3f"%(self.name, self.cutoff)
[docs] class HbondDreidingMorse(object):
"""Potential defined as
E = D0*[exp{-2*alpha*(r-R0)} - 2*exp{-alpha*(r-R0)}]*cos^n(theta)
"""
[docs] def __init__(self):
self.name = "hbond/dreiding/morse"
self.htype = 0
self.donor = 'i'
self.D0 = 0.0
self.alpha = 0.0
self.R0 = 0.0
self.n = 0
self.Rin = 0.0
self.Rout = 0.0
self.a_cut = 0.0
self.reduced = False
[docs] def __str__(self):
if self.reduced:
return "%i %s %15.6f %15.6f %15.6f %15i %15.6f %15.6f %15.6f"%(
self.htype,
self.donor,
self.D0,
self.alpha,
self.R0,
self.n,
self.Rin,
self.Rout,
self.a_cut)
return "%28s %i %s %15.6f %15.6f %15.6f %15i %15.6f %15.6f %15.6f"%(
self.name,
self.htype,
self.donor,
self.D0,
self.alpha,
self.R0,
self.n,
self.Rin,
self.Rout,
self.a_cut)
[docs] def __repr__(self):
return "%s %i %.3f %.3f %.3f"%(self.name, self.n, self.Rin,
self.Rout, self.a_cut)