forked from Huaguiyuan/fold2Bloch-VASP
-
Notifications
You must be signed in to change notification settings - Fork 0
/
kgen_prim.f90
62 lines (55 loc) · 1.42 KB
/
kgen_prim.f90
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
!!! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! kgen_prim
!!!
!!! Finds new K Values for each group, depending on the number of folds
!!! in x, y, and z directions.
!!!
!!! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SUBROUTINE kgen_prim (wk, folds, nnewk, & ! <- args in
newk) ! -> args out
implicit none
REAL(kind=8), intent(in) :: wk(3)
INTEGER, intent(in) :: folds(3), nnewk
REAL(kind=8), INTENT(out) :: newk (3,nnewk) ! new k-points in primitive BZ
real :: field_x, field_y, field_z
REAL(kind=8) :: TX, TY, TZ
REAL(kind=8) :: X, Y, Z
integer :: FX, FY, FZ
integer :: loop, i, j, k
X = wk(1); Y = wk(2); Z = wk(3)
FX = folds(1); FY = folds(2); FZ = folds(3)
!Brillouin zone range
field_x=0.5*FX
field_y=0.5*FY
field_z=0.5*FZ
loop=1
do i=0, (FX-1)
if ((X+i).gt.(field_x)) then
TX=X-(field_x*2)+i
else
TX=X+i
endif
do j=0, (FY-1)
if ((Y+j).gt.(field_y)) then
TY=Y-(field_y*2)+j
else
TY=Y+j
endif
do k=0,(FZ-1)
if ((Z+k).gt.(field_z)) then
TZ=Z-(field_z*2)+k
else
TZ=Z+k
endif
newk(1,loop)=TX
newk(2,loop)=TY
newk(3,loop)=TZ
loop=loop+1
enddo
enddo
enddo
!! Normalize
newk(1,:)=newk(1,:)/FX
newk(2,:)=newk(2,:)/FY
newk(3,:)=newk(3,:)/FZ
END SUBROUTINE kgen_prim