LCOV - code coverage report
Current view: top level - src - atom_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:21ef868) Lines: 63.4 % 1767 1121
Test Date: 2026-08-14 07:04:57 Functions: 53.5 % 43 23

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

Generated by: LCOV version 2.0-1