mirror of
https://github.com/cp2k/cp2k.git
synced 2026-07-28 14:15:19 -04:00
Wannier90: export SCF k-point meshes (#5179)
Co-authored-by: Thomas D. Kuehne <tkuehne@cp2k.org>
This commit is contained in:
parent
02caa0904f
commit
42dbd02aed
8 changed files with 499 additions and 49 deletions
|
|
@ -103,11 +103,14 @@ space-group-related positions.
|
|||
|
||||
## Wannier90
|
||||
|
||||
The Wannier90 interface already has its own k-point path controlled by
|
||||
`DFT%PRINT%WANNIER90%MP_GRID`. It builds and diagonalizes a full Monkhorst-Pack grid for the
|
||||
Wannier90 export. Atomic k-point symmetry from the SCF setup is not reused, because Wannier90
|
||||
expects the full mesh and its nearest-neighbour connectivity. Explicit `SCHEME GENERAL` lists and
|
||||
symmetry-reduced SCF k-point sets are therefore not exported directly to Wannier90.
|
||||
The Wannier90 interface can either keep its historical k-point path controlled by
|
||||
`DFT%PRINT%WANNIER90%MP_GRID`, or use the full SCF k-point mesh via
|
||||
`DFT%PRINT%WANNIER90%KPOINTS_SOURCE SCF`. The SCF source supports Gamma, Monkhorst-Pack, MacDonald,
|
||||
and explicit `SCHEME GENERAL` k-point meshes. If the SCF calculation used K290 or SPGLIB symmetry
|
||||
reduction, the corresponding unreduced mesh is regenerated or recovered for the Wannier90 export,
|
||||
because Wannier90 expects the full mesh and its nearest-neighbour connectivity. The Wannier90
|
||||
interface still diagonalizes the full export mesh instead of reconstructing full-mesh MO
|
||||
coefficients from the irreducible SCF orbitals.
|
||||
|
||||
## Related Pages
|
||||
|
||||
|
|
|
|||
|
|
@ -145,6 +145,7 @@ MODULE input_cp2k_print_dft
|
|||
section_release, &
|
||||
section_type
|
||||
USE input_val_types, ONLY: char_t, &
|
||||
enum_t, &
|
||||
integer_t, &
|
||||
lchar_t, &
|
||||
logical_t, &
|
||||
|
|
@ -2736,6 +2737,22 @@ CONTAINS
|
|||
CALL section_add_keyword(print_key, keyword)
|
||||
CALL keyword_release(keyword)
|
||||
|
||||
CALL keyword_create(keyword, __LOCATION__, name="KPOINTS_SOURCE", &
|
||||
description="Select the k-point source for the Wannier90 export. MP_GRID keeps "// &
|
||||
"the historical behavior and builds a full grid from WANNIER90%MP_GRID. SCF uses "// &
|
||||
"the full k-point mesh from DFT%KPOINTS for Monkhorst-Pack, MacDonald, Gamma, or "// &
|
||||
"explicit GENERAL k-points. If the SCF calculation uses K290 or SPGLIB symmetry "// &
|
||||
"reduction, the corresponding unreduced mesh is used for Wannier90 because "// &
|
||||
"Wannier90 requires a complete mesh.", &
|
||||
usage="KPOINTS_SOURCE MP_GRID", type_of_var=enum_t, &
|
||||
enum_c_vals=s2a("MP_GRID", "SCF"), &
|
||||
enum_i_vals=[0, 1], &
|
||||
enum_desc=s2a("Build the Wannier90 k-point mesh from WANNIER90%MP_GRID.", &
|
||||
"Use the full k-point mesh from DFT%KPOINTS."), &
|
||||
default_i_val=0)
|
||||
CALL section_add_keyword(print_key, keyword)
|
||||
CALL keyword_release(keyword)
|
||||
|
||||
CALL keyword_create(keyword, __LOCATION__, name="ADDED_MOS", &
|
||||
variants=["ADDED_BANDS"], &
|
||||
description="Number of MOs/Bands added to the Band Structure calculation.", &
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@ MODULE qs_wannier90
|
|||
dp
|
||||
USE kpoint_methods, ONLY: kpoint_env_initialize,&
|
||||
kpoint_init_cell_index,&
|
||||
kpoint_initialize,&
|
||||
kpoint_initialize_mo_set,&
|
||||
kpoint_initialize_mos,&
|
||||
rskp_transform
|
||||
|
|
@ -81,6 +82,8 @@ MODULE qs_wannier90
|
|||
PRIVATE
|
||||
|
||||
CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_wannier90'
|
||||
INTEGER, PARAMETER, PRIVATE :: w90_kpoints_mp_grid = 0, &
|
||||
w90_kpoints_scf = 1
|
||||
|
||||
TYPE berry_matrix_type
|
||||
TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: sinmat => NULL(), cosmat => NULL()
|
||||
|
|
@ -153,28 +156,27 @@ CONTAINS
|
|||
|
||||
CHARACTER(len=2) :: asym
|
||||
CHARACTER(len=20), ALLOCATABLE, DIMENSION(:) :: atom_symbols
|
||||
CHARACTER(len=default_string_length) :: filename, seed_name
|
||||
CHARACTER(len=default_string_length) :: filename, input_kp_scheme, seed_name
|
||||
CHARACTER(LEN=timestamp_length) :: timestamp
|
||||
INTEGER :: i, i_rep, ib, ib1, ib2, ibs, ik, ik2, ikk, ikpgr, ispin, iunit, ix, iy, iz, k, &
|
||||
n_rep, nadd, nao, nbs, nexcl, nkp, nmo, nntot, nspins, num_atoms, num_bands, &
|
||||
num_bands_tot, num_kpts, num_wann
|
||||
kpoints_source, n_rep, nadd, nao, nbs, nexcl, nkp, nmo, nntot, nspins, num_atoms, &
|
||||
num_bands, num_bands_tot, num_kpts, num_wann
|
||||
INTEGER, ALLOCATABLE, DIMENSION(:) :: exclude_bands
|
||||
INTEGER, ALLOCATABLE, DIMENSION(:, :) :: nblist, nnlist
|
||||
INTEGER, ALLOCATABLE, DIMENSION(:, :, :) :: nncell
|
||||
INTEGER, DIMENSION(2) :: kp_range
|
||||
INTEGER, DIMENSION(3) :: mp_grid
|
||||
INTEGER, DIMENSION(3) :: input_nkp_grid, mp_grid
|
||||
INTEGER, DIMENSION(:), POINTER :: invals
|
||||
INTEGER, DIMENSION(:, :, :), POINTER :: cell_to_index
|
||||
LOGICAL :: diis_step, do_kpoints, gamma_only, &
|
||||
input_kpoint_symmetry, my_kpgrp, &
|
||||
mygrp, spinors
|
||||
REAL(KIND=dp) :: cmmn, ksign, rmmn
|
||||
LOGICAL :: diis_step, do_kpoints, gamma_only, input_full_grid, input_gamma_centered, &
|
||||
input_kpoint_symmetry, mp_grid_explicit, mp_grid_valid, my_kpgrp, mygrp, spinors
|
||||
REAL(KIND=dp) :: cmmn, ksign, rmmn, wkp_ref
|
||||
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: eigval
|
||||
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: atoms_cart, b_latt, kpt_latt
|
||||
REAL(KIND=dp), DIMENSION(3) :: bvec
|
||||
REAL(KIND=dp), DIMENSION(3) :: bvec, input_kp_shift
|
||||
REAL(KIND=dp), DIMENSION(3, 3) :: real_lattice, recip_lattice
|
||||
REAL(KIND=dp), DIMENSION(:), POINTER :: eigenvalues
|
||||
REAL(KIND=dp), DIMENSION(:, :), POINTER :: xkp
|
||||
REAL(KIND=dp), DIMENSION(:), POINTER :: eigenvalues, wkp, wkp_source
|
||||
REAL(KIND=dp), DIMENSION(:, :), POINTER :: xkp, xkp_source
|
||||
TYPE(berry_matrix_type), DIMENSION(:), POINTER :: berry_matrix
|
||||
TYPE(cell_type), POINTER :: cell
|
||||
TYPE(cp_blacs_env_type), POINTER :: blacs_env
|
||||
|
|
@ -202,11 +204,11 @@ CONTAINS
|
|||
|
||||
! generate all arrays needed for the setup call
|
||||
CALL section_vals_val_get(input, "SEED_NAME", c_val=seed_name)
|
||||
CALL section_vals_val_get(input, "MP_GRID", i_vals=invals)
|
||||
CALL section_vals_val_get(input, "MP_GRID", i_vals=invals, explicit=mp_grid_explicit)
|
||||
CALL section_vals_val_get(input, "KPOINTS_SOURCE", i_val=kpoints_source)
|
||||
CALL section_vals_val_get(input, "WANNIER_FUNCTIONS", i_val=num_wann)
|
||||
CALL section_vals_val_get(input, "ADDED_MOS", i_val=nadd)
|
||||
mp_grid(1:3) = invals(1:3)
|
||||
num_kpts = mp_grid(1)*mp_grid(2)*mp_grid(3)
|
||||
! excluded bands
|
||||
CALL section_vals_val_get(input, "EXCLUDE_BANDS", n_rep_val=n_rep)
|
||||
nexcl = 0
|
||||
|
|
@ -230,35 +232,150 @@ CONTAINS
|
|||
real_lattice(1:3, 1:3) = angstrom*real_lattice(1:3, 1:3)
|
||||
recip_lattice(1:3, 1:3) = (twopi/angstrom)*TRANSPOSE(recip_lattice(1:3, 1:3))
|
||||
! k-points
|
||||
ALLOCATE (kpt_latt(3, num_kpts))
|
||||
CALL get_qs_env(qs_env, particle_set=particle_set)
|
||||
NULLIFY (kpoint, qs_kpoint)
|
||||
NULLIFY (kpoint, qs_kpoint, xkp, wkp, xkp_source, wkp_source)
|
||||
CALL get_qs_env(qs_env, do_kpoints=do_kpoints, kpoints=qs_kpoint)
|
||||
input_kpoint_symmetry = .FALSE.
|
||||
input_full_grid = .FALSE.
|
||||
input_kp_scheme = ""
|
||||
IF (do_kpoints .AND. ASSOCIATED(qs_kpoint)) THEN
|
||||
CALL get_kpoint_info(qs_kpoint, kp_scheme=input_kp_scheme, nkp_grid=input_nkp_grid, &
|
||||
kp_shift=input_kp_shift, symmetry=input_kpoint_symmetry, &
|
||||
full_grid=input_full_grid, gamma_centered=input_gamma_centered, &
|
||||
nkp=nkp, xkp=xkp, wkp=wkp)
|
||||
END IF
|
||||
CALL kpoint_create(kpoint)
|
||||
kpoint%kp_scheme = "MONKHORST-PACK"
|
||||
kpoint%symmetry = .FALSE.
|
||||
kpoint%nkp_grid(1:3) = mp_grid(1:3)
|
||||
kpoint%verbose = .FALSE.
|
||||
kpoint%full_grid = .TRUE.
|
||||
kpoint%eps_geo = 1.0e-6_dp
|
||||
kpoint%use_real_wfn = .FALSE.
|
||||
kpoint%parallel_group_size = 0
|
||||
i = 0
|
||||
DO ix = 0, mp_grid(1) - 1
|
||||
DO iy = 0, mp_grid(2) - 1
|
||||
DO iz = 0, mp_grid(3) - 1
|
||||
i = i + 1
|
||||
kpt_latt(1, i) = REAL(ix, KIND=dp)/REAL(mp_grid(1), KIND=dp)
|
||||
kpt_latt(2, i) = REAL(iy, KIND=dp)/REAL(mp_grid(2), KIND=dp)
|
||||
kpt_latt(3, i) = REAL(iz, KIND=dp)/REAL(mp_grid(3), KIND=dp)
|
||||
|
||||
SELECT CASE (kpoints_source)
|
||||
CASE (w90_kpoints_mp_grid)
|
||||
num_kpts = mp_grid(1)*mp_grid(2)*mp_grid(3)
|
||||
ALLOCATE (kpt_latt(3, num_kpts))
|
||||
kpoint%kp_scheme = "MONKHORST-PACK"
|
||||
kpoint%symmetry = .FALSE.
|
||||
kpoint%nkp_grid(1:3) = mp_grid(1:3)
|
||||
kpoint%verbose = .FALSE.
|
||||
kpoint%full_grid = .TRUE.
|
||||
kpoint%eps_geo = 1.0e-6_dp
|
||||
kpoint%use_real_wfn = .FALSE.
|
||||
kpoint%parallel_group_size = 0
|
||||
i = 0
|
||||
DO ix = 0, mp_grid(1) - 1
|
||||
DO iy = 0, mp_grid(2) - 1
|
||||
DO iz = 0, mp_grid(3) - 1
|
||||
i = i + 1
|
||||
kpt_latt(1, i) = REAL(ix, KIND=dp)/REAL(mp_grid(1), KIND=dp)
|
||||
kpt_latt(2, i) = REAL(iy, KIND=dp)/REAL(mp_grid(2), KIND=dp)
|
||||
kpt_latt(3, i) = REAL(iz, KIND=dp)/REAL(mp_grid(3), KIND=dp)
|
||||
END DO
|
||||
END DO
|
||||
END DO
|
||||
END DO
|
||||
kpoint%nkp = num_kpts
|
||||
ALLOCATE (kpoint%xkp(3, num_kpts), kpoint%wkp(num_kpts))
|
||||
kpoint%wkp(:) = 1._dp/REAL(num_kpts, KIND=dp)
|
||||
DO i = 1, num_kpts
|
||||
kpoint%xkp(1:3, i) = (angstrom/twopi)*MATMUL(recip_lattice, kpt_latt(:, i))
|
||||
END DO
|
||||
kpoint%nkp = num_kpts
|
||||
ALLOCATE (kpoint%xkp(3, num_kpts), kpoint%wkp(num_kpts))
|
||||
kpoint%wkp(:) = 1._dp/REAL(num_kpts, KIND=dp)
|
||||
DO i = 1, num_kpts
|
||||
kpoint%xkp(1:3, i) = (angstrom/twopi)*MATMUL(recip_lattice, kpt_latt(:, i))
|
||||
END DO
|
||||
|
||||
CASE (w90_kpoints_scf)
|
||||
IF (.NOT. do_kpoints .OR. .NOT. ASSOCIATED(qs_kpoint)) THEN
|
||||
CPABORT("WANNIER90%KPOINTS_SOURCE SCF requires an active DFT%KPOINTS section.")
|
||||
END IF
|
||||
SELECT CASE (TRIM(input_kp_scheme))
|
||||
CASE ("GAMMA")
|
||||
mp_grid(:) = 1
|
||||
num_kpts = 1
|
||||
ALLOCATE (kpt_latt(3, num_kpts))
|
||||
kpt_latt(1:3, 1) = 0.0_dp
|
||||
kpoint%kp_scheme = "GAMMA"
|
||||
kpoint%symmetry = .FALSE.
|
||||
kpoint%verbose = .FALSE.
|
||||
kpoint%full_grid = .TRUE.
|
||||
kpoint%eps_geo = 1.0e-6_dp
|
||||
kpoint%use_real_wfn = .FALSE.
|
||||
kpoint%parallel_group_size = 0
|
||||
kpoint%nkp = num_kpts
|
||||
ALLOCATE (kpoint%xkp(3, num_kpts), kpoint%wkp(num_kpts))
|
||||
kpoint%xkp(1:3, 1) = 0.0_dp
|
||||
kpoint%wkp(1) = 1.0_dp
|
||||
|
||||
CASE ("MONKHORST-PACK", "MACDONALD")
|
||||
mp_grid(1:3) = input_nkp_grid(1:3)
|
||||
kpoint%kp_scheme = input_kp_scheme
|
||||
kpoint%symmetry = .FALSE.
|
||||
kpoint%nkp_grid(1:3) = input_nkp_grid(1:3)
|
||||
kpoint%kp_shift(1:3) = input_kp_shift(1:3)
|
||||
kpoint%gamma_centered = input_gamma_centered
|
||||
kpoint%verbose = .FALSE.
|
||||
kpoint%full_grid = .TRUE.
|
||||
kpoint%eps_geo = 1.0e-6_dp
|
||||
kpoint%use_real_wfn = .FALSE.
|
||||
kpoint%parallel_group_size = 0
|
||||
CALL kpoint_initialize(kpoint, particle_set, cell)
|
||||
num_kpts = kpoint%nkp
|
||||
ALLOCATE (kpt_latt(3, num_kpts))
|
||||
kpt_latt(1:3, 1:num_kpts) = kpoint%xkp(1:3, 1:num_kpts)
|
||||
IF (input_kpoint_symmetry .AND. .NOT. input_full_grid .AND. iw > 0) THEN
|
||||
WRITE (iw, '(T2,A)') &
|
||||
"WANNIER90| SCF k-points are symmetry-reduced; regenerating the full SCF mesh."
|
||||
WRITE (iw, '(T2,A)') &
|
||||
"WANNIER90| The full exported mesh is diagonalized for the Wannier90 files."
|
||||
END IF
|
||||
|
||||
CASE ("GENERAL")
|
||||
IF (ASSOCIATED(qs_kpoint%xkp_input)) THEN
|
||||
xkp_source => qs_kpoint%xkp_input
|
||||
wkp_source => qs_kpoint%wkp_input
|
||||
ELSE
|
||||
xkp_source => xkp
|
||||
wkp_source => wkp
|
||||
END IF
|
||||
IF (.NOT. ASSOCIATED(xkp_source) .OR. .NOT. ASSOCIATED(wkp_source)) THEN
|
||||
CPABORT("Could not access the SCF GENERAL k-point set for the Wannier90 export.")
|
||||
END IF
|
||||
num_kpts = SIZE(wkp_source)
|
||||
ALLOCATE (kpt_latt(3, num_kpts))
|
||||
kpt_latt(1:3, 1:num_kpts) = xkp_source(1:3, 1:num_kpts)
|
||||
IF (mp_grid_explicit) THEN
|
||||
IF (mp_grid(1)*mp_grid(2)*mp_grid(3) /= num_kpts) THEN
|
||||
CPABORT("WANNIER90%MP_GRID must contain exactly as many points as the SCF GENERAL mesh.")
|
||||
END IF
|
||||
ELSE
|
||||
CALL infer_wannier_mp_grid(kpt_latt, mp_grid, mp_grid_valid)
|
||||
IF (.NOT. mp_grid_valid) THEN
|
||||
CPABORT("Could not infer WANNIER90%MP_GRID from the SCF GENERAL mesh.")
|
||||
END IF
|
||||
END IF
|
||||
wkp_ref = 1.0_dp/REAL(num_kpts, KIND=dp)
|
||||
DO i = 1, num_kpts
|
||||
IF (ABS(wkp_source(i) - wkp_ref) > 1.0e-10_dp) THEN
|
||||
CPABORT("WANNIER90%KPOINTS_SOURCE SCF requires equally weighted GENERAL k-points.")
|
||||
END IF
|
||||
END DO
|
||||
kpoint%kp_scheme = "GENERAL"
|
||||
kpoint%symmetry = .FALSE.
|
||||
kpoint%nkp_grid(1:3) = mp_grid(1:3)
|
||||
kpoint%verbose = .FALSE.
|
||||
kpoint%full_grid = .TRUE.
|
||||
kpoint%eps_geo = 1.0e-6_dp
|
||||
kpoint%use_real_wfn = .FALSE.
|
||||
kpoint%parallel_group_size = 0
|
||||
kpoint%nkp = num_kpts
|
||||
ALLOCATE (kpoint%xkp(3, num_kpts), kpoint%wkp(num_kpts))
|
||||
kpoint%xkp(1:3, 1:num_kpts) = xkp_source(1:3, 1:num_kpts)
|
||||
kpoint%wkp(1:num_kpts) = wkp_ref
|
||||
IF (input_kpoint_symmetry .AND. .NOT. input_full_grid .AND. iw > 0) THEN
|
||||
WRITE (iw, '(T2,A)') &
|
||||
"WANNIER90| SCF k-points are symmetry-reduced; using the full input GENERAL mesh."
|
||||
WRITE (iw, '(T2,A)') &
|
||||
"WANNIER90| The full exported mesh is diagonalized for the Wannier90 files."
|
||||
END IF
|
||||
|
||||
CASE DEFAULT
|
||||
CPABORT("WANNIER90%KPOINTS_SOURCE SCF does not support this DFT%KPOINTS scheme.")
|
||||
END SELECT
|
||||
CASE DEFAULT
|
||||
CPABORT("Unknown WANNIER90%KPOINTS_SOURCE setting.")
|
||||
END SELECT
|
||||
! number of bands in calculation
|
||||
CALL get_qs_env(qs_env, mos=mos)
|
||||
CALL get_mo_set(mo_set=mos(1), nao=nao, nmo=num_bands_tot)
|
||||
|
|
@ -332,12 +449,7 @@ CONTAINS
|
|||
|
||||
! calculate bands
|
||||
NULLIFY (qs_env_kp)
|
||||
CALL get_qs_env(qs_env, do_kpoints=do_kpoints, kpoints=qs_kpoint)
|
||||
input_kpoint_symmetry = .FALSE.
|
||||
IF (do_kpoints .AND. ASSOCIATED(qs_kpoint)) THEN
|
||||
CALL get_kpoint_info(qs_kpoint, symmetry=input_kpoint_symmetry)
|
||||
END IF
|
||||
IF (input_kpoint_symmetry .AND. iw > 0) THEN
|
||||
IF (kpoints_source == w90_kpoints_mp_grid .AND. input_kpoint_symmetry .AND. iw > 0) THEN
|
||||
WRITE (iw, '(T2,A)') &
|
||||
"WANNIER90| Atomic k-point symmetry from the SCF calculation is not reused."
|
||||
WRITE (iw, '(T2,A)') &
|
||||
|
|
@ -615,4 +727,75 @@ CONTAINS
|
|||
|
||||
END SUBROUTINE wannier90_files
|
||||
|
||||
! **************************************************************************************************
|
||||
!> \brief Infer a tensor-product Wannier90 mesh from explicit fractional k-point coordinates.
|
||||
!> \param kpt_latt explicit k-point coordinates in reciprocal-lattice units
|
||||
!> \param mp_grid inferred mesh dimensions
|
||||
!> \param valid true if the coordinate set is compatible with a tensor-product mesh
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE infer_wannier_mp_grid(kpt_latt, mp_grid, valid)
|
||||
REAL(KIND=dp), DIMENSION(:, :), INTENT(IN) :: kpt_latt
|
||||
INTEGER, DIMENSION(3), INTENT(OUT) :: mp_grid
|
||||
LOGICAL, INTENT(OUT) :: valid
|
||||
|
||||
INTEGER :: coord_id, i, idim, idx, n_unique, &
|
||||
num_kpts, stride, unique_id
|
||||
LOGICAL :: known
|
||||
LOGICAL, ALLOCATABLE, DIMENSION(:) :: seen
|
||||
REAL(KIND=dp) :: coord
|
||||
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: unique_coord
|
||||
|
||||
num_kpts = SIZE(kpt_latt, 2)
|
||||
mp_grid(:) = 0
|
||||
ALLOCATE (unique_coord(3, num_kpts))
|
||||
DO idim = 1, 3
|
||||
n_unique = 0
|
||||
DO i = 1, num_kpts
|
||||
coord = kpt_latt(idim, i) - FLOOR(kpt_latt(idim, i))
|
||||
IF (ABS(coord - 1.0_dp) < 1.0e-8_dp) coord = 0.0_dp
|
||||
known = .FALSE.
|
||||
DO unique_id = 1, n_unique
|
||||
IF (ABS(unique_coord(idim, unique_id) - coord) < 1.0e-8_dp) THEN
|
||||
known = .TRUE.
|
||||
EXIT
|
||||
END IF
|
||||
END DO
|
||||
IF (.NOT. known) THEN
|
||||
n_unique = n_unique + 1
|
||||
unique_coord(idim, n_unique) = coord
|
||||
END IF
|
||||
END DO
|
||||
mp_grid(idim) = n_unique
|
||||
END DO
|
||||
valid = (mp_grid(1)*mp_grid(2)*mp_grid(3) == num_kpts)
|
||||
IF (valid) THEN
|
||||
ALLOCATE (seen(num_kpts))
|
||||
seen(:) = .FALSE.
|
||||
DO i = 1, num_kpts
|
||||
idx = 1
|
||||
stride = 1
|
||||
DO idim = 1, 3
|
||||
coord = kpt_latt(idim, i) - FLOOR(kpt_latt(idim, i))
|
||||
IF (ABS(coord - 1.0_dp) < 1.0e-8_dp) coord = 0.0_dp
|
||||
coord_id = 0
|
||||
DO unique_id = 1, mp_grid(idim)
|
||||
IF (ABS(unique_coord(idim, unique_id) - coord) < 1.0e-8_dp) THEN
|
||||
coord_id = unique_id
|
||||
EXIT
|
||||
END IF
|
||||
END DO
|
||||
CPASSERT(coord_id > 0)
|
||||
idx = idx + (coord_id - 1)*stride
|
||||
stride = stride*mp_grid(idim)
|
||||
END DO
|
||||
IF (seen(idx)) valid = .FALSE.
|
||||
seen(idx) = .TRUE.
|
||||
END DO
|
||||
valid = valid .AND. ALL(seen)
|
||||
DEALLOCATE (seen)
|
||||
END IF
|
||||
DEALLOCATE (unique_coord)
|
||||
|
||||
END SUBROUTINE infer_wannier_mp_grid
|
||||
|
||||
END MODULE qs_wannier90
|
||||
|
|
|
|||
|
|
@ -19,6 +19,8 @@
|
|||
{matcher="N_special_kpoints", tol=0.0, ref=1}]
|
||||
"h_fcc_general_spglib_backend.inp" = [{matcher="E_total", tol=1e-13, ref=-4.34524388359536},
|
||||
{matcher="N_special_kpoints", tol=0.0, ref=1}]
|
||||
"h_fcc_general_wannier90_spglib.inp" = [{matcher="E_total", tol=1e-13, ref=-4.34524388359536},
|
||||
{matcher="N_special_kpoints", tol=0.0, ref=1}]
|
||||
"h_fcc_general_spglib_method_k290_backend.inp" = [{matcher="E_total", tol=1e-13, ref=-4.34524388359536},
|
||||
{matcher="N_special_kpoints", tol=0.0, ref=1}]
|
||||
"h_fcc_general_geo_opt_spglib_backend.inp" = [{matcher="E_total", tol=1e-8, ref=-4.34524388162712},
|
||||
|
|
|
|||
|
|
@ -0,0 +1,83 @@
|
|||
&GLOBAL
|
||||
PRINT_LEVEL LOW
|
||||
PROJECT H_FCC_GENERAL_WANNIER90_SPGLIB
|
||||
RUN_TYPE ENERGY
|
||||
&END GLOBAL
|
||||
|
||||
&FORCE_EVAL
|
||||
&DFT
|
||||
BASIS_SET_FILE_NAME BASIS_MOLOPT_UZH
|
||||
POTENTIAL_FILE_NAME POTENTIAL_UZH
|
||||
&KPOINTS
|
||||
EPS_SYMMETRY 1.e-8
|
||||
FULL_GRID OFF
|
||||
KPOINT -0.25 -0.25 -0.25 1.0
|
||||
KPOINT -0.25 -0.25 0.25 1.0
|
||||
KPOINT -0.25 0.25 -0.25 1.0
|
||||
KPOINT -0.25 0.25 0.25 1.0
|
||||
KPOINT 0.25 -0.25 -0.25 1.0
|
||||
KPOINT 0.25 -0.25 0.25 1.0
|
||||
KPOINT 0.25 0.25 -0.25 1.0
|
||||
KPOINT 0.25 0.25 0.25 1.0
|
||||
SCHEME GENERAL
|
||||
SYMMETRY ON
|
||||
SYMMETRY_BACKEND SPGLIB
|
||||
VERBOSE T
|
||||
WAVEFUNCTIONS COMPLEX
|
||||
&END KPOINTS
|
||||
&MGRID
|
||||
CUTOFF 100
|
||||
REL_CUTOFF 30
|
||||
&END MGRID
|
||||
&PRINT
|
||||
&WANNIER90 ON
|
||||
KPOINTS_SOURCE SCF
|
||||
SEED_NAME H_FCC_GENERAL_WANNIER90_SPGLIB
|
||||
WANNIER_FUNCTIONS 1
|
||||
&END WANNIER90
|
||||
&END PRINT
|
||||
&QS
|
||||
EPS_DEFAULT 1.0E-10
|
||||
METHOD GPW
|
||||
&END QS
|
||||
&SCF
|
||||
CHOLESKY OFF
|
||||
EPS_EIGVAL 1.e-8
|
||||
EPS_SCF 1.0E-9
|
||||
MAX_SCF 100
|
||||
SCF_GUESS ATOMIC
|
||||
&MIXING
|
||||
ALPHA 0.50
|
||||
METHOD BROYDEN_MIXING
|
||||
&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 3.56683 3.56683 3.56683
|
||||
&END CELL
|
||||
&COORD
|
||||
SCALED
|
||||
H 0.000000 0.000000 0.000000
|
||||
H 0.500000 0.500000 0.000000
|
||||
H 0.500000 0.000000 0.500000
|
||||
H 0.000000 0.500000 0.500000
|
||||
H 0.250000 0.250000 0.250000
|
||||
H 0.250000 0.750000 0.750000
|
||||
H 0.750000 0.250000 0.750000
|
||||
H 0.750000 0.750000 0.250000
|
||||
&END COORD
|
||||
&KIND H
|
||||
BASIS_SET ORB DZVP-MOLOPT-GGA-GTH-q1
|
||||
POTENTIAL GTH-GGA-q1
|
||||
&END KIND
|
||||
&END SUBSYS
|
||||
&END FORCE_EVAL
|
||||
|
|
@ -38,5 +38,9 @@
|
|||
{matcher="N_special_kpoints", tol=0.0, ref=12}]
|
||||
"h_fcc_general_k290.inp" = [{matcher="E_total", tol=1e-13, ref=-4.34524388359535},
|
||||
{matcher="N_special_kpoints", tol=0.0, ref=1}]
|
||||
"h_fcc_general_wannier90_k290.inp" = [{matcher="E_total", tol=1e-13, ref=-4.34524388359536},
|
||||
{matcher="N_special_kpoints", tol=0.0, ref=1}]
|
||||
"h_fcc_wannier90_scf_mp.inp" = [{matcher="E_total", tol=1e-13, ref=-4.34524388359536},
|
||||
{matcher="N_special_kpoints", tol=0.0, ref=1}]
|
||||
"h_tetra_c4_sym_red.inp" = [{matcher="E_total", tol=1e-8, ref=-3.95113501866984}]
|
||||
#EOF
|
||||
|
|
|
|||
83
tests/QS/regtest-kp-1/h_fcc_general_wannier90_k290.inp
Normal file
83
tests/QS/regtest-kp-1/h_fcc_general_wannier90_k290.inp
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
&GLOBAL
|
||||
PRINT_LEVEL LOW
|
||||
PROJECT H_FCC_GENERAL_WANNIER90_K290
|
||||
RUN_TYPE ENERGY
|
||||
&END GLOBAL
|
||||
|
||||
&FORCE_EVAL
|
||||
&DFT
|
||||
BASIS_SET_FILE_NAME BASIS_MOLOPT_UZH
|
||||
POTENTIAL_FILE_NAME POTENTIAL_UZH
|
||||
&KPOINTS
|
||||
EPS_SYMMETRY 1.e-8
|
||||
FULL_GRID OFF
|
||||
KPOINT -0.25 -0.25 -0.25 1.0
|
||||
KPOINT -0.25 -0.25 0.25 1.0
|
||||
KPOINT -0.25 0.25 -0.25 1.0
|
||||
KPOINT -0.25 0.25 0.25 1.0
|
||||
KPOINT 0.25 -0.25 -0.25 1.0
|
||||
KPOINT 0.25 -0.25 0.25 1.0
|
||||
KPOINT 0.25 0.25 -0.25 1.0
|
||||
KPOINT 0.25 0.25 0.25 1.0
|
||||
SCHEME GENERAL
|
||||
SYMMETRY ON
|
||||
SYMMETRY_BACKEND K290
|
||||
VERBOSE T
|
||||
WAVEFUNCTIONS COMPLEX
|
||||
&END KPOINTS
|
||||
&MGRID
|
||||
CUTOFF 100
|
||||
REL_CUTOFF 30
|
||||
&END MGRID
|
||||
&PRINT
|
||||
&WANNIER90 ON
|
||||
KPOINTS_SOURCE SCF
|
||||
SEED_NAME H_FCC_GENERAL_WANNIER90_K290
|
||||
WANNIER_FUNCTIONS 1
|
||||
&END WANNIER90
|
||||
&END PRINT
|
||||
&QS
|
||||
EPS_DEFAULT 1.0E-10
|
||||
METHOD GPW
|
||||
&END QS
|
||||
&SCF
|
||||
CHOLESKY OFF
|
||||
EPS_EIGVAL 1.e-8
|
||||
EPS_SCF 1.0E-9
|
||||
MAX_SCF 100
|
||||
SCF_GUESS ATOMIC
|
||||
&MIXING
|
||||
ALPHA 0.50
|
||||
METHOD BROYDEN_MIXING
|
||||
&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 3.56683 3.56683 3.56683
|
||||
&END CELL
|
||||
&COORD
|
||||
SCALED
|
||||
H 0.000000 0.000000 0.000000
|
||||
H 0.500000 0.500000 0.000000
|
||||
H 0.500000 0.000000 0.500000
|
||||
H 0.000000 0.500000 0.500000
|
||||
H 0.250000 0.250000 0.250000
|
||||
H 0.250000 0.750000 0.750000
|
||||
H 0.750000 0.250000 0.750000
|
||||
H 0.750000 0.750000 0.250000
|
||||
&END COORD
|
||||
&KIND H
|
||||
BASIS_SET ORB DZVP-MOLOPT-GGA-GTH-q1
|
||||
POTENTIAL GTH-GGA-q1
|
||||
&END KIND
|
||||
&END SUBSYS
|
||||
&END FORCE_EVAL
|
||||
75
tests/QS/regtest-kp-1/h_fcc_wannier90_scf_mp.inp
Normal file
75
tests/QS/regtest-kp-1/h_fcc_wannier90_scf_mp.inp
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
&GLOBAL
|
||||
PRINT_LEVEL LOW
|
||||
PROJECT H_FCC_WANNIER90_SCF_MP
|
||||
RUN_TYPE ENERGY
|
||||
&END GLOBAL
|
||||
|
||||
&FORCE_EVAL
|
||||
&DFT
|
||||
BASIS_SET_FILE_NAME BASIS_MOLOPT_UZH
|
||||
POTENTIAL_FILE_NAME POTENTIAL_UZH
|
||||
&KPOINTS
|
||||
EPS_SYMMETRY 1.e-8
|
||||
FULL_GRID OFF
|
||||
SCHEME MONKHORST-PACK 2 2 2
|
||||
SYMMETRY ON
|
||||
SYMMETRY_BACKEND K290
|
||||
VERBOSE T
|
||||
WAVEFUNCTIONS COMPLEX
|
||||
&END KPOINTS
|
||||
&MGRID
|
||||
CUTOFF 100
|
||||
REL_CUTOFF 30
|
||||
&END MGRID
|
||||
&PRINT
|
||||
&WANNIER90 ON
|
||||
KPOINTS_SOURCE SCF
|
||||
SEED_NAME H_FCC_WANNIER90_SCF_MP
|
||||
WANNIER_FUNCTIONS 1
|
||||
&END WANNIER90
|
||||
&END PRINT
|
||||
&QS
|
||||
EPS_DEFAULT 1.0E-10
|
||||
METHOD GPW
|
||||
&END QS
|
||||
&SCF
|
||||
CHOLESKY OFF
|
||||
EPS_EIGVAL 1.e-8
|
||||
EPS_SCF 1.0E-9
|
||||
MAX_SCF 100
|
||||
SCF_GUESS ATOMIC
|
||||
&MIXING
|
||||
ALPHA 0.50
|
||||
METHOD BROYDEN_MIXING
|
||||
&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 3.56683 3.56683 3.56683
|
||||
&END CELL
|
||||
&COORD
|
||||
SCALED
|
||||
H 0.000000 0.000000 0.000000
|
||||
H 0.500000 0.500000 0.000000
|
||||
H 0.500000 0.000000 0.500000
|
||||
H 0.000000 0.500000 0.500000
|
||||
H 0.250000 0.250000 0.250000
|
||||
H 0.250000 0.750000 0.750000
|
||||
H 0.750000 0.250000 0.750000
|
||||
H 0.750000 0.750000 0.250000
|
||||
&END COORD
|
||||
&KIND H
|
||||
BASIS_SET ORB DZVP-MOLOPT-GGA-GTH-q1
|
||||
POTENTIAL GTH-GGA-q1
|
||||
&END KIND
|
||||
&END SUBSYS
|
||||
&END FORCE_EVAL
|
||||
Loading…
Add table
Add a link
Reference in a new issue