8 #ifndef NDDO_MULTIPOLE_MULTIPOLEMULTIPOLETERM_H
9 #define NDDO_MULTIPOLE_MULTIPOLEMULTIPOLETERM_H
45 : f_(f), x1_(x1), x2_(x2), y1_(y1), y2_(y2), z1_(z1), z2_(z2) {
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);
75 template<Utils::DerivativeOrder O>
76 Utils::AutomaticDifferentiation::Value1DType<O>
expr(
double f,
double dz,
double invsqrt)
const;
80 double x1_, x2_, y1_, y2_, z1_, z2_;
84 inline Utils::AutomaticDifferentiation::Value1DType<Utils::DerivativeOrder::Zero>
85 MultipoleMultipoleTerm::expr<Utils::DerivativeOrder::Zero>(
double f,
double ,
double invsqrt)
const {
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};
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)};
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