mirror of
https://github.com/cp2k/cp2k.git
synced 2026-07-27 13:45:19 -04:00
open shell code added to qs_moment_kpoints
This commit is contained in:
parent
c043a46d7e
commit
e60cd36aed
6 changed files with 240 additions and 111 deletions
|
|
@ -1130,6 +1130,16 @@ CONTAINS
|
|||
unit_str='bohr')
|
||||
CALL section_add_keyword(print_key, keyword)
|
||||
CALL keyword_release(keyword)
|
||||
CALL keyword_create(keyword, __LOCATION__, name="MAX_NMO", &
|
||||
description="Maximum number of molecular orbitals closest to the Fermi "// &
|
||||
"level for which dipole matrix elements and Berry curvatures are printed "// &
|
||||
"per k-point. 0 for all orbitals. Ignored if not a KPOINT calculation.", &
|
||||
usage="MAX_NMO {integer}", &
|
||||
repeats=.FALSE., &
|
||||
n_var=1, default_i_val=10, &
|
||||
type_of_var=integer_t)
|
||||
CALL section_add_keyword(print_key, keyword)
|
||||
CALL keyword_release(keyword)
|
||||
CALL create_kpoint_set_section(subsection)
|
||||
CALL section_add_subsection(print_key, subsection)
|
||||
CALL section_release(subsection)
|
||||
|
|
|
|||
229
src/qs_moments.F
229
src/qs_moments.F
|
|
@ -3622,12 +3622,13 @@ CONTAINS
|
|||
!> \param nmoments ...
|
||||
!> \param reference ...
|
||||
!> \param ref_point ...
|
||||
!> \param max_nmo ...
|
||||
!> \param unit_number ...
|
||||
!> \author Shridhar Shanbhag
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE qs_moment_kpoints(qs_env, nmoments, reference, ref_point, unit_number)
|
||||
SUBROUTINE qs_moment_kpoints(qs_env, nmoments, reference, ref_point, max_nmo, unit_number)
|
||||
TYPE(qs_environment_type), POINTER :: qs_env
|
||||
INTEGER, INTENT(IN) :: nmoments, reference
|
||||
INTEGER, INTENT(IN) :: nmoments, reference, max_nmo
|
||||
REAL(dp), DIMENSION(:), INTENT(IN), POINTER :: ref_point
|
||||
INTEGER, INTENT(IN) :: unit_number
|
||||
CHARACTER(LEN=*), PARAMETER :: routineN = 'qs_moment_kpoints'
|
||||
|
|
@ -3635,11 +3636,12 @@ CONTAINS
|
|||
COMPLEX(KIND=dp), DIMENSION(:, :), ALLOCATABLE :: C_k, H_k, S_k, D_k, CDC, C_dH_C, &
|
||||
C_dS_C, dH_dk_i, dS_dk_i
|
||||
COMPLEX(KIND=dp), DIMENSION(:, :, :), ALLOCATABLE :: dip, dipole_to_print
|
||||
COMPLEX(KIND=dp), DIMENSION(:, :, :, :), &
|
||||
COMPLEX(KIND=dp), DIMENSION(:, :, :, :, :), &
|
||||
ALLOCATABLE :: dipole_to_store
|
||||
INTEGER :: handle, i_dir, ikp, nkp, nmo, &
|
||||
n_img_scf, n_img_all, nao, &
|
||||
num_pe, num_copy, mepos, n, m, mu
|
||||
num_pe, num_copy, mepos, n, m, mu, &
|
||||
ispin, nspin, nmin, nmax, homo
|
||||
INTEGER, DIMENSION(:, :), POINTER :: index_to_cell_all
|
||||
INTEGER, DIMENSION(:, :, :), POINTER :: cell_to_index_all
|
||||
REAL(KIND=dp), DIMENSION(3) :: rcc
|
||||
|
|
@ -3647,7 +3649,7 @@ CONTAINS
|
|||
REAL(KIND=dp), DIMENSION(:), ALLOCATABLE :: eigenvals
|
||||
REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE :: bc, xkp
|
||||
REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE :: bc_to_print
|
||||
REAL(KIND=dp), DIMENSION(:, :, :), ALLOCATABLE :: bc_to_store
|
||||
REAL(KIND=dp), DIMENSION(:, :, :, :), ALLOCATABLE :: bc_to_store
|
||||
REAL(KIND=dp), DIMENSION(:, :, :, :), &
|
||||
ALLOCATABLE :: D_rs, H_rs, S_rs
|
||||
TYPE(cell_type), POINTER :: cell
|
||||
|
|
@ -3665,6 +3667,7 @@ CONTAINS
|
|||
CALL timeset(routineN, handle)
|
||||
|
||||
IF (nmoments > 1) CPABORT("KPOINT quadrupole and higher moments not implemented.")
|
||||
IF (max_nmo < 0) CPABORT("Negative maximum number of molecular orbitals max_nmo provided.")
|
||||
|
||||
CALL get_qs_env(qs_env, &
|
||||
matrix_ks_kp=matrix_ks_kp, &
|
||||
|
|
@ -3676,10 +3679,8 @@ CONTAINS
|
|||
dft_control=dft_control, &
|
||||
mos=mos)
|
||||
|
||||
CPASSERT(SIZE(matrix_ks_kp, 1) == 1)! only for closed shell at present
|
||||
CALL get_mo_set(mo_set=mos(1), nao=nao)
|
||||
! for now, and for clarity
|
||||
nmo = nao
|
||||
CALL get_mo_set(mo_set=mos(1), nao=nao, nmo=nmo)
|
||||
nspin = SIZE(matrix_ks_kp, 1)
|
||||
|
||||
! create kpoint environment kpoints_all which contains all neighbor cells R
|
||||
! without considering any lattice symmetry
|
||||
|
|
@ -3701,7 +3702,7 @@ CONTAINS
|
|||
! D_μ,ν = <φ_μ|r|φ_ν>
|
||||
CALL build_local_moment_matrix_rs_img(qs_env, moments_rs_img, rcc=rcc)
|
||||
|
||||
ALLOCATE (S_rs(1, nao, nao, n_img_all), H_rs(1, nao, nao, n_img_all), source=0.0_dp)
|
||||
ALLOCATE (S_rs(1, nao, nao, n_img_all), H_rs(nspin, nao, nao, n_img_all), source=0.0_dp)
|
||||
ALLOCATE (D_rs(3, nao, nao, n_img_all), source=0.0_dp)
|
||||
|
||||
! Convert real-space dbcsr matrices into arrays
|
||||
|
|
@ -3717,118 +3718,138 @@ CONTAINS
|
|||
num_pe = para_env%num_pe
|
||||
num_copy = CEILING(REAL(nkp)/num_pe)
|
||||
CALL get_cell(cell=cell, h=hmat)
|
||||
|
||||
ALLOCATE (dipole_to_store(nspin, num_copy, 3, nao, nao), source=z_zero)
|
||||
ALLOCATE (bc_to_store(nspin, num_copy, 3, nao), source=0.0_dp)
|
||||
|
||||
!$OMP PARALLEL PRIVATE(ikp, S_k, H_k, eigenvals, C_k, &
|
||||
!$OMP dS_dk_i, dH_dk_i, D_k, dip, bc, C_dS_C, C_dH_C, CDC, tmp_max, phase) &
|
||||
!$OMP SHARED(num_pe, mepos, dipole_to_store, bc_to_store, nmo, nao, ispin, &
|
||||
!$OMP nkp, xkp, S_rs, H_rs, D_rs, index_to_cell_all, hmat)
|
||||
ALLOCATE (dS_dk_i(nao, nao), C_dS_C(nao, nao), dH_dk_i(nao, nao), C_dH_C(nao, nao), source=z_zero)
|
||||
ALLOCATE (CDC(nao, nao), dip(3, nao, nao), S_k(nao, nao), H_k(nao, nao), source=z_zero)
|
||||
ALLOCATE (C_k(nao, nao), D_k(nao, nao), dipole_to_store(num_copy, 3, nao, nao), source=z_zero)
|
||||
ALLOCATE (eigenvals(nao), bc(3, nao), bc_to_store(num_copy, 3, nao), source=0.0_dp)
|
||||
ALLOCATE (C_k(nao, nao), D_k(nao, nao), source=z_zero)
|
||||
ALLOCATE (eigenvals(nao), bc(3, nao), source=0.0_dp)
|
||||
!$OMP DO COLLAPSE(2)
|
||||
DO ispin = 1, nspin
|
||||
DO ikp = 1, nkp
|
||||
IF (mod(ikp - 1, num_pe) /= mepos) CYCLE
|
||||
|
||||
!$OMP PARALLEL DO DEFAULT(NONE) PRIVATE(ikp, S_k, H_k, eigenvals, C_k, &
|
||||
!$OMP dS_dk_i, dH_dk_i, D_k, dip, bc, C_dS_C, C_dH_C, CDC, tmp_max, phase) &
|
||||
!$OMP SHARED(num_pe, mepos,dipole_to_store, bc_to_store, nmo, nao,&
|
||||
!$OMP nkp, xkp, S_rs, H_rs, D_rs, index_to_cell_all, hmat, unit_number)
|
||||
DO ikp = 1, nkp
|
||||
IF (mod(ikp - 1, num_pe) /= mepos) CYCLE
|
||||
! S^R -> S(k), H^R -> H(k)
|
||||
S_k = 0
|
||||
H_k = 0
|
||||
CALL rs_to_kp(S_rs(1, :, :, :), S_k, index_to_cell_all, xkp(:, ikp))
|
||||
CALL rs_to_kp(H_rs(ispin, :, :, :), H_k, index_to_cell_all, xkp(:, ikp))
|
||||
|
||||
! S^R -> S(k), H^R -> H(k)
|
||||
CALL rs_to_kp(S_rs(1, :, :, :), S_k, index_to_cell_all, xkp(:, ikp))
|
||||
CALL rs_to_kp(H_rs(1, :, :, :), H_k, index_to_cell_all, xkp(:, ikp))
|
||||
! Diagonalize H(k)C(k) = S(k)C(k)ε(k)
|
||||
CALL geeig_right(H_k, S_k, eigenvals, C_k)
|
||||
|
||||
! Diagonalize H(k)C(k) = S(k)C(k)ε(k)
|
||||
CALL geeig_right(H_k, S_k, eigenvals, C_k)
|
||||
|
||||
! To have a smooth complex phase of C(k) as function of k, for every n, we force
|
||||
! the largest C_μ,n(k) to be real.
|
||||
! This is important to have a continuous dipole moment d_nm(k) as a function of k
|
||||
DO n = 1, nmo
|
||||
tmp_max = C_k(1, n)
|
||||
DO mu = 1, nao
|
||||
IF (ABS(C_k(mu, n)) < ABS(tmp_max)) CYCLE
|
||||
tmp_max = C_k(mu, n)
|
||||
END DO
|
||||
phase = tmp_max/ABS(tmp_max)
|
||||
C_k(:, n) = C_k(:, n)/phase
|
||||
END DO
|
||||
|
||||
DO i_dir = 1, 3 ! d^x, d^y, d^z
|
||||
|
||||
! ∇ S(k) = Σ_R iR S^R e^(ikR), ∇ H(k) = Σ_R iR H^R e^(ikR)
|
||||
CALL rs_to_kp(S_rs(1, :, :, :), dS_dk_i, index_to_cell_all, xkp(:, ikp), i_dir, hmat)
|
||||
CALL rs_to_kp(H_rs(1, :, :, :), dH_dk_i, index_to_cell_all, xkp(:, ikp), i_dir, hmat)
|
||||
|
||||
! Σ_R D^R e^(ikR) = D(k), D_μ,ν = <φ_μ|r|φ_ν>
|
||||
CALL rs_to_kp(D_rs(i_dir, :, :, :), D_k(:, :), index_to_cell_all, xkp(:, ikp))
|
||||
|
||||
! Basis transform to Kohn-Sham basis: (C^H) ∇ S C, (C^H) ∇ H C, (C^H) D C
|
||||
CALL gemm_square(C_k, 'C', dS_dk_i, 'N', C_k, 'N', C_dS_C)
|
||||
CALL gemm_square(C_k, 'C', dH_dk_i, 'N', C_k, 'N', C_dH_C)
|
||||
CALL gemm_square(C_k, 'C', D_k, 'N', C_k, 'N', CDC)
|
||||
|
||||
! Compute the dipole
|
||||
! d_nm (k) = - i/(ε(n)-ε(m)) [ (C^H)(dH(k)/dk)C ]_nm
|
||||
! + i ε(n)/(ε(n)-ε(m)) [ (C^H)(dS(k)/dk)C ]_nm + [ (C^H)D(k)C ]_nm
|
||||
! To have a smooth complex phase of C(k) as function of k, for every n, we force
|
||||
! the largest C_μ,n(k) to be real.
|
||||
! This is important to have a continuous dipole moment d_nm(k) as a function of k
|
||||
DO n = 1, nmo
|
||||
DO m = 1, nmo
|
||||
IF (n == m) CYCLE ! diagonal elements would need to be computed from
|
||||
! a numerical k-derivative which is not implemented
|
||||
dip(i_dir, n, m) = -gaussi*C_dH_C(n, m)/(eigenvals(n) - eigenvals(m)) &
|
||||
+ gaussi*eigenvals(n)*C_dS_C(n, m)/(eigenvals(n) - eigenvals(m)) &
|
||||
+ CDC(n, m)
|
||||
tmp_max = C_k(1, n)
|
||||
DO mu = 1, nao
|
||||
IF (ABS(C_k(mu, n)) < ABS(tmp_max)) CYCLE
|
||||
tmp_max = C_k(mu, n)
|
||||
END DO
|
||||
phase = tmp_max/ABS(tmp_max)
|
||||
C_k(:, n) = C_k(:, n)/phase
|
||||
END DO
|
||||
|
||||
DO i_dir = 1, 3 ! d^x, d^y, d^z
|
||||
|
||||
! ∇ S(k) = Σ_R iR S^R e^(ikR), ∇ H(k) = Σ_R iR H^R e^(ikR)
|
||||
CALL rs_to_kp(S_rs(1, :, :, :), dS_dk_i, index_to_cell_all, xkp(:, ikp), i_dir, hmat)
|
||||
CALL rs_to_kp(H_rs(ispin, :, :, :), dH_dk_i, index_to_cell_all, xkp(:, ikp), i_dir, hmat)
|
||||
|
||||
! Σ_R D^R e^(ikR) = D(k), D_μ,ν = <φ_μ|r|φ_ν>
|
||||
CALL rs_to_kp(D_rs(i_dir, :, :, :), D_k(:, :), index_to_cell_all, xkp(:, ikp))
|
||||
|
||||
! Basis transform to Kohn-Sham basis: (C^H) ∇ S C, (C^H) ∇ H C, (C^H) D C
|
||||
CALL gemm_square(C_k, 'C', dS_dk_i, 'N', C_k, 'N', C_dS_C)
|
||||
CALL gemm_square(C_k, 'C', dH_dk_i, 'N', C_k, 'N', C_dH_C)
|
||||
CALL gemm_square(C_k, 'C', D_k, 'N', C_k, 'N', CDC)
|
||||
|
||||
! Compute the dipole
|
||||
! d_nm (k) = - i/(ε(n)-ε(m)) [ (C^H)(dH(k)/dk)C ]_nm
|
||||
! + i ε(n)/(ε(n)-ε(m)) [ (C^H)(dS(k)/dk)C ]_nm + [ (C^H)D(k)C ]_nm
|
||||
DO n = 1, nmo
|
||||
DO m = 1, nmo
|
||||
IF (n == m) CYCLE ! diagonal elements would need to be computed from
|
||||
! a numerical k-derivative which is not implemented
|
||||
dip(i_dir, n, m) = -gaussi*C_dH_C(n, m)/(eigenvals(n) - eigenvals(m)) &
|
||||
+ gaussi*eigenvals(n)*C_dS_C(n, m)/(eigenvals(n) - eigenvals(m)) &
|
||||
+ CDC(n, m)
|
||||
END DO
|
||||
END DO
|
||||
END DO
|
||||
END DO
|
||||
! Compute the Berry curvature from the dipoles
|
||||
! Ω^γ_n = Σ_m 2*Im[d^α_nm (d^β_mn)*], where, α, β, γ belong to {x, y, z}
|
||||
bc = 0
|
||||
DO i_dir = 1, 3
|
||||
DO n = 1, nmo
|
||||
DO m = 1, nmo
|
||||
IF (n == m) CYCLE
|
||||
bc(i_dir, n) = bc(i_dir, n) &
|
||||
+ 2*AIMAG(dip(1 + MOD(i_dir, 3), n, m)*dip(1 + MOD(i_dir + 1, 3), m, n))
|
||||
! Compute the Berry curvature from the dipoles
|
||||
! Ω^γ_n = Σ_m 2*Im[d^α_nm (d^β_mn)*], where, α, β, γ belong to {x, y, z}
|
||||
bc = 0
|
||||
DO i_dir = 1, 3
|
||||
DO n = 1, nmo
|
||||
DO m = 1, nmo
|
||||
IF (n == m) CYCLE
|
||||
bc(i_dir, n) = bc(i_dir, n) &
|
||||
+ 2*AIMAG(dip(1 + MOD(i_dir, 3), n, m)*dip(1 + MOD(i_dir + 1, 3), m, n))
|
||||
END DO
|
||||
END DO
|
||||
END DO
|
||||
END DO
|
||||
! Store the dipoles and berry curvature for each MPI rank
|
||||
dipole_to_store(CEILING(REAL(ikp)/num_pe), :, :, :) = dip(:, :, :)
|
||||
bc_to_store(CEILING(REAL(ikp)/num_pe), :, :) = bc(:, :)
|
||||
! Store the dipoles and berry curvature for each MPI rank
|
||||
dipole_to_store(ispin, CEILING(REAL(ikp)/num_pe), :, :, :) = dip(:, :, :)
|
||||
bc_to_store(ispin, CEILING(REAL(ikp)/num_pe), :, :) = bc(:, :)
|
||||
|
||||
END DO
|
||||
END DO
|
||||
!$OMP END PARALLEL DO
|
||||
!$OMP END DO
|
||||
DEALLOCATE (dS_dk_i, C_dS_C, dH_dk_i, C_dH_C, CDC, dip, S_k, H_k, C_k, D_k, eigenvals, bc)
|
||||
!$OMP END PARALLEL
|
||||
|
||||
ALLOCATE (dipole_to_print(3, nao, nao), source=z_zero)
|
||||
ALLOCATE (bc_to_print(3, nao), source=0.0_dp)
|
||||
DO ikp = 1, nkp
|
||||
dipole_to_print = 0.0_dp
|
||||
bc_to_print = 0.0_dp
|
||||
IF (mod(ikp - 1, num_pe) == mepos) THEN
|
||||
dipole_to_print(:, :, :) = dipole_to_store(CEILING(REAL(ikp)/num_pe), :, :, :)
|
||||
bc_to_print(:, :) = bc_to_store(CEILING(REAL(ikp)/num_pe), :, :)
|
||||
END IF
|
||||
CALL para_env%sum(dipole_to_print)
|
||||
CALL para_env%sum(bc_to_print)
|
||||
IF (unit_number > 0) THEN
|
||||
IF (special_pnts(ikp) /= "") WRITE (unit_number, "(/,2X,A,A)") &
|
||||
"Special point: ", ADJUSTL(TRIM(special_pnts(ikp)))
|
||||
WRITE (unit_number, "(/,1X,A,I3,1X,3(A,1F12.6))") &
|
||||
"Kpoint:", ikp, ", kx:", xkp(1, ikp), ", ky:", xkp(2, ikp), ", kz:", xkp(3, ikp)
|
||||
WRITE (unit_number, "(2X,A)") " kp n m Re(dx_nm) Im(dx_nm) &
|
||||
& Re(dy_nm) Im(dy_nm) Re(dz_nm) Im(dz_nm)"
|
||||
DO n = 1, nao
|
||||
DO m = 1, nao
|
||||
IF (n == m) CYCLE
|
||||
WRITE (unit_number, "(1X,I4,2I3,6(G11.3))") ikp, n, m, dipole_to_print(1:3, n, m)
|
||||
DO ispin = 1, nspin
|
||||
CALL get_mo_set(mo_set=mos(ispin), homo=homo)
|
||||
nmin = max(1, homo - (max_nmo - 1)/2)
|
||||
nmax = min(nao, homo + max_nmo/2)
|
||||
IF (max_nmo == 0) THEN
|
||||
nmin = 1
|
||||
nmax = nmo
|
||||
END IF
|
||||
dipole_to_print = 0.0_dp
|
||||
bc_to_print = 0.0_dp
|
||||
IF (mod(ikp - 1, num_pe) == mepos) THEN
|
||||
dipole_to_print(:, :, :) = dipole_to_store(ispin, CEILING(REAL(ikp)/num_pe), :, :, :)
|
||||
bc_to_print(:, :) = bc_to_store(ispin, CEILING(REAL(ikp)/num_pe), :, :)
|
||||
END IF
|
||||
CALL para_env%sum(dipole_to_print)
|
||||
CALL para_env%sum(bc_to_print)
|
||||
IF (unit_number > 0) THEN
|
||||
IF (special_pnts(ikp) /= "") WRITE (unit_number, "(/,2X,A,A)") &
|
||||
"Special point: ", ADJUSTL(TRIM(special_pnts(ikp)))
|
||||
WRITE (unit_number, "(/,1X,A,I3,1X,3(A,1F12.6))") &
|
||||
"Kpoint:", ikp, ", kx:", xkp(1, ikp), ", ky:", xkp(2, ikp), ", kz:", xkp(3, ikp)
|
||||
IF (nspin > 1) WRITE (unit_number, "(/,2X,A,I2)") "Open Shell System. Spin:", ispin
|
||||
WRITE (unit_number, "(2X,A)") " kp n m Re(dx_nm) Im(dx_nm) &
|
||||
& Re(dy_nm) Im(dy_nm) Re(dz_nm) Im(dz_nm)"
|
||||
DO n = nmin, nmax
|
||||
DO m = nmin, nmax
|
||||
IF (n == m) CYCLE
|
||||
WRITE (unit_number, "(2X,I4,2I4,6(G11.3))") ikp, n, m, dipole_to_print(1:3, n, m)
|
||||
END DO
|
||||
END DO
|
||||
END DO
|
||||
WRITE (unit_number, "(/,1X,A)") "Berry Curvature"
|
||||
WRITE (unit_number, "(2X,A)") " kp n YZ ZX XY"
|
||||
DO n = 1, nao
|
||||
WRITE (unit_number, "(2X,2I4,3(1X,G11.3))") &
|
||||
ikp, n, bc_to_print(1, n), bc_to_print(2, n), bc_to_print(3, n)
|
||||
END DO
|
||||
END IF
|
||||
WRITE (unit_number, "(/,1X,A)") "Berry Curvature"
|
||||
WRITE (unit_number, "(2X,A)") " kp n YZ ZX XY"
|
||||
DO n = nmin, nmax
|
||||
WRITE (unit_number, "(2X,2I5,3(1X,G11.3))") &
|
||||
ikp, n, bc_to_print(1, n), bc_to_print(2, n), bc_to_print(3, n)
|
||||
END DO
|
||||
END IF
|
||||
END DO
|
||||
END DO
|
||||
DEALLOCATE (dipole_to_print, bc_to_print, eigenvals, bc, dS_dk_i, dH_dk_i, D_k)
|
||||
DEALLOCATE (C_dS_C, C_dH_C, CDC, dip, S_k, H_k, C_k, S_rs, H_rs, D_rs, xkp, special_pnts)
|
||||
DEALLOCATE (dipole_to_print, bc_to_print, bc_to_store, dipole_to_store)
|
||||
DEALLOCATE (S_rs, H_rs, D_rs, special_pnts, xkp)
|
||||
CALL dbcsr_deallocate_matrix_set(moments_rs_img)
|
||||
CALL kpoint_release(kpoints_all)
|
||||
|
||||
|
|
|
|||
|
|
@ -1528,7 +1528,8 @@ CONTAINS
|
|||
CHARACTER(len=*), PARAMETER :: routineN = 'qs_scf_post_moments'
|
||||
|
||||
CHARACTER(LEN=default_path_length) :: filename
|
||||
INTEGER :: handle, maxmom, reference, unit_nr
|
||||
INTEGER :: handle, max_nmo, maxmom, reference, &
|
||||
unit_nr
|
||||
LOGICAL :: com_nl, do_kpoints, magnetic, periodic, &
|
||||
second_ref_point, vel_reprs
|
||||
REAL(KIND=dp), DIMENSION(:), POINTER :: ref_point
|
||||
|
|
@ -1555,6 +1556,8 @@ CONTAINS
|
|||
keyword_name="DFT%PRINT%MOMENTS%COM_NL")
|
||||
second_ref_point = section_get_lval(section_vals=input, &
|
||||
keyword_name="DFT%PRINT%MOMENTS%SECOND_REFERENCE_POINT")
|
||||
max_nmo = section_get_ival(section_vals=input, &
|
||||
keyword_name="DFT%PRINT%MOMENTS%MAX_NMO")
|
||||
|
||||
NULLIFY (ref_point)
|
||||
CALL section_vals_val_get(input, "DFT%PRINT%MOMENTS%REF_POINT", r_vals=ref_point)
|
||||
|
|
@ -1576,7 +1579,7 @@ CONTAINS
|
|||
CALL get_qs_env(qs_env, do_kpoints=do_kpoints)
|
||||
|
||||
IF (do_kpoints) THEN
|
||||
CALL qs_moment_kpoints(qs_env, maxmom, reference, ref_point, unit_nr)
|
||||
CALL qs_moment_kpoints(qs_env, maxmom, reference, ref_point, max_nmo, unit_nr)
|
||||
ELSE
|
||||
IF (periodic) THEN
|
||||
CALL qs_moment_berry_phase(qs_env, magnetic, maxmom, reference, ref_point, unit_nr)
|
||||
|
|
@ -1609,7 +1612,7 @@ CONTAINS
|
|||
END IF
|
||||
END IF
|
||||
IF (do_kpoints) THEN
|
||||
CALL qs_moment_kpoints(qs_env, maxmom, reference, ref_point, unit_nr)
|
||||
CALL qs_moment_kpoints(qs_env, maxmom, reference, ref_point, max_nmo, unit_nr)
|
||||
ELSE
|
||||
IF (periodic) THEN
|
||||
CALL qs_moment_berry_phase(qs_env, magnetic, maxmom, reference, ref_point, unit_nr)
|
||||
|
|
|
|||
90
tests/QS/regtest-moments-kpoints/CrSBr_open_shell.inp
Normal file
90
tests/QS/regtest-moments-kpoints/CrSBr_open_shell.inp
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
&GLOBAL
|
||||
PRINT_LEVEL low
|
||||
PROJECT CrSBr_open_shell
|
||||
RUN_TYPE ENERGY
|
||||
&END GLOBAL
|
||||
|
||||
&FORCE_EVAL
|
||||
METHOD Quickstep
|
||||
&DFT
|
||||
BASIS_SET_FILE_NAME BASIS_MOLOPT
|
||||
MULTIPLICITY 9
|
||||
POTENTIAL_FILE_NAME GTH_POTENTIALS
|
||||
UKS TRUE
|
||||
&KPOINTS
|
||||
FULL_GRID T
|
||||
SCHEME MONKHORST-PACK 4 4 1
|
||||
&END KPOINTS
|
||||
&MGRID
|
||||
CUTOFF 400
|
||||
REL_CUTOFF 80
|
||||
&END MGRID
|
||||
&POISSON
|
||||
PERIODIC XYZ
|
||||
&END POISSON
|
||||
&PRINT
|
||||
&MOMENTS
|
||||
MAX_NMO 2
|
||||
&KPOINT_SET
|
||||
NPOINTS 1
|
||||
SPECIAL_POINT -0.375 -0.375 0.000
|
||||
&END KPOINT_SET
|
||||
&END MOMENTS
|
||||
&END PRINT
|
||||
&QS
|
||||
METHOD gpw
|
||||
&END QS
|
||||
&SCF
|
||||
ADDED_MOS 700
|
||||
EPS_SCF 1.0E+6
|
||||
MAX_SCF 100
|
||||
SCF_GUESS atomic
|
||||
&DIAGONALIZATION
|
||||
ALGORITHM STANDARD
|
||||
EPS_ADAPT 0.01
|
||||
&END DIAGONALIZATION
|
||||
&MIXING
|
||||
ALPHA 0.2
|
||||
BETA 1.5
|
||||
METHOD BROYDEN_MIXING
|
||||
NBROYDEN 8
|
||||
&END MIXING
|
||||
&PRINT
|
||||
&RESTART OFF
|
||||
&END RESTART
|
||||
&END PRINT
|
||||
&END SCF
|
||||
&XC
|
||||
&XC_FUNCTIONAL PBE
|
||||
&END XC_FUNCTIONAL
|
||||
&END XC
|
||||
&END DFT
|
||||
&SUBSYS
|
||||
&CELL
|
||||
ABC 4.740980 3.546461 21.341806
|
||||
ALPHA_BETA_GAMMA 90 90 90
|
||||
PERIODIC XY
|
||||
&END CELL
|
||||
&COORD
|
||||
Cr 2.37049022 0.00000000 9.63697202
|
||||
Cr 0.00000000 1.77323028 11.70449892
|
||||
S 2.37049022 1.77323028 11.23841756
|
||||
S 0.00000000 0.00000000 10.10305256
|
||||
Br 2.37049022 1.77323028 7.83774116
|
||||
Br 0.00000000 0.00000000 13.50373080
|
||||
&END COORD
|
||||
&KIND Cr
|
||||
BASIS_SET DZVP-MOLOPT-SR-GTH
|
||||
MAGNETIZATION 4.0
|
||||
POTENTIAL GTH-PBE-q14
|
||||
&END KIND
|
||||
&KIND S
|
||||
BASIS_SET DZVP-MOLOPT-SR-GTH
|
||||
POTENTIAL GTH-PBE-q6
|
||||
&END KIND
|
||||
&KIND Br
|
||||
BASIS_SET DZVP-MOLOPT-SR-GTH
|
||||
POTENTIAL GTH-PBE-q7
|
||||
&END KIND
|
||||
&END SUBSYS
|
||||
&END FORCE_EVAL
|
||||
|
|
@ -10,6 +10,8 @@
|
|||
# compute the dipole moments for kpoints provided via &KPOINTS in the &MOMENTS section
|
||||
"C2_pbe_moment_kp.inp" = [{matcher="Dipole_at_kp_1", tol=1.0E-06, ref=0.344}]
|
||||
# compute the dipole moments for kpoints provided via &KPOINT_SET in the &MOMENTS section
|
||||
"C2_pbe_moment_kpset.inp" = [{matcher="BC_near_K_point", tol=1.0E+01, ref=-1050}]
|
||||
# ensure matching of Berry Curvature
|
||||
# and ensure matching of Berry Curvature
|
||||
"C2_pbe_moment_kpset.inp" = [{matcher="BC_near_K_point", tol=1.0E-01, ref=-7100}]
|
||||
# compute dipole for open shell system of monolayer CrSBr
|
||||
"CrSBr_open_shell.inp" = [{matcher="Dipole_for_CrSBr", tol=1.0E-06, ref=-1.25}]
|
||||
#EOF
|
||||
|
|
|
|||
|
|
@ -264,8 +264,11 @@ registry["M126"] = GenericMatcher(r" # Total charge ", col=5)
|
|||
registry["M127"] = GenericMatcher(r"Checksum (Acoustic Sum Rule):", col=5)
|
||||
|
||||
# Dipole moment calculated at a specific k-point (-0.375,-0.375, 0.00)
|
||||
registry["Dipole_at_kp_1"] = GenericMatcher(r" 1 1 2", col=4)
|
||||
registry["Dipole_at_kp_1"] = GenericMatcher(r" 1 1 2", col=4)
|
||||
|
||||
# Dipole moment calculated at a specific k-point (-0.375,-0.375, 0.00)
|
||||
registry["Dipole_for_CrSBr"] = GenericMatcher(r" 1 31 32", col=8)
|
||||
|
||||
# Berry curvature calculated from dipoles near K point in graphene BZ
|
||||
registry["BC_near_K_point"] = GenericMatcher(r" 1 4", col=5)
|
||||
registry["BC_near_K_point"] = GenericMatcher(r" 1 4", col=5)
|
||||
# EOF
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue