JDFTx  1.5.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
SphericalHarmonics.h File Reference
#include <core/vector3.h>

Classes

struct  YlmProdTerm
 Term in real spherical harmonic expansion of a product of two real spherical harmonics. More...
 

Namespaces

 YlmInternal
 

Macros

#define X2   double x2 = x*x;
 
#define Y2   double y2 = y*y;
 
#define Z2   double z2 = z*z;
 
#define X2Y2   double x2y2 = x*x + y*y;
 
#define X2Y2i   X2 Y2 double x2y2 = x2 + y2;
 
#define DECLARE_Ylm(lm, code)   template<> __hostanddev__ double Ylm<lm>(double x, double y, double z) { code; }
 
#define SwitchTemplate_lm(l, m, fTemplate, argList)
 Switch a function templated over l,m for all supported l,m with parenthesis enclosed argument list argList.
 
#define ADD(l, m, coeff)   result.push_back(YlmProdTerm(l,m,coeff))
 

Functions

double bessel_jl (int l, double x)
 Spherical bessel function.
 
template<int lm>
__hostanddev__ double YlmInternal::Ylm (double x, double y, double z)
 
 YlmInternal::DECLARE_Ylm (-2, return 0.) DECLARE_Ylm(-1
 
return YlmInternal::DECLARE_Ylm (8, return 0.5462742152960396 *(x-y)*(x+y)) DECLARE_Ylm(12
 
return return *z **z *z *x *x y *y YlmInternal::DECLARE_Ylm (14, return 1.445305721320277 *(x-y)*(x+y)*z) DECLARE_Ylm(16
 
return return *z **z *z *x *x
y *y return *x *y *x y *x y 
YlmInternal::DECLARE_Ylm (19, return-0.6690465435572892 *y *z *(3.*(x *x+y *y)-4.*z *z)) DECLARE_Ylm(20
 
return return *z **z *z *x *x
y *y return *x *y *x y *x y
X2Y2 Z2 return **x2y2 *x2y2
*z2 *z2 *z2 
YlmInternal::DECLARE_Ylm (21, return-0.6690465435572892 *x *z *(3.*(x *x+y *y)-4.*z *z)) DECLARE_Ylm(22
 
return return *z **z *z *x *x
y *y return *x *y *x y *x y
X2Y2 Z2 return **x2y2 *x2y2
*z2 *z2 *z2 X2 Y2 return *x2
y2 *x2 y2 *z *z 
YlmInternal::DECLARE_Ylm (24, X2 Y2 return 0.6258357354491761 *(x2 *(x2-6.*y2)+y2 *y2)) DECLARE_Ylm(25
 
return return *z **z *z *x *x
y *y return *x *y *x y *x y
X2Y2 Z2 return **x2y2 *x2y2
*z2 *z2 *z2 X2 Y2 return *x2
y2 *x2 y2 *z *z X2 Y2 return
*y **x2 *x2 *y2 y2 *y2 
YlmInternal::DECLARE_Ylm (26, return 8.302649259524166 *x *y *z *(x-y)*(x+y)) DECLARE_Ylm(27
 
return return *z **z *z *x *x
y *y return *x *y *x y *x y
X2Y2 Z2 return **x2y2 *x2y2
*z2 *z2 *z2 X2 Y2 return *x2
y2 *x2 y2 *z *z X2 Y2 return
*y **x2 *x2 *y2 y2 *y2 X2 Y2
return *y *y2 *x2 *x2 y2 *z *z 
YlmInternal::DECLARE_Ylm (29, X2Y2 Z2 return 0.45294665119569694 *y *(x2y2 *(x2y2-12.*z2)+8.*z2 *z2)) DECLARE_Ylm(30
 
return return *z **z *z *x *x
y *y return *x *y *x y *x y
X2Y2 Z2 return **x2y2 *x2y2
*z2 *z2 *z2 X2 Y2 return *x2
y2 *x2 y2 *z *z X2 Y2 return
*y **x2 *x2 *y2 y2 *y2 X2 Y2
return *y *y2 *x2 *x2 y2 *z *z
X2Y2 Z2 return *z **x2y2 *x2y2
*z2 **x2y2 z2 
YlmInternal::DECLARE_Ylm (31, X2Y2 Z2 return 0.45294665119569694 *x *(x2y2 *(x2y2-12.*z2)+8.*z2 *z2)) DECLARE_Ylm(32
 
return return *z **z *z *x *x
y *y return *x *y *x y *x y
X2Y2 Z2 return **x2y2 *x2y2
*z2 *z2 *z2 X2 Y2 return *x2
y2 *x2 y2 *z *z X2 Y2 return
*y **x2 *x2 *y2 y2 *y2 X2 Y2
return *y *y2 *x2 *x2 y2 *z *z
X2Y2 Z2 return *z **x2y2 *x2y2
*z2 **x2y2 z2 X2 Y2 return *x2
y2 *z *x2 y2 *z *z 
YlmInternal::DECLARE_Ylm (33, X2 Y2 return-0.4892382994352504 *x *(x2-3.*y2)*(x2+y2-8.*z *z)) DECLARE_Ylm(34
 
return return *z **z *z *x *x
y *y return *x *y *x y *x y
X2Y2 Z2 return **x2y2 *x2y2
*z2 *z2 *z2 X2 Y2 return *x2
y2 *x2 y2 *z *z X2 Y2 return
*y **x2 *x2 *y2 y2 *y2 X2 Y2
return *y *y2 *x2 *x2 y2 *z *z
X2Y2 Z2 return *z **x2y2 *x2y2
*z2 **x2y2 z2 X2 Y2 return *x2
y2 *z *x2 y2 *z *z X2 Y2
return *z *x2 *x2 *y2 y2 *y2 
YlmInternal::DECLARE_Ylm (35, X2 Y2 return 0.6563820568401701 *x *(x2 *(x2-10.*y2)+5.*y2 *y2)) DECLARE_Ylm(36
 
return return *z **z *z *x *x
y *y return *x *y *x y *x y
X2Y2 Z2 return **x2y2 *x2y2
*z2 *z2 *z2 X2 Y2 return *x2
y2 *x2 y2 *z *z X2 Y2 return
*y **x2 *x2 *y2 y2 *y2 X2 Y2
return *y *y2 *x2 *x2 y2 *z *z
X2Y2 Z2 return *z **x2y2 *x2y2
*z2 **x2y2 z2 X2 Y2 return *x2
y2 *z *x2 y2 *z *z X2 Y2
return *z *x2 *x2 *y2 y2 *y2
X2 Y2 return *x *y *x2 **x2
*y2 *y2 *y2 
YlmInternal::DECLARE_Ylm (37, X2 Y2 return 2.366619162231752 *y *z *(5.*x2 *(x2-2.*y2)+y2 *y2)) DECLARE_Ylm(38
 
return return *z **z *z *x *x
y *y return *x *y *x y *x y
X2Y2 Z2 return **x2y2 *x2y2
*z2 *z2 *z2 X2 Y2 return *x2
y2 *x2 y2 *z *z X2 Y2 return
*y **x2 *x2 *y2 y2 *y2 X2 Y2
return *y *y2 *x2 *x2 y2 *z *z
X2Y2 Z2 return *z **x2y2 *x2y2
*z2 **x2y2 z2 X2 Y2 return *x2
y2 *z *x2 y2 *z *z X2 Y2
return *z *x2 *x2 *y2 y2 *y2
X2 Y2 return *x *y *x2 **x2
*y2 *y2 *y2 X2 Y2 return *x *y
*x2 y2 *x2 y2 *z *z 
YlmInternal::DECLARE_Ylm (39, X2 Y2 return 0.9212052595149236 *y *z *(y2-3.*x2)*(3.*(x2+y2)-8.*z *z)) DECLARE_Ylm(40
 
return return *z **z *z *x *x
y *y return *x *y *x y *x y
X2Y2 Z2 return **x2y2 *x2y2
*z2 *z2 *z2 X2 Y2 return *x2
y2 *x2 y2 *z *z X2 Y2 return
*y **x2 *x2 *y2 y2 *y2 X2 Y2
return *y *y2 *x2 *x2 y2 *z *z
X2Y2 Z2 return *z **x2y2 *x2y2
*z2 **x2y2 z2 X2 Y2 return *x2
y2 *z *x2 y2 *z *z X2 Y2
return *z *x2 *x2 *y2 y2 *y2
X2 Y2 return *x *y *x2 **x2
*y2 *y2 *y2 X2 Y2 return *x *y
*x2 y2 *x2 y2 *z *z X2Y2 Z2
return *x *y *x2y2 *x2y2 *z2
*z2 *z2 
YlmInternal::DECLARE_Ylm (41, X2Y2 Z2 return 0.5826213625187314 *y *z *(5.*x2y2 *(x2y2-4.*z2)+8.*z2 *z2)) DECLARE_Ylm(42
 
return return *z **z *z *x *x
y *y return *x *y *x y *x y
X2Y2 Z2 return **x2y2 *x2y2
*z2 *z2 *z2 X2 Y2 return *x2
y2 *x2 y2 *z *z X2 Y2 return
*y **x2 *x2 *y2 y2 *y2 X2 Y2
return *y *y2 *x2 *x2 y2 *z *z
X2Y2 Z2 return *z **x2y2 *x2y2
*z2 **x2y2 z2 X2 Y2 return *x2
y2 *z *x2 y2 *z *z X2 Y2
return *z *x2 *x2 *y2 y2 *y2
X2 Y2 return *x *y *x2 **x2
*y2 *y2 *y2 X2 Y2 return *x *y
*x2 y2 *x2 y2 *z *z X2Y2 Z2
return *x *y *x2y2 *x2y2 *z2
*z2 *z2 X2Y2 Z2 return **x2y2
*x2y2 **z2 x2y2 *z2 *z2 **z2
*x2y2 
YlmInternal::DECLARE_Ylm (43, X2Y2 Z2 return 0.5826213625187314 *x *z *(5.*x2y2 *(x2y2-4.*z2)+8.*z2 *z2)) DECLARE_Ylm(44
 
return return *z **z *z *x *x
y *y return *x *y *x y *x y
X2Y2 Z2 return **x2y2 *x2y2
*z2 *z2 *z2 X2 Y2 return *x2
y2 *x2 y2 *z *z X2 Y2 return
*y **x2 *x2 *y2 y2 *y2 X2 Y2
return *y *y2 *x2 *x2 y2 *z *z
X2Y2 Z2 return *z **x2y2 *x2y2
*z2 **x2y2 z2 X2 Y2 return *x2
y2 *z *x2 y2 *z *z X2 Y2
return *z *x2 *x2 *y2 y2 *y2
X2 Y2 return *x *y *x2 **x2
*y2 *y2 *y2 X2 Y2 return *x *y
*x2 y2 *x2 y2 *z *z X2Y2 Z2
return *x *y *x2y2 *x2y2 *z2
*z2 *z2 X2Y2 Z2 return **x2y2
*x2y2 **z2 x2y2 *z2 *z2 **z2
*x2y2 X2Y2i Z2 return *x2 y2
*x2y2 *x2y2 *z2 *z2 *z2 
YlmInternal::DECLARE_Ylm (45, X2 Y2 return-0.9212052595149236 *x *z *(x2-3.*y2)*(3.*(x2+y2)-8.*z *z)) DECLARE_Ylm(46
 
return return *z **z *z *x *x
y *y return *x *y *x y *x y
X2Y2 Z2 return **x2y2 *x2y2
*z2 *z2 *z2 X2 Y2 return *x2
y2 *x2 y2 *z *z X2 Y2 return
*y **x2 *x2 *y2 y2 *y2 X2 Y2
return *y *y2 *x2 *x2 y2 *z *z
X2Y2 Z2 return *z **x2y2 *x2y2
*z2 **x2y2 z2 X2 Y2 return *x2
y2 *z *x2 y2 *z *z X2 Y2
return *z *x2 *x2 *y2 y2 *y2
X2 Y2 return *x *y *x2 **x2
*y2 *y2 *y2 X2 Y2 return *x *y
*x2 y2 *x2 y2 *z *z X2Y2 Z2
return *x *y *x2y2 *x2y2 *z2
*z2 *z2 X2Y2 Z2 return **x2y2
*x2y2 **z2 x2y2 *z2 *z2 **z2
*x2y2 X2Y2i Z2 return *x2 y2
*x2y2 *x2y2 *z2 *z2 *z2 X2 Y2
return *x2 *x2 *y2 y2 *y2 *x2
y2 *z *z 
YlmInternal::DECLARE_Ylm (47, X2 Y2 return 2.366619162231752 *x *z *(x2 *(x2-10.*y2)+5.*y2 *y2)) DECLARE_Ylm(48
 
template<int lm>
__hostanddev__ double Ylm (const vector3<> &qhat)
 Index by combined lm := l*(l+1)+m index (useful when static-looping over all l,m)
 
template<int l, int m>
__hostanddev__ double Ylm (const vector3<> &qhat)
 Index by l and m separately.
 
template<int l, int m>
void set_Ylm (const vector3<> qHat, double &result)
 Use above macro to provide a non-templated version of the function.
 
double Ylm (int l, int m, const vector3<> &qHat)
 
std::vector< YlmProdTermexpandYlmProd (int lm1, int lm2)
 
std::vector< YlmProdTermexpandYlmProd (int l1, int m1, int l2, int m2)
 Wrapper function expandYlmProd with individual indices.
 
template<int l, int m>
__hostanddev__ vector3 YlmPrime (const vector3<> &qHat)
 Derivative of spherical Harmonic with repect to iDir'th component of qHat.
 
template<int l, int m>
void set_YlmPrime (const vector3<> qHat, vector3<> &result)
 Non-templated version of YlmPrime (for debugging)
 
vector3 YlmPrime (int l, int m, const vector3<> &qHat)
 

Detailed Description

Real spherical Harmonics and spherical bessel functions