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