33#include "./base/base_uses.f90"
40 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'kpsym'
78 SUBROUTINE k290s(iout, nat, nkpoint, nsp, iq1, iq2, iq3, istriz, &
79 a1, a2, a3, alat, strain, xkapa, rx, tvec, &
80 ty, isc, f0, ntvec, wvk0, wvkl, lwght, lrot, &
81 nhash, includ, list, rlist, delta)
142 INTEGER :: iout, nat, nkpoint, nsp, iq1, iq2, iq3, &
144 REAL(kind=
dp) :: a1(3), a2(3), a3(3), alat, strain(6), &
145 xkapa(3, nat), rx(3, nat), tvec(3, nat)
146 INTEGER :: ty(nat), isc(nat), f0(49, nat), ntvec
147 REAL(kind=
dp) :: wvk0(3), wvkl(3, nkpoint)
148 INTEGER :: lwght(nkpoint), lrot(48, nkpoint), &
149 nhash, includ(nkpoint), &
150 list(nkpoint + nhash)
151 REAL(kind=
dp) :: rlist(3, nkpoint), delta
153 CHARACTER(len=10),
DIMENSION(48),
PARAMETER :: rname_cubic = [
' 1 ',
' 2[ 10 0] ', &
154 ' 2[ 01 0] ',
' 2[ 00 1] ',
' 3[-1-1-1]',
' 3[ 11-1] ',
' 3[-11 1] ',
' 3[ 1-11] ', &
155 ' 3[ 11 1] ',
' 3[-11-1] ',
' 3[-1-11] ',
' 3[ 1-1-1]',
' 2[-11 0] ',
' 4[ 00 1] ', &
156 ' 4[ 00-1] ',
' 2[ 11 0] ',
' 2[ 0-11] ',
' 2[ 01 1] ',
' 4[ 10 0] ',
' 4[-10 0] ', &
157 ' 2[-10 1] ',
' 4[ 0-10] ',
' 2[ 10 1] ',
' 4[ 01 0] ',
'-1 ',
'-2[ 10 0] ', &
158 '-2[ 01 0] ',
'-2[ 00 1] ',
'-3[-1-1-1]',
'-3[ 11-1] ',
'-3[-11 1] ',
'-3[ 1-11] ', &
159 '-3[ 11 1] ',
'-3[-11-1] ',
'-3[-1-11] ',
'-3[ 1-1-1]',
'-2[-11 0] ',
'-4[ 00 1] ', &
160 '-4[ 00-1] ',
'-2[ 11 0] ',
'-2[ 0-11] ',
'-2[ 01 1] ',
'-4[ 10 0] ',
'-4[-10 0] ', &
161 '-2[-10 1] ',
'-4[ 0-10] ',
'-2[ 10 1] ',
'-4[ 01 0] ']
162 CHARACTER(len=11),
DIMENSION(24),
PARAMETER :: rname_hexai = [
' 1 ',
' 6[ 00 1] ', &
163 ' 3[ 00 1] ',
' 2[ 00 1] ',
' 3[ 00 -1] ',
' 6[ 00 -1] ',
' 2[ 01 0] ',
' 2[-11 0] ', &
164 ' 2[ 10 0] ',
' 2[ 21 0] ',
' 2[ 11 0] ',
' 2[ 12 0] ',
'-1 ',
'-6[ 00 1] ', &
165 '-3[ 00 1] ',
'-2[ 00 1] ',
'-3[ 00 -1] ',
'-6[ 00 -1] ',
'-2[ 01 0] ',
'-2[-11 0] ', &
166 '-2[ 10 0] ',
'-2[ 21 0] ',
'-2[ 11 0] ',
'-2[ 12 0] ']
167 CHARACTER(len=12),
DIMENSION(7),
PARAMETER :: icst = [
'TRICLINIC ',
'MONOCLINIC ', &
168 'ORTHORHOMBIC',
'TETRAGONAL ',
'CUBIC ',
'TRIGONAL ',
'HEXAGONAL ']
170 INTEGER :: i, ib(48), ib0(48), ihc, ihc0, ihg, ihg0, indpg, indpg0, invadd, istrin, iswght, &
171 isy, isy0, itype, j, k, l, li, li0, lmax, n, nc, nc0, ntot, ntvec0
172 INTEGER,
DIMENSION(49, 1) :: f00
173 REAL(kind=
dp) :: a01(3), a02(3), a03(3), b01(3), b02(3), b03(3), b1(3), b2(3), b3(3), &
174 dtotstr, origin(3), origin0(3), proj1, proj2, proj3, r(3, 3, 48), r0(3, 3, 48), totstr, &
175 tvec0(3, 1), volum, vv0(3)
176 REAL(kind=
dp),
DIMENSION(3, 1) :: x0
177 REAL(kind=
dp),
DIMENSION(3, 48) :: v, v0
192 WRITE (iout,
'(" KPSYM| NUMBER OF ATOMS (STRUCT):",I6)') nat
194 WRITE (iout,
'(" KPSYM|",10X,"K TYPE",14X,"X(K)")')
200 IF (ty(j) == ty(i))
THEN
208 IF (itype > nsp)
THEN
210 WRITE (iout,
'(A,I4,")")') &
211 ' KPSYM| NUMBER OF ATOMIC TYPES EXCEEDS DIMENSION (NSP=)', &
214 WRITE (iout,
'(" KPSYM| THE ARRAY TY IS:",/,9(1X,10I7,/))') &
216 CALL stopgm(
'K290',
'FATAL ERROR')
220 WRITE (iout,
'(" KPSYM|",6X,I5,I6,3F10.5)') &
221 i, ty(i), (xkapa(j, i), j=1, 3)
226 dtotstr = delta*delta
230 totstr = totstr + abs(strain(i))
232 IF (totstr > dtotstr) istrin = 1
235 volum = a1(1)*a2(2)*a3(3) + a2(1)*a3(2)*a1(3) + &
236 a3(1)*a1(2)*a2(3) - a1(3)*a2(2)*a3(1) - &
237 a2(3)*a3(2)*a1(1) - a3(3)*a1(2)*a2(1)
239 b1(1) = (a2(2)*a3(3) - a2(3)*a3(2))/volum
240 b1(2) = (a2(3)*a3(1) - a2(1)*a3(3))/volum
241 b1(3) = (a2(1)*a3(2) - a2(2)*a3(1))/volum
242 b2(1) = (a3(2)*a1(3) - a3(3)*a1(2))/volum
243 b2(2) = (a3(3)*a1(1) - a3(1)*a1(3))/volum
244 b2(3) = (a3(1)*a1(2) - a3(2)*a1(1))/volum
245 b3(1) = (a1(2)*a2(3) - a1(3)*a2(2))/volum
246 b3(2) = (a1(3)*a2(1) - a1(1)*a2(3))/volum
247 b3(3) = (a1(1)*a2(2) - a1(2)*a2(1))/volum
257 CALL group1s(iout, a1, a2, a3, nat, ty, xkapa, b1, b2, b3, &
258 ihg, ihc, isy, li, nc, indpg, ib, ntvec, &
259 v, f0, r, tvec, origin, rx, isc, delta)
268 WRITE (iout,
'(A,/,A,/,A)') &
269 ' KPSYM| ALTHOUGH THE POINT GROUP OF THE CRYSTAL DOES NOT', &
270 ' KPSYM| CONTAIN INVERSION, THE SPECIAL POINT GENERATION ALGORITHM', &
271 ' KPSYM| WILL CONSIDER IT AS A SYMMETRY OPERATION'
278 WRITE (iout,
'(/," KPSYM| CRYSTALLOGRAPHIC DATA:")')
279 WRITE (iout,
'(4X,"A1",3F10.5,10X,"B1",3F10.5)') a1, b1
280 WRITE (iout,
'(4X,"A2",3F10.5,10X,"B2",3F10.5)') a2, b2
281 WRITE (iout,
'(4X,"A3",3F10.5,10X,"B3",3F10.5)') a3, b3
287 WRITE (iout,
'(/," KPSYM| GROUP-THEORETICAL INFORMATION:")')
291 '(" KPSYM| POINT GROUP OF THE PRIMITIVE LATTICE: ",A," SYSTEM")') &
297 WRITE (iout,
'(" KPSYM|",4X,"NONSYMMORPHIC GROUP")')
298 ELSEIF (isy == 1)
THEN
300 WRITE (iout,
'(" KPSYM|",4X,"SYMMORPHIC GROUP")')
301 ELSEIF (isy == -1)
THEN
303 WRITE (iout,
'(" KPSYM|",4X,"SYMMORPHIC GROUP WITH NON-STANDARD ORIGIN")')
304 ELSEIF (isy == -2)
THEN
306 WRITE (iout,
'(" KPSYM|",4X,"NONSYMMORPHIC GROUP???")')
311 WRITE (iout,
'(" KPSYM|",4X,"NO INVERSION SYMMETRY")')
314 WRITE (iout,
'(" KPSYM|",4X,"INVERSION SYMMETRY")')
319 '(" KPSYM|",4X,"TOTAL NUMBER OF ELEMENTS IN THE POINT GROUP:",I3)') nc
321 WRITE (iout,
'(" KPSYM|",4X,"TO SUM UP: (",I1,5I3,")")') &
322 ihg, ihc, isy, li, nc, indpg
325 WRITE (iout,
'(/," KPSYM|",4X,"LIST OF THE ROTATIONS:")')
327 WRITE (iout,
'(7X,12I4)') (ib(i), i=1, nc)
331 WRITE (iout,
'(/," KPSYM|",4X,"NONPRIMITIVE TRANSLATIONS:")')
333 WRITE (iout,
'(A,A)') &
334 ' ROT V IN THE BASIS A1, A2, A3 ', &
335 'V IN CARTESIAN COORDINATES'
339 vv0(j) = v(1, i)*a1(j) + v(2, i)*a2(j) + v(3, i)*a3(j)
342 WRITE (iout,
'(1X,I3,3F10.5,3X,3F10.5)') &
343 ib(i), (v(j, i), j=1, 3), vv0
350 '(/," KPSYM|",4X,"ATOM TRANSFORMATION TABLE (MARADUDIN,VOSKO):")')
352 WRITE (iout,
'(5(4X,"R AT->AT"))')
354 WRITE (iout,
'(I5," [Identity]")') 1
358 WRITE (iout,
'(I5,2I4)', advance=
"no") ib(k), j, f0(k, j)
359 IF ((mod(j, 5) == 0) .AND. iout > 0) &
362 IF ((mod(j - 1, 5) /= 0) .AND. iout > 0) &
367 WRITE (iout,
'(/," KPSYM|",4X,"LIST OF THE 3 X 3 ROTATION MATRICES:")')
372 '(4X,I3," (",I2,": ",A11,")",2(3F14.6,/,25X),3F14.6)') &
373 k, ib(k), rname_hexai(ib(k)), ((r(i, j, ib(k)), j=1, 3), i=1, 3)
379 '(4X,I3," (",I2,": ",A10,") ",2(3F14.6,/,25X),3F14.6)') &
380 k, ib(k), rname_cubic(ib(k)), ((r(i, j, ib(k)), j=1, 3), i=1, 3)
386 CALL group1s(iout, a01, a02, a03, 1, ty, x0, b01, b02, b03, &
387 ihg0, ihc0, isy0, li0, nc0, indpg0, ib0, ntvec0, &
388 v0, f00, r0, tvec0, origin0, rx, isc, delta)
395 WRITE (iout,
'(/,1X,19("*"),A,25("*"))') &
396 ' GENERATION OF SPECIAL POINTS '
399 WRITE (iout,
'(A,/,1X,3I5)') &
400 ' KPSYM| MONKHORST-PACK PARAMETERS (GENERALIZED) IQ1,IQ2,IQ3:', &
404 WRITE (iout,
'(A,/,1X,3F10.5)') &
405 ' KPSYM| CONSTANT VECTOR SHIFT (MACDONALD) OF THIS MESH:', wvk0
406 IF (iabs(iq1) + iabs(iq2) + iabs(iq3) == 0)
GOTO 710
407 IF (abs(istriz) /= 1)
THEN
409 WRITE (iout,
'(" KPSYM| INVALID SWITCH FOR SYMMETRIZATION",I10)') istriz
411 WRITE (iout,
'(" KPSYM| INVALID SWITCH FOR SYMMETRIZATION",I10)') istriz
412 CALL stopgm(
'K290',
'ISTRIZ WRONG ARGUMENT')
415 WRITE (iout,
'(" KPSYM| SYMMETRIZATION SWITCH: ",I3)', advance=
"no") istriz
416 IF (istriz == 1)
THEN
418 WRITE (iout,
'(" (SYMMETRIZATION OF MONKHORST-PACK MESH)")')
421 WRITE (iout,
'(" (NO SYMMETRIZATION OF MONKHORST-PACK MESH)")')
437 WRITE (iout, *)
' KPSYM| NUMBER OF ROTATIONS FOR BRAVAIS LATTICE', nc0
439 WRITE (iout, *)
' KPSYM| NUMBER OF ROTATIONS FOR CRYSTAL LATTICE', nc
441 WRITE (iout, *)
' KPSYM| NO DUPLICATION FOUND'
442 CALL stopgm(
'ERROR', &
443 'SOMETHING IS WRONG IN GROUP DETERMINATION')
450 WRITE (iout,
'(/,1X,20("! "),"WARNING",20("!"))')
452 WRITE (iout,
'(A)') &
453 ' KPSYM| THE CRYSTAL HAS MORE SYMMETRY THAN THE BRAVAIS LATTICE'
455 WRITE (iout,
'(A)') &
456 ' KPSYM| BECAUSE THIS IS NOT A PRIMITIVE CELL'
458 WRITE (iout,
'(A)') &
459 ' KPSYM| USE ONLY SYMMETRY FROM BRAVAIS LATTICE'
461 WRITE (iout,
'(1X,20("! "),"WARNING",20("!"),/)')
463 CALL sppt2(iout, iq1, iq2, iq3, wvk0, nkpoint, &
464 a01, a02, a03, b01, b02, b03, &
465 invadd, nc, ib, r, ntot, wvkl, lwght, lrot, nc0, ib0, istriz, &
466 nhash, includ,
list, rlist, delta)
471 WRITE (iout,
'(/," KPSYM|",1X,I5," SPECIAL POINTS GENERATED")') ntot
474 ELSE IF (ntot < 0)
THEN
476 WRITE (iout,
'(A,I5,/,A,/,A)')
' KPSYM| DIMENSION NKPOINT =', nkpoint, &
477 ' KPSYM| INSUFFICIENT FOR ACCOMMODATING ALL THE SPECIAL POINTS', &
478 ' KPSYM| WHAT FOLLOWS IS AN INCOMPLETE LIST'
486 iswght = iswght + lwght(i)
489 WRITE (iout,
'(8X,A,T33,A,4X,A)') &
490 'WAVEVECTOR K',
'WEIGHT',
'UNFOLDING ROTATIONS'
494 IF (abs(wvkl(i, l)) < delta) wvkl(i, l) = 0._dp
496 IF (istrin /= 0)
THEN
502 proj1 = proj1 + wvkl(i, l)*a01(i)
503 proj2 = proj2 + wvkl(i, l)*a02(i)
504 proj3 = proj3 + wvkl(i, l)*a03(i)
507 wvkl(i, l) = proj1*b1(i) + proj2*b2(i) + proj3*b3(i)
512 WRITE (iout, fmt=
'(1X,I5,3F8.4,I8,T42,12I3)') &
513 l, (wvkl(i, l), i=1, 3), lwght(l), (lrot(i, l), i=1, min(lmax, 12))
516 WRITE (iout, fmt=
'(T42,12I3)') &
517 (lrot(i, l), i=j, min(lmax, j - 1 + 12))
521 WRITE (iout,
'(24X,"TOTAL:",I8)') iswght
558 SUBROUTINE group1s(iout, a1, a2, a3, nat, ty, x, b1, b2, b3, &
559 ihg, ihc, isy, li, nc, indpg, ib, ntvec, &
560 v, f0, r, tvec, origin, rx, isc, delta)
664 REAL(
dp) :: a1(3), a2(3), a3(3)
665 INTEGER :: nat, ty(nat)
666 REAL(
dp) :: x(3, nat), b1(3), b2(3), b3(3)
667 INTEGER :: ihg, ihc, isy, li, nc, indpg, ib(48), &
670 INTEGER :: f0(49, nat)
671 REAL(
dp) :: r(3, 3, 48), tvec(3, nat), origin(3), &
677 REAL(
dp) :: a(3, 3), ai(3, 3), ap(3, 3), api(3, 3)
704 CALL primlatt(a, ai, ap, api, nat, ty, x, ntvec, tvec, f0, isc, delta)
707 CALL pgl1(ap, api, ihc, nc, ib, ihg, r, delta)
713 CALL pgl1(a, ai, ihc, nc, ib, ihg, r, delta)
714 IF (ncprim > nc)
THEN
716 CALL pgl1(ap, api, ihc, nc, ib, ihg, r, delta)
721 CALL atftm1(iout, r, v, x, f0, origin, ib, ty, nat, ihg, ihc, rx, &
722 nc, indpg, ntvec, a, ai, li, isy, isc, delta)
727 WRITE (iout,
'(1X,A)') &
728 'KPSYM| THE POINT GROUP OF THE CRYSTAL CONTAINS THE INVERSION'
740 SUBROUTINE calbrec(a, ai)
750 REAL(
dp) :: a(3, 3), ai(3, 3)
752 INTEGER :: i, il, iu, j, jl, ju
755 det = a(1, 1)*a(2, 2)*a(3, 3) + a(2, 1)*a(1, 3)*a(3, 2) + &
756 a(3, 1)*a(1, 2)*a(2, 3) - a(1, 1)*a(2, 3)*a(3, 2) - &
757 a(2, 1)*a(1, 2)*a(3, 3) - a(3, 1)*a(1, 3)*a(2, 2)
769 ai(j, i) = (-1._dp)**(i + j)*det* &
770 (a(il, jl)*a(iu, ju) - a(il, ju)*a(iu, jl))
775 END SUBROUTINE calbrec
792 SUBROUTINE primlatt(a, ai, ap, api, nat, ty, x, ntvec, tvec, f0, isc, delta)
818 REAL(
dp) :: a(3, 3), ai(3, 3), ap(3, 3), api(3, 3)
819 INTEGER :: nat, ty(nat)
820 REAL(
dp) :: x(3, nat)
822 REAL(
dp) :: tvec(3, nat)
823 INTEGER :: f0(49, nat), isc(nat)
826 INTEGER :: i, il, iv, j, k2
828 REAL(
dp) :: vr(3), xb(3)
844 IF (ty(1) /= ty(k2))
GOTO 100
846 xb(i) = x(i, k2) - x(i, 1)
849 CALL rlv3(ai, xb, vr, il, delta)
850 CALL checkrlv3(1, nat, ty, x, x, vr, f0, ai, isc, .true., oksym, delta)
857 IF (f0(49, i) > f0(1, i)) f0(49, i) = f0(1, i)
860 tvec(i, ntvec) = vr(i)
883 xb(i) = tvec(1, iv)*a(i, 1) &
884 + tvec(2, iv)*a(i, 2) &
885 + tvec(3, iv)*a(i, 3)
888 CALL rlv3(api, xb, vr, il, delta)
890 IF (abs(vr(i)) > delta)
THEN
891 il = nint(1._dp/abs(vr(i)))
898 CALL calbrec(ap, api)
908 END SUBROUTINE primlatt
921 SUBROUTINE pgl1(a, ai, ihc, nc, ib, ihg, r, delta)
958 REAL(
dp) :: a(3, 3), ai(3, 3)
959 INTEGER :: ihc, nc, ib(48), ihg
960 REAL(
dp) :: r(3, 3, 48), delta
962 INTEGER :: i, j, k, lx, n, nr
963 REAL(
dp) :: tr, vr(3), xa(3)
982 xa(i) = xa(i) + r(i, j, n)*a(j, k)
985 CALL rlv3(ai, xa, vr, lx, delta)
991 IF (tr > delta)
GOTO 140
1001 IF (nc == 12) ihg = 6
1002 IF (nc > 12) ihg = 7
1003 IF (nc >= 12)
RETURN
1008 IF (nc == 4) ihg = 2
1010 IF (nc == 16) ihg = 4
1011 IF (nc > 16) ihg = 5
1027 SUBROUTINE rlv3(ai, xb, vr, il, delta)
1048 REAL(
dp) :: ai(3, 3), xb(3), vr(3)
1059 ts = abs(xb(1)) + abs(xb(2)) + abs(xb(3))
1060 IF (ts <= delta)
RETURN
1062 vr(i) = vr(i) + ai(i, 1)*xb(1) + ai(i, 2)*xb(2) + ai(i, 3)*xb(3)
1063 il = il + nint(abs(vr(i)))
1067 vr(i) = nint(vr(i)) - vr(i)
1097 SUBROUTINE atftm1(iout, r, v, x, f0, origin, ib, ty, nat, ihg, ihc, &
1098 rx, nc, indpg, ntvec, a, ai, li, isy, isc, delta)
1164 REAL(
dp) :: r(3, 3, 48), v(3, 48), origin(3)
1165 INTEGER :: ib(48), nat, ty(nat), f0(49, nat)
1166 REAL(
dp) :: x(3, nat)
1168 REAL(
dp) :: rx(3, nat)
1169 INTEGER :: nc, indpg, ntvec
1170 REAL(
dp) :: a(3, 3), ai(3, 3)
1171 INTEGER :: li, isy, isc(nat)
1174 CHARACTER(len=10),
DIMENSION(48),
PARAMETER :: rname_cubic = [
' 1 ',
' 2[ 10 0] ', &
1175 ' 2[ 01 0] ',
' 2[ 00 1] ',
' 3[-1-1-1]',
' 3[ 11-1] ',
' 3[-11 1] ',
' 3[ 1-11] ', &
1176 ' 3[ 11 1] ',
' 3[-11-1] ',
' 3[-1-11] ',
' 3[ 1-1-1]',
' 2[-11 0] ',
' 4[ 00 1] ', &
1177 ' 4[ 00-1] ',
' 2[ 11 0] ',
' 2[ 0-11] ',
' 2[ 01 1] ',
' 4[ 10 0] ',
' 4[-10 0] ', &
1178 ' 2[-10 1] ',
' 4[ 0-10] ',
' 2[ 10 1] ',
' 4[ 01 0] ',
'-1 ',
'-2[ 10 0] ', &
1179 '-2[ 01 0] ',
'-2[ 00 1] ',
'-3[-1-1-1]',
'-3[ 11-1] ',
'-3[-11 1] ',
'-3[ 1-11] ', &
1180 '-3[ 11 1] ',
'-3[-11-1] ',
'-3[-1-11] ',
'-3[ 1-1-1]',
'-2[-11 0] ',
'-4[ 00 1] ', &
1181 '-4[ 00-1] ',
'-2[ 11 0] ',
'-2[ 0-11] ',
'-2[ 01 1] ',
'-4[ 10 0] ',
'-4[-10 0] ', &
1182 '-2[-10 1] ',
'-4[ 0-10] ',
'-2[ 10 1] ',
'-4[ 01 0] ']
1183 CHARACTER(len=11),
DIMENSION(24),
PARAMETER :: rname_hexai = [
' 1 ',
' 6[ 00 1] ', &
1184 ' 3[ 00 1] ',
' 2[ 00 1] ',
' 3[ 00 -1] ',
' 6[ 00 -1] ',
' 2[ 01 0] ',
' 2[-11 0] ', &
1185 ' 2[ 10 0] ',
' 2[ 21 0] ',
' 2[ 11 0] ',
' 2[ 12 0] ',
'-1 ',
'-6[ 00 1] ', &
1186 '-3[ 00 1] ',
'-2[ 00 1] ',
'-3[ 00 -1] ',
'-6[ 00 -1] ',
'-2[ 01 0] ',
'-2[-11 0] ', &
1187 '-2[ 10 0] ',
'-2[ 21 0] ',
'-2[ 11 0] ',
'-2[ 12 0] ']
1188 CHARACTER(len=12),
DIMENSION(7),
PARAMETER :: icst = [
'TRICLINIC ',
'MONOCLINIC ', &
1189 'ORTHORHOMBIC',
'TETRAGONAL ',
'CUBIC ',
'TRIGONAL ',
'HEXAGONAL ']
1190 CHARACTER(len=3),
DIMENSION(32),
PARAMETER :: pgrd = [
'c1 ',
'ci ',
'c2 ',
'c1h',
'c2h', &
1191 'c3 ',
'c3i',
'd3 ',
'c3v',
'd3 ',
'c4 ',
's4 ',
'c4h',
'd4 ',
'c4v',
'd2d',
'd4h',
'c6 ',&
1192 'c3h',
'c6h',
'd6 ',
'c6v',
'd3h',
'd6h',
'd2 ',
'c2v',
'd2h',
't ',
'th ',
'o ',
'td ',&
1194 CHARACTER(len=5),
DIMENSION(32),
PARAMETER :: pgrp = [
' 1',
' <1>',
' 2',
' m', &
1195 ' 2/m',
' 3',
' <3>',
' 32',
' 3m',
' <3>m',
' 4',
' <4>',
' 4/m',
' 422', &
1196 ' 4mm',
'<4>2m',
'4/mmm',
' 6',
' <6>',
' 6/m',
' 622',
' 6mm',
'<6>m2',
'6/mmm', &
1197 ' 222',
' mm2',
' mmm',
' 23',
' m3',
' 432',
'<4>3m',
' m3m']
1199 INTEGER :: i, iis(48), il, info, j, k, k2, l, n, &
1201 LOGICAL :: nodupli, oksym
1202 REAL(
dp) :: vc(3, 48), vr(3), vs, xb(3)
1204 nodupli = ntvec == 1
1216 rx(i, k) = r(i, 1, l)*x(1, k) + r(i, 2, l)*x(2, k) + r(i, 3, l)*x(3, k)
1224 CALL checkrlv3(n, nat, ty, rx, x, vr, f0, ai, isc, nodupli, oksym, delta)
1231 IF (f0(49, k2) < k2)
GOTO 185
1232 IF (ty(1) /= ty(k2))
GOTO 185
1234 xb(i) = rx(i, 1) - x(i, k2)
1237 CALL rlv3(ai, xb, vr, il, delta)
1246 CALL checkrlv3(n, nat, ty, rx, x, vr, f0, ai, isc, nodupli, oksym, delta)
1271 IF (ihg < 6) ni = 25
1275 IF (iis(l) == 0)
GOTO 230
1278 IF (ib(i) == ni) li = i
1288 vs = vs + abs(v(1, n)) + abs(v(2, n)) + abs(v(3, n))
1293 IF (vs > delta)
THEN
1304 WRITE (iout,
'(" ATFTM1! IHG=",A," NC=",I2)') icst(ihg), nc
1305 CALL stopgm(
'ATFTM1',
'NUMBER OF ROTATION NULL')
1307 ELSEIF (nc == 1)
THEN
1310 ELSEIF (nc == 2 .AND. ib(2) == 25)
THEN
1313 ELSEIF (nc == 2 .AND. ( &
1322 ELSEIF (nc == 2 .AND. ( &
1330 ELSEIF (nc == 4 .AND. ( &
1342 ELSEIF (nc == 4 .AND. ( &
1351 ELSEIF (nc == 4 .AND. ( &
1359 ELSEIF (nc == 8 .AND. ( &
1360 (ib(3) == 14 .AND. ib(8) == 39) .OR. &
1361 (ib(3) == 19 .AND. ib(8) == 44) .OR. &
1362 (ib(3) == 22 .AND. ib(8) == 48)))
THEN
1367 ELSEIF (nc == 8 .AND. ib(4) == 4 .AND. ( &
1375 ELSEIF (nc == 8 .AND. ( &
1383 ELSEIF (nc == 8 .AND. ( &
1384 (ib(3) == 13 .AND. ib(8) == 39) .OR. &
1385 (ib(3) == 17 .AND. ib(8) == 44) .OR. &
1386 (ib(3) == 21 .AND. ib(8) == 48)))
THEN
1391 ELSEIF (nc == 16 .AND. ( &
1399 ELSEIF (nc == 4 .AND. (ib(4) == 4))
THEN
1403 ELSEIF (nc == 4 .AND. ( &
1410 ELSEIF (nc == 8)
THEN
1413 ELSEIF (nc == 12 .AND. ( &
1422 ELSEIF (nc == 24 .AND. ib(24) == 36)
THEN
1426 ELSEIF (nc == 24 .AND. ib(24) == 24)
THEN
1430 ELSEIF (nc == 24 .AND. ib(24) == 48)
THEN
1434 ELSEIF (nc == 48)
THEN
1444 ELSEIF (ihg >= 6)
THEN
1447 WRITE (iout,
'(" ATFTM1! IHG=",A," NC=",I2)') icst(ihg), nc
1448 CALL stopgm(
'ATFTM1',
'NUMBER OF ROTATION NULL')
1450 ELSEIF (nc == 1)
THEN
1453 ELSEIF (nc == 2 .AND. ib(2) == 13)
THEN
1456 ELSEIF (nc == 2 .AND. ( &
1461 ELSEIF (nc == 2 .AND. ( &
1465 ELSEIF (nc == 4 .AND. ( &
1471 ELSEIF (nc == 3 .AND. ib(3) == 5)
THEN
1475 ELSEIF (nc == 6 .AND. ib(6) == 17)
THEN
1478 ELSEIF (nc == 6 .AND. ib(6) == 11)
THEN
1481 ELSEIF (nc == 6 .AND. ib(6) == 23)
THEN
1484 ELSEIF (nc == 12 .AND. ib(12) == 23)
THEN
1487 ELSEIF (nc == 6 .AND. ib(6) == 6)
THEN
1491 ELSEIF (nc == 6 .AND. ib(6) == 18)
THEN
1494 ELSEIF (nc == 12 .AND. ib(12) == 18)
THEN
1497 ELSEIF (nc == 12 .AND. ib(12) == 12)
THEN
1500 ELSEIF (nc == 12 .AND. ib(2) == 2 .AND. ib(12) == 24)
THEN
1503 ELSEIF (nc == 12 .AND. ib(2) == 3 .AND. ib(12) == 24)
THEN
1506 ELSEIF (nc == 24)
THEN
1523 vc(1, n) = a(1, 1)*v(1, n) + a(1, 2)*v(2, n) + a(1, 3)*v(3, n)
1524 vc(2, n) = a(2, 1)*v(1, n) + a(2, 2)*v(2, n) + a(2, 3)*v(3, n)
1525 vc(3, n) = a(3, 1)*v(1, n) + a(3, 2)*v(2, n) + a(3, 3)*v(3, n)
1527 CALL symmorphic(nc, ib, r, vc, ai, info, origin, delta)
1529 CALL rlv3(ai, origin, xb, il, delta)
1533 IF (-xb(i) >= 0._dp)
THEN
1536 origin(i) = 1._dp - xb(i)
1540 xb(i) = a(i, 1)*origin(1) + a(i, 2)*origin(2) + a(i, 3)*origin(3)
1543 ELSEIF (info == 0)
THEN
1560 IF ((ihg == 7 .AND. nc == 24) .OR. &
1561 (ihg == 5 .AND. nc == 48))
THEN
1563 WRITE (iout,
'(A,A,A)') &
1564 ' KPSYM| THE POINT GROUP OF THE CRYSTAL IS THE FULL ', &
1569 WRITE (iout,
'(A,A,A,I2,A)') &
1570 ' KPSYM| THE CRYSTAL SYSTEM IS ', &
1572 ' WITH ', nc,
' OPERATIONS:'
1575 WRITE (iout,
'( 5(5(A13),/))') (rname_hexai(ib(i)), i=1, nc)
1578 WRITE (iout,
'(10(5(A13),/))') (rname_cubic(ib(i)), i=1, nc)
1584 WRITE (iout,
'(A)') &
1585 ' KPSYM| THE SPACE GROUP OF THE CRYSTAL IS SYMMORPHIC'
1586 ELSEIF (isy == -1)
THEN
1588 WRITE (iout,
'(A)') &
1589 ' KPSYM| THE SPACE GROUP OF THE CRYSTAL IS SYMMORPHIC'
1591 WRITE (iout,
'(A,A,/,T3,3F10.6,3X,3F10.6)') &
1592 ' KPSYM| THE STANDARD ORIGIN OF COORDINATES IS: ', &
1593 '[CARTESIAN] [CRYSTAL]', xb, origin
1594 ELSEIF (isy == 0)
THEN
1596 WRITE (iout,
'(A,/,3X,A,F15.6,A)') &
1597 ' KPSYM| THE SPACE GROUP IS NON-SYMMORPHIC,', &
1598 ' (SUM OF TRANSLATION VECTORS=', vs,
')'
1599 ELSEIF (isy == -2)
THEN
1601 WRITE (iout,
'(A,A)') &
1602 ' KPSYM| CANNOT DETERMINE IF THE SPACE GROUP IS', &
1603 ' SYMMORPHIC OR NOT'
1605 WRITE (iout,
'(A,/,A,/,3X,A,F15.6,A)') &
1606 ' KPSYM| THE SPACE GROUP IS NON-SYMMORPHIC,', &
1607 ' KPSYM| OR ELSE A NON STANDARD ORIGIN OF COORDINATES WAS USED.', &
1608 ' KPSYM| (SUM OF TRANSLATION VECTORS=', vs,
')'
1611 CALL xstring(pgrp(indpg), i, j)
1612 CALL xstring(pgrd(indpg), k, l)
1614 WRITE (iout,
'(A,A,"(",A,")",T56,"[INDEX=",I2,"]")') &
1615 ' KPSYM| THE POINT GROUP OF THE CRYSTAL IS ', pgrp(indpg) (i:j), &
1616 pgrd(indpg) (k:l), indpg
1618 CALL xstring(pgrp(-indpg), i, j)
1619 CALL xstring(pgrd(-indpg), k, l)
1621 WRITE (iout,
'(A,I2,A,A,"(",A,")",T56,"[INDEX=",I2,"]")') &
1622 ' KPSYM| POINT GROUP: GROUP ORDER=', nc, &
1623 ' SUBGROUP OF ', pgrp(-indpg) (i:j), &
1624 pgrd(-indpg) (k:l), -indpg
1626 IF (ntvec == 1)
THEN
1628 WRITE (iout,
'(A,T60,I6)') &
1629 ' KPSYM| NUMBER OF PRIMITIVE CELL:', ntvec
1632 WRITE (iout,
'(A,T60,I6)') &
1633 ' KPSYM| NUMBER OF PRIMITIVE CELLS:', ntvec
1637 END SUBROUTINE atftm1
1654 SUBROUTINE checkrlv3(n, nat, ty, rx, x, vr, f0, ai, isc, &
1655 nodupli, oksym, delta)
1683 INTEGER :: n, nat, ty(nat)
1684 REAL(
dp) :: rx(3, nat), x(3, nat), vr(3)
1685 INTEGER :: f0(49, nat)
1686 REAL(
dp) :: ai(3, 3)
1688 LOGICAL :: nodupli, oksym
1691 INTEGER :: ia, ib, il
1692 REAL(
dp) :: vt(3), xb(3)
1700 IF (ty(ia) == ty(ib) .AND. isc(ib) == 0)
THEN
1701 xb(1) = rx(1, ia) - x(1, ib)
1702 xb(2) = rx(2, ia) - x(2, ib)
1703 xb(3) = rx(3, ia) - x(3, ib)
1704 CALL rlv3(ai, xb, vt, il, delta)
1706 oksym = (abs((vr(1) - vt(1)) - nint(vr(1) - vt(1))) < delta) .AND. &
1707 (abs((vr(2) - vt(2)) - nint(vr(2) - vt(2))) < delta) .AND. &
1708 (abs((vr(3) - vt(3)) - nint(vr(3) - vt(3))) < delta)
1710 IF (nodupli) isc(ib) = 1
1724 END SUBROUTINE checkrlv3
1737 SUBROUTINE symmorphic(nc, ib, r, v, ai, info, origin, delta)
1762 INTEGER :: nc, ib(nc)
1763 REAL(
dp) :: r(3, 3, 48), v(3, nc), ai(3, 3)
1765 REAL(
dp) :: origin(3), delta
1767 INTEGER :: i, i1, ierror, igood(3), il, imissing2, &
1768 imissing3, iok(3), ionly, ir, j, j1
1769 REAL(
dp) ::
diag, dif, r2(2, 2), r3(3, 3), vr(3), &
1783 dif = v(1, ir)*v(1, ir) + v(2, ir)*v(2, ir) + v(3, ir)*v(3, ir)
1784 IF (dif > delta*delta)
THEN
1791 r3(i, j) = -r(i, j, ib(ir))
1793 r3(i, i) = 1 + r3(i, i)
1796 IF (ierror == 0)
THEN
1799 vr(i) = r3(i, 1)*v(1, ir) &
1800 + r3(i, 2)*v(2, ir) &
1810 IF (i /= ierror)
THEN
1814 IF (j /= ierror)
THEN
1816 r2(i1, j1) = -r(i, j, ib(ir))
1819 r2(i1, i1) = 1 + r2(i1, i1)
1823 IF (ierror == 0)
THEN
1828 IF (igood(i) == 1)
THEN
1833 IF (igood(j) == 1)
THEN
1835 vr(i) = vr(i) + r2(i1, j1)*(v(j, ir) + &
1836 origin(imissing3)*r(j, imissing3, ib(ir)))
1847 IF (i /= imissing3)
THEN
1849 IF (i1 == ierror)
THEN
1857 diag = (1 - r(ionly, ionly, ib(ir)))
1858 IF (abs(
diag) > delta)
THEN
1859 vr(ionly) = 1._dp/
diag*(v(ionly, ir) + &
1860 origin(imissing3)*r(ionly, imissing3, ib(ir)) + &
1861 origin(imissing2)*r(ionly, imissing2, ib(ir)))
1863 vr(ionly) = origin(ionly)
1866 vr(imissing3) = origin(imissing3)
1867 vr(imissing2) = origin(imissing2)
1875 IF (iok(i) == 1)
THEN
1876 dif = dif + abs(origin(i) - vr(i))
1879 IF (dif > delta)
THEN
1885 IF (iok(i) /= 1 .AND. igood(i) == 1)
THEN
1894 IF (iok(1) == 0 .AND. iok(2) == 0 .AND. iok(3) == 0)
THEN
1904 vr(i) = r(i, 1, ib(ir))*origin(1) &
1905 + r(i, 2, ib(ir))*origin(2) &
1906 + r(i, 3, ib(ir))*origin(3)
1907 vr(i) = (origin(i) - vr(i)) - v(i, ir)
1909 CALL rlv3(ai, vr, xb, il, delta)
1910 dif = abs(xb(1)) + abs(xb(2)) + abs(xb(3))
1911 IF (dif > delta)
THEN
1919 END SUBROUTINE symmorphic
1926 SUBROUTINE rot1(ihc, r)
1951 REAL(
dp) :: r(3, 3, 48)
1953 INTEGER :: i, j, k, n, nv
1968 s = 0.5_dp*sqrt(3.0_dp)
1979 r(3, 3, n + 18) = 1._dp
1980 r(3, 3, n + 6) = -1._dp
1981 r(3, 3, n + 12) = -1._dp
1989 r(i, j, 6) = r(j, i, 2)
1991 r(i, j, 3) = r(i, j, 3) + r(i, k, 2)*r(k, j, 2)
1992 r(i, j, 8) = r(i, j, 8) + r(i, k, 2)*r(k, j, 7)
1993 r(i, j, 12) = r(i, j, 12) + r(i, k, 7)*r(k, j, 2)
1999 r(i, j, 5) = r(j, i, 3)
2001 r(i, j, 4) = r(i, j, 4) + r(i, k, 2)*r(k, j, 3)
2002 r(i, j, 9) = r(i, j, 9) + r(i, k, 2)*r(k, j, 8)
2003 r(i, j, 10) = r(i, j, 10) + r(i, k, 12)*r(k, j, 3)
2004 r(i, j, 11) = r(i, j, 11) + r(i, k, 12)*r(k, j, 2)
2012 r(i, j, nv) = -r(i, j, n)
2024 r(2, 3, 19) = -1._dp
2029 r(i, j, 20) = r(j, i, 19)
2030 r(i, j, 5) = r(j, i, 9)
2032 r(i, j, 2) = r(i, j, 2) + r(i, k, 19)*r(k, j, 19)
2033 r(i, j, 16) = r(i, j, 16) + r(i, k, 9)*r(k, j, 19)
2034 r(i, j, 23) = r(i, j, 23) + r(i, k, 19)*r(k, j, 9)
2041 r(i, j, 6) = r(i, j, 6) + r(i, k, 2)*r(k, j, 5)
2042 r(i, j, 7) = r(i, j, 7) + r(i, k, 16)*r(k, j, 23)
2043 r(i, j, 8) = r(i, j, 8) + r(i, k, 5)*r(k, j, 2)
2044 r(i, j, 10) = r(i, j, 10) + r(i, k, 2)*r(k, j, 9)
2045 r(i, j, 11) = r(i, j, 11) + r(i, k, 9)*r(k, j, 2)
2046 r(i, j, 12) = r(i, j, 12) + r(i, k, 23)*r(k, j, 16)
2047 r(i, j, 14) = r(i, j, 14) + r(i, k, 16)*r(k, j, 2)
2048 r(i, j, 15) = r(i, j, 15) + r(i, k, 2)*r(k, j, 16)
2049 r(i, j, 22) = r(i, j, 22) + r(i, k, 23)*r(k, j, 2)
2050 r(i, j, 24) = r(i, j, 24) + r(i, k, 2)*r(k, j, 23)
2057 r(i, j, 3) = r(i, j, 3) + r(i, k, 5)*r(k, j, 12)
2058 r(i, j, 4) = r(i, j, 4) + r(i, k, 5)*r(k, j, 10)
2059 r(i, j, 13) = r(i, j, 13) + r(i, k, 23)*r(k, j, 11)
2060 r(i, j, 17) = r(i, j, 17) + r(i, k, 16)*r(k, j, 12)
2061 r(i, j, 18) = r(i, j, 18) + r(i, k, 16)*r(k, j, 10)
2062 r(i, j, 21) = r(i, j, 21) + r(i, k, 12)*r(k, j, 15)
2068 r(1, 1, nv) = -r(1, 1, n)
2069 r(1, 2, nv) = -r(1, 2, n)
2070 r(1, 3, nv) = -r(1, 3, n)
2071 r(2, 1, nv) = -r(2, 1, n)
2072 r(2, 2, nv) = -r(2, 2, n)
2073 r(2, 3, nv) = -r(2, 3, n)
2074 r(3, 1, nv) = -r(3, 1, n)
2075 r(3, 2, nv) = -r(3, 2, n)
2076 r(3, 3, nv) = -r(3, 3, n)
2114 SUBROUTINE sppt2(iout, iq1, iq2, iq3, wvk0, nkpoint, &
2115 a1, a2, a3, b1, b2, b3, &
2116 inv, nc, ib, r, ntot, wvkl, lwght, lrot, &
2117 ncbrav, ibrav, istriz, &
2118 nhash, includ, list, rlist, delta)
2247 INTEGER :: iout, iq1, iq2, iq3
2250 REAL(
dp) :: a1(3), a2(3), a3(3), b1(3), b2(3), b3(3)
2251 INTEGER :: inv, nc, ib(48)
2252 REAL(
dp) :: r(3, 3, 48)
2254 REAL(
dp) :: wvkl(3, nkpoint)
2255 INTEGER :: lwght(nkpoint), lrot(48, nkpoint), &
2256 ncbrav, ibrav(48), istriz, nhash, &
2257 includ(nkpoint),
list(nkpoint + nhash)
2258 REAL(
dp) :: rlist(3, nkpoint), delta
2260 INTEGER,
PARAMETER :: no = 0, nrsdir = 100
2262 INTEGER :: i, i1, i2, i3, ibsign, igarb0, igarbage, &
2263 igarbg, ii, imesh, iop, iplace, &
2264 iremov, iwvk, j, jplace, k, n, nplane
2265 REAL(
dp) :: diff, proja(3), projb(3), &
2266 rsdir(4, nrsdir), ur1, ur2, ur3, &
2287 CALL bzdefine(iout, b1, b2, b3, rsdir, nplane, delta)
2294 CALL mesh(iout, wva, iplace, igarb0, igarbg, nkpoint, nhash, &
2300 ur1 = real(1 + iq1 - 2*i1, kind=
dp)/real(2*iq1, kind=
dp)
2301 ur2 = real(1 + iq2 - 2*i2, kind=
dp)/real(2*iq2, kind=
dp)
2302 ur3 = real(1 + iq3 - 2*i3, kind=
dp)/real(2*iq3, kind=
dp)
2304 wvk(i) = ur1*b1(i) + ur2*b2(i) + ur3*b3(i) + wvk0(i)
2307 CALL bzrduc(wvk, a1, a2, a3, b1, b2, b3, rsdir, &
2308 nrsdir, nplane, delta)
2309 IF (istriz == 1)
THEN
2316 wva(i) = wva(i) + r(i, j, ibrav(iop))*wvk(j)
2320 IF (.NOT. inside_bz(wva, rsdir, nplane, delta))
GOTO 450
2323 CALL mesh(iout, wva, iplace, igarb0, igarbg, &
2324 nkpoint, nhash,
list, rlist, delta)
2327 IF (iplace > 0) imesh = iplace
2328 IF (iplace > nkpoint)
GOTO 470
2333 CALL mesh(iout, wvk, iplace, igarb0, igarbg, &
2334 nkpoint, nhash,
list, rlist, delta)
2336 IF (iplace > nkpoint)
GOTO 470
2347 '(" KPSYM| THE WAVEVECTOR MESH CONTAINS ",I5," POINTS")') imesh
2348 WRITE (iout,
'(" KPSYM| THE POINTS ARE:")')
2351 CALL mesh(iout, wva, i, igarb0, igarbg, nkpoint, nhash, &
2353 IF (mod(i, 2) == 1)
THEN
2354 WRITE (iout,
'(1X,I5,3F10.4)', advance=
"no") i, wva
2356 WRITE (iout,
'(1X,I5,3F10.4)') i, wva
2362 IF (istriz == 1)
THEN
2366 DO i = 1, (imesh - 1)
2368 CALL mesh(iout, wva, iplace, igarb0, igarbg, &
2369 nkpoint, nhash,
list, rlist, delta)
2375 proja(1) = proja(1) + wva(k)*a1(k)
2376 proja(2) = proja(2) + wva(k)*a2(k)
2377 proja(3) = proja(3) + wva(k)*a3(k)
2380 DO j = (i + 1), imesh
2382 CALL mesh(iout, wvk, jplace, igarb0, igarbg, &
2383 nkpoint, nhash,
list, rlist, delta)
2389 projb(1) = projb(1) + wvk(k)*a1(k)
2390 projb(2) = projb(2) + wvk(k)*a2(k)
2391 projb(3) = projb(3) + wvk(k)*a3(k)
2395 diff = proja(k) - projb(k)
2396 IF (abs(real(nint(diff), kind=
dp) - diff) > delta)
GOTO 280
2399 CALL remove(wvk, jplace, igarb0, igarbg, &
2400 nkpoint, nhash,
list, rlist, delta)
2402 IF (jplace > 0) iremov = iremov + 1
2406 IF (iremov > 0 .AND. iout > 0) &
2407 WRITE (iout,
'(A,A,/,A,1X,I6,A,/)') &
2408 ' KPSYM| SOME OF THESE MESH POINTS ARE RELATED BY LATTICE ', &
2409 'TRANSLATION VECTORS', &
2410 ' KPSYM|', iremov,
' OF THE MESH POINTS REMOVED.'
2418 IF (btest(includ(iwvk), 0))
GOTO 350
2422 includ(iwvk) = ibset(includ(iwvk), 0)
2424 CALL mesh(iout, wvk, iplace, igarb0, igarbg, &
2425 nkpoint, nhash,
list, rlist, delta)
2427 CALL garbag(wvk, igarbage, igarb0, &
2428 nkpoint, nhash,
list, rlist, delta)
2429 IF (igarbage > 0)
GOTO 350
2432 includ(iwvk) = includ(iwvk) + ntot*2
2434 wvkl(i, ntot) = wvk(i)
2444 wva(i) = wva(i) + r(i, j, ib(n))*wvk(j)
2451 CALL mesh(iout, wva, iplace, igarb0, igarbg, &
2452 nkpoint, nhash,
list, rlist, delta)
2453 IF (iplace == 0)
THEN
2454 IF (istriz == -1)
THEN
2459 CALL garbag(wva, igarbage, igarb0, &
2460 nkpoint, nhash,
list, rlist, delta)
2461 IF (igarbage == 0)
THEN
2469 CALL garbag(wva, igarbage, igarb0, &
2470 nkpoint, nhash,
list, rlist, delta)
2471 IF (igarbage > 0)
GOTO 370
2474 IF (btest(includ(iplace), 0))
GOTO 364
2476 lwght(ntot) = lwght(ntot) + 1
2477 lrot(lwght(ntot), ntot) = ib(n)*ibsign
2479 includ(iplace) = ibset(includ(iplace), 0)
2482 includ(iplace) = includ(iplace) + ntot*2
2484 IF (ibsign == -1 .OR. inv == 0)
GOTO 370
2502 IF (ntot > nkpoint)
THEN
2504 WRITE (iout, *)
'IN SPPT2 NUMBER OF SPECIAL POINTS = ', ntot
2506 WRITE (iout, *)
'BUT NKPOINT = ', nkpoint
2513 WRITE (iout,
'(/,A,4X,A)') &
2514 ' KPSYM|',
'CROSS TABLE RELATING MESH POINTS WITH SPECIAL POINTS:'
2516 WRITE (iout,
'(5(4X,"IK -> SK"))')
2518 iplace = includ(i)/2
2520 WRITE (iout,
'(1X,I5,1X,I5)', advance=
"no") i, iplace
2521 IF ((mod(i, 5) == 0) .AND. iout > 0) &
2524 IF ((mod(j - 1, 5) /= 0) .AND. iout > 0) &
2533 WRITE (iout,
'(A,/)')
' SUBROUTINE SPPT2 *** FATAL ERROR ***'
2535 WRITE (iout,
'(A,3F10.4,/,A,3F10.4,A,/,A,I3,A)') &
2536 ' THE VECTOR ', wva, &
2537 ' GENERATED FROM ', wvk,
' IN THE BASIC MESH', &
2538 ' BY ROTATION NO. ', ibrav(iop),
' IS OUTSIDE THE 1BZ'
2539 CALL stopgm(
'SPPT2',
'VECTOR OUTSIDE THE 1BZ')
2543 WRITE (iout,
'(A,/)')
' SUBROUTINE SPPT2 *** FATAL ERROR ***'
2545 WRITE (iout, *)
'MESH SIZE EXCEEDS NKPOINT=', nkpoint
2546 CALL stopgm(
'SPPT2',
'MESH SIZE EXCEEDED')
2550 WRITE (iout,
'(A,/)')
' SUBROUTINE SPPT2 *** FATAL ERROR ***'
2552 WRITE (iout,
'(A,3F10.4,/,A,3F10.4,A,/,A,I3,A)') &
2553 ' THE VECTOR ', wva, &
2554 ' GENERATED FROM ', wvk,
' IN THE BASIC MESH', &
2555 ' BY ROTATION NO. ', ib(n),
' IS NOT IN THE LIST'
2556 CALL stopgm(
'SPPT2',
'VECTOR NOT IN THE LIST')
2559 END SUBROUTINE sppt2
2573 SUBROUTINE mesh(iout, wvk, iplace, igarb0, igarbg, &
2574 nmesh, nhash, list, rlist, delta)
2593 INTEGER :: iplace, igarb0, igarbg, nmesh, nhash, &
2595 REAL(
dp) :: rlist(3, nmesh), delta
2597 INTEGER,
PARAMETER :: nil = 0
2599 INTEGER :: i, ihash, ipoint, j
2600 INTEGER,
SAVE :: istore
2601 REAL(
dp) :: delta1, rhash
2607 delta1 = 10._dp*delta
2608 IF (iplace <= -2)
THEN
2609 DO i = 1, nhash + nmesh
2618 ELSEIF ((iplace > -2) .AND. (iplace <= 0))
THEN
2620 rhash = 0.7890_dp*wvk(1) &
2621 + 0.6810_dp*wvk(2) &
2622 + 0.5811_dp*wvk(3) + delta
2623 ihash = int(abs(rhash)*real(nhash, kind=
dp))
2624 ihash = mod(ihash, nhash) + nmesh + 1
2626 ipoint =
list(ihash)
2629 IF (ipoint == nil)
GOTO 130
2632 IF (abs(wvk(j) - rlist(j, ipoint)) > delta1)
GOTO 115
2639 ipoint =
list(ihash)
2643 WRITE (iout,
'(2A,/,A)') &
2644 ' SUBROUTINE MESH *** FATAL ERROR *** LINKED LIST', &
2645 ' TOO LONG ***',
' CHOOSE A BETTER HASH-FUNCTION'
2646 CALL stopgm(
'MESH',
'WARNING')
2649 IF (iplace == -1)
THEN
2655 list(ihash) = istore
2656 IF (istore > nmesh)
THEN
2658 WRITE (iout,
'(A)')
'SUBROUTINE MESH *** FATAL ERROR ***'
2660 WRITE (iout,
'(A,I10,A,/,A,3F10.5)') &
2661 ' ISTORE=', istore,
' EXCEEDS DIMENSIONS', &
2663 CALL stopgm(
'MESH',
'WARNING')
2667 rlist(i, istore) = wvk(i)
2675 IF (iplace == 0)
RETURN
2684 IF (ipoint >= istore)
GOTO 190
2686 wvk(i) = rlist(i, ipoint)
2695 WRITE (iout,
'(A,/,A,I5,A,/)') &
2696 ' SUBROUTINE MESH *** WARNING ***', &
2697 ' IPLACE = ', iplace, &
2698 ' IS BEYOND THE LISTS - WVK SET TO 1.0E38'
2717 SUBROUTINE remove(wvk, iplace, igarb0, igarbg, &
2718 nmesh, nhash, list, rlist, delta)
2731 INTEGER :: iplace, igarb0, igarbg, nmesh, nhash, &
2733 REAL(
dp) :: rlist(3, nmesh), delta
2735 INTEGER,
PARAMETER :: nil = 0
2737 INTEGER :: i, ihash, ipoint, j
2738 REAL(
dp) :: delta1, rhash
2744 delta1 = 10._dp*delta
2746 rhash = 0.7890_dp*wvk(1) &
2747 + 0.6810_dp*wvk(2) &
2748 + 0.5811_dp*wvk(3) + delta
2749 ihash = int(abs(rhash)*real(nhash, kind=
dp))
2750 ihash = mod(ihash, nhash) + nmesh + 1
2752 ipoint =
list(ihash)
2755 IF (ipoint == nil)
THEN
2762 IF (abs(wvk(j) - rlist(j, ipoint)) > delta1)
GOTO 215
2769 IF (igarb0 == 0)
THEN
2773 list(igarbg) = ipoint
2782 ipoint =
list(ihash)
2785 CALL stopgm(
'MESH',
'LIST TOO LONG')
2788 END SUBROUTINE remove
2800 SUBROUTINE garbag(wvk, iplace, igarb0, &
2801 nmesh, nhash, list, rlist, delta)
2814 INTEGER :: iplace, igarb0, nmesh, nhash, &
2816 REAL(
dp) :: rlist(3, nmesh), delta
2818 INTEGER,
PARAMETER :: nil = 0
2820 INTEGER :: i, ihash, ipoint, j
2827 delta1 = 10._dp*delta
2833 IF (ipoint == nil)
THEN
2840 IF (abs(wvk(j) - rlist(j, ipoint)) > delta1)
GOTO 315
2848 ipoint =
list(ihash)
2851 CALL stopgm(
'GARBAG',
'LIST TOO LONG')
2854 END SUBROUTINE garbag
2870 SUBROUTINE bzrduc(wvk, a1, a2, a3, b1, b2, b3, rsdir, nrsdir, nplane, delta)
2876 REAL(
dp) :: wvk(3), a1(3), a2(3), a3(3), b1(3), &
2879 REAL(
dp) :: rsdir(4, nrsdir)
2883 INTEGER,
PARAMETER :: nzones = 4, nnn = 2*nzones + 1, &
2886 INTEGER :: i, i1, i2, i3, n1, n2, n3, nn1, nn2, nn3
2888 REAL(
dp) :: wb(3), wva(3)
2896 IF (.NOT. inside_bz(wvk, rsdir, nplane, delta))
THEN
2900 wb(1) = wvk(1)*a1(1) + wvk(2)*a1(2) + wvk(3)*a1(3)
2901 wb(2) = wvk(1)*a2(1) + wvk(2)*a2(2) + wvk(3)*a2(3)
2902 wb(3) = wvk(1)*a3(1) + wvk(2)*a3(2) + wvk(3)*a3(3)
2907 n1_loop:
DO n1 = 1, nnn
2914 wva(i) = wvk(i) + real(i1, kind=
dp)*b1(i) + real(i2, kind=
dp)*b2(i) + &
2915 REAL(i3, kind=
dp)*b3(i)
2917 inside = inside_bz(wva, rsdir, nplane, delta)
2918 IF (inside)
EXIT n1_loop
2926 END SUBROUTINE bzrduc
2937 FUNCTION inside_bz(wvk, rsdir, nplane, delta)
RESULT(inbz)
2938 REAL(kind=
dp),
DIMENSION(3) :: wvk
2939 REAL(kind=
dp),
DIMENSION(:, :) :: rsdir
2941 REAL(kind=
dp) :: delta
2945 REAL(kind=
dp) :: projct
2949 projct = (rsdir(1, n)*wvk(1) + rsdir(2, n)*wvk(2) + rsdir(3, n)*wvk(3))/rsdir(4, n)
2950 IF (abs(projct) > 0.5_dp + delta)
THEN
2956 END FUNCTION inside_bz
2975 SUBROUTINE bzdefine(iout, b1, b2, b3, rsdir, nplane, delta)
2977 REAL(kind=
dp),
DIMENSION(3) :: b1, b2, b3
2978 REAL(kind=
dp),
DIMENSION(:, :) :: rsdir
2980 REAL(kind=
dp) :: delta
2982 INTEGER :: i, i1, i2, i3, n, n1, n2, n3, nb1, nb2, &
2983 nb3, nnb1, nnb2, nnb3, nrsdir
2984 REAL(kind=
dp) :: b1len, b2len, b3len, bmax, projct
2985 REAL(kind=
dp),
DIMENSION(3) :: bvec
2987 nrsdir =
SIZE(rsdir, 2)
2989 b1len = b1(1)**2 + b1(2)**2 + b1(3)**2
2990 b2len = b2(1)**2 + b2(2)**2 + b2(3)**2
2991 b3len = b3(1)**2 + b3(2)**2 + b3(3)**2
2993 bmax = b1len + b2len + b3len
2994 nb1 = int(sqrt(bmax/b1len) + delta) + 1
2995 nb2 = int(sqrt(bmax/b2len) + delta) + 1
2996 nb3 = int(sqrt(bmax/b3len) + delta) + 1
2999 rsdir(1:3, 1) = b1(1:3)
3000 rsdir(1:3, 2) = b2(1:3)
3001 rsdir(1:3, 3) = b3(1:3)
3017 IF (i1 == 0 .AND. i2 == 0 .AND. i3 == 0)
GOTO 150
3019 bvec(i) = real(i1, kind=
dp)*b1(i) + real(i2, kind=
dp)*b2(i) + &
3020 REAL(i3, kind=
dp)*b3(i)
3024 projct = 0.5_dp*(rsdir(1, n)*bvec(1) + rsdir(2, n)*bvec(2) &
3025 + rsdir(3, n)*bvec(3))/rsdir(4, n)
3029 IF (abs(projct) > 0.5_dp - delta)
GOTO 150
3033 cpassert(nplane <= nrsdir)
3035 rsdir(i, nplane) = bvec(i)
3038 rsdir(4, nplane) = bvec(1)**2 + bvec(2)**2 + bvec(3)**2
3045 WRITE (iout,
'(A,I3,A,/,A,/,100(" KPSYM|",1X,3F10.4,/))') &
3046 ' KPSYM| The 1st Brillouin zone is confined by (at most)', &
3047 nplane,
' planes', &
3048 ' KPSYM| as defined by the +/- halves of the vectors:', &
3049 ((rsdir(i, n), i=1, 3), n=1, nplane)
3052 END SUBROUTINE bzdefine
3059 SUBROUTINE stopgm(a, b)
3060 CHARACTER(LEN=*) :: a, b
3063 cpabort(
"stopgm@kpsym")
3065 END SUBROUTINE stopgm
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 ...
Collection of simple mathematical functions and subroutines.
subroutine, public invmat(a, info)
returns inverse of matrix using the lapack routines DGETRF and DGETRI
subroutine, public diag(n, a, d, v)
Diagonalize matrix a. The eigenvalues are returned in vector d and the eigenvectors are returned in m...
Utilities for string manipulations.
elemental subroutine, public xstring(string, ia, ib)
...