(git:374b731)
Loading...
Searching...
No Matches
grid_prepare_pab.h
Go to the documentation of this file.
1/*----------------------------------------------------------------------------*/
2/* CP2K: A general program to perform molecular dynamics simulations */
3/* Copyright 2000-2024 CP2K developers group <https://cp2k.org> */
4/* */
5/* SPDX-License-Identifier: BSD-3-Clause */
6/*----------------------------------------------------------------------------*/
7
8#include "../common/grid_common.h"
9#include "../common/grid_constants.h"
10#include <stdbool.h>
11#include <stdio.h>
12#include <stdlib.h>
13
14#if defined(__CUDACC__) || defined(__HIPCC__)
15#define GRID_DEVICE __device__
16#else
17#define GRID_DEVICE
18#endif
19
20/*******************************************************************************
21 * \brief Adds given value to matrix element cab[idx(b)][idx(a)].
22 * This function has to be implemented by the importing compilation unit.
23 * Without thread safety it's simply: cab[idx(b) * n + idx(a)] += value;
24 * \author Ole Schuett
25 ******************************************************************************/
26GRID_DEVICE static inline void cab_add(cab_store *cab, const orbital a,
27 const orbital b, const double value);
28
29/*******************************************************************************
30 * \brief Implementation of function GRID_FUNC_AB, ie. identity transformation.
31 * \author Ole Schuett
32 ******************************************************************************/
33GRID_DEVICE static void prepare_pab_AB(const orbital a, const orbital b,
34 const double pab_val, cab_store *cab) {
35
36 // simply copy pab to cab
37 cab_add(cab, a, b, pab_val);
38}
39
40/*******************************************************************************
41 * \brief Implementation of function GRID_FUNC_DADB.
42 * \author Ole Schuett
43 ******************************************************************************/
44GRID_DEVICE static void prepare_pab_DADB(const orbital a, const orbital b,
45 const double zeta, const double zetb,
46 const double pab_val, cab_store *cab) {
47
48 // creates cab such that mapping it with pgf_a pgf_b
49 // is equivalent to mapping pab with 0.5 * (nabla pgf_a) . (nabla pgf_b)
50 // (ddx pgf_a ) (ddx pgf_b) = (lax pgf_{a-1x} - 2*zeta*pgf_{a+1x})*(lbx
51 // pgf_{b-1x} - 2*zetb*pgf_{b+1x})
52
53 for (int i = 0; i < 3; i++) {
54 cab_add(cab, down(i, a), down(i, b), 0.5 * a.l[i] * b.l[i] * pab_val);
55 cab_add(cab, down(i, a), up(i, b), -1.0 * a.l[i] * zetb * pab_val);
56 cab_add(cab, up(i, a), down(i, b), -1.0 * zeta * b.l[i] * pab_val);
57 cab_add(cab, up(i, a), up(i, b), 2.0 * zeta * zetb * pab_val);
58 }
59}
60
61/*******************************************************************************
62 * \brief Implementation of function GRID_FUNC_ADBmDAB_{X,Y,Z}.
63 * \author Ole Schuett
64 ******************************************************************************/
65GRID_DEVICE static void prepare_pab_ADBmDAB(const int idir, const orbital a,
66 const orbital b, const double zeta,
67 const double zetb,
68 const double pab_val,
69 cab_store *cab) {
70
71 // creates cab such that mapping it with pgf_a pgf_b
72 // is equivalent to mapping pab with
73 // pgf_a (nabla_{idir} pgf_b) - (nabla_{idir} pgf_a) pgf_b
74 // ( pgf_a ) (ddx pgf_b) - (ddx pgf_a)( pgf_b ) =
75 // pgf_a *(lbx pgf_{b-1x} - 2*zetb*pgf_{b+1x}) -
76 // (lax pgf_{a-1x} - 2*zeta*pgf_{a+1x}) pgf_b
77
78 cab_add(cab, a, down(idir, b), +b.l[idir] * pab_val);
79 cab_add(cab, a, up(idir, b), -2.0 * zetb * pab_val);
80 cab_add(cab, down(idir, a), b, -a.l[idir] * pab_val);
81 cab_add(cab, up(idir, a), b, +2.0 * zeta * pab_val);
82}
83
84/*******************************************************************************
85 * \brief Implementation of function GRID_FUNC_ARDBmDARB_{X,Y,Z}{X,Y,Z}.
86 * \author Ole Schuett
87 ******************************************************************************/
88GRID_DEVICE static void
89prepare_pab_ARDBmDARB(const int idir, const int ir, const orbital a,
90 const orbital b, const double zeta, const double zetb,
91 const double pab_val, cab_store *cab) {
92
93 // creates cab such that mapping it with pgf_a pgf_b
94 // is equivalent to mapping pab with
95 // pgf_a (r-Rb)_{ir} (nabla_{idir} pgf_b) - (nabla_{idir} pgf_a) (r-Rb)_{ir}
96 // pgf_b ( pgf_a )(r-Rb)_{ir} (ddx pgf_b) - (ddx pgf_a) (r-Rb)_{ir} ( pgf_b )
97 // =
98 // pgf_a *(lbx pgf_{b-1x+1ir} - 2*zetb*pgf_{b+1x+1ir})
99 // -
100 // (lax pgf_{a-1x} - 2*zeta*pgf_{a+1x}) pgf_{b+1ir}
101
102 cab_add(cab, a, down(idir, up(ir, b)), b.l[idir] * pab_val);
103 cab_add(cab, a, up(idir, up(ir, b)), -2.0 * zetb * pab_val);
104 cab_add(cab, down(idir, a), up(ir, b), -a.l[idir] * pab_val);
105 cab_add(cab, up(idir, a), up(ir, b), +2.0 * zeta * pab_val);
106}
107
108/*******************************************************************************
109 * \brief Implementation of function GRID_FUNC_DABpADB_{X,Y,Z}.
110 * \author Ole Schuett
111 ******************************************************************************/
112GRID_DEVICE static void prepare_pab_DABpADB(const int idir, const orbital a,
113 const orbital b, const double zeta,
114 const double zetb,
115 const double pab_val,
116 cab_store *cab) {
117
118 // creates cab such that mapping it with pgf_a pgf_b
119 // is equivalent to mapping pab with
120 // pgf_a (nabla_{idir} pgf_b) + (nabla_{idir} pgf_a) pgf_b
121 // ( pgf_a ) (ddx pgf_b) + (ddx pgf_a)( pgf_b ) =
122 // pgf_a *(lbx pgf_{b-1x} + 2*zetb*pgf_{b+1x}) +
123 // (lax pgf_{a-1x} + 2*zeta*pgf_{a+1x}) pgf_b
124
125 cab_add(cab, a, down(idir, b), b.l[idir] * pab_val);
126 cab_add(cab, a, up(idir, b), -2.0 * zetb * pab_val);
127 cab_add(cab, down(idir, a), b, a.l[idir] * pab_val);
128 cab_add(cab, up(idir, a), b, -2.0 * zeta * pab_val);
129}
130
131/*******************************************************************************
132 * \brief Implementation of function GRID_FUNC_DAB_{X,Y,Z}.
133 * This function takes the derivates with respect to nuclear positions
134 * which results in a change of signs compared to prepare_pab_DABpADB.
135 * Only the derivative with respect to the primitive on the left.
136 * \author Edward Ditler
137 ******************************************************************************/
138GRID_DEVICE static void prepare_pab_DAB(const int idir, const orbital a,
139 const orbital b, const double zeta,
140 const double pab_val, cab_store *cab) {
141
142 // creates cab such that mapping it with pgf_a pgf_b
143 // is equivalent to mapping pab with (nabla_{idir} pgf_a) pgf_b
144 // (ddX pgf_a)( pgf_b ) =
145 // (-lax pgf_{a-1x} - 2*zeta*pgf_{a+1x}) pgf_b
146
147 cab_add(cab, down(idir, a), b, -a.l[idir] * pab_val);
148 cab_add(cab, up(idir, a), b, +2.0 * zeta * pab_val);
149}
150
151/*******************************************************************************
152 * \brief Implementation of function GRID_FUNC_ADB_{X,Y,Z}.
153 * This function takes the derivates with respect to nuclear positions
154 * which results in a change of signs compared to prepare_pab_DABpADB.
155 * Only the derivative with respect to the primitive on the right.
156 * \author Edward Ditler
157 ******************************************************************************/
158GRID_DEVICE static void prepare_pab_ADB(const int idir, const orbital a,
159 const orbital b, const double zetb,
160 const double pab_val, cab_store *cab) {
161
162 // creates cab such that mapping it with pgf_a pgf_b
163 // is equivalent to mapping pab with
164 // pgf_a (nabla_{idir} pgf_b) + (nabla_{idir} pgf_a) pgf_b
165 // ( pgf_a ) (ddX pgf_b) =
166 // pgf_a *(-lbx pgf_{b-1x} - 2*zetb*pgf_{b+1x})
167
168 cab_add(cab, a, down(idir, b), -b.l[idir] * pab_val);
169 cab_add(cab, a, up(idir, b), +2.0 * zetb * pab_val);
170}
171
172/*******************************************************************************
173 * \brief Implementation of function GRID_FUNC_CORE_{X,Y,Z}.
174 * This function takes the derivates with respect to nuclear positions.
175 * \author Edward Ditler
176 ******************************************************************************/
177GRID_DEVICE static void prepare_pab_core(const int idir, const orbital a,
178 const orbital b, const double zeta,
179 const double pab_val, cab_store *cab) {
180
181 // creates cab such that mapping it with pgf_a pgf_b
182 // is equivalent to mapping pab with (nabla_{idir} pgf_a) pgf_b
183 // (ddX pgf_a)( pgf_b ) = 2*zeta*pgf_{a+1x}) pgf_b
184
185 cab_add(cab, a, down(idir, b), 0.0);
186 cab_add(cab, a, up(idir, b), 0.0);
187 cab_add(cab, down(idir, a), b, 0.0);
188 cab_add(cab, up(idir, a), b, +2.0 * zeta * pab_val);
189}
190
191/*******************************************************************************
192 * \brief Implementation of function GRID_FUNC_{DX,DY,DZ}.
193 * \author Ole Schuett
194 ******************************************************************************/
195GRID_DEVICE static void prepare_pab_Di(const int ider, const orbital a,
196 const orbital b, const double zeta,
197 const double zetb, const double pab_val,
198 cab_store *cab) {
199
200 // creates cab such that mapping it with pgf_a pgf_b
201 // is equivalent to mapping pab with
202 // d_{ider1} pgf_a d_{ider1} pgf_b
203 // dx pgf_a dx pgf_b =
204 // (lax pgf_{a-1x})*(lbx pgf_{b-1x}) - 2*zetb*lax*pgf_{a-1x}*pgf_{b+1x}
205 // -
206 // lbx pgf_{b-1x}*2*zeta*pgf_{a+1x}+ 4*zeta*zetab*pgf_{a+1x}pgf_{b+1x}
207
208 cab_add(cab, down(ider, a), down(ider, b), a.l[ider] * b.l[ider] * pab_val);
209 cab_add(cab, down(ider, a), up(ider, b), -2.0 * a.l[ider] * zetb * pab_val);
210 cab_add(cab, up(ider, a), down(ider, b), -2.0 * zeta * b.l[ider] * pab_val);
211 cab_add(cab, up(ider, a), up(ider, b), +4.0 * zeta * zetb * pab_val);
212}
213
214/*******************************************************************************
215 * \brief Helper for grid_prepare_pab_DiDj.
216 * \author Ole Schuett
217 ******************************************************************************/
218GRID_DEVICE static void oneterm_dijdij(const int idir, const double func_a,
219 const orbital a, const orbital b,
220 const double zetb, cab_store *cab) {
221
222 int i1, i2;
223 if (idir == 0) {
224 i1 = 0;
225 i2 = 1;
226 } else if (idir == 1) {
227 i1 = 1;
228 i2 = 2;
229 } else if (idir == 2) {
230 i1 = 2;
231 i2 = 0;
232 } else {
233 return; // error
234 }
235
236 cab_add(cab, a, down(i1, down(i2, b)), b.l[i1] * b.l[i2] * func_a);
237 cab_add(cab, a, up(i1, down(i2, b)), -2.0 * zetb * b.l[i2] * func_a);
238 cab_add(cab, a, down(i1, up(i2, b)), -2.0 * zetb * b.l[i1] * func_a);
239 cab_add(cab, a, up(i1, up(i2, b)), +4.0 * zetb * zetb * func_a);
240}
241
242/*******************************************************************************
243 * \brief Implementation of function GRID_FUNC_{DXDY,DYDZ,DZDX}
244 * \author Ole Schuett
245 ******************************************************************************/
246GRID_DEVICE static void prepare_pab_DiDj(const int ider1, const int ider2,
247 const orbital a, const orbital b,
248 const double zeta, const double zetb,
249 const double pab_val, cab_store *cab) {
250
251 // creates cab such that mapping it with pgf_a pgf_b
252 // is equivalent to mapping pab with
253 // d_{ider1} pgf_a d_{ider1} pgf_b
254
255 const double func_a1 = a.l[ider1] * a.l[ider2] * pab_val;
256 oneterm_dijdij(ider1, func_a1, down(ider1, down(ider2, a)), b, zetb, cab);
257
258 const double func_a2 = -2.0 * zeta * a.l[ider2] * pab_val;
259 oneterm_dijdij(ider1, func_a2, up(ider1, down(ider2, a)), b, zetb, cab);
260
261 const double func_a3 = -2.0 * zeta * a.l[ider1] * pab_val;
262 oneterm_dijdij(ider1, func_a3, down(ider1, up(ider2, a)), b, zetb, cab);
263
264 const double func_a4 = 4.0 * zeta * zeta * pab_val;
265 oneterm_dijdij(ider1, func_a4, up(ider1, up(ider2, a)), b, zetb, cab);
266}
267
268/*******************************************************************************
269 * \brief Helper for grid_prepare_pab_Di2.
270 * \author Ole Schuett
271 ******************************************************************************/
272GRID_DEVICE static void oneterm_diidii(const int idir, const double func_a,
273 const orbital a, const orbital b,
274 const double zetb, cab_store *cab) {
275
276 cab_add(cab, a, down(idir, down(idir, b)),
277 b.l[idir] * (b.l[idir] - 1) * func_a);
278 cab_add(cab, a, b, -2.0 * zetb * (2 * b.l[idir] + 1) * func_a);
279 cab_add(cab, a, up(idir, up(idir, b)), +4.0 * zetb * zetb * func_a);
280}
281
282/*******************************************************************************
283 * \brief Implementation of function GRID_FUNC_{DXDX,DYDY,DZDZ}
284 * \author Ole Schuett
285 ******************************************************************************/
286GRID_DEVICE static void prepare_pab_Di2(const int ider, const orbital a,
287 const orbital b, const double zeta,
288 const double zetb, const double pab_val,
289 cab_store *cab) {
290
291 // creates cab such that mapping it with pgf_a pgf_b
292 // is equivalent to mapping pab with
293 // dd_{ider1} pgf_a dd_{ider1} pgf_b
294
295 const double func_a1 = a.l[ider] * (a.l[ider] - 1) * pab_val;
296 oneterm_diidii(ider, func_a1, down(ider, down(ider, a)), b, zetb, cab);
297
298 const double func_a2 = -2.0 * zeta * (2 * a.l[ider] + 1) * pab_val;
299 oneterm_diidii(ider, func_a2, a, b, zetb, cab);
300
301 const double func_a3 = 4.0 * zeta * zeta * pab_val;
302 oneterm_diidii(ider, func_a3, up(ider, up(ider, a)), b, zetb, cab);
303}
304
305/*******************************************************************************
306 * \brief Transforms a given element of the density matrix according to func.
307 * \param func Transformation function to apply, one of GRID_FUNC_*.
308 * \param {a,b} Orbital angular momenta.
309 * \param zet_{a,b} Gaussian exponents.
310 * \param pab_val Input matrix element of pab.
311 * \param n Leading dimensions of output matrix cab.
312 * \param cab Output matrix.
313 * \author Ole Schuett
314 ******************************************************************************/
315GRID_DEVICE static void prepare_pab(const enum grid_func func, const orbital a,
316 const orbital b, const double zeta,
317 const double zetb, const double pab_val,
318 cab_store *cab) {
319
320 // This switch statment will be in an inner loop but only with few iterations.
321 switch (func) {
322 case GRID_FUNC_AB:
323 prepare_pab_AB(a, b, pab_val, cab);
324 break;
325 case GRID_FUNC_DADB:
326 prepare_pab_DADB(a, b, zeta, zetb, pab_val, cab);
327 break;
329 prepare_pab_ADBmDAB(0, a, b, zeta, zetb, pab_val, cab);
330 break;
332 prepare_pab_ADBmDAB(1, a, b, zeta, zetb, pab_val, cab);
333 break;
335 prepare_pab_ADBmDAB(2, a, b, zeta, zetb, pab_val, cab);
336 break;
338 prepare_pab_ARDBmDARB(0, 0, a, b, zeta, zetb, pab_val, cab);
339 break;
341 prepare_pab_ARDBmDARB(0, 1, a, b, zeta, zetb, pab_val, cab);
342 break;
344 prepare_pab_ARDBmDARB(0, 2, a, b, zeta, zetb, pab_val, cab);
345 break;
347 prepare_pab_ARDBmDARB(1, 0, a, b, zeta, zetb, pab_val, cab);
348 break;
350 prepare_pab_ARDBmDARB(1, 1, a, b, zeta, zetb, pab_val, cab);
351 break;
353 prepare_pab_ARDBmDARB(1, 2, a, b, zeta, zetb, pab_val, cab);
354 break;
356 prepare_pab_ARDBmDARB(2, 0, a, b, zeta, zetb, pab_val, cab);
357 break;
359 prepare_pab_ARDBmDARB(2, 1, a, b, zeta, zetb, pab_val, cab);
360 break;
362 prepare_pab_ARDBmDARB(2, 2, a, b, zeta, zetb, pab_val, cab);
363 break;
365 prepare_pab_DABpADB(0, a, b, zeta, zetb, pab_val, cab);
366 break;
368 prepare_pab_DABpADB(1, a, b, zeta, zetb, pab_val, cab);
369 break;
371 prepare_pab_DABpADB(2, a, b, zeta, zetb, pab_val, cab);
372 break;
373 case GRID_FUNC_DAB_X:
374 prepare_pab_DAB(0, a, b, zeta, pab_val, cab);
375 break;
376 case GRID_FUNC_DAB_Y:
377 prepare_pab_DAB(1, a, b, zeta, pab_val, cab);
378 break;
379 case GRID_FUNC_DAB_Z:
380 prepare_pab_DAB(2, a, b, zeta, pab_val, cab);
381 break;
382 case GRID_FUNC_ADB_X:
383 prepare_pab_ADB(0, a, b, zetb, pab_val, cab);
384 break;
385 case GRID_FUNC_ADB_Y:
386 prepare_pab_ADB(1, a, b, zetb, pab_val, cab);
387 break;
388 case GRID_FUNC_ADB_Z:
389 prepare_pab_ADB(2, a, b, zetb, pab_val, cab);
390 break;
391 case GRID_FUNC_CORE_X:
392 prepare_pab_core(0, a, b, zeta, pab_val, cab);
393 break;
394 case GRID_FUNC_CORE_Y:
395 prepare_pab_core(1, a, b, zeta, pab_val, cab);
396 break;
397 case GRID_FUNC_CORE_Z:
398 prepare_pab_core(2, a, b, zeta, pab_val, cab);
399 break;
400 case GRID_FUNC_DX:
401 prepare_pab_Di(0, a, b, zeta, zetb, pab_val, cab);
402 break;
403 case GRID_FUNC_DY:
404 prepare_pab_Di(1, a, b, zeta, zetb, pab_val, cab);
405 break;
406 case GRID_FUNC_DZ:
407 prepare_pab_Di(2, a, b, zeta, zetb, pab_val, cab);
408 break;
409 case GRID_FUNC_DXDY:
410 prepare_pab_DiDj(0, 1, a, b, zeta, zetb, pab_val, cab);
411 break;
412 case GRID_FUNC_DYDZ:
413 prepare_pab_DiDj(1, 2, a, b, zeta, zetb, pab_val, cab);
414 break;
415 case GRID_FUNC_DZDX:
416 prepare_pab_DiDj(2, 0, a, b, zeta, zetb, pab_val, cab);
417 break;
418 case GRID_FUNC_DXDX:
419 prepare_pab_Di2(0, a, b, zeta, zetb, pab_val, cab);
420 break;
421 case GRID_FUNC_DYDY:
422 prepare_pab_Di2(1, a, b, zeta, zetb, pab_val, cab);
423 break;
424 case GRID_FUNC_DZDZ:
425 prepare_pab_Di2(2, a, b, zeta, zetb, pab_val, cab);
426 break;
427 default:
428 break; // Error: Unknown ga_gb_function - do nothing.
429 }
430}
431
432/*******************************************************************************
433 * \brief Differences in angular momentum.
434 * \author Ole Schuett
435 ******************************************************************************/
442
443/*******************************************************************************
444 * \brief Returns difference in angular momentum range for given func.
445 * \author Ole Schuett
446 ******************************************************************************/
448 prepare_ldiffs ldiffs;
449
450 switch (func) {
451 case GRID_FUNC_AB:
452 ldiffs.la_max_diff = 0;
453 ldiffs.la_min_diff = 0;
454 ldiffs.lb_max_diff = 0;
455 ldiffs.lb_min_diff = 0;
456 break;
457 case GRID_FUNC_DADB:
464 case GRID_FUNC_DAB_X:
465 case GRID_FUNC_DAB_Y:
466 case GRID_FUNC_DAB_Z:
467 case GRID_FUNC_ADB_X:
468 case GRID_FUNC_ADB_Y:
469 case GRID_FUNC_ADB_Z:
470 case GRID_FUNC_CORE_X:
471 case GRID_FUNC_CORE_Y:
472 case GRID_FUNC_CORE_Z:
473 ldiffs.la_max_diff = +1;
474 ldiffs.la_min_diff = -1;
475 ldiffs.lb_max_diff = +1;
476 ldiffs.lb_min_diff = -1;
477 break;
487 ldiffs.la_max_diff = +1;
488 ldiffs.la_min_diff = -1;
489 ldiffs.lb_max_diff = +2; // this is legit
490 ldiffs.lb_min_diff = -1;
491 break;
492 case GRID_FUNC_DX:
493 case GRID_FUNC_DY:
494 case GRID_FUNC_DZ:
495 ldiffs.la_max_diff = +1;
496 ldiffs.la_min_diff = -1;
497 ldiffs.lb_max_diff = +1;
498 ldiffs.lb_min_diff = -1;
499 break;
500 case GRID_FUNC_DXDY:
501 case GRID_FUNC_DYDZ:
502 case GRID_FUNC_DZDX:
503 case GRID_FUNC_DXDX:
504 case GRID_FUNC_DYDY:
505 case GRID_FUNC_DZDZ:
506 ldiffs.la_max_diff = +2;
507 ldiffs.la_min_diff = -2;
508 ldiffs.lb_max_diff = +2;
509 ldiffs.lb_min_diff = -2;
510 break;
511 default:
512 fprintf(stderr, "Error: Unknown ga_gb_function %i.\n", func);
513 abort();
514 }
515
516 return ldiffs;
517}
518
519// EOF
static GRID_HOST_DEVICE orbital up(const int i, const orbital a)
Increase i'th component of given orbital angular momentum.
static GRID_HOST_DEVICE orbital down(const int i, const orbital a)
Decrease i'th component of given orbital angular momentum.
grid_func
@ GRID_FUNC_ADBmDAB_X
@ GRID_FUNC_DZ
@ GRID_FUNC_DABpADB_X
@ GRID_FUNC_CORE_Z
@ GRID_FUNC_DY
@ GRID_FUNC_ARDBmDARB_YY
@ GRID_FUNC_DX
@ GRID_FUNC_DAB_Z
@ GRID_FUNC_ARDBmDARB_XY
@ GRID_FUNC_ARDBmDARB_ZY
@ GRID_FUNC_DAB_Y
@ GRID_FUNC_DYDY
@ GRID_FUNC_ARDBmDARB_XZ
@ GRID_FUNC_DZDX
@ GRID_FUNC_ARDBmDARB_YZ
@ GRID_FUNC_AB
@ GRID_FUNC_DYDZ
@ GRID_FUNC_ADBmDAB_Z
@ GRID_FUNC_DXDY
@ GRID_FUNC_DXDX
@ GRID_FUNC_ADBmDAB_Y
@ GRID_FUNC_DABpADB_Z
@ GRID_FUNC_ARDBmDARB_ZX
@ GRID_FUNC_DZDZ
@ GRID_FUNC_DAB_X
@ GRID_FUNC_ADB_Z
@ GRID_FUNC_ARDBmDARB_YX
@ GRID_FUNC_ARDBmDARB_ZZ
@ GRID_FUNC_ADB_X
@ GRID_FUNC_CORE_Y
@ GRID_FUNC_ARDBmDARB_XX
@ GRID_FUNC_CORE_X
@ GRID_FUNC_DABpADB_Y
@ GRID_FUNC_DADB
@ GRID_FUNC_ADB_Y
static void const int const int i
static GRID_DEVICE void prepare_pab(const enum grid_func func, const orbital a, const orbital b, const double zeta, const double zetb, const double pab_val, cab_store *cab)
Transforms a given element of the density matrix according to func.
static GRID_DEVICE void prepare_pab_ADBmDAB(const int idir, const orbital a, const orbital b, const double zeta, const double zetb, const double pab_val, cab_store *cab)
Implementation of function GRID_FUNC_ADBmDAB_{X,Y,Z}.
static GRID_DEVICE void prepare_pab_DABpADB(const int idir, const orbital a, const orbital b, const double zeta, const double zetb, const double pab_val, cab_store *cab)
Implementation of function GRID_FUNC_DABpADB_{X,Y,Z}.
static prepare_ldiffs prepare_get_ldiffs(const enum grid_func func)
Returns difference in angular momentum range for given func.
static GRID_DEVICE void prepare_pab_ADB(const int idir, const orbital a, const orbital b, const double zetb, const double pab_val, cab_store *cab)
Implementation of function GRID_FUNC_ADB_{X,Y,Z}. This function takes the derivates with respect to n...
static GRID_DEVICE void prepare_pab_AB(const orbital a, const orbital b, const double pab_val, cab_store *cab)
Implementation of function GRID_FUNC_AB, ie. identity transformation.
#define GRID_DEVICE
static GRID_DEVICE void prepare_pab_DAB(const int idir, const orbital a, const orbital b, const double zeta, const double pab_val, cab_store *cab)
Implementation of function GRID_FUNC_DAB_{X,Y,Z}. This function takes the derivates with respect to n...
static GRID_DEVICE void prepare_pab_ARDBmDARB(const int idir, const int ir, const orbital a, const orbital b, const double zeta, const double zetb, const double pab_val, cab_store *cab)
Implementation of function GRID_FUNC_ARDBmDARB_{X,Y,Z}{X,Y,Z}.
static GRID_DEVICE void prepare_pab_DiDj(const int ider1, const int ider2, const orbital a, const orbital b, const double zeta, const double zetb, const double pab_val, cab_store *cab)
Implementation of function GRID_FUNC_{DXDY,DYDZ,DZDX}.
static GRID_DEVICE void cab_add(cab_store *cab, const orbital a, const orbital b, const double value)
Adds given value to matrix element cab[idx(b)][idx(a)]. This function has to be implemented by the im...
static GRID_DEVICE void prepare_pab_Di2(const int ider, const orbital a, const orbital b, const double zeta, const double zetb, const double pab_val, cab_store *cab)
Implementation of function GRID_FUNC_{DXDX,DYDY,DZDZ}.
static GRID_DEVICE void prepare_pab_DADB(const orbital a, const orbital b, const double zeta, const double zetb, const double pab_val, cab_store *cab)
Implementation of function GRID_FUNC_DADB.
static GRID_DEVICE void prepare_pab_Di(const int ider, const orbital a, const orbital b, const double zeta, const double zetb, const double pab_val, cab_store *cab)
Implementation of function GRID_FUNC_{DX,DY,DZ}.
static GRID_DEVICE void oneterm_diidii(const int idir, const double func_a, const orbital a, const orbital b, const double zetb, cab_store *cab)
Helper for grid_prepare_pab_Di2.
static GRID_DEVICE void prepare_pab_core(const int idir, const orbital a, const orbital b, const double zeta, const double pab_val, cab_store *cab)
Implementation of function GRID_FUNC_CORE_{X,Y,Z}. This function takes the derivates with respect to ...
static GRID_DEVICE void oneterm_dijdij(const int idir, const double func_a, const orbital a, const orbital b, const double zetb, cab_store *cab)
Helper for grid_prepare_pab_DiDj.
Cab matrix container to be passed through get_force/virial to cab_get.
Orbital angular momentum.
Differences in angular momentum.