Activate handling of GTH-SOC PP in Sirius (#4363)

Enable SOC in Sirius calculations using GTH PP format.
Updates Atom code conversion of GTH SOC enabled PP to UPF format.
Basic tests pass, but extended testing and cross validation still needed.
This commit is contained in:
Juerg Hutter 2025-08-14 15:46:53 +02:00 committed by GitHub
parent f74290cd64
commit d69078cdc6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 363 additions and 29 deletions

View file

@ -612,10 +612,10 @@ CONTAINS
INTEGER, INTENT(IN) :: iw
CHARACTER(LEN=default_string_length) :: string
INTEGER :: i, ibeta, j, k, l, lmax, nbeta, nr, &
nwfc, nwfn
LOGICAL :: up
REAL(KIND=dp) :: pf, rl, rmax
INTEGER :: i, ibeta, ii, j, k, kk, l, lmax, n0, &
nbeta, nr, nwfc, nwfn
LOGICAL :: soc, up
REAL(KIND=dp) :: pf, rl, rlp, rmax, vnlm, vnlp
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: beta, corden, dens, ef, locpot, rp
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: dij
TYPE(atom_gthpot_type), POINTER :: pot
@ -624,6 +624,7 @@ CONTAINS
IF (atom%potential%ppot_type /= gth_pseudo) RETURN
pot => atom%potential%gth_pot
CPASSERT(.NOT. pot%lsdpot)
soc = pot%soc
WRITE (iw, '(A)') '<UPF version="2.0.1">'
@ -645,7 +646,11 @@ CONTAINS
WRITE (iw, '(T8,A)') 'is_ultrasoft="F"'
WRITE (iw, '(T8,A)') 'is_paw="F"'
WRITE (iw, '(T8,A)') 'is_coulomb="F"'
WRITE (iw, '(T8,A)') 'has_so="F"'
IF (soc) THEN
WRITE (iw, '(T8,A)') 'has_so="T"'
ELSE
WRITE (iw, '(T8,A)') 'has_so="F"'
END IF
WRITE (iw, '(T8,A)') 'has_wfc="F"'
WRITE (iw, '(T8,A)') 'has_gipaw="F"'
WRITE (iw, '(T8,A)') 'paw_as_gipaw="F"'
@ -675,7 +680,11 @@ CONTAINS
nwfc = SUM(atom%state%maxn_occ)
CALL compose(string, "number_of_wfc", ival=nwfc)
WRITE (iw, '(T8,A)') TRIM(string)
nbeta = SUM(pot%nl)
IF (soc) THEN
nbeta = pot%nl(0) + 2*SUM(pot%nl(1:))
ELSE
nbeta = SUM(pot%nl)
END IF
CALL compose(string, "number_of_proj", ival=nbeta)
WRITE (iw, '(T8,A)') TRIM(string)//'/>'
@ -760,6 +769,8 @@ CONTAINS
j = l + 2*i - 1
pf = SQRT(2._dp)/(pf*SQRT(gamma1(j)))
beta(:) = pf*rp**(l + 2*i - 2)*ef
beta(:) = beta*rp
!
ibeta = ibeta + 1
CALL compose(string, "<PP_BETA", counter=ibeta)
WRITE (iw, '(T8,A)') TRIM(string)
@ -769,7 +780,6 @@ CONTAINS
CALL compose(string, "size", ival=nr)
WRITE (iw, '(T12,A)') TRIM(string)
WRITE (iw, '(T12,A)') 'columns="4">'
beta(:) = beta*rp
IF (up) THEN
WRITE (iw, '(T12,4ES25.12E3)') (2._dp*beta(j), j=1, nr)
ELSE
@ -777,18 +787,60 @@ CONTAINS
END IF
CALL compose(string, "</PP_BETA", counter=ibeta, isfinal=.TRUE.)
WRITE (iw, '(T8,A)') TRIM(string)
IF (soc .AND. l /= 0) THEN
ibeta = ibeta + 1
CALL compose(string, "<PP_BETA", counter=ibeta)
WRITE (iw, '(T8,A)') TRIM(string)
CALL compose(string, "angular_momentum", ival=l)
WRITE (iw, '(T12,A)') TRIM(string)
WRITE (iw, '(T12,A)') 'type="real"'
CALL compose(string, "size", ival=nr)
WRITE (iw, '(T12,A)') TRIM(string)
WRITE (iw, '(T12,A)') 'columns="4">'
IF (up) THEN
WRITE (iw, '(T12,4ES25.12E3)') (2._dp*beta(j), j=1, nr)
ELSE
WRITE (iw, '(T12,4ES25.12E3)') (2._dp*beta(j), j=nr, 1, -1)
END IF
CALL compose(string, "</PP_BETA", counter=ibeta, isfinal=.TRUE.)
WRITE (iw, '(T8,A)') TRIM(string)
END IF
END DO
END DO
DEALLOCATE (rp, ef, beta)
! nonlocal PP matrix elements
ALLOCATE (dij(nbeta, nbeta))
dij = 0._dp
DO l = 0, lmat
IF (pot%nl(l) == 0) CYCLE
ibeta = SUM(pot%nl(0:l - 1)) + 1
i = ibeta + pot%nl(l) - 1
dij(ibeta:i, ibeta:i) = pot%hnl(1:pot%nl(l), 1:pot%nl(l), l)
END DO
IF (soc) THEN
! from reverse engineering we guess: hnl, knl, hnl, knl, ...
n0 = pot%nl(0)
DO l = 0, lmat
IF (pot%nl(l) == 0) CYCLE
IF (l == 0) THEN
! no SO term for l=0
dij(1:n0, 1:n0) = pot%hnl(1:n0, 1:n0, 0)
ELSE
ibeta = n0 + 2*SUM(pot%nl(1:l - 1))
DO i = 1, pot%nl(l)
ii = 2*(i - 1) + 1
DO k = 1, pot%nl(l)
kk = 2*(k - 1) + 1
vnlp = pot%hnl(i, k, l) + 0.5_dp*l*pot%knl(i, k, l)
vnlm = pot%hnl(i, k, l) - 0.5_dp*(l + 1)*pot%knl(i, k, l)
dij(ibeta + ii, ibeta + kk) = vnlm
dij(ibeta + ii + 1, ibeta + kk + 1) = vnlp
END DO
END DO
END IF
END DO
ELSE
DO l = 0, lmat
IF (pot%nl(l) == 0) CYCLE
ibeta = SUM(pot%nl(0:l - 1)) + 1
i = ibeta + pot%nl(l) - 1
dij(ibeta:i, ibeta:i) = pot%hnl(1:pot%nl(l), 1:pot%nl(l), l)
END DO
END IF
WRITE (iw, '(T8,A)') '<PP_DIJ type="real"'
WRITE (iw, '(T12,A)') 'columns="4">'
WRITE (iw, '(T12,4ES25.12E3)') ((0.5_dp*dij(i, j), j=1, nbeta), i=1, nbeta)
@ -846,6 +898,48 @@ CONTAINS
WRITE (iw, '(T4,A)') '</PP_RHOATOM>'
DEALLOCATE (dens)
! PP SOC information
IF (soc) THEN
WRITE (iw, '(T4,A)') '<PP_SPIN_ORB>'
! RELWFC not available
! <PP_RELWFC.1 index="1" els="6S" nn="1" lchi="0" jchi="5.000000000000e-1" oc="1.000000000000e0"/>
ibeta = 0
DO l = 0, lmat
IF (pot%nl(l) == 0) CYCLE
DO i = 1, pot%nl(l)
ibeta = ibeta + 1
CALL compose(string, "<PP_RELBETA", counter=ibeta)
WRITE (iw, '(T8,A)') TRIM(string)
CALL compose(string, "index", ival=ibeta)
WRITE (iw, '(T12,A)') TRIM(string)
CALL compose(string, "lll", ival=l)
WRITE (iw, '(T12,A)') TRIM(string)
IF (l == 0) THEN
rlp = 0.5_dp
ELSE
rlp = l - 0.5_dp
END IF
CALL compose(string, "jjj", rval=rlp)
WRITE (iw, '(T12,A)') TRIM(string)
WRITE (iw, '(T12,A)') '/>'
IF (l > 0) THEN
ibeta = ibeta + 1
CALL compose(string, "<PP_RELBETA", counter=ibeta)
WRITE (iw, '(T8,A)') TRIM(string)
CALL compose(string, "index", ival=ibeta)
WRITE (iw, '(T12,A)') TRIM(string)
CALL compose(string, "lll", ival=l)
WRITE (iw, '(T12,A)') TRIM(string)
rlp = l + 0.5_dp
CALL compose(string, "jjj", rval=rlp)
WRITE (iw, '(T12,A)') TRIM(string)
WRITE (iw, '(T12,A)') '/>'
END IF
END DO
END DO
WRITE (iw, '(T4,A)') '</PP_SPIN_ORB>'
END IF
WRITE (iw, '(A)') '</UPF>'
END SUBROUTINE atom_write_upf

View file

@ -1104,11 +1104,12 @@ CONTAINS
nexp_nlcc
INTEGER, DIMENSION(:), POINTER :: nct_lpot, nct_lsd, nct_nlcc, nppnl, &
ppeconf
LOGICAL :: lpot_present, lsd_present, nlcc_present
LOGICAL :: lpot_present, lsd_present, nlcc_present, &
soc_present
REAL(KIND=dp) :: ac, zeff
REAL(KIND=dp), DIMENSION(:), POINTER :: alpha_lpot, alpha_lsd, alpha_nlcc, ap, ce
REAL(KIND=dp), DIMENSION(:, :), POINTER :: cval_lpot, cval_lsd, cval_nlcc
REAL(KIND=dp), DIMENSION(:, :, :), POINTER :: hp
REAL(KIND=dp), DIMENSION(:, :, :), POINTER :: hp, kp
CALL get_potential(gth_potential, &
zeff=zeff, &
@ -1119,6 +1120,7 @@ CONTAINS
lppnl=lm, &
nprj_ppnl=nppnl, &
alpha_ppnl=ap, &
kprj_ppnl=kp, &
hprj_ppnl=hp)
gth_atompot%zion = zeff
@ -1187,6 +1189,17 @@ CONTAINS
gth_atompot%hnl(1:n, 1:n, l) = hp(1:n, 1:n, l)
END DO
! SOC
CALL get_potential(gth_potential, soc_present=soc_present)
gth_atompot%soc = soc_present
gth_atompot%knl = 0.0_dp
IF (soc_present) THEN
DO l = 1, lm
n = nppnl(l)
gth_atompot%knl(1:n, 1:n, l) = kp(1:n, 1:n, l)
END DO
END IF
IF (nlcc_present) THEN
CALL get_potential(gth_potential, &
nexp_nlcc=nexp_nlcc, &

View file

@ -376,6 +376,9 @@ CONTAINS
CALL sg_nuclear(integrals%core(1:n, 1:n, l), l, basis%am(1:n, l), basis%am(1:n, l))
END DO
CASE (gth_pseudo)
IF (potential%gth_pot%soc) THEN
CPWARN("Atom code: GTH SOC is ignored")
END IF
alpha = 1._dp/potential%gth_pot%rc/SQRT(2._dp)
DO l = 0, lmat
n = integrals%n(l)

View file

@ -688,6 +688,22 @@ CONTAINS
END DO
END IF
END DO
IF (potential%gth_pot%soc) THEN
WRITE (iw, '(T10,A)') " Spin-orbit coupling parameters "
DO l = 1, lmat
IF (potential%gth_pot%nl(l) > 0) THEN
WRITE (iw, '(T10,A,T76,I5)') " Angular momentum ", l
WRITE (iw, '(T10,A,T66,F15.6)') " Rcnl ", potential%gth_pot%rcnl(l)
WRITE (iw, '(T10,A,T76,I5)') " Nl ", potential%gth_pot%nl(l)
WRITE (pline, '(5F12.6)') (potential%gth_pot%knl(1, j, l), j=1, potential%gth_pot%nl(l))
WRITE (iw, '(T10,A,T21,A60)') " Hnl ", ADJUSTR(pline)
DO i = 2, potential%gth_pot%nl(l)
WRITE (pline, '(T21,5F12.6)') (potential%gth_pot%knl(i, j, l), j=i, potential%gth_pot%nl(l))
WRITE (iw, '(T21,A60)') ADJUSTR(pline)
END DO
END IF
END DO
END IF
CASE (upf_pseudo)
WRITE (iw, '(/," ",29("*"),A,29("*"))') " UPF Pseudopotential "
DO k = 1, potential%upf_pot%maxinfo
@ -803,6 +819,22 @@ CONTAINS
END DO
END SELECT
END DO
IF (gthpot%soc) THEN
DO i = 1, n - 1
WRITE (iw, '(T29,5F20.14)') (gthpot%hnl(1, k, i), k=1, gthpot%nl(i))
SELECT CASE (gthpot%nl(i))
CASE (2)
WRITE (iw, '(T49,F20.14)') gthpot%knl(2, 2, i)
CASE (3)
WRITE (iw, '(T49,2F20.14)') gthpot%knl(2, 2, i), gthpot%knl(2, 3, i)
WRITE (iw, '(T69,F20.14)') gthpot%knl(3, 3, i)
CASE DEFAULT
DO j = 2, gthpot%nl(i)
WRITE (iw, '(T29,5F20.14)') (gthpot%knl(j, k, i), k=j, gthpot%nl(i))
END DO
END SELECT
END DO
END IF
IF (.NOT. PRESENT(iunit)) CALL close_file(unit_number=iw)
END SUBROUTINE atom_write_pseudo_param

View file

@ -106,6 +106,9 @@ MODULE atom_types
INTEGER, DIMENSION(0:lmat) :: nl = 0
REAL(dp), DIMENSION(0:lmat) :: rcnl = 0.0_dp
REAL(dp), DIMENSION(4, 4, 0:lmat) :: hnl = 0.0_dp
! SOC
LOGICAL :: soc = .FALSE.
REAL(dp), DIMENSION(4, 4, 0:lmat) :: knl = 0.0_dp
! type extensions
! NLCC
LOGICAL :: nlcc = .FALSE.
@ -2569,6 +2572,8 @@ CONTAINS
potential%nl = 0
potential%rcnl = 0._dp
potential%hnl = 0._dp
potential%soc = .FALSE.
potential%knl = 0._dp
potential%lpotextended = .FALSE.
potential%lsdpot = .FALSE.
@ -2675,6 +2680,7 @@ CONTAINS
! Read the parameters for the non-local part of the GTH pseudopotential (ppnl)
READ (line_att, *) nlmax
CALL remove_word(line_att)
IF (INDEX(line_att, "SOC") /= 0) potential%soc = .TRUE.
IF (nlmax > 0) THEN
! Load the parameter for nlmax non-local projectors
DO l = 0, nlmax - 1
@ -2703,6 +2709,29 @@ CONTAINS
CALL remove_word(line_att)
END DO
END DO
IF (potential%soc .AND. l /= 0) THEN
is_ok = cp_sll_val_next(list, val)
CPASSERT(is_ok)
CALL val_get(val, c_val=line_att)
DO i = 1, potential%nl(l)
IF (i == 1) THEN
READ (line_att, *) potential%knl(1, 1, l)
CALL remove_word(line_att)
ELSE
CPASSERT(LEN_TRIM(line_att) == 0)
is_ok = cp_sll_val_next(list, val)
CPASSERT(is_ok)
CALL val_get(val, c_val=line_att)
READ (line_att, *) potential%knl(i, i, l)
CALL remove_word(line_att)
END IF
DO j = i + 1, potential%nl(l)
READ (line_att, *) potential%knl(i, j, l)
potential%knl(j, i, l) = potential%knl(i, j, l)
CALL remove_word(line_att)
END DO
END DO
END IF
CPASSERT(LEN_TRIM(line_att) == 0)
END DO
END IF
@ -2797,6 +2826,10 @@ CONTAINS
! Read the parameters for the non-local part of the GTH pseudopotential (ppnl)
CALL parser_get_object(parser, nlmax)
IF (nlmax > 0) THEN
IF (parser_test_next_token(parser) == "STR") THEN
CALL parser_get_object(parser, line)
IF (INDEX(LINE, "SOC") /= 0) potential%soc = .TRUE.
END IF
! Load the parameter for n non-local projectors
DO l = 0, nlmax - 1
CALL parser_get_object(parser, potential%rcnl(l), newline=.TRUE.)
@ -2812,6 +2845,15 @@ CONTAINS
potential%hnl(j, i, l) = potential%hnl(i, j, l)
END DO
END DO
IF (potential%soc .AND. l /= 0) THEN
DO i = 1, potential%nl(l)
CALL parser_get_object(parser, potential%knl(i, i, l), newline=.TRUE.)
DO j = i + 1, potential%nl(l)
CALL parser_get_object(parser, potential%knl(i, j, l))
potential%knl(j, i, l) = potential%knl(i, j, l)
END DO
END DO
END IF
END DO
END IF
EXIT search_loop

View file

@ -130,8 +130,8 @@ CONTAINS
CHARACTER(len=2) :: element_symbol
CHARACTER(len=default_string_length) :: label
INTEGER :: i, iatom, ibeta, ifun, ikind, iwf, j, l, &
n, natom, nbeta, nkind, nmesh, &
INTEGER :: i, ii, jj, iatom, ibeta, ifun, ikind, iwf, j, l, &
n, ns, natom, nbeta, nbs, nkind, nmesh, &
num_mag_dims, sirius_mpi_comm, vdw_func, nu, lu, output_unit
INTEGER, DIMENSION(:), POINTER :: mpi_grid_dims
INTEGER(KIND=C_INT), DIMENSION(3) :: k_grid, k_shift
@ -143,7 +143,7 @@ CONTAINS
REAL(KIND=C_DOUBLE), DIMENSION(3) :: a1, a2, a3, v1, v2
REAL(KIND=dp) :: al, angle1, angle2, cval, focc, &
magnetization, mass, pf, rl, zeff, alpha_u, beta_u, &
J0_u, J_u, U_u, occ_u, u_minus_J
J0_u, J_u, U_u, occ_u, u_minus_J, vnlp, vnlm
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: beta, corden, ef, fe, locpot, rc, rp
REAL(KIND=dp), DIMENSION(3) :: vr, vs, j_t
REAL(KIND=dp), DIMENSION(:), POINTER :: density
@ -343,7 +343,7 @@ CONTAINS
zn=NINT(zeff + 0.001d0), &
symbol=element_symbol, &
mass=REAL(mass/massunit, KIND=C_DOUBLE), &
spin_orbit=.FALSE.)
spin_orbit=gth_potential%soc)
!
ALLOCATE (gth_atompot)
CALL gth_potential_conversion(gth_potential, gth_atompot)
@ -351,6 +351,7 @@ CONTAINS
fun(1:nmesh) = rp(1:nmesh)
CALL sirius_set_atom_type_radial_grid(sctx, label, nmesh, fun(1))
! set beta-projectors
! GTH SOC uses the same projectors, SIRIUS can use the same or different projectors for l+1/2, l-1/2 (l > 0 l+1/2 l < 0 l-/2 )
ALLOCATE (ef(nmesh), beta(nmesh))
ibeta = 0
DO l = 0, 3
@ -367,21 +368,55 @@ CONTAINS
fun(1:nmesh) = beta(1:nmesh)*rp(1:nmesh)
CALL sirius_add_atom_type_radial_function(sctx, label, &
"beta", fun(1), nmesh, l=l)
! we double the number of beta projectors for SO and l>0
IF (gth_atompot%soc .AND. l /= 0) THEN
CALL sirius_add_atom_type_radial_function(sctx, label, &
"beta", fun(1), nmesh, l=-l)
END IF
END DO
END DO
DEALLOCATE (ef, beta)
nbeta = ibeta
! nonlocal PP matrix elements
ALLOCATE (dion(nbeta, nbeta))
IF (gth_atompot%soc) THEN
nbs = 2*nbeta - gth_atompot%nl(0)
ALLOCATE (dion(nbs, nbs))
ELSE
ALLOCATE (dion(nbeta, nbeta))
END IF
dion = 0.0_dp
DO l = 0, 3
IF (gth_atompot%nl(l) == 0) CYCLE
ibeta = SUM(gth_atompot%nl(0:l - 1)) + 1
i = ibeta + gth_atompot%nl(l) - 1
dion(ibeta:i, ibeta:i) = gth_atompot%hnl(1:gth_atompot%nl(l), 1:gth_atompot%nl(l), l)
END DO
CALL sirius_set_atom_type_dion(sctx, label, nbeta, dion(1, 1))
IF (gth_atompot%soc) THEN
ns = gth_atompot%nl(0)
IF (ns /= 0) THEN
dion(1:ns, 1:ns) = gth_atompot%hnl(1:ns, 1:ns, 0)
END IF
DO l = 1, 3
IF (gth_atompot%nl(l) == 0) CYCLE
DO i = 1, gth_atompot%nl(l)
ii = ns + 2*SUM(gth_atompot%nl(1:l - 1))
ii = ii + 2*(i - 1) + 1
DO j = 1, gth_atompot%nl(l)
jj = ns + 2*SUM(gth_atompot%nl(1:l - 1))
jj = jj + 2*(j - 1) + 1
vnlp = gth_atompot%hnl(i, j, l) + 0.5_dp*l*gth_atompot%knl(i, j, l)
vnlm = gth_atompot%hnl(i, j, l) - 0.5_dp*(l + 1)*gth_atompot%knl(i, j, l)
dion(ii, jj) = vnlp
dion(ii + 1, jj + 1) = vnlm
END DO
END DO
END DO
CALL sirius_set_atom_type_dion(sctx, label, nbs, dion(1, 1))
ELSE
DO l = 0, 3
IF (gth_atompot%nl(l) == 0) CYCLE
ibeta = SUM(gth_atompot%nl(0:l - 1)) + 1
i = ibeta + gth_atompot%nl(l) - 1
dion(ibeta:i, ibeta:i) = gth_atompot%hnl(1:gth_atompot%nl(l), 1:gth_atompot%nl(l), l)
END DO
CALL sirius_set_atom_type_dion(sctx, label, nbeta, dion(1, 1))
END IF
DEALLOCATE (dion)
! set non-linear core correction

