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 LOGICAL :: located_type
174 REAL(kind=
dp) :: a01(3), a02(3), a03(3), b01(3), b02(3), b03(3), b1(3), b2(3), b3(3), &
175 dtotstr, origin(3), origin0(3), proj1, proj2, proj3, r(3, 3, 48), r0(3, 3, 48), totstr, &
176 tvec0(3, 1), volum, vv0(3)
177 REAL(kind=
dp),
DIMENSION(3, 1) :: x0
178 REAL(kind=
dp),
DIMENSION(3, 48) :: v, v0
193 WRITE (iout,
'(" KPSYM| NUMBER OF ATOMS (STRUCT):",I6)') nat
196 WRITE (iout,
'(" KPSYM|",10X,"K TYPE",14X,"X(K)")')
201 located_type = .false.
204 IF (ty(j) == ty(i))
THEN
206 located_type = .true.
212 IF (.NOT. located_type)
THEN
214 IF (itype > nsp)
THEN
216 WRITE (iout,
'(A,I4,")")') &
217 ' KPSYM| NUMBER OF ATOMIC TYPES EXCEEDS DIMENSION (NSP=)', &
221 WRITE (iout,
'(" KPSYM| THE ARRAY TY IS:",/,9(1X,10I7,/))') &
224 cpabort(
'K290: FATAL ERROR')
228 WRITE (iout,
'(" KPSYM|",6X,I5,I6,3F10.5)') &
229 i, ty(i), (xkapa(j, i), j=1, 3)
235 dtotstr = delta*delta
239 totstr = totstr + abs(strain(i))
241 IF (totstr > dtotstr) istrin = 1
244 volum = a1(1)*a2(2)*a3(3) + a2(1)*a3(2)*a1(3) + &
245 a3(1)*a1(2)*a2(3) - a1(3)*a2(2)*a3(1) - &
246 a2(3)*a3(2)*a1(1) - a3(3)*a1(2)*a2(1)
248 b1(1) = (a2(2)*a3(3) - a2(3)*a3(2))/volum
249 b1(2) = (a2(3)*a3(1) - a2(1)*a3(3))/volum
250 b1(3) = (a2(1)*a3(2) - a2(2)*a3(1))/volum
251 b2(1) = (a3(2)*a1(3) - a3(3)*a1(2))/volum
252 b2(2) = (a3(3)*a1(1) - a3(1)*a1(3))/volum
253 b2(3) = (a3(1)*a1(2) - a3(2)*a1(1))/volum
254 b3(1) = (a1(2)*a2(3) - a1(3)*a2(2))/volum
255 b3(2) = (a1(3)*a2(1) - a1(1)*a2(3))/volum
256 b3(3) = (a1(1)*a2(2) - a1(2)*a2(1))/volum
266 CALL group1s(iout, a1, a2, a3, nat, ty, xkapa, b1, b2, b3, &
267 ihg, ihc, isy, li, nc, indpg, ib, ntvec, &
268 v, f0, r, tvec, origin, rx, isc, delta)
277 WRITE (iout,
'(A,/,A,/,A)') &
278 ' KPSYM| ALTHOUGH THE POINT GROUP OF THE CRYSTAL DOES NOT', &
279 ' KPSYM| CONTAIN INVERSION, THE SPECIAL POINT GENERATION ALGORITHM', &
280 ' KPSYM| WILL CONSIDER IT AS A SYMMETRY OPERATION'
288 WRITE (iout,
'(/," KPSYM| CRYSTALLOGRAPHIC DATA:")')
289 WRITE (iout,
'(4X,"A1",3F10.5,10X,"B1",3F10.5)') a1, b1
290 WRITE (iout,
'(4X,"A2",3F10.5,10X,"B2",3F10.5)') a2, b2
291 WRITE (iout,
'(4X,"A3",3F10.5,10X,"B3",3F10.5)') a3, b3
297 WRITE (iout,
'(/," KPSYM| GROUP-THEORETICAL INFORMATION:")')
302 '(" KPSYM| POINT GROUP OF THE PRIMITIVE LATTICE: ",A," SYSTEM")') &
309 WRITE (iout,
'(" KPSYM|",4X,"NONSYMMORPHIC GROUP")')
311 ELSE IF (isy == 1)
THEN
313 WRITE (iout,
'(" KPSYM|",4X,"SYMMORPHIC GROUP")')
315 ELSE IF (isy == -1)
THEN
317 WRITE (iout,
'(" KPSYM|",4X,"SYMMORPHIC GROUP WITH NON-STANDARD ORIGIN")')
319 ELSE IF (isy == -2)
THEN
321 WRITE (iout,
'(" KPSYM|",4X,"NONSYMMORPHIC GROUP???")')
327 WRITE (iout,
'(" KPSYM|",4X,"NO INVERSION SYMMETRY")')
329 ELSE IF (li > 0)
THEN
331 WRITE (iout,
'(" KPSYM|",4X,"INVERSION SYMMETRY")')
337 '(" KPSYM|",4X,"TOTAL NUMBER OF ELEMENTS IN THE POINT GROUP:",I3)') nc
340 WRITE (iout,
'(" KPSYM|",4X,"TO SUM UP: (",I1,5I3,")")') &
341 ihg, ihc, isy, li, nc, indpg
345 WRITE (iout,
'(/," KPSYM|",4X,"LIST OF THE ROTATIONS:")')
348 WRITE (iout,
'(7X,12I4)') (ib(i), i=1, nc)
353 WRITE (iout,
'(/," KPSYM|",4X,"NONPRIMITIVE TRANSLATIONS:")')
356 WRITE (iout,
'(A,A)') &
357 ' ROT V IN THE BASIS A1, A2, A3 ', &
358 'V IN CARTESIAN COORDINATES'
363 vv0(j) = v(1, i)*a1(j) + v(2, i)*a2(j) + v(3, i)*a3(j)
366 WRITE (iout,
'(1X,I3,3F10.5,3X,3F10.5)') &
367 ib(i), (v(j, i), j=1, 3), vv0
375 '(/," KPSYM|",4X,"ATOM TRANSFORMATION TABLE (MARADUDIN,VOSKO):")')
378 WRITE (iout,
'(5(4X,"R AT->AT"))')
381 WRITE (iout,
'(I5," [Identity]")') 1
386 WRITE (iout,
'(I5,2I4)', advance=
"no") ib(k), j, f0(k, j)
388 IF ((mod(j, 5) == 0) .AND. iout > 0)
THEN
392 IF ((mod(j - 1, 5) /= 0) .AND. iout > 0)
THEN
398 WRITE (iout,
'(/," KPSYM|",4X,"LIST OF THE 3 X 3 ROTATION MATRICES:")')
404 '(4X,I3," (",I2,": ",A11,")",2(3F14.6,/,25X),3F14.6)') &
405 k, ib(k), rname_hexai(ib(k)), ((r(i, j, ib(k)), j=1, 3), i=1, 3)
412 '(4X,I3," (",I2,": ",A10,") ",2(3F14.6,/,25X),3F14.6)') &
413 k, ib(k), rname_cubic(ib(k)), ((r(i, j, ib(k)), j=1, 3), i=1, 3)
420 CALL group1s(iout, a01, a02, a03, 1, ty, x0, b01, b02, b03, &
421 ihg0, ihc0, isy0, li0, nc0, indpg0, ib0, ntvec0, &
422 v0, f00, r0, tvec0, origin0, rx, isc, delta)
429 WRITE (iout,
'(/,1X,19("*"),A,25("*"))') &
430 ' GENERATION OF SPECIAL POINTS '
434 WRITE (iout,
'(A,/,1X,3I5)') &
435 ' KPSYM| MONKHORST-PACK PARAMETERS (GENERALIZED) IQ1,IQ2,IQ3:', &
440 WRITE (iout,
'(A,/,1X,3F10.5)') &
441 ' KPSYM| CONSTANT VECTOR SHIFT (MACDONALD) OF THIS MESH:', wvk0
443 IF (abs(iq1) + abs(iq2) + abs(iq3) == 0)
RETURN
444 IF (abs(istriz) /= 1)
THEN
446 WRITE (iout,
'(" KPSYM| INVALID SWITCH FOR SYMMETRIZATION",I10)') istriz
449 WRITE (iout,
'(" KPSYM| INVALID SWITCH FOR SYMMETRIZATION",I10)') istriz
451 cpabort(
'K290. ISTRIZ WRONG ARGUMENT')
454 WRITE (iout,
'(" KPSYM| SYMMETRIZATION SWITCH: ",I3)', advance=
"no") istriz
456 IF (istriz == 1)
THEN
458 WRITE (iout,
'(" (SYMMETRIZATION OF MONKHORST-PACK MESH)")')
462 WRITE (iout,
'(" (NO SYMMETRIZATION OF MONKHORST-PACK MESH)")')
479 WRITE (iout, *)
' KPSYM| NUMBER OF ROTATIONS FOR BRAVAIS LATTICE', nc0
482 WRITE (iout, *)
' KPSYM| NUMBER OF ROTATIONS FOR CRYSTAL LATTICE', nc
485 WRITE (iout, *)
' KPSYM| NO DUPLICATION FOUND'
487 cpabort(
'SOMETHING IS WRONG IN GROUP DETERMINATION')
494 WRITE (iout,
'(/,1X,20("! "),"WARNING",20("!"))')
497 WRITE (iout,
'(A)') &
498 ' KPSYM| THE CRYSTAL HAS MORE SYMMETRY THAN THE BRAVAIS LATTICE'
501 WRITE (iout,
'(A)') &
502 ' KPSYM| BECAUSE THIS IS NOT A PRIMITIVE CELL'
505 WRITE (iout,
'(A)') &
506 ' KPSYM| USE ONLY SYMMETRY FROM BRAVAIS LATTICE'
509 WRITE (iout,
'(1X,20("! "),"WARNING",20("!"),/)')
512 CALL sppt2(iout, iq1, iq2, iq3, wvk0, nkpoint, &
513 a01, a02, a03, b01, b02, b03, &
514 invadd, nc, ib, r, ntot, wvkl, lwght, lrot, nc0, ib0, istriz, &
515 nhash, includ,
list, rlist, delta)
520 WRITE (iout,
'(/," KPSYM|",1X,I5," SPECIAL POINTS GENERATED")') ntot
524 ELSE IF (ntot < 0)
THEN
526 WRITE (iout,
'(A,I5,/,A,/,A)')
' KPSYM| DIMENSION NKPOINT =', nkpoint, &
527 ' KPSYM| INSUFFICIENT FOR ACCOMMODATING ALL THE SPECIAL POINTS', &
528 ' KPSYM| WHAT FOLLOWS IS AN INCOMPLETE LIST'
537 iswght = iswght + lwght(i)
540 WRITE (iout,
'(8X,A,T33,A,4X,A)') &
541 'WAVEVECTOR K',
'WEIGHT',
'UNFOLDING ROTATIONS'
546 IF (abs(wvkl(i, l)) < delta) wvkl(i, l) = 0._dp
548 IF (istrin /= 0)
THEN
554 proj1 = proj1 + wvkl(i, l)*a01(i)
555 proj2 = proj2 + wvkl(i, l)*a02(i)
556 proj3 = proj3 + wvkl(i, l)*a03(i)
559 wvkl(i, l) = proj1*b1(i) + proj2*b2(i) + proj3*b3(i)
564 WRITE (iout, fmt=
'(1X,I5,3F8.4,I8,T42,12I3)') &
565 l, (wvkl(i, l), i=1, 3), lwght(l), (lrot(i, l), i=1, min(lmax, 12))
569 WRITE (iout, fmt=
'(T42,12I3)') &
570 (lrot(i, l), i=j, min(lmax, j - 1 + 12))
575 WRITE (iout,
'(24X,"TOTAL:",I8)') iswght
609 SUBROUTINE group1s(iout, a1, a2, a3, nat, ty, x, b1, b2, b3, &
610 ihg, ihc, isy, li, nc, indpg, ib, ntvec, &
611 v, f0, r, tvec, origin, rx, isc, delta)
715 REAL(
dp) :: a1(3), a2(3), a3(3)
716 INTEGER :: nat, ty(nat)
717 REAL(
dp) :: x(3, nat), b1(3), b2(3), b3(3)
718 INTEGER :: ihg, ihc, isy, li, nc, indpg, ib(48), &
721 INTEGER :: f0(49, nat)
722 REAL(
dp) :: r(3, 3, 48), tvec(3, nat), origin(3), &
728 REAL(
dp) :: a(3, 3), ai(3, 3), ap(3, 3), api(3, 3)
755 CALL primlatt(a, ai, ap, api, nat, ty, x, ntvec, tvec, f0, isc, delta)
758 CALL pgl1(ap, api, ihc, nc, ib, ihg, r, delta)
764 CALL pgl1(a, ai, ihc, nc, ib, ihg, r, delta)
765 IF (ncprim > nc)
THEN
767 CALL pgl1(ap, api, ihc, nc, ib, ihg, r, delta)
772 CALL atftm1(iout, r, v, x, f0, origin, ib, ty, nat, ihg, ihc, rx, &
773 nc, indpg, ntvec, a, ai, li, isy, isc, delta)
778 WRITE (iout,
'(1X,A)') &
779 'KPSYM| THE POINT GROUP OF THE CRYSTAL CONTAINS THE INVERSION'
793 SUBROUTINE calbrec(a, ai)
803 REAL(
dp) :: a(3, 3), ai(3, 3)
805 INTEGER :: i, il, iu, j, jl, ju
808 det = a(1, 1)*a(2, 2)*a(3, 3) + a(2, 1)*a(1, 3)*a(3, 2) + &
809 a(3, 1)*a(1, 2)*a(2, 3) - a(1, 1)*a(2, 3)*a(3, 2) - &
810 a(2, 1)*a(1, 2)*a(3, 3) - a(3, 1)*a(1, 3)*a(2, 2)
822 ai(j, i) = (-1._dp)**(i + j)*det* &
823 (a(il, jl)*a(iu, ju) - a(il, ju)*a(iu, jl))
828 END SUBROUTINE calbrec
845 SUBROUTINE primlatt(a, ai, ap, api, nat, ty, x, ntvec, tvec, f0, isc, delta)
871 REAL(
dp) :: a(3, 3), ai(3, 3), ap(3, 3), api(3, 3)
872 INTEGER :: nat, ty(nat)
873 REAL(
dp) :: x(3, nat)
875 REAL(
dp) :: tvec(3, nat)
876 INTEGER :: f0(49, nat), isc(nat)
879 INTEGER :: i, il, iv, j, k2
881 REAL(
dp) :: vr(3), xb(3)
897 IF (ty(1) /= ty(k2)) cycle
899 xb(i) = x(i, k2) - x(i, 1)
902 CALL rlv3(ai, xb, vr, il, delta)
903 CALL checkrlv3(1, nat, ty, x, x, vr, f0, ai, isc, .true., oksym, delta)
910 IF (f0(49, i) > f0(1, i)) f0(49, i) = f0(1, i)
913 tvec(i, ntvec) = vr(i)
935 xb(i) = tvec(1, iv)*a(i, 1) &
936 + tvec(2, iv)*a(i, 2) &
937 + tvec(3, iv)*a(i, 3)
940 CALL rlv3(api, xb, vr, il, delta)
942 IF (abs(vr(i)) > delta)
THEN
943 il = nint(1._dp/abs(vr(i)))
950 CALL calbrec(ap, api)
959 END SUBROUTINE primlatt
972 SUBROUTINE pgl1(a, ai, ihc, nc, ib, ihg, r, delta)
1009 REAL(
dp) :: a(3, 3), ai(3, 3)
1010 INTEGER :: ihc, nc, ib(48), ihg
1011 REAL(
dp) :: r(3, 3, 48), delta
1013 INTEGER :: i, j, k, lx, n, nr
1014 REAL(
dp) :: tr, vr(3), xa(3)
1026 loop_rotation:
DO n = 1, nr
1033 xa(i) = xa(i) + r(i, j, n)*a(j, k)
1036 CALL rlv3(ai, xa, vr, lx, delta)
1039 tr = tr + abs(vr(i))
1042 IF (tr > delta) cycle loop_rotation
1046 END DO loop_rotation
1051 IF (nc == 12) ihg = 6
1052 IF (nc > 12) ihg = 7
1053 IF (nc >= 12)
RETURN
1058 IF (nc == 4) ihg = 2
1060 IF (nc == 16) ihg = 4
1061 IF (nc > 16) ihg = 5
1077 SUBROUTINE rlv3(ai, xb, vr, il, delta)
1098 REAL(
dp) :: ai(3, 3), xb(3), vr(3)
1109 ts = abs(xb(1)) + abs(xb(2)) + abs(xb(3))
1110 IF (ts <= delta)
RETURN
1112 vr(i) = vr(i) + ai(i, 1)*xb(1) + ai(i, 2)*xb(2) + ai(i, 3)*xb(3)
1113 il = il + nint(abs(vr(i)))
1117 vr(i) = nint(vr(i)) - vr(i)
1147 SUBROUTINE atftm1(iout, r, v, x, f0, origin, ib, ty, nat, ihg, ihc, &
1148 rx, nc, indpg, ntvec, a, ai, li, isy, isc, delta)
1214 REAL(
dp) :: r(3, 3, 48), v(3, 48), origin(3)
1215 INTEGER :: ib(48), nat, ty(nat), f0(49, nat)
1216 REAL(
dp) :: x(3, nat)
1218 REAL(
dp) :: rx(3, nat)
1219 INTEGER :: nc, indpg, ntvec
1220 REAL(
dp) :: a(3, 3), ai(3, 3)
1221 INTEGER :: li, isy, isc(nat)
1224 CHARACTER(len=10),
DIMENSION(48),
PARAMETER :: rname_cubic = [
' 1 ',
' 2[ 10 0] ', &
1225 ' 2[ 01 0] ',
' 2[ 00 1] ',
' 3[-1-1-1]',
' 3[ 11-1] ',
' 3[-11 1] ',
' 3[ 1-11] ', &
1226 ' 3[ 11 1] ',
' 3[-11-1] ',
' 3[-1-11] ',
' 3[ 1-1-1]',
' 2[-11 0] ',
' 4[ 00 1] ', &
1227 ' 4[ 00-1] ',
' 2[ 11 0] ',
' 2[ 0-11] ',
' 2[ 01 1] ',
' 4[ 10 0] ',
' 4[-10 0] ', &
1228 ' 2[-10 1] ',
' 4[ 0-10] ',
' 2[ 10 1] ',
' 4[ 01 0] ',
'-1 ',
'-2[ 10 0] ', &
1229 '-2[ 01 0] ',
'-2[ 00 1] ',
'-3[-1-1-1]',
'-3[ 11-1] ',
'-3[-11 1] ',
'-3[ 1-11] ', &
1230 '-3[ 11 1] ',
'-3[-11-1] ',
'-3[-1-11] ',
'-3[ 1-1-1]',
'-2[-11 0] ',
'-4[ 00 1] ', &
1231 '-4[ 00-1] ',
'-2[ 11 0] ',
'-2[ 0-11] ',
'-2[ 01 1] ',
'-4[ 10 0] ',
'-4[-10 0] ', &
1232 '-2[-10 1] ',
'-4[ 0-10] ',
'-2[ 10 1] ',
'-4[ 01 0] ']
1233 CHARACTER(len=11),
DIMENSION(24),
PARAMETER :: rname_hexai = [
' 1 ',
' 6[ 00 1] ', &
1234 ' 3[ 00 1] ',
' 2[ 00 1] ',
' 3[ 00 -1] ',
' 6[ 00 -1] ',
' 2[ 01 0] ',
' 2[-11 0] ', &
1235 ' 2[ 10 0] ',
' 2[ 21 0] ',
' 2[ 11 0] ',
' 2[ 12 0] ',
'-1 ',
'-6[ 00 1] ', &
1236 '-3[ 00 1] ',
'-2[ 00 1] ',
'-3[ 00 -1] ',
'-6[ 00 -1] ',
'-2[ 01 0] ',
'-2[-11 0] ', &
1237 '-2[ 10 0] ',
'-2[ 21 0] ',
'-2[ 11 0] ',
'-2[ 12 0] ']
1238 CHARACTER(len=12),
DIMENSION(7),
PARAMETER :: icst = [
'TRICLINIC ',
'MONOCLINIC ', &
1239 'ORTHORHOMBIC',
'TETRAGONAL ',
'CUBIC ',
'TRIGONAL ',
'HEXAGONAL ']
1240 CHARACTER(len=3),
DIMENSION(32),
PARAMETER :: pgrd = [
'c1 ',
'ci ',
'c2 ',
'c1h',
'c2h', &
1241 'c3 ',
'c3i',
'd3 ',
'c3v',
'd3 ',
'c4 ',
's4 ',
'c4h',
'd4 ',
'c4v',
'd2d',
'd4h',
'c6 ',&
1242 'c3h',
'c6h',
'd6 ',
'c6v',
'd3h',
'd6h',
'd2 ',
'c2v',
'd2h',
't ',
'th ',
'o ',
'td ',&
1244 CHARACTER(len=5),
DIMENSION(32),
PARAMETER :: pgrp = [
' 1',
' <1>',
' 2',
' m', &
1245 ' 2/m',
' 3',
' <3>',
' 32',
' 3m',
' <3>m',
' 4',
' <4>',
' 4/m',
' 422', &
1246 ' 4mm',
'<4>2m',
'4/mmm',
' 6',
' <6>',
' 6/m',
' 622',
' 6mm',
'<6>m2',
'6/mmm', &
1247 ' 222',
' mm2',
' mmm',
' 23',
' m3',
' 432',
'<4>3m',
' m3m']
1249 INTEGER :: i, iis(48), il, info, j, k, k2, l, n, &
1251 LOGICAL :: nodupli, oksym
1252 REAL(
dp) :: vc(3, 48), vr(3), vs, xb(3)
1254 nodupli = ntvec == 1
1266 rx(i, k) = r(i, 1, l)*x(1, k) + r(i, 2, l)*x(2, k) + r(i, 3, l)*x(3, k)
1274 CALL checkrlv3(n, nat, ty, rx, x, vr, f0, ai, isc, nodupli, oksym, delta)
1275 IF (.NOT. oksym)
THEN
1279 IF (f0(49, k2) < k2) cycle
1280 IF (ty(1) /= ty(k2)) cycle
1282 xb(i) = rx(i, 1) - x(i, k2)
1285 CALL rlv3(ai, xb, vr, il, delta)
1294 CALL checkrlv3(n, nat, ty, rx, x, vr, f0, ai, isc, nodupli, oksym, delta)
1297 IF (.NOT. oksym)
THEN
1317 IF (ihg < 6) ni = 25
1321 IF (iis(l) == 0) cycle
1324 IF (ib(i) == ni) li = i
1333 vs = vs + abs(v(1, n)) + abs(v(2, n)) + abs(v(3, n))
1338 IF (vs > delta)
THEN
1349 WRITE (iout,
'(" ATFTM1! IHG=",A," NC=",I2)') icst(ihg), nc
1351 cpabort(
'ATFTM1: NUMBER OF ROTATION NULL')
1353 ELSE IF (nc == 1)
THEN
1356 ELSE IF (nc == 2 .AND. ib(2) == 25)
THEN
1359 ELSE IF (nc == 2 .AND. ( &
1368 ELSE IF (nc == 2 .AND. ( &
1376 ELSE IF (nc == 4 .AND. ( &
1388 ELSE IF (nc == 4 .AND. ( &
1397 ELSE IF (nc == 4 .AND. ( &
1405 ELSE IF (nc == 8 .AND. ( &
1406 (ib(3) == 14 .AND. ib(8) == 39) .OR. &
1407 (ib(3) == 19 .AND. ib(8) == 44) .OR. &
1408 (ib(3) == 22 .AND. ib(8) == 48)))
THEN
1413 ELSE IF (nc == 8 .AND. ib(4) == 4 .AND. ( &
1421 ELSE IF (nc == 8 .AND. ( &
1429 ELSE IF (nc == 8 .AND. ( &
1430 (ib(3) == 13 .AND. ib(8) == 39) .OR. &
1431 (ib(3) == 17 .AND. ib(8) == 44) .OR. &
1432 (ib(3) == 21 .AND. ib(8) == 48)))
THEN
1437 ELSE IF (nc == 16 .AND. ( &
1445 ELSE IF (nc == 4 .AND. (ib(4) == 4))
THEN
1449 ELSE IF (nc == 4 .AND. ( &
1456 ELSE IF (nc == 8)
THEN
1459 ELSE IF (nc == 12 .AND. ( &
1468 ELSE IF (nc == 24 .AND. ib(24) == 36)
THEN
1472 ELSE IF (nc == 24 .AND. ib(24) == 24)
THEN
1476 ELSE IF (nc == 24 .AND. ib(24) == 48)
THEN
1480 ELSE IF (nc == 48)
THEN
1490 ELSE IF (ihg >= 6)
THEN
1493 WRITE (iout,
'(" ATFTM1! IHG=",A," NC=",I2)') icst(ihg), nc
1495 cpabort(
'ATFTM1: NUMBER OF ROTATION NULL')
1497 ELSE IF (nc == 1)
THEN
1500 ELSE IF (nc == 2 .AND. ib(2) == 13)
THEN
1503 ELSE IF (nc == 2 .AND. ( &
1508 ELSE IF (nc == 2 .AND. ( &
1512 ELSE IF (nc == 4 .AND. ( &
1518 ELSE IF (nc == 3 .AND. ib(3) == 5)
THEN
1522 ELSE IF (nc == 6 .AND. ib(6) == 17)
THEN
1525 ELSE IF (nc == 6 .AND. ib(6) == 11)
THEN
1528 ELSE IF (nc == 6 .AND. ib(6) == 23)
THEN
1531 ELSE IF (nc == 12 .AND. ib(12) == 23)
THEN
1534 ELSE IF (nc == 6 .AND. ib(6) == 6)
THEN
1538 ELSE IF (nc == 6 .AND. ib(6) == 18)
THEN
1541 ELSE IF (nc == 12 .AND. ib(12) == 18)
THEN
1544 ELSE IF (nc == 12 .AND. ib(12) == 12)
THEN
1547 ELSE IF (nc == 12 .AND. ib(2) == 2 .AND. ib(12) == 24)
THEN
1550 ELSE IF (nc == 12 .AND. ib(2) == 3 .AND. ib(12) == 24)
THEN
1553 ELSE IF (nc == 24)
THEN
1570 vc(1, n) = a(1, 1)*v(1, n) + a(1, 2)*v(2, n) + a(1, 3)*v(3, n)
1571 vc(2, n) = a(2, 1)*v(1, n) + a(2, 2)*v(2, n) + a(2, 3)*v(3, n)
1572 vc(3, n) = a(3, 1)*v(1, n) + a(3, 2)*v(2, n) + a(3, 3)*v(3, n)
1574 CALL symmorphic(nc, ib, r, vc, ai, info, origin, delta)
1576 CALL rlv3(ai, origin, xb, il, delta)
1580 IF (-xb(i) >= 0._dp)
THEN
1583 origin(i) = 1._dp - xb(i)
1587 xb(i) = a(i, 1)*origin(1) + a(i, 2)*origin(2) + a(i, 3)*origin(3)
1590 ELSE IF (info == 0)
THEN
1608 IF ((ihg == 7 .AND. nc == 24) .OR. &
1609 (ihg == 5 .AND. nc == 48))
THEN
1611 WRITE (iout,
'(A,A,A)') &
1612 ' KPSYM| THE POINT GROUP OF THE CRYSTAL IS THE FULL ', &
1618 WRITE (iout,
'(A,A,A,I2,A)') &
1619 ' KPSYM| THE CRYSTAL SYSTEM IS ', &
1621 ' WITH ', nc,
' OPERATIONS:'
1625 WRITE (iout,
'( 5(5(A13),/))') (rname_hexai(ib(i)), i=1, nc)
1629 WRITE (iout,
'(10(5(A13),/))') (rname_cubic(ib(i)), i=1, nc)
1636 WRITE (iout,
'(A)') &
1637 ' KPSYM| THE SPACE GROUP OF THE CRYSTAL IS SYMMORPHIC'
1639 ELSE IF (isy == -1)
THEN
1641 WRITE (iout,
'(A)') &
1642 ' KPSYM| THE SPACE GROUP OF THE CRYSTAL IS SYMMORPHIC'
1645 WRITE (iout,
'(A,A,/,T3,3F10.6,3X,3F10.6)') &
1646 ' KPSYM| THE STANDARD ORIGIN OF COORDINATES IS: ', &
1647 '[CARTESIAN] [CRYSTAL]', xb, origin
1649 ELSE IF (isy == 0)
THEN
1651 WRITE (iout,
'(A,/,3X,A,F15.6,A)') &
1652 ' KPSYM| THE SPACE GROUP IS NON-SYMMORPHIC,', &
1653 ' (SUM OF TRANSLATION VECTORS=', vs,
')'
1655 ELSE IF (isy == -2)
THEN
1657 WRITE (iout,
'(A,A)') &
1658 ' KPSYM| CANNOT DETERMINE IF THE SPACE GROUP IS', &
1659 ' SYMMORPHIC OR NOT'
1662 WRITE (iout,
'(A,/,A,/,3X,A,F15.6,A)') &
1663 ' KPSYM| THE SPACE GROUP IS NON-SYMMORPHIC,', &
1664 ' KPSYM| OR ELSE A NON STANDARD ORIGIN OF COORDINATES WAS USED.', &
1665 ' KPSYM| (SUM OF TRANSLATION VECTORS=', vs,
')'
1669 CALL xstring(pgrp(indpg), i, j)
1670 CALL xstring(pgrd(indpg), k, l)
1672 WRITE (iout,
'(A,A,"(",A,")",T56,"[INDEX=",I2,"]")') &
1673 ' KPSYM| THE POINT GROUP OF THE CRYSTAL IS ', pgrp(indpg) (i:j), &
1674 pgrd(indpg) (k:l), indpg
1677 CALL xstring(pgrp(-indpg), i, j)
1678 CALL xstring(pgrd(-indpg), k, l)
1680 WRITE (iout,
'(A,I2,A,A,"(",A,")",T56,"[INDEX=",I2,"]")') &
1681 ' KPSYM| POINT GROUP: GROUP ORDER=', nc, &
1682 ' SUBGROUP OF ', pgrp(-indpg) (i:j), &
1683 pgrd(-indpg) (k:l), -indpg
1686 IF (ntvec == 1)
THEN
1688 WRITE (iout,
'(A,T60,I6)') &
1689 ' KPSYM| NUMBER OF PRIMITIVE CELL:', ntvec
1693 WRITE (iout,
'(A,T60,I6)') &
1694 ' KPSYM| NUMBER OF PRIMITIVE CELLS:', ntvec
1699 END SUBROUTINE atftm1
1716 SUBROUTINE checkrlv3(n, nat, ty, rx, x, vr, f0, ai, isc, &
1717 nodupli, oksym, delta)
1745 INTEGER :: n, nat, ty(nat)
1746 REAL(
dp) :: rx(3, nat), x(3, nat), vr(3)
1747 INTEGER :: f0(49, nat)
1748 REAL(
dp) :: ai(3, 3)
1750 LOGICAL :: nodupli, oksym
1753 INTEGER :: ia, ib, il
1754 REAL(
dp) :: vt(3), xb(3)
1760 atom:
DO ia = 1, nat
1762 IF (ty(ia) == ty(ib) .AND. isc(ib) == 0)
THEN
1763 xb(1) = rx(1, ia) - x(1, ib)
1764 xb(2) = rx(2, ia) - x(2, ib)
1765 xb(3) = rx(3, ia) - x(3, ib)
1766 CALL rlv3(ai, xb, vt, il, delta)
1768 oksym = (abs((vr(1) - vt(1)) - nint(vr(1) - vt(1))) < delta) .AND. &
1769 (abs((vr(2) - vt(2)) - nint(vr(2) - vt(2))) < delta) .AND. &
1770 (abs((vr(3) - vt(3)) - nint(vr(3) - vt(3))) < delta)
1772 IF (nodupli) isc(ib) = 1
1783 END SUBROUTINE checkrlv3
1796 SUBROUTINE symmorphic(nc, ib, r, v, ai, info, origin, delta)
1821 INTEGER :: nc, ib(nc)
1822 REAL(
dp) :: r(3, 3, 48), v(3, nc), ai(3, 3)
1824 REAL(
dp) :: origin(3), delta
1826 INTEGER :: i, i1, ierror, igood(3), il, imissing2, &
1827 imissing3, iok(3), ionly, ir, j, j1
1828 REAL(
dp) ::
diag, dif, r2(2, 2), r3(3, 3), vr(3), &
1842 dif = v(1, ir)*v(1, ir) + v(2, ir)*v(2, ir) + v(3, ir)*v(3, ir)
1843 IF (dif > delta*delta)
THEN
1850 r3(i, j) = -r(i, j, ib(ir))
1852 r3(i, i) = 1 + r3(i, i)
1855 IF (ierror == 0)
THEN
1858 vr(i) = r3(i, 1)*v(1, ir) &
1859 + r3(i, 2)*v(2, ir) &
1869 IF (i /= ierror)
THEN
1873 IF (j /= ierror)
THEN
1875 r2(i1, j1) = -r(i, j, ib(ir))
1878 r2(i1, i1) = 1 + r2(i1, i1)
1882 IF (ierror == 0)
THEN
1887 IF (igood(i) == 1)
THEN
1892 IF (igood(j) == 1)
THEN
1894 vr(i) = vr(i) + r2(i1, j1)*(v(j, ir) + &
1895 origin(imissing3)*r(j, imissing3, ib(ir)))
1906 IF (i /= imissing3)
THEN
1908 IF (i1 == ierror)
THEN
1916 diag = (1 - r(ionly, ionly, ib(ir)))
1917 IF (abs(
diag) > delta)
THEN
1918 vr(ionly) = 1._dp/
diag*(v(ionly, ir) + &
1919 origin(imissing3)*r(ionly, imissing3, ib(ir)) + &
1920 origin(imissing2)*r(ionly, imissing2, ib(ir)))
1922 vr(ionly) = origin(ionly)
1925 vr(imissing3) = origin(imissing3)
1926 vr(imissing2) = origin(imissing2)
1934 IF (iok(i) == 1)
THEN
1935 dif = dif + abs(origin(i) - vr(i))
1938 IF (dif > delta)
THEN
1944 IF (iok(i) /= 1 .AND. igood(i) == 1)
THEN
1953 IF (iok(1) == 0 .AND. iok(2) == 0 .AND. iok(3) == 0)
THEN
1963 vr(i) = r(i, 1, ib(ir))*origin(1) &
1964 + r(i, 2, ib(ir))*origin(2) &
1965 + r(i, 3, ib(ir))*origin(3)
1966 vr(i) = (origin(i) - vr(i)) - v(i, ir)
1968 CALL rlv3(ai, vr, xb, il, delta)
1969 dif = abs(xb(1)) + abs(xb(2)) + abs(xb(3))
1970 IF (dif > delta)
THEN
1978 END SUBROUTINE symmorphic
1985 SUBROUTINE rot1(ihc, r)
2010 REAL(
dp) :: r(3, 3, 48)
2012 INTEGER :: i, j, k, n, nv
2027 s = 0.5_dp*sqrt(3.0_dp)
2038 r(3, 3, n + 18) = 1._dp
2039 r(3, 3, n + 6) = -1._dp
2040 r(3, 3, n + 12) = -1._dp
2048 r(i, j, 6) = r(j, i, 2)
2050 r(i, j, 3) = r(i, j, 3) + r(i, k, 2)*r(k, j, 2)
2051 r(i, j, 8) = r(i, j, 8) + r(i, k, 2)*r(k, j, 7)
2052 r(i, j, 12) = r(i, j, 12) + r(i, k, 7)*r(k, j, 2)
2058 r(i, j, 5) = r(j, i, 3)
2060 r(i, j, 4) = r(i, j, 4) + r(i, k, 2)*r(k, j, 3)
2061 r(i, j, 9) = r(i, j, 9) + r(i, k, 2)*r(k, j, 8)
2062 r(i, j, 10) = r(i, j, 10) + r(i, k, 12)*r(k, j, 3)
2063 r(i, j, 11) = r(i, j, 11) + r(i, k, 12)*r(k, j, 2)
2071 r(i, j, nv) = -r(i, j, n)
2083 r(2, 3, 19) = -1._dp
2088 r(i, j, 20) = r(j, i, 19)
2089 r(i, j, 5) = r(j, i, 9)
2091 r(i, j, 2) = r(i, j, 2) + r(i, k, 19)*r(k, j, 19)
2092 r(i, j, 16) = r(i, j, 16) + r(i, k, 9)*r(k, j, 19)
2093 r(i, j, 23) = r(i, j, 23) + r(i, k, 19)*r(k, j, 9)
2100 r(i, j, 6) = r(i, j, 6) + r(i, k, 2)*r(k, j, 5)
2101 r(i, j, 7) = r(i, j, 7) + r(i, k, 16)*r(k, j, 23)
2102 r(i, j, 8) = r(i, j, 8) + r(i, k, 5)*r(k, j, 2)
2103 r(i, j, 10) = r(i, j, 10) + r(i, k, 2)*r(k, j, 9)
2104 r(i, j, 11) = r(i, j, 11) + r(i, k, 9)*r(k, j, 2)
2105 r(i, j, 12) = r(i, j, 12) + r(i, k, 23)*r(k, j, 16)
2106 r(i, j, 14) = r(i, j, 14) + r(i, k, 16)*r(k, j, 2)
2107 r(i, j, 15) = r(i, j, 15) + r(i, k, 2)*r(k, j, 16)
2108 r(i, j, 22) = r(i, j, 22) + r(i, k, 23)*r(k, j, 2)
2109 r(i, j, 24) = r(i, j, 24) + r(i, k, 2)*r(k, j, 23)
2116 r(i, j, 3) = r(i, j, 3) + r(i, k, 5)*r(k, j, 12)
2117 r(i, j, 4) = r(i, j, 4) + r(i, k, 5)*r(k, j, 10)
2118 r(i, j, 13) = r(i, j, 13) + r(i, k, 23)*r(k, j, 11)
2119 r(i, j, 17) = r(i, j, 17) + r(i, k, 16)*r(k, j, 12)
2120 r(i, j, 18) = r(i, j, 18) + r(i, k, 16)*r(k, j, 10)
2121 r(i, j, 21) = r(i, j, 21) + r(i, k, 12)*r(k, j, 15)
2127 r(1, 1, nv) = -r(1, 1, n)
2128 r(1, 2, nv) = -r(1, 2, n)
2129 r(1, 3, nv) = -r(1, 3, n)
2130 r(2, 1, nv) = -r(2, 1, n)
2131 r(2, 2, nv) = -r(2, 2, n)
2132 r(2, 3, nv) = -r(2, 3, n)
2133 r(3, 1, nv) = -r(3, 1, n)
2134 r(3, 2, nv) = -r(3, 2, n)
2135 r(3, 3, nv) = -r(3, 3, n)
2173 SUBROUTINE sppt2(iout, iq1, iq2, iq3, wvk0, nkpoint, &
2174 a1, a2, a3, b1, b2, b3, &
2175 inv, nc, ib, r, ntot, wvkl, lwght, lrot, &
2176 ncbrav, ibrav, istriz, &
2177 nhash, includ, list, rlist, delta)
2306 INTEGER :: iout, iq1, iq2, iq3
2309 REAL(
dp) :: a1(3), a2(3), a3(3), b1(3), b2(3), b3(3)
2310 INTEGER :: inv, nc, ib(48)
2311 REAL(
dp) :: r(3, 3, 48)
2313 REAL(
dp) :: wvkl(3, nkpoint)
2314 INTEGER :: lwght(nkpoint), lrot(48, nkpoint), &
2315 ncbrav, ibrav(48), istriz, nhash, &
2316 includ(nkpoint),
list(nkpoint + nhash)
2317 REAL(
dp) :: rlist(3, nkpoint), delta
2319 INTEGER,
PARAMETER :: no = 0, nrsdir = 100
2321 INTEGER :: i, i1, i2, i3, ibsign, igarb0, igarbage, &
2322 igarbg, ii, imesh, iop, iplace, &
2323 iremov, iwvk, j, jplace, k, n, nplane
2324 REAL(
dp) :: diff, proja(3), projb(3), &
2325 rsdir(4, nrsdir), ur1, ur2, ur3, &
2346 CALL bzdefine(iout, b1, b2, b3, rsdir, nplane, delta)
2353 CALL mesh(iout, wva, iplace, igarb0, igarbg, nkpoint, nhash, &
2359 ur1 = real(1 + iq1 - 2*i1, kind=
dp)/real(2*iq1, kind=
dp)
2360 ur2 = real(1 + iq2 - 2*i2, kind=
dp)/real(2*iq2, kind=
dp)
2361 ur3 = real(1 + iq3 - 2*i3, kind=
dp)/real(2*iq3, kind=
dp)
2363 wvk(i) = ur1*b1(i) + ur2*b2(i) + ur3*b3(i) + wvk0(i)
2366 CALL bzrduc(wvk, a1, a2, a3, b1, b2, b3, rsdir, &
2367 nrsdir, nplane, delta)
2368 IF (istriz == 1)
THEN
2375 wva(i) = wva(i) + r(i, j, ibrav(iop))*wvk(j)
2379 IF (.NOT. inside_bz(wva, rsdir, nplane, delta))
THEN
2381 WRITE (iout,
'(A,/)')
' SUBROUTINE SPPT2 *** FATAL ERROR ***'
2384 WRITE (iout,
'(A,3F10.4,/,A,3F10.4,A,/,A,I3,A)') &
2385 ' THE VECTOR ', wva, &
2386 ' GENERATED FROM ', wvk,
' IN THE BASIC MESH', &
2387 ' BY ROTATION NO. ', ibrav(iop),
' IS OUTSIDE THE 1BZ'
2389 cpabort(
'SPPT2: VECTOR OUTSIDE THE 1BZ')
2393 CALL mesh(iout, wva, iplace, igarb0, igarbg, &
2394 nkpoint, nhash,
list, rlist, delta)
2397 IF (iplace > 0) imesh = iplace
2398 IF (iplace > nkpoint)
THEN
2400 WRITE (iout,
'(A,/)')
' SUBROUTINE SPPT2 *** FATAL ERROR ***'
2403 WRITE (iout, *)
'MESH SIZE EXCEEDS NKPOINT=', nkpoint
2405 cpabort(
'SPPT2: MESH SIZE EXCEEDED')
2411 CALL mesh(iout, wvk, iplace, igarb0, igarbg, &
2412 nkpoint, nhash,
list, rlist, delta)
2414 IF (iplace > nkpoint)
THEN
2416 WRITE (iout,
'(A,/)')
' SUBROUTINE SPPT2 *** FATAL ERROR ***'
2419 WRITE (iout, *)
'MESH SIZE EXCEEDS NKPOINT=', nkpoint
2421 cpabort(
'SPPT2: MESH SIZE EXCEEDED')
2433 '(" KPSYM| THE WAVEVECTOR MESH CONTAINS ",I5," POINTS")') imesh
2434 WRITE (iout,
'(" KPSYM| THE POINTS ARE:")')
2437 CALL mesh(iout, wva, i, igarb0, igarbg, nkpoint, nhash, &
2439 IF (mod(i, 2) == 1)
THEN
2440 WRITE (iout,
'(1X,I5,3F10.4)', advance=
"no") i, wva
2442 WRITE (iout,
'(1X,I5,3F10.4)') i, wva
2448 IF (istriz == 1)
THEN
2452 DO i = 1, (imesh - 1)
2454 CALL mesh(iout, wva, iplace, igarb0, igarbg, &
2455 nkpoint, nhash,
list, rlist, delta)
2461 proja(1) = proja(1) + wva(k)*a1(k)
2462 proja(2) = proja(2) + wva(k)*a2(k)
2463 proja(3) = proja(3) + wva(k)*a3(k)
2466 loop_mesh:
DO j = (i + 1), imesh
2468 CALL mesh(iout, wvk, jplace, igarb0, igarbg, &
2469 nkpoint, nhash,
list, rlist, delta)
2475 projb(1) = projb(1) + wvk(k)*a1(k)
2476 projb(2) = projb(2) + wvk(k)*a2(k)
2477 projb(3) = projb(3) + wvk(k)*a3(k)
2481 diff = proja(k) - projb(k)
2482 IF (abs(real(nint(diff), kind=
dp) - diff) > delta) cycle loop_mesh
2485 CALL remove(wvk, jplace, igarb0, igarbg, &
2486 nkpoint, nhash,
list, rlist, delta)
2488 IF (jplace > 0) iremov = iremov + 1
2491 IF (iremov > 0 .AND. iout > 0)
THEN
2492 WRITE (iout,
'(A,A,/,A,1X,I6,A,/)') &
2493 ' KPSYM| SOME OF THESE MESH POINTS ARE RELATED BY LATTICE ', &
2494 'TRANSLATION VECTORS', &
2495 ' KPSYM|', iremov,
' OF THE MESH POINTS REMOVED.'
2504 IF (btest(includ(iwvk), 0)) cycle
2508 includ(iwvk) = ibset(includ(iwvk), 0)
2510 CALL mesh(iout, wvk, iplace, igarb0, igarbg, &
2511 nkpoint, nhash,
list, rlist, delta)
2513 CALL garbag(wvk, igarbage, igarb0, &
2514 nkpoint, nhash,
list, rlist, delta)
2515 IF (igarbage > 0) cycle
2518 includ(iwvk) = includ(iwvk) + ntot*2
2520 wvkl(i, ntot) = wvk(i)
2525 equivalent_points:
DO n = 1, nc
2530 wva(i) = wva(i) + r(i, j, ib(n))*wvk(j)
2537 CALL mesh(iout, wva, iplace, igarb0, igarbg, &
2538 nkpoint, nhash,
list, rlist, delta)
2539 IF (iplace == 0)
THEN
2540 IF (istriz /= -1)
THEN
2542 CALL garbag(wva, igarbage, igarb0, &
2543 nkpoint, nhash,
list, rlist, delta)
2544 IF (igarbage == 0)
THEN
2548 WRITE (iout,
'(A,/)')
' SUBROUTINE SPPT2 *** FATAL ERROR ***'
2551 WRITE (iout,
'(A,3F10.4,/,A,3F10.4,A,/,A,I3,A)') &
2552 ' THE VECTOR ', wva, &
2553 ' GENERATED FROM ', wvk,
' IN THE BASIC MESH', &
2554 ' BY ROTATION NO. ', ib(n),
' IS NOT IN THE LIST'
2556 cpabort(
'SPPT2: VECTOR NOT IN THE LIST')
2560 IF (iplace /= 0 .OR. istriz /= -1)
THEN
2562 CALL garbag(wva, igarbage, igarb0, &
2563 nkpoint, nhash,
list, rlist, delta)
2564 IF (igarbage > 0) cycle equivalent_points
2566 IF (.NOT. btest(includ(iplace), 0))
THEN
2568 lwght(ntot) = lwght(ntot) + 1
2569 lrot(lwght(ntot), ntot) = ib(n)*ibsign
2571 includ(iplace) = ibset(includ(iplace), 0)
2574 includ(iplace) = includ(iplace) + ntot*2
2577 IF (ibsign == -1 .OR. inv == 0) cycle equivalent_points
2585 END DO equivalent_points
2593 IF (ntot > nkpoint)
THEN
2595 WRITE (iout, *)
'IN SPPT2 NUMBER OF SPECIAL POINTS = ', ntot
2598 WRITE (iout, *)
'BUT NKPOINT = ', nkpoint
2606 WRITE (iout,
'(/,A,4X,A)') &
2607 ' KPSYM|',
'CROSS TABLE RELATING MESH POINTS WITH SPECIAL POINTS:'
2610 WRITE (iout,
'(5(4X,"IK -> SK"))')
2613 iplace = includ(i)/2
2615 WRITE (iout,
'(1X,I5,1X,I5)', advance=
"no") i, iplace
2617 IF ((mod(i, 5) == 0) .AND. iout > 0)
THEN
2621 IF ((mod(j - 1, 5) /= 0) .AND. iout > 0)
THEN
2625 END SUBROUTINE sppt2
2639 SUBROUTINE mesh(iout, wvk, iplace, igarb0, igarbg, &
2640 nmesh, nhash, list, rlist, delta)
2659 INTEGER :: iplace, igarb0, igarbg, nmesh, nhash, &
2661 REAL(
dp) :: rlist(3, nmesh), delta
2663 INTEGER,
PARAMETER :: nil = 0
2665 INTEGER :: i, ihash, ipoint
2666 INTEGER,
SAVE :: istore
2667 REAL(
dp) :: delta1, rhash
2673 delta1 = 10._dp*delta
2674 IF (iplace <= -2)
THEN
2675 DO i = 1, nhash + nmesh
2684 ELSE IF ((iplace > -2) .AND. (iplace <= 0))
THEN
2686 rhash = 0.7890_dp*wvk(1) &
2687 + 0.6810_dp*wvk(2) &
2688 + 0.5811_dp*wvk(3) + delta
2689 ihash = int(abs(rhash)*real(nhash, kind=
dp))
2690 ihash = mod(ihash, nhash) + nmesh + 1
2692 ipoint =
list(ihash)
2695 IF (ipoint == nil)
EXIT
2697 IF (all(abs(wvk(:) - rlist(:, ipoint)) <= delta1))
THEN
2699 IF (iplace == 0)
RETURN
2706 ipoint =
list(ihash)
2708 IF (ipoint /= nil)
THEN
2711 WRITE (iout,
'(2A,/,A)') &
2712 ' SUBROUTINE MESH *** FATAL ERROR *** LINKED LIST', &
2713 ' TOO LONG ***',
' CHOOSE A BETTER HASH-FUNCTION'
2715 cpabort(
'MESH: WARNING')
2718 IF (iplace == -1)
THEN
2724 list(ihash) = istore
2725 IF (istore > nmesh)
THEN
2727 WRITE (iout,
'(A)')
'SUBROUTINE MESH *** FATAL ERROR ***'
2730 WRITE (iout,
'(A,I10,A,/,A,3F10.5)') &
2731 ' ISTORE=', istore,
' EXCEEDS DIMENSIONS', &
2734 cpabort(
'MESH: WARNING')
2738 rlist(i, istore) = wvk(i)
2750 IF (ipoint >= istore)
THEN
2752 WRITE (iout,
'(A,/,A,I5,A,/)') &
2753 ' SUBROUTINE MESH *** WARNING ***', &
2754 ' IPLACE = ', iplace, &
2755 ' IS BEYOND THE LISTS - WVK SET TO 1.0E38'
2762 wvk(i) = rlist(i, ipoint)
2778 SUBROUTINE remove(wvk, iplace, igarb0, igarbg, &
2779 nmesh, nhash, list, rlist, delta)
2792 INTEGER :: iplace, igarb0, igarbg, nmesh, nhash, &
2794 REAL(
dp) :: rlist(3, nmesh), delta
2796 INTEGER,
PARAMETER :: nil = 0
2798 INTEGER :: i, ihash, ipoint
2799 REAL(
dp) :: delta1, rhash
2805 delta1 = 10._dp*delta
2807 rhash = 0.7890_dp*wvk(1) &
2808 + 0.6810_dp*wvk(2) &
2809 + 0.5811_dp*wvk(3) + delta
2810 ihash = int(abs(rhash)*real(nhash, kind=
dp))
2811 ihash = mod(ihash, nhash) + nmesh + 1
2813 ipoint =
list(ihash)
2816 IF (ipoint == nil)
THEN
2822 IF (.NOT. any(abs(wvk(:) - rlist(:, ipoint)) > delta1))
THEN
2828 IF (igarb0 == 0)
THEN
2832 list(igarbg) = ipoint
2841 ipoint =
list(ihash)
2844 cpabort(
'MESH: LIST TOO LONG')
2845 END SUBROUTINE remove
2857 SUBROUTINE garbag(wvk, iplace, igarb0, &
2858 nmesh, nhash, list, rlist, delta)
2871 INTEGER :: iplace, igarb0, nmesh, nhash, &
2873 REAL(
dp) :: rlist(3, nmesh), delta
2875 INTEGER,
PARAMETER :: nil = 0
2877 INTEGER :: i, ihash, ipoint
2884 delta1 = 10._dp*delta
2890 IF (ipoint == nil)
THEN
2896 IF (.NOT. any(abs(wvk(:) - rlist(:, ipoint)) > delta1))
THEN
2903 ipoint =
list(ihash)
2906 cpabort(
'GARBAG: LIST TOO LONG')
2907 END SUBROUTINE garbag
2923 SUBROUTINE bzrduc(wvk, a1, a2, a3, b1, b2, b3, rsdir, nrsdir, nplane, delta)
2929 REAL(
dp) :: wvk(3), a1(3), a2(3), a3(3), b1(3), &
2932 REAL(
dp) :: rsdir(4, nrsdir)
2936 INTEGER,
PARAMETER :: nzones = 4, nnn = 2*nzones + 1, &
2939 INTEGER :: i, i1, i2, i3, n1, n2, n3, nn1, nn2, nn3
2941 REAL(
dp) :: wb(3), wva(3)
2949 IF (.NOT. inside_bz(wvk, rsdir, nplane, delta))
THEN
2953 wb(1) = wvk(1)*a1(1) + wvk(2)*a1(2) + wvk(3)*a1(3)
2954 wb(2) = wvk(1)*a2(1) + wvk(2)*a2(2) + wvk(3)*a2(3)
2955 wb(3) = wvk(1)*a3(1) + wvk(2)*a3(2) + wvk(3)*a3(3)
2960 n1_loop:
DO n1 = 1, nnn
2967 wva(i) = wvk(i) + real(i1, kind=
dp)*b1(i) + real(i2, kind=
dp)*b2(i) + &
2968 REAL(i3, kind=
dp)*b3(i)
2970 inside = inside_bz(wva, rsdir, nplane, delta)
2971 IF (inside)
EXIT n1_loop
2979 END SUBROUTINE bzrduc
2990 FUNCTION inside_bz(wvk, rsdir, nplane, delta)
RESULT(inbz)
2991 REAL(kind=
dp),
DIMENSION(3) :: wvk
2992 REAL(kind=
dp),
DIMENSION(:, :) :: rsdir
2994 REAL(kind=
dp) :: delta
2998 REAL(kind=
dp) :: projct
3002 projct = (rsdir(1, n)*wvk(1) + rsdir(2, n)*wvk(2) + rsdir(3, n)*wvk(3))/rsdir(4, n)
3003 IF (abs(projct) > 0.5_dp + delta)
THEN
3009 END FUNCTION inside_bz
3028 SUBROUTINE bzdefine(iout, b1, b2, b3, rsdir, nplane, delta)
3030 REAL(kind=
dp),
DIMENSION(3) :: b1, b2, b3
3031 REAL(kind=
dp),
DIMENSION(:, :) :: rsdir
3033 REAL(kind=
dp) :: delta
3035 INTEGER :: i, i1, i2, i3, n, n1, n2, n3, nb1, nb2, &
3036 nb3, nnb1, nnb2, nnb3, nrsdir
3037 REAL(kind=
dp) :: b1len, b2len, b3len, bmax, projct
3038 REAL(kind=
dp),
DIMENSION(3) :: bvec
3040 nrsdir =
SIZE(rsdir, 2)
3042 b1len = b1(1)**2 + b1(2)**2 + b1(3)**2
3043 b2len = b2(1)**2 + b2(2)**2 + b2(3)**2
3044 b3len = b3(1)**2 + b3(2)**2 + b3(3)**2
3046 bmax = b1len + b2len + b3len
3047 nb1 = int(sqrt(bmax/b1len) + delta) + 1
3048 nb2 = int(sqrt(bmax/b2len) + delta) + 1
3049 nb3 = int(sqrt(bmax/b3len) + delta) + 1
3052 rsdir(1:3, 1) = b1(1:3)
3053 rsdir(1:3, 2) = b2(1:3)
3054 rsdir(1:3, 3) = b3(1:3)
3068 inner_loop:
DO n3 = 1, nnb3
3070 IF (i1 == 0 .AND. i2 == 0 .AND. i3 == 0) cycle inner_loop
3072 bvec(i) = real(i1, kind=
dp)*b1(i) + real(i2, kind=
dp)*b2(i) + &
3073 REAL(i3, kind=
dp)*b3(i)
3077 projct = 0.5_dp*(rsdir(1, n)*bvec(1) + rsdir(2, n)*bvec(2) &
3078 + rsdir(3, n)*bvec(3))/rsdir(4, n)
3082 IF (abs(projct) > 0.5_dp - delta) cycle inner_loop
3086 cpassert(nplane <= nrsdir)
3088 rsdir(i, nplane) = bvec(i)
3091 rsdir(4, nplane) = bvec(1)**2 + bvec(2)**2 + bvec(3)**2
3097 WRITE (iout,
'(A,I3,A,/,A,/,100(" KPSYM|",1X,3F10.4,/))') &
3098 ' KPSYM| The 1st Brillouin zone is confined by (at most)', &
3099 nplane,
' planes', &
3100 ' KPSYM| as defined by the +/- halves of the vectors:', &
3101 ((rsdir(i, n), i=1, 3), n=1, nplane)
3104 END SUBROUTINE bzdefine
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)
...