8 #ifndef SPARROW_MNDOPAIRWISEREPULSION_H
9 #define SPARROW_MNDOPAIRWISEREPULSION_H
35 void calculate(
const Eigen::Ref<Eigen::Vector3d>& R, Utils::DerivativeOrder order);
37 double getRepulsionEnergy()
const {
return repulsionEnergy_; }
39 Eigen::RowVector3d getRepulsionGradient()
const {
return repulsionGradient_; }
42 template <Utils::Derivative O> Utils::AutomaticDifferentiation::DerivativeType<O> getDerivative()
const;
44 template <Utils::DerivativeOrder O> Utils::AutomaticDifferentiation::Value1DType<O> calculateRepulsion(
double R)
const;
45 template <Utils::DerivativeOrder O> Utils::AutomaticDifferentiation::Value1DType<O> baseTerm(
double R)
const;
46 template <Utils::DerivativeOrder O> Utils::AutomaticDifferentiation::Value1DType<O> parenthesisValue(
double R)
const;
47 template <Utils::DerivativeOrder O> Utils::AutomaticDifferentiation::Value1DType<O> standardParenthesis(
double R)
const;
50 template <Utils::DerivativeOrder O> Utils::AutomaticDifferentiation::Value1DType<O> radius(
double R)
const;
51 template <Utils::DerivativeOrder O> Utils::AutomaticDifferentiation::Value1DType<O> integral(
double R)
const;
56 double repulsionEnergy_;
57 Eigen::RowVector3d repulsionGradient_;
62 template<Utils::DerivativeOrder O>
63 Utils::AutomaticDifferentiation::Value1DType<O> MNDOPairwiseRepulsion::calculateRepulsion(
double R)
const {
64 return baseTerm<O>(R);
67 template<Utils::DerivativeOrder O>
68 Utils::AutomaticDifferentiation::Value1DType<O> MNDOPairwiseRepulsion::baseTerm(
double R)
const {
69 auto ssssIntegral = integral<O>(R);
70 return pA_.coreCharge() * pB_.coreCharge() * ssssIntegral * parenthesisValue<O>(R);
73 template<Utils::DerivativeOrder O>
74 Utils::AutomaticDifferentiation::Value1DType<O> MNDOPairwiseRepulsion::parenthesisValue(
double R)
const {
75 return standardParenthesis<O>(R);
78 template<Utils::DerivativeOrder O>
79 Utils::AutomaticDifferentiation::Value1DType<O> MNDOPairwiseRepulsion::standardParenthesis(
double R)
const {
80 auto radiusDeriv = radius<O>(R);
82 if (pA_.element() == Utils::ElementType::H &&
83 (pB_.element() == Utils::ElementType::N || pB_.element() == Utils::ElementType::O)) {
84 return res + exp(-pA_.alpha() * radiusDeriv) +
85 radiusDeriv * Utils::Constants::angstrom_per_bohr * exp(-pB_.alpha() * radiusDeriv);
87 else if (pB_.element() == Utils::ElementType::H &&
88 (pA_.element() == Utils::ElementType::N || pA_.element() == Utils::ElementType::O)) {
89 return res + radiusDeriv * Utils::Constants::angstrom_per_bohr * exp(-pA_.alpha() * radiusDeriv) +
90 exp(-pB_.alpha() * radiusDeriv);
93 return res + exp(-pA_.alpha() * radiusDeriv) + exp(-pB_.alpha() * radiusDeriv);
97 template<Utils::DerivativeOrder O>
98 inline Utils::AutomaticDifferentiation::Value1DType<O> MNDOPairwiseRepulsion::radius(
double R)
const {
99 return Utils::AutomaticDifferentiation::variableWithUnitDerivative<O>(R);
103 inline Utils::AutomaticDifferentiation::Value1DType<Utils::DerivativeOrder::Zero>
104 MNDOPairwiseRepulsion::integral<Utils::DerivativeOrder::Zero>(
double R)
const {
105 double pSum = pA_.pCore() + pB_.pCore();
106 double igr = 1.0 / std::sqrt(R * R + pSum * pSum);
110 inline Utils::AutomaticDifferentiation::Value1DType<Utils::DerivativeOrder::One>
111 MNDOPairwiseRepulsion::integral<Utils::DerivativeOrder::One>(
double R)
const {
112 double pSum = pA_.pCore() + pB_.pCore();
113 double igr = 1.0 / std::sqrt(R * R + pSum * pSum);
114 Utils::AutomaticDifferentiation::First1D integralD(igr, -igr * igr * igr * R);
118 inline Utils::AutomaticDifferentiation::Value1DType<Utils::DerivativeOrder::Two>
119 MNDOPairwiseRepulsion::integral<Utils::DerivativeOrder::Two>(
double R)
const {
120 double pSum = pA_.pCore() + pB_.pCore();
121 double igr = 1.0 / std::sqrt(R * R + pSum * pSum);
122 double igr3 = igr * igr * igr;
123 Utils::AutomaticDifferentiation::Second1D integralD(igr, -igr3 * R, igr3 * igr * igr * (2 * R * R - pSum * pSum));
127 inline Utils::AutomaticDifferentiation::DerivativeType<Utils::Derivative::First>
128 MNDOPairwiseRepulsion::getDerivative<Utils::Derivative::First>()
const {
129 return getRepulsionGradient();
132 inline Utils::AutomaticDifferentiation::DerivativeType<Utils::Derivative::SecondAtomic>
133 MNDOPairwiseRepulsion::getDerivative<Utils::Derivative::SecondAtomic>()
const {
134 return getRepulsionHessian();
137 inline Utils::AutomaticDifferentiation::DerivativeType<Utils::Derivative::SecondFull>
138 MNDOPairwiseRepulsion::getDerivative<Utils::Derivative::SecondFull>()
const {
139 return getRepulsionHessian();
146 #endif // SPARROW_PAIRWISEREPULSION_H
This class calculates the core-core repulsion between two atoms.
Definition: MNDOPairwiseRepulsion.h:31
Definition: AtomicParameters.h:29