View file

@ -682,6 +682,7 @@ CONTAINS
!> \param zeff_correction ...
!> \param ppl_present ...
!> \param ppnl_present ...
!> \param soc_present ...
!> \param alpha_ppnl ...
!> \param cexp_ppl ...
!> \param elec_conf ...
@ -716,7 +717,7 @@ CONTAINS
core_charge_radius, ppl_radius, ppnl_radius, &
lppnl, lprj_ppnl_max, nexp_ppl, nppnl, &
nprj_ppnl_max, z, zeff, zeff_correction, &
ppl_present, ppnl_present, &
ppl_present, ppnl_present, soc_present, &
alpha_ppnl, cexp_ppl, elec_conf, nprj_ppnl, cprj, &
cprj_ppnl, vprj_ppnl, wprj_ppnl, hprj_ppnl, kprj_ppnl, &
lpot_present, nexp_lpot, alpha_lpot, nct_lpot, cval_lpot, &
@ -733,7 +734,7 @@ CONTAINS
INTEGER, INTENT(OUT), OPTIONAL :: lppnl, lprj_ppnl_max, nexp_ppl, nppnl, &
nprj_ppnl_max, z
REAL(KIND=dp), INTENT(OUT), OPTIONAL :: zeff, zeff_correction
LOGICAL, INTENT(OUT), OPTIONAL :: ppl_present, ppnl_present
LOGICAL, INTENT(OUT), OPTIONAL :: ppl_present, ppnl_present, soc_present
REAL(KIND=dp), DIMENSION(:), OPTIONAL, POINTER :: alpha_ppnl, cexp_ppl
INTEGER, DIMENSION(:), OPTIONAL, POINTER :: elec_conf, nprj_ppnl
REAL(KIND=dp), DIMENSION(:, :), OPTIONAL, POINTER :: cprj, cprj_ppnl, vprj_ppnl, wprj_ppnl
@ -766,6 +767,7 @@ CONTAINS
core_charge_radius = potential%core_charge_radius
IF (PRESENT(ppl_radius)) ppl_radius = potential%ppl_radius
IF (PRESENT(ppnl_radius)) ppnl_radius = potential%ppnl_radius
IF (PRESENT(soc_present)) soc_present = potential%soc
IF (PRESENT(lppnl)) lppnl = potential%lppnl
IF (PRESENT(lprj_ppnl_max)) lprj_ppnl_max = potential%lprj_ppnl_max
IF (PRESENT(nexp_ppl)) nexp_ppl = potential%nexp_ppl

