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
191 WRITE (iout,
'(" KPSYM| NUMBER OF ATOMS (STRUCT):",I6)') nat
193 WRITE (iout,
'(" KPSYM|",10X,"K TYPE",14X,"X(K)")')
199 IF (ty(j) .EQ. ty(i))
THEN
207 IF (itype .GT. nsp)
THEN
209 WRITE (iout,
'(A,I4,")")') &
210 ' KPSYM| NUMBER OF ATOMIC TYPES EXCEEDS DIMENSION (NSP=)', &
213 WRITE (iout,
'(" KPSYM| THE ARRAY TY IS:",/,9(1X,10I7,/))') &
215 CALL stopgm(
'K290',
'FATAL ERROR')
219 WRITE (iout,
'(" KPSYM|",6X,I5,I6,3F10.5)') &
220 i, ty(i), (xkapa(j, i), j=1, 3)
225 dtotstr = delta*delta
229 totstr = totstr + abs(strain(i))
231 IF (totstr .GT. dtotstr) istrin = 1
234 volum = a1(1)*a2(2)*a3(3) + a2(1)*a3(2)*a1(3) + &
235 a3(1)*a1(2)*a2(3) - a1(3)*a2(2)*a3(1) - &
236 a2(3)*a3(2)*a1(1) - a3(3)*a1(2)*a2(1)
238 b1(1) = (a2(2)*a3(3) - a2(3)*a3(2))/volum
239 b1(2) = (a2(3)*a3(1) - a2(1)*a3(3))/volum
240 b1(3) = (a2(1)*a3(2) - a2(2)*a3(1))/volum
241 b2(1) = (a3(2)*a1(3) - a3(3)*a1(2))/volum
242 b2(2) = (a3(3)*a1(1) - a3(1)*a1(3))/volum
243 b2(3) = (a3(1)*a1(2) - a3(2)*a1(1))/volum
244 b3(1) = (a1(2)*a2(3) - a1(3)*a2(2))/volum
245 b3(2) = (a1(3)*a2(1) - a1(1)*a2(3))/volum
246 b3(3) = (a1(1)*a2(2) - a1(2)*a2(1))/volum
256 CALL group1s(iout, a1, a2, a3, nat, ty, xkapa, b1, b2, b3, &
257 ihg, ihc, isy, li, nc, indpg, ib, ntvec, &
258 v, f0, r, tvec, origin, rx, isc, delta)
267 WRITE (iout,
'(A,/,A,/,A)') &
268 ' KPSYM| ALTHOUGH THE POINT GROUP OF THE CRYSTAL DOES NOT', &
269 ' KPSYM| CONTAIN INVERSION, THE SPECIAL POINT GENERATION ALGORITHM', &
270 ' KPSYM| WILL CONSIDER IT AS A SYMMETRY OPERATION'
277 WRITE (iout,
'(/," KPSYM| CRYSTALLOGRAPHIC DATA:")')
278 WRITE (iout,
'(4X,"A1",3F10.5,10X,"B1",3F10.5)') a1, b1
279 WRITE (iout,
'(4X,"A2",3F10.5,10X,"B2",3F10.5)') a2, b2
280 WRITE (iout,
'(4X,"A3",3F10.5,10X,"B3",3F10.5)') a3, b3
286 WRITE (iout,
'(/," KPSYM| GROUP-THEORETICAL INFORMATION:")')
290 '(" KPSYM| POINT GROUP OF THE PRIMITIVE LATTICE: ",A," SYSTEM")') &
296 WRITE (iout,
'(" KPSYM|",4X,"NONSYMMORPHIC GROUP")')
297 ELSEIF (isy .EQ. 1)
THEN
299 WRITE (iout,
'(" KPSYM|",4X,"SYMMORPHIC GROUP")')
300 ELSEIF (isy .EQ. -1)
THEN
302 WRITE (iout,
'(" KPSYM|",4X,"SYMMORPHIC GROUP WITH NON-STANDARD ORIGIN")')
303 ELSEIF (isy .EQ. -2)
THEN
305 WRITE (iout,
'(" KPSYM|",4X,"NONSYMMORPHIC GROUP???")')
310 WRITE (iout,
'(" KPSYM|",4X,"NO INVERSION SYMMETRY")')
311 ELSEIF (li .GT. 0)
THEN
313 WRITE (iout,
'(" KPSYM|",4X,"INVERSION SYMMETRY")')
318 '(" KPSYM|",4X,"TOTAL NUMBER OF ELEMENTS IN THE POINT GROUP:",I3)') nc
320 WRITE (iout,
'(" KPSYM|",4X,"TO SUM UP: (",I1,5I3,")")') &
321 ihg, ihc, isy, li, nc, indpg
324 WRITE (iout,
'(/," KPSYM|",4X,"LIST OF THE ROTATIONS:")')
326 WRITE (iout,
'(7X,12I4)') (ib(i), i=1, nc)
330 WRITE (iout,
'(/," KPSYM|",4X,"NONPRIMITIVE TRANSLATIONS:")')
332 WRITE (iout,
'(A,A)') &
333 ' ROT V IN THE BASIS A1, A2, A3 ', &
334 'V IN CARTESIAN COORDINATES'
338 vv0(j) = v(1, i)*a1(j) + v(2, i)*a2(j) + v(3, i)*a3(j)
341 WRITE (iout,
'(1X,I3,3F10.5,3X,3F10.5)') &
342 ib(i), (v(j, i), j=1, 3), vv0
349 '(/," KPSYM|",4X,"ATOM TRANSFORMATION TABLE (MARADUDIN,VOSKO):")')
351 WRITE (iout,
'(5(4X,"R AT->AT"))')
353 WRITE (iout,
'(I5," [Identity]")') 1
357 WRITE (iout,
'(I5,2I4)', advance=
"no") ib(k), j, f0(k, j)
358 IF ((mod(j, 5) .EQ. 0) .AND. iout > 0) &
361 IF ((mod(j - 1, 5) .NE. 0) .AND. iout > 0) &
366 WRITE (iout,
'(/," KPSYM|",4X,"LIST OF THE 3 X 3 ROTATION MATRICES:")')
371 '(4X,I3," (",I2,": ",A11,")",2(3F14.6,/,25X),3F14.6)') &
372 k, ib(k), rname_hexai(ib(k)), ((r(i, j, ib(k)), j=1, 3), i=1, 3)
378 '(4X,I3," (",I2,": ",A10,") ",2(3F14.6,/,25X),3F14.6)') &
379 k, ib(k), rname_cubic(ib(k)), ((r(i, j, ib(k)), j=1, 3), i=1, 3)
385 CALL group1s(iout, a01, a02, a03, 1, ty, x0, b01, b02, b03, &
386 ihg0, ihc0, isy0, li0, nc0, indpg0, ib0, ntvec0, &
387 v0, f00, r0, tvec0, origin0, rx, isc, delta)
394 WRITE (iout,
'(/,1X,19("*"),A,25("*"))') &
395 ' GENERATION OF SPECIAL POINTS '
398 WRITE (iout,
'(A,/,1X,3I5)') &
399 ' KPSYM| MONKHORST-PACK PARAMETERS (GENERALIZED) IQ1,IQ2,IQ3:', &
403 WRITE (iout,
'(A,/,1X,3F10.5)') &
404 ' KPSYM| CONSTANT VECTOR SHIFT (MACDONALD) OF THIS MESH:', wvk0
405 IF (iabs(iq1) + iabs(iq2) + iabs(iq3) .EQ. 0)
GOTO 710
406 IF (abs(istriz) .NE. 1)
THEN
408 WRITE (iout,
'(" KPSYM| INVALID SWITCH FOR SYMMETRIZATION",I10)') istriz
410 WRITE (iout,
'(" KPSYM| INVALID SWITCH FOR SYMMETRIZATION",I10)') istriz
411 CALL stopgm(
'K290',
'ISTRIZ WRONG ARGUMENT')
414 WRITE (iout,
'(" KPSYM| SYMMETRIZATION SWITCH: ",I3)', advance=
"no") istriz
415 IF (istriz .EQ. 1)
THEN
417 WRITE (iout,
'(" (SYMMETRIZATION OF MONKHORST-PACK MESH)")')
420 WRITE (iout,
'(" (NO SYMMETRIZATION OF MONKHORST-PACK MESH)")')
430 IF (nc .GT. nc0)
THEN
434 IF (ntvec .EQ. 1)
THEN
436 WRITE (iout, *)
' KPSYM| NUMBER OF ROTATIONS FOR BRAVAIS LATTICE', nc0
438 WRITE (iout, *)
' KPSYM| NUMBER OF ROTATIONS FOR CRYSTAL LATTICE', nc
440 WRITE (iout, *)
' KPSYM| NO DUPLICATION FOUND'
441 CALL stopgm(
'ERROR', &
442 'SOMETHING IS WRONG IN GROUP DETERMINATION')
449 WRITE (iout,
'(/,1X,20("! "),"WARNING",20("!"))')
451 WRITE (iout,
'(A)') &
452 ' KPSYM| THE CRYSTAL HAS MORE SYMMETRY THAN THE BRAVAIS LATTICE'
454 WRITE (iout,
'(A)') &
455 ' KPSYM| BECAUSE THIS IS NOT A PRIMITIVE CELL'
457 WRITE (iout,
'(A)') &
458 ' KPSYM| USE ONLY SYMMETRY FROM BRAVAIS LATTICE'
460 WRITE (iout,
'(1X,20("! "),"WARNING",20("!"),/)')
462 CALL sppt2(iout, iq1, iq2, iq3, wvk0, nkpoint, &
463 a01, a02, a03, b01, b02, b03, &
464 invadd, nc, ib, r, ntot, wvkl, lwght, lrot, nc0, ib0, istriz, &
465 nhash, includ,
list, rlist, delta)
470 WRITE (iout,
'(/," KPSYM|",1X,I5," SPECIAL POINTS GENERATED")') ntot
471 IF (ntot .EQ. 0)
THEN
473 ELSE IF (ntot .LT. 0)
THEN
475 WRITE (iout,
'(A,I5,/,A,/,A)')
' KPSYM| DIMENSION NKPOINT =', nkpoint, &
476 ' KPSYM| INSUFFICIENT FOR ACCOMMODATING ALL THE SPECIAL POINTS', &
477 ' KPSYM| WHAT FOLLOWS IS AN INCOMPLETE LIST'
485 iswght = iswght + lwght(i)
488 WRITE (iout,
'(8X,A,T33,A,4X,A)') &
489 'WAVEVECTOR K',
'WEIGHT',
'UNFOLDING ROTATIONS'
493 IF (abs(wvkl(i, l)) .LT. delta) wvkl(i, l) = 0._dp
495 IF (istrin .NE. 0)
THEN
501 proj1 = proj1 + wvkl(i, l)*a01(i)
502 proj2 = proj2 + wvkl(i, l)*a02(i)
503 proj3 = proj3 + wvkl(i, l)*a03(i)
506 wvkl(i, l) = proj1*b1(i) + proj2*b2(i) + proj3*b3(i)
511 WRITE (iout, fmt=
'(1X,I5,3F8.4,I8,T42,12I3)') &
512 l, (wvkl(i, l), i=1, 3), lwght(l), (lrot(i, l), i=1, min(lmax, 12))
515 WRITE (iout, fmt=
'(T42,12I3)') &
516 (lrot(i, l), i=j, min(lmax, j - 1 + 12))
520 WRITE (iout,
'(24X,"TOTAL:",I8)') iswght
557 SUBROUTINE group1s(iout, a1, a2, a3, nat, ty, x, b1, b2, b3, &
558 ihg, ihc, isy, li, nc, indpg, ib, ntvec, &
559 v, f0, r, tvec, origin, rx, isc, delta)
663 REAL(
dp) :: a1(3), a2(3), a3(3)
664 INTEGER :: nat, ty(nat)
665 REAL(
dp) :: x(3, nat), b1(3), b2(3), b3(3)
666 INTEGER :: ihg, ihc, isy, li, nc, indpg, ib(48), &
669 INTEGER :: f0(49, nat)
670 REAL(
dp) :: r(3, 3, 48), tvec(3, nat), origin(3), &
676 REAL(
dp) :: a(3, 3), ai(3, 3), ap(3, 3), api(3, 3)
703 CALL primlatt(a, ai, ap, api, nat, ty, x, ntvec, tvec, f0, isc, delta)
706 CALL pgl1(ap, api, ihc, nc, ib, ihg, r, delta)
707 IF (ntvec .GT. 1)
THEN
712 CALL pgl1(a, ai, ihc, nc, ib, ihg, r, delta)
713 IF (ncprim .GT. nc)
THEN
715 CALL pgl1(ap, api, ihc, nc, ib, ihg, r, delta)
720 CALL atftm1(iout, r, v, x, f0, origin, ib, ty, nat, ihg, ihc, rx, &
721 nc, indpg, ntvec, a, ai, li, isy, isc, delta)
723 IF (iout .GT. 0)
THEN
726 WRITE (iout,
'(1X,A)') &
727 'KPSYM| THE POINT GROUP OF THE CRYSTAL CONTAINS THE INVERSION'
739 SUBROUTINE calbrec(a, ai)
749 REAL(
dp) :: a(3, 3), ai(3, 3)
751 INTEGER :: i, il, iu, j, jl, ju
754 det = a(1, 1)*a(2, 2)*a(3, 3) + a(2, 1)*a(1, 3)*a(3, 2) + &
755 a(3, 1)*a(1, 2)*a(2, 3) - a(1, 1)*a(2, 3)*a(3, 2) - &
756 a(2, 1)*a(1, 2)*a(3, 3) - a(3, 1)*a(1, 3)*a(2, 2)
768 ai(j, i) = (-1._dp)**(i + j)*det* &
769 (a(il, jl)*a(iu, ju) - a(il, ju)*a(iu, jl))
774 END SUBROUTINE calbrec
791 SUBROUTINE primlatt(a, ai, ap, api, nat, ty, x, ntvec, tvec, f0, isc, delta)
817 REAL(
dp) :: a(3, 3), ai(3, 3), ap(3, 3), api(3, 3)
818 INTEGER :: nat, ty(nat)
819 REAL(
dp) :: x(3, nat)
821 REAL(
dp) :: tvec(3, nat)
822 INTEGER :: f0(49, nat), isc(nat)
825 INTEGER :: i, il, iv, j, k2
827 REAL(
dp) :: vr(3), xb(3)
843 IF (ty(1) .NE. ty(k2))
GOTO 100
845 xb(i) = x(i, k2) - x(i, 1)
848 CALL rlv3(ai, xb, vr, il, delta)
849 CALL checkrlv3(1, nat, ty, x, x, vr, f0, ai, isc, .true., oksym, delta)
856 IF (f0(49, i) .GT. f0(1, i)) f0(49, i) = f0(1, i)
859 tvec(i, ntvec) = vr(i)
873 IF (ntvec .EQ. 1)
THEN
882 xb(i) = tvec(1, iv)*a(i, 1) &
883 + tvec(2, iv)*a(i, 2) &
884 + tvec(3, iv)*a(i, 3)
887 CALL rlv3(api, xb, vr, il, delta)
889 IF (abs(vr(i)) .GT. delta)
THEN
890 il = nint(1._dp/abs(vr(i)))
897 CALL calbrec(ap, api)
907 END SUBROUTINE primlatt
920 SUBROUTINE pgl1(a, ai, ihc, nc, ib, ihg, r, delta)
957 REAL(
dp) :: a(3, 3), ai(3, 3)
958 INTEGER :: ihc, nc, ib(48), ihg
959 REAL(
dp) :: r(3, 3, 48), delta
961 INTEGER :: i, j, k, lx, n, nr
962 REAL(
dp) :: tr, vr(3), xa(3)
981 xa(i) = xa(i) + r(i, j, n)*a(j, k)
984 CALL rlv3(ai, xa, vr, lx, delta)
990 IF (tr .GT. delta)
GOTO 140
1000 IF (nc .EQ. 12) ihg = 6
1001 IF (nc .GT. 12) ihg = 7
1002 IF (nc .GE. 12)
RETURN
1006 IF (nc .LT. 4) ihg = 1
1007 IF (nc .EQ. 4) ihg = 2
1008 IF (nc .GT. 4) ihg = 3
1009 IF (nc .EQ. 16) ihg = 4
1010 IF (nc .GT. 16) ihg = 5
1026 SUBROUTINE rlv3(ai, xb, vr, il, delta)
1047 REAL(
dp) :: ai(3, 3), xb(3), vr(3)
1058 ts = abs(xb(1)) + abs(xb(2)) + abs(xb(3))
1059 IF (ts .LE. delta)
RETURN
1061 vr(i) = vr(i) + ai(i, 1)*xb(1) + ai(i, 2)*xb(2) + ai(i, 3)*xb(3)
1062 il = il + nint(abs(vr(i)))
1066 vr(i) = nint(vr(i)) - vr(i)
1096 SUBROUTINE atftm1(iout, r, v, x, f0, origin, ib, ty, nat, ihg, ihc, &
1097 rx, nc, indpg, ntvec, a, ai, li, isy, isc, delta)
1163 REAL(
dp) :: r(3, 3, 48), v(3, 48), origin(3)
1164 INTEGER :: ib(48), nat, ty(nat), f0(49, nat)
1165 REAL(
dp) :: x(3, nat)
1167 REAL(
dp) :: rx(3, nat)
1168 INTEGER :: nc, indpg, ntvec
1169 REAL(
dp) :: a(3, 3), ai(3, 3)
1170 INTEGER :: li, isy, isc(nat)
1173 CHARACTER(len=10),
DIMENSION(48),
PARAMETER :: rname_cubic = (/
' 1 ',
' 2[ 10 0] ', &
1174 ' 2[ 01 0] ',
' 2[ 00 1] ',
' 3[-1-1-1]',
' 3[ 11-1] ',
' 3[-11 1] ',
' 3[ 1-11] ', &
1175 ' 3[ 11 1] ',
' 3[-11-1] ',
' 3[-1-11] ',
' 3[ 1-1-1]',
' 2[-11 0] ',
' 4[ 00 1] ', &
1176 ' 4[ 00-1] ',
' 2[ 11 0] ',
' 2[ 0-11] ',
' 2[ 01 1] ',
' 4[ 10 0] ',
' 4[-10 0] ', &
1177 ' 2[-10 1] ',
' 4[ 0-10] ',
' 2[ 10 1] ',
' 4[ 01 0] ',
'-1 ',
'-2[ 10 0] ', &
1178 '-2[ 01 0] ',
'-2[ 00 1] ',
'-3[-1-1-1]',
'-3[ 11-1] ',
'-3[-11 1] ',
'-3[ 1-11] ', &
1179 '-3[ 11 1] ',
'-3[-11-1] ',
'-3[-1-11] ',
'-3[ 1-1-1]',
'-2[-11 0] ',
'-4[ 00 1] ', &
1180 '-4[ 00-1] ',
'-2[ 11 0] ',
'-2[ 0-11] ',
'-2[ 01 1] ',
'-4[ 10 0] ',
'-4[-10 0] ', &
1181 '-2[-10 1] ',
'-4[ 0-10] ',
'-2[ 10 1] ',
'-4[ 01 0] '/)
1182 CHARACTER(len=11),
DIMENSION(24),
PARAMETER :: rname_hexai = (/
' 1 ',
' 6[ 00 1] ', &
1183 ' 3[ 00 1] ',
' 2[ 00 1] ',
' 3[ 00 -1] ',
' 6[ 00 -1] ',
' 2[ 01 0] ',
' 2[-11 0] ', &
1184 ' 2[ 10 0] ',
' 2[ 21 0] ',
' 2[ 11 0] ',
' 2[ 12 0] ',
'-1 ',
'-6[ 00 1] ', &
1185 '-3[ 00 1] ',
'-2[ 00 1] ',
'-3[ 00 -1] ',
'-6[ 00 -1] ',
'-2[ 01 0] ',
'-2[-11 0] ', &
1186 '-2[ 10 0] ',
'-2[ 21 0] ',
'-2[ 11 0] ',
'-2[ 12 0] '/)
1187 CHARACTER(len=12),
DIMENSION(7),
PARAMETER :: icst = (/
'TRICLINIC ',
'MONOCLINIC ', &
1188 'ORTHORHOMBIC',
'TETRAGONAL ',
'CUBIC ',
'TRIGONAL ',
'HEXAGONAL '/)
1189 CHARACTER(len=3),
DIMENSION(32),
PARAMETER :: pgrd = (/
'c1 ',
'ci ',
'c2 ',
'c1h',
'c2h', &
1190 'c3 ',
'c3i',
'd3 ',
'c3v',
'd3 ',
'c4 ',
's4 ',
'c4h',
'd4 ',
'c4v',
'd2d',
'd4h',
'c6 ',&
1191 'c3h',
'c6h',
'd6 ',
'c6v',
'd3h',
'd6h',
'd2 ',
'c2v',
'd2h',
't ',
'th ',
'o ',
'td ',&
1193 CHARACTER(len=5),
DIMENSION(32),
PARAMETER :: pgrp = (/
' 1',
' <1>',
' 2',
' m', &
1194 ' 2/m',
' 3',
' <3>',
' 32',
' 3m',
' <3>m',
' 4',
' <4>',
' 4/m',
' 422', &
1195 ' 4mm',
'<4>2m',
'4/mmm',
' 6',
' <6>',
' 6/m',
' 622',
' 6mm',
'<6>m2',
'6/mmm', &
1196 ' 222',
' mm2',
' mmm',
' 23',
' m3',
' 432',
'<4>3m',
' m3m'/)
1198 INTEGER :: i, iis(48), il, info, j, k, k2, l, n, &
1200 LOGICAL :: nodupli, oksym
1201 REAL(
dp) :: vc(3, 48), vr(3), vs, xb(3)
1203 nodupli = ntvec .EQ. 1
1215 rx(i, k) = r(i, 1, l)*x(1, k) + r(i, 2, l)*x(2, k) + r(i, 3, l)*x(3, k)
1223 CALL checkrlv3(n, nat, ty, rx, x, vr, f0, ai, isc, nodupli, oksym, delta)
1230 IF (f0(49, k2) .LT. k2)
GOTO 185
1231 IF (ty(1) .NE. ty(k2))
GOTO 185
1233 xb(i) = rx(i, 1) - x(i, k2)
1236 CALL rlv3(ai, xb, vr, il, delta)
1245 CALL checkrlv3(n, nat, ty, rx, x, vr, f0, ai, isc, nodupli, oksym, delta)
1270 IF (ihg .LT. 6) ni = 25
1274 IF (iis(l) .EQ. 0)
GOTO 230
1277 IF (ib(i) .EQ. ni) li = i
1287 vs = vs + abs(v(1, n)) + abs(v(2, n)) + abs(v(3, n))
1292 IF (vs .GT. delta)
THEN
1300 IF (ihg .LT. 6)
THEN
1303 WRITE (iout,
'(" ATFTM1! IHG=",A," NC=",I2)') icst(ihg), nc
1304 CALL stopgm(
'ATFTM1',
'NUMBER OF ROTATION NULL')
1306 ELSEIF (nc .EQ. 1)
THEN
1309 ELSEIF (nc .EQ. 2 .AND. ib(2) .EQ. 25)
THEN
1312 ELSEIF (nc .EQ. 2 .AND. ( &
1321 ELSEIF (nc .EQ. 2 .AND. ( &
1322 ib(2) .EQ. 28 .OR. &
1323 ib(2) .EQ. 26 .OR. &
1324 ib(2) .EQ. 27))
THEN
1329 ELSEIF (nc .EQ. 4 .AND. ( &
1330 ib(4) .EQ. 28 .OR. &
1331 ib(4) .EQ. 27 .OR. &
1332 ib(4) .EQ. 26 .OR. &
1333 ib(4) .EQ. 37 .OR. &
1334 ib(4) .EQ. 40))
THEN
1341 ELSEIF (nc .EQ. 4 .AND. ( &
1342 ib(4) .EQ. 15 .OR. &
1343 ib(4) .EQ. 20 .OR. &
1344 ib(4) .EQ. 24))
THEN
1350 ELSEIF (nc .EQ. 4 .AND. ( &
1351 ib(4) .EQ. 39 .OR. &
1352 ib(4) .EQ. 44 .OR. &
1353 ib(4) .EQ. 48))
THEN
1358 ELSEIF (nc .EQ. 8 .AND. ( &
1359 (ib(3) .EQ. 14 .AND. ib(8) .EQ. 39) .OR. &
1360 (ib(3) .EQ. 19 .AND. ib(8) .EQ. 44) .OR. &
1361 (ib(3) .EQ. 22 .AND. ib(8) .EQ. 48)))
THEN
1366 ELSEIF (nc .EQ. 8 .AND. ib(4) .EQ. 4 .AND. ( &
1367 ib(8) .EQ. 16 .OR. &
1368 ib(8) .EQ. 20 .OR. &
1369 ib(8) .EQ. 24))
THEN
1374 ELSEIF (nc .EQ. 8 .AND. ( &
1375 ib(8) .EQ. 40 .OR. &
1376 ib(8) .EQ. 42 .OR. &
1377 ib(8) .EQ. 47))
THEN
1382 ELSEIF (nc .EQ. 8 .AND. ( &
1383 (ib(3) .EQ. 13 .AND. ib(8) .EQ. 39) .OR. &
1384 (ib(3) .EQ. 17 .AND. ib(8) .EQ. 44) .OR. &
1385 (ib(3) .EQ. 21 .AND. ib(8) .EQ. 48)))
THEN
1390 ELSEIF (nc .EQ. 16 .AND. ( &
1391 ib(16) .EQ. 40 .OR. &
1392 ib(16) .EQ. 44 .OR. &
1393 ib(16) .EQ. 48))
THEN
1398 ELSEIF (nc .EQ. 4 .AND. (ib(4) .EQ. 4))
THEN
1402 ELSEIF (nc .EQ. 4 .AND. ( &
1403 ib(4) .EQ. 27 .OR. &
1404 ib(4) .EQ. 28))
THEN
1409 ELSEIF (nc .EQ. 8)
THEN
1412 ELSEIF (nc .EQ. 12 .AND. ( &
1413 ib(12) .EQ. 12 .OR. &
1414 ib(12) .EQ. 47 .OR. &
1415 ib(12) .EQ. 45))
THEN
1421 ELSEIF (nc .EQ. 24 .AND. ib(24) .EQ. 36)
THEN
1425 ELSEIF (nc .EQ. 24 .AND. ib(24) .EQ. 24)
THEN
1429 ELSEIF (nc .EQ. 24 .AND. ib(24) .EQ. 48)
THEN
1433 ELSEIF (nc .EQ. 48)
THEN
1443 ELSEIF (ihg .GE. 6)
THEN
1446 WRITE (iout,
'(" ATFTM1! IHG=",A," NC=",I2)') icst(ihg), nc
1447 CALL stopgm(
'ATFTM1',
'NUMBER OF ROTATION NULL')
1449 ELSEIF (nc .EQ. 1)
THEN
1452 ELSEIF (nc .EQ. 2 .AND. ib(2) .EQ. 13)
THEN
1455 ELSEIF (nc .EQ. 2 .AND. ( &
1460 ELSEIF (nc .EQ. 2 .AND. ( &
1461 ib(2) .EQ. 16))
THEN
1464 ELSEIF (nc .EQ. 4 .AND. ( &
1465 ib(4) .EQ. 24 .OR. &
1466 ib(4) .EQ. 20))
THEN
1470 ELSEIF (nc .EQ. 3 .AND. ib(3) .EQ. 5)
THEN
1474 ELSEIF (nc .EQ. 6 .AND. ib(6) .EQ. 17)
THEN
1477 ELSEIF (nc .EQ. 6 .AND. ib(6) .EQ. 11)
THEN
1480 ELSEIF (nc .EQ. 6 .AND. ib(6) .EQ. 23)
THEN
1483 ELSEIF (nc .EQ. 12 .AND. ib(12) .EQ. 23)
THEN
1486 ELSEIF (nc .EQ. 6 .AND. ib(6) .EQ. 6)
THEN
1490 ELSEIF (nc .EQ. 6 .AND. ib(6) .EQ. 18)
THEN
1493 ELSEIF (nc .EQ. 12 .AND. ib(12) .EQ. 18)
THEN
1496 ELSEIF (nc .EQ. 12 .AND. ib(12) .EQ. 12)
THEN
1499 ELSEIF (nc .EQ. 12 .AND. ib(2) .EQ. 2 .AND. ib(12) .EQ. 24)
THEN
1502 ELSEIF (nc .EQ. 12 .AND. ib(2) .EQ. 3 .AND. ib(12) .EQ. 24)
THEN
1505 ELSEIF (nc .EQ. 24)
THEN
1519 IF (isy .NE. 1)
THEN
1522 vc(1, n) = a(1, 1)*v(1, n) + a(1, 2)*v(2, n) + a(1, 3)*v(3, n)
1523 vc(2, n) = a(2, 1)*v(1, n) + a(2, 2)*v(2, n) + a(2, 3)*v(3, n)
1524 vc(3, n) = a(3, 1)*v(1, n) + a(3, 2)*v(2, n) + a(3, 3)*v(3, n)
1526 CALL symmorphic(nc, ib, r, vc, ai, info, origin, delta)
1527 IF (info .EQ. 1)
THEN
1528 CALL rlv3(ai, origin, xb, il, delta)
1532 IF (-xb(i) .GE. 0._dp)
THEN
1535 origin(i) = 1._dp - xb(i)
1539 xb(i) = a(i, 1)*origin(1) + a(i, 2)*origin(2) + a(i, 3)*origin(3)
1542 ELSEIF (info .EQ. 0)
THEN
1555 IF (iout .GT. 0)
THEN
1559 IF ((ihg .EQ. 7 .AND. nc .EQ. 24) .OR. &
1560 (ihg .EQ. 5 .AND. nc .EQ. 48))
THEN
1562 WRITE (iout,
'(A,A,A)') &
1563 ' KPSYM| THE POINT GROUP OF THE CRYSTAL IS THE FULL ', &
1568 WRITE (iout,
'(A,A,A,I2,A)') &
1569 ' KPSYM| THE CRYSTAL SYSTEM IS ', &
1571 ' WITH ', nc,
' OPERATIONS:'
1572 IF (ihc .EQ. 0)
THEN
1574 WRITE (iout,
'( 5(5(A13),/))') (rname_hexai(ib(i)), i=1, nc)
1577 WRITE (iout,
'(10(5(A13),/))') (rname_cubic(ib(i)), i=1, nc)
1581 IF (isy .EQ. 1)
THEN
1583 WRITE (iout,
'(A)') &
1584 ' KPSYM| THE SPACE GROUP OF THE CRYSTAL IS SYMMORPHIC'
1585 ELSEIF (isy .EQ. -1)
THEN
1587 WRITE (iout,
'(A)') &
1588 ' KPSYM| THE SPACE GROUP OF THE CRYSTAL IS SYMMORPHIC'
1590 WRITE (iout,
'(A,A,/,T3,3F10.6,3X,3F10.6)') &
1591 ' KPSYM| THE STANDARD ORIGIN OF COORDINATES IS: ', &
1592 '[CARTESIAN] [CRYSTAL]', xb, origin
1593 ELSEIF (isy .EQ. 0)
THEN
1595 WRITE (iout,
'(A,/,3X,A,F15.6,A)') &
1596 ' KPSYM| THE SPACE GROUP IS NON-SYMMORPHIC,', &
1597 ' (SUM OF TRANSLATION VECTORS=', vs,
')'
1598 ELSEIF (isy .EQ. -2)
THEN
1600 WRITE (iout,
'(A,A)') &
1601 ' KPSYM| CANNOT DETERMINE IF THE SPACE GROUP IS', &
1602 ' SYMMORPHIC OR NOT'
1604 WRITE (iout,
'(A,/,A,/,3X,A,F15.6,A)') &
1605 ' KPSYM| THE SPACE GROUP IS NON-SYMMORPHIC,', &
1606 ' KPSYM| OR ELSE A NON STANDARD ORIGIN OF COORDINATES WAS USED.', &
1607 ' KPSYM| (SUM OF TRANSLATION VECTORS=', vs,
')'
1609 IF (indpg .GT. 0)
THEN
1610 CALL xstring(pgrp(indpg), i, j)
1611 CALL xstring(pgrd(indpg), k, l)
1613 WRITE (iout,
'(A,A,"(",A,")",T56,"[INDEX=",I2,"]")') &
1614 ' KPSYM| THE POINT GROUP OF THE CRYSTAL IS ', pgrp(indpg) (i:j), &
1615 pgrd(indpg) (k:l), indpg
1617 CALL xstring(pgrp(-indpg), i, j)
1618 CALL xstring(pgrd(-indpg), k, l)
1620 WRITE (iout,
'(A,I2,A,A,"(",A,")",T56,"[INDEX=",I2,"]")') &
1621 ' KPSYM| POINT GROUP: GROUP ORDER=', nc, &
1622 ' SUBGROUP OF ', pgrp(-indpg) (i:j), &
1623 pgrd(-indpg) (k:l), -indpg
1625 IF (ntvec .EQ. 1)
THEN
1627 WRITE (iout,
'(A,T60,I6)') &
1628 ' KPSYM| NUMBER OF PRIMITIVE CELL:', ntvec
1631 WRITE (iout,
'(A,T60,I6)') &
1632 ' KPSYM| NUMBER OF PRIMITIVE CELLS:', ntvec
1636 END SUBROUTINE atftm1
1653 SUBROUTINE checkrlv3(n, nat, ty, rx, x, vr, f0, ai, isc, &
1654 nodupli, oksym, delta)
1682 INTEGER :: n, nat, ty(nat)
1683 REAL(
dp) :: rx(3, nat), x(3, nat), vr(3)
1684 INTEGER :: f0(49, nat)
1685 REAL(
dp) :: ai(3, 3)
1687 LOGICAL :: nodupli, oksym
1690 INTEGER :: ia, ib, il
1691 REAL(
dp) :: vt(3), xb(3)
1699 IF (ty(ia) .EQ. ty(ib) .AND. isc(ib) .EQ. 0)
THEN
1700 xb(1) = rx(1, ia) - x(1, ib)
1701 xb(2) = rx(2, ia) - x(2, ib)
1702 xb(3) = rx(3, ia) - x(3, ib)
1703 CALL rlv3(ai, xb, vt, il, delta)
1705 oksym = (abs((vr(1) - vt(1)) - nint(vr(1) - vt(1))) .LT. delta) .AND. &
1706 (abs((vr(2) - vt(2)) - nint(vr(2) - vt(2))) .LT. delta) .AND. &
1707 (abs((vr(3) - vt(3)) - nint(vr(3) - vt(3))) .LT. delta)
1709 IF (nodupli) isc(ib) = 1
1723 END SUBROUTINE checkrlv3
1736 SUBROUTINE symmorphic(nc, ib, r, v, ai, info, origin, delta)
1761 INTEGER :: nc, ib(nc)
1762 REAL(
dp) :: r(3, 3, 48), v(3, nc), ai(3, 3)
1764 REAL(
dp) :: origin(3), delta
1766 INTEGER :: i, i1, ierror, igood(3), il, imissing2, &
1767 imissing3, iok(3), ionly, ir, j, j1
1768 REAL(
dp) ::
diag, dif, r2(2, 2), r3(3, 3), vr(3), &
1782 dif = v(1, ir)*v(1, ir) + v(2, ir)*v(2, ir) + v(3, ir)*v(3, ir)
1783 IF (dif .GT. delta*delta)
THEN
1790 r3(i, j) = -r(i, j, ib(ir))
1792 r3(i, i) = 1 + r3(i, i)
1795 IF (ierror .EQ. 0)
THEN
1798 vr(i) = r3(i, 1)*v(1, ir) &
1799 + r3(i, 2)*v(2, ir) &
1809 IF (i .NE. ierror)
THEN
1813 IF (j .NE. ierror)
THEN
1815 r2(i1, j1) = -r(i, j, ib(ir))
1818 r2(i1, i1) = 1 + r2(i1, i1)
1822 IF (ierror .EQ. 0)
THEN
1827 IF (igood(i) .EQ. 1)
THEN
1832 IF (igood(j) .EQ. 1)
THEN
1834 vr(i) = vr(i) + r2(i1, j1)*(v(j, ir) + &
1835 origin(imissing3)*r(j, imissing3, ib(ir)))
1846 IF (i .NE. imissing3)
THEN
1848 IF (i1 .EQ. ierror)
THEN
1856 diag = (1 - r(ionly, ionly, ib(ir)))
1857 IF (abs(
diag) .GT. delta)
THEN
1858 vr(ionly) = 1._dp/
diag*(v(ionly, ir) + &
1859 origin(imissing3)*r(ionly, imissing3, ib(ir)) + &
1860 origin(imissing2)*r(ionly, imissing2, ib(ir)))
1862 vr(ionly) = origin(ionly)
1865 vr(imissing3) = origin(imissing3)
1866 vr(imissing2) = origin(imissing2)
1874 IF (iok(i) .EQ. 1)
THEN
1875 dif = dif + abs(origin(i) - vr(i))
1878 IF (dif .GT. delta)
THEN
1884 IF (iok(i) .NE. 1 .AND. igood(i) .EQ. 1)
THEN
1893 IF (iok(1) .EQ. 0 .AND. iok(2) .EQ. 0 .AND. iok(3) .EQ. 0)
THEN
1903 vr(i) = r(i, 1, ib(ir))*origin(1) &
1904 + r(i, 2, ib(ir))*origin(2) &
1905 + r(i, 3, ib(ir))*origin(3)
1906 vr(i) = (origin(i) - vr(i)) - v(i, ir)
1908 CALL rlv3(ai, vr, xb, il, delta)
1909 dif = abs(xb(1)) + abs(xb(2)) + abs(xb(3))
1910 IF (dif .GT. delta)
THEN
1918 END SUBROUTINE symmorphic
1925 SUBROUTINE rot1(ihc, r)
1950 REAL(
dp) :: r(3, 3, 48)
1952 INTEGER :: i, j, k, n, nv
1962 IF (ihc .EQ. 0)
THEN
1967 s = 0.5_dp*sqrt(3.0_dp)
1978 r(3, 3, n + 18) = 1._dp
1979 r(3, 3, n + 6) = -1._dp
1980 r(3, 3, n + 12) = -1._dp
1988 r(i, j, 6) = r(j, i, 2)
1990 r(i, j, 3) = r(i, j, 3) + r(i, k, 2)*r(k, j, 2)
1991 r(i, j, 8) = r(i, j, 8) + r(i, k, 2)*r(k, j, 7)
1992 r(i, j, 12) = r(i, j, 12) + r(i, k, 7)*r(k, j, 2)
1998 r(i, j, 5) = r(j, i, 3)
2000 r(i, j, 4) = r(i, j, 4) + r(i, k, 2)*r(k, j, 3)
2001 r(i, j, 9) = r(i, j, 9) + r(i, k, 2)*r(k, j, 8)
2002 r(i, j, 10) = r(i, j, 10) + r(i, k, 12)*r(k, j, 3)
2003 r(i, j, 11) = r(i, j, 11) + r(i, k, 12)*r(k, j, 2)
2011 r(i, j, nv) = -r(i, j, n)
2023 r(2, 3, 19) = -1._dp
2028 r(i, j, 20) = r(j, i, 19)
2029 r(i, j, 5) = r(j, i, 9)
2031 r(i, j, 2) = r(i, j, 2) + r(i, k, 19)*r(k, j, 19)
2032 r(i, j, 16) = r(i, j, 16) + r(i, k, 9)*r(k, j, 19)
2033 r(i, j, 23) = r(i, j, 23) + r(i, k, 19)*r(k, j, 9)
2040 r(i, j, 6) = r(i, j, 6) + r(i, k, 2)*r(k, j, 5)
2041 r(i, j, 7) = r(i, j, 7) + r(i, k, 16)*r(k, j, 23)
2042 r(i, j, 8) = r(i, j, 8) + r(i, k, 5)*r(k, j, 2)
2043 r(i, j, 10) = r(i, j, 10) + r(i, k, 2)*r(k, j, 9)
2044 r(i, j, 11) = r(i, j, 11) + r(i, k, 9)*r(k, j, 2)
2045 r(i, j, 12) = r(i, j, 12) + r(i, k, 23)*r(k, j, 16)
2046 r(i, j, 14) = r(i, j, 14) + r(i, k, 16)*r(k, j, 2)
2047 r(i, j, 15) = r(i, j, 15) + r(i, k, 2)*r(k, j, 16)
2048 r(i, j, 22) = r(i, j, 22) + r(i, k, 23)*r(k, j, 2)
2049 r(i, j, 24) = r(i, j, 24) + r(i, k, 2)*r(k, j, 23)
2056 r(i, j, 3) = r(i, j, 3) + r(i, k, 5)*r(k, j, 12)
2057 r(i, j, 4) = r(i, j, 4) + r(i, k, 5)*r(k, j, 10)
2058 r(i, j, 13) = r(i, j, 13) + r(i, k, 23)*r(k, j, 11)
2059 r(i, j, 17) = r(i, j, 17) + r(i, k, 16)*r(k, j, 12)
2060 r(i, j, 18) = r(i, j, 18) + r(i, k, 16)*r(k, j, 10)
2061 r(i, j, 21) = r(i, j, 21) + r(i, k, 12)*r(k, j, 15)
2067 r(1, 1, nv) = -r(1, 1, n)
2068 r(1, 2, nv) = -r(1, 2, n)
2069 r(1, 3, nv) = -r(1, 3, n)
2070 r(2, 1, nv) = -r(2, 1, n)
2071 r(2, 2, nv) = -r(2, 2, n)
2072 r(2, 3, nv) = -r(2, 3, n)
2073 r(3, 1, nv) = -r(3, 1, n)
2074 r(3, 2, nv) = -r(3, 2, n)
2075 r(3, 3, nv) = -r(3, 3, n)
2113 SUBROUTINE sppt2(iout, iq1, iq2, iq3, wvk0, nkpoint, &
2114 a1, a2, a3, b1, b2, b3, &
2115 inv, nc, ib, r, ntot, wvkl, lwght, lrot, &
2116 ncbrav, ibrav, istriz, &
2117 nhash, includ, list, rlist, delta)
2246 INTEGER :: iout, iq1, iq2, iq3
2249 REAL(
dp) :: a1(3), a2(3), a3(3), b1(3), b2(3), b3(3)
2250 INTEGER :: inv, nc, ib(48)
2251 REAL(
dp) :: r(3, 3, 48)
2253 REAL(
dp) :: wvkl(3, nkpoint)
2254 INTEGER :: lwght(nkpoint), lrot(48, nkpoint), &
2255 ncbrav, ibrav(48), istriz, nhash, &
2256 includ(nkpoint),
list(nkpoint + nhash)
2257 REAL(
dp) :: rlist(3, nkpoint), delta
2259 INTEGER,
PARAMETER :: no = 0, nrsdir = 100
2261 INTEGER :: i, i1, i2, i3, ibsign, igarb0, igarbage, &
2262 igarbg, ii, imesh, iop, iplace, &
2263 iremov, iwvk, j, jplace, k, n, nplane
2264 REAL(
dp) :: diff, proja(3), projb(3), &
2265 rsdir(4, nrsdir), ur1, ur2, ur3, &
2286 CALL bzdefine(iout, b1, b2, b3, rsdir, nplane, delta)
2293 CALL mesh(iout, wva, iplace, igarb0, igarbg, nkpoint, nhash, &
2299 ur1 = real(1 + iq1 - 2*i1, kind=
dp)/real(2*iq1, kind=
dp)
2300 ur2 = real(1 + iq2 - 2*i2, kind=
dp)/real(2*iq2, kind=
dp)
2301 ur3 = real(1 + iq3 - 2*i3, kind=
dp)/real(2*iq3, kind=
dp)
2303 wvk(i) = ur1*b1(i) + ur2*b2(i) + ur3*b3(i) + wvk0(i)
2306 CALL bzrduc(wvk, a1, a2, a3, b1, b2, b3, rsdir, &
2307 nrsdir, nplane, delta)
2308 IF (istriz .EQ. 1)
THEN
2315 wva(i) = wva(i) + r(i, j, ibrav(iop))*wvk(j)
2319 IF (.NOT. inside_bz(wva, rsdir, nplane, delta))
GOTO 450
2322 CALL mesh(iout, wva, iplace, igarb0, igarbg, &
2323 nkpoint, nhash,
list, rlist, delta)
2326 IF (iplace .GT. 0) imesh = iplace
2327 IF (iplace .GT. nkpoint)
GOTO 470
2332 CALL mesh(iout, wvk, iplace, igarb0, igarbg, &
2333 nkpoint, nhash,
list, rlist, delta)
2335 IF (iplace .GT. nkpoint)
GOTO 470
2343 IF (iout .GT. 0)
THEN
2347 '(" KPSYM| THE WAVEVECTOR MESH CONTAINS ",I5," POINTS")') imesh
2349 WRITE (iout,
'(" KPSYM| THE POINTS ARE:")')
2352 CALL mesh(iout, wva, i, igarb0, igarbg, nkpoint, nhash, &
2354 IF (mod(i, 2) .EQ. 1)
THEN
2356 WRITE (iout,
'(1X,I5,3F10.4)', advance=
"no") i, wva
2359 WRITE (iout,
'(1X,I5,3F10.4)') i, wva
2366 IF (istriz .EQ. 1)
THEN
2370 DO i = 1, (imesh - 1)
2372 CALL mesh(iout, wva, iplace, igarb0, igarbg, &
2373 nkpoint, nhash,
list, rlist, delta)
2379 proja(1) = proja(1) + wva(k)*a1(k)
2380 proja(2) = proja(2) + wva(k)*a2(k)
2381 proja(3) = proja(3) + wva(k)*a3(k)
2384 DO j = (i + 1), imesh
2386 CALL mesh(iout, wvk, jplace, igarb0, igarbg, &
2387 nkpoint, nhash,
list, rlist, delta)
2393 projb(1) = projb(1) + wvk(k)*a1(k)
2394 projb(2) = projb(2) + wvk(k)*a2(k)
2395 projb(3) = projb(3) + wvk(k)*a3(k)
2399 diff = proja(k) - projb(k)
2400 IF (abs(real(nint(diff), kind=
dp) - diff) .GT. delta)
GOTO 280
2403 CALL remove(wvk, jplace, igarb0, igarbg, &
2404 nkpoint, nhash,
list, rlist, delta)
2406 IF (jplace .GT. 0) iremov = iremov + 1
2410 IF ((iremov .GT. 0 .AND. iout .GT. 0) .AND. iout > 0) &
2411 WRITE (iout,
'(A,A,/,A,1X,I6,A,/)') &
2412 ' KPSYM| SOME OF THESE MESH POINTS ARE RELATED BY LATTICE ', &
2413 'TRANSLATION VECTORS', &
2414 ' KPSYM|', iremov,
' OF THE MESH POINTS REMOVED.'
2422 IF (btest(includ(iwvk), 0))
GOTO 350
2426 includ(iwvk) = ibset(includ(iwvk), 0)
2428 CALL mesh(iout, wvk, iplace, igarb0, igarbg, &
2429 nkpoint, nhash,
list, rlist, delta)
2431 CALL garbag(wvk, igarbage, igarb0, &
2432 nkpoint, nhash,
list, rlist, delta)
2433 IF (igarbage .GT. 0)
GOTO 350
2436 includ(iwvk) = includ(iwvk) + ntot*2
2438 wvkl(i, ntot) = wvk(i)
2448 wva(i) = wva(i) + r(i, j, ib(n))*wvk(j)
2455 CALL mesh(iout, wva, iplace, igarb0, igarbg, &
2456 nkpoint, nhash,
list, rlist, delta)
2457 IF (iplace .EQ. 0)
THEN
2458 IF (istriz .EQ. -1)
THEN
2463 CALL garbag(wva, igarbage, igarb0, &
2464 nkpoint, nhash,
list, rlist, delta)
2465 IF (igarbage .EQ. 0)
THEN
2473 CALL garbag(wva, igarbage, igarb0, &
2474 nkpoint, nhash,
list, rlist, delta)
2475 IF (igarbage .GT. 0)
GOTO 370
2478 IF (btest(includ(iplace), 0))
GOTO 364
2480 lwght(ntot) = lwght(ntot) + 1
2481 lrot(lwght(ntot), ntot) = ib(n)*ibsign
2483 includ(iplace) = ibset(includ(iplace), 0)
2486 includ(iplace) = includ(iplace) + ntot*2
2488 IF (ibsign .EQ. -1 .OR. inv .EQ. 0)
GOTO 370
2506 IF (ntot .GT. nkpoint)
THEN
2508 WRITE (iout, *)
'IN SPPT2 NUMBER OF SPECIAL POINTS = ', ntot
2510 WRITE (iout, *)
'BUT NKPOINT = ', nkpoint
2513 IF (iout .GT. 0)
THEN
2517 WRITE (iout,
'(/,A,4X,A)') &
2518 ' KPSYM|',
'CROSS TABLE RELATING MESH POINTS WITH SPECIAL POINTS:'
2520 WRITE (iout,
'(5(4X,"IK -> SK"))')
2522 iplace = includ(i)/2
2524 WRITE (iout,
'(1X,I5,1X,I5)', advance=
"no") i, iplace
2525 IF ((mod(i, 5) .EQ. 0) .AND. iout > 0) &
2528 IF ((mod(j - 1, 5) .NE. 0) .AND. iout > 0) &
2537 WRITE (iout,
'(A,/)')
' SUBROUTINE SPPT2 *** FATAL ERROR ***'
2539 WRITE (iout,
'(A,3F10.4,/,A,3F10.4,A,/,A,I3,A)') &
2540 ' THE VECTOR ', wva, &
2541 ' GENERATED FROM ', wvk,
' IN THE BASIC MESH', &
2542 ' BY ROTATION NO. ', ibrav(iop),
' IS OUTSIDE THE 1BZ'
2543 CALL stopgm(
'SPPT2',
'VECTOR OUTSIDE THE 1BZ')
2547 WRITE (iout,
'(A,/)')
' SUBROUTINE SPPT2 *** FATAL ERROR ***'
2549 WRITE (iout, *)
'MESH SIZE EXCEEDS NKPOINT=', nkpoint
2550 CALL stopgm(
'SPPT2',
'MESH SIZE EXCEEDED')
2554 WRITE (iout,
'(A,/)')
' SUBROUTINE SPPT2 *** FATAL ERROR ***'
2556 WRITE (iout,
'(A,3F10.4,/,A,3F10.4,A,/,A,I3,A)') &
2557 ' THE VECTOR ', wva, &
2558 ' GENERATED FROM ', wvk,
' IN THE BASIC MESH', &
2559 ' BY ROTATION NO. ', ib(n),
' IS NOT IN THE LIST'
2560 CALL stopgm(
'SPPT2',
'VECTOR NOT IN THE LIST')
2563 END SUBROUTINE sppt2
2577 SUBROUTINE mesh(iout, wvk, iplace, igarb0, igarbg, &
2578 nmesh, nhash, list, rlist, delta)
2597 INTEGER :: iplace, igarb0, igarbg, nmesh, nhash, &
2599 REAL(
dp) :: rlist(3, nmesh), delta
2601 INTEGER,
PARAMETER :: nil = 0
2603 INTEGER :: i, ihash, ipoint, j
2604 INTEGER,
SAVE :: istore
2605 REAL(
dp) :: delta1, rhash
2611 delta1 = 10._dp*delta
2612 IF (iplace .LE. -2)
THEN
2613 DO i = 1, nhash + nmesh
2622 ELSEIF ((iplace .GT. -2) .AND. (iplace .LE. 0))
THEN
2624 rhash = 0.7890_dp*wvk(1) &
2625 + 0.6810_dp*wvk(2) &
2626 + 0.5811_dp*wvk(3) + delta
2627 ihash = int(abs(rhash)*real(nhash, kind=
dp))
2628 ihash = mod(ihash, nhash) + nmesh + 1
2630 ipoint =
list(ihash)
2633 IF (ipoint .EQ. nil)
GOTO 130
2636 IF (abs(wvk(j) - rlist(j, ipoint)) .GT. delta1)
GOTO 115
2643 ipoint =
list(ihash)
2647 WRITE (iout,
'(2A,/,A)') &
2648 ' SUBROUTINE MESH *** FATAL ERROR *** LINKED LIST', &
2649 ' TOO LONG ***',
' CHOOSE A BETTER HASH-FUNCTION'
2650 CALL stopgm(
'MESH',
'WARNING')
2653 IF (iplace .EQ. -1)
THEN
2659 list(ihash) = istore
2660 IF (istore .GT. nmesh)
THEN
2662 WRITE (iout,
'(A)')
'SUBROUTINE MESH *** FATAL ERROR ***'
2664 WRITE (iout,
'(A,I10,A,/,A,3F10.5)') &
2665 ' ISTORE=', istore,
' EXCEEDS DIMENSIONS', &
2667 CALL stopgm(
'MESH',
'WARNING')
2671 rlist(i, istore) = wvk(i)
2679 IF (iplace .EQ. 0)
RETURN
2688 IF (ipoint .GE. istore)
GOTO 190
2690 wvk(i) = rlist(i, ipoint)
2699 WRITE (iout,
'(A,/,A,I5,A,/)') &
2700 ' SUBROUTINE MESH *** WARNING ***', &
2701 ' IPLACE = ', iplace, &
2702 ' IS BEYOND THE LISTS - WVK SET TO 1.0E38'
2721 SUBROUTINE remove(wvk, iplace, igarb0, igarbg, &
2722 nmesh, nhash, list, rlist, delta)
2735 INTEGER :: iplace, igarb0, igarbg, nmesh, nhash, &
2737 REAL(
dp) :: rlist(3, nmesh), delta
2739 INTEGER,
PARAMETER :: nil = 0
2741 INTEGER :: i, ihash, ipoint, j
2742 REAL(
dp) :: delta1, rhash
2748 delta1 = 10._dp*delta
2750 rhash = 0.7890_dp*wvk(1) &
2751 + 0.6810_dp*wvk(2) &
2752 + 0.5811_dp*wvk(3) + delta
2753 ihash = int(abs(rhash)*real(nhash, kind=
dp))
2754 ihash = mod(ihash, nhash) + nmesh + 1
2756 ipoint =
list(ihash)
2759 IF (ipoint .EQ. nil)
THEN
2766 IF (abs(wvk(j) - rlist(j, ipoint)) .GT. delta1)
GOTO 215
2773 IF (igarb0 .EQ. 0)
THEN
2777 list(igarbg) = ipoint
2786 ipoint =
list(ihash)
2789 CALL stopgm(
'MESH',
'LIST TOO LONG')
2792 END SUBROUTINE remove
2804 SUBROUTINE garbag(wvk, iplace, igarb0, &
2805 nmesh, nhash, list, rlist, delta)
2818 INTEGER :: iplace, igarb0, nmesh, nhash, &
2820 REAL(
dp) :: rlist(3, nmesh), delta
2822 INTEGER,
PARAMETER :: nil = 0
2824 INTEGER :: i, ihash, ipoint, j
2831 delta1 = 10._dp*delta
2837 IF (ipoint .EQ. nil)
THEN
2844 IF (abs(wvk(j) - rlist(j, ipoint)) .GT. delta1)
GOTO 315
2852 ipoint =
list(ihash)
2855 CALL stopgm(
'GARBAG',
'LIST TOO LONG')
2858 END SUBROUTINE garbag
2874 SUBROUTINE bzrduc(wvk, a1, a2, a3, b1, b2, b3, rsdir, nrsdir, nplane, delta)
2880 REAL(
dp) :: wvk(3), a1(3), a2(3), a3(3), b1(3), &
2883 REAL(
dp) :: rsdir(4, nrsdir)
2887 INTEGER,
PARAMETER :: nzones = 4, nnn = 2*nzones + 1, &
2890 INTEGER :: i, i1, i2, i3, n1, n2, n3, nn1, nn2, nn3
2892 REAL(
dp) :: wb(3), wva(3)
2900 IF (.NOT. inside_bz(wvk, rsdir, nplane, delta))
THEN
2904 wb(1) = wvk(1)*a1(1) + wvk(2)*a1(2) + wvk(3)*a1(3)
2905 wb(2) = wvk(1)*a2(1) + wvk(2)*a2(2) + wvk(3)*a2(3)
2906 wb(3) = wvk(1)*a3(1) + wvk(2)*a3(2) + wvk(3)*a3(3)
2911 n1_loop:
DO n1 = 1, nnn
2918 wva(i) = wvk(i) + real(i1, kind=
dp)*b1(i) + real(i2, kind=
dp)*b2(i) + &
2919 REAL(i3, kind=
dp)*b3(i)
2921 inside = inside_bz(wva, rsdir, nplane, delta)
2922 IF (inside)
EXIT n1_loop
2930 END SUBROUTINE bzrduc
2941 FUNCTION inside_bz(wvk, rsdir, nplane, delta)
RESULT(inbz)
2942 REAL(kind=
dp),
DIMENSION(3) :: wvk
2943 REAL(kind=
dp),
DIMENSION(:, :) :: rsdir
2945 REAL(kind=
dp) :: delta
2949 REAL(kind=
dp) :: projct
2953 projct = (rsdir(1, n)*wvk(1) + rsdir(2, n)*wvk(2) + rsdir(3, n)*wvk(3))/rsdir(4, n)
2954 IF (abs(projct) > 0.5_dp + delta)
THEN
2960 END FUNCTION inside_bz
2979 SUBROUTINE bzdefine(iout, b1, b2, b3, rsdir, nplane, delta)
2981 REAL(kind=
dp),
DIMENSION(3) :: b1, b2, b3
2982 REAL(kind=
dp),
DIMENSION(:, :) :: rsdir
2984 REAL(kind=
dp) :: delta
2986 INTEGER :: i, i1, i2, i3, n, n1, n2, n3, nb1, nb2, &
2987 nb3, nnb1, nnb2, nnb3, nrsdir
2988 REAL(kind=
dp) :: b1len, b2len, b3len, bmax, projct
2989 REAL(kind=
dp),
DIMENSION(3) :: bvec
2991 nrsdir =
SIZE(rsdir, 2)
2993 b1len = b1(1)**2 + b1(2)**2 + b1(3)**2
2994 b2len = b2(1)**2 + b2(2)**2 + b2(3)**2
2995 b3len = b3(1)**2 + b3(2)**2 + b3(3)**2
2997 bmax = b1len + b2len + b3len
2998 nb1 = int(sqrt(bmax/b1len) + delta) + 1
2999 nb2 = int(sqrt(bmax/b2len) + delta) + 1
3000 nb3 = int(sqrt(bmax/b3len) + delta) + 1
3003 rsdir(1:3, 1) = b1(1:3)
3004 rsdir(1:3, 2) = b2(1:3)
3005 rsdir(1:3, 3) = b3(1:3)
3021 IF (i1 .EQ. 0 .AND. i2 .EQ. 0 .AND. i3 .EQ. 0)
GOTO 150
3023 bvec(i) = real(i1, kind=
dp)*b1(i) + real(i2, kind=
dp)*b2(i) + &
3024 REAL(i3, kind=
dp)*b3(i)
3028 projct = 0.5_dp*(rsdir(1, n)*bvec(1) + rsdir(2, n)*bvec(2) &
3029 + rsdir(3, n)*bvec(3))/rsdir(4, n)
3033 IF (abs(projct) .GT. 0.5_dp - delta)
GOTO 150
3037 cpassert(nplane <= nrsdir)
3039 rsdir(i, nplane) = bvec(i)
3042 rsdir(4, nplane) = bvec(1)**2 + bvec(2)**2 + bvec(3)**2
3049 WRITE (iout,
'(A,I3,A,/,A,/,100(" KPSYM|",1X,3F10.4,/))') &
3050 ' KPSYM| The 1st Brillouin zone is confined by (at most)', &
3051 nplane,
' planes', &
3052 ' KPSYM| as defined by the +/- halves of the vectors:', &
3053 ((rsdir(i, n), i=1, 3), n=1, nplane)
3056 END SUBROUTINE bzdefine
3063 SUBROUTINE stopgm(a, b)
3064 CHARACTER(LEN=*) :: a, b
3067 cpabort(
"stopgm@kpsym")
3069 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)
...