LCOV - code coverage report
Current view: top level - src/grpp - grpp_parameters.c (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:936074a) Lines: 25.0 % 48 12
Test Date: 2025-12-04 06:27:48 Functions: 12.5 % 8 1

            Line data    Source code
       1              : /*----------------------------------------------------------------------------*/
       2              : /*  CP2K: A general program to perform molecular dynamics simulations         */
       3              : /*  Copyright 2000-2025 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            0 :   { libgrpp_params.radial_tolerance = tolerance; }
      46            0 : }
      47              : 
      48            0 : void libgrpp_set_angular_screening_tolerance(double tolerance) {
      49              :   // #pragma omp critical
      50            0 :   { libgrpp_params.angular_screening_tolerance = tolerance; }
      51            0 : }
      52              : 
      53            0 : void libgrpp_set_modified_bessel_tolerance(double tolerance) {
      54              :   // #pragma omp critical
      55            0 :   { libgrpp_params.modified_bessel_tolerance = tolerance; }
      56            0 : }
      57              : 
      58            0 : void libgrpp_set_cartesian_order(int order) {
      59              :   // #pragma omp critical
      60              :   {
      61            0 :     assert(order == LIBGRPP_CART_ORDER_DIRAC ||
      62              :            order == LIBGRPP_CART_ORDER_TURBOMOLE);
      63              : 
      64            0 :     if (order == LIBGRPP_CART_ORDER_DIRAC) {
      65            0 :       libgrpp_set_cartesian_generator(cartesian_generator_dirac);
      66            0 :     } else if (order == LIBGRPP_CART_ORDER_TURBOMOLE) {
      67            0 :       libgrpp_set_cartesian_generator(cartesian_generator_turbomole);
      68              :     }
      69              :   }
      70            0 : }
      71              : 
      72            0 : void libgrpp_set_cartesian_generator(
      73              :     int (*cartesian_generator)(int L, int *cart_list)) {
      74              :   // #pragma omp critical
      75            0 :   { libgrpp_params.cartesian_generator = cartesian_generator; }
      76            0 : }
      77              : 
      78       701560 : static int cartesian_generator_dirac(int L, int *cart_list) {
      79       701560 :   int count = 0;
      80       701560 :   int n_cart = (L + 1) * (L + 2) / 2;
      81              : 
      82      2053782 :   for (int r = L; r >= 0; r--) {
      83      4442764 :     for (int s = L; s >= 0; s--) {
      84     11112736 :       for (int t = L; t >= 0; t--) {
      85      8022194 :         if (r + s + t == L) {
      86      2221382 :           cart_list[3 * count + 0] = r;
      87      2221382 :           cart_list[3 * count + 1] = s;
      88      2221382 :           cart_list[3 * count + 2] = t;
      89      2221382 :           count++;
      90              :         }
      91              :       }
      92              :     }
      93              :   }
      94              : 
      95       701560 :   return n_cart;
      96              : }
      97              : 
      98            0 : static int cartesian_generator_turbomole(int L, int *cart_list) {
      99            0 :   int count = 0;
     100            0 :   int n_cart = (L + 1) * (L + 2) / 2;
     101              : 
     102            0 :   for (int r = L; r >= 0; r--) {
     103            0 :     for (int s = L - r; s >= 0; s--) {
     104            0 :       int t = L - r - s;
     105              : 
     106            0 :       cart_list[3 * count + 0] = r;
     107            0 :       cart_list[3 * count + 1] = s;
     108            0 :       cart_list[3 * count + 2] = t;
     109              : 
     110            0 :       count++;
     111              :     }
     112              :   }
     113              : 
     114            0 :   return n_cart;
     115              : }
        

Generated by: LCOV version 2.0-1