1C
2      SUBROUTINE DIRLAT (nat,ortho,alpha,beta,gamma)
3C
4C     LATGEN GENERATES THE BRAVAIS MATRIX BR2(3,3), WHICH TRANSFORMS
5C     A RECIPROCAL LATTICE VECTOR OF A SPECIAL COORDINATE SYSTEM (IN
6C     UNITS OF 2 PI/A(I)) INTO CARTESIAN SYSTEM
7C     Convention:  R_i = (i,*)
8C
9      IMPLICIT REAL*8 (A-H,O-Z)
10
11      LOGICAL           ORTHO
12      CHARACTER*4       LATTIC
13C
14      COMMON /CHAR   /  LATTIC
15      COMMON /GENER  /  BR2(3,3)
16C-----------------------------------------------------------------------
17C
18      pi=4.d0*atan(1.d0)
19      alpha0=alpha
20      beta0=beta
21      gamma1=gamma*pi/180.d0
22      beta1=beta*pi/180.d0
23      alpha1=alpha*pi/180.d0
24      cosg1=(cos(gamma1)-cos(alpha1)*cos(beta1))/sin(alpha1)/sin(beta1)
25      gamma0=acos(cosg1)
26      IF(LATTIC(1:1).EQ.'H') GOTO 10
27      IF(LATTIC(1:1).EQ.'S') GOTO 20
28      IF(LATTIC(1:1).EQ.'P') GOTO 20
29      IF(LATTIC(1:1).EQ.'B') GOTO 30
30      IF(LATTIC(1:1).EQ.'F') GOTO 40
31      IF(LATTIC(1:1).EQ.'C') GOTO 50
32      IF(LATTIC(1:1).EQ.'R') GOTO 80
33      STOP 'LATTIC WRONG'
34C
35C.....HEXAGONAL CASE
36 10   BR2(1,1)=SQRT(3.d0)/2.d0
37      BR2(1,2)=-.5d0
38      BR2(1,3)=0.0d0
39      BR2(2,1)=0.0d0
40      BR2(2,2)=1.0d0
41      BR2(2,3)=0.0d0
42      BR2(3,1)=0.0d0
43      BR2(3,2)=0.0d0
44      BR2(3,3)=1.d0
45      ORTHO=.FALSE.
46      GOTO 100
47C
48C.....PRIMITIVE LATTICE CASE
49 20   continue
50C
51      BR2(1,1)=1.0d0*sin(gamma0)*sin(beta1)
52      BR2(1,2)=1.0d0*cos(gamma0)*sin(beta1)
53      BR2(1,3)=1.0d0*cos(beta1)
54      BR2(2,1)=0.0d0
55      BR2(2,2)=1.0d0*sin(alpha1)
56      BR2(2,3)=1.0d0*cos(alpha1)
57      BR2(3,1)=0.0d0
58      BR2(3,2)=0.0d0
59      BR2(3,3)=1.0d0
60      ORTHO=.TRUE.
61      if(gamma.ne.90.d0) ortho=.false.
62      if(beta.ne.90.d0) ortho=.false.
63      if(alpha.ne.90.d0) ortho=.false.
64        write(*,*) alpha0,beta0,gamma0,ortho,br2
65      GOTO 100
66C
67C.....BC CASE (DIRECT LATTICE)
68 30   CONTINUE
69      BR2(1,1)=-0.5d0
70      BR2(1,2)=0.5d0
71      BR2(1,3)=0.5d0
72      BR2(2,1)=0.5d0
73      BR2(2,2)=-0.5d0
74      BR2(2,3)=0.5d0
75      BR2(3,1)=0.5d0
76      BR2(3,2)=0.5d0
77      BR2(3,3)=-0.5d0
78      ORTHO=.TRUE.
79      GOTO 100
80C
81C.....FC CASE (DIRECT LATTICE)
82 40   CONTINUE
83      BR2(1,1)=0.0d0
84      BR2(1,2)=0.5d0
85      BR2(1,3)=0.5d0
86      BR2(2,1)=0.5d0
87      BR2(2,2)=0.0d0
88      BR2(2,3)=0.5d0
89      BR2(3,1)=0.5d0
90      BR2(3,2)=0.5d0
91      BR2(3,3)=0.0d0
92      ORTHO=.TRUE.
93      GOTO 100
94C
95C.....CXY  CASE (DIRECT LATTICE)
96 50   CONTINUE
97      IF(LATTIC(2:3).EQ.'XZ') GOTO 60
98      IF(LATTIC(2:3).EQ.'YZ') GOTO 70
99      BR2(1,1)=0.5d0
100      BR2(1,2)=-0.5d0
101      BR2(1,3)=0.0d0
102      BR2(2,1)=0.5d0
103      BR2(2,2)=0.5d0
104      BR2(2,3)=0.0d0
105      BR2(3,1)=0.0d0
106      BR2(3,2)=0.0d0
107      BR2(3,3)=1.0d0
108      ORTHO=.TRUE.
109      GOTO 100
110C
111C.....CXZ  CASE (DIRECT LATTICE)
112 60   CONTINUE
113C.....CXZ ORTHOROMBIC CASE
114      if(gamma.eq.90.d0) then
115         BR2(1,1)=0.5d0
116         BR2(1,2)=0.0d0
117         BR2(1,3)=-0.5d0
118         BR2(2,1)=0.0d0
119         BR2(2,2)=1.0d0
120         BR2(2,3)=0.0d0
121         BR2(3,1)=0.5d0
122         BR2(3,2)=0.0d0
123         BR2(3,3)=0.5d0
124         ORTHO=.TRUE.
125         GOTO 100
126      ELSE
127C.....CXZ MONOCLINIC CASE
128         write(*,*) 'gamma not equal 90'
129         SINAB=SIN(gamma1)
130         COSAB=COS(gamma1)
131C
132         BR2(1,1)=0.5d0*sinab
133         BR2(1,2)=0.5d0*cosab
134         BR2(1,3)=-0.5d0
135         BR2(2,1)=0.0d0
136         BR2(2,2)=1.0d0
137         BR2(2,3)=0.0d0
138         BR2(3,1)=0.5d0*sinab
139         BR2(3,2)=0.5d0*cosab
140         BR2(3,3)=0.5d0
141         ORTHO=.FALSE.
142         GOTO 100
143      ENDIF
144
145C
146C.....CYZ  CASE (DIRECT LATTICE)
147 70   CONTINUE
148      BR2(1,1)=1.0d0
149      BR2(1,2)=0.0d0
150      BR2(1,3)=0.0d0
151      BR2(2,1)=0.0d0
152      BR2(2,2)=0.5d0
153      BR2(2,3)=0.5d0
154      BR2(3,1)=0.0d0
155      BR2(3,2)=-0.5d0
156      BR2(3,3)=0.5d0
157      ORTHO=.TRUE.
158      GOTO 100
159C.....RHOMBOHEDRAL CASE
160 80   BR2(1,1)=1/2.d0/sqrt(3.d0)
161      BR2(1,2)=-1/2.d0
162      BR2(1,3)=1/3.d0
163      BR2(2,1)=1/2.d0/SQRT(3.d0)
164      BR2(2,2)=1*0.5d0
165      BR2(2,3)=1/3.d0
166      BR2(3,1)=-1/SQRT(3.d0)
167      BR2(3,2)=0.d0
168      BR2(3,3)=1/3.d0
169      ORTHO=.FALSE.
170      GOTO 100
171C
172 100  CONTINUE
173      write(66,*) 'Bravais Matrix:'
174      write(66,999) br2
175 999  format(3f15.5)
176C
177      RETURN
178      END
179
180