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 : 15 : #include "libgrpp.h" 16 : 17 : #include <stdlib.h> 18 : 19 : #define LIBGRPP_MAX_NUMBER_POTENTIALS 100 20 : 21 0 : libgrpp_grpp_t *libgrpp_new_grpp() { 22 0 : return (libgrpp_grpp_t *)calloc(1, sizeof(libgrpp_grpp_t)); 23 : } 24 : 25 0 : void libgrpp_grpp_set_local_potential(libgrpp_grpp_t *grpp, 26 : libgrpp_potential_t *pot) { 27 0 : if (grpp->U_L != NULL) { 28 0 : libgrpp_delete_potential(grpp->U_L); 29 : } 30 : 31 0 : grpp->U_L = pot; 32 0 : } 33 : 34 0 : void libgrpp_grpp_add_averaged_potential(libgrpp_grpp_t *grpp, 35 : libgrpp_potential_t *pot) { 36 0 : if (grpp->n_arep == 0) { 37 0 : grpp->U_arep = (libgrpp_potential_t **)calloc( 38 : LIBGRPP_MAX_NUMBER_POTENTIALS, sizeof(libgrpp_potential_t *)); 39 : } 40 : 41 0 : grpp->U_arep[grpp->n_arep++] = pot; 42 0 : } 43 : 44 0 : void libgrpp_grpp_add_spin_orbit_potential(libgrpp_grpp_t *grpp, 45 : libgrpp_potential_t *pot) { 46 0 : if (grpp->n_esop == 0) { 47 0 : grpp->U_esop = (libgrpp_potential_t **)calloc( 48 : LIBGRPP_MAX_NUMBER_POTENTIALS, sizeof(libgrpp_potential_t *)); 49 : } 50 : 51 0 : grpp->U_esop[grpp->n_esop++] = pot; 52 0 : } 53 : 54 0 : void libgrpp_grpp_add_outercore_potential(libgrpp_grpp_t *grpp, 55 : libgrpp_potential_t *pot, 56 : libgrpp_shell_t *oc_shell) { 57 0 : if (grpp->n_oc_shells == 0) { 58 0 : grpp->U_oc = (libgrpp_potential_t **)calloc(LIBGRPP_MAX_NUMBER_POTENTIALS, 59 : sizeof(libgrpp_potential_t *)); 60 0 : grpp->oc_shells = (libgrpp_shell_t **)calloc(LIBGRPP_MAX_NUMBER_POTENTIALS, 61 : sizeof(libgrpp_shell_t *)); 62 : } 63 : 64 0 : grpp->U_oc[grpp->n_oc_shells] = pot; 65 0 : grpp->oc_shells[grpp->n_oc_shells] = oc_shell; 66 0 : grpp->n_oc_shells++; 67 0 : } 68 : 69 0 : void libgrpp_delete_grpp(libgrpp_grpp_t *grpp) { 70 0 : if (grpp == NULL) { 71 : return; 72 : } 73 : 74 : /* 75 : * scalar-relativistic part 76 : */ 77 0 : if (grpp->U_L != NULL) { 78 0 : libgrpp_delete_potential(grpp->U_L); 79 : } 80 : 81 0 : for (int i = 0; i < grpp->n_arep; i++) { 82 0 : if (grpp->U_arep[i] != NULL) { 83 0 : libgrpp_delete_potential(grpp->U_arep[i]); 84 : } 85 : } 86 0 : free(grpp->U_arep); 87 : 88 : /* 89 : * effective spin-orbit operator 90 : */ 91 0 : for (int i = 0; i < grpp->n_esop; i++) { 92 0 : if (grpp->U_esop[i] != NULL) { 93 0 : libgrpp_delete_potential(grpp->U_esop[i]); 94 : } 95 : } 96 0 : free(grpp->U_esop); 97 : 98 : /* 99 : * outercore shells and potentials 100 : */ 101 0 : for (int i = 0; i < grpp->n_oc_shells; i++) { 102 0 : if (grpp->U_oc[i] != NULL) { 103 0 : libgrpp_delete_potential(grpp->U_oc[i]); 104 : } 105 0 : if (grpp->oc_shells[i] != NULL) { 106 0 : libgrpp_delete_shell(grpp->oc_shells[i]); 107 : } 108 : } 109 0 : free(grpp->U_oc); 110 0 : free(grpp->oc_shells); 111 : 112 0 : free(grpp); 113 : }