(git:374b731)
Loading...
Searching...
No Matches
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! **************************************************************************************************
12MODULE 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! **************************************************************************************************
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
65CONTAINS
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
566END MODULE cryssym
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.
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.
CSM type.
Definition cryssym.F:36