1 /*  Copyright (C) 2003-2007  CAMP
2  *  Copyright (C) 2007-2009  CAMd
3  *  Please see the accompanying LICENSE file for further information. */
4 
5 #define spherical_harmonics(l, f, x, y, z, r2, p) (\
6     {\
7       switch(l)\
8         {\
9           case 0:\
10             p[0] = f * 0.28209479177387814;\
11             break;\
12           case 1:\
13             p[0] = f * 0.48860251190291992 * y;\
14             p[1] = f * 0.48860251190291992 * z;\
15             p[2] = f * 0.48860251190291992 * x;\
16             break;\
17           case 2:\
18             p[0] = f * 1.0925484305920792 * x*y;\
19             p[1] = f * 1.0925484305920792 * y*z;\
20             p[2] = f * 0.31539156525252005 * (-r2+3*z*z);\
21             p[3] = f * 1.0925484305920792 * x*z;\
22             p[4] = f * 0.54627421529603959 * (-y*y+x*x);\
23             break;\
24           case 3:\
25             p[0] = f * 0.59004358992664352 * (-y*y*y+3*x*x*y);\
26             p[1] = f * 2.8906114426405538 * x*y*z;\
27             p[2] = f * 0.45704579946446577 * (5*y*z*z-y*r2);\
28             p[3] = f * 0.3731763325901154 * (-3*z*r2+5*z*z*z);\
29             p[4] = f * 0.45704579946446577 * (-x*r2+5*x*z*z);\
30             p[5] = f * 1.4453057213202769 * (-y*y*z+x*x*z);\
31             p[6] = f * 0.59004358992664352 * (x*x*x-3*x*y*y);\
32             break;\
33           case 4:\
34             p[0] = f * 2.5033429417967046 * (x*x*x*y-x*y*y*y);\
35             p[1] = f * 1.7701307697799307 * (3*x*x*y*z-y*y*y*z);\
36             p[2] = f * 0.94617469575756008 * (-x*y*r2+7*x*y*z*z);\
37             p[3] = f * 0.66904654355728921 * (-3*y*z*r2+7*y*z*z*z);\
38             p[4] = f * 0.10578554691520431 * (3*r2*r2-30*z*z*r2+35*z*z*z*z);\
39             p[5] = f * 0.66904654355728921 * (7*x*z*z*z-3*x*z*r2);\
40             p[6] = f * 0.47308734787878004 * (y*y*r2+7*x*x*z*z-x*x*r2-7*y*y*z*z);\
41             p[7] = f * 1.7701307697799307 * (x*x*x*z-3*x*y*y*z);\
42             p[8] = f * 0.62583573544917614 * (-6*x*x*y*y+x*x*x*x+y*y*y*y);\
43             break;\
44           default:\
45             assert(0 == 1);\
46         }\
47     }\
48 )\
49 
50 #define spherical_harmonics_derivative_x(l, f, x, y, z, r2, p) (\
51     {\
52       switch(l)\
53         {\
54           case 0:\
55             p[0] = f * 0;\
56             break;\
57           case 1:\
58             p[0] = f * 0;\
59             p[1] = f * 0;\
60             p[2] = f * 0.48860251190291992;\
61             break;\
62           case 2:\
63             p[0] = f * 1.0925484305920792 * y;\
64             p[1] = f * 0;\
65             p[2] = f * 0.63078313050504009 * -x;\
66             p[3] = f * 1.0925484305920792 * z;\
67             p[4] = f * 1.0925484305920792 * x;\
68             break;\
69           case 3:\
70             p[0] = f * 3.5402615395598613 * x*y;\
71             p[1] = f * 2.8906114426405538 * y*z;\
72             p[2] = f * 0.91409159892893155 * -x*y;\
73             p[3] = f * 2.2390579955406924 * -x*z;\
74             p[4] = f * 0.45704579946446577 * (-r2-2*x*x+5*z*z);\
75             p[5] = f * 2.8906114426405538 * x*z;\
76             p[6] = f * 1.7701307697799307 * (-y*y+x*x);\
77             break;\
78           case 4:\
79             p[0] = f * 2.5033429417967046 * (-y*y*y+3*x*x*y);\
80             p[1] = f * 10.620784618679583 * x*y*z;\
81             p[2] = f * 0.94617469575756008 * (7*y*z*z-y*r2-2*x*x*y);\
82             p[3] = f * 4.0142792613437353 * -x*y*z;\
83             p[4] = f * 1.2694265629824517 * (x*r2-5*x*z*z);\
84             p[5] = f * 0.66904654355728921 * (-3*z*r2-6*x*x*z+7*z*z*z);\
85             p[6] = f * 0.94617469575756008 * (-x*r2-x*x*x+x*y*y+7*x*z*z);\
86             p[7] = f * 5.3103923093397913 * (-y*y*z+x*x*z);\
87             p[8] = f * 2.5033429417967046 * (-3*x*y*y+x*x*x);\
88             break;\
89           default:\
90             assert(0 == 1);\
91         }\
92     }\
93 )\
94 
95 #define spherical_harmonics_derivative_y(l, f, x, y, z, r2, p) (\
96     {\
97       switch(l)\
98         {\
99           case 0:\
100             p[0] = f * 0;\
101             break;\
102           case 1:\
103             p[0] = f * 0.48860251190291992;\
104             p[1] = f * 0;\
105             p[2] = f * 0;\
106             break;\
107           case 2:\
108             p[0] = f * 1.0925484305920792 * x;\
109             p[1] = f * 1.0925484305920792 * z;\
110             p[2] = f * 0.63078313050504009 * -y;\
111             p[3] = f * 0;\
112             p[4] = f * 1.0925484305920792 * -y;\
113             break;\
114           case 3:\
115             p[0] = f * 1.7701307697799307 * (-y*y+x*x);\
116             p[1] = f * 2.8906114426405538 * x*z;\
117             p[2] = f * 0.45704579946446577 * (-2*y*y-r2+5*z*z);\
118             p[3] = f * 2.2390579955406924 * -y*z;\
119             p[4] = f * 0.91409159892893155 * -x*y;\
120             p[5] = f * 2.8906114426405538 * -y*z;\
121             p[6] = f * 3.5402615395598613 * -x*y;\
122             break;\
123           case 4:\
124             p[0] = f * 2.5033429417967046 * (x*x*x-3*x*y*y);\
125             p[1] = f * 5.3103923093397913 * (-y*y*z+x*x*z);\
126             p[2] = f * 0.94617469575756008 * (-x*r2-2*x*y*y+7*x*z*z);\
127             p[3] = f * 0.66904654355728921 * (-6*y*y*z-3*z*r2+7*z*z*z);\
128             p[4] = f * 1.2694265629824517 * (-5*y*z*z+y*r2);\
129             p[5] = f * 4.0142792613437353 * -x*y*z;\
130             p[6] = f * 0.94617469575756008 * (y*y*y-7*y*z*z+y*r2-x*x*y);\
131             p[7] = f * 10.620784618679583 * -x*y*z;\
132             p[8] = f * 2.5033429417967046 * (y*y*y-3*x*x*y);\
133             break;\
134           default:\
135             assert(0 == 1);\
136         }\
137     }\
138 )\
139 
140 #define spherical_harmonics_derivative_z(l, f, x, y, z, r2, p) (\
141     {\
142       switch(l)\
143         {\
144           case 0:\
145             p[0] = f * 0;\
146             break;\
147           case 1:\
148             p[0] = f * 0;\
149             p[1] = f * 0.48860251190291992;\
150             p[2] = f * 0;\
151             break;\
152           case 2:\
153             p[0] = f * 0;\
154             p[1] = f * 1.0925484305920792 * y;\
155             p[2] = f * 1.2615662610100802 * z;\
156             p[3] = f * 1.0925484305920792 * x;\
157             p[4] = f * 0;\
158             break;\
159           case 3:\
160             p[0] = f * 0;\
161             p[1] = f * 2.8906114426405538 * x*y;\
162             p[2] = f * 3.6563663957157262 * y*z;\
163             p[3] = f * 1.1195289977703462 * (-r2+3*z*z);\
164             p[4] = f * 3.6563663957157262 * x*z;\
165             p[5] = f * 1.4453057213202769 * (-y*y+x*x);\
166             p[6] = f * 0;\
167             break;\
168           case 4:\
169             p[0] = f * 0;\
170             p[1] = f * 1.7701307697799307 * (-y*y*y+3*x*x*y);\
171             p[2] = f * 11.354096349090721 * x*y*z;\
172             p[3] = f * 2.0071396306718676 * (5*y*z*z-y*r2);\
173             p[4] = f * 1.6925687506432689 * (-3*z*r2+5*z*z*z);\
174             p[5] = f * 2.0071396306718676 * (-x*r2+5*x*z*z);\
175             p[6] = f * 5.6770481745453605 * (-y*y*z+x*x*z);\
176             p[7] = f * 1.7701307697799307 * (x*x*x-3*x*y*y);\
177             p[8] = f * 0;\
178             break;\
179           default:\
180             assert(0 == 1);\
181         }\
182     }\
183 )\
184 
185