Scine::Sparrow  5.0.0
Library for fast and agile quantum chemical calculations with semiempirical methods.
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Pages
MultipoleMultipoleTerm.h
Go to the documentation of this file.
1 
8 #ifndef NDDO_MULTIPOLE_MULTIPOLEMULTIPOLETERM_H
9 #define NDDO_MULTIPOLE_MULTIPOLEMULTIPOLETERM_H
10 
12 
13 namespace Scine {
14 namespace Sparrow {
15 
16 namespace nddo {
17 
18 namespace multipole {
19 
33  public:
44  MultipoleMultipoleTerm(double f, double x1, double y1, double z1, double x2, double y2, double z2)
45  : f_(f), x1_(x1), x2_(x2), y1_(y1), y2_(y2), z1_(z1), z2_(z2) {
46  }
57  template<Utils::DerivativeOrder O>
58  Utils::AutomaticDifferentiation::Value1DType<O> calculate(double R, double D1, double d2, double squaredRhos) const {
59  double dx = d2 * x2_ - D1 * x1_;
60  double dy = d2 * y2_ - D1 * y1_;
61  double dz = R + d2 * z2_ - D1 * z1_;
62  double invsqrt = 1.0 / std::sqrt(dx * dx + dy * dy + dz * dz + squaredRhos);
63  return expr<O>(f_, dz, invsqrt);
64  }
75  template<Utils::DerivativeOrder O>
76  Utils::AutomaticDifferentiation::Value1DType<O> expr(double f, double dz, double invsqrt) const;
77 
78  private:
79  double f_;
80  double x1_, x2_, y1_, y2_, z1_, z2_;
81 };
82 
83 template<>
84 inline Utils::AutomaticDifferentiation::Value1DType<Utils::DerivativeOrder::Zero>
85 MultipoleMultipoleTerm::expr<Utils::DerivativeOrder::Zero>(double f, double /*dz*/, double invsqrt) const {
86  return f * invsqrt;
87 }
88 template<>
89 inline Utils::AutomaticDifferentiation::Value1DType<Utils::DerivativeOrder::One>
90 MultipoleMultipoleTerm::expr<Utils::DerivativeOrder::One>(double f, double dz, double invsqrt) const {
91  return {f * invsqrt, -dz * f * invsqrt * invsqrt * invsqrt};
92 }
93 template<>
94 inline Utils::AutomaticDifferentiation::Value1DType<Utils::DerivativeOrder::Two>
95 MultipoleMultipoleTerm::expr<Utils::DerivativeOrder::Two>(double f, double dz, double invsqrt) const {
96  double inv3 = invsqrt * invsqrt * invsqrt;
97  return {f * invsqrt, -dz * f * inv3, f * inv3 * (3 * dz * dz * invsqrt * invsqrt - 1)};
98 }
99 
100 } // namespace multipole
101 
102 } // namespace nddo
103 
104 } // namespace Sparrow
105 } // namespace Scine
106 #endif // NDDO_MULTIPOLE_MULTIPOLEMULTIPOLETERM_H
Utils::AutomaticDifferentiation::Value1DType< O > expr(double f, double dz, double invsqrt) const
returns the values up to the O-th derivative order with respect to the inter-multipole distance ...
MultipoleMultipoleTerm(double f, double x1, double y1, double z1, double x2, double y2, double z2)
constructor, sets the coordinates of the two point charges and the value of the two charges multiplie...
Definition: MultipoleMultipoleTerm.h:44
Utils::AutomaticDifferentiation::Value1DType< O > calculate(double R, double D1, double d2, double squaredRhos) const
calculates the interaction energy between two charges up to a certain derivative
Definition: MultipoleMultipoleTerm.h:58
This header-only class defines an object for the calculation of an interaction between two charges in...
Definition: MultipoleMultipoleTerm.h:32