15 #include "../common/grid_constants.h"
26 const T pab_val,
const int n,
30 prep_term<T>(
a,
b, pab_val, n, cab);
37 __device__ __inline__
void
39 const T pab_val,
const int n, T *cab) {
46 for (
int i = 0;
i < 3;
i++) {
49 prep_term<T>(
down(
i,
a),
up(
i,
b), -1.0 *
a.l[
i] * zetb * pab_val, n, cab);
51 prep_term<T>(
up(
i,
a),
up(
i,
b), 2.0 *
zeta * zetb * pab_val, n, cab);
61 const T pab_val,
const int n, T *cab) {
70 prep_term<T>(
a,
down(idir,
b), +
b.l[idir] * pab_val, n, cab);
71 prep_term<T>(
a,
up(idir,
b), -2.0 * zetb * pab_val, n, cab);
72 prep_term<T>(
down(idir,
a),
b, -
a.l[idir] * pab_val, n, cab);
73 prep_term<T>(
up(idir,
a),
b, +2.0 *
zeta * pab_val, n, cab);
82 const T
zeta,
const T zetb,
83 const T pab_val,
const int n, T *cab) {
94 prep_term<T>(
a,
down(idir,
up(ir,
b)),
b.l[idir] * pab_val, n, cab);
95 prep_term<T>(
a,
up(idir,
up(ir,
b)), -2.0 * zetb * pab_val, n, cab);
96 prep_term<T>(
down(idir,
a),
up(ir,
b), -
a.l[idir] * pab_val, n, cab);
97 prep_term<T>(
up(idir,
a),
up(ir,
b), +2.0 *
zeta * pab_val, n, cab);
104 template <
typename T>
107 const T pab_val,
const int n, T *cab) {
116 prep_term<T>(
a,
down(idir,
b),
b.l[idir] * pab_val, n, cab);
117 prep_term<T>(
a,
up(idir,
b), -2.0 * zetb * pab_val, n, cab);
118 prep_term<T>(
down(idir,
a),
b,
a.l[idir] * pab_val, n, cab);
119 prep_term<T>(
up(idir,
a),
b, -2.0 *
zeta * pab_val, n, cab);
126 template <
typename T>
127 __device__ __inline__
void
129 const T zetb,
const T pab_val,
const int n, T *cab) {
139 prep_term<T>(
down(ider,
a),
down(ider,
b),
a.l[ider] *
b.l[ider] * pab_val, n,
141 prep_term<T>(
down(ider,
a),
up(ider,
b), -2.0 *
a.l[ider] * zetb * pab_val, n,
143 prep_term<T>(
up(ider,
a),
down(ider,
b), -2.0 *
zeta *
b.l[ider] * pab_val, n,
145 prep_term<T>(
up(ider,
a),
up(ider,
b), +4.0 *
zeta * zetb * pab_val, n, cab);
151 template <
typename T>
154 const T zetb,
const int n, T *cab) {
160 }
else if (idir == 1) {
163 }
else if (idir == 2) {
170 prep_term<T>(
a,
down(i1,
down(i2,
b)),
b.l[i1] *
b.l[i2] * func_a, n, cab);
171 prep_term<T>(
a,
up(i1,
down(i2,
b)), -2.0 * zetb *
b.l[i2] * func_a, n, cab);
172 prep_term<T>(
a,
down(i1,
up(i2,
b)), -2.0 * zetb *
b.l[i1] * func_a, n, cab);
173 prep_term<T>(
a,
up(i1,
up(i2,
b)), +4.0 * zetb * zetb * func_a, n, cab);
180 template <
typename T>
181 __device__ __inline__
void
183 const orbital b,
const T
zeta,
const T zetb,
const T pab_val,
184 const int n, T *cab) {
190 const T func_a1 =
a.l[ider1] *
a.l[ider2] * pab_val;
191 oneterm_dijdij<T>(ider1, func_a1,
down(ider1,
down(ider2,
a)),
b, zetb, n,
194 const T func_a2 = -2.0 *
zeta *
a.l[ider2] * pab_val;
195 oneterm_dijdij<T>(ider1, func_a2,
up(ider1,
down(ider2,
a)),
b, zetb, n, cab);
197 const T func_a3 = -2.0 *
zeta *
a.l[ider1] * pab_val;
198 oneterm_dijdij<T>(ider1, func_a3,
down(ider1,
up(ider2,
a)),
b, zetb, n, cab);
200 const T func_a4 = 4.0 *
zeta *
zeta * pab_val;
201 oneterm_dijdij<T>(ider1, func_a4,
up(ider1,
up(ider2,
a)),
b, zetb, n, cab);
208 template <
typename T>
210 const orbital b,
const T zetb,
const int n,
214 b.l[idir] * (
b.l[idir] - 1) * func_a, n, cab);
215 prep_term<T>(
a,
b, -2.0 * zetb * (2 *
b.l[idir] + 1) * func_a, n, cab);
216 prep_term<T>(
a,
up(idir,
up(idir,
b)), +4.0 * zetb * zetb * func_a, n, cab);
222 template <
typename T>
223 __device__ __inline__
void
225 const T zetb,
const T pab_val,
const int n, T *cab) {
231 const T func_a1 =
a.l[ider] * (
a.l[ider] - 1) * pab_val;
232 oneterm_diidii<T>(ider, func_a1,
down(ider,
down(ider,
a)),
b, zetb, n, cab);
234 const T func_a2 = -2.0 *
zeta * (2 *
a.l[ider] + 1) * pab_val;
235 oneterm_diidii<T>(ider, func_a2,
a,
b, zetb, n, cab);
237 const T func_a3 = 4.0 *
zeta *
zeta * pab_val;
238 oneterm_diidii<T>(ider, func_a3,
up(ider,
up(ider,
a)),
b, zetb, n, cab);
250 template <
typename T>
251 __device__ __inline__
void
253 const T
zeta,
const T zetb,
const T pab_val,
const int n, T *cab) {
258 prepare_pab_AB<T>(
a,
b, pab_val, n, cab);
261 prepare_pab_DADB<T>(
a,
b,
zeta, zetb, pab_val, n, cab);
264 prepare_pab_ADBmDAB<T>(0,
a,
b,
zeta, zetb, pab_val, n, cab);
267 prepare_pab_ADBmDAB<T>(1,
a,
b,
zeta, zetb, pab_val, n, cab);
270 prepare_pab_ADBmDAB<T>(2,
a,
b,
zeta, zetb, pab_val, n, cab);
273 prepare_pab_ARDBmDARB<T>(0, 0,
a,
b,
zeta, zetb, pab_val, n, cab);
276 prepare_pab_ARDBmDARB<T>(0, 1,
a,
b,
zeta, zetb, pab_val, n, cab);
279 prepare_pab_ARDBmDARB<T>(0, 2,
a,
b,
zeta, zetb, pab_val, n, cab);
282 prepare_pab_ARDBmDARB<T>(1, 0,
a,
b,
zeta, zetb, pab_val, n, cab);
285 prepare_pab_ARDBmDARB<T>(1, 1,
a,
b,
zeta, zetb, pab_val, n, cab);
288 prepare_pab_ARDBmDARB<T>(1, 2,
a,
b,
zeta, zetb, pab_val, n, cab);
291 prepare_pab_ARDBmDARB<T>(2, 0,
a,
b,
zeta, zetb, pab_val, n, cab);
294 prepare_pab_ARDBmDARB<T>(2, 1,
a,
b,
zeta, zetb, pab_val, n, cab);
297 prepare_pab_ARDBmDARB<T>(2, 2,
a,
b,
zeta, zetb, pab_val, n, cab);
300 prepare_pab_DABpADB<T>(0,
a,
b,
zeta, zetb, pab_val, n, cab);
303 prepare_pab_DABpADB<T>(1,
a,
b,
zeta, zetb, pab_val, n, cab);
306 prepare_pab_DABpADB<T>(2,
a,
b,
zeta, zetb, pab_val, n, cab);
309 prepare_pab_Di<T>(0,
a,
b,
zeta, zetb, pab_val, n, cab);
312 prepare_pab_Di<T>(1,
a,
b,
zeta, zetb, pab_val, n, cab);
315 prepare_pab_Di<T>(2,
a,
b,
zeta, zetb, pab_val, n, cab);
318 prepare_pab_DiDj<T>(0, 1,
a,
b,
zeta, zetb, pab_val, n, cab);
321 prepare_pab_DiDj<T>(1, 2,
a,
b,
zeta, zetb, pab_val, n, cab);
324 prepare_pab_DiDj<T>(2, 0,
a,
b,
zeta, zetb, pab_val, n, cab);
327 prepare_pab_Di2<T>(0,
a,
b,
zeta, zetb, pab_val, n, cab);
330 prepare_pab_Di2<T>(1,
a,
b,
zeta, zetb, pab_val, n, cab);
333 prepare_pab_Di2<T>(2,
a,
b,
zeta, zetb, pab_val, n, cab);
400 fprintf(stderr,
"Error: Unknown ga_gb_function %i.\n", func);
static void const int const int i
__device__ void prepare_pab_ADBmDAB(const int idir, const orbital a, const orbital b, const T zeta, const T zetb, const T pab_val, const int n, T *cab)
Implementation of function GRID_FUNC_ADBmDAB_{X,Y,Z}.
__device__ __inline__ void oneterm_dijdij(const int idir, const T func_a, const orbital a, const orbital b, const T zetb, const int n, T *cab)
Helper for grid_prepare_pab_DiDj.
__device__ __inline__ void prepare_pab_Di2(const int ider, const orbital a, const orbital b, const T zeta, const T zetb, const T pab_val, const int n, T *cab)
Implementation of function GRID_FUNC_{DXDX,DYDY,DZDZ}.
__device__ __inline__ void prepare_pab_DiDj(const int ider1, const int ider2, const orbital a, const orbital b, const T zeta, const T zetb, const T pab_val, const int n, T *cab)
Implementation of function GRID_FUNC_{DXDY,DYDZ,DZDX}.
__device__ __inline__ void prepare_pab_AB(const orbital a, const orbital b, const T pab_val, const int n, T *cab)
Implementation of function GRID_FUNC_AB, ie. identity transformation.
ldiffs_value prepare_get_ldiffs(const enum grid_func func)
Returns difference in angular momentum range for given func.
__device__ void prepare_pab_DABpADB(const int idir, const orbital a, const orbital b, const T zeta, const T zetb, const T pab_val, const int n, T *cab)
Implementation of function GRID_FUNC_DABpADB_{X,Y,Z}.
__device__ __inline__ void prepare_pab_Di(const int ider, const orbital a, const orbital b, const T zeta, const T zetb, const T pab_val, const int n, T *cab)
Implementation of function GRID_FUNC_{DX,DY,DZ}.
__device__ void prepare_pab_ARDBmDARB(const int idir, const int ir, const orbital a, const orbital b, const T zeta, const T zetb, const T pab_val, const int n, T *cab)
Implementation of function GRID_FUNC_ARDBmDARB_{X,Y,Z}{X,Y,Z}.
__inline__ __device__ orbital down(const int i, const orbital &a)
Decrease i'th component of given orbital angular momentum.
__device__ __inline__ orbital up(const int i, const orbital &a)
Increase i'th component of given orbital angular momentum.
__device__ void oneterm_diidii(const int idir, const T func_a, const orbital a, const orbital b, const T zetb, const int n, T *cab)
Helper for grid_prepare_pab_Di2.
__device__ __inline__ void prepare_pab(const enum grid_func func, const orbital a, const orbital b, const T zeta, const T zetb, const T pab_val, const int n, T *cab)
Transforms a given element of the density matrix according to func.
__device__ __inline__ void prepare_pab_DADB(const orbital a, const orbital b, const T zeta, const T zetb, const T pab_val, const int n, T *cab)
Implementation of function GRID_FUNC_DADB.
Differences in angular momentum.
Orbital angular momentum.