Line data Source code
1 : /*----------------------------------------------------------------------------*/
2 : /* CP2K: A general program to perform molecular dynamics simulations */
3 : /* Copyright 2000-2026 CP2K developers group <https://cp2k.org> */
4 : /* */
5 : /* SPDX-License-Identifier: MIT */
6 : /*----------------------------------------------------------------------------*/
7 :
8 : /*
9 : * libgrpp - a library for the evaluation of integrals over
10 : * generalized relativistic pseudopotentials.
11 : *
12 : * Copyright (C) 2021-2023 Alexander Oleynichenko
13 : */
14 : #include <assert.h>
15 :
16 : #include "grpp_parameters.h"
17 :
18 : static int cartesian_generator_dirac(int L, int *cart_list);
19 :
20 : static int cartesian_generator_turbomole(int L, int *cart_list);
21 :
22 : libgrpp_parameters_t libgrpp_params = {
23 : // tolerance of radial integration
24 : 1e-16,
25 : // tolerance of angular integral screening
26 : 1e-16,
27 : // tolerance of modified Bessel functions evaluation
28 : // is it really needed?
29 : 1e-16,
30 : // subroutine to generate cartesian components with given ang momentum L
31 : cartesian_generator_dirac};
32 :
33 0 : void libgrpp_set_default_parameters() {
34 : // #pragma omp critical
35 : {
36 0 : libgrpp_set_radial_tolerance(1e-16);
37 0 : libgrpp_set_angular_screening_tolerance(1e-16);
38 0 : libgrpp_set_modified_bessel_tolerance(1e-16);
39 0 : libgrpp_set_cartesian_generator(cartesian_generator_dirac);
40 : }
41 0 : }
42 :
43 0 : void libgrpp_set_radial_tolerance(double tolerance) {
44 : // #pragma omp critical
45 : {
46 0 : libgrpp_params.radial_tolerance = tolerance;
47 : }
48 0 : }
49 :
50 0 : void libgrpp_set_angular_screening_tolerance(double tolerance) {
51 : // #pragma omp critical
52 : {
53 0 : libgrpp_params.angular_screening_tolerance = tolerance;
54 : }
55 0 : }
56 :
57 0 : void libgrpp_set_modified_bessel_tolerance(double tolerance) {
58 : // #pragma omp critical
59 : {
60 0 : libgrpp_params.modified_bessel_tolerance = tolerance;
61 : }
62 0 : }
63 :
64 0 : void libgrpp_set_cartesian_order(int order) {
65 : // #pragma omp critical
66 : {
67 0 : assert(order == LIBGRPP_CART_ORDER_DIRAC ||
68 : order == LIBGRPP_CART_ORDER_TURBOMOLE);
69 :
70 0 : if (order == LIBGRPP_CART_ORDER_DIRAC) {
71 0 : libgrpp_set_cartesian_generator(cartesian_generator_dirac);
72 0 : } else if (order == LIBGRPP_CART_ORDER_TURBOMOLE) {
73 0 : libgrpp_set_cartesian_generator(cartesian_generator_turbomole);
74 : }
75 : }
76 0 : }
77 :
78 0 : void libgrpp_set_cartesian_generator(
79 : int (*cartesian_generator)(int L, int *cart_list)) {
80 : // #pragma omp critical
81 : {
82 0 : libgrpp_params.cartesian_generator = cartesian_generator;
83 : }
84 0 : }
85 :
86 2073456 : static int cartesian_generator_dirac(int L, int *cart_list) {
87 2073456 : int count = 0;
88 2073456 : int n_cart = (L + 1) * (L + 2) / 2;
89 :
90 5865750 : for (int r = L; r >= 0; r--) {
91 11995500 : for (int s = L; s >= 0; s--) {
92 28336032 : for (int t = L; t >= 0; t--) {
93 20132826 : if (r + s + t == L) {
94 5997750 : cart_list[3 * count + 0] = r;
95 5997750 : cart_list[3 * count + 1] = s;
96 5997750 : cart_list[3 * count + 2] = t;
97 5997750 : count++;
98 : }
99 : }
100 : }
101 : }
102 :
103 2073456 : return n_cart;
104 : }
105 :
106 0 : static int cartesian_generator_turbomole(int L, int *cart_list) {
107 0 : int count = 0;
108 0 : int n_cart = (L + 1) * (L + 2) / 2;
109 :
110 0 : for (int r = L; r >= 0; r--) {
111 0 : for (int s = L - r; s >= 0; s--) {
112 0 : int t = L - r - s;
113 :
114 0 : cart_list[3 * count + 0] = r;
115 0 : cart_list[3 * count + 1] = s;
116 0 : cart_list[3 * count + 2] = t;
117 :
118 0 : count++;
119 : }
120 : }
121 :
122 0 : return n_cart;
123 : }
|