std::vector<chemkit::Vector3> OplsTorsionCalculation::gradient() const { const chemkit::ForceFieldAtom *a = atom(0); const chemkit::ForceFieldAtom *b = atom(1); const chemkit::ForceFieldAtom *c = atom(2); const chemkit::ForceFieldAtom *d = atom(3); chemkit::Float v1 = parameter(0); chemkit::Float v2 = parameter(1); chemkit::Float v3 = parameter(2); chemkit::Float phi = torsionAngleRadians(a, b, c, d); // dE/dphi chemkit::Float de_dphi = (1.0/2.0) * (-v1 * sin(phi) + 2.0 * v2 * sin(2.0 * phi) - 3.0 * v3 * sin(3.0 * phi)); std::vector<chemkit::Vector3> gradient = torsionAngleGradientRadians(a, b, c, d); gradient[0] *= de_dphi; gradient[1] *= de_dphi; gradient[2] *= de_dphi; gradient[3] *= de_dphi; return gradient; }
std::vector<chemkit::Vector3> UffTorsionCalculation::gradient() const { const chemkit::ForceFieldAtom *a = atom(0); const chemkit::ForceFieldAtom *b = atom(1); const chemkit::ForceFieldAtom *c = atom(2); const chemkit::ForceFieldAtom *d = atom(3); chemkit::Real V = parameter(0); chemkit::Real n = parameter(1); chemkit::Real phi0 = parameter(2); chemkit::Real phi = torsionAngleRadians(a, b, c, d); // dE/dphi chemkit::Real de_dphi = 0.5 * V * n * cos(n * phi0) * sin(n * phi); std::vector<chemkit::Vector3> gradient = torsionAngleGradientRadians(a, b, c, d); gradient[0] *= de_dphi; gradient[1] *= de_dphi; gradient[2] *= de_dphi; gradient[3] *= de_dphi; return gradient; }
chemkit::Float OplsTorsionCalculation::energy() const { const chemkit::ForceFieldAtom *a = atom(0); const chemkit::ForceFieldAtom *b = atom(1); const chemkit::ForceFieldAtom *c = atom(2); const chemkit::ForceFieldAtom *d = atom(3); chemkit::Float v1 = parameter(0); chemkit::Float v2 = parameter(1); chemkit::Float v3 = parameter(2); chemkit::Float phi = torsionAngleRadians(a, b, c, d); return (1.0/2.0) * (v1 * (1.0 + cos(phi)) + v2 * (1.0 - cos(2.0 * phi)) + v3 * (1.0 + cos(3.0 * phi))); }
chemkit::Real MmffTorsionCalculation::energy() const { const MmffAtom *a = atom(0); const MmffAtom *b = atom(1); const MmffAtom *c = atom(2); const MmffAtom *d = atom(3); chemkit::Real angle = torsionAngleRadians(a, b, c, d); chemkit::Real V1 = parameter(0); chemkit::Real V2 = parameter(1); chemkit::Real V3 = parameter(2); // equation 7 return 0.5 * (V1 * (1.0 + cos(angle)) + V2 * (1.0 - cos(2.0 * angle)) + V3 * (1.0 + cos(3.0 * angle))); }
chemkit::Real UffTorsionCalculation::energy() const { const chemkit::ForceFieldAtom *a = atom(0); const chemkit::ForceFieldAtom *b = atom(1); const chemkit::ForceFieldAtom *c = atom(2); const chemkit::ForceFieldAtom *d = atom(3); chemkit::Real V = parameter(0); chemkit::Real n = parameter(1); chemkit::Real phi0 = parameter(2); chemkit::Real phi = torsionAngleRadians(a, b, c, d); return 0.5 * V * (1 - cos(n * phi0) * cos(n * phi)); }
std::vector<chemkit::Vector3> MmffTorsionCalculation::gradient() const { const MmffAtom *a = atom(0); const MmffAtom *b = atom(1); const MmffAtom *c = atom(2); const MmffAtom *d = atom(3); chemkit::Real phi = torsionAngleRadians(a, b, c, d); chemkit::Real V1 = parameter(0); chemkit::Real V2 = parameter(1); chemkit::Real V3 = parameter(2); // dE/dphi chemkit::Real de_dphi = 0.5 * (-V1 * sin(phi) + 2 * V2 * sin(2 * phi) - 3 * V3 * sin(3 * phi)); std::vector<chemkit::Vector3> gradient = torsionAngleGradientRadians(a, b, c, d); gradient[0] *= de_dphi; gradient[1] *= de_dphi; gradient[2] *= de_dphi; gradient[3] *= de_dphi; return gradient; }