LCOV - code coverage report
Current view: top level - src - atom_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:07c9450) Lines: 63.4 % 1748 1109
Test Date: 2025-12-13 06:52:47 Functions: 52.4 % 42 22

            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: GPL-2.0-or-later                                                      !
       6              : !--------------------------------------------------------------------------------------------------!
       7              : 
       8              : ! **************************************************************************************************
       9              : !> \brief   Define the atom type and its sub types
      10              : !> \author  jgh
      11              : !> \date    03.03.2008
      12              : !> \version 1.0
      13              : !>
      14              : ! **************************************************************************************************
      15              : MODULE atom_types
      16              :    USE atom_upf,                        ONLY: atom_read_upf,&
      17              :                                               atom_release_upf,&
      18              :                                               atom_upfpot_type
      19              :    USE bessel_lib,                      ONLY: bessel0
      20              :    USE bibliography,                    ONLY: Limpanuparb2011,&
      21              :                                               cite_reference
      22              :    USE cp_linked_list_input,            ONLY: cp_sll_val_next,&
      23              :                                               cp_sll_val_type
      24              :    USE cp_parser_methods,               ONLY: parser_get_next_line,&
      25              :                                               parser_get_object,&
      26              :                                               parser_read_line,&
      27              :                                               parser_search_string,&
      28              :                                               parser_test_next_token
      29              :    USE cp_parser_types,                 ONLY: cp_parser_type,&
      30              :                                               parser_create,&
      31              :                                               parser_release
      32              :    USE input_constants,                 ONLY: &
      33              :         barrier_conf, contracted_gto, do_analytic, do_gapw_log, do_nonrel_atom, do_numeric, &
      34              :         do_potential_coulomb, do_potential_long, do_potential_mix_cl, do_potential_short, &
      35              :         do_rks_atom, do_semi_analytic, ecp_pseudo, gaussian, geometrical_gto, gth_pseudo, no_conf, &
      36              :         no_pseudo, numerical, poly_conf, sgp_pseudo, slater, upf_pseudo
      37              :    USE input_section_types,             ONLY: section_vals_get,&
      38              :                                               section_vals_get_subs_vals,&
      39              :                                               section_vals_list_get,&
      40              :                                               section_vals_type,&
      41              :                                               section_vals_val_get
      42              :    USE input_val_types,                 ONLY: val_get,&
      43              :                                               val_type
      44              :    USE kinds,                           ONLY: default_string_length,&
      45              :                                               dp
      46              :    USE mathconstants,                   ONLY: dfac,&
      47              :                                               fac,&
      48              :                                               pi,&
      49              :                                               rootpi
      50              :    USE periodic_table,                  ONLY: get_ptable_info,&
      51              :                                               ptable
      52              :    USE qs_grid_atom,                    ONLY: allocate_grid_atom,&
      53              :                                               create_grid_atom,&
      54              :                                               deallocate_grid_atom,&
      55              :                                               grid_atom_type
      56              :    USE string_utilities,                ONLY: remove_word,&
      57              :                                               uppercase
      58              : #include "./base/base_uses.f90"
      59              : 
      60              :    IMPLICIT NONE
      61              : 
      62              :    PRIVATE
      63              : 
      64              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'atom_types'
      65              : 
      66              :    ! maximum l-quantum number considered in atomic code/basis
      67              :    INTEGER, PARAMETER                                 :: lmat = 5
      68              : 
      69              :    INTEGER, PARAMETER                                 :: GTO_BASIS = 100, &
      70              :                                                          CGTO_BASIS = 101, &
      71              :                                                          STO_BASIS = 102, &
      72              :                                                          NUM_BASIS = 103
      73              : 
      74              :    INTEGER, PARAMETER                                 :: nmax = 25
      75              : 
      76              : !> \brief Provides all information about a basis set
      77              : ! **************************************************************************************************
      78              :    TYPE atom_basis_type
      79              :       INTEGER                                       :: basis_type = GTO_BASIS
      80              :       INTEGER, DIMENSION(0:lmat)                    :: nbas = 0
      81              :       INTEGER, DIMENSION(0:lmat)                    :: nprim = 0
      82              :       REAL(KIND=dp), DIMENSION(:, :), POINTER       :: am => NULL() !GTO exponents
      83              :       REAL(KIND=dp), DIMENSION(:, :, :), POINTER    :: cm => NULL() !Contraction coeffs
      84              :       REAL(KIND=dp), DIMENSION(:, :), POINTER       :: as => NULL() !STO exponents
      85              :       INTEGER, DIMENSION(:, :), POINTER             :: ns => NULL() !STO n-quantum numbers
      86              :       REAL(KIND=dp), DIMENSION(:, :, :), POINTER    :: bf => NULL() !num. bsf
      87              :       REAL(KIND=dp), DIMENSION(:, :, :), POINTER    :: dbf => NULL() !derivatives (num)
      88              :       REAL(KIND=dp), DIMENSION(:, :, :), POINTER    :: ddbf => NULL() !2nd derivatives (num)
      89              :       REAL(KIND=dp)                                 :: eps_eig = 0.0_dp
      90              :       TYPE(grid_atom_type), POINTER                 :: grid => NULL()
      91              :       LOGICAL                                       :: geometrical = .FALSE.
      92              :       REAL(KIND=dp)                                 :: aval = 0.0_dp, cval = 0.0_dp
      93              :       INTEGER, DIMENSION(0:lmat)                    :: start = 0
      94              :    END TYPE atom_basis_type
      95              : 
      96              : !> \brief Provides all information about a pseudopotential
      97              : ! **************************************************************************************************
      98              :    TYPE atom_gthpot_type
      99              :       CHARACTER(LEN=2)                              :: symbol = ""
     100              :       CHARACTER(LEN=default_string_length)          :: pname = ""
     101              :       INTEGER, DIMENSION(0:lmat)                    :: econf = 0
     102              :       REAL(dp)                                      :: zion = 0.0_dp
     103              :       REAL(dp)                                      :: rc = 0.0_dp
     104              :       INTEGER                                       :: ncl = 0
     105              :       REAL(dp), DIMENSION(5)                        :: cl = 0.0_dp
     106              :       INTEGER, DIMENSION(0:lmat)                    :: nl = 0
     107              :       REAL(dp), DIMENSION(0:lmat)                   :: rcnl = 0.0_dp
     108              :       REAL(dp), DIMENSION(4, 4, 0:lmat)             :: hnl = 0.0_dp
     109              :       ! SOC
     110              :       LOGICAL                                       :: soc = .FALSE.
     111              :       REAL(dp), DIMENSION(4, 4, 0:lmat)             :: knl = 0.0_dp
     112              :       ! type extensions
     113              :       ! NLCC
     114              :       LOGICAL                                       :: nlcc = .FALSE.
     115              :       INTEGER                                       :: nexp_nlcc = 0
     116              :       REAL(KIND=dp), DIMENSION(10)                  :: alpha_nlcc = 0.0_dp
     117              :       INTEGER, DIMENSION(10)                        :: nct_nlcc = 0
     118              :       REAL(KIND=dp), DIMENSION(4, 10)               :: cval_nlcc = 0.0_dp
     119              :       ! LSD potential
     120              :       LOGICAL                                       :: lsdpot = .FALSE.
     121              :       INTEGER                                       :: nexp_lsd = 0
     122              :       REAL(KIND=dp), DIMENSION(10)                  :: alpha_lsd = 0.0_dp
     123              :       INTEGER, DIMENSION(10)                        :: nct_lsd = 0
     124              :       REAL(KIND=dp), DIMENSION(4, 10)               :: cval_lsd = 0.0_dp
     125              :       ! extended local potential
     126              :       LOGICAL                                       :: lpotextended = .FALSE.
     127              :       INTEGER                                       :: nexp_lpot = 0
     128              :       REAL(KIND=dp), DIMENSION(10)                  :: alpha_lpot = 0.0_dp
     129              :       INTEGER, DIMENSION(10)                        :: nct_lpot = 0
     130              :       REAL(KIND=dp), DIMENSION(4, 10)               :: cval_lpot = 0.0_dp
     131              :    END TYPE atom_gthpot_type
     132              : 
     133              :    TYPE atom_ecppot_type
     134              :       CHARACTER(LEN=2)                              :: symbol = ""
     135              :       CHARACTER(LEN=default_string_length)          :: pname = ""
     136              :       INTEGER, DIMENSION(0:lmat)                    :: econf = 0
     137              :       REAL(dp)                                      :: zion = 0.0_dp
     138              :       INTEGER                                       :: lmax = 0
     139              :       INTEGER                                       :: nloc = 0 ! # terms
     140              :       INTEGER, DIMENSION(1:15)                      :: nrloc = 0 ! r**(n-2)
     141              :       REAL(dp), DIMENSION(1:15)                     :: aloc = 0.0_dp ! coefficient
     142              :       REAL(dp), DIMENSION(1:15)                     :: bloc = 0.0_dp ! exponent
     143              :       INTEGER, DIMENSION(0:10)                      :: npot = 0 ! # terms
     144              :       INTEGER, DIMENSION(1:15, 0:10)                :: nrpot = 0 ! r**(n-2)
     145              :       REAL(dp), DIMENSION(1:15, 0:10)               :: apot = 0.0_dp ! coefficient
     146              :       REAL(dp), DIMENSION(1:15, 0:10)               :: bpot = 0.0_dp ! exponent
     147              :    END TYPE atom_ecppot_type
     148              : 
     149              :    TYPE atom_sgppot_type
     150              :       CHARACTER(LEN=2)                              :: symbol = ""
     151              :       CHARACTER(LEN=default_string_length)          :: pname = ""
     152              :       INTEGER, DIMENSION(0:lmat)                    :: econf = 0
     153              :       REAL(dp)                                      :: zion = 0.0_dp
     154              :       INTEGER                                       :: lmax = 0
     155              :       LOGICAL                                       :: has_nonlocal = .FALSE.
     156              :       INTEGER                                       :: n_nonlocal = 0
     157              :       LOGICAL, DIMENSION(0:5)                       :: is_nonlocal = .FALSE.
     158              :       REAL(KIND=dp), DIMENSION(nmax)                :: a_nonlocal = 0.0_dp
     159              :       REAL(KIND=dp), DIMENSION(nmax, 0:lmat)        :: h_nonlocal = 0.0_dp
     160              :       REAL(KIND=dp), DIMENSION(nmax, nmax, 0:lmat)  :: c_nonlocal = 0.0_dp
     161              :       INTEGER                                       :: n_local = 0
     162              :       REAL(KIND=dp)                                 :: ac_local = 0.0_dp
     163              :       REAL(KIND=dp), DIMENSION(nmax)                :: a_local = 0.0_dp
     164              :       REAL(KIND=dp), DIMENSION(nmax)                :: c_local = 0.0_dp
     165              :       LOGICAL                                       :: has_nlcc = .FALSE.
     166              :       INTEGER                                       :: n_nlcc = 0
     167              :       REAL(KIND=dp), DIMENSION(nmax)                :: a_nlcc = 0.0_dp
     168              :       REAL(KIND=dp), DIMENSION(nmax)                :: c_nlcc = 0.0_dp
     169              :    END TYPE atom_sgppot_type
     170              : 
     171              :    TYPE atom_potential_type
     172              :       INTEGER                                       :: ppot_type = 0
     173              :       LOGICAL                                       :: confinement = .FALSE.
     174              :       INTEGER                                       :: conf_type = 0
     175              :       REAL(dp)                                      :: acon = 0.0_dp
     176              :       REAL(dp)                                      :: rcon = 0.0_dp
     177              :       REAL(dp)                                      :: scon = 0.0_dp
     178              :       TYPE(atom_gthpot_type)                        :: gth_pot = atom_gthpot_type()
     179              :       TYPE(atom_ecppot_type)                        :: ecp_pot = atom_ecppot_type()
     180              :       TYPE(atom_upfpot_type)                        :: upf_pot = atom_upfpot_type()
     181              :       TYPE(atom_sgppot_type)                        :: sgp_pot = atom_sgppot_type()
     182              :    END TYPE atom_potential_type
     183              : 
     184              : !> \brief Provides info about hartree-fock exchange (For now, we only support potentials that can be represented
     185              : !>        with Coulomb and longrange-coulomb potential)
     186              : ! **************************************************************************************************
     187              :    TYPE atom_hfx_type
     188              :       REAL(KIND=dp)                                 :: scale_coulomb = 0.0_dp
     189              :       REAL(KIND=dp)                                 :: scale_longrange = 0.0_dp
     190              :       REAL(KIND=dp)                                 :: omega = 0.0_dp
     191              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :) :: kernel
     192              :       LOGICAL                                       :: do_gh = .FALSE.
     193              :       INTEGER                                       :: nr_gh = 0
     194              :    END TYPE atom_hfx_type
     195              : 
     196              : !> \brief Provides all information on states and occupation
     197              : ! **************************************************************************************************
     198              :    TYPE atom_state
     199              :       REAL(KIND=dp), DIMENSION(0:lmat, 10)          :: occ = 0.0_dp
     200              :       REAL(KIND=dp), DIMENSION(0:lmat, 10)          :: core = 0.0_dp
     201              :       REAL(KIND=dp), DIMENSION(0:lmat, 10)          :: occupation = 0.0_dp
     202              :       INTEGER                                       :: maxl_occ = 0
     203              :       INTEGER, DIMENSION(0:lmat)                    :: maxn_occ = 0
     204              :       INTEGER                                       :: maxl_calc = 0
     205              :       INTEGER, DIMENSION(0:lmat)                    :: maxn_calc = 0
     206              :       INTEGER                                       :: multiplicity = 0
     207              :       REAL(KIND=dp), DIMENSION(0:lmat, 10)          :: occa = 0.0_dp, occb = 0.0_dp
     208              :    END TYPE atom_state
     209              : 
     210              : !> \brief Holds atomic integrals
     211              : ! **************************************************************************************************
     212              :    TYPE eri
     213              :       REAL(KIND=dp), DIMENSION(:, :), POINTER       :: int => NULL()
     214              :    END TYPE eri
     215              : 
     216              :    TYPE atom_integrals
     217              :       INTEGER                                       :: status = 0
     218              :       INTEGER                                       :: ppstat = 0
     219              :       LOGICAL                                       :: eri_coulomb = .FALSE.
     220              :       LOGICAL                                       :: eri_exchange = .FALSE.
     221              :       LOGICAL                                       :: all_nu = .FALSE.
     222              :       INTEGER, DIMENSION(0:lmat)                    :: n = 0, nne = 0
     223              :       REAL(KIND=dp), DIMENSION(:, :, :), POINTER    :: ovlp => NULL(), kin => NULL(), core => NULL(), clsd => NULL()
     224              :       REAL(KIND=dp), DIMENSION(:, :, :), POINTER    :: utrans => NULL(), uptrans => NULL()
     225              :       REAL(KIND=dp), DIMENSION(:, :, :), POINTER    :: hnl => NULL()
     226              :       REAL(KIND=dp), DIMENSION(:, :, :), POINTER    :: conf => NULL()
     227              :       TYPE(eri), DIMENSION(100)                     :: ceri = eri()
     228              :       TYPE(eri), DIMENSION(100)                     :: eeri = eri()
     229              :       INTEGER                                       :: dkhstat = 0
     230              :       INTEGER                                       :: zorastat = 0
     231              :       REAL(KIND=dp), DIMENSION(:, :, :), POINTER    :: tzora => NULL()
     232              :       REAL(KIND=dp), DIMENSION(:, :, :), POINTER    :: hdkh => NULL()
     233              :    END TYPE atom_integrals
     234              : 
     235              : !> \brief Holds atomic orbitals and energies
     236              : ! **************************************************************************************************
     237              :    TYPE atom_orbitals
     238              :       REAL(KIND=dp), DIMENSION(:, :, :), POINTER    :: wfn => NULL(), wfna => NULL(), wfnb => NULL()
     239              :       REAL(KIND=dp), DIMENSION(:, :, :), POINTER    :: pmat => NULL(), pmata => NULL(), pmatb => NULL()
     240              :       REAL(KIND=dp), DIMENSION(:, :), POINTER       :: ener => NULL(), enera => NULL(), enerb => NULL()
     241              :       REAL(KIND=dp), DIMENSION(:, :, :), POINTER    :: refene => NULL(), refchg => NULL(), refnod => NULL()
     242              :       REAL(KIND=dp), DIMENSION(:, :, :), POINTER    :: wrefene => NULL(), wrefchg => NULL(), wrefnod => NULL()
     243              :       REAL(KIND=dp), DIMENSION(:, :, :), POINTER    :: crefene => NULL(), crefchg => NULL(), crefnod => NULL()
     244              :       REAL(KIND=dp), DIMENSION(:, :), POINTER       :: wpsir0 => NULL(), tpsir0 => NULL()
     245              :       REAL(KIND=dp), DIMENSION(:, :, :), POINTER    :: rcmax => NULL()
     246              :       CHARACTER(LEN=2), DIMENSION(:, :, :), POINTER :: reftype => NULL()
     247              :    END TYPE atom_orbitals
     248              : 
     249              : !> \brief Operator matrices
     250              : ! **************************************************************************************************
     251              :    TYPE opmat_type
     252              :       INTEGER, DIMENSION(0:lmat)                    :: n = 0
     253              :       REAL(KIND=dp), DIMENSION(:, :, :), POINTER    :: op => NULL()
     254              :    END TYPE opmat_type
     255              : 
     256              : !> \brief Operator grids
     257              : ! **************************************************************************************************
     258              :    TYPE opgrid_type
     259              :       REAL(KIND=dp), DIMENSION(:), POINTER          :: op => NULL()
     260              :       TYPE(grid_atom_type), POINTER                 :: grid => NULL()
     261              :    END TYPE opgrid_type
     262              : 
     263              : !> \brief All energies
     264              : ! **************************************************************************************************
     265              :    TYPE atom_energy_type
     266              :       REAL(KIND=dp)                                 :: etot = 0.0_dp
     267              :       REAL(KIND=dp)                                 :: eband = 0.0_dp
     268              :       REAL(KIND=dp)                                 :: ekin = 0.0_dp
     269              :       REAL(KIND=dp)                                 :: epot = 0.0_dp
     270              :       REAL(KIND=dp)                                 :: ecore = 0.0_dp
     271              :       REAL(KIND=dp)                                 :: elsd = 0.0_dp
     272              :       REAL(KIND=dp)                                 :: epseudo = 0.0_dp
     273              :       REAL(KIND=dp)                                 :: eploc = 0.0_dp
     274              :       REAL(KIND=dp)                                 :: epnl = 0.0_dp
     275              :       REAL(KIND=dp)                                 :: exc = 0.0_dp
     276              :       REAL(KIND=dp)                                 :: ecoulomb = 0.0_dp
     277              :       REAL(KIND=dp)                                 :: eexchange = 0.0_dp
     278              :       REAL(KIND=dp)                                 :: econfinement = 0.0_dp
     279              :    END TYPE atom_energy_type
     280              : 
     281              : !> \brief Information on optimization procedure
     282              : ! **************************************************************************************************
     283              :    TYPE atom_optimization_type
     284              :       REAL(KIND=dp)                                 :: damping = 0.0_dp
     285              :       REAL(KIND=dp)                                 :: eps_scf = 0.0_dp
     286              :       REAL(KIND=dp)                                 :: eps_diis = 0.0_dp
     287              :       INTEGER                                       :: max_iter = 0
     288              :       INTEGER                                       :: n_diis = 0
     289              :    END TYPE atom_optimization_type
     290              : 
     291              : !> \brief Provides all information about an atomic kind
     292              : ! **************************************************************************************************
     293              :    TYPE atom_type
     294              :       INTEGER                                       :: z = 0
     295              :       INTEGER                                       :: zcore = 0
     296              :       LOGICAL                                       :: pp_calc = .FALSE.
     297              : ! ZMP adding in type some variables
     298              :       LOGICAL                                       :: do_zmp = .FALSE., doread = .FALSE., read_vxc = .FALSE., dm = .FALSE.
     299              :       CHARACTER(LEN=default_string_length)          :: ext_file = "", ext_vxc_file = "", &
     300              :                                                        zmp_restart_file = ""
     301              : !
     302              :       INTEGER                                       :: method_type = do_rks_atom
     303              :       INTEGER                                       :: relativistic = do_nonrel_atom
     304              :       INTEGER                                       :: coulomb_integral_type = do_analytic
     305              :       INTEGER                                       :: exchange_integral_type = do_analytic
     306              : ! ZMP
     307              :       REAL(KIND=dp)                                 :: lambda = 0.0_dp
     308              :       REAL(KIND=dp)                                 :: rho_diff_integral = 0.0_dp
     309              :       REAL(KIND=dp)                                 :: weight = 0.0_dp, zmpgrid_tol = 0.0_dp, zmpvxcgrid_tol = 0.0_dp
     310              : !
     311              :       TYPE(atom_basis_type), POINTER                :: basis => NULL()
     312              :       TYPE(atom_potential_type), POINTER            :: potential => NULL()
     313              :       TYPE(atom_state), POINTER                     :: state => NULL()
     314              :       TYPE(atom_integrals), POINTER                 :: integrals => NULL()
     315              :       TYPE(atom_orbitals), POINTER                  :: orbitals => NULL()
     316              :       TYPE(atom_energy_type)                        :: energy = atom_energy_type()
     317              :       TYPE(atom_optimization_type)                  :: optimization = atom_optimization_type()
     318              :       TYPE(section_vals_type), POINTER              :: xc_section => NULL(), zmp_section => NULL()
     319              :       TYPE(opmat_type), POINTER                     :: fmat => NULL()
     320              :       TYPE(atom_hfx_type)                           :: hfx_pot = atom_hfx_type()
     321              :    END TYPE atom_type
     322              : ! **************************************************************************************************
     323              :    TYPE atom_p_type
     324              :       TYPE(atom_type), POINTER                      :: atom => NULL()
     325              :    END TYPE atom_p_type
     326              : 
     327              :    PUBLIC :: lmat
     328              :    PUBLIC :: atom_p_type, atom_type, atom_basis_type, atom_state, atom_integrals
     329              :    PUBLIC :: atom_orbitals, eri, atom_potential_type, atom_hfx_type
     330              :    PUBLIC :: atom_gthpot_type, atom_ecppot_type, atom_sgppot_type
     331              :    PUBLIC :: atom_optimization_type
     332              :    PUBLIC :: atom_compare_grids
     333              :    PUBLIC :: create_atom_type, release_atom_type, set_atom
     334              :    PUBLIC :: create_atom_orbs, release_atom_orbs
     335              :    PUBLIC :: init_atom_basis, init_atom_basis_default_pp, atom_basis_gridrep, release_atom_basis
     336              :    PUBLIC :: init_atom_potential, release_atom_potential
     337              :    PUBLIC :: read_atom_opt_section, read_ecp_potential
     338              :    PUBLIC :: Clementi_geobas
     339              :    PUBLIC :: GTO_BASIS, CGTO_BASIS, STO_BASIS, NUM_BASIS
     340              :    PUBLIC :: opmat_type, create_opmat, release_opmat
     341              :    PUBLIC :: opgrid_type, create_opgrid, release_opgrid
     342              :    PUBLIC :: no_pseudo, gth_pseudo, sgp_pseudo, upf_pseudo, ecp_pseudo
     343              :    PUBLIC :: setup_hf_section
     344              : 
     345              : ! **************************************************************************************************
     346              : 
     347              : CONTAINS
     348              : 
     349              : ! **************************************************************************************************
     350              : !> \brief Initialize the basis for the atomic code
     351              : !> \param basis ...
     352              : !> \param basis_section ...
     353              : !> \param zval ...
     354              : !> \param btyp ...
     355              : !> \note  Highly accurate relativistic universal Gaussian basis set: Dirac-Fock-Coulomb calculations
     356              : !>        for atomic systems up to nobelium
     357              : !>        J. Chem. Phys. 101, 6829 (1994); DOI:10.1063/1.468311
     358              : !>        G. L. Malli and A. B. F. Da Silva
     359              : !>        Department of Chemistry, Simon Fraser University, Burnaby, B.C., Canada
     360              : !>        Yasuyuki Ishikawa
     361              : !>        Department of Chemistry, University of Puerto Rico, San Juan, Puerto Rico
     362              : !>
     363              : !>        A universal Gaussian basis set is developed that leads to relativistic Dirac-Fock SCF energies
     364              : !>        of comparable accuracy as that obtained by the accurate numerical finite-difference method
     365              : !>        (GRASP2 package) [J. Phys. B 25, 1 (1992)]. The Gaussian-type functions of our universal basis
     366              : !>        set satisfy the relativistic boundary conditions associated with the finite nuclear model for a
     367              : !>        finite speed of light and conform to the so-called kinetic balance at the nonrelativistic limit.
     368              : !>        We attribute the exceptionally high accuracy obtained in our calculations to the fact that the
     369              : !>        representation of the relativistic dynamics of an electron in a spherical ball finite nucleus
     370              : !>        near the origin in terms of our universal Gaussian basis set is as accurate as that provided by
     371              : !>        the numerical finite-difference method. Results of the Dirac-Fock-Coulomb energies for a number
     372              : !>        of atoms up to No (Z=102) and some negative ions are presented and compared with the recent
     373              : !>        results obtained with the numerical finite-difference method and geometrical Gaussian basis sets
     374              : !>        by Parpia, Mohanty, and Clementi [J. Phys. B 25, 1 (1992)]. The accuracy of our calculations is
     375              : !>        estimated to be within a few parts in 109 for all the atomic systems studied.
     376              : ! **************************************************************************************************
     377         2900 :    SUBROUTINE init_atom_basis(basis, basis_section, zval, btyp)
     378              :       TYPE(atom_basis_type), INTENT(INOUT)               :: basis
     379              :       TYPE(section_vals_type), POINTER                   :: basis_section
     380              :       INTEGER, INTENT(IN)                                :: zval
     381              :       CHARACTER(LEN=2)                                   :: btyp
     382              : 
     383              :       CHARACTER(LEN=*), PARAMETER                        :: routineN = 'init_atom_basis'
     384              :       INTEGER, PARAMETER                                 :: nua = 40, nup = 16
     385              :       REAL(KIND=dp), DIMENSION(nua), PARAMETER :: ugbs = [0.007299_dp, 0.013705_dp, 0.025733_dp, &
     386              :          0.048316_dp, 0.090718_dp, 0.170333_dp, 0.319819_dp, 0.600496_dp, 1.127497_dp, 2.117000_dp,&
     387              :          3.974902_dp, 7.463317_dp, 14.013204_dp, 26.311339_dp, 49.402449_dp, 92.758561_dp, &
     388              :          174.164456_dp, 327.013024_dp, 614.003114_dp, 1152.858743_dp, 2164.619772_dp, &
     389              :          4064.312984_dp, 7631.197056_dp, 14328.416324_dp, 26903.186074_dp, 50513.706789_dp, &
     390              :          94845.070265_dp, 178082.107320_dp, 334368.848683_dp, 627814.487663_dp, 1178791.123851_dp, &
     391              :          2213310.684886_dp, 4155735.557141_dp, 7802853.046713_dp, 14650719.428954_dp, &
     392              :          27508345.793637_dp, 51649961.080194_dp, 96978513.342764_dp, 182087882.613702_dp, &
     393              :          341890134.751331_dp]
     394              : 
     395              :       CHARACTER(LEN=default_string_length)               :: basis_fn, basis_name
     396              :       INTEGER                                            :: basistype, handle, i, j, k, l, ll, m, &
     397              :                                                             ngp, nl, nr, nu, quadtype
     398              :       INTEGER, DIMENSION(0:lmat)                         :: starti
     399          725 :       INTEGER, DIMENSION(:), POINTER                     :: nqm, num_gto, num_slater, sindex
     400              :       REAL(KIND=dp)                                      :: al, amax, aval, cval, ear, pf, rk
     401          725 :       REAL(KIND=dp), DIMENSION(:), POINTER               :: expo
     402              :       TYPE(section_vals_type), POINTER                   :: gto_basis_section
     403              : 
     404          725 :       CALL timeset(routineN, handle)
     405              : 
     406              :       !   btyp = AE : standard all-electron basis
     407              :       !   btyp = PP : standard pseudopotential basis
     408              :       !   btyp = AA : high accuracy all-electron basis
     409              :       !   btyp = AP : high accuracy pseudopotential basis
     410              : 
     411          725 :       NULLIFY (basis%am, basis%cm, basis%as, basis%ns, basis%bf, basis%dbf, basis%ddbf)
     412              :       ! get information on quadrature type and number of grid points
     413              :       ! allocate and initialize the atomic grid
     414          725 :       CALL allocate_grid_atom(basis%grid)
     415          725 :       CALL section_vals_val_get(basis_section, "QUADRATURE", i_val=quadtype)
     416          725 :       CALL section_vals_val_get(basis_section, "GRID_POINTS", i_val=ngp)
     417          725 :       IF (ngp <= 0) &
     418            0 :          CPABORT("The number of radial grid points must be greater than zero.")
     419          725 :       CALL create_grid_atom(basis%grid, ngp, 1, 1, 0, quadtype)
     420          725 :       basis%grid%nr = ngp
     421          725 :       basis%geometrical = .FALSE.
     422          725 :       basis%aval = 0._dp
     423          725 :       basis%cval = 0._dp
     424         5075 :       basis%start = 0
     425              : 
     426          725 :       CALL section_vals_val_get(basis_section, "BASIS_TYPE", i_val=basistype)
     427          725 :       CALL section_vals_val_get(basis_section, "EPS_EIGENVALUE", r_val=basis%eps_eig)
     428          496 :       SELECT CASE (basistype)
     429              :       CASE (gaussian)
     430          496 :          basis%basis_type = GTO_BASIS
     431          496 :          NULLIFY (num_gto)
     432          496 :          CALL section_vals_val_get(basis_section, "NUM_GTO", i_vals=num_gto)
     433          496 :          IF (num_gto(1) < 1) THEN
     434              :             ! use default basis
     435          478 :             IF (btyp == "AE") THEN
     436              :                nu = nua
     437          298 :             ELSE IF (btyp == "PP") THEN
     438              :                nu = nup
     439              :             ELSE
     440            8 :                nu = nua
     441              :             END IF
     442         3346 :             basis%nbas = nu
     443         3346 :             basis%nprim = nu
     444          956 :             ALLOCATE (basis%am(nu, 0:lmat))
     445         3346 :             DO i = 0, lmat
     446        76306 :                basis%am(1:nu, i) = ugbs(1:nu)
     447              :             END DO
     448              :          ELSE
     449          126 :             basis%nbas = 0
     450           78 :             DO i = 1, SIZE(num_gto)
     451           78 :                basis%nbas(i - 1) = num_gto(i)
     452              :             END DO
     453          126 :             basis%nprim = basis%nbas
     454          126 :             m = MAXVAL(basis%nbas)
     455           54 :             ALLOCATE (basis%am(m, 0:lmat))
     456          966 :             basis%am = 0._dp
     457          126 :             DO l = 0, lmat
     458          126 :                IF (basis%nbas(l) > 0) THEN
     459           60 :                   NULLIFY (expo)
     460           18 :                   SELECT CASE (l)
     461              :                   CASE (0)
     462           18 :                      CALL section_vals_val_get(basis_section, "S_EXPONENTS", r_vals=expo)
     463              :                   CASE (1)
     464           18 :                      CALL section_vals_val_get(basis_section, "P_EXPONENTS", r_vals=expo)
     465              :                   CASE (2)
     466           18 :                      CALL section_vals_val_get(basis_section, "D_EXPONENTS", r_vals=expo)
     467              :                   CASE (3)
     468            6 :                      CALL section_vals_val_get(basis_section, "F_EXPONENTS", r_vals=expo)
     469              :                   CASE DEFAULT
     470           60 :                      CPABORT("Invalid angular quantum number l found for Gaussian basis set")
     471              :                   END SELECT
     472           60 :                   CPASSERT(SIZE(expo) >= basis%nbas(l))
     473          446 :                   DO i = 1, basis%nbas(l)
     474          446 :                      basis%am(i, l) = expo(i)
     475              :                   END DO
     476              :                END IF
     477              :             END DO
     478              :          END IF
     479              :          ! initialize basis function on a radial grid
     480          496 :          nr = basis%grid%nr
     481         3472 :          m = MAXVAL(basis%nbas)
     482         2480 :          ALLOCATE (basis%bf(nr, m, 0:lmat))
     483         1488 :          ALLOCATE (basis%dbf(nr, m, 0:lmat))
     484         1488 :          ALLOCATE (basis%ddbf(nr, m, 0:lmat))
     485     29501272 :          basis%bf = 0._dp
     486     29501272 :          basis%dbf = 0._dp
     487     29501272 :          basis%ddbf = 0._dp
     488         3472 :          DO l = 0, lmat
     489        76818 :             DO i = 1, basis%nbas(l)
     490        73346 :                al = basis%am(i, l)
     491     29318722 :                DO k = 1, nr
     492     29242400 :                   rk = basis%grid%rad(k)
     493     29242400 :                   ear = EXP(-al*basis%grid%rad(k)**2)
     494     29242400 :                   basis%bf(k, i, l) = rk**l*ear
     495     29242400 :                   basis%dbf(k, i, l) = (REAL(l, dp)*rk**(l - 1) - 2._dp*al*rk**(l + 1))*ear
     496              :                   basis%ddbf(k, i, l) = (REAL(l*(l - 1), dp)*rk**(l - 2) - &
     497     29315746 :                                          2._dp*al*REAL(2*l + 1, dp)*rk**(l) + 4._dp*al*rk**(l + 2))*ear
     498              :                END DO
     499              :             END DO
     500              :          END DO
     501              :       CASE (geometrical_gto)
     502          126 :          basis%basis_type = GTO_BASIS
     503          126 :          NULLIFY (num_gto)
     504          126 :          CALL section_vals_val_get(basis_section, "NUM_GTO", i_vals=num_gto)
     505          126 :          IF (num_gto(1) < 1) THEN
     506           96 :             IF (btyp == "AE") THEN
     507              :                ! use the Clementi extra large basis
     508           54 :                CALL Clementi_geobas(zval, cval, aval, basis%nbas, starti)
     509           42 :             ELSE IF (btyp == "PP") THEN
     510              :                ! use the Clementi extra large basis
     511            4 :                CALL Clementi_geobas(zval, cval, aval, basis%nbas, starti)
     512           38 :             ELSE IF (btyp == "AA") THEN
     513           20 :                CALL Clementi_geobas(zval, cval, aval, basis%nbas, starti)
     514           20 :                amax = cval**(basis%nbas(0) - 1)
     515           20 :                basis%nbas(0) = NINT((LOG(amax)/LOG(1.6_dp)))
     516           20 :                cval = 1.6_dp
     517           20 :                starti = 0
     518           20 :                basis%nbas(1) = basis%nbas(0) - 4
     519           20 :                basis%nbas(2) = basis%nbas(0) - 8
     520           20 :                basis%nbas(3) = basis%nbas(0) - 12
     521           60 :                IF (lmat > 3) basis%nbas(4:lmat) = 0
     522           18 :             ELSE IF (btyp == "AP") THEN
     523           18 :                CALL Clementi_geobas(zval, cval, aval, basis%nbas, starti)
     524           18 :                amax = 500._dp/aval
     525          126 :                basis%nbas = NINT((LOG(amax)/LOG(1.6_dp)))
     526           18 :                cval = 1.6_dp
     527           18 :                starti = 0
     528              :             ELSE
     529              :                ! use the Clementi extra large basis
     530            0 :                CALL Clementi_geobas(zval, cval, aval, basis%nbas, starti)
     531              :             END IF
     532          672 :             basis%nprim = basis%nbas
     533              :          ELSE
     534          210 :             basis%nbas = 0
     535          144 :             DO i = 1, SIZE(num_gto)
     536          144 :                basis%nbas(i - 1) = num_gto(i)
     537              :             END DO
     538          210 :             basis%nprim = basis%nbas
     539           30 :             NULLIFY (sindex)
     540           30 :             CALL section_vals_val_get(basis_section, "START_INDEX", i_vals=sindex)
     541           30 :             starti = 0
     542          118 :             DO i = 1, SIZE(sindex)
     543           88 :                starti(i - 1) = sindex(i)
     544          118 :                CPASSERT(sindex(i) >= 0)
     545              :             END DO
     546           30 :             CALL section_vals_val_get(basis_section, "GEOMETRICAL_FACTOR", r_val=cval)
     547           30 :             CALL section_vals_val_get(basis_section, "GEO_START_VALUE", r_val=aval)
     548              :          END IF
     549          882 :          m = MAXVAL(basis%nbas)
     550          378 :          ALLOCATE (basis%am(m, 0:lmat))
     551        20214 :          basis%am = 0._dp
     552          882 :          DO l = 0, lmat
     553        11052 :             DO i = 1, basis%nbas(l)
     554        10170 :                ll = i - 1 + starti(l)
     555        10926 :                basis%am(i, l) = aval*cval**(ll)
     556              :             END DO
     557              :          END DO
     558              : 
     559          126 :          basis%geometrical = .TRUE.
     560          126 :          basis%aval = aval
     561          126 :          basis%cval = cval
     562          882 :          basis%start = starti
     563              : 
     564              :          ! initialize basis function on a radial grid
     565          126 :          nr = basis%grid%nr
     566          882 :          m = MAXVAL(basis%nbas)
     567          630 :          ALLOCATE (basis%bf(nr, m, 0:lmat))
     568          378 :          ALLOCATE (basis%dbf(nr, m, 0:lmat))
     569          378 :          ALLOCATE (basis%ddbf(nr, m, 0:lmat))
     570      7074258 :          basis%bf = 0._dp
     571      7074258 :          basis%dbf = 0._dp
     572      7074258 :          basis%ddbf = 0._dp
     573          882 :          DO l = 0, lmat
     574        11052 :             DO i = 1, basis%nbas(l)
     575        10170 :                al = basis%am(i, l)
     576      3681068 :                DO k = 1, nr
     577      3670142 :                   rk = basis%grid%rad(k)
     578      3670142 :                   ear = EXP(-al*basis%grid%rad(k)**2)
     579      3670142 :                   basis%bf(k, i, l) = rk**l*ear
     580      3670142 :                   basis%dbf(k, i, l) = (REAL(l, dp)*rk**(l - 1) - 2._dp*al*rk**(l + 1))*ear
     581              :                   basis%ddbf(k, i, l) = (REAL(l*(l - 1), dp)*rk**(l - 2) - &
     582      3680312 :                                          2._dp*al*REAL(2*l + 1, dp)*rk**(l) + 4._dp*al*rk**(l + 2))*ear
     583              :                END DO
     584              :             END DO
     585              :          END DO
     586              :       CASE (contracted_gto)
     587           79 :          basis%basis_type = CGTO_BASIS
     588           79 :          CALL section_vals_val_get(basis_section, "BASIS_SET_FILE_NAME", c_val=basis_fn)
     589           79 :          CALL section_vals_val_get(basis_section, "BASIS_SET", c_val=basis_name)
     590           79 :          gto_basis_section => section_vals_get_subs_vals(basis_section, "BASIS")
     591              :          CALL read_basis_set(ptable(zval)%symbol, basis, basis_name, basis_fn, &
     592           79 :                              gto_basis_section)
     593              : 
     594              :          ! initialize basis function on a radial grid
     595           79 :          nr = basis%grid%nr
     596          553 :          m = MAXVAL(basis%nbas)
     597          395 :          ALLOCATE (basis%bf(nr, m, 0:lmat))
     598          237 :          ALLOCATE (basis%dbf(nr, m, 0:lmat))
     599          237 :          ALLOCATE (basis%ddbf(nr, m, 0:lmat))
     600       532279 :          basis%bf = 0._dp
     601       532279 :          basis%dbf = 0._dp
     602       532279 :          basis%ddbf = 0._dp
     603          553 :          DO l = 0, lmat
     604         1376 :             DO i = 1, basis%nprim(l)
     605          823 :                al = basis%am(i, l)
     606       330497 :                DO k = 1, nr
     607       329200 :                   rk = basis%grid%rad(k)
     608       329200 :                   ear = EXP(-al*basis%grid%rad(k)**2)
     609      1269223 :                   DO j = 1, basis%nbas(l)
     610       939200 :                      basis%bf(k, j, l) = basis%bf(k, j, l) + rk**l*ear*basis%cm(i, j, l)
     611              :                      basis%dbf(k, j, l) = basis%dbf(k, j, l) &
     612       939200 :                                           + (REAL(l, dp)*rk**(l - 1) - 2._dp*al*rk**(l + 1))*ear*basis%cm(i, j, l)
     613              :                      basis%ddbf(k, j, l) = basis%ddbf(k, j, l) + &
     614              :                                     (REAL(l*(l - 1), dp)*rk**(l - 2) - 2._dp*al*REAL(2*l + 1, dp)*rk**(l) + 4._dp*al*rk**(l + 2))* &
     615      1268400 :                                            ear*basis%cm(i, j, l)
     616              :                   END DO
     617              :                END DO
     618              :             END DO
     619              :          END DO
     620              :       CASE (slater)
     621           24 :          basis%basis_type = STO_BASIS
     622           24 :          NULLIFY (num_slater)
     623           24 :          CALL section_vals_val_get(basis_section, "NUM_SLATER", i_vals=num_slater)
     624           24 :          IF (num_slater(1) < 1) THEN
     625            0 :             CPABORT("Invalid number (less than 1) Slater-type functions found.")
     626              :          ELSE
     627          168 :             basis%nbas = 0
     628          120 :             DO i = 1, SIZE(num_slater)
     629          120 :                basis%nbas(i - 1) = num_slater(i)
     630              :             END DO
     631          168 :             basis%nprim = basis%nbas
     632          168 :             m = MAXVAL(basis%nbas)
     633          120 :             ALLOCATE (basis%as(m, 0:lmat), basis%ns(m, 0:lmat))
     634          444 :             basis%as = 0.0_dp
     635          444 :             basis%ns = 0
     636          168 :             DO l = 0, lmat
     637          168 :                IF (basis%nbas(l) > 0) THEN
     638           34 :                   NULLIFY (expo)
     639           24 :                   SELECT CASE (l)
     640              :                   CASE (0)
     641           24 :                      CALL section_vals_val_get(basis_section, "S_EXPONENTS", r_vals=expo)
     642              :                   CASE (1)
     643           10 :                      CALL section_vals_val_get(basis_section, "P_EXPONENTS", r_vals=expo)
     644              :                   CASE (2)
     645            0 :                      CALL section_vals_val_get(basis_section, "D_EXPONENTS", r_vals=expo)
     646              :                   CASE (3)
     647            0 :                      CALL section_vals_val_get(basis_section, "F_EXPONENTS", r_vals=expo)
     648              :                   CASE DEFAULT
     649           34 :                      CPABORT("Invalid angular quantum number l found for Slater basis set")
     650              :                   END SELECT
     651           34 :                   CPASSERT(SIZE(expo) >= basis%nbas(l))
     652          104 :                   DO i = 1, basis%nbas(l)
     653          104 :                      basis%as(i, l) = expo(i)
     654              :                   END DO
     655           34 :                   NULLIFY (nqm)
     656           24 :                   SELECT CASE (l)
     657              :                   CASE (0)
     658           24 :                      CALL section_vals_val_get(basis_section, "S_QUANTUM_NUMBERS", i_vals=nqm)
     659              :                   CASE (1)
     660           10 :                      CALL section_vals_val_get(basis_section, "P_QUANTUM_NUMBERS", i_vals=nqm)
     661              :                   CASE (2)
     662            0 :                      CALL section_vals_val_get(basis_section, "D_QUANTUM_NUMBERS", i_vals=nqm)
     663              :                   CASE (3)
     664            0 :                      CALL section_vals_val_get(basis_section, "F_QUANTUM_NUMBERS", i_vals=nqm)
     665              :                   CASE DEFAULT
     666           34 :                      CPABORT("Invalid angular quantum number l found for Slater basis set")
     667              :                   END SELECT
     668           34 :                   CPASSERT(SIZE(nqm) >= basis%nbas(l))
     669          104 :                   DO i = 1, basis%nbas(l)
     670          104 :                      basis%ns(i, l) = nqm(i)
     671              :                   END DO
     672              :                END IF
     673              :             END DO
     674              :          END IF
     675              :          ! initialize basis function on a radial grid
     676           24 :          nr = basis%grid%nr
     677          168 :          m = MAXVAL(basis%nbas)
     678          120 :          ALLOCATE (basis%bf(nr, m, 0:lmat))
     679           72 :          ALLOCATE (basis%dbf(nr, m, 0:lmat))
     680           72 :          ALLOCATE (basis%ddbf(nr, m, 0:lmat))
     681       305244 :          basis%bf = 0._dp
     682       305244 :          basis%dbf = 0._dp
     683       305244 :          basis%ddbf = 0._dp
     684          168 :          DO l = 0, lmat
     685          238 :             DO i = 1, basis%nbas(l)
     686           70 :                al = basis%as(i, l)
     687           70 :                nl = basis%ns(i, l)
     688           70 :                pf = (2._dp*al)**nl*SQRT(2._dp*al/fac(2*nl))
     689        93014 :                DO k = 1, nr
     690        92800 :                   rk = basis%grid%rad(k)
     691        92800 :                   ear = rk**(nl - 1)*EXP(-al*rk)
     692        92800 :                   basis%bf(k, i, l) = pf*ear
     693        92800 :                   basis%dbf(k, i, l) = pf*(REAL(nl - 1, dp)/rk - al)*ear
     694              :                   basis%ddbf(k, i, l) = pf*(REAL((nl - 2)*(nl - 1), dp)/rk/rk &
     695        92870 :                                             - al*REAL(2*(nl - 1), dp)/rk + al*al)*ear
     696              :                END DO
     697              :             END DO
     698              :          END DO
     699              :       CASE (numerical)
     700            0 :          basis%basis_type = NUM_BASIS
     701            0 :          CPABORT("Numerical basis set type not yet implemented.")
     702              :       CASE DEFAULT
     703          725 :          CPABORT("Unknown basis set type specified. Check the code!")
     704              :       END SELECT
     705              : 
     706          725 :       CALL timestop(handle)
     707              : 
     708          725 :    END SUBROUTINE init_atom_basis
     709              : 
     710              : ! **************************************************************************************************
     711              : !> \brief ...
     712              : !> \param basis ...
     713              : ! **************************************************************************************************
     714           12 :    SUBROUTINE init_atom_basis_default_pp(basis)
     715              :       TYPE(atom_basis_type), INTENT(INOUT)               :: basis
     716              : 
     717              :       CHARACTER(LEN=*), PARAMETER :: routineN = 'init_atom_basis_default_pp'
     718              :       INTEGER, PARAMETER                                 :: nua = 40, nup = 20
     719              :       REAL(KIND=dp), DIMENSION(nua), PARAMETER :: ugbs = [0.007299_dp, 0.013705_dp, 0.025733_dp, &
     720              :          0.048316_dp, 0.090718_dp, 0.170333_dp, 0.319819_dp, 0.600496_dp, 1.127497_dp, 2.117000_dp,&
     721              :          3.974902_dp, 7.463317_dp, 14.013204_dp, 26.311339_dp, 49.402449_dp, 92.758561_dp, &
     722              :          174.164456_dp, 327.013024_dp, 614.003114_dp, 1152.858743_dp, 2164.619772_dp, &
     723              :          4064.312984_dp, 7631.197056_dp, 14328.416324_dp, 26903.186074_dp, 50513.706789_dp, &
     724              :          94845.070265_dp, 178082.107320_dp, 334368.848683_dp, 627814.487663_dp, 1178791.123851_dp, &
     725              :          2213310.684886_dp, 4155735.557141_dp, 7802853.046713_dp, 14650719.428954_dp, &
     726              :          27508345.793637_dp, 51649961.080194_dp, 96978513.342764_dp, 182087882.613702_dp, &
     727              :          341890134.751331_dp]
     728              : 
     729              :       INTEGER                                            :: handle, i, k, l, m, ngp, nr, nu, quadtype
     730              :       REAL(KIND=dp)                                      :: al, ear, rk
     731              : 
     732           12 :       CALL timeset(routineN, handle)
     733              : 
     734           12 :       NULLIFY (basis%am, basis%cm, basis%as, basis%ns, basis%bf, basis%dbf, basis%ddbf)
     735              : 
     736              :       ! Allocate and initialize the atomic grid
     737           12 :       NULLIFY (basis%grid)
     738           12 :       CALL allocate_grid_atom(basis%grid)
     739           12 :       quadtype = do_gapw_log
     740           12 :       ngp = 500
     741           12 :       CALL create_grid_atom(basis%grid, ngp, 1, 1, 0, quadtype)
     742           12 :       basis%grid%nr = ngp
     743           12 :       basis%geometrical = .FALSE.
     744           12 :       basis%aval = 0._dp
     745           12 :       basis%cval = 0._dp
     746           84 :       basis%start = 0
     747           12 :       basis%eps_eig = 1.e-12_dp
     748              : 
     749           12 :       basis%basis_type = GTO_BASIS
     750           12 :       nu = nup
     751           84 :       basis%nbas = nu
     752           84 :       basis%nprim = nu
     753           12 :       ALLOCATE (basis%am(nu, 0:lmat))
     754           84 :       DO i = 0, lmat
     755         1524 :          basis%am(1:nu, i) = ugbs(1:nu)
     756              :       END DO
     757              :       ! initialize basis function on a radial grid
     758           12 :       nr = basis%grid%nr
     759           84 :       m = MAXVAL(basis%nbas)
     760           60 :       ALLOCATE (basis%bf(nr, m, 0:lmat))
     761           36 :       ALLOCATE (basis%dbf(nr, m, 0:lmat))
     762           36 :       ALLOCATE (basis%ddbf(nr, m, 0:lmat))
     763       721524 :       basis%bf = 0._dp
     764       721524 :       basis%dbf = 0._dp
     765       721524 :       basis%ddbf = 0._dp
     766           84 :       DO l = 0, lmat
     767         1524 :          DO i = 1, basis%nbas(l)
     768         1440 :             al = basis%am(i, l)
     769       721512 :             DO k = 1, nr
     770       720000 :                rk = basis%grid%rad(k)
     771       720000 :                ear = EXP(-al*basis%grid%rad(k)**2)
     772       720000 :                basis%bf(k, i, l) = rk**l*ear
     773       720000 :                basis%dbf(k, i, l) = (REAL(l, dp)*rk**(l - 1) - 2._dp*al*rk**(l + 1))*ear
     774              :                basis%ddbf(k, i, l) = (REAL(l*(l - 1), dp)*rk**(l - 2) - &
     775       721440 :                                       2._dp*al*REAL(2*l + 1, dp)*rk**(l) + 4._dp*al*rk**(l + 2))*ear
     776              :             END DO
     777              :          END DO
     778              :       END DO
     779              : 
     780           12 :       CALL timestop(handle)
     781              : 
     782           12 :    END SUBROUTINE init_atom_basis_default_pp
     783              : 
     784              : ! **************************************************************************************************
     785              : !> \brief ...
     786              : !> \param basis ...
     787              : !> \param gbasis ...
     788              : !> \param r ...
     789              : !> \param rab ...
     790              : ! **************************************************************************************************
     791           40 :    SUBROUTINE atom_basis_gridrep(basis, gbasis, r, rab)
     792              :       TYPE(atom_basis_type), INTENT(IN)                  :: basis
     793              :       TYPE(atom_basis_type), INTENT(INOUT)               :: gbasis
     794              :       REAL(KIND=dp), DIMENSION(:), INTENT(IN)            :: r, rab
     795              : 
     796              :       INTEGER                                            :: i, j, k, l, m, n1, n2, n3, ngp, nl, nr, &
     797              :                                                             quadtype
     798              :       REAL(KIND=dp)                                      :: al, ear, pf, rk
     799              : 
     800           40 :       NULLIFY (gbasis%am, gbasis%cm, gbasis%as, gbasis%ns, gbasis%bf, gbasis%dbf, gbasis%ddbf)
     801              : 
     802              :       ! copy basis info
     803           40 :       gbasis%basis_type = basis%basis_type
     804          280 :       gbasis%nbas(0:lmat) = basis%nbas(0:lmat)
     805          280 :       gbasis%nprim(0:lmat) = basis%nprim(0:lmat)
     806           40 :       IF (ASSOCIATED(basis%am)) THEN
     807           40 :          n1 = SIZE(basis%am, 1)
     808           40 :          n2 = SIZE(basis%am, 2)
     809          160 :          ALLOCATE (gbasis%am(n1, 0:n2 - 1))
     810         4840 :          gbasis%am = basis%am
     811              :       END IF
     812           40 :       IF (ASSOCIATED(basis%cm)) THEN
     813            0 :          n1 = SIZE(basis%cm, 1)
     814            0 :          n2 = SIZE(basis%cm, 2)
     815            0 :          n3 = SIZE(basis%cm, 3)
     816            0 :          ALLOCATE (gbasis%cm(n1, n2, 0:n3 - 1))
     817            0 :          gbasis%cm = basis%cm
     818              :       END IF
     819           40 :       IF (ASSOCIATED(basis%as)) THEN
     820            0 :          n1 = SIZE(basis%as, 1)
     821            0 :          n2 = SIZE(basis%as, 2)
     822            0 :          ALLOCATE (gbasis%as(n1, 0:n2 - 1))
     823            0 :          gbasis%as = basis%as
     824              :       END IF
     825           40 :       IF (ASSOCIATED(basis%ns)) THEN
     826            0 :          n1 = SIZE(basis%ns, 1)
     827            0 :          n2 = SIZE(basis%ns, 2)
     828            0 :          ALLOCATE (gbasis%ns(n1, 0:n2 - 1))
     829            0 :          gbasis%ns = basis%ns
     830              :       END IF
     831           40 :       gbasis%eps_eig = basis%eps_eig
     832           40 :       gbasis%geometrical = basis%geometrical
     833           40 :       gbasis%aval = basis%aval
     834           40 :       gbasis%cval = basis%cval
     835          280 :       gbasis%start(0:lmat) = basis%start(0:lmat)
     836              : 
     837              :       ! get information on quadrature type and number of grid points
     838              :       ! allocate and initialize the atomic grid
     839           40 :       NULLIFY (gbasis%grid)
     840           40 :       CALL allocate_grid_atom(gbasis%grid)
     841           40 :       ngp = SIZE(r)
     842           40 :       quadtype = do_gapw_log
     843           40 :       IF (ngp <= 0) &
     844            0 :          CPABORT("The number of radial grid points must be greater than zero.")
     845           40 :       CALL create_grid_atom(gbasis%grid, ngp, 1, 1, 0, quadtype)
     846           40 :       gbasis%grid%nr = ngp
     847        38436 :       gbasis%grid%rad(:) = r(:)
     848        38436 :       gbasis%grid%rad2(:) = r(:)*r(:)
     849        38436 :       gbasis%grid%wr(:) = rab(:)*gbasis%grid%rad2(:)
     850              : 
     851              :       ! initialize basis function on a radial grid
     852           40 :       nr = gbasis%grid%nr
     853          280 :       m = MAXVAL(gbasis%nbas)
     854          200 :       ALLOCATE (gbasis%bf(nr, m, 0:lmat))
     855          120 :       ALLOCATE (gbasis%dbf(nr, m, 0:lmat))
     856          120 :       ALLOCATE (gbasis%ddbf(nr, m, 0:lmat))
     857      4428280 :       gbasis%bf = 0._dp
     858      4428280 :       gbasis%dbf = 0._dp
     859      4428280 :       gbasis%ddbf = 0._dp
     860              : 
     861           40 :       SELECT CASE (gbasis%basis_type)
     862              :       CASE (GTO_BASIS)
     863          280 :          DO l = 0, lmat
     864         4840 :             DO i = 1, gbasis%nbas(l)
     865         4560 :                al = gbasis%am(i, l)
     866      4428240 :                DO k = 1, nr
     867      4423440 :                   rk = gbasis%grid%rad(k)
     868      4423440 :                   ear = EXP(-al*gbasis%grid%rad(k)**2)
     869      4423440 :                   gbasis%bf(k, i, l) = rk**l*ear
     870      4423440 :                   gbasis%dbf(k, i, l) = (REAL(l, dp)*rk**(l - 1) - 2._dp*al*rk**(l + 1))*ear
     871              :                   gbasis%ddbf(k, i, l) = (REAL(l*(l - 1), dp)*rk**(l - 2) - &
     872      4428000 :                                           2._dp*al*REAL(2*l + 1, dp)*rk**(l) + 4._dp*al*rk**(l + 2))*ear
     873              :                END DO
     874              :             END DO
     875              :          END DO
     876              :       CASE (CGTO_BASIS)
     877            0 :          DO l = 0, lmat
     878            0 :             DO i = 1, gbasis%nprim(l)
     879            0 :                al = gbasis%am(i, l)
     880            0 :                DO k = 1, nr
     881            0 :                   rk = gbasis%grid%rad(k)
     882            0 :                   ear = EXP(-al*gbasis%grid%rad(k)**2)
     883            0 :                   DO j = 1, gbasis%nbas(l)
     884            0 :                      gbasis%bf(k, j, l) = gbasis%bf(k, j, l) + rk**l*ear*gbasis%cm(i, j, l)
     885              :                      gbasis%dbf(k, j, l) = gbasis%dbf(k, j, l) &
     886            0 :                                            + (REAL(l, dp)*rk**(l - 1) - 2._dp*al*rk**(l + 1))*ear*gbasis%cm(i, j, l)
     887              :                      gbasis%ddbf(k, j, l) = gbasis%ddbf(k, j, l) + &
     888              :                                     (REAL(l*(l - 1), dp)*rk**(l - 2) - 2._dp*al*REAL(2*l + 1, dp)*rk**(l) + 4._dp*al*rk**(l + 2))* &
     889            0 :                                             ear*gbasis%cm(i, j, l)
     890              :                   END DO
     891              :                END DO
     892              :             END DO
     893              :          END DO
     894              :       CASE (STO_BASIS)
     895            0 :          DO l = 0, lmat
     896            0 :             DO i = 1, gbasis%nbas(l)
     897            0 :                al = gbasis%as(i, l)
     898            0 :                nl = gbasis%ns(i, l)
     899            0 :                pf = (2._dp*al)**nl*SQRT(2._dp*al/fac(2*nl))
     900            0 :                DO k = 1, nr
     901            0 :                   rk = gbasis%grid%rad(k)
     902            0 :                   ear = rk**(nl - 1)*EXP(-al*rk)
     903            0 :                   gbasis%bf(k, i, l) = pf*ear
     904            0 :                   gbasis%dbf(k, i, l) = pf*(REAL(nl - 1, dp)/rk - al)*ear
     905              :                   gbasis%ddbf(k, i, l) = pf*(REAL((nl - 2)*(nl - 1), dp)/rk/rk &
     906            0 :                                              - al*REAL(2*(nl - 1), dp)/rk + al*al)*ear
     907              :                END DO
     908              :             END DO
     909              :          END DO
     910              :       CASE (NUM_BASIS)
     911            0 :          gbasis%basis_type = NUM_BASIS
     912            0 :          CPABORT("Numerical basis set type not yet implemented.")
     913              :       CASE DEFAULT
     914           40 :          CPABORT("Unknown basis set type specified. Check the code!")
     915              :       END SELECT
     916              : 
     917           40 :    END SUBROUTINE atom_basis_gridrep
     918              : 
     919              : ! **************************************************************************************************
     920              : !> \brief ...
     921              : !> \param basis ...
     922              : ! **************************************************************************************************
     923         9531 :    SUBROUTINE release_atom_basis(basis)
     924              :       TYPE(atom_basis_type), INTENT(INOUT)               :: basis
     925              : 
     926         9531 :       IF (ASSOCIATED(basis%am)) THEN
     927         9507 :          DEALLOCATE (basis%am)
     928              :       END IF
     929         9531 :       IF (ASSOCIATED(basis%cm)) THEN
     930         8765 :          DEALLOCATE (basis%cm)
     931              :       END IF
     932         9531 :       IF (ASSOCIATED(basis%as)) THEN
     933           24 :          DEALLOCATE (basis%as)
     934              :       END IF
     935         9531 :       IF (ASSOCIATED(basis%ns)) THEN
     936           24 :          DEALLOCATE (basis%ns)
     937              :       END IF
     938         9531 :       IF (ASSOCIATED(basis%bf)) THEN
     939         9523 :          DEALLOCATE (basis%bf)
     940              :       END IF
     941         9531 :       IF (ASSOCIATED(basis%dbf)) THEN
     942         9523 :          DEALLOCATE (basis%dbf)
     943              :       END IF
     944         9531 :       IF (ASSOCIATED(basis%ddbf)) THEN
     945         9523 :          DEALLOCATE (basis%ddbf)
     946              :       END IF
     947              : 
     948         9531 :       CALL deallocate_grid_atom(basis%grid)
     949              : 
     950         9531 :    END SUBROUTINE release_atom_basis
     951              : ! **************************************************************************************************
     952              : 
     953              : ! **************************************************************************************************
     954              : !> \brief ...
     955              : !> \param atom ...
     956              : ! **************************************************************************************************
     957         9140 :    SUBROUTINE create_atom_type(atom)
     958              :       TYPE(atom_type), POINTER                           :: atom
     959              : 
     960         9140 :       CPASSERT(.NOT. ASSOCIATED(atom))
     961              : 
     962         9140 :       ALLOCATE (atom)
     963              : 
     964              :       NULLIFY (atom%zmp_section)
     965              :       NULLIFY (atom%xc_section)
     966              :       NULLIFY (atom%fmat)
     967              :       atom%do_zmp = .FALSE.
     968              :       atom%doread = .FALSE.
     969              :       atom%read_vxc = .FALSE.
     970              :       atom%dm = .FALSE.
     971              :       atom%hfx_pot%scale_coulomb = 0.0_dp
     972              :       atom%hfx_pot%scale_longrange = 0.0_dp
     973              :       atom%hfx_pot%omega = 0.0_dp
     974              : 
     975         9140 :    END SUBROUTINE create_atom_type
     976              : 
     977              : ! **************************************************************************************************
     978              : !> \brief ...
     979              : !> \param atom ...
     980              : ! **************************************************************************************************
     981         9140 :    SUBROUTINE release_atom_type(atom)
     982              :       TYPE(atom_type), POINTER                           :: atom
     983              : 
     984         9140 :       CPASSERT(ASSOCIATED(atom))
     985              : 
     986         9140 :       NULLIFY (atom%basis)
     987         9140 :       NULLIFY (atom%integrals)
     988         9140 :       IF (ASSOCIATED(atom%state)) THEN
     989         9122 :          DEALLOCATE (atom%state)
     990              :       END IF
     991         9140 :       IF (ASSOCIATED(atom%orbitals)) THEN
     992         9114 :          CALL release_atom_orbs(atom%orbitals)
     993              :       END IF
     994              : 
     995         9140 :       IF (ASSOCIATED(atom%fmat)) CALL release_opmat(atom%fmat)
     996              : 
     997         9140 :       DEALLOCATE (atom)
     998              : 
     999         9140 :    END SUBROUTINE release_atom_type
    1000              : 
    1001              : ! ZMP adding input variables in subroutine do_zmp,doread,read_vxc,method_type
    1002              : ! **************************************************************************************************
    1003              : !> \brief ...
    1004              : !> \param atom ...
    1005              : !> \param basis ...
    1006              : !> \param state ...
    1007              : !> \param integrals ...
    1008              : !> \param orbitals ...
    1009              : !> \param potential ...
    1010              : !> \param zcore ...
    1011              : !> \param pp_calc ...
    1012              : !> \param do_zmp ...
    1013              : !> \param doread ...
    1014              : !> \param read_vxc ...
    1015              : !> \param method_type ...
    1016              : !> \param relativistic ...
    1017              : !> \param coulomb_integral_type ...
    1018              : !> \param exchange_integral_type ...
    1019              : !> \param fmat ...
    1020              : ! **************************************************************************************************
    1021        70783 :    SUBROUTINE set_atom(atom, basis, state, integrals, orbitals, potential, zcore, pp_calc, do_zmp, doread, &
    1022              :                        read_vxc, method_type, relativistic, coulomb_integral_type, exchange_integral_type, fmat)
    1023              :       TYPE(atom_type), POINTER                           :: atom
    1024              :       TYPE(atom_basis_type), OPTIONAL, POINTER           :: basis
    1025              :       TYPE(atom_state), OPTIONAL, POINTER                :: state
    1026              :       TYPE(atom_integrals), OPTIONAL, POINTER            :: integrals
    1027              :       TYPE(atom_orbitals), OPTIONAL, POINTER             :: orbitals
    1028              :       TYPE(atom_potential_type), OPTIONAL, POINTER       :: potential
    1029              :       INTEGER, INTENT(IN), OPTIONAL                      :: zcore
    1030              :       LOGICAL, INTENT(IN), OPTIONAL                      :: pp_calc, do_zmp, doread, read_vxc
    1031              :       INTEGER, INTENT(IN), OPTIONAL                      :: method_type, relativistic, &
    1032              :                                                             coulomb_integral_type, &
    1033              :                                                             exchange_integral_type
    1034              :       TYPE(opmat_type), OPTIONAL, POINTER                :: fmat
    1035              : 
    1036        70783 :       CPASSERT(ASSOCIATED(atom))
    1037              : 
    1038        70783 :       IF (PRESENT(basis)) atom%basis => basis
    1039        70783 :       IF (PRESENT(state)) atom%state => state
    1040        70783 :       IF (PRESENT(integrals)) atom%integrals => integrals
    1041        70783 :       IF (PRESENT(orbitals)) atom%orbitals => orbitals
    1042        70783 :       IF (PRESENT(potential)) atom%potential => potential
    1043        70783 :       IF (PRESENT(zcore)) atom%zcore = zcore
    1044        70783 :       IF (PRESENT(pp_calc)) atom%pp_calc = pp_calc
    1045              : ! ZMP assigning variable values if present
    1046        70783 :       IF (PRESENT(do_zmp)) atom%do_zmp = do_zmp
    1047        70783 :       IF (PRESENT(doread)) atom%doread = doread
    1048        70783 :       IF (PRESENT(read_vxc)) atom%read_vxc = read_vxc
    1049              : 
    1050        70783 :       IF (PRESENT(method_type)) atom%method_type = method_type
    1051        70783 :       IF (PRESENT(relativistic)) atom%relativistic = relativistic
    1052        70783 :       IF (PRESENT(coulomb_integral_type)) atom%coulomb_integral_type = coulomb_integral_type
    1053        70783 :       IF (PRESENT(exchange_integral_type)) atom%exchange_integral_type = exchange_integral_type
    1054              : 
    1055        70783 :       IF (PRESENT(fmat)) THEN
    1056        11461 :          IF (ASSOCIATED(atom%fmat)) CALL release_opmat(atom%fmat)
    1057        11461 :          atom%fmat => fmat
    1058              :       END IF
    1059              : 
    1060        70783 :    END SUBROUTINE set_atom
    1061              : 
    1062              : ! **************************************************************************************************
    1063              : !> \brief ...
    1064              : !> \param orbs ...
    1065              : !> \param mbas ...
    1066              : !> \param mo ...
    1067              : ! **************************************************************************************************
    1068         9117 :    SUBROUTINE create_atom_orbs(orbs, mbas, mo)
    1069              :       TYPE(atom_orbitals), POINTER                       :: orbs
    1070              :       INTEGER, INTENT(IN)                                :: mbas, mo
    1071              : 
    1072         9117 :       CPASSERT(.NOT. ASSOCIATED(orbs))
    1073              : 
    1074         9117 :       ALLOCATE (orbs)
    1075              : 
    1076        99391 :       ALLOCATE (orbs%wfn(mbas, mo, 0:lmat), orbs%wfna(mbas, mo, 0:lmat), orbs%wfnb(mbas, mo, 0:lmat))
    1077       484299 :       orbs%wfn = 0._dp
    1078       484299 :       orbs%wfna = 0._dp
    1079       484299 :       orbs%wfnb = 0._dp
    1080              : 
    1081       100239 :       ALLOCATE (orbs%pmat(mbas, mbas, 0:lmat), orbs%pmata(mbas, mbas, 0:lmat), orbs%pmatb(mbas, mbas, 0:lmat))
    1082      2337099 :       orbs%pmat = 0._dp
    1083      2337099 :       orbs%pmata = 0._dp
    1084      2337099 :       orbs%pmatb = 0._dp
    1085              : 
    1086        62949 :       ALLOCATE (orbs%ener(mo, 0:lmat), orbs%enera(mo, 0:lmat), orbs%enerb(mo, 0:lmat))
    1087       127551 :       orbs%ener = 0._dp
    1088       127551 :       orbs%enera = 0._dp
    1089       127551 :       orbs%enerb = 0._dp
    1090              : 
    1091        72066 :       ALLOCATE (orbs%refene(mo, 0:lmat, 2), orbs%refchg(mo, 0:lmat, 2), orbs%refnod(mo, 0:lmat, 2))
    1092       264219 :       orbs%refene = 0._dp
    1093       264219 :       orbs%refchg = 0._dp
    1094       264219 :       orbs%refnod = 0._dp
    1095        62775 :       ALLOCATE (orbs%wrefene(mo, 0:lmat, 2), orbs%wrefchg(mo, 0:lmat, 2), orbs%wrefnod(mo, 0:lmat, 2))
    1096       264219 :       orbs%wrefene = 0._dp
    1097       264219 :       orbs%wrefchg = 0._dp
    1098       264219 :       orbs%wrefnod = 0._dp
    1099        62775 :       ALLOCATE (orbs%crefene(mo, 0:lmat, 2), orbs%crefchg(mo, 0:lmat, 2), orbs%crefnod(mo, 0:lmat, 2))
    1100       264219 :       orbs%crefene = 0._dp
    1101       264219 :       orbs%crefchg = 0._dp
    1102       264219 :       orbs%crefnod = 0._dp
    1103        27003 :       ALLOCATE (orbs%rcmax(mo, 0:lmat, 2))
    1104       264219 :       orbs%rcmax = 0._dp
    1105        45063 :       ALLOCATE (orbs%wpsir0(mo, 2), orbs%tpsir0(mo, 2))
    1106        48595 :       orbs%wpsir0 = 0._dp
    1107        48595 :       orbs%tpsir0 = 0._dp
    1108        27177 :       ALLOCATE (orbs%reftype(mo, 0:lmat, 2))
    1109       264219 :       orbs%reftype = "XX"
    1110              : 
    1111         9117 :    END SUBROUTINE create_atom_orbs
    1112              : 
    1113              : ! **************************************************************************************************
    1114              : !> \brief ...
    1115              : !> \param orbs ...
    1116              : ! **************************************************************************************************
    1117         9117 :    SUBROUTINE release_atom_orbs(orbs)
    1118              :       TYPE(atom_orbitals), POINTER                       :: orbs
    1119              : 
    1120         9117 :       CPASSERT(ASSOCIATED(orbs))
    1121              : 
    1122         9117 :       IF (ASSOCIATED(orbs%wfn)) THEN
    1123         9117 :          DEALLOCATE (orbs%wfn, orbs%wfna, orbs%wfnb)
    1124              :       END IF
    1125         9117 :       IF (ASSOCIATED(orbs%pmat)) THEN
    1126         9117 :          DEALLOCATE (orbs%pmat, orbs%pmata, orbs%pmatb)
    1127              :       END IF
    1128         9117 :       IF (ASSOCIATED(orbs%ener)) THEN
    1129         9117 :          DEALLOCATE (orbs%ener, orbs%enera, orbs%enerb)
    1130              :       END IF
    1131         9117 :       IF (ASSOCIATED(orbs%refene)) THEN
    1132         9117 :          DEALLOCATE (orbs%refene)
    1133              :       END IF
    1134         9117 :       IF (ASSOCIATED(orbs%refchg)) THEN
    1135         9117 :          DEALLOCATE (orbs%refchg)
    1136              :       END IF
    1137         9117 :       IF (ASSOCIATED(orbs%refnod)) THEN
    1138         9117 :          DEALLOCATE (orbs%refnod)
    1139              :       END IF
    1140         9117 :       IF (ASSOCIATED(orbs%wrefene)) THEN
    1141         9117 :          DEALLOCATE (orbs%wrefene)
    1142              :       END IF
    1143         9117 :       IF (ASSOCIATED(orbs%wrefchg)) THEN
    1144         9117 :          DEALLOCATE (orbs%wrefchg)
    1145              :       END IF
    1146         9117 :       IF (ASSOCIATED(orbs%wrefnod)) THEN
    1147         9117 :          DEALLOCATE (orbs%wrefnod)
    1148              :       END IF
    1149         9117 :       IF (ASSOCIATED(orbs%crefene)) THEN
    1150         9117 :          DEALLOCATE (orbs%crefene)
    1151              :       END IF
    1152         9117 :       IF (ASSOCIATED(orbs%crefchg)) THEN
    1153         9117 :          DEALLOCATE (orbs%crefchg)
    1154              :       END IF
    1155         9117 :       IF (ASSOCIATED(orbs%crefnod)) THEN
    1156         9117 :          DEALLOCATE (orbs%crefnod)
    1157              :       END IF
    1158         9117 :       IF (ASSOCIATED(orbs%rcmax)) THEN
    1159         9117 :          DEALLOCATE (orbs%rcmax)
    1160              :       END IF
    1161         9117 :       IF (ASSOCIATED(orbs%wpsir0)) THEN
    1162         9117 :          DEALLOCATE (orbs%wpsir0)
    1163              :       END IF
    1164         9117 :       IF (ASSOCIATED(orbs%tpsir0)) THEN
    1165         9117 :          DEALLOCATE (orbs%tpsir0)
    1166              :       END IF
    1167         9117 :       IF (ASSOCIATED(orbs%reftype)) THEN
    1168         9117 :          DEALLOCATE (orbs%reftype)
    1169              :       END IF
    1170              : 
    1171         9117 :       DEALLOCATE (orbs)
    1172              : 
    1173         9117 :    END SUBROUTINE release_atom_orbs
    1174              : 
    1175              : ! **************************************************************************************************
    1176              : !> \brief ...
    1177              : !> \param hf_frac ...
    1178              : !> \param do_hfx ...
    1179              : !> \param atom ...
    1180              : !> \param xc_section ...
    1181              : !> \param extype ...
    1182              : ! **************************************************************************************************
    1183        11461 :    SUBROUTINE setup_hf_section(hf_frac, do_hfx, atom, xc_section, extype)
    1184              :       REAL(KIND=dp), INTENT(OUT)                         :: hf_frac
    1185              :       LOGICAL, INTENT(OUT)                               :: do_hfx
    1186              :       TYPE(atom_type), INTENT(IN), POINTER               :: atom
    1187              :       TYPE(section_vals_type), POINTER                   :: xc_section
    1188              :       INTEGER, INTENT(IN)                                :: extype
    1189              : 
    1190              :       INTEGER                                            :: i, j, nr, nu, pot_type
    1191              :       REAL(KIND=dp)                                      :: scale_coulomb, scale_longrange
    1192        11461 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)           :: abscissa, weights
    1193              :       TYPE(section_vals_type), POINTER                   :: hf_sub_section, hfx_sections
    1194              : 
    1195        11461 :       hf_frac = 0._dp
    1196        11461 :       IF (ASSOCIATED(atom%xc_section)) THEN
    1197         2907 :          xc_section => atom%xc_section
    1198         2907 :          hfx_sections => section_vals_get_subs_vals(xc_section, "HF")
    1199         2907 :          CALL section_vals_get(hfx_sections, explicit=do_hfx)
    1200              : 
    1201              :          ! If nothing has been set explicitly, assume a Coulomb potential
    1202         2907 :          atom%hfx_pot%scale_longrange = 0.0_dp
    1203         2907 :          atom%hfx_pot%scale_coulomb = 1.0_dp
    1204              : 
    1205         2907 :          IF (do_hfx) THEN
    1206          135 :             CALL section_vals_val_get(hfx_sections, "FRACTION", r_val=hf_frac)
    1207              : 
    1208              :             ! Get potential info
    1209          135 :             hf_sub_section => section_vals_get_subs_vals(hfx_sections, "INTERACTION_POTENTIAL", i_rep_section=1)
    1210          135 :             CALL section_vals_val_get(hf_sub_section, "POTENTIAL_TYPE", i_val=pot_type)
    1211          135 :             CALL section_vals_val_get(hf_sub_section, "OMEGA", r_val=atom%hfx_pot%omega)
    1212          135 :             CALL section_vals_val_get(hf_sub_section, "SCALE_COULOMB", r_val=scale_coulomb)
    1213          135 :             CALL section_vals_val_get(hf_sub_section, "SCALE_LONGRANGE", r_val=scale_longrange)
    1214              : 
    1215              :             ! Setup atomic hfx potential
    1216            0 :             SELECT CASE (pot_type)
    1217              :             CASE DEFAULT
    1218            0 :                CPWARN("Potential not implemented, use Coulomb instead!")
    1219              :             CASE (do_potential_coulomb)
    1220           84 :                atom%hfx_pot%scale_longrange = 0.0_dp
    1221           84 :                atom%hfx_pot%scale_coulomb = scale_coulomb
    1222              :             CASE (do_potential_long)
    1223           51 :                atom%hfx_pot%scale_coulomb = 0.0_dp
    1224           51 :                atom%hfx_pot%scale_longrange = scale_longrange
    1225              :             CASE (do_potential_short)
    1226            0 :                atom%hfx_pot%scale_coulomb = 1.0_dp
    1227            0 :                atom%hfx_pot%scale_longrange = -1.0_dp
    1228              :             CASE (do_potential_mix_cl)
    1229            0 :                atom%hfx_pot%scale_coulomb = scale_coulomb
    1230          135 :                atom%hfx_pot%scale_longrange = scale_longrange
    1231              :             END SELECT
    1232              :          END IF
    1233              : 
    1234              :          ! Check whether extype is supported
    1235         2907 :          IF (atom%hfx_pot%scale_longrange /= 0.0_dp .AND. extype /= do_numeric .AND. extype /= do_semi_analytic) THEN
    1236            0 :             CPABORT("Only numerical and semi-analytic lrHF exchange available!")
    1237              :          END IF
    1238              : 
    1239         2907 :          IF (atom%hfx_pot%scale_longrange /= 0.0_dp .AND. extype == do_numeric .AND. .NOT. ALLOCATED(atom%hfx_pot%kernel)) THEN
    1240            6 :             CALL cite_reference(Limpanuparb2011)
    1241              : 
    1242            6 :             IF (atom%hfx_pot%do_gh) THEN
    1243              :                ! Setup kernel for Ewald operator
    1244              :                ! Because of the high computational costs of its calculation, we precalculate it here
    1245              :                ! Use Gauss-Hermite grid instead of the external grid
    1246           12 :                ALLOCATE (weights(atom%hfx_pot%nr_gh), abscissa(atom%hfx_pot%nr_gh))
    1247            3 :                CALL get_gauss_hermite_weights(abscissa, weights, atom%hfx_pot%nr_gh)
    1248              : 
    1249            3 :                nr = atom%basis%grid%nr
    1250           15 :                ALLOCATE (atom%hfx_pot%kernel(nr, atom%hfx_pot%nr_gh, 0:atom%state%maxl_calc + atom%state%maxl_occ))
    1251       321215 :                atom%hfx_pot%kernel = 0.0_dp
    1252           15 :                DO nu = 0, atom%state%maxl_calc + atom%state%maxl_occ
    1253         1215 :                   DO i = 1, atom%hfx_pot%nr_gh
    1254       321212 :                      DO j = 1, nr
    1255              :                         atom%hfx_pot%kernel(j, i, nu) = bessel0(2.0_dp*atom%hfx_pot%omega &
    1256       321200 :                                                                 *abscissa(i)*atom%basis%grid%rad(j), nu)*SQRT(weights(i))
    1257              :                      END DO
    1258              :                   END DO
    1259              :                END DO
    1260              :             ELSE
    1261              :                ! Setup kernel for Ewald operator
    1262              :                ! Because of the high computational costs of its calculation, we precalculate it here
    1263              :                ! Choose it symmetric to further reduce the costs
    1264            3 :                nr = atom%basis%grid%nr
    1265           15 :                ALLOCATE (atom%hfx_pot%kernel(nr, nr, 0:atom%state%maxl_calc + atom%state%maxl_occ))
    1266       963215 :                atom%hfx_pot%kernel = 0.0_dp
    1267           15 :                DO nu = 0, atom%state%maxl_calc + atom%state%maxl_occ
    1268         3215 :                   DO i = 1, nr
    1269       484812 :                      DO j = 1, i
    1270              :                         atom%hfx_pot%kernel(j, i, nu) = bessel0(2.0_dp*atom%hfx_pot%omega &
    1271       484800 :                                                                 *atom%basis%grid%rad(i)*atom%basis%grid%rad(j), nu)
    1272              :                      END DO
    1273              :                   END DO
    1274              :                END DO
    1275              :             END IF
    1276              :          END IF
    1277              :       ELSE
    1278         8554 :          NULLIFY (xc_section)
    1279         8554 :          do_hfx = .FALSE.
    1280              :       END IF
    1281              : 
    1282        11461 :    END SUBROUTINE setup_hf_section
    1283              : 
    1284              : ! **************************************************************************************************
    1285              : !> \brief ...
    1286              : !> \param abscissa ...
    1287              : !> \param weights ...
    1288              : !> \param nn ...
    1289              : ! **************************************************************************************************
    1290            3 :    SUBROUTINE get_gauss_hermite_weights(abscissa, weights, nn)
    1291              :       REAL(KIND=dp), DIMENSION(:), INTENT(OUT)           :: abscissa, weights
    1292              :       INTEGER, INTENT(IN)                                :: nn
    1293              : 
    1294              :       INTEGER                                            :: counter, ii, info, liwork, lwork
    1295            3 :       INTEGER, ALLOCATABLE, DIMENSION(:)                 :: iwork
    1296            3 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)           :: diag, subdiag, work
    1297            3 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)        :: eigenvec
    1298              : 
    1299              :       ! Setup matrix for Golub-Welsch-algorithm to determine roots and weights of Gauss-Hermite quadrature
    1300              :       ! If necessary, one can setup matrices differently for other quadratures
    1301           24 :       ALLOCATE (work(1), iwork(1), diag(2*nn), subdiag(2*nn - 1), eigenvec(2*nn, 2*nn))
    1302            3 :       lwork = -1
    1303            3 :       liwork = -1
    1304          603 :       diag = 0.0_dp
    1305          600 :       DO ii = 1, 2*nn - 1
    1306          600 :          subdiag(ii) = SQRT(REAL(ii, KIND=dp)/2.0_dp)
    1307              :       END DO
    1308              : 
    1309              :       ! Get correct size for working matrices
    1310            3 :       CALL DSTEVD('V', 2*nn, diag, subdiag, eigenvec, 2*nn, work, lwork, iwork, liwork, info)
    1311            3 :       IF (info /= 0) THEN
    1312              :          ! This should not happen!
    1313            0 :          CPABORT('Finding size of working matrices failed!')
    1314              :       END IF
    1315              : 
    1316              :       ! Setup working matrices with their respective optimal sizes
    1317            3 :       lwork = INT(work(1))
    1318            3 :       liwork = iwork(1)
    1319            3 :       DEALLOCATE (work, iwork)
    1320           15 :       ALLOCATE (work(lwork), iwork(liwork))
    1321              : 
    1322              :       ! Perform the actual eigenvalue decomposition
    1323            3 :       CALL DSTEVD('V', 2*nn, diag, subdiag, eigenvec, 2*nn, work, lwork, iwork, liwork, info)
    1324            3 :       IF (info /= 0) THEN
    1325              :          ! This should not happen for the usual values of nn! (Checked for nn = 2000)
    1326            0 :          CPABORT('Eigenvalue decomposition failed!')
    1327              :       END IF
    1328              : 
    1329            3 :       DEALLOCATE (work, iwork, subdiag)
    1330              : 
    1331              :       ! Identify positive roots of hermite polynomials (zeros of Hermite polynomials are symmetric wrt the origin)
    1332              :       ! We will only keep the positive roots
    1333            3 :       counter = 0
    1334          603 :       DO ii = 1, 2*nn
    1335          603 :          IF (diag(ii) > 0.0_dp) THEN
    1336          300 :             counter = counter + 1
    1337          300 :             abscissa(counter) = diag(ii)
    1338          300 :             weights(counter) = rootpi*eigenvec(1, ii)**2
    1339              :          END IF
    1340              :       END DO
    1341            3 :       IF (counter /= nn) THEN
    1342            0 :          CPABORT('Have not found enough or too many zeros!')
    1343              :       END IF
    1344              : 
    1345            3 :    END SUBROUTINE get_gauss_hermite_weights
    1346              : 
    1347              : ! **************************************************************************************************
    1348              : !> \brief ...
    1349              : !> \param opmat ...
    1350              : !> \param n ...
    1351              : !> \param lmax ...
    1352              : ! **************************************************************************************************
    1353        57854 :    SUBROUTINE create_opmat(opmat, n, lmax)
    1354              :       TYPE(opmat_type), POINTER                          :: opmat
    1355              :       INTEGER, DIMENSION(0:lmat), INTENT(IN)             :: n
    1356              :       INTEGER, INTENT(IN), OPTIONAL                      :: lmax
    1357              : 
    1358              :       INTEGER                                            :: lm, m
    1359              : 
    1360       404978 :       m = MAXVAL(n)
    1361        57854 :       IF (PRESENT(lmax)) THEN
    1362           34 :          lm = lmax
    1363              :       ELSE
    1364              :          lm = lmat
    1365              :       END IF
    1366              : 
    1367        57854 :       CPASSERT(.NOT. ASSOCIATED(opmat))
    1368              : 
    1369       462832 :       ALLOCATE (opmat)
    1370              : 
    1371       404978 :       opmat%n = n
    1372       289230 :       ALLOCATE (opmat%op(m, m, 0:lm))
    1373     18334262 :       opmat%op = 0._dp
    1374              : 
    1375        57854 :    END SUBROUTINE create_opmat
    1376              : 
    1377              : ! **************************************************************************************************
    1378              : !> \brief ...
    1379              : !> \param opmat ...
    1380              : ! **************************************************************************************************
    1381        57854 :    SUBROUTINE release_opmat(opmat)
    1382              :       TYPE(opmat_type), POINTER                          :: opmat
    1383              : 
    1384        57854 :       CPASSERT(ASSOCIATED(opmat))
    1385              : 
    1386       404978 :       opmat%n = 0
    1387        57854 :       DEALLOCATE (opmat%op)
    1388              : 
    1389        57854 :       DEALLOCATE (opmat)
    1390              : 
    1391        57854 :    END SUBROUTINE release_opmat
    1392              : 
    1393              : ! **************************************************************************************************
    1394              : !> \brief ...
    1395              : !> \param opgrid ...
    1396              : !> \param grid ...
    1397              : ! **************************************************************************************************
    1398        23234 :    SUBROUTINE create_opgrid(opgrid, grid)
    1399              :       TYPE(opgrid_type), POINTER                         :: opgrid
    1400              :       TYPE(grid_atom_type), POINTER                      :: grid
    1401              : 
    1402              :       INTEGER                                            :: nr
    1403              : 
    1404        23234 :       CPASSERT(.NOT. ASSOCIATED(opgrid))
    1405              : 
    1406        23234 :       ALLOCATE (opgrid)
    1407              : 
    1408        23234 :       opgrid%grid => grid
    1409              : 
    1410        23234 :       nr = grid%nr
    1411              : 
    1412        69702 :       ALLOCATE (opgrid%op(nr))
    1413      9324606 :       opgrid%op = 0._dp
    1414              : 
    1415        23234 :    END SUBROUTINE create_opgrid
    1416              : 
    1417              : ! **************************************************************************************************
    1418              : !> \brief ...
    1419              : !> \param opgrid ...
    1420              : ! **************************************************************************************************
    1421        23234 :    SUBROUTINE release_opgrid(opgrid)
    1422              :       TYPE(opgrid_type), POINTER                         :: opgrid
    1423              : 
    1424        23234 :       CPASSERT(ASSOCIATED(opgrid))
    1425              : 
    1426        23234 :       NULLIFY (opgrid%grid)
    1427        23234 :       DEALLOCATE (opgrid%op)
    1428              : 
    1429        23234 :       DEALLOCATE (opgrid)
    1430              : 
    1431        23234 :    END SUBROUTINE release_opgrid
    1432              : 
    1433              : ! **************************************************************************************************
    1434              : !> \brief ...
    1435              : !> \param zval ...
    1436              : !> \param cval ...
    1437              : !> \param aval ...
    1438              : !> \param ngto ...
    1439              : !> \param ival ...
    1440              : ! **************************************************************************************************
    1441          156 :    SUBROUTINE Clementi_geobas(zval, cval, aval, ngto, ival)
    1442              : 
    1443              :       INTEGER, INTENT(IN)                                :: zval
    1444              :       REAL(dp), INTENT(OUT)                              :: cval, aval
    1445              :       INTEGER, DIMENSION(0:lmat), INTENT(OUT)            :: ngto, ival
    1446              : 
    1447          156 :       ngto = 0
    1448          156 :       ival = 0
    1449          156 :       cval = 0._dp
    1450          156 :       aval = 0._dp
    1451              : 
    1452          184 :       SELECT CASE (zval)
    1453              :       CASE (1) ! this is from the general geometrical basis and extended
    1454           28 :          cval = 2.0_dp
    1455           28 :          aval = 0.016_dp
    1456           28 :          ngto(0) = 20
    1457              :       CASE (2)
    1458           12 :          cval = 2.14774520_dp
    1459           12 :          aval = 0.04850670_dp
    1460           12 :          ngto(0) = 20
    1461              :       CASE (3)
    1462            4 :          cval = 2.08932430_dp
    1463            4 :          aval = 0.02031060_dp
    1464            4 :          ngto(0) = 23
    1465              :       CASE (4)
    1466            0 :          cval = 2.09753060_dp
    1467            0 :          aval = 0.03207070_dp
    1468            0 :          ngto(0) = 23
    1469              :       CASE (5)
    1470            0 :          cval = 2.10343410_dp
    1471            0 :          aval = 0.03591970_dp
    1472            0 :          ngto(0) = 23
    1473            0 :          ngto(1) = 16
    1474              :       CASE (6)
    1475           30 :          cval = 2.10662820_dp
    1476           30 :          aval = 0.05292410_dp
    1477           30 :          ngto(0) = 23
    1478           30 :          ngto(1) = 16
    1479              :       CASE (7)
    1480            2 :          cval = 2.13743840_dp
    1481            2 :          aval = 0.06291970_dp
    1482            2 :          ngto(0) = 23
    1483            2 :          ngto(1) = 16
    1484              :       CASE (8)
    1485           32 :          cval = 2.08687310_dp
    1486           32 :          aval = 0.08350860_dp
    1487           32 :          ngto(0) = 23
    1488           32 :          ngto(1) = 16
    1489              :       CASE (9)
    1490            0 :          cval = 2.12318180_dp
    1491            0 :          aval = 0.09899170_dp
    1492            0 :          ngto(0) = 23
    1493            0 :          ngto(1) = 16
    1494              :       CASE (10)
    1495            0 :          cval = 2.13164810_dp
    1496            0 :          aval = 0.11485350_dp
    1497            0 :          ngto(0) = 23
    1498            0 :          ngto(1) = 16
    1499              :       CASE (11)
    1500            0 :          cval = 2.11413310_dp
    1501            0 :          aval = 0.00922630_dp
    1502            0 :          ngto(0) = 26
    1503            0 :          ngto(1) = 16
    1504            0 :          ival(1) = 4
    1505              :       CASE (12)
    1506            0 :          cval = 2.12183620_dp
    1507            0 :          aval = 0.01215850_dp
    1508            0 :          ngto(0) = 26
    1509            0 :          ngto(1) = 16
    1510            0 :          ival(1) = 4
    1511              :       CASE (13)
    1512            0 :          cval = 2.06073230_dp
    1513            0 :          aval = 0.01449350_dp
    1514            0 :          ngto(0) = 26
    1515            0 :          ngto(1) = 20
    1516            0 :          ival(0) = 1
    1517              :       CASE (14)
    1518            0 :          cval = 2.08563660_dp
    1519            0 :          aval = 0.01861460_dp
    1520            0 :          ngto(0) = 26
    1521            0 :          ngto(1) = 20
    1522            0 :          ival(0) = 1
    1523              :       CASE (15)
    1524            0 :          cval = 2.04879270_dp
    1525            0 :          aval = 0.02147790_dp
    1526            0 :          ngto(0) = 26
    1527            0 :          ngto(1) = 20
    1528            0 :          ival(0) = 1
    1529              :       CASE (16)
    1530            0 :          cval = 2.06216660_dp
    1531            0 :          aval = 0.01978920_dp
    1532            0 :          ngto(0) = 26
    1533            0 :          ngto(1) = 20
    1534            0 :          ival(0) = 1
    1535              :       CASE (17)
    1536            0 :          cval = 2.04628670_dp
    1537            0 :          aval = 0.02451470_dp
    1538            0 :          ngto(0) = 26
    1539            0 :          ngto(1) = 20
    1540            0 :          ival(0) = 1
    1541              :       CASE (18)
    1542            0 :          cval = 2.08675200_dp
    1543            0 :          aval = 0.02635040_dp
    1544            0 :          ngto(0) = 26
    1545            0 :          ngto(1) = 20
    1546            0 :          ival(0) = 1
    1547              :       CASE (19)
    1548            0 :          cval = 2.02715220_dp
    1549            0 :          aval = 0.01822040_dp
    1550            0 :          ngto(0) = 29
    1551            0 :          ngto(1) = 20
    1552            0 :          ival(1) = 2
    1553              :       CASE (20)
    1554            0 :          cval = 2.01465650_dp
    1555            0 :          aval = 0.01646570_dp
    1556            0 :          ngto(0) = 29
    1557            0 :          ngto(1) = 20
    1558            0 :          ival(1) = 2
    1559              :       CASE (21)
    1560            0 :          cval = 2.01605240_dp
    1561            0 :          aval = 0.01254190_dp
    1562            0 :          ngto(0) = 30
    1563            0 :          ngto(1) = 20
    1564            0 :          ngto(2) = 18
    1565            0 :          ival(1) = 2
    1566              :       CASE (22)
    1567            0 :          cval = 2.01800000_dp
    1568            0 :          aval = 0.01195490_dp
    1569            0 :          ngto(0) = 30
    1570            0 :          ngto(1) = 21
    1571            0 :          ngto(2) = 17
    1572            0 :          ival(1) = 2
    1573            0 :          ival(2) = 1
    1574              :       CASE (23)
    1575            2 :          cval = 1.98803560_dp
    1576            2 :          aval = 0.02492140_dp
    1577            2 :          ngto(0) = 30
    1578            2 :          ngto(1) = 21
    1579            2 :          ngto(2) = 17
    1580            2 :          ival(1) = 2
    1581            2 :          ival(2) = 1
    1582              :       CASE (24)
    1583            0 :          cval = 1.98984000_dp
    1584            0 :          aval = 0.02568400_dp
    1585            0 :          ngto(0) = 30
    1586            0 :          ngto(1) = 21
    1587            0 :          ngto(2) = 17
    1588            0 :          ival(1) = 2
    1589            0 :          ival(2) = 1
    1590              :       CASE (25)
    1591            0 :          cval = 2.01694380_dp
    1592            0 :          aval = 0.02664480_dp
    1593            0 :          ngto(0) = 30
    1594            0 :          ngto(1) = 21
    1595            0 :          ngto(2) = 17
    1596            0 :          ival(1) = 2
    1597            0 :          ival(2) = 1
    1598              :       CASE (26)
    1599            0 :          cval = 2.01824090_dp
    1600            0 :          aval = 0.01355000_dp
    1601            0 :          ngto(0) = 30
    1602            0 :          ngto(1) = 21
    1603            0 :          ngto(2) = 17
    1604            0 :          ival(1) = 2
    1605            0 :          ival(2) = 1
    1606              :       CASE (27)
    1607            0 :          cval = 1.98359400_dp
    1608            0 :          aval = 0.01702210_dp
    1609            0 :          ngto(0) = 30
    1610            0 :          ngto(1) = 21
    1611            0 :          ngto(2) = 17
    1612            0 :          ival(1) = 2
    1613            0 :          ival(2) = 2
    1614              :       CASE (28)
    1615            2 :          cval = 1.96797340_dp
    1616            2 :          aval = 0.02163180_dp
    1617            2 :          ngto(0) = 30
    1618            2 :          ngto(1) = 22
    1619            2 :          ngto(2) = 17
    1620            2 :          ival(1) = 3
    1621            2 :          ival(2) = 2
    1622              :       CASE (29)
    1623            0 :          cval = 1.98955180_dp
    1624            0 :          aval = 0.02304480_dp
    1625            0 :          ngto(0) = 30
    1626            0 :          ngto(1) = 20
    1627            0 :          ngto(2) = 17
    1628            0 :          ival(1) = 3
    1629            0 :          ival(2) = 2
    1630              :       CASE (30)
    1631            0 :          cval = 1.98074320_dp
    1632            0 :          aval = 0.02754320_dp
    1633            0 :          ngto(0) = 30
    1634            0 :          ngto(1) = 21
    1635            0 :          ngto(2) = 17
    1636            0 :          ival(1) = 3
    1637            0 :          ival(2) = 2
    1638              :       CASE (31)
    1639            0 :          cval = 2.00551070_dp
    1640            0 :          aval = 0.02005530_dp
    1641            0 :          ngto(0) = 30
    1642            0 :          ngto(1) = 23
    1643            0 :          ngto(2) = 17
    1644            0 :          ival(0) = 1
    1645            0 :          ival(2) = 2
    1646              :       CASE (32)
    1647            2 :          cval = 2.00000030_dp
    1648            2 :          aval = 0.02003000_dp
    1649            2 :          ngto(0) = 30
    1650            2 :          ngto(1) = 24
    1651            2 :          ngto(2) = 17
    1652            2 :          ival(0) = 1
    1653            2 :          ival(2) = 2
    1654              :       CASE (33)
    1655            0 :          cval = 2.00609100_dp
    1656            0 :          aval = 0.02055620_dp
    1657            0 :          ngto(0) = 30
    1658            0 :          ngto(1) = 23
    1659            0 :          ngto(2) = 17
    1660            0 :          ival(0) = 1
    1661            0 :          ival(2) = 2
    1662              :       CASE (34)
    1663            0 :          cval = 2.00701000_dp
    1664            0 :          aval = 0.02230400_dp
    1665            0 :          ngto(0) = 30
    1666            0 :          ngto(1) = 24
    1667            0 :          ngto(2) = 17
    1668            0 :          ival(0) = 1
    1669            0 :          ival(2) = 2
    1670              :       CASE (35)
    1671            0 :          cval = 2.01508710_dp
    1672            0 :          aval = 0.02685790_dp
    1673            0 :          ngto(0) = 30
    1674            0 :          ngto(1) = 24
    1675            0 :          ngto(2) = 17
    1676            0 :          ival(0) = 1
    1677            0 :          ival(2) = 2
    1678              :       CASE (36)
    1679            2 :          cval = 2.01960430_dp
    1680            2 :          aval = 0.02960430_dp
    1681            2 :          ngto(0) = 30
    1682            2 :          ngto(1) = 24
    1683            2 :          ngto(2) = 17
    1684            2 :          ival(0) = 1
    1685            2 :          ival(2) = 2
    1686              :       CASE (37)
    1687            2 :          cval = 2.00031000_dp
    1688            2 :          aval = 0.00768400_dp
    1689            2 :          ngto(0) = 32
    1690            2 :          ngto(1) = 25
    1691            2 :          ngto(2) = 17
    1692            2 :          ival(0) = 1
    1693            2 :          ival(1) = 1
    1694            2 :          ival(2) = 4
    1695              :       CASE (38)
    1696            0 :          cval = 1.99563960_dp
    1697            0 :          aval = 0.01401940_dp
    1698            0 :          ngto(0) = 33
    1699            0 :          ngto(1) = 24
    1700            0 :          ngto(2) = 17
    1701            0 :          ival(1) = 1
    1702            0 :          ival(2) = 4
    1703              :       CASE (39)
    1704            2 :          cval = 1.98971210_dp
    1705            2 :          aval = 0.01558470_dp
    1706            2 :          ngto(0) = 33
    1707            2 :          ngto(1) = 24
    1708            2 :          ngto(2) = 20
    1709            2 :          ival(1) = 1
    1710              :       CASE (40)
    1711            0 :          cval = 1.97976190_dp
    1712            0 :          aval = 0.01705520_dp
    1713            0 :          ngto(0) = 33
    1714            0 :          ngto(1) = 24
    1715            0 :          ngto(2) = 20
    1716            0 :          ival(1) = 1
    1717              :       CASE (41)
    1718            0 :          cval = 1.97989290_dp
    1719            0 :          aval = 0.01527040_dp
    1720            0 :          ngto(0) = 33
    1721            0 :          ngto(1) = 24
    1722            0 :          ngto(2) = 20
    1723            0 :          ival(1) = 1
    1724              :       CASE (42)
    1725            0 :          cval = 1.97909240_dp
    1726            0 :          aval = 0.01879720_dp
    1727            0 :          ngto(0) = 32
    1728            0 :          ngto(1) = 24
    1729            0 :          ngto(2) = 20
    1730            0 :          ival(1) = 1
    1731              :       CASE (43)
    1732            2 :          cval = 1.98508430_dp
    1733            2 :          aval = 0.01497550_dp
    1734            2 :          ngto(0) = 32
    1735            2 :          ngto(1) = 24
    1736            2 :          ngto(2) = 20
    1737            2 :          ival(1) = 2
    1738            2 :          ival(2) = 1
    1739              :       CASE (44)
    1740            0 :          cval = 1.98515010_dp
    1741            0 :          aval = 0.01856670_dp
    1742            0 :          ngto(0) = 32
    1743            0 :          ngto(1) = 24
    1744            0 :          ngto(2) = 20
    1745            0 :          ival(1) = 2
    1746            0 :          ival(2) = 1
    1747              :       CASE (45)
    1748            2 :          cval = 1.98502970_dp
    1749            2 :          aval = 0.01487000_dp
    1750            2 :          ngto(0) = 32
    1751            2 :          ngto(1) = 24
    1752            2 :          ngto(2) = 20
    1753            2 :          ival(1) = 2
    1754            2 :          ival(2) = 1
    1755              :       CASE (46)
    1756            0 :          cval = 1.97672850_dp
    1757            0 :          aval = 0.01762500_dp
    1758            0 :          ngto(0) = 30
    1759            0 :          ngto(1) = 24
    1760            0 :          ngto(2) = 20
    1761            0 :          ival(0) = 2
    1762            0 :          ival(1) = 2
    1763            0 :          ival(2) = 1
    1764              :       CASE (47)
    1765            0 :          cval = 1.97862730_dp
    1766            0 :          aval = 0.01863310_dp
    1767            0 :          ngto(0) = 32
    1768            0 :          ngto(1) = 24
    1769            0 :          ngto(2) = 20
    1770            0 :          ival(1) = 2
    1771            0 :          ival(2) = 1
    1772              :       CASE (48)
    1773            0 :          cval = 1.97990020_dp
    1774            0 :          aval = 0.01347150_dp
    1775            0 :          ngto(0) = 33
    1776            0 :          ngto(1) = 24
    1777            0 :          ngto(2) = 20
    1778            0 :          ival(1) = 2
    1779            0 :          ival(2) = 2
    1780              :       CASE (49)
    1781            0 :          cval = 1.97979410_dp
    1782            0 :          aval = 0.00890265_dp
    1783            0 :          ngto(0) = 33
    1784            0 :          ngto(1) = 27
    1785            0 :          ngto(2) = 20
    1786            0 :          ival(0) = 2
    1787            0 :          ival(2) = 2
    1788              :       CASE (50)
    1789            0 :          cval = 1.98001000_dp
    1790            0 :          aval = 0.00895215_dp
    1791            0 :          ngto(0) = 33
    1792            0 :          ngto(1) = 27
    1793            0 :          ngto(2) = 20
    1794            0 :          ival(0) = 2
    1795            0 :          ival(2) = 2
    1796              :       CASE (51)
    1797            0 :          cval = 1.97979980_dp
    1798            0 :          aval = 0.01490290_dp
    1799            0 :          ngto(0) = 33
    1800            0 :          ngto(1) = 26
    1801            0 :          ngto(2) = 20
    1802            0 :          ival(1) = 1
    1803            0 :          ival(2) = 2
    1804              :       CASE (52)
    1805            0 :          cval = 1.98009310_dp
    1806            0 :          aval = 0.01490390_dp
    1807            0 :          ngto(0) = 33
    1808            0 :          ngto(1) = 26
    1809            0 :          ngto(2) = 20
    1810            0 :          ival(1) = 1
    1811            0 :          ival(2) = 2
    1812              :       CASE (53)
    1813            0 :          cval = 1.97794750_dp
    1814            0 :          aval = 0.01425880_dp
    1815            0 :          ngto(0) = 33
    1816            0 :          ngto(1) = 26
    1817            0 :          ngto(2) = 20
    1818            0 :          ival(0) = 2
    1819            0 :          ival(1) = 1
    1820            0 :          ival(2) = 2
    1821              :       CASE (54)
    1822            0 :          cval = 1.97784450_dp
    1823            0 :          aval = 0.01430130_dp
    1824            0 :          ngto(0) = 33
    1825            0 :          ngto(1) = 26
    1826            0 :          ngto(2) = 20
    1827            0 :          ival(0) = 2
    1828            0 :          ival(1) = 1
    1829            0 :          ival(2) = 2
    1830              :       CASE (55)
    1831            0 :          cval = 1.97784450_dp
    1832            0 :          aval = 0.00499318_dp
    1833            0 :          ngto(0) = 32
    1834            0 :          ngto(1) = 25
    1835            0 :          ngto(2) = 17
    1836            0 :          ival(0) = 1
    1837            0 :          ival(1) = 3
    1838            0 :          ival(2) = 6
    1839              :       CASE (56)
    1840            2 :          cval = 1.97764820_dp
    1841            2 :          aval = 0.00500392_dp
    1842            2 :          ngto(0) = 32
    1843            2 :          ngto(1) = 25
    1844            2 :          ngto(2) = 17
    1845            2 :          ival(0) = 1
    1846            2 :          ival(1) = 3
    1847            2 :          ival(2) = 6
    1848              :       CASE (57)
    1849            2 :          cval = 1.97765150_dp
    1850            2 :          aval = 0.00557083_dp
    1851            2 :          ngto(0) = 32
    1852            2 :          ngto(1) = 25
    1853            2 :          ngto(2) = 20
    1854            2 :          ival(0) = 1
    1855            2 :          ival(1) = 3
    1856            2 :          ival(2) = 3
    1857              :       CASE (58)
    1858            0 :          cval = 1.97768750_dp
    1859            0 :          aval = 0.00547531_dp
    1860            0 :          ngto(0) = 32
    1861            0 :          ngto(1) = 25
    1862            0 :          ngto(2) = 20
    1863            0 :          ngto(3) = 16
    1864            0 :          ival(0) = 1
    1865            0 :          ival(1) = 3
    1866            0 :          ival(2) = 3
    1867            0 :          ival(3) = 3
    1868              :       CASE (59)
    1869            0 :          cval = 1.96986600_dp
    1870            0 :          aval = 0.00813143_dp
    1871            0 :          ngto(0) = 32
    1872            0 :          ngto(1) = 25
    1873            0 :          ngto(2) = 17
    1874            0 :          ngto(3) = 16
    1875            0 :          ival(0) = 1
    1876            0 :          ival(1) = 3
    1877            0 :          ival(2) = 6
    1878            0 :          ival(3) = 4
    1879              :       CASE (60)
    1880            0 :          cval = 1.97765720_dp
    1881            0 :          aval = 0.00489201_dp
    1882            0 :          ngto(0) = 32
    1883            0 :          ngto(1) = 25
    1884            0 :          ngto(2) = 17
    1885            0 :          ngto(3) = 16
    1886            0 :          ival(0) = 1
    1887            0 :          ival(1) = 3
    1888            0 :          ival(2) = 6
    1889            0 :          ival(3) = 4
    1890              :       CASE (61)
    1891            0 :          cval = 1.97768120_dp
    1892            0 :          aval = 0.00499000_dp
    1893            0 :          ngto(0) = 32
    1894            0 :          ngto(1) = 25
    1895            0 :          ngto(2) = 17
    1896            0 :          ngto(3) = 16
    1897            0 :          ival(0) = 1
    1898            0 :          ival(1) = 3
    1899            0 :          ival(2) = 6
    1900            0 :          ival(3) = 4
    1901              :       CASE (62)
    1902            0 :          cval = 1.97745700_dp
    1903            0 :          aval = 0.00615587_dp
    1904            0 :          ngto(0) = 32
    1905            0 :          ngto(1) = 25
    1906            0 :          ngto(2) = 17
    1907            0 :          ngto(3) = 16
    1908            0 :          ival(0) = 1
    1909            0 :          ival(1) = 3
    1910            0 :          ival(2) = 6
    1911            0 :          ival(3) = 4
    1912              :       CASE (63)
    1913            0 :          cval = 1.97570240_dp
    1914            0 :          aval = 0.00769959_dp
    1915            0 :          ngto(0) = 32
    1916            0 :          ngto(1) = 25
    1917            0 :          ngto(2) = 17
    1918            0 :          ngto(3) = 16
    1919            0 :          ival(0) = 1
    1920            0 :          ival(1) = 3
    1921            0 :          ival(2) = 6
    1922            0 :          ival(3) = 4
    1923              :       CASE (64)
    1924            0 :          cval = 1.97629350_dp
    1925            0 :          aval = 0.00706610_dp
    1926            0 :          ngto(0) = 32
    1927            0 :          ngto(1) = 25
    1928            0 :          ngto(2) = 20
    1929            0 :          ngto(3) = 16
    1930            0 :          ival(0) = 1
    1931            0 :          ival(1) = 3
    1932            0 :          ival(2) = 3
    1933            0 :          ival(3) = 4
    1934              :       CASE (65)
    1935            2 :          cval = 1.96900000_dp
    1936            2 :          aval = 0.01019150_dp
    1937            2 :          ngto(0) = 32
    1938            2 :          ngto(1) = 26
    1939            2 :          ngto(2) = 18
    1940            2 :          ngto(3) = 16
    1941            2 :          ival(0) = 1
    1942            2 :          ival(1) = 3
    1943            2 :          ival(2) = 6
    1944            2 :          ival(3) = 4
    1945              :       CASE (66)
    1946            0 :          cval = 1.97350000_dp
    1947            0 :          aval = 0.01334320_dp
    1948            0 :          ngto(0) = 33
    1949            0 :          ngto(1) = 26
    1950            0 :          ngto(2) = 18
    1951            0 :          ngto(3) = 16
    1952            0 :          ival(0) = 1
    1953            0 :          ival(1) = 3
    1954            0 :          ival(2) = 6
    1955            0 :          ival(3) = 4
    1956              :       CASE (67)
    1957            0 :          cval = 1.97493000_dp
    1958            0 :          aval = 0.01331360_dp
    1959            0 :          ngto(0) = 32
    1960            0 :          ngto(1) = 24
    1961            0 :          ngto(2) = 17
    1962            0 :          ngto(3) = 14
    1963            0 :          ival(1) = 2
    1964            0 :          ival(2) = 5
    1965            0 :          ival(3) = 4
    1966              :       CASE (68)
    1967            0 :          cval = 1.97597670_dp
    1968            0 :          aval = 0.01434040_dp
    1969            0 :          ngto(0) = 32
    1970            0 :          ngto(1) = 24
    1971            0 :          ngto(2) = 17
    1972            0 :          ngto(3) = 14
    1973              :          ival(0) = 0
    1974            0 :          ival(1) = 2
    1975            0 :          ival(2) = 5
    1976            0 :          ival(3) = 4
    1977              :       CASE (69)
    1978            0 :          cval = 1.97809240_dp
    1979            0 :          aval = 0.01529430_dp
    1980            0 :          ngto(0) = 32
    1981            0 :          ngto(1) = 24
    1982            0 :          ngto(2) = 17
    1983            0 :          ngto(3) = 14
    1984              :          ival(0) = 0
    1985            0 :          ival(1) = 2
    1986            0 :          ival(2) = 5
    1987            0 :          ival(3) = 4
    1988              :       CASE (70)
    1989            2 :          cval = 1.97644360_dp
    1990            2 :          aval = 0.01312770_dp
    1991            2 :          ngto(0) = 32
    1992            2 :          ngto(1) = 24
    1993            2 :          ngto(2) = 17
    1994            2 :          ngto(3) = 14
    1995              :          ival(0) = 0
    1996            2 :          ival(1) = 2
    1997            2 :          ival(2) = 5
    1998            2 :          ival(3) = 4
    1999              :       CASE (71)
    2000            2 :          cval = 1.96998000_dp
    2001            2 :          aval = 0.01745150_dp
    2002            2 :          ngto(0) = 31
    2003            2 :          ngto(1) = 24
    2004            2 :          ngto(2) = 20
    2005            2 :          ngto(3) = 14
    2006            2 :          ival(0) = 1
    2007            2 :          ival(1) = 2
    2008            2 :          ival(2) = 2
    2009            2 :          ival(3) = 4
    2010              :       CASE (72)
    2011            0 :          cval = 1.97223830_dp
    2012            0 :          aval = 0.01639750_dp
    2013            0 :          ngto(0) = 31
    2014            0 :          ngto(1) = 24
    2015            0 :          ngto(2) = 20
    2016            0 :          ngto(3) = 14
    2017            0 :          ival(0) = 1
    2018            0 :          ival(1) = 2
    2019            0 :          ival(2) = 2
    2020            0 :          ival(3) = 4
    2021              :       CASE (73)
    2022            0 :          cval = 1.97462110_dp
    2023            0 :          aval = 0.01603680_dp
    2024            0 :          ngto(0) = 31
    2025            0 :          ngto(1) = 24
    2026            0 :          ngto(2) = 20
    2027            0 :          ngto(3) = 14
    2028            0 :          ival(0) = 1
    2029            0 :          ival(1) = 2
    2030            0 :          ival(2) = 2
    2031            0 :          ival(3) = 4
    2032              :       CASE (74)
    2033            0 :          cval = 1.97756000_dp
    2034            0 :          aval = 0.02030570_dp
    2035            0 :          ngto(0) = 31
    2036            0 :          ngto(1) = 24
    2037            0 :          ngto(2) = 20
    2038            0 :          ngto(3) = 14
    2039            0 :          ival(0) = 1
    2040            0 :          ival(1) = 2
    2041            0 :          ival(2) = 2
    2042            0 :          ival(3) = 4
    2043              :       CASE (75)
    2044            2 :          cval = 1.97645760_dp
    2045            2 :          aval = 0.02057180_dp
    2046            2 :          ngto(0) = 31
    2047            2 :          ngto(1) = 24
    2048            2 :          ngto(2) = 20
    2049            2 :          ngto(3) = 14
    2050            2 :          ival(0) = 1
    2051            2 :          ival(1) = 2
    2052            2 :          ival(2) = 2
    2053            2 :          ival(3) = 4
    2054              :       CASE (76)
    2055            2 :          cval = 1.97725820_dp
    2056            2 :          aval = 0.02058210_dp
    2057            2 :          ngto(0) = 32
    2058            2 :          ngto(1) = 24
    2059            2 :          ngto(2) = 20
    2060            2 :          ngto(3) = 15
    2061              :          ival(0) = 0
    2062            2 :          ival(1) = 2
    2063            2 :          ival(2) = 2
    2064            2 :          ival(3) = 4
    2065              :       CASE (77)
    2066            0 :          cval = 1.97749380_dp
    2067            0 :          aval = 0.02219380_dp
    2068            0 :          ngto(0) = 32
    2069            0 :          ngto(1) = 24
    2070            0 :          ngto(2) = 20
    2071            0 :          ngto(3) = 15
    2072              :          ival(0) = 0
    2073            0 :          ival(1) = 2
    2074            0 :          ival(2) = 2
    2075            0 :          ival(3) = 4
    2076              :       CASE (78)
    2077            0 :          cval = 1.97946280_dp
    2078            0 :          aval = 0.02216280_dp
    2079            0 :          ngto(0) = 32
    2080            0 :          ngto(1) = 24
    2081            0 :          ngto(2) = 20
    2082            0 :          ngto(3) = 15
    2083              :          ival(0) = 0
    2084            0 :          ival(1) = 2
    2085            0 :          ival(2) = 2
    2086            0 :          ival(3) = 4
    2087              :       CASE (79)
    2088            2 :          cval = 1.97852130_dp
    2089            2 :          aval = 0.02168500_dp
    2090            2 :          ngto(0) = 32
    2091            2 :          ngto(1) = 24
    2092            2 :          ngto(2) = 20
    2093            2 :          ngto(3) = 15
    2094              :          ival(0) = 0
    2095            2 :          ival(1) = 2
    2096            2 :          ival(2) = 2
    2097            2 :          ival(3) = 4
    2098              :       CASE (80)
    2099            0 :          cval = 1.98045190_dp
    2100            0 :          aval = 0.02177860_dp
    2101            0 :          ngto(0) = 32
    2102            0 :          ngto(1) = 24
    2103            0 :          ngto(2) = 20
    2104            0 :          ngto(3) = 15
    2105              :          ival(0) = 0
    2106            0 :          ival(1) = 2
    2107            0 :          ival(2) = 2
    2108            0 :          ival(3) = 4
    2109              :       CASE (81)
    2110            2 :          cval = 1.97000000_dp
    2111            2 :          aval = 0.02275000_dp
    2112            2 :          ngto(0) = 31
    2113            2 :          ngto(1) = 25
    2114            2 :          ngto(2) = 18
    2115            2 :          ngto(3) = 13
    2116            2 :          ival(0) = 1
    2117              :          ival(1) = 0
    2118            2 :          ival(2) = 3
    2119            2 :          ival(3) = 6
    2120              :       CASE (82)
    2121            0 :          cval = 1.97713580_dp
    2122            0 :          aval = 0.02317030_dp
    2123            0 :          ngto(0) = 31
    2124            0 :          ngto(1) = 27
    2125            0 :          ngto(2) = 18
    2126            0 :          ngto(3) = 13
    2127            0 :          ival(0) = 1
    2128              :          ival(1) = 0
    2129            0 :          ival(2) = 3
    2130            0 :          ival(3) = 6
    2131              :       CASE (83)
    2132            0 :          cval = 1.97537880_dp
    2133            0 :          aval = 0.02672860_dp
    2134            0 :          ngto(0) = 32
    2135            0 :          ngto(1) = 27
    2136            0 :          ngto(2) = 17
    2137            0 :          ngto(3) = 13
    2138            0 :          ival(0) = 1
    2139              :          ival(1) = 0
    2140            0 :          ival(2) = 3
    2141            0 :          ival(3) = 6
    2142              :       CASE (84)
    2143            0 :          cval = 1.97545360_dp
    2144            0 :          aval = 0.02745360_dp
    2145            0 :          ngto(0) = 31
    2146            0 :          ngto(1) = 27
    2147            0 :          ngto(2) = 17
    2148            0 :          ngto(3) = 13
    2149            0 :          ival(0) = 1
    2150              :          ival(1) = 0
    2151            0 :          ival(2) = 3
    2152            0 :          ival(3) = 6
    2153              :       CASE (85)
    2154            0 :          cval = 1.97338370_dp
    2155            0 :          aval = 0.02616310_dp
    2156            0 :          ngto(0) = 32
    2157            0 :          ngto(1) = 27
    2158            0 :          ngto(2) = 19
    2159            0 :          ngto(3) = 13
    2160            0 :          ival(0) = 1
    2161              :          ival(1) = 0
    2162            0 :          ival(2) = 3
    2163            0 :          ival(3) = 6
    2164              :       CASE (86)
    2165            0 :          cval = 1.97294240_dp
    2166            0 :          aval = 0.02429220_dp
    2167            0 :          ngto(0) = 32
    2168            0 :          ngto(1) = 27
    2169            0 :          ngto(2) = 19
    2170            0 :          ngto(3) = 13
    2171            0 :          ival(0) = 1
    2172              :          ival(1) = 0
    2173            0 :          ival(2) = 3
    2174            0 :          ival(3) = 6
    2175              :       CASE (87:106) ! these numbers are an educated guess
    2176           14 :          cval = 1.98000000_dp
    2177           14 :          aval = 0.01400000_dp
    2178           14 :          ngto(0) = 34
    2179           14 :          ngto(1) = 28
    2180           14 :          ngto(2) = 20
    2181           14 :          ngto(3) = 15
    2182              :          ival(0) = 0
    2183              :          ival(1) = 0
    2184           14 :          ival(2) = 3
    2185           14 :          ival(3) = 6
    2186              :       CASE DEFAULT
    2187          156 :          CPABORT("No geometrical basis set data are available for the selected atom number.")
    2188              :       END SELECT
    2189              : 
    2190          156 :    END SUBROUTINE Clementi_geobas
    2191              : 
    2192              : ! **************************************************************************************************
    2193              : !> \brief ...
    2194              : !> \param element_symbol ...
    2195              : !> \param basis ...
    2196              : !> \param basis_set_name ...
    2197              : !> \param basis_set_file ...
    2198              : !> \param basis_section ...
    2199              : ! **************************************************************************************************
    2200           79 :    SUBROUTINE read_basis_set(element_symbol, basis, basis_set_name, basis_set_file, &
    2201              :                              basis_section)
    2202              : 
    2203              :       CHARACTER(LEN=*), INTENT(IN)                       :: element_symbol
    2204              :       TYPE(atom_basis_type), INTENT(INOUT)               :: basis
    2205              :       CHARACTER(LEN=*), INTENT(IN)                       :: basis_set_name, basis_set_file
    2206              :       TYPE(section_vals_type), POINTER                   :: basis_section
    2207              : 
    2208              :       INTEGER, PARAMETER                                 :: maxpri = 40, maxset = 20
    2209              : 
    2210              :       CHARACTER(len=20*default_string_length)            :: line_att
    2211              :       CHARACTER(LEN=240)                                 :: line
    2212              :       CHARACTER(LEN=242)                                 :: line2
    2213           79 :       CHARACTER(LEN=LEN(basis_set_name))                 :: bsname
    2214           79 :       CHARACTER(LEN=LEN(basis_set_name)+2)               :: bsname2
    2215           79 :       CHARACTER(LEN=LEN(element_symbol))                 :: symbol
    2216           79 :       CHARACTER(LEN=LEN(element_symbol)+2)               :: symbol2
    2217              :       INTEGER                                            :: i, ii, ipgf, irep, iset, ishell, j, k, &
    2218              :                                                             lshell, nj, nmin, ns, nset, strlen1, &
    2219              :                                                             strlen2
    2220              :       INTEGER, DIMENSION(maxpri, maxset)                 :: l
    2221              :       INTEGER, DIMENSION(maxset)                         :: lmax, lmin, n, npgf, nshell
    2222              :       LOGICAL                                            :: found, is_ok, match, read_from_input
    2223              :       REAL(dp)                                           :: expzet, gcca, prefac, zeta
    2224              :       REAL(dp), DIMENSION(maxpri, maxpri, maxset)        :: gcc
    2225              :       REAL(dp), DIMENSION(maxpri, maxset)                :: zet
    2226              :       TYPE(cp_sll_val_type), POINTER                     :: list
    2227              :       TYPE(val_type), POINTER                            :: val
    2228              : 
    2229           79 :       bsname = basis_set_name
    2230           79 :       symbol = element_symbol
    2231           79 :       irep = 0
    2232              : 
    2233           79 :       nset = 0
    2234           79 :       lmin = 0
    2235           79 :       lmax = 0
    2236           79 :       npgf = 0
    2237           79 :       n = 0
    2238           79 :       l = 0
    2239           79 :       zet = 0._dp
    2240           79 :       gcc = 0._dp
    2241              : 
    2242              :       read_from_input = .FALSE.
    2243           79 :       CALL section_vals_get(basis_section, explicit=read_from_input)
    2244           79 :       IF (read_from_input) THEN
    2245            0 :          NULLIFY (list, val)
    2246            0 :          CALL section_vals_list_get(basis_section, "_DEFAULT_KEYWORD_", list=list)
    2247            0 :          CALL uppercase(symbol)
    2248            0 :          CALL uppercase(bsname)
    2249            0 :          is_ok = cp_sll_val_next(list, val)
    2250            0 :          CPASSERT(is_ok)
    2251            0 :          CALL val_get(val, c_val=line_att)
    2252            0 :          READ (line_att, *) nset
    2253            0 :          CPASSERT(nset <= maxset)
    2254            0 :          DO iset = 1, nset
    2255            0 :             is_ok = cp_sll_val_next(list, val)
    2256            0 :             CPASSERT(is_ok)
    2257            0 :             CALL val_get(val, c_val=line_att)
    2258            0 :             READ (line_att, *) n(iset)
    2259            0 :             CALL remove_word(line_att)
    2260            0 :             READ (line_att, *) lmin(iset)
    2261            0 :             CALL remove_word(line_att)
    2262            0 :             READ (line_att, *) lmax(iset)
    2263            0 :             CALL remove_word(line_att)
    2264            0 :             READ (line_att, *) npgf(iset)
    2265            0 :             CALL remove_word(line_att)
    2266            0 :             CPASSERT(npgf(iset) <= maxpri)
    2267            0 :             nshell(iset) = 0
    2268            0 :             DO lshell = lmin(iset), lmax(iset)
    2269            0 :                nmin = n(iset) + lshell - lmin(iset)
    2270            0 :                READ (line_att, *) ishell
    2271            0 :                CALL remove_word(line_att)
    2272            0 :                nshell(iset) = nshell(iset) + ishell
    2273            0 :                DO i = 1, ishell
    2274            0 :                   l(nshell(iset) - ishell + i, iset) = lshell
    2275              :                END DO
    2276              :             END DO
    2277            0 :             CPASSERT(LEN_TRIM(line_att) == 0)
    2278            0 :             DO ipgf = 1, npgf(iset)
    2279            0 :                is_ok = cp_sll_val_next(list, val)
    2280            0 :                CPASSERT(is_ok)
    2281            0 :                CALL val_get(val, c_val=line_att)
    2282            0 :                READ (line_att, *) zet(ipgf, iset), (gcc(ipgf, ishell, iset), ishell=1, nshell(iset))
    2283              :             END DO
    2284              :          END DO
    2285              :       ELSE
    2286           79 :          BLOCK
    2287              :             TYPE(cp_parser_type)                      :: parser
    2288           79 :             CALL parser_create(parser, basis_set_file)
    2289              :             ! Search for the requested basis set in the basis set file
    2290              :             ! until the basis set is found or the end of file is reached
    2291              :             search_loop: DO
    2292          522 :                CALL parser_search_string(parser, TRIM(bsname), .TRUE., found, line)
    2293          522 :                IF (found) THEN
    2294          522 :                   CALL uppercase(symbol)
    2295          522 :                   CALL uppercase(bsname)
    2296          522 :                   match = .FALSE.
    2297          522 :                   CALL uppercase(line)
    2298              :                   ! Check both the element symbol and the basis set name
    2299          522 :                   line2 = " "//line//" "
    2300          522 :                   symbol2 = " "//TRIM(symbol)//" "
    2301          522 :                   bsname2 = " "//TRIM(bsname)//" "
    2302          522 :                   strlen1 = LEN_TRIM(symbol2) + 1
    2303          522 :                   strlen2 = LEN_TRIM(bsname2) + 1
    2304              : 
    2305          522 :                   IF ((INDEX(line2, symbol2(:strlen1)) > 0) .AND. &
    2306              :                       (INDEX(line2, bsname2(:strlen2)) > 0)) match = .TRUE.
    2307              : 
    2308              :                   IF (match) THEN
    2309              :                      ! Read the basis set information
    2310           79 :                      CALL parser_get_object(parser, nset, newline=.TRUE.)
    2311           79 :                      CPASSERT(nset <= maxset)
    2312          368 :                      DO iset = 1, nset
    2313          289 :                         CALL parser_get_object(parser, n(iset), newline=.TRUE.)
    2314          289 :                         CALL parser_get_object(parser, lmin(iset))
    2315          289 :                         CALL parser_get_object(parser, lmax(iset))
    2316          289 :                         CALL parser_get_object(parser, npgf(iset))
    2317          289 :                         CPASSERT(npgf(iset) <= maxpri)
    2318          289 :                         nshell(iset) = 0
    2319          606 :                         DO lshell = lmin(iset), lmax(iset)
    2320          317 :                            nmin = n(iset) + lshell - lmin(iset)
    2321          317 :                            CALL parser_get_object(parser, ishell)
    2322          317 :                            nshell(iset) = nshell(iset) + ishell
    2323         1003 :                            DO i = 1, ishell
    2324          714 :                               l(nshell(iset) - ishell + i, iset) = lshell
    2325              :                            END DO
    2326              :                         END DO
    2327         1096 :                         DO ipgf = 1, npgf(iset)
    2328          728 :                            CALL parser_get_object(parser, zet(ipgf, iset), newline=.TRUE.)
    2329         2212 :                            DO ishell = 1, nshell(iset)
    2330         1923 :                               CALL parser_get_object(parser, gcc(ipgf, ishell, iset))
    2331              :                            END DO
    2332              :                         END DO
    2333              :                      END DO
    2334              : 
    2335              :                      EXIT search_loop
    2336              : 
    2337              :                   END IF
    2338              :                ELSE
    2339              :                   ! Stop program, if the end of file is reached
    2340            0 :                   CPABORT("End of file reached and the requested basis set was not found.")
    2341              :                END IF
    2342              : 
    2343              :             END DO search_loop
    2344              : 
    2345          316 :             CALL parser_release(parser)
    2346              :          END BLOCK
    2347              :       END IF
    2348              : 
    2349              :       ! fill in the basis data structures
    2350          553 :       basis%nprim = 0
    2351          553 :       basis%nbas = 0
    2352          368 :       DO i = 1, nset
    2353          606 :          DO j = lmin(i), MIN(lmax(i), lmat)
    2354          606 :             basis%nprim(j) = basis%nprim(j) + npgf(i)
    2355              :          END DO
    2356          765 :          DO j = 1, nshell(i)
    2357          397 :             k = l(j, i)
    2358          686 :             IF (k <= lmat) basis%nbas(k) = basis%nbas(k) + 1
    2359              :          END DO
    2360              :       END DO
    2361              : 
    2362          553 :       nj = MAXVAL(basis%nprim)
    2363          553 :       ns = MAXVAL(basis%nbas)
    2364          237 :       ALLOCATE (basis%am(nj, 0:lmat))
    2365         3745 :       basis%am = 0._dp
    2366          395 :       ALLOCATE (basis%cm(nj, ns, 0:lmat))
    2367        11935 :       basis%cm = 0._dp
    2368              : 
    2369          553 :       DO j = 0, lmat
    2370              :          nj = 0
    2371              :          ns = 0
    2372         2287 :          DO i = 1, nset
    2373         2208 :             IF (j >= lmin(i) .AND. j <= lmax(i)) THEN
    2374         1140 :                DO ipgf = 1, npgf(i)
    2375         1140 :                   basis%am(nj + ipgf, j) = zet(ipgf, i)
    2376              :                END DO
    2377          804 :                DO ii = 1, nshell(i)
    2378          804 :                   IF (l(ii, i) == j) THEN
    2379          397 :                      ns = ns + 1
    2380         1592 :                      DO ipgf = 1, npgf(i)
    2381         1592 :                         basis%cm(nj + ipgf, ns, j) = gcc(ipgf, ii, i)
    2382              :                      END DO
    2383              :                   END IF
    2384              :                END DO
    2385          317 :                nj = nj + npgf(i)
    2386              :             END IF
    2387              :          END DO
    2388              :       END DO
    2389              : 
    2390              :       ! Normalization
    2391          553 :       DO j = 0, lmat
    2392          474 :          expzet = 0.25_dp*REAL(2*j + 3, dp)
    2393          474 :          prefac = SQRT(rootpi/2._dp**(j + 2)*dfac(2*j + 1))
    2394         1376 :          DO ipgf = 1, basis%nprim(j)
    2395         3645 :             DO ii = 1, basis%nbas(j)
    2396         2348 :                gcca = basis%cm(ipgf, ii, j)
    2397         2348 :                zeta = 2._dp*basis%am(ipgf, j)
    2398         3171 :                basis%cm(ipgf, ii, j) = zeta**expzet*gcca/prefac
    2399              :             END DO
    2400              :          END DO
    2401              :       END DO
    2402              : 
    2403          158 :    END SUBROUTINE read_basis_set
    2404              : 
    2405              : ! **************************************************************************************************
    2406              : !> \brief ...
    2407              : !> \param optimization ...
    2408              : !> \param opt_section ...
    2409              : ! **************************************************************************************************
    2410         1810 :    SUBROUTINE read_atom_opt_section(optimization, opt_section)
    2411              :       TYPE(atom_optimization_type), INTENT(INOUT)        :: optimization
    2412              :       TYPE(section_vals_type), POINTER                   :: opt_section
    2413              : 
    2414              :       INTEGER                                            :: miter, ndiis
    2415              :       REAL(KIND=dp)                                      :: damp, eps_diis, eps_scf
    2416              : 
    2417          362 :       CALL section_vals_val_get(opt_section, "MAX_ITER", i_val=miter)
    2418          362 :       CALL section_vals_val_get(opt_section, "EPS_SCF", r_val=eps_scf)
    2419          362 :       CALL section_vals_val_get(opt_section, "N_DIIS", i_val=ndiis)
    2420          362 :       CALL section_vals_val_get(opt_section, "EPS_DIIS", r_val=eps_diis)
    2421          362 :       CALL section_vals_val_get(opt_section, "DAMPING", r_val=damp)
    2422              : 
    2423          362 :       optimization%max_iter = miter
    2424          362 :       optimization%eps_scf = eps_scf
    2425          362 :       optimization%n_diis = ndiis
    2426          362 :       optimization%eps_diis = eps_diis
    2427          362 :       optimization%damping = damp
    2428              : 
    2429          362 :    END SUBROUTINE read_atom_opt_section
    2430              : ! **************************************************************************************************
    2431              : !> \brief ...
    2432              : !> \param potential ...
    2433              : !> \param potential_section ...
    2434              : !> \param zval ...
    2435              : ! **************************************************************************************************
    2436         1448 :    SUBROUTINE init_atom_potential(potential, potential_section, zval)
    2437              :       TYPE(atom_potential_type), INTENT(INOUT)           :: potential
    2438              :       TYPE(section_vals_type), POINTER                   :: potential_section
    2439              :       INTEGER, INTENT(IN)                                :: zval
    2440              : 
    2441              :       CHARACTER(LEN=default_string_length)               :: pseudo_fn, pseudo_name
    2442              :       INTEGER                                            :: ic
    2443          724 :       REAL(dp), DIMENSION(:), POINTER                    :: convals
    2444              :       TYPE(section_vals_type), POINTER                   :: ecp_potential_section, &
    2445              :                                                             gth_potential_section
    2446              : 
    2447          724 :       IF (zval > 0) THEN
    2448          362 :          CALL section_vals_val_get(potential_section, "PSEUDO_TYPE", i_val=potential%ppot_type)
    2449              : 
    2450          454 :          SELECT CASE (potential%ppot_type)
    2451              :          CASE (gth_pseudo)
    2452           92 :             CALL section_vals_val_get(potential_section, "POTENTIAL_FILE_NAME", c_val=pseudo_fn)
    2453           92 :             CALL section_vals_val_get(potential_section, "POTENTIAL_NAME", c_val=pseudo_name)
    2454           92 :             gth_potential_section => section_vals_get_subs_vals(potential_section, "GTH_POTENTIAL")
    2455              :             CALL read_gth_potential(ptable(zval)%symbol, potential%gth_pot, &
    2456           92 :                                     pseudo_name, pseudo_fn, gth_potential_section)
    2457              :          CASE (ecp_pseudo)
    2458            6 :             CALL section_vals_val_get(potential_section, "POTENTIAL_FILE_NAME", c_val=pseudo_fn)
    2459            6 :             CALL section_vals_val_get(potential_section, "POTENTIAL_NAME", c_val=pseudo_name)
    2460            6 :             ecp_potential_section => section_vals_get_subs_vals(potential_section, "ECP")
    2461              :             CALL read_ecp_potential(ptable(zval)%symbol, potential%ecp_pot, &
    2462            6 :                                     pseudo_name, pseudo_fn, ecp_potential_section)
    2463              :          CASE (upf_pseudo)
    2464            4 :             CALL section_vals_val_get(potential_section, "POTENTIAL_FILE_NAME", c_val=pseudo_fn)
    2465            4 :             CALL section_vals_val_get(potential_section, "POTENTIAL_NAME", c_val=pseudo_name)
    2466            4 :             CALL atom_read_upf(potential%upf_pot, pseudo_fn)
    2467            4 :             potential%upf_pot%pname = pseudo_name
    2468              :          CASE (sgp_pseudo)
    2469            0 :             CPABORT("Pseudopotential type SGP is not implemented.")
    2470              :          CASE (no_pseudo)
    2471              :             ! do nothing
    2472              :          CASE DEFAULT
    2473          362 :             CPABORT("Invalid pseudopotential type selected. Check the code!")
    2474              :          END SELECT
    2475              :       ELSE
    2476          362 :          potential%ppot_type = no_pseudo
    2477              :       END IF
    2478              : 
    2479              :       ! confinement
    2480          724 :       NULLIFY (convals)
    2481          724 :       CALL section_vals_val_get(potential_section, "CONFINEMENT_TYPE", i_val=ic)
    2482          724 :       potential%conf_type = ic
    2483          724 :       IF (potential%conf_type == no_conf) THEN
    2484            0 :          potential%acon = 0.0_dp
    2485            0 :          potential%rcon = 4.0_dp
    2486            0 :          potential%scon = 2.0_dp
    2487            0 :          potential%confinement = .FALSE.
    2488          724 :       ELSE IF (potential%conf_type == poly_conf) THEN
    2489          700 :          CALL section_vals_val_get(potential_section, "CONFINEMENT", r_vals=convals)
    2490          700 :          IF (SIZE(convals) >= 1) THEN
    2491          700 :             IF (convals(1) > 0.0_dp) THEN
    2492           40 :                potential%confinement = .TRUE.
    2493           40 :                potential%acon = convals(1)
    2494           40 :                IF (SIZE(convals) >= 2) THEN
    2495           40 :                   potential%rcon = convals(2)
    2496              :                ELSE
    2497            0 :                   potential%rcon = 4.0_dp
    2498              :                END IF
    2499           40 :                IF (SIZE(convals) >= 3) THEN
    2500           40 :                   potential%scon = convals(3)
    2501              :                ELSE
    2502            0 :                   potential%scon = 2.0_dp
    2503              :                END IF
    2504              :             ELSE
    2505          660 :                potential%confinement = .FALSE.
    2506              :             END IF
    2507              :          ELSE
    2508            0 :             potential%confinement = .FALSE.
    2509              :          END IF
    2510           24 :       ELSE IF (potential%conf_type == barrier_conf) THEN
    2511           24 :          potential%acon = 200.0_dp
    2512           24 :          potential%rcon = 4.0_dp
    2513           24 :          potential%scon = 12.0_dp
    2514           24 :          potential%confinement = .TRUE.
    2515           24 :          CALL section_vals_val_get(potential_section, "CONFINEMENT", r_vals=convals)
    2516           24 :          IF (SIZE(convals) >= 1) THEN
    2517           24 :             IF (convals(1) > 0.0_dp) THEN
    2518           24 :                potential%acon = convals(1)
    2519           24 :                IF (SIZE(convals) >= 2) THEN
    2520           24 :                   potential%rcon = convals(2)
    2521              :                END IF
    2522           24 :                IF (SIZE(convals) >= 3) THEN
    2523           24 :                   potential%scon = convals(3)
    2524              :                END IF
    2525              :             ELSE
    2526            0 :                potential%confinement = .FALSE.
    2527              :             END IF
    2528              :          END IF
    2529              :       END IF
    2530              : 
    2531          724 :    END SUBROUTINE init_atom_potential
    2532              : ! **************************************************************************************************
    2533              : !> \brief ...
    2534              : !> \param potential ...
    2535              : ! **************************************************************************************************
    2536         9452 :    SUBROUTINE release_atom_potential(potential)
    2537              :       TYPE(atom_potential_type), INTENT(INOUT)           :: potential
    2538              : 
    2539         9452 :       potential%confinement = .FALSE.
    2540              : 
    2541         9452 :       CALL atom_release_upf(potential%upf_pot)
    2542              : 
    2543         9452 :    END SUBROUTINE release_atom_potential
    2544              : ! **************************************************************************************************
    2545              : !> \brief ...
    2546              : !> \param element_symbol ...
    2547              : !> \param potential ...
    2548              : !> \param pseudo_name ...
    2549              : !> \param pseudo_file ...
    2550              : !> \param potential_section ...
    2551              : ! **************************************************************************************************
    2552          184 :    SUBROUTINE read_gth_potential(element_symbol, potential, pseudo_name, pseudo_file, &
    2553              :                                  potential_section)
    2554              : 
    2555              :       CHARACTER(LEN=*), INTENT(IN)                       :: element_symbol
    2556              :       TYPE(atom_gthpot_type), INTENT(INOUT)              :: potential
    2557              :       CHARACTER(LEN=*), INTENT(IN)                       :: pseudo_name, pseudo_file
    2558              :       TYPE(section_vals_type), POINTER                   :: potential_section
    2559              : 
    2560              :       CHARACTER(LEN=240)                                 :: line
    2561              :       CHARACTER(LEN=242)                                 :: line2
    2562              :       CHARACTER(len=5*default_string_length)             :: line_att
    2563           92 :       CHARACTER(LEN=LEN(element_symbol))                 :: symbol
    2564           92 :       CHARACTER(LEN=LEN(element_symbol)+2)               :: symbol2
    2565           92 :       CHARACTER(LEN=LEN(pseudo_name))                    :: apname
    2566           92 :       CHARACTER(LEN=LEN(pseudo_name)+2)                  :: apname2
    2567              :       INTEGER                                            :: i, ic, ipot, j, l, nlmax, strlen1, &
    2568              :                                                             strlen2
    2569              :       INTEGER, DIMENSION(0:lmat)                         :: elec_conf
    2570              :       LOGICAL                                            :: found, is_ok, match, read_from_input
    2571              :       TYPE(cp_sll_val_type), POINTER                     :: list
    2572              :       TYPE(val_type), POINTER                            :: val
    2573              : 
    2574           92 :       elec_conf = 0
    2575              : 
    2576           92 :       apname = pseudo_name
    2577           92 :       symbol = element_symbol
    2578              : 
    2579           92 :       potential%symbol = symbol
    2580           92 :       potential%pname = apname
    2581          644 :       potential%econf = 0
    2582           92 :       potential%rc = 0._dp
    2583           92 :       potential%ncl = 0
    2584          552 :       potential%cl = 0._dp
    2585          644 :       potential%nl = 0
    2586          644 :       potential%rcnl = 0._dp
    2587        11684 :       potential%hnl = 0._dp
    2588           92 :       potential%soc = .FALSE.
    2589        11684 :       potential%knl = 0._dp
    2590              : 
    2591           92 :       potential%lpotextended = .FALSE.
    2592           92 :       potential%lsdpot = .FALSE.
    2593           92 :       potential%nlcc = .FALSE.
    2594           92 :       potential%nexp_lpot = 0
    2595           92 :       potential%nexp_lsd = 0
    2596           92 :       potential%nexp_nlcc = 0
    2597              : 
    2598              :       read_from_input = .FALSE.
    2599           92 :       CALL section_vals_get(potential_section, explicit=read_from_input)
    2600           92 :       IF (read_from_input) THEN
    2601           44 :          CALL section_vals_list_get(potential_section, "_DEFAULT_KEYWORD_", list=list)
    2602           44 :          CALL uppercase(symbol)
    2603           44 :          CALL uppercase(apname)
    2604              :          ! Read the electronic configuration, not used here
    2605           44 :          l = 0
    2606           44 :          is_ok = cp_sll_val_next(list, val)
    2607           44 :          CPASSERT(is_ok)
    2608           44 :          CALL val_get(val, c_val=line_att)
    2609           44 :          READ (line_att, *) elec_conf(l)
    2610           44 :          CALL remove_word(line_att)
    2611          138 :          DO WHILE (LEN_TRIM(line_att) /= 0)
    2612           94 :             l = l + 1
    2613           94 :             READ (line_att, *) elec_conf(l)
    2614           94 :             CALL remove_word(line_att)
    2615              :          END DO
    2616          308 :          potential%econf(0:lmat) = elec_conf(0:lmat)
    2617          308 :          potential%zion = REAL(SUM(elec_conf), dp)
    2618              :          ! Read r(loc) to define the exponent of the core charge
    2619           44 :          is_ok = cp_sll_val_next(list, val)
    2620           44 :          CPASSERT(is_ok)
    2621           44 :          CALL val_get(val, c_val=line_att)
    2622           44 :          READ (line_att, *) potential%rc
    2623           44 :          CALL remove_word(line_att)
    2624              :          ! Read the parameters for the local part of the GTH pseudopotential (ppl)
    2625           44 :          READ (line_att, *) potential%ncl
    2626           44 :          CALL remove_word(line_att)
    2627          126 :          DO i = 1, potential%ncl
    2628           82 :             READ (line_att, *) potential%cl(i)
    2629          126 :             CALL remove_word(line_att)
    2630              :          END DO
    2631              :          ! Check for the next entry: LPOT, NLCC, LSD, or ppnl
    2632              :          DO
    2633           54 :             is_ok = cp_sll_val_next(list, val)
    2634           54 :             CPASSERT(is_ok)
    2635           54 :             CALL val_get(val, c_val=line_att)
    2636           98 :             IF (INDEX(line_att, "LPOT") /= 0) THEN
    2637            0 :                potential%lpotextended = .TRUE.
    2638            0 :                CALL remove_word(line_att)
    2639            0 :                READ (line_att, *) potential%nexp_lpot
    2640            0 :                DO ipot = 1, potential%nexp_lpot
    2641            0 :                   is_ok = cp_sll_val_next(list, val)
    2642            0 :                   CPASSERT(is_ok)
    2643            0 :                   CALL val_get(val, c_val=line_att)
    2644            0 :                   READ (line_att, *) potential%alpha_lpot(ipot)
    2645            0 :                   CALL remove_word(line_att)
    2646            0 :                   READ (line_att, *) potential%nct_lpot(ipot)
    2647            0 :                   CALL remove_word(line_att)
    2648            0 :                   DO ic = 1, potential%nct_lpot(ipot)
    2649            0 :                      READ (line_att, *) potential%cval_lpot(ic, ipot)
    2650            0 :                      CALL remove_word(line_att)
    2651              :                   END DO
    2652              :                END DO
    2653           54 :             ELSE IF (INDEX(line_att, "NLCC") /= 0) THEN
    2654           10 :                potential%nlcc = .TRUE.
    2655           10 :                CALL remove_word(line_att)
    2656           10 :                READ (line_att, *) potential%nexp_nlcc
    2657           20 :                DO ipot = 1, potential%nexp_nlcc
    2658           10 :                   is_ok = cp_sll_val_next(list, val)
    2659           10 :                   CPASSERT(is_ok)
    2660           10 :                   CALL val_get(val, c_val=line_att)
    2661           10 :                   READ (line_att, *) potential%alpha_nlcc(ipot)
    2662           10 :                   CALL remove_word(line_att)
    2663           10 :                   READ (line_att, *) potential%nct_nlcc(ipot)
    2664           10 :                   CALL remove_word(line_att)
    2665           30 :                   DO ic = 1, potential%nct_nlcc(ipot)
    2666           10 :                      READ (line_att, *) potential%cval_nlcc(ic, ipot)
    2667              :                      !make cp2k compatible with bigdft
    2668           10 :                      potential%cval_nlcc(ic, ipot) = potential%cval_nlcc(ic, ipot)/(4.0_dp*pi)
    2669           20 :                      CALL remove_word(line_att)
    2670              :                   END DO
    2671              :                END DO
    2672           44 :             ELSE IF (INDEX(line_att, "LSD") /= 0) THEN
    2673            0 :                potential%lsdpot = .TRUE.
    2674            0 :                CALL remove_word(line_att)
    2675            0 :                READ (line_att, *) potential%nexp_lsd
    2676            0 :                DO ipot = 1, potential%nexp_lsd
    2677            0 :                   is_ok = cp_sll_val_next(list, val)
    2678            0 :                   CPASSERT(is_ok)
    2679            0 :                   CALL val_get(val, c_val=line_att)
    2680            0 :                   READ (line_att, *) potential%alpha_lsd(ipot)
    2681            0 :                   CALL remove_word(line_att)
    2682            0 :                   READ (line_att, *) potential%nct_lsd(ipot)
    2683            0 :                   CALL remove_word(line_att)
    2684            0 :                   DO ic = 1, potential%nct_lsd(ipot)
    2685            0 :                      READ (line_att, *) potential%cval_lsd(ic, ipot)
    2686            0 :                      CALL remove_word(line_att)
    2687              :                   END DO
    2688              :                END DO
    2689              :             ELSE
    2690              :                EXIT
    2691              :             END IF
    2692              :          END DO
    2693              :          ! Read the parameters for the non-local part of the GTH pseudopotential (ppnl)
    2694           44 :          READ (line_att, *) nlmax
    2695           44 :          CALL remove_word(line_att)
    2696           44 :          IF (INDEX(line_att, "SOC") /= 0) potential%soc = .TRUE.
    2697           44 :          IF (nlmax > 0) THEN
    2698              :             ! Load the parameter for nlmax non-local projectors
    2699          114 :             DO l = 0, nlmax - 1
    2700           72 :                is_ok = cp_sll_val_next(list, val)
    2701           72 :                CPASSERT(is_ok)
    2702           72 :                CALL val_get(val, c_val=line_att)
    2703           72 :                READ (line_att, *) potential%rcnl(l)
    2704           72 :                CALL remove_word(line_att)
    2705           72 :                READ (line_att, *) potential%nl(l)
    2706           72 :                CALL remove_word(line_att)
    2707          168 :                DO i = 1, potential%nl(l)
    2708           96 :                   IF (i == 1) THEN
    2709           68 :                      READ (line_att, *) potential%hnl(1, 1, l)
    2710           68 :                      CALL remove_word(line_att)
    2711              :                   ELSE
    2712           28 :                      CPASSERT(LEN_TRIM(line_att) == 0)
    2713           28 :                      is_ok = cp_sll_val_next(list, val)
    2714           28 :                      CPASSERT(is_ok)
    2715           28 :                      CALL val_get(val, c_val=line_att)
    2716           28 :                      READ (line_att, *) potential%hnl(i, i, l)
    2717           28 :                      CALL remove_word(line_att)
    2718              :                   END IF
    2719          200 :                   DO j = i + 1, potential%nl(l)
    2720           32 :                      READ (line_att, *) potential%hnl(i, j, l)
    2721           32 :                      potential%hnl(j, i, l) = potential%hnl(i, j, l)
    2722          128 :                      CALL remove_word(line_att)
    2723              :                   END DO
    2724              :                END DO
    2725           72 :                IF (potential%soc .AND. l /= 0) THEN
    2726            4 :                   is_ok = cp_sll_val_next(list, val)
    2727            4 :                   CPASSERT(is_ok)
    2728            4 :                   CALL val_get(val, c_val=line_att)
    2729           14 :                   DO i = 1, potential%nl(l)
    2730           10 :                      IF (i == 1) THEN
    2731            4 :                         READ (line_att, *) potential%knl(1, 1, l)
    2732            4 :                         CALL remove_word(line_att)
    2733              :                      ELSE
    2734            6 :                         CPASSERT(LEN_TRIM(line_att) == 0)
    2735            6 :                         is_ok = cp_sll_val_next(list, val)
    2736            6 :                         CPASSERT(is_ok)
    2737            6 :                         CALL val_get(val, c_val=line_att)
    2738            6 :                         READ (line_att, *) potential%knl(i, i, l)
    2739            6 :                         CALL remove_word(line_att)
    2740              :                      END IF
    2741           22 :                      DO j = i + 1, potential%nl(l)
    2742            8 :                         READ (line_att, *) potential%knl(i, j, l)
    2743            8 :                         potential%knl(j, i, l) = potential%knl(i, j, l)
    2744           18 :                         CALL remove_word(line_att)
    2745              :                      END DO
    2746              :                   END DO
    2747              :                END IF
    2748          114 :                CPASSERT(LEN_TRIM(line_att) == 0)
    2749              :             END DO
    2750              :          END IF
    2751              :       ELSE
    2752           48 :          BLOCK
    2753              :             TYPE(cp_parser_type)                      :: parser
    2754           48 :             CALL parser_create(parser, pseudo_file)
    2755              : 
    2756              :             search_loop: DO
    2757           62 :                CALL parser_search_string(parser, TRIM(apname), .TRUE., found, line)
    2758           62 :                IF (found) THEN
    2759           62 :                   CALL uppercase(symbol)
    2760           62 :                   CALL uppercase(apname)
    2761              :                   ! Check both the element symbol and the atomic potential name
    2762           62 :                   match = .FALSE.
    2763           62 :                   CALL uppercase(line)
    2764           62 :                   line2 = " "//line//" "
    2765           62 :                   symbol2 = " "//TRIM(symbol)//" "
    2766           62 :                   apname2 = " "//TRIM(apname)//" "
    2767           62 :                   strlen1 = LEN_TRIM(symbol2) + 1
    2768           62 :                   strlen2 = LEN_TRIM(apname2) + 1
    2769              : 
    2770           62 :                   IF ((INDEX(line2, symbol2(:strlen1)) > 0) .AND. &
    2771              :                       (INDEX(line2, apname2(:strlen2)) > 0)) match = .TRUE.
    2772              : 
    2773           48 :                   IF (match) THEN
    2774              :                      ! Read the electronic configuration
    2775           48 :                      l = 0
    2776           48 :                      CALL parser_get_object(parser, elec_conf(l), newline=.TRUE.)
    2777           72 :                      DO WHILE (parser_test_next_token(parser) == "INT")
    2778           24 :                         l = l + 1
    2779           24 :                         CALL parser_get_object(parser, elec_conf(l))
    2780              :                      END DO
    2781          336 :                      potential%econf(0:lmat) = elec_conf(0:lmat)
    2782          336 :                      potential%zion = REAL(SUM(elec_conf), dp)
    2783              :                      ! Read r(loc) to define the exponent of the core charge
    2784           48 :                      CALL parser_get_object(parser, potential%rc, newline=.TRUE.)
    2785              :                      ! Read the parameters for the local part of the GTH pseudopotential (ppl)
    2786           48 :                      CALL parser_get_object(parser, potential%ncl)
    2787          148 :                      DO i = 1, potential%ncl
    2788          148 :                         CALL parser_get_object(parser, potential%cl(i))
    2789              :                      END DO
    2790              :                      ! Extended type input
    2791              :                      DO
    2792           60 :                         CALL parser_get_next_line(parser, 1)
    2793           60 :                         IF (parser_test_next_token(parser) == "INT") THEN
    2794              :                            EXIT
    2795           72 :                         ELSE IF (parser_test_next_token(parser) == "STR") THEN
    2796           12 :                            CALL parser_get_object(parser, line)
    2797           12 :                            IF (INDEX(LINE, "LPOT") /= 0) THEN
    2798              :                               ! local potential
    2799           12 :                               potential%lpotextended = .TRUE.
    2800           12 :                               CALL parser_get_object(parser, potential%nexp_lpot)
    2801           32 :                               DO ipot = 1, potential%nexp_lpot
    2802           20 :                                  CALL parser_get_object(parser, potential%alpha_lpot(ipot), newline=.TRUE.)
    2803           20 :                                  CALL parser_get_object(parser, potential%nct_lpot(ipot))
    2804           76 :                                  DO ic = 1, potential%nct_lpot(ipot)
    2805           64 :                                     CALL parser_get_object(parser, potential%cval_lpot(ic, ipot))
    2806              :                                  END DO
    2807              :                               END DO
    2808            0 :                            ELSE IF (INDEX(LINE, "NLCC") /= 0) THEN
    2809              :                               ! NLCC
    2810            0 :                               potential%nlcc = .TRUE.
    2811            0 :                               CALL parser_get_object(parser, potential%nexp_nlcc)
    2812            0 :                               DO ipot = 1, potential%nexp_nlcc
    2813            0 :                                  CALL parser_get_object(parser, potential%alpha_nlcc(ipot), newline=.TRUE.)
    2814            0 :                                  CALL parser_get_object(parser, potential%nct_nlcc(ipot))
    2815            0 :                                  DO ic = 1, potential%nct_nlcc(ipot)
    2816            0 :                                     CALL parser_get_object(parser, potential%cval_nlcc(ic, ipot))
    2817              :                                     !make cp2k compatible with bigdft
    2818            0 :                                     potential%cval_nlcc(ic, ipot) = potential%cval_nlcc(ic, ipot)/(4.0_dp*pi)
    2819              :                                  END DO
    2820              :                               END DO
    2821            0 :                            ELSE IF (INDEX(LINE, "LSD") /= 0) THEN
    2822              :                               ! LSD potential
    2823            0 :                               potential%lsdpot = .TRUE.
    2824            0 :                               CALL parser_get_object(parser, potential%nexp_lsd)
    2825            0 :                               DO ipot = 1, potential%nexp_lsd
    2826            0 :                                  CALL parser_get_object(parser, potential%alpha_lsd(ipot), newline=.TRUE.)
    2827            0 :                                  CALL parser_get_object(parser, potential%nct_lsd(ipot))
    2828            0 :                                  DO ic = 1, potential%nct_lsd(ipot)
    2829            0 :                                     CALL parser_get_object(parser, potential%cval_lsd(ic, ipot))
    2830              :                                  END DO
    2831              :                               END DO
    2832              :                            ELSE
    2833            0 :                               CPABORT("Parsing of extended potential type failed.")
    2834              :                            END IF
    2835              :                         ELSE
    2836           12 :                            CPABORT("Invalid input token found.")
    2837              :                         END IF
    2838              :                      END DO
    2839              :                      ! Read the parameters for the non-local part of the GTH pseudopotential (ppnl)
    2840           48 :                      CALL parser_get_object(parser, nlmax)
    2841           48 :                      IF (nlmax > 0) THEN
    2842           24 :                         IF (parser_test_next_token(parser) == "STR") THEN
    2843            0 :                            CALL parser_get_object(parser, line)
    2844           24 :                            IF (INDEX(LINE, "SOC") /= 0) potential%soc = .TRUE.
    2845              :                         END IF
    2846              :                         ! Load the parameter for n non-local projectors
    2847           76 :                         DO l = 0, nlmax - 1
    2848           52 :                            CALL parser_get_object(parser, potential%rcnl(l), newline=.TRUE.)
    2849           52 :                            CALL parser_get_object(parser, potential%nl(l))
    2850          100 :                            DO i = 1, potential%nl(l)
    2851           48 :                               IF (i == 1) THEN
    2852           36 :                                  CALL parser_get_object(parser, potential%hnl(i, i, l))
    2853              :                               ELSE
    2854           12 :                                  CALL parser_get_object(parser, potential%hnl(i, i, l), newline=.TRUE.)
    2855              :                               END IF
    2856          112 :                               DO j = i + 1, potential%nl(l)
    2857           12 :                                  CALL parser_get_object(parser, potential%hnl(i, j, l))
    2858           60 :                                  potential%hnl(j, i, l) = potential%hnl(i, j, l)
    2859              :                               END DO
    2860              :                            END DO
    2861           76 :                            IF (potential%soc .AND. l /= 0) THEN
    2862            0 :                               DO i = 1, potential%nl(l)
    2863            0 :                                  CALL parser_get_object(parser, potential%knl(i, i, l), newline=.TRUE.)
    2864            0 :                                  DO j = i + 1, potential%nl(l)
    2865            0 :                                     CALL parser_get_object(parser, potential%knl(i, j, l))
    2866            0 :                                     potential%knl(j, i, l) = potential%knl(i, j, l)
    2867              :                                  END DO
    2868              :                               END DO
    2869              :                            END IF
    2870              :                         END DO
    2871              :                      END IF
    2872              :                      EXIT search_loop
    2873              :                   END IF
    2874              :                ELSE
    2875              :                   ! Stop program, if the end of file is reached
    2876            0 :                   CPABORT("End of file reached unexpectedly")
    2877              :                END IF
    2878              : 
    2879              :             END DO search_loop
    2880              : 
    2881          192 :             CALL parser_release(parser)
    2882              :          END BLOCK
    2883              :       END IF
    2884              : 
    2885           92 :    END SUBROUTINE read_gth_potential
    2886              : ! **************************************************************************************************
    2887              : !> \brief ...
    2888              : !> \param element_symbol ...
    2889              : !> \param potential ...
    2890              : !> \param pseudo_name ...
    2891              : !> \param pseudo_file ...
    2892              : !> \param potential_section ...
    2893              : ! **************************************************************************************************
    2894          102 :    SUBROUTINE read_ecp_potential(element_symbol, potential, pseudo_name, pseudo_file, &
    2895              :                                  potential_section)
    2896              : 
    2897              :       CHARACTER(LEN=*), INTENT(IN)                       :: element_symbol
    2898              :       TYPE(atom_ecppot_type), INTENT(INOUT)              :: potential
    2899              :       CHARACTER(LEN=*), INTENT(IN)                       :: pseudo_name, pseudo_file
    2900              :       TYPE(section_vals_type), POINTER                   :: potential_section
    2901              : 
    2902              :       CHARACTER(LEN=240)                                 :: line
    2903              :       CHARACTER(len=5*default_string_length)             :: line_att
    2904           34 :       CHARACTER(LEN=LEN(element_symbol)+1)               :: symbol
    2905           34 :       CHARACTER(LEN=LEN(pseudo_name))                    :: apname
    2906              :       INTEGER                                            :: i, ic, l, ncore, nel
    2907              :       LOGICAL                                            :: found, is_ok, read_from_input
    2908              :       TYPE(cp_sll_val_type), POINTER                     :: list
    2909              :       TYPE(val_type), POINTER                            :: val
    2910              : 
    2911           34 :       apname = pseudo_name
    2912           34 :       symbol = element_symbol
    2913           34 :       CALL get_ptable_info(symbol, number=ncore)
    2914              : 
    2915           34 :       potential%symbol = symbol
    2916           34 :       potential%pname = apname
    2917          238 :       potential%econf = 0
    2918           34 :       potential%zion = 0
    2919           34 :       potential%lmax = -1
    2920           34 :       potential%nloc = 0
    2921          544 :       potential%nrloc = 0
    2922          544 :       potential%aloc = 0.0_dp
    2923          544 :       potential%bloc = 0.0_dp
    2924          408 :       potential%npot = 0
    2925         6018 :       potential%nrpot = 0
    2926         6018 :       potential%apot = 0.0_dp
    2927         6018 :       potential%bpot = 0.0_dp
    2928              : 
    2929              :       read_from_input = .FALSE.
    2930           34 :       CALL section_vals_get(potential_section, explicit=read_from_input)
    2931           34 :       IF (read_from_input) THEN
    2932            2 :          CALL section_vals_list_get(potential_section, "_DEFAULT_KEYWORD_", list=list)
    2933              :          ! number of electrons (mandatory line)
    2934            2 :          is_ok = cp_sll_val_next(list, val)
    2935            2 :          CPASSERT(is_ok)
    2936            2 :          CALL val_get(val, c_val=line_att)
    2937            2 :          CALL remove_word(line_att)
    2938            2 :          CALL remove_word(line_att)
    2939              :          ! read number of electrons
    2940            2 :          READ (line_att, *) nel
    2941            2 :          potential%zion = REAL(ncore - nel, KIND=dp)
    2942              :          ! local potential (mandatory block)
    2943            2 :          is_ok = cp_sll_val_next(list, val)
    2944            2 :          CPASSERT(is_ok)
    2945            2 :          CALL val_get(val, c_val=line_att)
    2946            4 :          DO i = 1, 10
    2947            4 :             IF (.NOT. cp_sll_val_next(list, val)) EXIT
    2948            4 :             CALL val_get(val, c_val=line_att)
    2949            4 :             IF (INDEX(line_att, element_symbol) == 0) THEN
    2950            2 :                potential%nloc = potential%nloc + 1
    2951            2 :                ic = potential%nloc
    2952            2 :                READ (line_att, *) potential%nrloc(ic), potential%bloc(ic), potential%aloc(ic)
    2953              :             ELSE
    2954              :                EXIT
    2955              :             END IF
    2956              :          END DO
    2957              :          ! read potentials
    2958              :          DO
    2959           12 :             CALL val_get(val, c_val=line_att)
    2960           12 :             IF (INDEX(line_att, element_symbol) == 0) THEN
    2961            6 :                potential%npot(l) = potential%npot(l) + 1
    2962            6 :                ic = potential%npot(l)
    2963            6 :                READ (line_att, *) potential%nrpot(ic, l), potential%bpot(ic, l), potential%apot(ic, l)
    2964              :             ELSE
    2965            6 :                potential%lmax = potential%lmax + 1
    2966            6 :                l = potential%lmax
    2967              :             END IF
    2968           12 :             IF (.NOT. cp_sll_val_next(list, val)) EXIT
    2969              :          END DO
    2970              : 
    2971              :       ELSE
    2972           32 :          BLOCK
    2973              :             TYPE(cp_parser_type)                      :: parser
    2974           32 :             CALL parser_create(parser, pseudo_file)
    2975              : 
    2976            0 :             search_loop: DO
    2977           32 :                CALL parser_search_string(parser, TRIM(apname), .TRUE., found, line)
    2978           32 :                IF (found) THEN
    2979              :                   match_loop: DO
    2980         1140 :                      CALL parser_get_object(parser, line, newline=.TRUE.)
    2981         1140 :                      IF (TRIM(line) == element_symbol) THEN
    2982           32 :                         CALL parser_get_object(parser, line, lower_to_upper=.TRUE.)
    2983           32 :                         CPASSERT(TRIM(line) == "NELEC")
    2984              :                         ! read number of electrons
    2985           32 :                         CALL parser_get_object(parser, nel)
    2986           32 :                         potential%zion = REAL(ncore - nel, KIND=dp)
    2987              :                         ! read local potential flag line "<XX> ul"
    2988           32 :                         CALL parser_get_object(parser, line, newline=.TRUE.)
    2989              :                         ! read local potential
    2990          116 :                         DO i = 1, 15
    2991          116 :                            CALL parser_read_line(parser, 1)
    2992          116 :                            IF (parser_test_next_token(parser) == "STR") EXIT
    2993           84 :                            potential%nloc = potential%nloc + 1
    2994           84 :                            ic = potential%nloc
    2995           84 :                            CALL parser_get_object(parser, potential%nrloc(ic))
    2996           84 :                            CALL parser_get_object(parser, potential%bloc(ic))
    2997           84 :                            CALL parser_get_object(parser, potential%aloc(ic))
    2998              :                         END DO
    2999              :                         ! read potentials (start with l loop)
    3000          124 :                         DO l = 0, 15
    3001          124 :                            CALL parser_get_object(parser, symbol)
    3002          124 :                            IF (symbol == element_symbol) THEN
    3003              :                               ! new l block
    3004           92 :                               potential%lmax = potential%lmax + 1
    3005          360 :                               DO i = 1, 15
    3006          360 :                                  CALL parser_read_line(parser, 1)
    3007          360 :                                  IF (parser_test_next_token(parser) == "STR") EXIT
    3008          268 :                                  potential%npot(l) = potential%npot(l) + 1
    3009          268 :                                  ic = potential%npot(l)
    3010          268 :                                  CALL parser_get_object(parser, potential%nrpot(ic, l))
    3011          268 :                                  CALL parser_get_object(parser, potential%bpot(ic, l))
    3012          268 :                                  CALL parser_get_object(parser, potential%apot(ic, l))
    3013              :                               END DO
    3014              :                            ELSE
    3015              :                               EXIT
    3016              :                            END IF
    3017              :                         END DO
    3018              :                         EXIT search_loop
    3019         1108 :                      ELSE IF (line == "END") THEN
    3020            0 :                         CPABORT("Element not found in ECP library")
    3021              :                      END IF
    3022              :                   END DO match_loop
    3023              :                ELSE
    3024            0 :                   CPABORT("ECP type not found in library")
    3025              :                END IF
    3026              : 
    3027              :             END DO search_loop
    3028              : 
    3029          128 :             CALL parser_release(parser)
    3030              :          END BLOCK
    3031              :       END IF
    3032              : 
    3033              :       ! set up econf
    3034          170 :       potential%econf(0:3) = ptable(ncore)%e_conv(0:3)
    3035            0 :       SELECT CASE (nel)
    3036              :       CASE DEFAULT
    3037            0 :          CPABORT("Unknown Core State")
    3038              :       CASE (0)
    3039              :       CASE (2)
    3040           40 :          potential%econf(0:3) = potential%econf(0:3) - ptable(2)%e_conv(0:3)
    3041              :       CASE (10)
    3042           40 :          potential%econf(0:3) = potential%econf(0:3) - ptable(10)%e_conv(0:3)
    3043              :       CASE (18)
    3044            0 :          potential%econf(0:3) = potential%econf(0:3) - ptable(18)%e_conv(0:3)
    3045              :       CASE (28)
    3046           20 :          potential%econf(0:3) = potential%econf(0:3) - ptable(18)%e_conv(0:3)
    3047            4 :          potential%econf(2) = potential%econf(2) - 10
    3048              :       CASE (36)
    3049            0 :          potential%econf(0:3) = potential%econf(0:3) - ptable(36)%e_conv(0:3)
    3050              :       CASE (46)
    3051           20 :          potential%econf(0:3) = potential%econf(0:3) - ptable(36)%e_conv(0:3)
    3052            4 :          potential%econf(2) = potential%econf(2) - 10
    3053              :       CASE (54)
    3054            0 :          potential%econf(0:3) = potential%econf(0:3) - ptable(54)%e_conv(0:3)
    3055              :       CASE (60)
    3056            0 :          potential%econf(0:3) = potential%econf(0:3) - ptable(36)%e_conv(0:3)
    3057            0 :          potential%econf(2) = potential%econf(2) - 10
    3058            0 :          potential%econf(3) = potential%econf(3) - 14
    3059              :       CASE (68)
    3060            0 :          potential%econf(0:3) = potential%econf(0:3) - ptable(54)%e_conv(0:3)
    3061            0 :          potential%econf(3) = potential%econf(3) - 14
    3062              :       CASE (78)
    3063           30 :          potential%econf(0:3) = potential%econf(0:3) - ptable(54)%e_conv(0:3)
    3064            6 :          potential%econf(2) = potential%econf(2) - 10
    3065           40 :          potential%econf(3) = potential%econf(3) - 14
    3066              :       END SELECT
    3067              :       !
    3068          238 :       CPASSERT(ALL(potential%econf >= 0))
    3069              : 
    3070           34 :    END SUBROUTINE read_ecp_potential
    3071              : ! **************************************************************************************************
    3072              : !> \brief ...
    3073              : !> \param grid1 ...
    3074              : !> \param grid2 ...
    3075              : !> \return ...
    3076              : ! **************************************************************************************************
    3077            0 :    FUNCTION atom_compare_grids(grid1, grid2) RESULT(is_equal)
    3078              :       TYPE(grid_atom_type)                               :: grid1, grid2
    3079              :       LOGICAL                                            :: is_equal
    3080              : 
    3081              :       INTEGER                                            :: i
    3082              :       REAL(KIND=dp)                                      :: dr, dw
    3083              : 
    3084            0 :       is_equal = .TRUE.
    3085            0 :       IF (grid1%nr == grid2%nr) THEN
    3086            0 :          DO i = 1, grid2%nr
    3087            0 :             dr = ABS(grid1%rad(i) - grid2%rad(i))
    3088            0 :             dw = ABS(grid1%wr(i) - grid2%wr(i))
    3089            0 :             IF (dr + dw > 1.0e-12_dp) THEN
    3090              :                is_equal = .FALSE.
    3091              :                EXIT
    3092              :             END IF
    3093              :          END DO
    3094              :       ELSE
    3095              :          is_equal = .FALSE.
    3096              :       END IF
    3097              : 
    3098            0 :    END FUNCTION atom_compare_grids
    3099              : ! **************************************************************************************************
    3100              : 
    3101            0 : END MODULE atom_types
        

Generated by: LCOV version 2.0-1