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 
95  template <typename ValueType, typename CoordsVec>
96  ValueType calcMMFF94BondStretchingEnergy(const CoordsVec& atom1_pos, const CoordsVec& atom2_pos,
97  const ValueType& force_const, const ValueType& ref_length);
98 
121  template <typename ValueType>
122  ValueType calcMMFF94BondStretchingEnergy(const ValueType& r_ij, const ValueType& force_const, const ValueType& ref_length);
123 
124 
135  template <typename ValueType, typename Iter, typename CoordsArray>
136  ValueType calcMMFF94AngleBendingEnergy(Iter beg, const Iter& end, const CoordsArray& coords);
137 
146  template <typename ValueType, typename CoordsArray>
147  ValueType calcMMFF94AngleBendingEnergy(const MMFF94AngleBendingInteraction& iaction, const CoordsArray& coords);
148 
177  template <typename ValueType, typename CoordsVec>
178  ValueType calcMMFF94AngleBendingEnergy(const CoordsVec& term_atom1_pos, const CoordsVec& ctr_atom_pos, const CoordsVec& term_atom2_pos,
179  bool linear, const ValueType& force_const, const ValueType& ref_angle);
180 
211  template <typename ValueType, typename CoordsVec>
212  ValueType calcMMFF94AngleBendingEnergy(const CoordsVec& term_atom1_pos, const CoordsVec& ctr_atom_pos, const CoordsVec& term_atom2_pos,
213  const ValueType& r_ij, const ValueType& r_jk,
214  bool linear, const ValueType& force_const, const ValueType& ref_angle);
215 
216 
227  template <typename ValueType, typename Iter, typename CoordsArray>
228  ValueType calcMMFF94StretchBendEnergy(Iter beg, const Iter& end, const CoordsArray& coords);
229 
238  template <typename ValueType, typename CoordsArray>
239  ValueType calcMMFF94StretchBendEnergy(const MMFF94StretchBendInteraction& iaction, const CoordsArray& coords);
240 
271  template <typename ValueType, typename CoordsVec>
272  ValueType calcMMFF94StretchBendEnergy(const CoordsVec& term_atom1_pos, const CoordsVec& ctr_atom_pos, const CoordsVec& term_atom2_pos,
273  const ValueType& ijk_force_const, const ValueType& kji_force_const, const ValueType& ref_angle,
274  const ValueType& ref_length1, const ValueType& ref_length2);
275 
308  template <typename ValueType, typename CoordsVec>
309  ValueType calcMMFF94StretchBendEnergy(const CoordsVec& term_atom1_pos, const CoordsVec& ctr_atom_pos, const CoordsVec& term_atom2_pos,
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);
313 
314 
325  template <typename ValueType, typename Iter, typename CoordsArray>
326  ValueType calcMMFF94OutOfPlaneBendingEnergy(Iter beg, const Iter& end, const CoordsArray& coords);
327 
336  template <typename ValueType, typename CoordsArray>
337  ValueType calcMMFF94OutOfPlaneBendingEnergy(const MMFF94OutOfPlaneBendingInteraction& iaction, const CoordsArray& coords);
338 
356  template <typename ValueType, typename CoordsVec>
357  ValueType calcMMFF94OutOfPlaneBendingEnergy(const CoordsVec& term_atom1_pos, const CoordsVec& ctr_atom_pos, const CoordsVec& term_atom2_pos,
358  const CoordsVec& oop_atom_pos, const ValueType& force_const);
359 
378  template <typename ValueType, typename CoordsVec>
379  ValueType calcMMFF94OutOfPlaneBendingEnergy(const CoordsVec& term_atom1_pos, const CoordsVec& ctr_atom_pos, const CoordsVec& term_atom2_pos,
380  const CoordsVec& oop_atom_pos, const ValueType& r_jl, const ValueType& force_const);
381 
382 
393  template <typename ValueType, typename Iter, typename CoordsArray>
394  ValueType calcMMFF94TorsionEnergy(Iter beg, const Iter& end, const CoordsArray& coords);
395 
404  template <typename ValueType, typename CoordsArray>
405  ValueType calcMMFF94TorsionEnergy(const MMFF94TorsionInteraction& iaction, const CoordsArray& coords);
406 
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);
432 
433 
444  template <typename ValueType, typename Iter, typename CoordsArray>
445  ValueType calcMMFF94ElectrostaticEnergy(Iter beg, const Iter& end, const CoordsArray& coords);
446 
455  template <typename ValueType, typename CoordsArray>
456  ValueType calcMMFF94ElectrostaticEnergy(const MMFF94ElectrostaticInteraction& iaction, const CoordsArray& coords);
457 
484  template <typename ValueType, typename CoordsVec>
485  ValueType calcMMFF94ElectrostaticEnergy(const CoordsVec& atom1_pos, const CoordsVec& atom2_pos, const ValueType& atom1_chg,
486  const ValueType& atom2_chg, const ValueType& scale_fact, const ValueType& de_const,
487  const ValueType& dist_expo);
488 
514  template <typename ValueType>
515  ValueType calcMMFF94ElectrostaticEnergy(const ValueType& r_ij, const ValueType& atom1_chg, const ValueType& atom2_chg,
516  const ValueType& scale_fact, const ValueType& de_const, const ValueType& dist_expo);
517 
518 
529  template <typename ValueType, typename Iter, typename CoordsArray>
530  ValueType calcMMFF94VanDerWaalsEnergy(Iter beg, const Iter& end, const CoordsArray& coords);
531 
540  template <typename ValueType, typename CoordsArray>
541  ValueType calcMMFF94VanDerWaalsEnergy(const MMFF94VanDerWaalsInteraction& iaction, const CoordsArray& coords);
542 
578  template <typename ValueType, typename CoordsVec>
579  ValueType calcMMFF94VanDerWaalsEnergy(const CoordsVec& atom1_pos, const CoordsVec& atom2_pos, const ValueType& e_IJ,
580  const ValueType& r_IJ, const ValueType& r_IJ_7);
581 
616  template <typename ValueType>
617  ValueType calcMMFF94VanDerWaalsEnergy(const ValueType& r_ij, const ValueType& e_IJ,
618  const ValueType& r_IJ, const ValueType& r_IJ_7);
619  } // namespace ForceField
620 } // namespace CDPL
621 
622 
623 // Implementation
624 // \cond DOC_IMPL_DETAILS
625 
626 template <typename ValueType, typename Iter, typename CoordsArray>
627 ValueType CDPL::ForceField::calcMMFF94BondStretchingEnergy(Iter beg, const Iter& end, const CoordsArray& coords)
628 {
629  return Detail::accumInteractionEnergies<ValueType>(beg, end, coords,
630  static_cast<ValueType (*)(const MMFF94BondStretchingInteraction&, const CoordsArray&)>(
631  &calcMMFF94BondStretchingEnergy<ValueType, CoordsArray>));
632 }
633 
634 template <typename ValueType, typename CoordsArray>
635 ValueType CDPL::ForceField::calcMMFF94BondStretchingEnergy(const MMFF94BondStretchingInteraction& iaction, const CoordsArray& coords)
636 {
637  return calcMMFF94BondStretchingEnergy<ValueType>(coords[iaction.getAtom1Index()], coords[iaction.getAtom2Index()],
638  iaction.getForceConstant(), iaction.getReferenceLength());
639 }
640 
641 template <typename ValueType, typename CoordsVec>
642 ValueType CDPL::ForceField::calcMMFF94BondStretchingEnergy(const CoordsVec& atom1_pos, const CoordsVec& atom2_pos,
643  const ValueType& force_const, const ValueType& ref_length)
644 {
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);
648 
649  return e_b;
650 }
651 
652 template <typename ValueType>
653 ValueType CDPL::ForceField::calcMMFF94BondStretchingEnergy(const ValueType& r_ij, const ValueType& force_const, const ValueType& ref_length)
654 {
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);
658 
659  return e_b;
660 }
661 
662 
663 template <typename ValueType, typename Iter, typename CoordsArray>
664 ValueType CDPL::ForceField::calcMMFF94AngleBendingEnergy(Iter beg, const Iter& end, const CoordsArray& coords)
665 {
666  return Detail::accumInteractionEnergies<ValueType>(beg, end, coords,
667  static_cast<ValueType (*)(const MMFF94AngleBendingInteraction&, const CoordsArray&)>(
668  &calcMMFF94AngleBendingEnergy<ValueType, CoordsArray>));
669 }
670 
671 template <typename ValueType, typename CoordsArray>
672 ValueType CDPL::ForceField::calcMMFF94AngleBendingEnergy(const MMFF94AngleBendingInteraction& iaction, const CoordsArray& coords)
673 {
674  return calcMMFF94AngleBendingEnergy<ValueType>(coords[iaction.getTerminalAtom1Index()], coords[iaction.getCenterAtomIndex()],
675  coords[iaction.getTerminalAtom2Index()], iaction.isLinearAngle(), iaction.getForceConstant(),
676  iaction.getReferenceAngle());
677 }
678 
679 template <typename ValueType, typename CoordsVec>
680 ValueType CDPL::ForceField::calcMMFF94AngleBendingEnergy(const CoordsVec& term_atom1_pos, const CoordsVec& ctr_atom_pos, const CoordsVec& term_atom2_pos,
681  bool linear, const ValueType& force_const, const ValueType& ref_angle)
682 {
683  if (linear)
684  return (ValueType(143.9325) * force_const * (1 + calcBondAngleCos<ValueType>(term_atom1_pos, ctr_atom_pos, term_atom2_pos)));
685 
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);
689 
690  return e_a;
691 }
692 
693 template <typename ValueType, typename CoordsVec>
694 ValueType CDPL::ForceField::calcMMFF94AngleBendingEnergy(const CoordsVec& term_atom1_pos, const CoordsVec& ctr_atom_pos, const CoordsVec& term_atom2_pos,
695  const ValueType& r_ij, const ValueType& r_jk,
696  bool linear, const ValueType& force_const, const ValueType& ref_angle)
697 {
698  if (linear)
699  return (ValueType(143.9325) * force_const * (1 + calcBondAngleCos<ValueType>(term_atom1_pos, ctr_atom_pos, term_atom2_pos, r_ij, r_jk)));
700 
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);
704 
705  return e_a;
706 }
707 
708 
709 template <typename ValueType, typename Iter, typename CoordsArray>
710 ValueType CDPL::ForceField::calcMMFF94StretchBendEnergy(Iter beg, const Iter& end, const CoordsArray& coords)
711 {
712  return Detail::accumInteractionEnergies<ValueType>(beg, end, coords,
713  static_cast<ValueType (*)(const MMFF94StretchBendInteraction&, const CoordsArray&)>(
714  &calcMMFF94StretchBendEnergy<ValueType, CoordsArray>));
715 }
716 
717 template <typename ValueType, typename CoordsArray>
718 ValueType CDPL::ForceField::calcMMFF94StretchBendEnergy(const MMFF94StretchBendInteraction& iaction, const CoordsArray& coords)
719 {
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());
724 }
725 
726 template <typename ValueType, typename CoordsVec>
727 ValueType CDPL::ForceField::calcMMFF94StretchBendEnergy(const CoordsVec& term_atom1_pos, const CoordsVec& ctr_atom_pos, const CoordsVec& term_atom2_pos,
728  const ValueType& ijk_force_const, const ValueType& kji_force_const, const ValueType& ref_angle,
729  const ValueType& ref_length1, const ValueType& ref_length2)
730 {
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);
734 
735  ValueType dr_ij = r_ij - ref_length1;
736  ValueType dr_kj = r_kj - ref_length2;
737  ValueType da_ijk = a_ijk - ref_angle;
738 
739  ValueType e_ab = ValueType(2.51210) * (ijk_force_const * dr_ij + kji_force_const * dr_kj) * da_ijk;
740 
741  return e_ab;
742 }
743 
744 template <typename ValueType, typename CoordsVec>
745 ValueType CDPL::ForceField::calcMMFF94StretchBendEnergy(const CoordsVec& term_atom1_pos, const CoordsVec& ctr_atom_pos, const CoordsVec& term_atom2_pos,
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)
749 {
750  ValueType a_ijk = calcBondAngle(term_atom1_pos, ctr_atom_pos, term_atom2_pos, r_ij, r_jk) * ValueType(180 / M_PI);
751 
752  ValueType dr_ij = r_ij - ref_length1;
753  ValueType dr_kj = r_jk - ref_length2;
754  ValueType da_ijk = a_ijk - ref_angle;
755 
756  ValueType e_ab = ValueType(2.51210) * (ijk_force_const * dr_ij + kji_force_const * dr_kj) * da_ijk;
757 
758  return e_ab;
759 }
760 
761 
762 template <typename ValueType, typename Iter, typename CoordsArray>
763 ValueType CDPL::ForceField::calcMMFF94OutOfPlaneBendingEnergy(Iter beg, const Iter& end, const CoordsArray& coords)
764 {
765  return Detail::accumInteractionEnergies<ValueType>(beg, end, coords,
766  static_cast<ValueType (*)(const MMFF94OutOfPlaneBendingInteraction&, const CoordsArray&)>(
767  &calcMMFF94OutOfPlaneBendingEnergy<ValueType, CoordsArray>));
768 }
769 
770 template <typename ValueType, typename CoordsArray>
771 ValueType CDPL::ForceField::calcMMFF94OutOfPlaneBendingEnergy(const MMFF94OutOfPlaneBendingInteraction& iaction, const CoordsArray& coords)
772 {
773  return calcMMFF94OutOfPlaneBendingEnergy<ValueType>(coords[iaction.getTerminalAtom1Index()], coords[iaction.getCenterAtomIndex()],
774  coords[iaction.getTerminalAtom2Index()], coords[iaction.getOutOfPlaneAtomIndex()],
775  iaction.getForceConstant());
776 }
777 
778 template <typename ValueType, typename CoordsVec>
779 ValueType CDPL::ForceField::calcMMFF94OutOfPlaneBendingEnergy(const CoordsVec& term_atom1_pos, const CoordsVec& ctr_atom_pos, const CoordsVec& term_atom2_pos,
780  const CoordsVec& oop_atom_pos, const ValueType& force_const)
781 {
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;
784 
785  return e_oop;
786 }
787 
788 template <typename ValueType, typename CoordsVec>
789 ValueType CDPL::ForceField::calcMMFF94OutOfPlaneBendingEnergy(const CoordsVec& term_atom1_pos, const CoordsVec& ctr_atom_pos, const CoordsVec& term_atom2_pos,
790  const CoordsVec& oop_atom_pos, const ValueType& r_jl, const ValueType& force_const)
791 {
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;
794 
795  return e_oop;
796 }
797 
798 
799 template <typename ValueType, typename Iter, typename CoordsArray>
800 ValueType CDPL::ForceField::calcMMFF94TorsionEnergy(Iter beg, const Iter& end, const CoordsArray& coords)
801 {
802  return Detail::accumInteractionEnergies<ValueType>(beg, end, coords,
803  static_cast<ValueType (*)(const MMFF94TorsionInteraction&, const CoordsArray&)>(
804  &calcMMFF94TorsionEnergy<ValueType, CoordsArray>));
805 }
806 
807 template <typename ValueType, typename CoordsArray>
808 ValueType CDPL::ForceField::calcMMFF94TorsionEnergy(const MMFF94TorsionInteraction& iaction, const CoordsArray& coords)
809 {
810  return calcMMFF94TorsionEnergy<ValueType>(coords[iaction.getTerminalAtom1Index()], coords[iaction.getCenterAtom1Index()],
811  coords[iaction.getCenterAtom2Index()], coords[iaction.getTerminalAtom2Index()],
812  iaction.getTorsionParameter1(), iaction.getTorsionParameter2(), iaction.getTorsionParameter3());
813 }
814 
815 template <typename ValueType, typename CoordsVec>
816 ValueType CDPL::ForceField::calcMMFF94TorsionEnergy(const CoordsVec& term_atom1_pos, const CoordsVec& ctr_atom1_pos, const CoordsVec& ctr_atom2_pos,
817  const CoordsVec& term_atom2_pos, const ValueType& tor_param1, const ValueType& tor_param2,
818  const ValueType& tor_param3)
819 {
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)));
823 
824  return e_t;
825 }
826 
827 
828 template <typename ValueType, typename Iter, typename CoordsArray>
829 ValueType CDPL::ForceField::calcMMFF94ElectrostaticEnergy(Iter beg, const Iter& end, const CoordsArray& coords)
830 {
831  return Detail::accumInteractionEnergies<ValueType>(beg, end, coords,
832  static_cast<ValueType (*)(const MMFF94ElectrostaticInteraction&, const CoordsArray&)>(
833  &calcMMFF94ElectrostaticEnergy<ValueType, CoordsArray>));
834 }
835 
836 template <typename ValueType, typename CoordsArray>
837 ValueType CDPL::ForceField::calcMMFF94ElectrostaticEnergy(const MMFF94ElectrostaticInteraction& iaction, const CoordsArray& coords)
838 {
839  return calcMMFF94ElectrostaticEnergy<ValueType>(coords[iaction.getAtom1Index()], coords[iaction.getAtom2Index()],
840  iaction.getAtom1Charge(), iaction.getAtom2Charge(), iaction.getScalingFactor(),
841  iaction.getDielectricConstant(), iaction.getDistanceExponent());
842 }
843 
844 template <typename ValueType, typename CoordsVec>
845 ValueType CDPL::ForceField::calcMMFF94ElectrostaticEnergy(const CoordsVec& atom1_pos, const CoordsVec& atom2_pos, const ValueType& atom1_chg,
846  const ValueType& atom2_chg, const ValueType& scale_fact, const ValueType& de_const,
847  const ValueType& dist_expo)
848 {
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);
851 
852  return e_q;
853 }
854 
855 template <typename ValueType>
856 ValueType CDPL::ForceField::calcMMFF94ElectrostaticEnergy(const ValueType& r_ij, const ValueType& atom1_chg, const ValueType& atom2_chg,
857  const ValueType& scale_fact, const ValueType& de_const, const ValueType& dist_expo)
858 {
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);
861 
862  return e_q;
863 }
864 
865 
866 template <typename ValueType, typename Iter, typename CoordsArray>
867 ValueType CDPL::ForceField::calcMMFF94VanDerWaalsEnergy(Iter beg, const Iter& end, const CoordsArray& coords)
868 {
869  return Detail::accumInteractionEnergies<ValueType>(beg, end, coords,
870  static_cast<ValueType (*)(const MMFF94VanDerWaalsInteraction&, const CoordsArray&)>(
871  &calcMMFF94VanDerWaalsEnergy<ValueType, CoordsArray>));
872 }
873 
874 template <typename ValueType, typename CoordsArray>
875 ValueType CDPL::ForceField::calcMMFF94VanDerWaalsEnergy(const MMFF94VanDerWaalsInteraction& iaction, const CoordsArray& coords)
876 {
877  return calcMMFF94VanDerWaalsEnergy<ValueType>(coords[iaction.getAtom1Index()], coords[iaction.getAtom2Index()],
878  iaction.getEIJ(), iaction.getRIJ(), iaction.getRIJPow7());
879 }
880 
881 template <typename ValueType, typename CoordsVec>
882 ValueType CDPL::ForceField::calcMMFF94VanDerWaalsEnergy(const CoordsVec& atom1_pos, const CoordsVec& atom2_pos, const ValueType& e_IJ,
883  const ValueType& r_IJ, const ValueType& r_IJ_7)
884 {
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;
888 
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;
892 
893  ValueType e_vdw = e_IJ * tmp_7 * (ValueType(1.12) * r_IJ_7 / (r_ij_7 + ValueType(0.12) * r_IJ_7) - 2);
894 
895  return e_vdw;
896 }
897 
898 template <typename ValueType>
899 ValueType CDPL::ForceField::calcMMFF94VanDerWaalsEnergy(const ValueType& r_ij, const ValueType& e_IJ,
900  const ValueType& r_IJ, const ValueType& r_IJ_7)
901 {
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;
904 
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;
908 
909  ValueType e_vdw = e_IJ * tmp_7 * (ValueType(1.12) * r_IJ_7 / (r_ij_7 + ValueType(0.12) * r_IJ_7) - 2);
910 
911  return e_vdw;
912 }
913 
914 // \endcond
915 
916 #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: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.