Chemical Data Processing Library C++ API - Version 1.4.0
MMFF94EnergyFunctions.hpp
Go to the documentation of this file.
1 /*
2  * MMFF94EnergyFunctions.hpp
3  *
4  * This file is part of the Chemical Data Processing Toolkit
5  *
6  * Copyright (C) 2003 Thomas Seidel <thomas.seidel@univie.ac.at>
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public License
19  * along with this library; see the file COPYING. If not, write to
20  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21  * Boston, MA 02111-1307, USA.
22  */
23 
29 #ifndef CDPL_FORCEFIELD_MMFF94ENERGYFUNCTIONS_HPP
30 #define CDPL_FORCEFIELD_MMFF94ENERGYFUNCTIONS_HPP
31 
40 
41 
42 namespace CDPL
43 {
44 
45  namespace ForceField
46  {
47 
58  template <typename ValueType, typename Iter, typename CoordsArray>
59  ValueType calcMMFF94BondStretchingEnergy(Iter beg, const Iter& end, const CoordsArray& coords);
60 
69  template <typename ValueType, typename CoordsArray>
70  ValueType calcMMFF94BondStretchingEnergy(const MMFF94BondStretchingInteraction& iaction, const CoordsArray& coords);
71 
96  template <typename ValueType, typename CoordsVec>
97  ValueType calcMMFF94BondStretchingEnergy(const CoordsVec& atom1_pos, const CoordsVec& atom2_pos,
98  const ValueType& force_const, const ValueType& ref_length);
99 
123  template <typename ValueType>
124  ValueType calcMMFF94BondStretchingEnergy(const ValueType& r_ij, const ValueType& force_const, const ValueType& ref_length);
125 
136  template <typename ValueType, typename Iter, typename CoordsArray>
137  ValueType calcMMFF94AngleBendingEnergy(Iter beg, const Iter& end, const CoordsArray& coords);
138 
147  template <typename ValueType, typename CoordsArray>
148  ValueType calcMMFF94AngleBendingEnergy(const MMFF94AngleBendingInteraction& iaction, const CoordsArray& coords);
149 
179  template <typename ValueType, typename CoordsVec>
180  ValueType calcMMFF94AngleBendingEnergy(const CoordsVec& term_atom1_pos, const CoordsVec& ctr_atom_pos, const CoordsVec& term_atom2_pos,
181  bool linear, const ValueType& force_const, const ValueType& ref_angle);
182 
214  template <typename ValueType, typename CoordsVec>
215  ValueType calcMMFF94AngleBendingEnergy(const CoordsVec& term_atom1_pos, const CoordsVec& ctr_atom_pos, const CoordsVec& term_atom2_pos,
216  const ValueType& r_ij, const ValueType& r_jk,
217  bool linear, const ValueType& force_const, const ValueType& ref_angle);
218 
229  template <typename ValueType, typename Iter, typename CoordsArray>
230  ValueType calcMMFF94StretchBendEnergy(Iter beg, const Iter& end, const CoordsArray& coords);
231 
240  template <typename ValueType, typename CoordsArray>
241  ValueType calcMMFF94StretchBendEnergy(const MMFF94StretchBendInteraction& iaction, const CoordsArray& coords);
242 
274  template <typename ValueType, typename CoordsVec>
275  ValueType calcMMFF94StretchBendEnergy(const CoordsVec& term_atom1_pos, const CoordsVec& ctr_atom_pos, const CoordsVec& term_atom2_pos,
276  const ValueType& ijk_force_const, const ValueType& kji_force_const, const ValueType& ref_angle,
277  const ValueType& ref_length1, const ValueType& ref_length2);
278 
312  template <typename ValueType, typename CoordsVec>
313  ValueType calcMMFF94StretchBendEnergy(const CoordsVec& term_atom1_pos, const CoordsVec& ctr_atom_pos, const CoordsVec& term_atom2_pos,
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);
317 
328  template <typename ValueType, typename Iter, typename CoordsArray>
329  ValueType calcMMFF94OutOfPlaneBendingEnergy(Iter beg, const Iter& end, const CoordsArray& coords);
330 
339  template <typename ValueType, typename CoordsArray>
340  ValueType calcMMFF94OutOfPlaneBendingEnergy(const MMFF94OutOfPlaneBendingInteraction& iaction, const CoordsArray& coords);
341 
360  template <typename ValueType, typename CoordsVec>
361  ValueType calcMMFF94OutOfPlaneBendingEnergy(const CoordsVec& term_atom1_pos, const CoordsVec& ctr_atom_pos, const CoordsVec& term_atom2_pos,
362  const CoordsVec& oop_atom_pos, const ValueType& force_const);
363 
383  template <typename ValueType, typename CoordsVec>
384  ValueType calcMMFF94OutOfPlaneBendingEnergy(const CoordsVec& term_atom1_pos, const CoordsVec& ctr_atom_pos, const CoordsVec& term_atom2_pos,
385  const CoordsVec& oop_atom_pos, const ValueType& r_jl, const ValueType& force_const);
386 
397  template <typename ValueType, typename Iter, typename CoordsArray>
398  ValueType calcMMFF94TorsionEnergy(Iter beg, const Iter& end, const CoordsArray& coords);
399 
408  template <typename ValueType, typename CoordsArray>
409  ValueType calcMMFF94TorsionEnergy(const MMFF94TorsionInteraction& iaction, const CoordsArray& coords);
410 
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);
437 
438 
449  template <typename ValueType, typename Iter, typename CoordsArray>
450  ValueType calcMMFF94ElectrostaticEnergy(Iter beg, const Iter& end, const CoordsArray& coords);
451 
460  template <typename ValueType, typename CoordsArray>
461  ValueType calcMMFF94ElectrostaticEnergy(const MMFF94ElectrostaticInteraction& iaction, const CoordsArray& coords);
462 
490  template <typename ValueType, typename CoordsVec>
491  ValueType calcMMFF94ElectrostaticEnergy(const CoordsVec& atom1_pos, const CoordsVec& atom2_pos, const ValueType& atom1_chg,
492  const ValueType& atom2_chg, const ValueType& scale_fact, const ValueType& de_const,
493  const ValueType& dist_expo);
494 
521  template <typename ValueType>
522  ValueType calcMMFF94ElectrostaticEnergy(const ValueType& r_ij, const ValueType& atom1_chg, const ValueType& atom2_chg,
523  const ValueType& scale_fact, const ValueType& de_const, const ValueType& dist_expo);
524 
525 
536  template <typename ValueType, typename Iter, typename CoordsArray>
537  ValueType calcMMFF94VanDerWaalsEnergy(Iter beg, const Iter& end, const CoordsArray& coords);
538 
547  template <typename ValueType, typename CoordsArray>
548  ValueType calcMMFF94VanDerWaalsEnergy(const MMFF94VanDerWaalsInteraction& iaction, const CoordsArray& coords);
549 
586  template <typename ValueType, typename CoordsVec>
587  ValueType calcMMFF94VanDerWaalsEnergy(const CoordsVec& atom1_pos, const CoordsVec& atom2_pos, const ValueType& e_IJ,
588  const ValueType& r_IJ, const ValueType& r_IJ_7);
589 
625  template <typename ValueType>
626  ValueType calcMMFF94VanDerWaalsEnergy(const ValueType& r_ij, const ValueType& e_IJ,
627  const ValueType& r_IJ, const ValueType& r_IJ_7);
628  } // namespace ForceField
629 } // namespace CDPL
630 
631 
632 // Implementation
633 // \cond DOC_IMPL_DETAILS
634 
635 template <typename ValueType, typename Iter, typename CoordsArray>
636 ValueType CDPL::ForceField::calcMMFF94BondStretchingEnergy(Iter beg, const Iter& end, const CoordsArray& coords)
637 {
638  return Detail::accumInteractionEnergies<ValueType>(beg, end, coords,
639  static_cast<ValueType (*)(const MMFF94BondStretchingInteraction&, const CoordsArray&)>(
640  &calcMMFF94BondStretchingEnergy<ValueType, CoordsArray>));
641 }
642 
643 template <typename ValueType, typename CoordsArray>
644 ValueType CDPL::ForceField::calcMMFF94BondStretchingEnergy(const MMFF94BondStretchingInteraction& iaction, const CoordsArray& coords)
645 {
646  return calcMMFF94BondStretchingEnergy<ValueType>(coords[iaction.getAtom1Index()], coords[iaction.getAtom2Index()],
647  iaction.getForceConstant(), iaction.getReferenceLength());
648 }
649 
650 template <typename ValueType, typename CoordsVec>
651 ValueType CDPL::ForceField::calcMMFF94BondStretchingEnergy(const CoordsVec& atom1_pos, const CoordsVec& atom2_pos,
652  const ValueType& force_const, const ValueType& ref_length)
653 {
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);
657 
658  return e_b;
659 }
660 
661 template <typename ValueType>
662 ValueType CDPL::ForceField::calcMMFF94BondStretchingEnergy(const ValueType& r_ij, const ValueType& force_const, const ValueType& ref_length)
663 {
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);
667 
668  return e_b;
669 }
670 
671 
672 template <typename ValueType, typename Iter, typename CoordsArray>
673 ValueType CDPL::ForceField::calcMMFF94AngleBendingEnergy(Iter beg, const Iter& end, const CoordsArray& coords)
674 {
675  return Detail::accumInteractionEnergies<ValueType>(beg, end, coords,
676  static_cast<ValueType (*)(const MMFF94AngleBendingInteraction&, const CoordsArray&)>(
677  &calcMMFF94AngleBendingEnergy<ValueType, CoordsArray>));
678 }
679 
680 template <typename ValueType, typename CoordsArray>
681 ValueType CDPL::ForceField::calcMMFF94AngleBendingEnergy(const MMFF94AngleBendingInteraction& iaction, const CoordsArray& coords)
682 {
683  return calcMMFF94AngleBendingEnergy<ValueType>(coords[iaction.getTerminalAtom1Index()], coords[iaction.getCenterAtomIndex()],
684  coords[iaction.getTerminalAtom2Index()], iaction.isLinearAngle(), iaction.getForceConstant(),
685  iaction.getReferenceAngle());
686 }
687 
688 template <typename ValueType, typename CoordsVec>
689 ValueType CDPL::ForceField::calcMMFF94AngleBendingEnergy(const CoordsVec& term_atom1_pos, const CoordsVec& ctr_atom_pos, const CoordsVec& term_atom2_pos,
690  bool linear, const ValueType& force_const, const ValueType& ref_angle)
691 {
692  if (linear)
693  return (ValueType(143.9325) * force_const * (1 + calcBondAngleCos<ValueType>(term_atom1_pos, ctr_atom_pos, term_atom2_pos)));
694 
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);
698 
699  return e_a;
700 }
701 
702 template <typename ValueType, typename CoordsVec>
703 ValueType CDPL::ForceField::calcMMFF94AngleBendingEnergy(const CoordsVec& term_atom1_pos, const CoordsVec& ctr_atom_pos, const CoordsVec& term_atom2_pos,
704  const ValueType& r_ij, const ValueType& r_jk,
705  bool linear, const ValueType& force_const, const ValueType& ref_angle)
706 {
707  if (linear)
708  return (ValueType(143.9325) * force_const * (1 + calcBondAngleCos<ValueType>(term_atom1_pos, ctr_atom_pos, term_atom2_pos, r_ij, r_jk)));
709 
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);
713 
714  return e_a;
715 }
716 
717 
718 template <typename ValueType, typename Iter, typename CoordsArray>
719 ValueType CDPL::ForceField::calcMMFF94StretchBendEnergy(Iter beg, const Iter& end, const CoordsArray& coords)
720 {
721  return Detail::accumInteractionEnergies<ValueType>(beg, end, coords,
722  static_cast<ValueType (*)(const MMFF94StretchBendInteraction&, const CoordsArray&)>(
723  &calcMMFF94StretchBendEnergy<ValueType, CoordsArray>));
724 }
725 
726 template <typename ValueType, typename CoordsArray>
727 ValueType CDPL::ForceField::calcMMFF94StretchBendEnergy(const MMFF94StretchBendInteraction& iaction, const CoordsArray& coords)
728 {
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());
733 }
734 
735 template <typename ValueType, typename CoordsVec>
736 ValueType CDPL::ForceField::calcMMFF94StretchBendEnergy(const CoordsVec& term_atom1_pos, const CoordsVec& ctr_atom_pos, const CoordsVec& term_atom2_pos,
737  const ValueType& ijk_force_const, const ValueType& kji_force_const, const ValueType& ref_angle,
738  const ValueType& ref_length1, const ValueType& ref_length2)
739 {
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);
743 
744  ValueType dr_ij = r_ij - ref_length1;
745  ValueType dr_kj = r_kj - ref_length2;
746  ValueType da_ijk = a_ijk - ref_angle;
747 
748  ValueType e_ab = ValueType(2.51210) * (ijk_force_const * dr_ij + kji_force_const * dr_kj) * da_ijk;
749 
750  return e_ab;
751 }
752 
753 template <typename ValueType, typename CoordsVec>
754 ValueType CDPL::ForceField::calcMMFF94StretchBendEnergy(const CoordsVec& term_atom1_pos, const CoordsVec& ctr_atom_pos, const CoordsVec& term_atom2_pos,
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)
758 {
759  ValueType a_ijk = calcBondAngle(term_atom1_pos, ctr_atom_pos, term_atom2_pos, r_ij, r_jk) * ValueType(180 / M_PI);
760 
761  ValueType dr_ij = r_ij - ref_length1;
762  ValueType dr_kj = r_jk - ref_length2;
763  ValueType da_ijk = a_ijk - ref_angle;
764 
765  ValueType e_ab = ValueType(2.51210) * (ijk_force_const * dr_ij + kji_force_const * dr_kj) * da_ijk;
766 
767  return e_ab;
768 }
769 
770 
771 template <typename ValueType, typename Iter, typename CoordsArray>
772 ValueType CDPL::ForceField::calcMMFF94OutOfPlaneBendingEnergy(Iter beg, const Iter& end, const CoordsArray& coords)
773 {
774  return Detail::accumInteractionEnergies<ValueType>(beg, end, coords,
775  static_cast<ValueType (*)(const MMFF94OutOfPlaneBendingInteraction&, const CoordsArray&)>(
776  &calcMMFF94OutOfPlaneBendingEnergy<ValueType, CoordsArray>));
777 }
778 
779 template <typename ValueType, typename CoordsArray>
780 ValueType CDPL::ForceField::calcMMFF94OutOfPlaneBendingEnergy(const MMFF94OutOfPlaneBendingInteraction& iaction, const CoordsArray& coords)
781 {
782  return calcMMFF94OutOfPlaneBendingEnergy<ValueType>(coords[iaction.getTerminalAtom1Index()], coords[iaction.getCenterAtomIndex()],
783  coords[iaction.getTerminalAtom2Index()], coords[iaction.getOutOfPlaneAtomIndex()],
784  iaction.getForceConstant());
785 }
786 
787 template <typename ValueType, typename CoordsVec>
788 ValueType CDPL::ForceField::calcMMFF94OutOfPlaneBendingEnergy(const CoordsVec& term_atom1_pos, const CoordsVec& ctr_atom_pos, const CoordsVec& term_atom2_pos,
789  const CoordsVec& oop_atom_pos, const ValueType& force_const)
790 {
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;
793 
794  return e_oop;
795 }
796 
797 template <typename ValueType, typename CoordsVec>
798 ValueType CDPL::ForceField::calcMMFF94OutOfPlaneBendingEnergy(const CoordsVec& term_atom1_pos, const CoordsVec& ctr_atom_pos, const CoordsVec& term_atom2_pos,
799  const CoordsVec& oop_atom_pos, const ValueType& r_jl, const ValueType& force_const)
800 {
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;
803 
804  return e_oop;
805 }
806 
807 
808 template <typename ValueType, typename Iter, typename CoordsArray>
809 ValueType CDPL::ForceField::calcMMFF94TorsionEnergy(Iter beg, const Iter& end, const CoordsArray& coords)
810 {
811  return Detail::accumInteractionEnergies<ValueType>(beg, end, coords,
812  static_cast<ValueType (*)(const MMFF94TorsionInteraction&, const CoordsArray&)>(
813  &calcMMFF94TorsionEnergy<ValueType, CoordsArray>));
814 }
815 
816 template <typename ValueType, typename CoordsArray>
817 ValueType CDPL::ForceField::calcMMFF94TorsionEnergy(const MMFF94TorsionInteraction& iaction, const CoordsArray& coords)
818 {
819  return calcMMFF94TorsionEnergy<ValueType>(coords[iaction.getTerminalAtom1Index()], coords[iaction.getCenterAtom1Index()],
820  coords[iaction.getCenterAtom2Index()], coords[iaction.getTerminalAtom2Index()],
821  iaction.getTorsionParameter1(), iaction.getTorsionParameter2(), iaction.getTorsionParameter3());
822 }
823 
824 template <typename ValueType, typename CoordsVec>
825 ValueType CDPL::ForceField::calcMMFF94TorsionEnergy(const CoordsVec& term_atom1_pos, const CoordsVec& ctr_atom1_pos, const CoordsVec& ctr_atom2_pos,
826  const CoordsVec& term_atom2_pos, const ValueType& tor_param1, const ValueType& tor_param2,
827  const ValueType& tor_param3)
828 {
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)));
832 
833  return e_t;
834 }
835 
836 
837 template <typename ValueType, typename Iter, typename CoordsArray>
838 ValueType CDPL::ForceField::calcMMFF94ElectrostaticEnergy(Iter beg, const Iter& end, const CoordsArray& coords)
839 {
840  return Detail::accumInteractionEnergies<ValueType>(beg, end, coords,
841  static_cast<ValueType (*)(const MMFF94ElectrostaticInteraction&, const CoordsArray&)>(
842  &calcMMFF94ElectrostaticEnergy<ValueType, CoordsArray>));
843 }
844 
845 template <typename ValueType, typename CoordsArray>
846 ValueType CDPL::ForceField::calcMMFF94ElectrostaticEnergy(const MMFF94ElectrostaticInteraction& iaction, const CoordsArray& coords)
847 {
848  return calcMMFF94ElectrostaticEnergy<ValueType>(coords[iaction.getAtom1Index()], coords[iaction.getAtom2Index()],
849  iaction.getAtom1Charge(), iaction.getAtom2Charge(), iaction.getScalingFactor(),
850  iaction.getDielectricConstant(), iaction.getDistanceExponent());
851 }
852 
853 template <typename ValueType, typename CoordsVec>
854 ValueType CDPL::ForceField::calcMMFF94ElectrostaticEnergy(const CoordsVec& atom1_pos, const CoordsVec& atom2_pos, const ValueType& atom1_chg,
855  const ValueType& atom2_chg, const ValueType& scale_fact, const ValueType& de_const,
856  const ValueType& dist_expo)
857 {
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);
860 
861  return e_q;
862 }
863 
864 template <typename ValueType>
865 ValueType CDPL::ForceField::calcMMFF94ElectrostaticEnergy(const ValueType& r_ij, const ValueType& atom1_chg, const ValueType& atom2_chg,
866  const ValueType& scale_fact, const ValueType& de_const, const ValueType& dist_expo)
867 {
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);
870 
871  return e_q;
872 }
873 
874 
875 template <typename ValueType, typename Iter, typename CoordsArray>
876 ValueType CDPL::ForceField::calcMMFF94VanDerWaalsEnergy(Iter beg, const Iter& end, const CoordsArray& coords)
877 {
878  return Detail::accumInteractionEnergies<ValueType>(beg, end, coords,
879  static_cast<ValueType (*)(const MMFF94VanDerWaalsInteraction&, const CoordsArray&)>(
880  &calcMMFF94VanDerWaalsEnergy<ValueType, CoordsArray>));
881 }
882 
883 template <typename ValueType, typename CoordsArray>
884 ValueType CDPL::ForceField::calcMMFF94VanDerWaalsEnergy(const MMFF94VanDerWaalsInteraction& iaction, const CoordsArray& coords)
885 {
886  return calcMMFF94VanDerWaalsEnergy<ValueType>(coords[iaction.getAtom1Index()], coords[iaction.getAtom2Index()],
887  iaction.getEIJ(), iaction.getRIJ(), iaction.getRIJPow7());
888 }
889 
890 template <typename ValueType, typename CoordsVec>
891 ValueType CDPL::ForceField::calcMMFF94VanDerWaalsEnergy(const CoordsVec& atom1_pos, const CoordsVec& atom2_pos, const ValueType& e_IJ,
892  const ValueType& r_IJ, const ValueType& r_IJ_7)
893 {
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;
897 
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;
901 
902  ValueType e_vdw = e_IJ * tmp_7 * (ValueType(1.12) * r_IJ_7 / (r_ij_7 + ValueType(0.12) * r_IJ_7) - 2);
903 
904  return e_vdw;
905 }
906 
907 template <typename ValueType>
908 ValueType CDPL::ForceField::calcMMFF94VanDerWaalsEnergy(const ValueType& r_ij, const ValueType& e_IJ,
909  const ValueType& r_IJ, const ValueType& r_IJ_7)
910 {
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;
913 
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;
917 
918  ValueType e_vdw = e_IJ * tmp_7 * (ValueType(1.12) * r_IJ_7 / (r_ij_7 + ValueType(0.12) * r_IJ_7) - 2);
919 
920  return e_vdw;
921 }
922 
923 // \endcond
924 
925 #endif // CDPL_FORCEFIELD_MMFF94ENERGYFUNCTIONS_HPP
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.