mirror of
https://github.com/cp2k/cp2k.git
synced 2026-07-28 22:25:32 -04:00
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:
parent
f74290cd64
commit
d69078cdc6
11 changed files with 363 additions and 29 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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, &
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
44
tests/ATOM/regtest-pseudo/Au.inp
Normal file
44
tests/ATOM/regtest-pseudo/Au.inp
Normal 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
|
||||
>H_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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
66
tests/SIRIUS/regtest-1/Au_GTH_SOC.inp
Normal file
66
tests/SIRIUS/regtest-1/Au_GTH_SOC.inp
Normal 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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue