29 #ifndef CDPL_FORCEFIELD_MMFF94GRADIENTFUNCTIONS_HPP
30 #define CDPL_FORCEFIELD_MMFF94GRADIENTFUNCTIONS_HPP
62 template <
typename ValueType,
typename Iter,
typename CoordsArray,
typename GradVector>
75 template <
typename ValueType,
typename CoordsArray,
typename GradVector>
117 template <
typename ValueType,
typename CoordsVec,
typename GradVec>
119 const ValueType& force_const,
const ValueType& ref_length);
133 template <
typename ValueType,
typename Iter,
typename CoordsArray,
typename GradVector>
146 template <
typename ValueType,
typename CoordsArray,
typename GradVector>
199 template <
typename ValueType,
typename CoordsVec,
typename GradVec>
201 GradVec& term_atom1_grad, GradVec& ctr_atom_grad, GradVec& term_atom2_grad,
bool linear,
202 const ValueType& force_const,
const ValueType& ref_angle);
216 template <
typename ValueType,
typename Iter,
typename CoordsArray,
typename GradVector>
229 template <
typename ValueType,
typename CoordsArray,
typename GradVector>
282 template <
typename ValueType,
typename CoordsVec,
typename GradVec>
285 GradVec& ctr_atom_grad, GradVec& term_atom2_grad,
const ValueType& ijk_force_const,
const ValueType& kji_force_const,
286 const ValueType& ref_angle,
const ValueType& ref_length1,
const ValueType& ref_length2);
300 template <
typename ValueType,
typename Iter,
typename CoordsArray,
typename GradVector>
313 template <
typename ValueType,
typename CoordsArray,
typename GradVector>
354 template <
typename ValueType,
typename CoordsVec,
typename GradVec>
356 const CoordsVec& oop_atom_pos, GradVec& term_atom1_grad, GradVec& ctr_atom_grad, GradVec& term_atom2_grad,
357 GradVec& oop_atom_grad,
const ValueType& force_const);
371 template <
typename ValueType,
typename Iter,
typename CoordsArray,
typename GradVector>
384 template <
typename ValueType,
typename CoordsArray,
typename GradVector>
427 template <
typename ValueType,
typename CoordsVec,
typename GradVec>
429 const CoordsVec& term_atom2_pos, GradVec& term_atom1_grad, GradVec& ctr_atom1_grad, GradVec& ctr_atom2_grad,
430 GradVec& term_atom2_grad,
const ValueType& tor_param1,
const ValueType& tor_param2,
const ValueType& tor_param3);
444 template <
typename ValueType,
typename Iter,
typename CoordsArray,
typename GradVector>
457 template <
typename ValueType,
typename CoordsArray,
typename GradVector>
502 template <
typename ValueType,
typename CoordsVec,
typename GradVec>
504 const ValueType& atom1_chg,
const ValueType& atom2_chg,
const ValueType& scale_fact,
505 const ValueType& de_const,
const ValueType& dist_expo);
519 template <
typename ValueType,
typename Iter,
typename CoordsArray,
typename GradVector>
532 template <
typename ValueType,
typename CoordsArray,
typename GradVector>
586 template <
typename ValueType,
typename CoordsVec,
typename GradVec>
588 const ValueType& e_IJ,
const ValueType& r_IJ,
const ValueType& r_IJ_7);
596 template <
typename ValueType,
typename Iter,
typename CoordsArray,
typename GradVector>
599 return Detail::calcInteractionGradient<ValueType>(beg, end, coords, grad,
600 static_cast<ValueType (*)(
const MMFF94BondStretchingInteraction&,
const CoordsArray&, GradVector&)
>(
601 &calcMMFF94BondStretchingGradient<ValueType, CoordsArray, GradVector>));
604 template <
typename ValueType,
typename CoordsArray,
typename GradVector>
607 return calcMMFF94BondStretchingGradient<ValueType>(coords[iaction.getAtom1Index()], coords[iaction.getAtom2Index()], grad[iaction.getAtom1Index()],
608 grad[iaction.getAtom2Index()], iaction.getForceConstant(), iaction.getReferenceLength());
611 template <
typename ValueType,
typename CoordsVec,
typename GradVec>
613 const ValueType& force_const,
const ValueType& ref_length)
615 ValueType dist_atom1_grad[3];
616 ValueType dist_atom2_grad[3];
618 ValueType dr_ij = calcDistanceDerivatives<ValueType>(atom1_pos, atom2_pos, dist_atom1_grad, dist_atom2_grad) - ref_length;
619 ValueType dr_ij_2 = dr_ij * dr_ij;
621 ValueType grad_fact = (ValueType(167.92125 * 4) * dr_ij_2 * dr_ij - ValueType(215.89875 * 2) * dr_ij_2 + ValueType(143.9325) * dr_ij) * force_const;
623 Detail::scaleAddVector(dist_atom1_grad, grad_fact, atom1_grad);
624 Detail::scaleAddVector(dist_atom2_grad, grad_fact, atom2_grad);
626 ValueType e_b = ValueType(143.9325 * 0.5) * force_const * dr_ij_2 * (1 - 2 * dr_ij + 28 * dr_ij_2 / 12);
632 template <
typename ValueType,
typename Iter,
typename CoordsArray,
typename GradVector>
635 return Detail::calcInteractionGradient<ValueType>(beg, end, coords, grad,
636 static_cast<ValueType (*)(
const MMFF94AngleBendingInteraction&,
const CoordsArray&, GradVector&)
>(
637 &calcMMFF94AngleBendingGradient<ValueType, CoordsArray, GradVector>));
640 template <
typename ValueType,
typename CoordsArray,
typename GradVector>
643 return calcMMFF94AngleBendingGradient<ValueType>(coords[iaction.getTerminalAtom1Index()], coords[iaction.getCenterAtomIndex()],
644 coords[iaction.getTerminalAtom2Index()], grad[iaction.getTerminalAtom1Index()],
645 grad[iaction.getCenterAtomIndex()], grad[iaction.getTerminalAtom2Index()], iaction.isLinearAngle(),
646 iaction.getForceConstant(), iaction.getReferenceAngle());
649 template <
typename ValueType,
typename CoordsVec,
typename GradVec>
651 GradVec& term_atom1_grad, GradVec& ctr_atom_grad, GradVec& term_atom2_grad,
bool linear,
652 const ValueType& force_const,
const ValueType& ref_angle)
654 ValueType ac_term1_grad[3];
655 ValueType ac_ctr_grad[3];
656 ValueType ac_term2_grad[3];
658 ValueType a_ijk_cos = calcBondAngleCosDerivatives<ValueType>(term_atom1_pos, ctr_atom_pos, term_atom2_pos, ac_term1_grad, ac_ctr_grad, ac_term2_grad);
659 ValueType grad_fact = ValueType(1);
660 ValueType e_a = ValueType(0);
663 grad_fact = ValueType(143.9325) * force_const;
664 e_a = ValueType(143.9325) * force_const * (1 + a_ijk_cos);
667 ValueType a_ijk_cos_2 = a_ijk_cos * a_ijk_cos;
668 ValueType a_ijk = std::acos(a_ijk_cos);
669 ValueType div = std::sqrt(1 - a_ijk_cos_2);
671 if (div < ValueType(0.0000001))
672 div = ValueType(0.0000001);
674 grad_fact = force_const / div *
675 (a_ijk * (ValueType(86.58992538) * a_ijk - ValueType(143.9313616)) -
676 ref_angle * (ValueType(3.022558594) * a_ijk - ValueType(0.02637679965) * ref_angle - ValueType(2.512076157)));
678 ValueType da_ijk = a_ijk * ValueType(180 / M_PI) - ref_angle;
680 e_a = ValueType(0.043844 * 0.5) * force_const * da_ijk * da_ijk * (1 - ValueType(0.007) * da_ijk);
683 Detail::scaleAddVector(ac_term1_grad, grad_fact, term_atom1_grad);
684 Detail::scaleAddVector(ac_ctr_grad, grad_fact, ctr_atom_grad);
685 Detail::scaleAddVector(ac_term2_grad, grad_fact, term_atom2_grad);
691 template <
typename ValueType,
typename Iter,
typename CoordsArray,
typename GradVector>
694 return Detail::calcInteractionGradient<ValueType>(beg, end, coords, grad,
695 static_cast<ValueType (*)(
const MMFF94StretchBendInteraction&,
const CoordsArray&, GradVector&)
>(
696 &calcMMFF94StretchBendGradient<ValueType, CoordsArray, GradVector>));
699 template <
typename ValueType,
typename CoordsArray,
typename GradVector>
702 return calcMMFF94StretchBendGradient<ValueType>(coords[iaction.getTerminalAtom1Index()], coords[iaction.getCenterAtomIndex()],
703 coords[iaction.getTerminalAtom2Index()], grad[iaction.getTerminalAtom1Index()],
704 grad[iaction.getCenterAtomIndex()], grad[iaction.getTerminalAtom2Index()], iaction.getIJKForceConstant(),
705 iaction.getKJIForceConstant(), iaction.getReferenceAngle(), iaction.getReferenceLength1(),
706 iaction.getReferenceLength2());
709 template <
typename ValueType,
typename CoordsVec,
typename GradVec>
711 GradVec& term_atom1_grad, GradVec& ctr_atom_grad, GradVec& term_atom2_grad,
712 const ValueType& ijk_force_const,
const ValueType& kji_force_const,
const ValueType& ref_angle,
713 const ValueType& ref_length1,
const ValueType& ref_length2)
715 ValueType ac_term1_grad[3];
716 ValueType ac_ctr_grad[3];
717 ValueType ac_term2_grad[3];
719 ValueType dist_term1_grad[3];
720 ValueType dist_ctr_grad1[3];
721 ValueType dist_ctr_grad2[3];
722 ValueType dist_term2_grad[3];
724 ValueType r_ij = calcDistanceDerivatives<ValueType>(term_atom1_pos, ctr_atom_pos, dist_term1_grad, dist_ctr_grad1);
725 ValueType r_kj = calcDistanceDerivatives<ValueType>(term_atom2_pos, ctr_atom_pos, dist_term2_grad, dist_ctr_grad2);
726 ValueType a_ijk_cos = calcBondAngleCosDerivatives<ValueType>(term_atom1_pos, ctr_atom_pos, term_atom2_pos, ac_term1_grad, ac_ctr_grad, ac_term2_grad);
727 ValueType a_ijk_cos_2 = a_ijk_cos * a_ijk_cos;
728 ValueType a_ijk = std::acos(a_ijk_cos);
730 ValueType dr_ij = r_ij - ref_length1;
731 ValueType dr_kj = r_kj - ref_length2;
732 ValueType da_ijk = a_ijk * ValueType(180 / M_PI) - ref_angle;
733 ValueType div = std::sqrt(1 - a_ijk_cos_2);
735 if (div < ValueType(0.0000001))
736 div = ValueType(0.0000001);
738 ValueType a_ijk_grad_fact = ValueType(-180 * 2.5121 / M_PI) / div * (dr_ij * ijk_force_const + dr_kj * kji_force_const);
740 ValueType r_ij_grad_fact = ValueType(2.5121) * da_ijk * ijk_force_const;
741 ValueType r_kj_grad_fact = ValueType(2.5121) * da_ijk * kji_force_const;
743 Detail::scaleAddVector(dist_term1_grad, r_ij_grad_fact, term_atom1_grad);
744 Detail::scaleAddVector(ac_term1_grad, a_ijk_grad_fact, term_atom1_grad);
746 Detail::scaleAddVector(dist_term2_grad, r_kj_grad_fact, term_atom2_grad);
747 Detail::scaleAddVector(ac_term2_grad, a_ijk_grad_fact, term_atom2_grad);
749 Detail::scaleAddVector(dist_ctr_grad1, r_ij_grad_fact, ctr_atom_grad);
750 Detail::scaleAddVector(dist_ctr_grad2, r_kj_grad_fact, ctr_atom_grad);
751 Detail::scaleAddVector(ac_ctr_grad, a_ijk_grad_fact, ctr_atom_grad);
753 ValueType e_ab = r_ij_grad_fact * dr_ij + r_kj_grad_fact * dr_kj;
759 template <
typename ValueType,
typename Iter,
typename CoordsArray,
typename GradVector>
762 return Detail::calcInteractionGradient<ValueType>(beg, end, coords, grad,
763 static_cast<ValueType (*)(
const MMFF94OutOfPlaneBendingInteraction&,
const CoordsArray&, GradVector&)
>(
764 &calcMMFF94OutOfPlaneBendingGradient<ValueType, CoordsArray, GradVector>));
767 template <
typename ValueType,
typename CoordsArray,
typename GradVector>
770 return calcMMFF94OutOfPlaneBendingGradient<ValueType>(coords[iaction.getTerminalAtom1Index()], coords[iaction.getCenterAtomIndex()],
771 coords[iaction.getTerminalAtom2Index()], coords[iaction.getOutOfPlaneAtomIndex()],
772 grad[iaction.getTerminalAtom1Index()], grad[iaction.getCenterAtomIndex()],
773 grad[iaction.getTerminalAtom2Index()], grad[iaction.getOutOfPlaneAtomIndex()],
774 iaction.getForceConstant());
777 template <
typename ValueType,
typename CoordsVec,
typename GradVec>
779 const CoordsVec& oop_atom_pos, GradVec& term_atom1_grad, GradVec& ctr_atom_grad,
780 GradVec& term_atom2_grad, GradVec& oop_atom_grad,
const ValueType& force_const)
782 ValueType ac_term1_grad[3];
783 ValueType ac_term2_grad[3];
784 ValueType ac_ctr_grad[3];
785 ValueType ac_oop_grad[3];
787 ValueType chi_ijkl_cos = calcOutOfPlaneAngleCosDerivatives<ValueType>(term_atom1_pos, ctr_atom_pos, term_atom2_pos, oop_atom_pos, ac_term1_grad,
788 ac_ctr_grad, ac_term2_grad, ac_oop_grad);
789 ValueType chi_ijkl = ValueType(M_PI * 0.5) - std::acos(chi_ijkl_cos);
790 ValueType div = std::sqrt(1 - chi_ijkl_cos * chi_ijkl_cos);
792 if (div < ValueType(0.0000001))
793 div = ValueType(0.0000001);
795 ValueType grad_fact = ValueType(0.043844 * 180 * 180) / div * ValueType(1 / (M_PI * M_PI)) * force_const * chi_ijkl;
797 Detail::scaleAddVector(ac_term1_grad, grad_fact, term_atom1_grad);
798 Detail::scaleAddVector(ac_ctr_grad, grad_fact, ctr_atom_grad);
799 Detail::scaleAddVector(ac_term2_grad, grad_fact, term_atom2_grad);
800 Detail::scaleAddVector(ac_oop_grad, grad_fact, oop_atom_grad);
802 chi_ijkl *= ValueType(180 / M_PI);
804 ValueType e_oop = ValueType(0.5 * 0.043844) * force_const * chi_ijkl * chi_ijkl;
810 template <
typename ValueType,
typename Iter,
typename CoordsArray,
typename GradVector>
813 return Detail::calcInteractionGradient<ValueType>(beg, end, coords, grad,
814 static_cast<ValueType (*)(
const MMFF94TorsionInteraction&,
const CoordsArray&, GradVector&)
>(
815 &calcMMFF94TorsionGradient<ValueType, CoordsArray, GradVector>));
818 template <
typename ValueType,
typename CoordsArray,
typename GradVector>
821 return calcMMFF94TorsionGradient<ValueType>(coords[iaction.getTerminalAtom1Index()], coords[iaction.getCenterAtom1Index()],
822 coords[iaction.getCenterAtom2Index()], coords[iaction.getTerminalAtom2Index()],
823 grad[iaction.getTerminalAtom1Index()], grad[iaction.getCenterAtom1Index()], grad[iaction.getCenterAtom2Index()],
824 grad[iaction.getTerminalAtom2Index()], iaction.getTorsionParameter1(), iaction.getTorsionParameter2(),
825 iaction.getTorsionParameter3());
828 template <
typename ValueType,
typename CoordsVec,
typename GradVec>
831 const CoordsVec& term_atom2_pos, GradVec& term_atom1_grad, GradVec& ctr_atom1_grad, GradVec& ctr_atom2_grad,
832 GradVec& term_atom2_grad,
const ValueType& tor_param1,
const ValueType& tor_param2,
const ValueType& tor_param3)
834 ValueType ac_term1_grad[3];
835 ValueType ac_ctr1_grad[3];
836 ValueType ac_ctr2_grad[3];
837 ValueType ac_term2_grad[3];
839 ValueType phi_cos = calcDihedralAngleCosDerivatives<ValueType>(term_atom1_pos, ctr_atom1_pos, ctr_atom2_pos, term_atom2_pos, ac_term1_grad, ac_ctr1_grad,
840 ac_ctr2_grad, ac_term2_grad);
841 ValueType phi = std::acos(phi_cos);
842 ValueType phi_cos_2 = phi_cos * phi_cos;
843 ValueType div = std::sqrt(1 - phi_cos_2);
845 if (div < ValueType(0.0000001))
846 div = ValueType(0.0000001);
848 ValueType grad_fact =
849 ValueType(-1) / div * (tor_param2 * std::sin(2 * phi) - ValueType(0.5) * tor_param1 * std::sin(phi) - ValueType(1.5) * tor_param3 * std::sin(3 * phi));
851 Detail::scaleAddVector(ac_term1_grad, grad_fact, term_atom1_grad);
852 Detail::scaleAddVector(ac_ctr1_grad, grad_fact, ctr_atom1_grad);
853 Detail::scaleAddVector(ac_ctr2_grad, grad_fact, ctr_atom2_grad);
854 Detail::scaleAddVector(ac_term2_grad, grad_fact, term_atom2_grad);
856 ValueType e_t = ValueType(0.5) * (tor_param1 * (1 + phi_cos) + tor_param2 * (1 - std::cos(2 * phi)) + tor_param3 * (1 + std::cos(3 * phi)));
862 template <
typename ValueType,
typename Iter,
typename CoordsArray,
typename GradVector>
865 return Detail::calcInteractionGradient<ValueType>(beg, end, coords, grad,
866 static_cast<ValueType (*)(
const MMFF94ElectrostaticInteraction&,
const CoordsArray&, GradVector&)
>(
867 &calcMMFF94ElectrostaticGradient<ValueType, CoordsArray, GradVector>));
870 template <
typename ValueType,
typename CoordsArray,
typename GradVector>
873 return calcMMFF94ElectrostaticGradient<ValueType>(coords[iaction.getAtom1Index()], coords[iaction.getAtom2Index()], grad[iaction.getAtom1Index()],
874 grad[iaction.getAtom2Index()], iaction.getAtom1Charge(), iaction.getAtom2Charge(),
875 iaction.getScalingFactor(), iaction.getDielectricConstant(), iaction.getDistanceExponent());
878 template <
typename ValueType,
typename CoordsVec,
typename GradVec>
880 const ValueType& atom1_chg,
const ValueType& atom2_chg,
const ValueType& scale_fact,
881 const ValueType& de_const,
const ValueType& dist_expo)
883 ValueType dist_atom1_grad[3];
884 ValueType dist_atom2_grad[3];
886 ValueType r_ij = calcDistanceDerivatives<ValueType>(atom1_pos, atom2_pos, dist_atom1_grad, dist_atom2_grad);
888 ValueType tmp1 = r_ij + ValueType(0.05);
889 ValueType tmp2 = std::pow(tmp1, dist_expo);
890 ValueType tmp3 = scale_fact * atom1_chg * atom2_chg / (de_const * tmp2);
892 ValueType grad_fact = ValueType(-332.0716) * dist_expo * tmp3 / tmp1;
894 Detail::scaleAddVector(dist_atom1_grad, grad_fact, atom1_grad);
895 Detail::scaleAddVector(dist_atom2_grad, grad_fact, atom2_grad);
897 double e_q = ValueType(332.0716) * tmp3;
903 template <
typename ValueType,
typename Iter,
typename CoordsArray,
typename GradVector>
906 return Detail::calcInteractionGradient<ValueType>(beg, end, coords, grad,
907 static_cast<ValueType (*)(
const MMFF94VanDerWaalsInteraction&,
const CoordsArray&, GradVector&)
>(
908 &calcMMFF94VanDerWaalsGradient<ValueType, CoordsArray, GradVector>));
911 template <
typename ValueType,
typename CoordsArray,
typename GradVector>
914 return calcMMFF94VanDerWaalsGradient<ValueType>(coords[iaction.getAtom1Index()], coords[iaction.getAtom2Index()], grad[iaction.getAtom1Index()],
915 grad[iaction.getAtom2Index()], iaction.getEIJ(), iaction.getRIJ(), iaction.getRIJPow7());
918 template <
typename ValueType,
typename CoordsVec,
typename GradVec>
920 const ValueType& e_IJ,
const ValueType& r_IJ,
const ValueType& r_IJ_7)
922 ValueType dist_atom1_grad[3];
923 ValueType dist_atom2_grad[3];
925 ValueType r_ij = calcDistanceDerivatives<ValueType>(atom1_pos, atom2_pos, dist_atom1_grad, dist_atom2_grad);
926 ValueType r_ij_2 = r_ij * r_ij;
927 ValueType r_ij_6 = r_ij_2 * r_ij_2 * r_ij_2;
928 ValueType r_ij_7 = r_ij_6 * r_ij;
930 ValueType tmp1 = r_ij + ValueType(0.07) * r_IJ;
931 ValueType tmp1_2 = tmp1 * tmp1;
932 ValueType tmp1_4 = tmp1_2 * tmp1_2;
934 ValueType tmp2 = r_ij_7 + ValueType(0.12) * r_IJ_7;
936 ValueType tmp3 = ValueType(1.07) * r_IJ / (r_ij + ValueType(0.07) * r_IJ);
937 ValueType tmp3_2 = tmp3 * tmp3;
938 ValueType tmp3_7 = tmp3_2 * tmp3_2 * tmp3_2 * tmp3;
940 ValueType grad_fact = -r_IJ_7 * e_IJ / (tmp1_4 * tmp1_4 * tmp2 * tmp2) *
941 (ValueType(-22.48094067) * r_ij_7 * r_ij_7 + ValueType(19.78322779) * r_ij_7 * r_IJ_7 +
942 ValueType(0.8812528743) * r_ij_6 * r_IJ_7 * r_IJ + ValueType(1.186993667) * r_IJ_7 * r_IJ_7);
944 Detail::scaleAddVector(dist_atom1_grad, grad_fact, atom1_grad);
945 Detail::scaleAddVector(dist_atom2_grad, grad_fact, atom2_grad);
947 ValueType e_vdw = e_IJ * tmp3_7 * (ValueType(1.12) * r_IJ_7 / tmp2 - 2);
Utility functions used in the calculation of force field energies and gradients.
Definition of class CDPL::ForceField::MMFF94AngleBendingInteraction.
Definition of class CDPL::ForceField::MMFF94BondStretchingInteraction.
Definition of class CDPL::ForceField::MMFF94ElectrostaticInteraction.
Definition of class CDPL::ForceField::MMFF94OutOfPlaneBendingInteraction.
Definition of class CDPL::ForceField::MMFF94StretchBendInteraction.
Definition of class CDPL::ForceField::MMFF94TorsionInteraction.
Definition of class CDPL::ForceField::MMFF94VanDerWaalsInteraction.
Stores parameters for a single MMFF94 angle-bending interaction defined over an atom triplet.
Definition: MMFF94AngleBendingInteraction.hpp:46
Stores parameters for a single MMFF94 bond-stretching interaction between two bonded atoms.
Definition: MMFF94BondStretchingInteraction.hpp:46
Stores parameters for a single MMFF94 electrostatic interaction between two non-bonded atoms.
Definition: MMFF94ElectrostaticInteraction.hpp:46
Stores parameters for a single MMFF94 out-of-plane bending interaction at a trigonal center.
Definition: MMFF94OutOfPlaneBendingInteraction.hpp:46
Stores paramters for a single MMFF94 stretch-bend coupling interaction.
Definition: MMFF94StretchBendInteraction.hpp:46
Stores parameters for a single MMFF94 torsion interaction over an atom quadruplet i-j-k-l.
Definition: MMFF94TorsionInteraction.hpp:46
Stores parameters for a single MMFF94 Van der Waals interaction between two non-bonded atoms.
Definition: MMFF94VanDerWaalsInteraction.hpp:47
ValueType calcMMFF94OutOfPlaneBendingGradient(Iter beg, const Iter &end, const CoordsArray &coords, GradVector &grad)
Accumulates the out-of-plane bending interaction energies and the corresponding per-atom gradient con...
ValueType calcMMFF94ElectrostaticGradient(Iter beg, const Iter &end, const CoordsArray &coords, GradVector &grad)
Accumulates the electrostatic interaction energies and the corresponding per-atom gradient contributi...
ValueType calcMMFF94VanDerWaalsGradient(Iter beg, const Iter &end, const CoordsArray &coords, GradVector &grad)
Accumulates the Van der Waals interaction energies and the corresponding per-atom gradient contributi...
ValueType calcMMFF94AngleBendingGradient(Iter beg, const Iter &end, const CoordsArray &coords, GradVector &grad)
Accumulates the angle-bending interaction energies and the corresponding per-atom gradient contributi...
ValueType calcMMFF94StretchBendGradient(Iter beg, const Iter &end, const CoordsArray &coords, GradVector &grad)
Accumulates the stretch-bend coupling interaction energies and the corresponding per-atom gradient co...
ValueType calcMMFF94TorsionGradient(Iter beg, const Iter &end, const CoordsArray &coords, GradVector &grad)
Accumulates the torsion interaction energies and the corresponding per-atom gradient contributions ca...
ValueType calcMMFF94BondStretchingGradient(Iter beg, const Iter &end, const CoordsArray &coords, GradVector &grad)
Accumulates the bond-stretching interaction energies and the corresponding per-atom gradient contribu...
The namespace of the Chemical Data Processing Library.