View file

@ -0,0 +1,44 @@
&GLOBAL
PROGRAM_NAME ATOM
&END GLOBAL
&ATOM
CORE [Kr] 4d10 4f14
ELECTRON_CONFIGURATION CORE 5s2 5p6 5d9 6s2
ELEMENT Au
MAX_ANGULAR_MOMENTUM 3
RUN_TYPE ENERGY
&METHOD
METHOD_TYPE KOHN-SHAM
&XC
&XC_FUNCTIONAL PBE
&END XC_FUNCTIONAL
&END XC
&END METHOD
&POTENTIAL
PSEUDO_TYPE GTH
&GTH_POTENTIAL
3 6 10
0.49000000 2 9.07322639 -0.34013367
3 SOC
0.28803780 3 -5.90182040 26.42537412 -15.50837777
-59.33938963 40.04245923
-31.78271670
0.35586747 3 -7.08858659 8.19796427 0.00000000
-9.69996213 0.00000000
0.00000000
0.62807493 1.81668773 -1.65141098
-4.89888134 3.90795165
-2.77740200
0.33386175 2 -8.82572349 9.56535285
-10.84609065
0.18880114 0.03175114
-0.03600240
&END GTH_POTENTIAL
&END POTENTIAL
&PRINT
&UPF_FILE
FILENAME ./Au_HGH_q19
&END UPF_FILE
&END PRINT
&END ATOM

