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>
95 template <
typename ValueType,
typename CoordsVec>
97 const ValueType& force_const,
const ValueType& ref_length);
121 template <
typename ValueType>
135 template <
typename ValueType,
typename Iter,
typename CoordsArray>
146 template <
typename ValueType,
typename CoordsArray>
177 template <
typename ValueType,
typename CoordsVec>
179 bool linear,
const ValueType& force_const,
const ValueType& ref_angle);
211 template <
typename ValueType,
typename CoordsVec>
213 const ValueType& r_ij,
const ValueType& r_jk,
214 bool linear,
const ValueType& force_const,
const ValueType& ref_angle);
227 template <
typename ValueType,
typename Iter,
typename CoordsArray>
238 template <
typename ValueType,
typename CoordsArray>
271 template <
typename ValueType,
typename CoordsVec>
273 const ValueType& ijk_force_const,
const ValueType& kji_force_const,
const ValueType& ref_angle,
274 const ValueType& ref_length1,
const ValueType& ref_length2);
308 template <
typename ValueType,
typename CoordsVec>
310 const ValueType& r_ij,
const ValueType& r_jk,
311 const ValueType& ijk_force_const,
const ValueType& kji_force_const,
const ValueType& ref_angle,
312 const ValueType& ref_length1,
const ValueType& ref_length2);
325 template <
typename ValueType,
typename Iter,
typename CoordsArray>
336 template <
typename ValueType,
typename CoordsArray>
356 template <
typename ValueType,
typename CoordsVec>
358 const CoordsVec& oop_atom_pos,
const ValueType& force_const);
378 template <
typename ValueType,
typename CoordsVec>
380 const CoordsVec& oop_atom_pos,
const ValueType& r_jl,
const ValueType& force_const);
393 template <
typename ValueType,
typename Iter,
typename CoordsArray>
404 template <
typename ValueType,
typename CoordsArray>
428 template <
typename ValueType,
typename CoordsVec>
429 ValueType
calcMMFF94TorsionEnergy(
const CoordsVec& term_atom1_pos,
const CoordsVec& ctr_atom1_pos,
const CoordsVec& ctr_atom2_pos,
430 const CoordsVec& term_atom2_pos,
const ValueType& tor_param1,
const ValueType& tor_param2,
431 const ValueType& tor_param3);
444 template <
typename ValueType,
typename Iter,
typename CoordsArray>
455 template <
typename ValueType,
typename CoordsArray>
484 template <
typename ValueType,
typename CoordsVec>
486 const ValueType& atom2_chg,
const ValueType& scale_fact,
const ValueType& de_const,
487 const ValueType& dist_expo);
514 template <
typename ValueType>
516 const ValueType& scale_fact,
const ValueType& de_const,
const ValueType& dist_expo);
529 template <
typename ValueType,
typename Iter,
typename CoordsArray>
540 template <
typename ValueType,
typename CoordsArray>
578 template <
typename ValueType,
typename CoordsVec>
580 const ValueType& r_IJ,
const ValueType& r_IJ_7);
616 template <
typename ValueType>
618 const ValueType& r_IJ,
const ValueType& r_IJ_7);
626 template <
typename ValueType,
typename Iter,
typename CoordsArray>
629 return Detail::accumInteractionEnergies<ValueType>(beg, end, coords,
630 static_cast<ValueType (*)(
const MMFF94BondStretchingInteraction&,
const CoordsArray&)
>(
631 &calcMMFF94BondStretchingEnergy<ValueType, CoordsArray>));
634 template <
typename ValueType,
typename CoordsArray>
637 return calcMMFF94BondStretchingEnergy<ValueType>(coords[iaction.getAtom1Index()], coords[iaction.getAtom2Index()],
638 iaction.getForceConstant(), iaction.getReferenceLength());
641 template <
typename ValueType,
typename CoordsVec>
643 const ValueType& force_const,
const ValueType& ref_length)
645 ValueType dr_ij = calcDistance<ValueType>(atom1_pos, atom2_pos) - ref_length;
646 ValueType dr_ij_2 = dr_ij * dr_ij;
647 ValueType e_b = ValueType(143.9325 * 0.5) * force_const * dr_ij_2 * (1 - 2 * dr_ij + 28 * dr_ij_2 / 12);
652 template <
typename ValueType>
655 ValueType dr_ij = r_ij - ref_length;
656 ValueType dr_ij_2 = dr_ij * dr_ij;
657 ValueType e_b = ValueType(143.9325 * 0.5) * force_const * dr_ij_2 * (1 - 2 * dr_ij + 28 * dr_ij_2 / 12);
663 template <
typename ValueType,
typename Iter,
typename CoordsArray>
666 return Detail::accumInteractionEnergies<ValueType>(beg, end, coords,
667 static_cast<ValueType (*)(
const MMFF94AngleBendingInteraction&,
const CoordsArray&)
>(
668 &calcMMFF94AngleBendingEnergy<ValueType, CoordsArray>));
671 template <
typename ValueType,
typename CoordsArray>
674 return calcMMFF94AngleBendingEnergy<ValueType>(coords[iaction.getTerminalAtom1Index()], coords[iaction.getCenterAtomIndex()],
675 coords[iaction.getTerminalAtom2Index()], iaction.isLinearAngle(), iaction.getForceConstant(),
676 iaction.getReferenceAngle());
679 template <
typename ValueType,
typename CoordsVec>
681 bool linear,
const ValueType& force_const,
const ValueType& ref_angle)
684 return (ValueType(143.9325) * force_const * (1 + calcBondAngleCos<ValueType>(term_atom1_pos, ctr_atom_pos, term_atom2_pos)));
686 ValueType a_ijk = calcBondAngle<ValueType>(term_atom1_pos, ctr_atom_pos, term_atom2_pos) * ValueType(180 / M_PI);
687 ValueType da_ijk = a_ijk - ref_angle;
688 ValueType e_a = ValueType(0.043844 * 0.5) * force_const * da_ijk * da_ijk * (1 - ValueType(0.007) * da_ijk);
693 template <
typename ValueType,
typename CoordsVec>
695 const ValueType& r_ij,
const ValueType& r_jk,
696 bool linear,
const ValueType& force_const,
const ValueType& ref_angle)
699 return (ValueType(143.9325) * force_const * (1 + calcBondAngleCos<ValueType>(term_atom1_pos, ctr_atom_pos, term_atom2_pos, r_ij, r_jk)));
701 ValueType a_ijk = calcBondAngle<ValueType>(term_atom1_pos, ctr_atom_pos, term_atom2_pos, r_ij, r_jk) * ValueType(180 / M_PI);
702 ValueType da_ijk = a_ijk - ref_angle;
703 ValueType e_a = ValueType(0.043844 * 0.5) * force_const * da_ijk * da_ijk * (1 - ValueType(0.007) * da_ijk);
709 template <
typename ValueType,
typename Iter,
typename CoordsArray>
712 return Detail::accumInteractionEnergies<ValueType>(beg, end, coords,
713 static_cast<ValueType (*)(
const MMFF94StretchBendInteraction&,
const CoordsArray&)
>(
714 &calcMMFF94StretchBendEnergy<ValueType, CoordsArray>));
717 template <
typename ValueType,
typename CoordsArray>
720 return calcMMFF94StretchBendEnergy<ValueType>(coords[iaction.getTerminalAtom1Index()], coords[iaction.getCenterAtomIndex()],
721 coords[iaction.getTerminalAtom2Index()], iaction.getIJKForceConstant(),
722 iaction.getKJIForceConstant(), iaction.getReferenceAngle(), iaction.getReferenceLength1(),
723 iaction.getReferenceLength2());
726 template <
typename ValueType,
typename CoordsVec>
728 const ValueType& ijk_force_const,
const ValueType& kji_force_const,
const ValueType& ref_angle,
729 const ValueType& ref_length1,
const ValueType& ref_length2)
731 ValueType r_ij = ValueType();
732 ValueType r_kj = ValueType();
733 ValueType a_ijk =
calcBondLengthsAndAngle(term_atom1_pos, ctr_atom_pos, term_atom2_pos, r_ij, r_kj) * ValueType(180 / M_PI);
735 ValueType dr_ij = r_ij - ref_length1;
736 ValueType dr_kj = r_kj - ref_length2;
737 ValueType da_ijk = a_ijk - ref_angle;
739 ValueType e_ab = ValueType(2.51210) * (ijk_force_const * dr_ij + kji_force_const * dr_kj) * da_ijk;
744 template <
typename ValueType,
typename CoordsVec>
746 const ValueType& r_ij,
const ValueType& r_jk,
747 const ValueType& ijk_force_const,
const ValueType& kji_force_const,
const ValueType& ref_angle,
748 const ValueType& ref_length1,
const ValueType& ref_length2)
750 ValueType a_ijk =
calcBondAngle(term_atom1_pos, ctr_atom_pos, term_atom2_pos, r_ij, r_jk) * ValueType(180 / M_PI);
752 ValueType dr_ij = r_ij - ref_length1;
753 ValueType dr_kj = r_jk - ref_length2;
754 ValueType da_ijk = a_ijk - ref_angle;
756 ValueType e_ab = ValueType(2.51210) * (ijk_force_const * dr_ij + kji_force_const * dr_kj) * da_ijk;
762 template <
typename ValueType,
typename Iter,
typename CoordsArray>
765 return Detail::accumInteractionEnergies<ValueType>(beg, end, coords,
766 static_cast<ValueType (*)(
const MMFF94OutOfPlaneBendingInteraction&,
const CoordsArray&)
>(
767 &calcMMFF94OutOfPlaneBendingEnergy<ValueType, CoordsArray>));
770 template <
typename ValueType,
typename CoordsArray>
773 return calcMMFF94OutOfPlaneBendingEnergy<ValueType>(coords[iaction.getTerminalAtom1Index()], coords[iaction.getCenterAtomIndex()],
774 coords[iaction.getTerminalAtom2Index()], coords[iaction.getOutOfPlaneAtomIndex()],
775 iaction.getForceConstant());
778 template <
typename ValueType,
typename CoordsVec>
780 const CoordsVec& oop_atom_pos,
const ValueType& force_const)
782 ValueType chi_ijkl = calcOutOfPlaneAngle<ValueType>(term_atom1_pos, ctr_atom_pos, term_atom2_pos, oop_atom_pos) * ValueType(180 / M_PI);
783 ValueType e_oop = ValueType(0.5 * 0.043844) * force_const * chi_ijkl * chi_ijkl;
788 template <
typename ValueType,
typename CoordsVec>
790 const CoordsVec& oop_atom_pos,
const ValueType& r_jl,
const ValueType& force_const)
792 ValueType chi_ijkl = calcOutOfPlaneAngle<ValueType>(term_atom1_pos, ctr_atom_pos, term_atom2_pos, oop_atom_pos, r_jl) * ValueType(180 / M_PI);
793 ValueType e_oop = ValueType(0.5 * 0.043844) * force_const * chi_ijkl * chi_ijkl;
799 template <
typename ValueType,
typename Iter,
typename CoordsArray>
802 return Detail::accumInteractionEnergies<ValueType>(beg, end, coords,
803 static_cast<ValueType (*)(
const MMFF94TorsionInteraction&,
const CoordsArray&)
>(
804 &calcMMFF94TorsionEnergy<ValueType, CoordsArray>));
807 template <
typename ValueType,
typename CoordsArray>
810 return calcMMFF94TorsionEnergy<ValueType>(coords[iaction.getTerminalAtom1Index()], coords[iaction.getCenterAtom1Index()],
811 coords[iaction.getCenterAtom2Index()], coords[iaction.getTerminalAtom2Index()],
812 iaction.getTorsionParameter1(), iaction.getTorsionParameter2(), iaction.getTorsionParameter3());
815 template <
typename ValueType,
typename CoordsVec>
817 const CoordsVec& term_atom2_pos,
const ValueType& tor_param1,
const ValueType& tor_param2,
818 const ValueType& tor_param3)
820 ValueType phi_cos = calcDihedralAngleCos<ValueType>(term_atom1_pos, ctr_atom1_pos, ctr_atom2_pos, term_atom2_pos);
821 ValueType phi = std::acos(phi_cos);
822 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)));
828 template <
typename ValueType,
typename Iter,
typename CoordsArray>
831 return Detail::accumInteractionEnergies<ValueType>(beg, end, coords,
832 static_cast<ValueType (*)(
const MMFF94ElectrostaticInteraction&,
const CoordsArray&)
>(
833 &calcMMFF94ElectrostaticEnergy<ValueType, CoordsArray>));
836 template <
typename ValueType,
typename CoordsArray>
839 return calcMMFF94ElectrostaticEnergy<ValueType>(coords[iaction.getAtom1Index()], coords[iaction.getAtom2Index()],
840 iaction.getAtom1Charge(), iaction.getAtom2Charge(), iaction.getScalingFactor(),
841 iaction.getDielectricConstant(), iaction.getDistanceExponent());
844 template <
typename ValueType,
typename CoordsVec>
846 const ValueType& atom2_chg,
const ValueType& scale_fact,
const ValueType& de_const,
847 const ValueType& dist_expo)
849 ValueType tmp = std::pow(calcDistance<ValueType>(atom1_pos, atom2_pos) + ValueType(0.05), dist_expo);
850 ValueType e_q = scale_fact * ValueType(332.0716) * atom1_chg * atom2_chg / (de_const * tmp);
855 template <
typename ValueType>
857 const ValueType& scale_fact,
const ValueType& de_const,
const ValueType& dist_expo)
859 ValueType tmp = std::pow(r_ij + ValueType(0.05), dist_expo);
860 ValueType e_q = scale_fact * ValueType(332.0716) * atom1_chg * atom2_chg / (de_const * tmp);
866 template <
typename ValueType,
typename Iter,
typename CoordsArray>
869 return Detail::accumInteractionEnergies<ValueType>(beg, end, coords,
870 static_cast<ValueType (*)(
const MMFF94VanDerWaalsInteraction&,
const CoordsArray&)
>(
871 &calcMMFF94VanDerWaalsEnergy<ValueType, CoordsArray>));
874 template <
typename ValueType,
typename CoordsArray>
877 return calcMMFF94VanDerWaalsEnergy<ValueType>(coords[iaction.getAtom1Index()], coords[iaction.getAtom2Index()],
878 iaction.getEIJ(), iaction.getRIJ(), iaction.getRIJPow7());
881 template <
typename ValueType,
typename CoordsVec>
883 const ValueType& r_IJ,
const ValueType& r_IJ_7)
885 ValueType r_ij_2 = calcSquaredDistance<ValueType>(atom1_pos, atom2_pos);
886 ValueType r_ij = std::sqrt(r_ij_2);
887 ValueType r_ij_7 = r_ij_2 * r_ij_2 * r_ij_2 * r_ij;
889 ValueType tmp = ValueType(1.07) * r_IJ / (r_ij + ValueType(0.07) * r_IJ);
890 ValueType tmp_2 = tmp * tmp;
891 ValueType tmp_7 = tmp_2 * tmp_2 * tmp_2 * tmp;
893 ValueType e_vdw = e_IJ * tmp_7 * (ValueType(1.12) * r_IJ_7 / (r_ij_7 + ValueType(0.12) * r_IJ_7) - 2);
898 template <
typename ValueType>
900 const ValueType& r_IJ,
const ValueType& r_IJ_7)
902 ValueType r_ij_2 = r_ij * r_ij;
903 ValueType r_ij_7 = r_ij_2 * r_ij_2 * r_ij_2 * r_ij;
905 ValueType tmp = ValueType(1.07) * r_IJ / (r_ij + ValueType(0.07) * r_IJ);
906 ValueType tmp_2 = tmp * tmp;
907 ValueType tmp_7 = tmp_2 * tmp_2 * tmp_2 * tmp;
909 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:45
Stores parameters for a single MMFF94 bond-stretching interaction between two bonded atoms.
Definition: MMFF94BondStretchingInteraction.hpp:45
Stores parameters for a single MMFF94 electrostatic interaction between two non-bonded atoms.
Definition: MMFF94ElectrostaticInteraction.hpp:45
Stores parameters for a single MMFF94 out-of-plane bending interaction at a trigonal center.
Definition: MMFF94OutOfPlaneBendingInteraction.hpp:45
Stores paramters for a single MMFF94 stretch-bend coupling interaction.
Definition: MMFF94StretchBendInteraction.hpp:45
Stores parameters for a single MMFF94 torsion interaction over an atom quadruplet i-j-k-l.
Definition: MMFF94TorsionInteraction.hpp:45
Stores parameters for a single MMFF94 Van der Waals interaction between two non-bonded atoms.
Definition: MMFF94VanDerWaalsInteraction.hpp:46
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)
Sums the out-of-plane bending interaction energies of all MMFF94 out-of-plane bending interactions in...
ValueType calcMMFF94VanDerWaalsEnergy(Iter beg, const Iter &end, const CoordsArray &coords)
Sums the Van der Waals interaction energies of all MMFF94 Van der Waals interactions in the iterator ...
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)
Sums the bond-stretching interaction energies of all MMFF94 bond-stretching interactions in the itera...
ValueType calcMMFF94StretchBendEnergy(Iter beg, const Iter &end, const CoordsArray &coords)
Sums the stretch-bend coupling interaction energies of all MMFF94 stretch-bend interactions in the it...
ValueType calcMMFF94ElectrostaticEnergy(Iter beg, const Iter &end, const CoordsArray &coords)
Sums the electrostatic interaction energies of all MMFF94 electrostatic interactions in the iterator ...
ValueType calcMMFF94TorsionEnergy(Iter beg, const Iter &end, const CoordsArray &coords)
Sums the torsion interaction energies of all MMFF94 torsion interactions in the iterator range [beg,...
ValueType calcMMFF94AngleBendingEnergy(Iter beg, const Iter &end, const CoordsArray &coords)
Sums the angle-bending interaction energies of all MMFF94 angle-bending interactions in the iterator ...
The namespace of the Chemical Data Processing Library.