(git:34ef472)
cryssym.F
Go to the documentation of this file.
1 !--------------------------------------------------------------------------------------------------!
2 ! CP2K: A general program to perform molecular dynamics simulations !
3 ! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4 ! !
5 ! SPDX-License-Identifier: GPL-2.0-or-later !
6 !--------------------------------------------------------------------------------------------------!
7 
8 ! **************************************************************************************************
9 !> \brief K-points and crystal symmetry routines
10 !> \author jgh
11 ! **************************************************************************************************
12 MODULE cryssym
13 
14  USE bibliography, ONLY: togo2018,&
15  cite_reference
16  USE kinds, ONLY: dp
17  USE spglib_f08, ONLY: &
22 #include "./base/base_uses.f90"
23 
24  IMPLICIT NONE
25  PRIVATE
28 
29  CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'cryssym'
30 
31 ! **************************************************************************************************
32 !> \brief CSM type
33 !> \par Content:
34 !>
35 ! **************************************************************************************************
36  TYPE csym_type
37  LOGICAL :: symlib = .false.
38  LOGICAL :: fullgrid = .false.
39  INTEGER :: plevel = 0
40  INTEGER :: punit = -1
41  INTEGER :: istriz = -1
42  REAL(KIND=dp) :: delta = 1.0e-8_dp
43  REAL(KIND=dp), DIMENSION(3, 3) :: hmat = 0.0_dp
44  ! KPOINTS
45  REAL(KIND=dp), DIMENSION(3) :: wvk0 = 0.0_dp
46  INTEGER, DIMENSION(3) :: mesh = 0
47  INTEGER :: nkpoint = 0
48  INTEGER :: nat = 0
49  INTEGER, DIMENSION(:), ALLOCATABLE :: atype
50  REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE :: scoord
51  REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE :: xkpoint
52  REAL(KIND=dp), DIMENSION(:), ALLOCATABLE :: wkpoint
53  REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE :: kpmesh
54  INTEGER, DIMENSION(:, :), ALLOCATABLE :: kplink
55  INTEGER, DIMENSION(:), ALLOCATABLE :: kpop
56  !SPGLIB
57  CHARACTER(len=11) :: international_symbol = ""
58  CHARACTER(len=6) :: pointgroup_symbol = ""
59  CHARACTER(len=10) :: schoenflies = ""
60  INTEGER :: n_operations = 0
61  INTEGER, DIMENSION(:, :, :), ALLOCATABLE :: rotations
62  REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE :: translations
63  END TYPE csym_type
64 
65 CONTAINS
66 
67 ! **************************************************************************************************
68 !> \brief Release the CSYM type
69 !> \param csym The CSYM type
70 ! **************************************************************************************************
71  SUBROUTINE release_csym_type(csym)
72  TYPE(csym_type) :: csym
73 
74  IF (ALLOCATED(csym%rotations)) THEN
75  DEALLOCATE (csym%rotations)
76  END IF
77  IF (ALLOCATED(csym%translations)) THEN
78  DEALLOCATE (csym%translations)
79  END IF
80  IF (ALLOCATED(csym%atype)) THEN
81  DEALLOCATE (csym%atype)
82  END IF
83  IF (ALLOCATED(csym%scoord)) THEN
84  DEALLOCATE (csym%scoord)
85  END IF
86  IF (ALLOCATED(csym%xkpoint)) THEN
87  DEALLOCATE (csym%xkpoint)
88  END IF
89  IF (ALLOCATED(csym%wkpoint)) THEN
90  DEALLOCATE (csym%wkpoint)
91  END IF
92  IF (ALLOCATED(csym%kpmesh)) THEN
93  DEALLOCATE (csym%kpmesh)
94  END IF
95  IF (ALLOCATED(csym%kplink)) THEN
96  DEALLOCATE (csym%kplink)
97  END IF
98  IF (ALLOCATED(csym%kpop)) THEN
99  DEALLOCATE (csym%kpop)
100  END IF
101 
102  END SUBROUTINE release_csym_type
103 
104 ! **************************************************************************************************
105 !> \brief ...
106 !> \param csym ...
107 !> \param scoor ...
108 !> \param types ...
109 !> \param hmat ...
110 !> \param delta ...
111 !> \param iounit ...
112 ! **************************************************************************************************
113  SUBROUTINE crys_sym_gen(csym, scoor, types, hmat, delta, iounit)
114  TYPE(csym_type) :: csym
115  REAL(kind=dp), DIMENSION(:, :), INTENT(IN) :: scoor
116  INTEGER, DIMENSION(:), INTENT(IN) :: types
117  REAL(kind=dp), INTENT(IN) :: hmat(3, 3)
118  REAL(kind=dp), INTENT(IN), OPTIONAL :: delta
119  INTEGER, INTENT(IN), OPTIONAL :: iounit
120 
121  CHARACTER(LEN=*), PARAMETER :: routinen = 'crys_sym_gen'
122 
123  INTEGER :: handle, ierr, major, micro, minor, nat, &
124  nop, tra_mat(3, 3)
125  LOGICAL :: spglib
126 
127  CALL timeset(routinen, handle)
128 
129  !..total number of atoms
130  nat = SIZE(scoor, 2)
131  csym%nat = nat
132 
133  ! output unit
134  IF (PRESENT(iounit)) THEN
135  csym%punit = iounit
136  ELSE
137  csym%punit = -1
138  END IF
139 
140  ! accuracy for symmetry
141  IF (PRESENT(delta)) THEN
142  csym%delta = delta
143  ELSE
144  csym%delta = 1.e-6_dp
145  END IF
146 
147  !..set cell values
148  csym%hmat = hmat
149 
150  ! atom types
151  ALLOCATE (csym%atype(nat))
152  csym%atype(1:nat) = types(1:nat)
153 
154  ! scaled coordinates
155  ALLOCATE (csym%scoord(3, nat))
156  csym%scoord(1:3, 1:nat) = scoor(1:3, 1:nat)
157 
158  csym%n_operations = 0
159 
160  !..try spglib
161  major = spg_get_major_version()
162  minor = spg_get_minor_version()
163  micro = spg_get_micro_version()
164  IF (major == 0) THEN
165  CALL cp_warn(__location__, "Symmetry library SPGLIB not available")
166  spglib = .false.
167  ELSE
168  spglib = .true.
169  CALL cite_reference(togo2018)
170  ierr = spg_get_international(csym%international_symbol, transpose(hmat), scoor, types, nat, delta)
171  IF (ierr == 0) THEN
172  CALL cp_warn(__location__, "Symmetry Library SPGLIB failed")
173  spglib = .false.
174  ELSE
175  nop = spg_get_multiplicity(transpose(hmat), scoor, types, nat, delta)
176  ALLOCATE (csym%rotations(3, 3, nop), csym%translations(3, nop))
177  csym%n_operations = nop
178  ierr = spg_get_symmetry(csym%rotations, csym%translations, nop, &
179  transpose(hmat), scoor, types, nat, delta)
180  ! Schoenflies Symbol
181  csym%schoenflies = ' '
182  ierr = spg_get_schoenflies(csym%schoenflies, transpose(hmat), scoor, types, nat, delta)
183  ! Point Group
184  csym%pointgroup_symbol = ' '
185  tra_mat = 0
186  ierr = spg_get_pointgroup(csym%pointgroup_symbol, tra_mat, &
187  csym%rotations, csym%n_operations)
188 
189  CALL strip_control_codes(csym%international_symbol)
190  CALL strip_control_codes(csym%schoenflies)
191  CALL strip_control_codes(csym%pointgroup_symbol)
192  END IF
193  END IF
194  csym%symlib = spglib
195 
196  CALL timestop(handle)
197 
198  END SUBROUTINE crys_sym_gen
199 
200 ! **************************************************************************************************
201 !> \brief ...
202 !> \param csym ...
203 !> \param nk ...
204 !> \param symm ...
205 !> \param shift ...
206 !> \param full_grid ...
207 ! **************************************************************************************************
208  SUBROUTINE kpoint_gen(csym, nk, symm, shift, full_grid)
209  TYPE(csym_type) :: csym
210  INTEGER, INTENT(IN) :: nk(3)
211  LOGICAL, INTENT(IN), OPTIONAL :: symm
212  REAL(kind=dp), INTENT(IN), OPTIONAL :: shift(3)
213  LOGICAL, INTENT(IN), OPTIONAL :: full_grid
214 
215  CHARACTER(LEN=*), PARAMETER :: routinen = 'kpoint_gen'
216 
217  INTEGER :: handle, i, ik, is_shift(3), &
218  is_time_reversal, j, nkp, nkpts
219  INTEGER, ALLOCATABLE, DIMENSION(:) :: iwkp, xptr
220  INTEGER, ALLOCATABLE, DIMENSION(:, :) :: ixkp
221  LOGICAL :: fullmesh
222  REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: wkp
223  REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: xkp
224  REAL(kind=dp), DIMENSION(3) :: rxkp
225 
226  CALL timeset(routinen, handle)
227 
228  IF (PRESENT(shift)) THEN
229  csym%wvk0 = shift
230  ELSE
231  csym%wvk0 = 0.0_dp
232  END IF
233 
234  csym%istriz = -1
235  IF (PRESENT(symm)) THEN
236  IF (symm) csym%istriz = 1
237  END IF
238 
239  IF (PRESENT(full_grid)) THEN
240  fullmesh = full_grid
241  ELSE
242  fullmesh = .false.
243  END IF
244  csym%fullgrid = fullmesh
245 
246  csym%nkpoint = 0
247  csym%mesh(1:3) = nk(1:3)
248 
249  nkpts = nk(1)*nk(2)*nk(3)
250  ALLOCATE (xkp(3, nkpts), wkp(nkpts))
251  ! kp: link
252  ALLOCATE (csym%kplink(2, nkpts))
253  csym%kplink = 0
254 
255  ! go through all the options
256  IF (csym%symlib) THEN
257  ! symmetry library is available
258  IF (fullmesh) THEN
259  ! full mesh requested
260  CALL full_grid_gen(nk, xkp, wkp, shift)
261  IF (csym%istriz == 1) THEN
262  ! use inversion symmetry
263  CALL inversion_symm(xkp, wkp, csym%kplink(1, :))
264  ELSE
265  ! full kpoint mesh is used
266  END IF
267  ELSE IF (csym%istriz /= 1) THEN
268  ! use inversion symmetry
269  CALL full_grid_gen(nk, xkp, wkp, shift)
270  CALL inversion_symm(xkp, wkp, csym%kplink(1, :))
271  ELSE
272  ! use symmetry library to reduce k-points
273  IF (sum(abs(csym%wvk0)) /= 0.0_dp) THEN
274  CALL cp_abort(__location__, "MacDonald shifted k-point meshes are only "// &
275  "possible without symmetrization.")
276  END IF
277  ALLOCATE (ixkp(3, nkpts), iwkp(nkpts))
278  is_shift(1:3) = mod(nk(1:3) + 1, 2)
279  is_time_reversal = 1
280  nkp = spg_get_ir_reciprocal_mesh(ixkp, iwkp, nk, is_shift, is_time_reversal, &
281  transpose(csym%hmat), csym%scoord, csym%atype, &
282  csym%nat, csym%delta)
283  wkp = 0.0_dp
284  DO i = 1, nkpts
285  xkp(:, i) = real(is_shift + 2*ixkp(:, i), kind=dp)/real(2*nk(:), kind=dp)
286  j = iwkp(i) + 1
287  wkp(j) = wkp(j) + 1.0_dp
288  END DO
289  csym%kplink(1, 1:nkpts) = iwkp(1:nkpts) + 1
290  DEALLOCATE (ixkp, iwkp)
291  END IF
292  ELSE
293  ! no symmetry library is available
294  CALL full_grid_gen(nk, xkp, wkp, shift)
295  IF (csym%istriz /= 1 .AND. fullmesh) THEN
296  ! full kpoint mesh is used
297  DO i = 1, nkpts
298  csym%kplink(1, i) = i
299  END DO
300  ELSE
301  ! use inversion symmetry
302  CALL inversion_symm(xkp, wkp, csym%kplink(1, :))
303  END IF
304  END IF
305  ! count kpoints
306  nkp = 0
307  DO i = 1, nkpts
308  IF (wkp(i) > 0.0_dp) nkp = nkp + 1
309  END DO
310 
311  ! store reduced kpoint set
312  csym%nkpoint = nkp
313  ALLOCATE (csym%xkpoint(3, nkp), csym%wkpoint(nkp))
314  ALLOCATE (xptr(nkp))
315  j = 0
316  DO ik = 1, nkpts
317  IF (wkp(ik) > 0.0_dp) THEN
318  j = j + 1
319  csym%wkpoint(j) = wkp(ik)
320  csym%xkpoint(1:3, j) = xkp(1:3, ik)
321  xptr(j) = ik
322  END IF
323  END DO
324  cpassert(j == nkp)
325 
326  ! kp: mesh
327  ALLOCATE (csym%kpmesh(3, nkpts))
328  csym%kpmesh(1:3, 1:nkpts) = xkp(1:3, 1:nkpts)
329 
330  ! kp: link
331  DO ik = 1, nkpts
332  i = csym%kplink(1, ik)
333  DO j = 1, nkp
334  IF (i == xptr(j)) THEN
335  csym%kplink(2, ik) = j
336  EXIT
337  END IF
338  END DO
339  END DO
340  DEALLOCATE (xptr)
341 
342  ! kp: operations
343  ALLOCATE (csym%kpop(nkpts))
344  IF (csym%symlib .AND. csym%istriz == 1 .AND. .NOT. fullmesh) THEN
345  ! atomic symmetry operations possible
346  DO ik = 1, nkpts
347  IF (wkp(ik) > 0.0_dp) THEN
348  csym%kpop(ik) = 1
349  ELSE
350  csym%kpop(ik) = 0
351  j = csym%kplink(2, ik)
352  DO i = 1, csym%n_operations
353  IF (sum(abs(csym%translations(:, i))) > 1.e-10_dp) cycle
354  rxkp(1:3) = kp_apply_operation(csym%xkpoint(1:3, j), csym%rotations(:, :, i))
355  rxkp(1:3) = abs(xkp(1:3, ik) - rxkp(1:3))
356  rxkp(1:3) = rxkp(1:3) - real(nint(rxkp(1:3)), kind=dp)
357  IF (all((rxkp(1:3)) < 1.e-12_dp)) THEN
358  csym%kpop(ik) = i
359  EXIT
360  END IF
361  END DO
362  cpassert(csym%kpop(ik) /= 0)
363  END IF
364  END DO
365  ELSE
366  ! only time reversal symmetry
367  DO ik = 1, nkpts
368  IF (wkp(ik) > 0.0_dp) THEN
369  csym%kpop(ik) = 1
370  ELSE
371  csym%kpop(ik) = 2
372  END IF
373  END DO
374  END IF
375 
376  DEALLOCATE (xkp, wkp)
377 
378  CALL timestop(handle)
379 
380  END SUBROUTINE kpoint_gen
381 
382 ! **************************************************************************************************
383 !> \brief ...
384 !> \param nk ...
385 !> \param xkp ...
386 !> \param wkp ...
387 !> \param shift ...
388 ! **************************************************************************************************
389  SUBROUTINE full_grid_gen(nk, xkp, wkp, shift)
390  INTEGER, INTENT(IN) :: nk(3)
391  REAL(kind=dp), DIMENSION(:, :) :: xkp
392  REAL(kind=dp), DIMENSION(:) :: wkp
393  REAL(kind=dp), INTENT(IN) :: shift(3)
394 
395  INTEGER :: i, ix, iy, iz
396  REAL(kind=dp) :: kpt_latt(3)
397 
398  wkp = 0.0_dp
399  i = 0
400  DO ix = 1, nk(1)
401  DO iy = 1, nk(2)
402  DO iz = 1, nk(3)
403  i = i + 1
404  kpt_latt(1) = real(2*ix - nk(1) - 1, kind=dp)/(2._dp*real(nk(1), kind=dp))
405  kpt_latt(2) = real(2*iy - nk(2) - 1, kind=dp)/(2._dp*real(nk(2), kind=dp))
406  kpt_latt(3) = real(2*iz - nk(3) - 1, kind=dp)/(2._dp*real(nk(3), kind=dp))
407  xkp(1:3, i) = kpt_latt(1:3)
408  wkp(i) = 1.0_dp
409  END DO
410  END DO
411  END DO
412  DO i = 1, nk(1)*nk(2)*nk(3)
413  xkp(1:3, i) = xkp(1:3, i) + shift(1:3)
414  END DO
415 
416  END SUBROUTINE full_grid_gen
417 
418 ! **************************************************************************************************
419 !> \brief ...
420 !> \param xkp ...
421 !> \param wkp ...
422 !> \param link ...
423 ! **************************************************************************************************
424  SUBROUTINE inversion_symm(xkp, wkp, link)
425  REAL(kind=dp), DIMENSION(:, :) :: xkp
426  REAL(kind=dp), DIMENSION(:) :: wkp
427  INTEGER, DIMENSION(:) :: link
428 
429  INTEGER :: i, j, nkpts
430 
431  nkpts = SIZE(wkp, 1)
432 
433  link(:) = 0
434  DO i = 1, nkpts
435  IF (link(i) == 0) link(i) = i
436  DO j = i + 1, nkpts
437  IF (wkp(j) == 0) cycle
438  IF (all(xkp(:, i) == -xkp(:, j))) THEN
439  wkp(i) = wkp(i) + wkp(j)
440  wkp(j) = 0.0_dp
441  link(j) = i
442  EXIT
443  END IF
444  END DO
445  END DO
446 
447  END SUBROUTINE inversion_symm
448 
449 ! **************************************************************************************************
450 !> \brief ...
451 !> \param x ...
452 !> \param r ...
453 !> \return ...
454 ! **************************************************************************************************
455  FUNCTION kp_apply_operation(x, r) RESULT(y)
456  REAL(kind=dp), INTENT(IN) :: x(3)
457  INTEGER, INTENT(IN) :: r(3, 3)
458  REAL(kind=dp) :: y(3)
459 
460  y(1) = real(r(1, 1), dp)*x(1) + real(r(1, 2), dp)*x(2) + real(r(1, 3), dp)*x(3)
461  y(2) = real(r(2, 1), dp)*x(1) + real(r(2, 2), dp)*x(2) + real(r(2, 3), dp)*x(3)
462  y(3) = real(r(3, 1), dp)*x(1) + real(r(3, 2), dp)*x(2) + real(r(3, 3), dp)*x(3)
463 
464  END FUNCTION kp_apply_operation
465 
466 ! **************************************************************************************************
467 !> \brief ...
468 !> \param f0 ...
469 !> \param csym ...
470 !> \param ir ...
471 ! **************************************************************************************************
472  SUBROUTINE apply_rotation_coord(f0, csym, ir)
473  INTEGER, DIMENSION(:), INTENT(INOUT) :: f0
474  TYPE(csym_type) :: csym
475  INTEGER, INTENT(IN) :: ir
476 
477  INTEGER :: ia, ib, natom
478  REAL(kind=dp) :: diff
479  REAL(kind=dp), DIMENSION(3) :: rb, ri, ro, tr
480  REAL(kind=dp), DIMENSION(3, 3) :: rot
481 
482  natom = csym%nat
483  rot(1:3, 1:3) = csym%rotations(1:3, 1:3, ir)
484  tr(1:3) = csym%translations(1:3, ir)
485 
486  f0 = 0
487  DO ia = 1, natom
488  ri(1:3) = csym%scoord(1:3, ia)
489  ro(1) = real(rot(1, 1), dp)*ri(1) + real(rot(2, 1), dp)*ri(2) + real(rot(3, 1), dp)*ri(3) + tr(1)
490  ro(2) = real(rot(1, 2), dp)*ri(1) + real(rot(2, 2), dp)*ri(2) + real(rot(3, 2), dp)*ri(3) + tr(2)
491  ro(3) = real(rot(1, 3), dp)*ri(1) + real(rot(2, 3), dp)*ri(2) + real(rot(3, 3), dp)*ri(3) + tr(3)
492  DO ib = 1, natom
493  rb(1:3) = csym%scoord(1:3, ib)
494  diff = sqrt(sum((ri(:) - rb(:))**2))
495  IF (diff < csym%delta) THEN
496  f0(ia) = ib
497  EXIT
498  END IF
499  END DO
500  cpassert(f0(ia) /= 0)
501  END DO
502 
503  END SUBROUTINE apply_rotation_coord
504 
505 ! **************************************************************************************************
506 !> \brief ...
507 !> \param csym ...
508 ! **************************************************************************************************
509  SUBROUTINE print_crys_symmetry(csym)
510  TYPE(csym_type) :: csym
511 
512  INTEGER :: i, iunit, j, plevel
513 
514  iunit = csym%punit
515  IF (iunit >= 0) THEN
516  plevel = csym%plevel
517  WRITE (iunit, "(/,T2,A)") "Crystal Symmetry Information"
518  IF (csym%symlib) THEN
519  WRITE (iunit, '(A,T71,A10)') " International Symbol: ", adjustr(trim(csym%international_symbol))
520  WRITE (iunit, '(A,T71,A10)') " Point Group Symbol: ", adjustr(trim(csym%pointgroup_symbol))
521  WRITE (iunit, '(A,T71,A10)') " Schoenflies Symbol: ", adjustr(trim(csym%schoenflies))
522  !
523  WRITE (iunit, '(A,T71,I10)') " Number of Symmetry Operations: ", csym%n_operations
524  IF (plevel > 0) THEN
525  DO i = 1, csym%n_operations
526  WRITE (iunit, '(A,i4,T51,3I10,/,T51,3I10,/,T51,3I10)') &
527  " Rotation #: ", i, (csym%rotations(j, :, i), j=1, 3)
528  WRITE (iunit, '(T36,3F15.7)') csym%translations(:, i)
529  END DO
530  END IF
531  ELSE
532  WRITE (iunit, "(T2,A)") "SPGLIB for Crystal Symmetry Information determination is not availale"
533  END IF
534  END IF
535 
536  END SUBROUTINE print_crys_symmetry
537 
538 ! **************************************************************************************************
539 !> \brief ...
540 !> \param csym ...
541 ! **************************************************************************************************
542  SUBROUTINE print_kp_symmetry(csym)
543  TYPE(csym_type), INTENT(IN) :: csym
544 
545  INTEGER :: i, iunit, plevel
546 
547  iunit = csym%punit
548  IF (iunit >= 0) THEN
549  plevel = csym%plevel
550  WRITE (iunit, "(/,T2,A)") "K-point Symmetry Information"
551  WRITE (iunit, '(A,T67,I14)') " Number of Special K-points: ", csym%nkpoint
552  WRITE (iunit, '(T19,A,T74,A)') " Wavevector Basis ", " Weight"
553  DO i = 1, csym%nkpoint
554  WRITE (iunit, '(T2,i10,3F10.5,T71,I10)') i, csym%xkpoint(1:3, i), nint(csym%wkpoint(i))
555  END DO
556  WRITE (iunit, '(/,A,T63,3I6)') " K-point Mesh: ", csym%mesh(1), csym%mesh(2), csym%mesh(3)
557  WRITE (iunit, '(T19,A,T54,A)') " Wavevector Basis ", " Special Points Rotation"
558  DO i = 1, csym%mesh(1)*csym%mesh(2)*csym%mesh(3)
559  WRITE (iunit, '(T2,i10,3F10.5,T45,3I12)') i, csym%kpmesh(1:3, i), &
560  csym%kplink(1:2, i), csym%kpop(i)
561  END DO
562  END IF
563 
564  END SUBROUTINE print_kp_symmetry
565 
566 END MODULE cryssym
collects all references to literature in CP2K as new algorithms / method are included from literature...
Definition: bibliography.F:28
integer, save, public togo2018
Definition: bibliography.F:43
K-points and crystal symmetry routines.
Definition: cryssym.F:12
subroutine, public print_crys_symmetry(csym)
...
Definition: cryssym.F:510
subroutine, public crys_sym_gen(csym, scoor, types, hmat, delta, iounit)
...
Definition: cryssym.F:114
subroutine, public release_csym_type(csym)
Release the CSYM type.
Definition: cryssym.F:72
subroutine, public kpoint_gen(csym, nk, symm, shift, full_grid)
...
Definition: cryssym.F:209
subroutine, public apply_rotation_coord(f0, csym, ir)
...
Definition: cryssym.F:473
subroutine, public print_kp_symmetry(csym)
...
Definition: cryssym.F:543
Defines the basic variable types.
Definition: kinds.F:23
integer, parameter, public dp
Definition: kinds.F:34
Interface for SPGLIB symmetry routines.
Definition: spglib_f08.F:119
integer function, public spg_get_international(symbol, lattice, position, types, num_atom, symprec)
...
Definition: spglib_f08.F:202
integer function, public spg_get_multiplicity(lattice, position, types, num_atom, symprec)
...
Definition: spglib_f08.F:177
integer function, public spg_get_micro_version()
...
Definition: spglib_f08.F:334
integer function, public spg_get_minor_version()
...
Definition: spglib_f08.F:324
integer function, public spg_get_ir_reciprocal_mesh(grid_point, map, mesh, is_shift, is_time_reversal, lattice, position, types, num_atom, symprec)
...
Definition: spglib_f08.F:285
integer function, public spg_get_major_version()
...
Definition: spglib_f08.F:314
integer function, public spg_get_pointgroup(symbol, trans_mat, rotations, num_rotations)
...
Definition: spglib_f08.F:256
integer function, public spg_get_symmetry(rotation, translation, max_size, lattice, position, types, num_atom, symprec)
...
Definition: spglib_f08.F:147
integer function, public spg_get_schoenflies(symbol, lattice, position, types, num_atom, symprec)
...
Definition: spglib_f08.F:230
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.