28#include "./base/base_uses.f90"
35 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'cryssym'
43 LOGICAL :: symlib = .false.
44 LOGICAL :: fullgrid = .false.
47 INTEGER :: istriz = -1
48 REAL(kind=
dp) :: delta = 1.0e-8_dp
49 REAL(kind=
dp),
DIMENSION(3, 3) :: hmat = 0.0_dp
51 REAL(kind=
dp),
DIMENSION(3) :: wvk0 = 0.0_dp
52 INTEGER,
DIMENSION(3) :: mesh = 0
53 INTEGER :: nkpoint = 0
55 INTEGER,
DIMENSION(:),
ALLOCATABLE :: atype
56 REAL(kind=
dp),
DIMENSION(:, :),
ALLOCATABLE :: scoord
57 REAL(kind=
dp),
DIMENSION(:, :),
ALLOCATABLE :: xkpoint
58 REAL(kind=
dp),
DIMENSION(:),
ALLOCATABLE :: wkpoint
59 REAL(kind=
dp),
DIMENSION(:, :),
ALLOCATABLE :: kpmesh
60 INTEGER,
DIMENSION(:, :),
ALLOCATABLE :: kplink
61 INTEGER,
DIMENSION(:),
ALLOCATABLE :: kpop
63 CHARACTER(len=11) :: international_symbol =
""
64 CHARACTER(len=6) :: pointgroup_symbol =
""
65 CHARACTER(len=10) :: schoenflies =
""
66 INTEGER :: n_operations = 0
67 INTEGER,
DIMENSION(:, :, :),
ALLOCATABLE :: rotations
68 REAL(kind=
dp),
DIMENSION(:, :),
ALLOCATABLE :: translations
70 REAL(kind=
dp),
DIMENSION(3, 3, 48) :: rt = 0.0_dp
71 REAL(kind=
dp),
DIMENSION(3, 48) :: vt = 0.0_dp
72 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: f0
74 INTEGER,
DIMENSION(48) :: ibrot = 1
86 IF (
ALLOCATED(csym%rotations))
THEN
87 DEALLOCATE (csym%rotations)
89 IF (
ALLOCATED(csym%translations))
THEN
90 DEALLOCATE (csym%translations)
92 IF (
ALLOCATED(csym%atype))
THEN
93 DEALLOCATE (csym%atype)
95 IF (
ALLOCATED(csym%scoord))
THEN
96 DEALLOCATE (csym%scoord)
98 IF (
ALLOCATED(csym%xkpoint))
THEN
99 DEALLOCATE (csym%xkpoint)
101 IF (
ALLOCATED(csym%wkpoint))
THEN
102 DEALLOCATE (csym%wkpoint)
104 IF (
ALLOCATED(csym%kpmesh))
THEN
105 DEALLOCATE (csym%kpmesh)
107 IF (
ALLOCATED(csym%kplink))
THEN
108 DEALLOCATE (csym%kplink)
110 IF (
ALLOCATED(csym%kpop))
THEN
111 DEALLOCATE (csym%kpop)
113 IF (
ALLOCATED(csym%f0))
THEN
130 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: scoor
131 INTEGER,
DIMENSION(:),
INTENT(IN) :: types
132 REAL(kind=
dp),
INTENT(IN) :: hmat(3, 3)
133 REAL(kind=
dp),
INTENT(IN),
OPTIONAL :: delta
134 INTEGER,
INTENT(IN),
OPTIONAL :: iounit
136 CHARACTER(LEN=*),
PARAMETER :: routinen =
'crys_sym_gen'
138 INTEGER :: handle, ierr, major, micro, minor, nat, &
142 CALL timeset(routinen, handle)
149 IF (
PRESENT(iounit))
THEN
156 IF (
PRESENT(delta))
THEN
159 csym%delta = 1.e-6_dp
166 ALLOCATE (csym%atype(nat))
167 csym%atype(1:nat) = types(1:nat)
170 ALLOCATE (csym%scoord(3, nat))
171 csym%scoord(1:3, 1:nat) = scoor(1:3, 1:nat)
173 csym%n_operations = 0
180 CALL cp_warn(__location__,
"Symmetry library SPGLIB not available")
187 CALL cp_warn(__location__,
"Symmetry Library SPGLIB failed")
191 ALLOCATE (csym%rotations(3, 3, nop), csym%translations(3, nop))
192 csym%n_operations = nop
194 transpose(hmat), scoor, types, nat, delta)
196 csym%schoenflies =
' '
199 csym%pointgroup_symbol =
' '
202 csym%rotations, csym%n_operations)
211 CALL timestop(handle)
225 INTEGER,
INTENT(IN) :: nk(3)
226 LOGICAL,
INTENT(IN),
OPTIONAL :: symm
227 REAL(kind=
dp),
INTENT(IN),
OPTIONAL :: shift(3)
228 LOGICAL,
INTENT(IN),
OPTIONAL :: full_grid
230 CHARACTER(LEN=*),
PARAMETER :: routinen =
'kpoint_gen'
232 INTEGER :: handle, i, ik, j, nkp, nkpts
233 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: kpop, xptr
235 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: wkp
236 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: xkp
238 CALL timeset(routinen, handle)
240 IF (
PRESENT(shift))
THEN
247 IF (
PRESENT(symm))
THEN
248 IF (symm) csym%istriz = 1
251 IF (
PRESENT(full_grid))
THEN
256 csym%fullgrid = fullmesh
259 csym%mesh(1:3) = nk(1:3)
261 nkpts = nk(1)*nk(2)*nk(3)
262 ALLOCATE (xkp(3, nkpts), wkp(nkpts), kpop(nkpts))
264 ALLOCATE (csym%kplink(2, nkpts))
268 IF (csym%symlib)
THEN
272 CALL full_grid_gen(nk, xkp, wkp, shift)
273 IF (csym%istriz == 1)
THEN
275 CALL inversion_symm(xkp, wkp, csym%kplink(1, :))
279 ELSE IF (csym%istriz /= 1)
THEN
281 CALL full_grid_gen(nk, xkp, wkp, shift)
282 CALL inversion_symm(xkp, wkp, csym%kplink(1, :))
285 IF (sum(abs(csym%wvk0)) /= 0.0_dp)
THEN
286 CALL cp_abort(__location__,
"MacDonald shifted k-point meshes are only "// &
287 "possible without symmetrization.")
290 CALL full_grid_gen(nk, xkp, wkp, shift)
291 CALL kp_symmetry(csym, xkp, wkp, kpop)
296 CALL full_grid_gen(nk, xkp, wkp, shift)
297 IF (csym%istriz /= 1 .AND. fullmesh)
THEN
300 csym%kplink(1, i) = i
304 CALL inversion_symm(xkp, wkp, csym%kplink(1, :))
310 IF (wkp(i) > 0.0_dp) nkp = nkp + 1
315 ALLOCATE (csym%xkpoint(3, nkp), csym%wkpoint(nkp))
319 IF (wkp(ik) > 0.0_dp)
THEN
321 csym%wkpoint(j) = wkp(ik)
322 csym%xkpoint(1:3, j) = xkp(1:3, ik)
329 ALLOCATE (csym%kpmesh(3, nkpts))
330 csym%kpmesh(1:3, 1:nkpts) = xkp(1:3, 1:nkpts)
334 i = csym%kplink(1, ik)
336 IF (i == xptr(j))
THEN
337 csym%kplink(2, ik) = j
345 ALLOCATE (csym%kpop(nkpts))
346 IF (csym%symlib .AND. csym%istriz == 1 .AND. .NOT. fullmesh)
THEN
348 csym%kpop(1:nkpts) = kpop(1:nkpts)
350 cpassert(csym%kpop(ik) /= 0)
355 IF (wkp(ik) > 0.0_dp)
THEN
363 DEALLOCATE (xkp, wkp, kpop)
365 CALL timestop(handle)
376 SUBROUTINE kp_symmetry(csym, xkp, wkp, kpop)
378 REAL(kind=
dp),
DIMENSION(:, :) :: xkp
379 REAL(kind=
dp),
DIMENSION(:) :: wkp
380 INTEGER,
DIMENSION(:) :: kpop
382 INTEGER :: i, ihc, ihg, ik, indpg, iou, iq1, iq2, &
383 iq3, istriz, isy, itoj, j, kr, li, lr, &
384 nat, nc, nhash, nkm, nkp, nkpoint, &
386 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: includ, isc,
list, lwght, ty
387 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: f0, lrot
388 INTEGER,
DIMENSION(48) :: ib
389 REAL(kind=
dp) :: alat
390 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: rlist, rx, tvec, wvkl, xkapa
391 REAL(kind=
dp),
DIMENSION(3) :: a1, a2, a3, b1, b2, b3, origin, rr, wvk0
392 REAL(kind=
dp),
DIMENSION(3, 3) :: hmat, strain
393 REAL(kind=
dp),
DIMENSION(3, 3, 48) :: r
394 REAL(kind=
dp),
DIMENSION(3, 48) :: vt
402 nkpoint = 10*iq1*iq2*iq3
403 nkpoint = 2*max(iq1, iq2, iq3)**3
406 a1(1:3) = hmat(1:3, 1)
407 a2(1:3) = hmat(1:3, 2)
408 a3(1:3) = hmat(1:3, 3)
411 ALLOCATE (xkapa(3, nat), rx(3, nat), tvec(3, 200), ty(nat), isc(nat), f0(49, nat))
412 ty(1:nat) = csym%atype(1:nat)
415 xkapa(1:3, i) = matmul(hmat, csym%scoord(1:3, i))
418 ALLOCATE (wvkl(3, nkpoint), rlist(3, nkpoint), includ(nkpoint),
list(nhash + nkpoint))
419 ALLOCATE (lrot(48, nkpoint), lwght(nkpoint))
422 WRITE (iou,
'(/,(T2,A79))') &
423 "*******************************************************************************", &
424 "** Special K-Point Generation by K290 **", &
425 "*******************************************************************************"
428 CALL k290s(iou, nat, nkpoint, nsp, iq1, iq2, iq3, istriz, &
429 a1, a2, a3, alat, strain, xkapa, rx, tvec, &
430 ty, isc, f0, ntvec, wvk0, wvkl, lwght, lrot, &
431 nhash, includ,
list, rlist, csym%delta)
433 CALL group1s(0, a1, a2, a3, nat, ty, xkapa, b1, b2, b3, &
434 ihg, ihc, isy, li, nc, indpg, ib, ntvec, &
435 vt, f0, r, tvec, origin, rx, isc, csym%delta)
438 WRITE (iou,
'((T2,A79))') &
439 "*******************************************************************************", &
440 "** Finished K290 **", &
441 "*******************************************************************************"
447 ALLOCATE (csym%f0(nat, nc))
449 csym%f0(1:nat, i) = f0(i, 1:nat)
452 csym%ibrot(1:nc) = ib(1:nc)
458 IF (lwght(i) == 0)
EXIT
465 wvk0(1:3) = xkp(1:3, j) - wvkl(1:3, i)
466 IF (all(abs(wvk0(1:3)) < 1.e-12_dp))
THEN
474 rr(1:3) = kp_apply_operation(wvkl(1:3, i), r(1:3, 1:3, abs(kr)))
475 IF (kr < 0) rr(1:3) = -rr(1:3)
477 wvk0(1:3) = xkp(1:3, j) - rr(1:3)
478 IF (all(abs(wvk0(1:3)) < 1.e-12_dp))
THEN
479 csym%kplink(1, j) = itoj
486 DEALLOCATE (xkapa, rx, tvec, ty, isc, f0)
487 DEALLOCATE (wvkl, rlist, includ,
list)
488 DEALLOCATE (lrot, lwght)
490 END SUBROUTINE kp_symmetry
498 SUBROUTINE full_grid_gen(nk, xkp, wkp, shift)
499 INTEGER,
INTENT(IN) :: nk(3)
500 REAL(kind=
dp),
DIMENSION(:, :) :: xkp
501 REAL(kind=
dp),
DIMENSION(:) :: wkp
502 REAL(kind=
dp),
INTENT(IN) :: shift(3)
504 INTEGER :: i, ix, iy, iz
505 REAL(kind=
dp) :: kpt_latt(3)
513 kpt_latt(1) = real(2*ix - nk(1) - 1, kind=
dp)/(2._dp*real(nk(1), kind=
dp))
514 kpt_latt(2) = real(2*iy - nk(2) - 1, kind=
dp)/(2._dp*real(nk(2), kind=
dp))
515 kpt_latt(3) = real(2*iz - nk(3) - 1, kind=
dp)/(2._dp*real(nk(3), kind=
dp))
516 xkp(1:3, i) = kpt_latt(1:3)
521 DO i = 1, nk(1)*nk(2)*nk(3)
522 xkp(1:3, i) = xkp(1:3, i) + shift(1:3)
525 END SUBROUTINE full_grid_gen
533 SUBROUTINE inversion_symm(xkp, wkp, link)
534 REAL(kind=
dp),
DIMENSION(:, :) :: xkp
535 REAL(kind=
dp),
DIMENSION(:) :: wkp
536 INTEGER,
DIMENSION(:) :: link
538 INTEGER :: i, j, nkpts
544 IF (link(i) == 0) link(i) = i
546 IF (wkp(j) == 0) cycle
547 IF (all(xkp(:, i) == -xkp(:, j)))
THEN
548 wkp(i) = wkp(i) + wkp(j)
556 END SUBROUTINE inversion_symm
564 FUNCTION kp_apply_operation(x, r)
RESULT(y)
565 REAL(kind=
dp),
INTENT(IN) :: x(3), r(3, 3)
566 REAL(kind=
dp) :: y(3)
568 y(1) = r(1, 1)*x(1) + r(1, 2)*x(2) + r(1, 3)*x(3)
569 y(2) = r(2, 1)*x(1) + r(2, 2)*x(2) + r(2, 3)*x(3)
570 y(3) = r(3, 1)*x(1) + r(3, 2)*x(2) + r(3, 3)*x(3)
572 END FUNCTION kp_apply_operation
581 INTEGER :: i, iunit, j, plevel
586 WRITE (iunit,
"(/,T2,A)")
"Crystal Symmetry Information"
587 IF (csym%symlib)
THEN
588 WRITE (iunit,
'(A,T71,A10)')
" International Symbol: ", adjustr(trim(csym%international_symbol))
589 WRITE (iunit,
'(A,T71,A10)')
" Point Group Symbol: ", adjustr(trim(csym%pointgroup_symbol))
590 WRITE (iunit,
'(A,T71,A10)')
" Schoenflies Symbol: ", adjustr(trim(csym%schoenflies))
592 WRITE (iunit,
'(A,T71,I10)')
" Number of Symmetry Operations: ", csym%n_operations
594 DO i = 1, csym%n_operations
595 WRITE (iunit,
'(A,i4,T51,3I10,/,T51,3I10,/,T51,3I10)') &
596 " Rotation #: ", i, (csym%rotations(j, :, i), j=1, 3)
597 WRITE (iunit,
'(T36,3F15.7)') csym%translations(:, i)
601 WRITE (iunit,
"(T2,A)")
"SPGLIB for Crystal Symmetry Information determination is not availale"
614 INTEGER :: i, iunit, nat, plevel
619 WRITE (iunit,
"(/,T2,A)")
"K-point Symmetry Information"
620 WRITE (iunit,
'(A,T67,I14)')
" Number of Special K-points: ", csym%nkpoint
621 WRITE (iunit,
'(T19,A,T74,A)')
" Wavevector Basis ",
" Weight"
622 DO i = 1, csym%nkpoint
623 WRITE (iunit,
'(T2,i10,3F10.5,T71,I10)') i, csym%xkpoint(1:3, i), nint(csym%wkpoint(i))
625 WRITE (iunit,
'(/,A,T63,3I6)')
" K-point Mesh: ", csym%mesh(1), csym%mesh(2), csym%mesh(3)
626 WRITE (iunit,
'(T19,A,T54,A)')
" Wavevector Basis ",
" Special Points Rotation"
627 DO i = 1, csym%mesh(1)*csym%mesh(2)*csym%mesh(3)
628 WRITE (iunit,
'(T2,i10,3F10.5,T45,3I12)') i, csym%kpmesh(1:3, i), &
629 csym%kplink(1:2, i), csym%kpop(i)
631 IF (csym%nrtot > 0)
THEN
632 WRITE (iunit,
'(/,A)')
" Atom Transformation Table"
633 nat =
SIZE(csym%f0, 1)
635 WRITE (iunit,
'(T10,A,I3,(T21,12I5))')
" Rot=", csym%ibrot(i), csym%f0(1:nat, i)
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public togo2018
K-points and crystal symmetry routines.
subroutine, public print_crys_symmetry(csym)
...
subroutine, public crys_sym_gen(csym, scoor, types, hmat, delta, iounit)
...
subroutine, public release_csym_type(csym)
Release the CSYM type.
subroutine, public kpoint_gen(csym, nk, symm, shift, full_grid)
...
subroutine, public print_kp_symmetry(csym)
...
Defines the basic variable types.
integer, parameter, public dp
K-points and crystal symmetry routines based on.
subroutine, public k290s(iout, nat, nkpoint, nsp, iq1, iq2, iq3, istriz, a1, a2, a3, alat, strain, xkapa, rx, tvec, ty, isc, f0, ntvec, wvk0, wvkl, lwght, lrot, nhash, includ, list, rlist, delta)
...
subroutine, public group1s(iout, a1, a2, a3, nat, ty, x, b1, b2, b3, ihg, ihc, isy, li, nc, indpg, ib, ntvec, v, f0, r, tvec, origin, rx, isc, delta)
...
An array-based list which grows on demand. When the internal array is full, a new array of twice the ...
Interface for SPGLIB symmetry routines.
integer function, public spg_get_international(symbol, lattice, position, types, num_atom, symprec)
...
integer function, public spg_get_multiplicity(lattice, position, types, num_atom, symprec)
...
integer function, public spg_get_micro_version()
...
integer function, public spg_get_minor_version()
...
integer function, public spg_get_major_version()
...
integer function, public spg_get_pointgroup(symbol, trans_mat, rotations, num_rotations)
...
integer function, public spg_get_symmetry(rotation, translation, max_size, lattice, position, types, num_atom, symprec)
...
integer function, public spg_get_schoenflies(symbol, lattice, position, types, num_atom, symprec)
...
Utilities for string manipulations.
elemental subroutine, public strip_control_codes(string)
Strip control codes and extended characters from a string, i.e. replace them with blanks.