LCOV - code coverage report
Current view: top level - src/grpp - grpp_parameters.c (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:66ce584) Lines: 25.0 % 48 12
Test Date: 2026-09-12 06:50:25 Functions: 12.5 % 8 1

            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              : }
        

Generated by: LCOV version 2.0-1