View file

@ -22,4 +22,5 @@
"C_grb.inp" = [{matcher="M035", tol=1e-12, ref=-5.360945665362}]
"C_grb2.inp" = [{matcher="M035", tol=1e-12, ref=-5.360945665362}]
"Li_NLCC.inp" = [{matcher="M061", tol=1e-12, ref=0.5527955347}]
"Au.inp" = [{matcher="M035", tol=1e-10, ref=-136.583322713061}]
#EOF

View file

@ -0,0 +1,66 @@
&GLOBAL
PRINT_LEVEL MEDIUM
PROJECT Gold
RUN_TYPE ENERGY
&END GLOBAL
&FORCE_EVAL
METHOD SIRIUS
&DFT
POTENTIAL_FILE_NAME GTH_SOC_POTENTIALS
&XC
&XC_FUNCTIONAL
&LDA_C_PZ
&END LDA_C_PZ
&LDA_X
&END LDA_X
&END XC_FUNCTIONAL
&END XC
&END DFT
&PW_DFT
&CONTROL
CYCLIC_BLOCK_SIZE 32
GEN_EVP_SOLVER_NAME lapack
PROCESSING_UNIT cpu
STD_EVP_SOLVER_NAME lapack
VERBOSITY 1
&END CONTROL
&ITERATIVE_SOLVER
CONVERGE_BY_ENERGY 1
ENERGY_TOLERANCE 1e-5
NUM_STEPS 20
SUBSPACE_SIZE 4
TYPE davidson
&END ITERATIVE_SOLVER
&MIXER
BETA 0.6
MAX_HISTORY 8
TYPE broyden2
&END MIXER
&PARAMETERS
ELECTRONIC_STRUCTURE_METHOD pseudopotential
GK_CUTOFF 6.0
NGRIDK 2 2 2
NUM_DFT_ITER 100
NUM_MAG_DIMS 3
PW_CUTOFF 20.00
SMEARING_WIDTH 0.01
SO_CORRECTION true
USE_SYMMETRY false
&END PARAMETERS
&END PW_DFT
&SUBSYS
&CELL
A [bohr] -3.85500000000000000000 0.0 3.85500000000000000000
B [bohr] 0.0 3.85500000000000000000 3.85500000000000000000
C [bohr] -3.85500000000000000000 3.85500000000000000000 0.0
&END CELL
&COORD
SCALED
Au 0.0 0.0 0.0
&END COORD
&KIND Au
POTENTIAL GTH-PADE-q19
&END KIND
&END SUBSYS
&END FORCE_EVAL

View file

@ -17,4 +17,6 @@
"LiF.inp" = [{matcher="M085", tol=1.0E-5, ref=-36.658529490345153}]
"N2.inp" = [{matcher="M085", tol=1.0E-9, ref=-16.572137677057988}]
"Fe-upf.inp" = [{matcher="M085", tol=1.0E-5, ref=-322.37407840130044}]
"Au_GTH.inp" = [{matcher="M085", tol=1.0E-5, ref=-33.157343398225969}]
"Au_GTH_SOC.inp" = [{matcher="M085", tol=1.0E-5, ref=-135.58863815223782}]
#EOF