29 #ifndef CDPL_FORCEFIELD_MMFF94ENERGYFUNCTIONS_HPP
30 #define CDPL_FORCEFIELD_MMFF94ENERGYFUNCTIONS_HPP
58 template <
typename ValueType,
typename Iter,
typename CoordsArray>
69 template <
typename ValueType,
typename CoordsArray>
96 template <
typename ValueType,
typename CoordsVec>
98 const ValueType& force_const,
const ValueType& ref_length);
123 template <
typename ValueType>
136 template <
typename ValueType,
typename Iter,
typename CoordsArray>
147 template <
typename ValueType,
typename CoordsArray>
179 template <
typename ValueType,
typename CoordsVec>
181 bool linear,
const ValueType& force_const,
const ValueType& ref_angle);
214 template <
typename ValueType,
typename CoordsVec>
216 const ValueType& r_ij,
const ValueType& r_jk,
217 bool linear,
const ValueType& force_const,
const ValueType& ref_angle);
229 template <
typename ValueType,
typename Iter,
typename CoordsArray>
240 template <
typename ValueType,
typename CoordsArray>
274 template <
typename ValueType,
typename CoordsVec>
276 const ValueType& ijk_force_const,
const ValueType& kji_force_const,
const ValueType& ref_angle,
277 const ValueType& ref_length1,
const ValueType& ref_length2);
312 template <
typename ValueType,
typename CoordsVec>
314 const ValueType& r_ij,
const ValueType& r_jk,
315 const ValueType& ijk_force_const,
const ValueType& kji_force_const,
const ValueType& ref_angle,
316 const ValueType& ref_length1,
const ValueType& ref_length2);
328 template <
typename ValueType,
typename Iter,
typename CoordsArray>
339 template <
typename ValueType,
typename CoordsArray>
360 template <
typename ValueType,
typename CoordsVec>
362 const CoordsVec& oop_atom_pos,
const ValueType& force_const);
383 template <
typename ValueType,
typename CoordsVec>
385 const CoordsVec& oop_atom_pos,
const ValueType& r_jl,
const ValueType& force_const);
397 template <
typename ValueType,
typename Iter,
typename CoordsArray>
408 template <
typename ValueType,
typename CoordsArray>
433 template <
typename ValueType,
typename CoordsVec>
434 ValueType
calcMMFF94TorsionEnergy(
const CoordsVec& term_atom1_pos,
const CoordsVec& ctr_atom1_pos,
const CoordsVec& ctr_atom2_pos,
435 const CoordsVec& term_atom2_pos,
const ValueType& tor_param1,
const ValueType& tor_param2,
436 const ValueType& tor_param3);
449 template <
typename ValueType,
typename Iter,
typename CoordsArray>
460 template <
typename ValueType,
typename CoordsArray>
490 template <
typename ValueType,
typename CoordsVec>
492 const ValueType& atom2_chg,
const ValueType& scale_fact,
const ValueType& de_const,
493 const ValueType& dist_expo);
521 template <
typename ValueType>
523 const ValueType& scale_fact,
const ValueType& de_const,
const ValueType& dist_expo);
536 template <
typename ValueType,
typename Iter,
typename CoordsArray>
547 template <
typename ValueType,
typename CoordsArray>
586 template <
typename ValueType,
typename CoordsVec>
588 const ValueType& r_IJ,
const ValueType& r_IJ_7);
625 template <
typename ValueType>
627 const ValueType& r_IJ,
const ValueType& r_IJ_7);
635 template <
typename ValueType,
typename Iter,
typename CoordsArray>
638 return Detail::accumInteractionEnergies<ValueType>(beg, end, coords,
639 static_cast<ValueType (*)(
const MMFF94BondStretchingInteraction&,
const CoordsArray&)
>(
640 &calcMMFF94BondStretchingEnergy<ValueType, CoordsArray>));
643 template <
typename ValueType,
typename CoordsArray>
646 return calcMMFF94BondStretchingEnergy<ValueType>(coords[iaction.getAtom1Index()], coords[iaction.getAtom2Index()],
647 iaction.getForceConstant(), iaction.getReferenceLength());
650 template <
typename ValueType,
typename CoordsVec>
652 const ValueType& force_const,
const ValueType& ref_length)
654 ValueType dr_ij = calcDistance<ValueType>(atom1_pos, atom2_pos) - ref_length;
655 ValueType dr_ij_2 = dr_ij * dr_ij;
656 ValueType e_b = ValueType(143.9325 * 0.5) * force_const * dr_ij_2 * (1 - 2 * dr_ij + 28 * dr_ij_2 / 12);
661 template <
typename ValueType>
664 ValueType dr_ij = r_ij - ref_length;
665 ValueType dr_ij_2 = dr_ij * dr_ij;
666 ValueType e_b = ValueType(143.9325 * 0.5) * force_const * dr_ij_2 * (1 - 2 * dr_ij + 28 * dr_ij_2 / 12);
672 template <
typename ValueType,
typename Iter,
typename CoordsArray>
675 return Detail::accumInteractionEnergies<ValueType>(beg, end, coords,
676 static_cast<ValueType (*)(
const MMFF94AngleBendingInteraction&,
const CoordsArray&)
>(
677 &calcMMFF94AngleBendingEnergy<ValueType, CoordsArray>));
680 template <
typename ValueType,
typename CoordsArray>
683 return calcMMFF94AngleBendingEnergy<ValueType>(coords[iaction.getTerminalAtom1Index()], coords[iaction.getCenterAtomIndex()],
684 coords[iaction.getTerminalAtom2Index()], iaction.isLinearAngle(), iaction.getForceConstant(),
685 iaction.getReferenceAngle());
688 template <
typename ValueType,
typename CoordsVec>
690 bool linear,
const ValueType& force_const,
const ValueType& ref_angle)
693 return (ValueType(143.9325) * force_const * (1 + calcBondAngleCos<ValueType>(term_atom1_pos, ctr_atom_pos, term_atom2_pos)));
695 ValueType a_ijk = calcBondAngle<ValueType>(term_atom1_pos, ctr_atom_pos, term_atom2_pos) * ValueType(180 / M_PI);
696 ValueType da_ijk = a_ijk - ref_angle;
697 ValueType e_a = ValueType(0.043844 * 0.5) * force_const * da_ijk * da_ijk * (1 - ValueType(0.007) * da_ijk);
702 template <
typename ValueType,
typename CoordsVec>
704 const ValueType& r_ij,
const ValueType& r_jk,
705 bool linear,
const ValueType& force_const,
const ValueType& ref_angle)
708 return (ValueType(143.9325) * force_const * (1 + calcBondAngleCos<ValueType>(term_atom1_pos, ctr_atom_pos, term_atom2_pos, r_ij, r_jk)));
710 ValueType a_ijk = calcBondAngle<ValueType>(term_atom1_pos, ctr_atom_pos, term_atom2_pos, r_ij, r_jk) * ValueType(180 / M_PI);
711 ValueType da_ijk = a_ijk - ref_angle;
712 ValueType e_a = ValueType(0.043844 * 0.5) * force_const * da_ijk * da_ijk * (1 - ValueType(0.007) * da_ijk);
718 template <
typename ValueType,
typename Iter,
typename CoordsArray>
721 return Detail::accumInteractionEnergies<ValueType>(beg, end, coords,
722 static_cast<ValueType (*)(
const MMFF94StretchBendInteraction&,
const CoordsArray&)
>(
723 &calcMMFF94StretchBendEnergy<ValueType, CoordsArray>));
726 template <
typename ValueType,
typename CoordsArray>
729 return calcMMFF94StretchBendEnergy<ValueType>(coords[iaction.getTerminalAtom1Index()], coords[iaction.getCenterAtomIndex()],
730 coords[iaction.getTerminalAtom2Index()], iaction.getIJKForceConstant(),
731 iaction.getKJIForceConstant(), iaction.getReferenceAngle(), iaction.getReferenceLength1(),
732 iaction.getReferenceLength2());
735 template <
typename ValueType,
typename CoordsVec>
737 const ValueType& ijk_force_const,
const ValueType& kji_force_const,
const ValueType& ref_angle,
738 const ValueType& ref_length1,
const ValueType& ref_length2)
740 ValueType r_ij = ValueType();
741 ValueType r_kj = ValueType();
742 ValueType a_ijk =
calcBondLengthsAndAngle(term_atom1_pos, ctr_atom_pos, term_atom2_pos, r_ij, r_kj) * ValueType(180 / M_PI);
744 ValueType dr_ij = r_ij - ref_length1;
745 ValueType dr_kj = r_kj - ref_length2;
746 ValueType da_ijk = a_ijk - ref_angle;
748 ValueType e_ab = ValueType(2.51210) * (ijk_force_const * dr_ij + kji_force_const * dr_kj) * da_ijk;
753 template <
typename ValueType,
typename CoordsVec>
755 const ValueType& r_ij,
const ValueType& r_jk,
756 const ValueType& ijk_force_const,
const ValueType& kji_force_const,
const ValueType& ref_angle,
757 const ValueType& ref_length1,
const ValueType& ref_length2)
759 ValueType a_ijk =
calcBondAngle(term_atom1_pos, ctr_atom_pos, term_atom2_pos, r_ij, r_jk) * ValueType(180 / M_PI);
761 ValueType dr_ij = r_ij - ref_length1;
762 ValueType dr_kj = r_jk - ref_length2;
763 ValueType da_ijk = a_ijk - ref_angle;
765 ValueType e_ab = ValueType(2.51210) * (ijk_force_const * dr_ij + kji_force_const * dr_kj) * da_ijk;
771 template <
typename ValueType,
typename Iter,
typename CoordsArray>
774 return Detail::accumInteractionEnergies<ValueType>(beg, end, coords,
775 static_cast<ValueType (*)(
const MMFF94OutOfPlaneBendingInteraction&,
const CoordsArray&)
>(
776 &calcMMFF94OutOfPlaneBendingEnergy<ValueType, CoordsArray>));
779 template <
typename ValueType,
typename CoordsArray>
782 return calcMMFF94OutOfPlaneBendingEnergy<ValueType>(coords[iaction.getTerminalAtom1Index()], coords[iaction.getCenterAtomIndex()],
783 coords[iaction.getTerminalAtom2Index()], coords[iaction.getOutOfPlaneAtomIndex()],
784 iaction.getForceConstant());
787 template <
typename ValueType,
typename CoordsVec>
789 const CoordsVec& oop_atom_pos,
const ValueType& force_const)
791 ValueType chi_ijkl = calcOutOfPlaneAngle<ValueType>(term_atom1_pos, ctr_atom_pos, term_atom2_pos, oop_atom_pos) * ValueType(180 / M_PI);
792 ValueType e_oop = ValueType(0.5 * 0.043844) * force_const * chi_ijkl * chi_ijkl;
797 template <
typename ValueType,
typename CoordsVec>
799 const CoordsVec& oop_atom_pos,
const ValueType& r_jl,
const ValueType& force_const)
801 ValueType chi_ijkl = calcOutOfPlaneAngle<ValueType>(term_atom1_pos, ctr_atom_pos, term_atom2_pos, oop_atom_pos, r_jl) * ValueType(180 / M_PI);
802 ValueType e_oop = ValueType(0.5 * 0.043844) * force_const * chi_ijkl * chi_ijkl;
808 template <
typename ValueType,
typename Iter,
typename CoordsArray>
811 return Detail::accumInteractionEnergies<ValueType>(beg, end, coords,
812 static_cast<ValueType (*)(
const MMFF94TorsionInteraction&,
const CoordsArray&)
>(
813 &calcMMFF94TorsionEnergy<ValueType, CoordsArray>));
816 template <
typename ValueType,
typename CoordsArray>
819 return calcMMFF94TorsionEnergy<ValueType>(coords[iaction.getTerminalAtom1Index()], coords[iaction.getCenterAtom1Index()],
820 coords[iaction.getCenterAtom2Index()], coords[iaction.getTerminalAtom2Index()],
821 iaction.getTorsionParameter1(), iaction.getTorsionParameter2(), iaction.getTorsionParameter3());
824 template <
typename ValueType,
typename CoordsVec>
826 const CoordsVec& term_atom2_pos,
const ValueType& tor_param1,
const ValueType& tor_param2,
827 const ValueType& tor_param3)
829 ValueType phi_cos = calcDihedralAngleCos<ValueType>(term_atom1_pos, ctr_atom1_pos, ctr_atom2_pos, term_atom2_pos);
830 ValueType phi = std::acos(phi_cos);
831 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)));
837 template <
typename ValueType,
typename Iter,
typename CoordsArray>
840 return Detail::accumInteractionEnergies<ValueType>(beg, end, coords,
841 static_cast<ValueType (*)(
const MMFF94ElectrostaticInteraction&,
const CoordsArray&)
>(
842 &calcMMFF94ElectrostaticEnergy<ValueType, CoordsArray>));
845 template <
typename ValueType,
typename CoordsArray>
848 return calcMMFF94ElectrostaticEnergy<ValueType>(coords[iaction.getAtom1Index()], coords[iaction.getAtom2Index()],
849 iaction.getAtom1Charge(), iaction.getAtom2Charge(), iaction.getScalingFactor(),
850 iaction.getDielectricConstant(), iaction.getDistanceExponent());
853 template <
typename ValueType,
typename CoordsVec>
855 const ValueType& atom2_chg,
const ValueType& scale_fact,
const ValueType& de_const,
856 const ValueType& dist_expo)
858 ValueType tmp = std::pow(calcDistance<ValueType>(atom1_pos, atom2_pos) + ValueType(0.05), dist_expo);
859 ValueType e_q = scale_fact * ValueType(332.0716) * atom1_chg * atom2_chg / (de_const * tmp);
864 template <
typename ValueType>
866 const ValueType& scale_fact,
const ValueType& de_const,
const ValueType& dist_expo)
868 ValueType tmp = std::pow(r_ij + ValueType(0.05), dist_expo);
869 ValueType e_q = scale_fact * ValueType(332.0716) * atom1_chg * atom2_chg / (de_const * tmp);
875 template <
typename ValueType,
typename Iter,
typename CoordsArray>
878 return Detail::accumInteractionEnergies<ValueType>(beg, end, coords,
879 static_cast<ValueType (*)(
const MMFF94VanDerWaalsInteraction&,
const CoordsArray&)
>(
880 &calcMMFF94VanDerWaalsEnergy<ValueType, CoordsArray>));
883 template <
typename ValueType,
typename CoordsArray>
886 return calcMMFF94VanDerWaalsEnergy<ValueType>(coords[iaction.getAtom1Index()], coords[iaction.getAtom2Index()],
887 iaction.getEIJ(), iaction.getRIJ(), iaction.getRIJPow7());
890 template <
typename ValueType,
typename CoordsVec>
892 const ValueType& r_IJ,
const ValueType& r_IJ_7)
894 ValueType r_ij_2 = calcSquaredDistance<ValueType>(atom1_pos, atom2_pos);
895 ValueType r_ij = std::sqrt(r_ij_2);
896 ValueType r_ij_7 = r_ij_2 * r_ij_2 * r_ij_2 * r_ij;
898 ValueType tmp = ValueType(1.07) * r_IJ / (r_ij + ValueType(0.07) * r_IJ);
899 ValueType tmp_2 = tmp * tmp;
900 ValueType tmp_7 = tmp_2 * tmp_2 * tmp_2 * tmp;
902 ValueType e_vdw = e_IJ * tmp_7 * (ValueType(1.12) * r_IJ_7 / (r_ij_7 + ValueType(0.12) * r_IJ_7) - 2);
907 template <
typename ValueType>
909 const ValueType& r_IJ,
const ValueType& r_IJ_7)
911 ValueType r_ij_2 = r_ij * r_ij;
912 ValueType r_ij_7 = r_ij_2 * r_ij_2 * r_ij_2 * r_ij;
914 ValueType tmp = ValueType(1.07) * r_IJ / (r_ij + ValueType(0.07) * r_IJ);
915 ValueType tmp_2 = tmp * tmp;
916 ValueType tmp_7 = tmp_2 * tmp_2 * tmp_2 * tmp;
918 ValueType e_vdw = e_IJ * tmp_7 * (ValueType(1.12) * r_IJ_7 / (r_ij_7 + ValueType(0.12) * r_IJ_7) - 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 calcBondAngle(const CoordsVec &term_atom1_pos, const CoordsVec &ctr_atom_pos, const CoordsVec &term_atom2_pos)
Calculates the bond angle between the two bonds i-j and j-k.
ValueType calcMMFF94OutOfPlaneBendingEnergy(Iter beg, const Iter &end, const CoordsArray &coords)
Accumulates the out-of-plane bending interaction energies calculated for the interactions specified b...
ValueType calcMMFF94VanDerWaalsEnergy(Iter beg, const Iter &end, const CoordsArray &coords)
Accumulates the Van der Waals interaction energies calculated for the interactions specified by the i...
ValueType calcBondLengthsAndAngle(const CoordsVec &term_atom1_pos, const CoordsVec &ctr_atom_pos, const CoordsVec &term_atom2_pos, ValueType &bond_length1, ValueType &bond_length2)
Calculates bond lengths and and the bond angle between the two bonds i-j and j-k.
ValueType calcMMFF94BondStretchingEnergy(Iter beg, const Iter &end, const CoordsArray &coords)
Accumulates the bond-stretching interaction energies calculated for the interactions specified by the...
ValueType calcMMFF94StretchBendEnergy(Iter beg, const Iter &end, const CoordsArray &coords)
Accumulates the stretch-bend coupling interaction energies calculated for the interactions specified ...
ValueType calcMMFF94ElectrostaticEnergy(Iter beg, const Iter &end, const CoordsArray &coords)
Accumulates the electrostatic interaction energies calculated for the interactions specified by the i...
ValueType calcMMFF94TorsionEnergy(Iter beg, const Iter &end, const CoordsArray &coords)
Accumulates the torsion interaction energies calculated for the interactions specified by the iterato...
ValueType calcMMFF94AngleBendingEnergy(Iter beg, const Iter &end, const CoordsArray &coords)
Accumulates the angle-bending interaction energies calculated for the interactions specified by the i...
The namespace of the Chemical Data Processing Library.