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; }
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; }