LCOV - code coverage report
Current view: top level - src - atom_pseudo.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:2fce0f8) Lines: 213 217 98.2 %
Date: 2024-12-21 06:28:57 Functions: 1 1 100.0 %

          Line data    Source code
       1             : !--------------------------------------------------------------------------------------------------!
       2             : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3             : !   Copyright 2000-2024 CP2K developers group <https://cp2k.org>                                   !
       4             : !                                                                                                  !
       5             : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6             : !--------------------------------------------------------------------------------------------------!
       7             : 
       8             : ! **************************************************************************************************
       9             : MODULE atom_pseudo
      10             :    USE atom_electronic_structure,       ONLY: calculate_atom
      11             :    USE atom_fit,                        ONLY: atom_fit_pseudo
      12             :    USE atom_operators,                  ONLY: atom_int_release,&
      13             :                                               atom_int_setup,&
      14             :                                               atom_ppint_release,&
      15             :                                               atom_ppint_setup,&
      16             :                                               atom_relint_release,&
      17             :                                               atom_relint_setup
      18             :    USE atom_output,                     ONLY: atom_print_basis,&
      19             :                                               atom_print_info,&
      20             :                                               atom_print_method,&
      21             :                                               atom_print_potential
      22             :    USE atom_types,                      ONLY: &
      23             :         atom_basis_type, atom_integrals, atom_optimization_type, atom_orbitals, atom_p_type, &
      24             :         atom_potential_type, atom_state, create_atom_orbs, create_atom_type, init_atom_basis, &
      25             :         init_atom_potential, lmat, read_atom_opt_section, release_atom_basis, &
      26             :         release_atom_potential, release_atom_type, set_atom
      27             :    USE atom_utils,                      ONLY: atom_consistent_method,&
      28             :                                               atom_set_occupation,&
      29             :                                               get_maxl_occ,&
      30             :                                               get_maxn_occ
      31             :    USE cp_log_handling,                 ONLY: cp_get_default_logger,&
      32             :                                               cp_logger_type
      33             :    USE cp_output_handling,              ONLY: cp_print_key_finished_output,&
      34             :                                               cp_print_key_unit_nr
      35             :    USE input_constants,                 ONLY: do_analytic,&
      36             :                                               poly_conf
      37             :    USE input_section_types,             ONLY: section_vals_get,&
      38             :                                               section_vals_get_subs_vals,&
      39             :                                               section_vals_type,&
      40             :                                               section_vals_val_get
      41             :    USE kinds,                           ONLY: default_string_length,&
      42             :                                               dp
      43             :    USE periodic_table,                  ONLY: nelem,&
      44             :                                               ptable
      45             :    USE physcon,                         ONLY: bohr
      46             : #include "./base/base_uses.f90"
      47             : 
      48             :    IMPLICIT NONE
      49             :    PRIVATE
      50             :    PUBLIC  :: atom_pseudo_opt
      51             : 
      52             :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'atom_pseudo'
      53             : 
      54             : ! **************************************************************************************************
      55             : 
      56             : CONTAINS
      57             : 
      58             : ! **************************************************************************************************
      59             : 
      60             : ! **************************************************************************************************
      61             : !> \brief ...
      62             : !> \param atom_section ...
      63             : ! **************************************************************************************************
      64          26 :    SUBROUTINE atom_pseudo_opt(atom_section)
      65             :       TYPE(section_vals_type), POINTER                   :: atom_section
      66             : 
      67             :       CHARACTER(len=*), PARAMETER                        :: routineN = 'atom_pseudo_opt'
      68             : 
      69             :       CHARACTER(LEN=2)                                   :: elem
      70             :       CHARACTER(LEN=default_string_length), &
      71          26 :          DIMENSION(:), POINTER                           :: tmpstringlist
      72             :       INTEGER                                            :: ads, do_eric, do_erie, handle, i, im, &
      73             :                                                             in, iw, k, l, maxl, mb, method, mo, &
      74             :                                                             n_meth, n_rep, nr_gh, reltyp, zcore, &
      75             :                                                             zval, zz
      76             :       INTEGER, DIMENSION(0:lmat)                         :: maxn
      77          26 :       INTEGER, DIMENSION(:), POINTER                     :: cn
      78             :       LOGICAL                                            :: do_gh, eri_c, eri_e, pp_calc
      79             :       REAL(KIND=dp)                                      :: ne, nm
      80             :       REAL(KIND=dp), DIMENSION(0:lmat, 10)               :: pocc
      81             :       TYPE(atom_basis_type), POINTER                     :: ae_basis, pp_basis
      82             :       TYPE(atom_integrals), POINTER                      :: ae_int, pp_int
      83             :       TYPE(atom_optimization_type)                       :: optimization
      84             :       TYPE(atom_orbitals), POINTER                       :: orbitals
      85          26 :       TYPE(atom_p_type), DIMENSION(:, :), POINTER        :: atom_info, atom_refs
      86             :       TYPE(atom_potential_type), POINTER                 :: ae_pot, p_pot
      87             :       TYPE(atom_state), POINTER                          :: state, statepp
      88             :       TYPE(cp_logger_type), POINTER                      :: logger
      89             :       TYPE(section_vals_type), POINTER                   :: basis_section, method_section, &
      90             :                                                             opt_section, potential_section, &
      91             :                                                             powell_section, xc_section
      92             : 
      93          26 :       CALL timeset(routineN, handle)
      94             : 
      95             :       ! What atom do we calculate
      96          26 :       CALL section_vals_val_get(atom_section, "ATOMIC_NUMBER", i_val=zval)
      97          26 :       CALL section_vals_val_get(atom_section, "ELEMENT", c_val=elem)
      98          26 :       zz = 0
      99         140 :       DO i = 1, nelem
     100         140 :          IF (ptable(i)%symbol == elem) THEN
     101             :             zz = i
     102             :             EXIT
     103             :          END IF
     104             :       END DO
     105          26 :       IF (zz /= 1) zval = zz
     106             : 
     107             :       ! read and set up information on the basis sets
     108         962 :       ALLOCATE (ae_basis, pp_basis)
     109          26 :       basis_section => section_vals_get_subs_vals(atom_section, "AE_BASIS")
     110          26 :       NULLIFY (ae_basis%grid)
     111          26 :       CALL init_atom_basis(ae_basis, basis_section, zval, "AA")
     112          26 :       NULLIFY (pp_basis%grid)
     113          26 :       basis_section => section_vals_get_subs_vals(atom_section, "PP_BASIS")
     114          26 :       CALL init_atom_basis(pp_basis, basis_section, zval, "AP")
     115             : 
     116             :       ! print general and basis set information
     117          26 :       logger => cp_get_default_logger()
     118          26 :       iw = cp_print_key_unit_nr(logger, atom_section, "PRINT%PROGRAM_BANNER", extension=".log")
     119          26 :       IF (iw > 0) CALL atom_print_info(zval, "Atomic Energy Calculation", iw)
     120          26 :       CALL cp_print_key_finished_output(iw, logger, atom_section, "PRINT%PROGRAM_BANNER")
     121          26 :       iw = cp_print_key_unit_nr(logger, atom_section, "PRINT%BASIS_SET", extension=".log")
     122          26 :       IF (iw > 0) THEN
     123           8 :          CALL atom_print_basis(ae_basis, iw, " All Electron Basis")
     124           8 :          CALL atom_print_basis(pp_basis, iw, " Pseudopotential Basis")
     125             :       END IF
     126          26 :       CALL cp_print_key_finished_output(iw, logger, atom_section, "PRINT%BASIS_SET")
     127             : 
     128             :       ! read and setup information on the pseudopotential
     129          26 :       NULLIFY (potential_section)
     130          26 :       potential_section => section_vals_get_subs_vals(atom_section, "POTENTIAL")
     131      273130 :       ALLOCATE (ae_pot, p_pot)
     132          26 :       CALL init_atom_potential(p_pot, potential_section, zval)
     133          26 :       CALL init_atom_potential(ae_pot, potential_section, -1)
     134          26 :       IF (.NOT. p_pot%confinement .AND. .NOT. ae_pot%confinement) THEN
     135             :          !set default confinement potential
     136          24 :          p_pot%confinement = .TRUE.
     137          24 :          p_pot%conf_type = poly_conf
     138          24 :          p_pot%scon = 2.0_dp
     139          24 :          p_pot%acon = 0.5_dp
     140             :          ! this seems to be the default in the old code
     141          24 :          p_pot%rcon = (2._dp*ptable(zval)%covalent_radius*bohr)**2
     142          24 :          ae_pot%confinement = .TRUE.
     143          24 :          ae_pot%conf_type = poly_conf
     144          24 :          ae_pot%scon = 2.0_dp
     145          24 :          ae_pot%acon = 0.5_dp
     146             :          ! this seems to be the default in the old code
     147          24 :          ae_pot%rcon = (2._dp*ptable(zval)%covalent_radius*bohr)**2
     148             :       END IF
     149             : 
     150             :       ! if the ERI's are calculated analytically, we have to precalculate them
     151          26 :       eri_c = .FALSE.
     152          26 :       CALL section_vals_val_get(atom_section, "COULOMB_INTEGRALS", i_val=do_eric)
     153          26 :       IF (do_eric == do_analytic) eri_c = .TRUE.
     154          26 :       eri_e = .FALSE.
     155          26 :       CALL section_vals_val_get(atom_section, "EXCHANGE_INTEGRALS", i_val=do_erie)
     156          26 :       IF (do_erie == do_analytic) eri_e = .TRUE.
     157          26 :       CALL section_vals_val_get(atom_section, "USE_GAUSS_HERMITE", l_val=do_gh)
     158          26 :       CALL section_vals_val_get(atom_section, "GRID_POINTS_GH", i_val=nr_gh)
     159             : 
     160             :       ! information on the states to be calculated
     161          26 :       CALL section_vals_val_get(atom_section, "MAX_ANGULAR_MOMENTUM", i_val=maxl)
     162          26 :       maxn = 0
     163          26 :       CALL section_vals_val_get(atom_section, "CALCULATE_STATES", i_vals=cn)
     164          52 :       DO in = 1, MIN(SIZE(cn), 4)
     165          52 :          maxn(in - 1) = cn(in)
     166             :       END DO
     167         182 :       DO in = 0, lmat
     168         182 :          maxn(in) = MIN(maxn(in), ae_basis%nbas(in))
     169             :       END DO
     170             : 
     171             :       ! read optimization section
     172          26 :       opt_section => section_vals_get_subs_vals(atom_section, "OPTIMIZATION")
     173          26 :       CALL read_atom_opt_section(optimization, opt_section)
     174             : 
     175             :       ! Check for the total number of electron configurations to be calculated
     176          26 :       CALL section_vals_val_get(atom_section, "ELECTRON_CONFIGURATION", n_rep_val=n_rep)
     177             :       ! Check for the total number of method types to be calculated
     178          26 :       method_section => section_vals_get_subs_vals(atom_section, "METHOD")
     179          26 :       CALL section_vals_get(method_section, n_repetition=n_meth)
     180             : 
     181             :       ! integrals
     182       11050 :       ALLOCATE (ae_int, pp_int)
     183             : 
     184         260 :       ALLOCATE (atom_info(n_rep, n_meth), atom_refs(n_rep, n_meth))
     185             : 
     186          26 :       iw = cp_print_key_unit_nr(logger, atom_section, "PRINT%PROGRAM_BANNER", extension=".log")
     187          26 :       IF (iw > 0) THEN
     188          13 :          WRITE (iw, '(/," ",79("*"))')
     189          13 :          WRITE (iw, '(" ",26("*"),A,25("*"))') " Calculate Reference States "
     190          13 :          WRITE (iw, '(" ",79("*"))')
     191             :       END IF
     192          26 :       CALL cp_print_key_finished_output(iw, logger, atom_section, "PRINT%PROGRAM_BANNER")
     193             : 
     194          52 :       DO in = 1, n_rep
     195          78 :          DO im = 1, n_meth
     196             : 
     197          26 :             NULLIFY (atom_info(in, im)%atom, atom_refs(in, im)%atom)
     198          26 :             CALL create_atom_type(atom_info(in, im)%atom)
     199          26 :             CALL create_atom_type(atom_refs(in, im)%atom)
     200             : 
     201          26 :             atom_info(in, im)%atom%optimization = optimization
     202          26 :             atom_refs(in, im)%atom%optimization = optimization
     203             : 
     204          26 :             atom_info(in, im)%atom%z = zval
     205          26 :             atom_refs(in, im)%atom%z = zval
     206          26 :             xc_section => section_vals_get_subs_vals(method_section, "XC", i_rep_section=im)
     207          26 :             atom_info(in, im)%atom%xc_section => xc_section
     208          26 :             atom_refs(in, im)%atom%xc_section => xc_section
     209             : 
     210       18850 :             ALLOCATE (state, statepp)
     211             : 
     212             :             ! get the electronic configuration
     213             :             CALL section_vals_val_get(atom_section, "ELECTRON_CONFIGURATION", i_rep_val=in, &
     214          26 :                                       c_vals=tmpstringlist)
     215             :             ! all electron configurations have to be with full core
     216          26 :             pp_calc = INDEX(tmpstringlist(1), "CORE") /= 0
     217          26 :             CPASSERT(.NOT. pp_calc)
     218             : 
     219             :             ! set occupations
     220          26 :             CALL atom_set_occupation(tmpstringlist, state%occ, state%occupation, state%multiplicity)
     221          26 :             state%maxl_occ = get_maxl_occ(state%occ)
     222         182 :             state%maxn_occ = get_maxn_occ(state%occ)
     223             :             ! set number of states to be calculated
     224          26 :             state%maxl_calc = MAX(maxl, state%maxl_occ)
     225          26 :             state%maxl_calc = MIN(lmat, state%maxl_calc)
     226         182 :             state%maxn_calc = 0
     227          96 :             DO k = 0, state%maxl_calc
     228          70 :                ads = 2
     229          70 :                IF (state%maxn_occ(k) == 0) ads = 1
     230          70 :                state%maxn_calc(k) = MAX(maxn(k), state%maxn_occ(k) + ads)
     231          96 :                state%maxn_calc(k) = MIN(state%maxn_calc(k), ae_basis%nbas(k))
     232             :             END DO
     233        1846 :             state%core = 0._dp
     234          26 :             CALL set_atom(atom_refs(in, im)%atom, zcore=zval, pp_calc=.FALSE.)
     235             : 
     236          26 :             IF (state%multiplicity /= -1) THEN
     237             :                ! set alpha and beta occupations
     238         142 :                state%occa = 0._dp
     239         142 :                state%occb = 0._dp
     240          14 :                DO l = 0, lmat
     241          12 :                   nm = REAL((2*l + 1), KIND=dp)
     242          20 :                   DO k = 1, 10
     243          18 :                      ne = state%occupation(l, k)
     244          18 :                      IF (ne == 0._dp) THEN !empty shell
     245             :                         EXIT !assume there are no holes
     246           6 :                      ELSEIF (ne == 2._dp*nm) THEN !closed shell
     247           4 :                         state%occa(l, k) = nm
     248           4 :                         state%occb(l, k) = nm
     249           2 :                      ELSEIF (state%multiplicity == -2) THEN !High spin case
     250           0 :                         state%occa(l, k) = MIN(ne, nm)
     251           0 :                         state%occb(l, k) = MAX(0._dp, ne - nm)
     252             :                      ELSE
     253           2 :                         state%occa(l, k) = 0.5_dp*(ne + state%multiplicity - 1._dp)
     254           2 :                         state%occb(l, k) = ne - state%occa(l, k)
     255             :                      END IF
     256             :                   END DO
     257             :                END DO
     258             :             END IF
     259             : 
     260             :             ! set occupations for pseudopotential calculation
     261          26 :             CALL section_vals_val_get(atom_section, "CORE", c_vals=tmpstringlist)
     262          26 :             CALL atom_set_occupation(tmpstringlist, statepp%core, pocc)
     263        1846 :             zcore = zval - NINT(SUM(statepp%core))
     264          26 :             CALL set_atom(atom_info(in, im)%atom, zcore=zcore, pp_calc=.TRUE.)
     265             : 
     266        3666 :             statepp%occ = state%occ - statepp%core
     267        1846 :             statepp%occupation = 0._dp
     268         182 :             DO l = 0, lmat
     269             :                k = 0
     270        1742 :                DO i = 1, 10
     271        1716 :                   IF (statepp%occ(l, i) /= 0._dp) THEN
     272          46 :                      k = k + 1
     273          46 :                      statepp%occupation(l, k) = state%occ(l, i)
     274          46 :                      IF (state%multiplicity /= -1) THEN
     275           4 :                         statepp%occa(l, k) = state%occa(l, i) - statepp%core(l, i)/2
     276           4 :                         statepp%occb(l, k) = state%occb(l, i) - statepp%core(l, i)/2
     277             :                      END IF
     278             :                   END IF
     279             :                END DO
     280             :             END DO
     281             : 
     282          26 :             statepp%maxl_occ = get_maxl_occ(statepp%occ)
     283         182 :             statepp%maxn_occ = get_maxn_occ(statepp%occ)
     284          26 :             statepp%maxl_calc = state%maxl_calc
     285         182 :             statepp%maxn_calc = 0
     286          26 :             maxn = get_maxn_occ(statepp%core)
     287          96 :             DO k = 0, statepp%maxl_calc
     288          70 :                statepp%maxn_calc(k) = state%maxn_calc(k) - maxn(k)
     289          96 :                statepp%maxn_calc(k) = MIN(statepp%maxn_calc(k), pp_basis%nbas(k))
     290             :             END DO
     291          26 :             statepp%multiplicity = state%multiplicity
     292             : 
     293          26 :             CALL section_vals_val_get(method_section, "METHOD_TYPE", i_val=method, i_rep_section=im)
     294          26 :             CALL section_vals_val_get(method_section, "RELATIVISTIC", i_val=reltyp, i_rep_section=im)
     295          26 :             CALL set_atom(atom_info(in, im)%atom, method_type=method)
     296          26 :             CALL set_atom(atom_refs(in, im)%atom, method_type=method, relativistic=reltyp)
     297             : 
     298             :             ! calculate integrals: pseudopotential basis
     299             :             ! general integrals
     300          26 :             CALL atom_int_setup(pp_int, pp_basis, potential=p_pot, eri_coulomb=eri_c, eri_exchange=eri_e)
     301             :             !
     302          26 :             NULLIFY (pp_int%tzora, pp_int%hdkh)
     303             :             ! potential
     304          26 :             CALL atom_ppint_setup(pp_int, pp_basis, potential=p_pot)
     305             :             !
     306          26 :             CALL set_atom(atom_info(in, im)%atom, basis=pp_basis, integrals=pp_int, potential=p_pot)
     307         338 :             statepp%maxn_calc(:) = MIN(statepp%maxn_calc(:), pp_basis%nbas(:))
     308         182 :             CPASSERT(ALL(state%maxn_calc(:) >= state%maxn_occ))
     309             : 
     310             :             ! calculate integrals: all electron basis
     311             :             ! general integrals
     312             :             CALL atom_int_setup(ae_int, ae_basis, potential=ae_pot, &
     313          26 :                                 eri_coulomb=eri_c, eri_exchange=eri_e)
     314             :             ! potential
     315          26 :             CALL atom_ppint_setup(ae_int, ae_basis, potential=ae_pot)
     316             :             ! relativistic correction terms
     317          26 :             CALL atom_relint_setup(ae_int, ae_basis, reltyp, zcore=REAL(zval, dp))
     318             :             !
     319          26 :             CALL set_atom(atom_refs(in, im)%atom, basis=ae_basis, integrals=ae_int, potential=ae_pot)
     320         338 :             state%maxn_calc(:) = MIN(state%maxn_calc(:), ae_basis%nbas(:))
     321         182 :             CPASSERT(ALL(state%maxn_calc(:) >= state%maxn_occ))
     322             : 
     323             :             CALL set_atom(atom_info(in, im)%atom, coulomb_integral_type=do_eric, &
     324          26 :                           exchange_integral_type=do_erie)
     325             :             CALL set_atom(atom_refs(in, im)%atom, coulomb_integral_type=do_eric, &
     326          26 :                           exchange_integral_type=do_erie)
     327          26 :             atom_info(in, im)%atom%hfx_pot%do_gh = do_gh
     328          26 :             atom_info(in, im)%atom%hfx_pot%nr_gh = nr_gh
     329          26 :             atom_refs(in, im)%atom%hfx_pot%do_gh = do_gh
     330          26 :             atom_refs(in, im)%atom%hfx_pot%nr_gh = nr_gh
     331             : 
     332          26 :             CALL set_atom(atom_info(in, im)%atom, state=statepp)
     333          26 :             NULLIFY (orbitals)
     334         182 :             mo = MAXVAL(statepp%maxn_calc)
     335         182 :             mb = MAXVAL(atom_info(in, im)%atom%basis%nbas)
     336          26 :             CALL create_atom_orbs(orbitals, mb, mo)
     337          26 :             CALL set_atom(atom_info(in, im)%atom, orbitals=orbitals)
     338             : 
     339          26 :             CALL set_atom(atom_refs(in, im)%atom, state=state)
     340          26 :             NULLIFY (orbitals)
     341         182 :             mo = MAXVAL(state%maxn_calc)
     342         182 :             mb = MAXVAL(atom_refs(in, im)%atom%basis%nbas)
     343          26 :             CALL create_atom_orbs(orbitals, mb, mo)
     344          26 :             CALL set_atom(atom_refs(in, im)%atom, orbitals=orbitals)
     345             : 
     346          78 :             IF (atom_consistent_method(atom_refs(in, im)%atom%method_type, atom_refs(in, im)%atom%state%multiplicity)) THEN
     347             :                !Print method info
     348          26 :                iw = cp_print_key_unit_nr(logger, atom_section, "PRINT%METHOD_INFO", extension=".log")
     349          26 :                CALL atom_print_method(atom_refs(in, im)%atom, iw)
     350          26 :                CALL cp_print_key_finished_output(iw, logger, atom_section, "PRINT%METHOD_INFO")
     351             :                !Calculate the electronic structure
     352          26 :                iw = cp_print_key_unit_nr(logger, atom_section, "PRINT%SCF_INFO", extension=".log")
     353          26 :                CALL calculate_atom(atom_refs(in, im)%atom, iw)
     354          26 :                CALL cp_print_key_finished_output(iw, logger, atom_section, "PRINT%SCF_INFO")
     355             :             END IF
     356             :          END DO
     357             :       END DO
     358             : 
     359          26 :       iw = cp_print_key_unit_nr(logger, atom_section, "PRINT%FIT_PSEUDO", extension=".log")
     360          26 :       IF (iw > 0) THEN
     361          13 :          WRITE (iw, '(/," ",79("*"))')
     362          13 :          WRITE (iw, '(" ",21("*"),A,21("*"))') " Optimize Pseudopotential Parameters "
     363          13 :          WRITE (iw, '(" ",79("*"))')
     364             :       END IF
     365          26 :       CALL cp_print_key_finished_output(iw, logger, atom_section, "PRINT%FIT_PSEUDO")
     366          26 :       iw = cp_print_key_unit_nr(logger, atom_section, "PRINT%POTENTIAL", extension=".log")
     367          26 :       IF (iw > 0) THEN
     368           0 :          CALL atom_print_potential(p_pot, iw)
     369             :       END IF
     370          26 :       CALL cp_print_key_finished_output(iw, logger, atom_section, "PRINT%POTENTIAL")
     371          26 :       iw = cp_print_key_unit_nr(logger, atom_section, "PRINT%FIT_PSEUDO", extension=".log")
     372          26 :       IF (iw > 0) THEN
     373          13 :          powell_section => section_vals_get_subs_vals(atom_section, "POWELL")
     374          13 :          CALL atom_fit_pseudo(atom_info, atom_refs, p_pot, iw, powell_section)
     375             :       END IF
     376          26 :       CALL cp_print_key_finished_output(iw, logger, atom_section, "PRINT%FIT_PSEUDO")
     377          26 :       iw = cp_print_key_unit_nr(logger, atom_section, "PRINT%POTENTIAL", extension=".log")
     378          26 :       IF (iw > 0) THEN
     379           0 :          CALL atom_print_potential(p_pot, iw)
     380             :       END IF
     381          26 :       CALL cp_print_key_finished_output(iw, logger, atom_section, "PRINT%POTENTIAL")
     382             : 
     383             :       ! clean up
     384          26 :       CALL atom_int_release(ae_int)
     385          26 :       CALL atom_ppint_release(ae_int)
     386          26 :       CALL atom_relint_release(ae_int)
     387             : 
     388          26 :       CALL atom_int_release(pp_int)
     389          26 :       CALL atom_ppint_release(pp_int)
     390          26 :       CALL atom_relint_release(pp_int)
     391             : 
     392          26 :       CALL release_atom_basis(ae_basis)
     393          26 :       CALL release_atom_basis(pp_basis)
     394             : 
     395          26 :       CALL release_atom_potential(p_pot)
     396          26 :       CALL release_atom_potential(ae_pot)
     397             : 
     398          52 :       DO in = 1, n_rep
     399          78 :          DO im = 1, n_meth
     400          26 :             CALL release_atom_type(atom_info(in, im)%atom)
     401          52 :             CALL release_atom_type(atom_refs(in, im)%atom)
     402             :          END DO
     403             :       END DO
     404          26 :       DEALLOCATE (atom_info, atom_refs)
     405             : 
     406          26 :       DEALLOCATE (ae_pot, p_pot, ae_basis, pp_basis, ae_int, pp_int)
     407             : 
     408          26 :       CALL timestop(handle)
     409             : 
     410         156 :    END SUBROUTINE atom_pseudo_opt
     411             : 
     412             : ! **************************************************************************************************
     413             : 
     414             : END MODULE atom_pseudo

Generated by: LCOV version 1.15