Files
sics/difrac/ormat3.f
2000-10-20 14:22:35 +00:00

212 lines
7.9 KiB
Fortran

C-----------------------------------------------------------------------
C Subroutine to calculate the orientation matrix from three
C non-collinear reflections forming a right-handed system.
C-----------------------------------------------------------------------
SUBROUTINE ORMAT3
INCLUDE 'COMDIF'
DIMENSION TH(3),OM(3),CH(3),PH(3),THE(3,3),HM(3,3),HMI(3,3),
$ ANGS(3)
CHARACTER INTFLT*3
IF (KI .EQ. 'M3') THEN
WRITE (COUT,10000)
CALL YESNO ('Y',ANS)
IF (ANS .EQ. 'N') THEN
KI = ' '
ENDIF
ENDIF
DO 90 I = 1,3
DO 90 J = 1,3
ROLD(I,J) = R(I,J)/WAVE
90 CONTINUE
C-----------------------------------------------------------------------
C Part 1: Read in wavelength and data for the 3 reflections and then
C form the H matrix. Used by M3 and RS and OP (LISTER)
C-----------------------------------------------------------------------
IF (KI .EQ. 'M3' .OR. KI .EQ. 'RS' .OR. KI .EQ. 'OP') THEN
IF (KI .NE. 'OP') THEN
WRITE (COUT,11000) WAVE
CALL FREEFM (ITR)
WAV = RFREE(1)
IF (WAV .NE. 0) WAVE = WAV
ENDIF
ANS = 'N'
IF (KI .EQ. 'M3') THEN
WRITE (COUT,12000)
CALL YESNO ('N',ANS)
IF (KI .EQ. 'M3' .AND. ANS .EQ. 'N') THEN
WRITE (COUT, 12100)
CALL GWRITE (ITP, ' ')
ENDIF
ENDIF
IF (ANS .EQ. 'N') THEN
DO 100 J = 1,3
HM(1,J) = IHK(J)
HM(2,J) = NREFB(J)
HM(3,J) = ILA(J)
TH(J) = BCOUNT(J)
OM(J) = BBGR1(J)
CALL MOD360 (OM(J))
CH(J) = BBGR2(J)
CALL MOD360 (CH(J))
PH(J) = BTIME(J)
IF (KI .EQ. 'M3') THEN
WRITE (COUT,12200) IHK(J),NREFB(J),ILA(J),BCOUNT(J),
$ BBGR1(J),BBGR2(J),BTIME(J)
CALL GWRITE (ITP,' ')
ENDIF
100 CONTINUE
ELSE
WRITE (COUT,13000)
CALL GWRITE (ITP,' ')
DO 110 J = 1,3
WRITE (COUT,14000)
CALL FREEFM (ITR)
HM(1,J) = RFREE(1)
HM(2,J) = RFREE(2)
HM(3,J) = RFREE(3)
TH(J) = RFREE(4)
OM(J) = RFREE(5)
CH(J) = RFREE(6)
PH(J) = RFREE(7)
TH(J) = TH(J)
OM(J) = OM(J)
CALL MOD360 (OM(J))
CH(J) = CH(J)
CALL MOD360 (CH(J))
110 CONTINUE
ENDIF
C-----------------------------------------------------------------------
C Calculate the elements of the THETA matrix
C-----------------------------------------------------------------------
DO 120 J = 1,3
SLTEMP = 2.0*SIN((0.5*TH(J))/DEG)/WAVE
THE(1,J) = (COS(OM(J)/DEG)*COS(CH(J)/DEG)*COS(PH(J)/DEG) -
$ SIN(OM(J)/DEG)*SIN(PH(J)/DEG))*SLTEMP
THE(2,J) = (COS(OM(J)/DEG)*COS(CH(J)/DEG)*SIN(PH(J)/DEG) +
$ SIN(OM(J)/DEG)*COS(PH(J)/DEG))*SLTEMP
THE(3,J) = (COS(OM(J)/DEG)*SIN(CH(J)/DEG))*SLTEMP
120 CONTINUE
C-----------------------------------------------------------------------
C Invert the H matrix and form the R matrix
C-----------------------------------------------------------------------
CALL MATRIX (HM,HMI,HMI,HMI,'INVERT')
CALL MATRIX (THE,HMI,R,R,'MATMUL')
C-----------------------------------------------------------------------
C Evaluate the determinant to decide if right or left handed
C-----------------------------------------------------------------------
DET = R(1,1)*(R(2,2)*R(3,3) - R(2,3)*R(3,2)) -
$ R(1,2)*(R(2,1)*R(3,3) - R(2,3)*R(3,1)) +
$ R(1,3)*(R(2,1)*R(3,2) - R(2,2)*R(3,1))
IF (NRC*DET .EQ. 0) THEN
WRITE (LPT,15000)
KI = ' '
RETURN
ENDIF
IF (NRC*DET .GT. 0) THEN
WRITE (LPT,16000) KI,((R(I,J),J = 1,3),I = 1,3)
ELSE
WRITE (LPT,17000) KI,((R(I,J),J = 1,3),I = 1,3)
ENDIF
ENDIF
IF (KI .EQ. 'OM') THEN
DO 130 I = 1,3
DO 130 J = 1,3
R(I,J) = R(I,J)/WAVE
130 CONTINUE
ENDIF
C-----------------------------------------------------------------------
C Get the real and reciprocal cell parameters
C-----------------------------------------------------------------------
IF (KI .NE. 'RA') THEN
CALL GETPAR
WRITE (LPT,18000) APS,CANGS
WRITE (LPT,19000) AP,CANG
C-----------------------------------------------------------------------
C Calculate SANG, CANG, SANGS and CANGS for COMMON and put R right
C-----------------------------------------------------------------------
DO 160 I = 1,3
SANG(I) = SIN(CANG(I)/DEG)
CANG(I) = COS(CANG(I)/DEG)
SANGS(I) = SIN(CANGS(I)/DEG)
CANGS(I) = COS(CANGS(I)/DEG)
DO 160 J = 1,3
R(I,J) = R(I,J)*WAVE
160 CONTINUE
C-----------------------------------------------------------------------
C Calculate the symmetry matrix SINABS, unless called from LISTER (OP)
C or M3 when it will be done only if the new matrix is retained.
C-----------------------------------------------------------------------
ISYS = 1
IF (KI .NE. 'OP' .AND. KI .NE. 'M3') CALL SINMAT
IF (KI .NE. 'M3') KI = ' '
RETURN
ENDIF
C-----------------------------------------------------------------------
C RA calculates angles for given h,k,l values RA
C-----------------------------------------------------------------------
IF (KI .EQ. 'RA') THEN
DPSI = 0.0
200 WRITE (COUT,20000)
CALL FREEFM (ITR)
IH = IFREE(1)
IK = IFREE(2)
IL = IFREE(3)
RH = RFREE(1)
RK = RFREE(2)
RL = RFREE(3)
INTFLT = 'INT'
IF (ABS(RH - IH) .GT. 0.0001 .OR.
$ ABS(RK - IK) .GT. 0.0001 .OR.
$ ABS(RL - IL) .GT. 0.0001) INTFLT = 'FLT'
IF (INTFLT .EQ. 'INT' .AND.
$ IH .EQ. 0 .AND. IK .EQ. 0 .AND. IL .EQ. 0) THEN
KI = ' '
RETURN
ENDIF
PSI = RFREE(4)
C-----------------------------------------------------------------------
C Give a value to DPSI for ANGCAL calculation to proceed for PSI .NE. 0
C-----------------------------------------------------------------------
IF (ABS(PSI) .GT. 0.0001) DPSI = 10.0
ISTAN = 0
IPRVAL = 1
CALL ANGCAL
IF (IROT .NE. 0) THEN
IF (INTFLT .EQ. 'INT') THEN
WRITE (COUT,22000) IH,IK,IL,PSI
ELSE
WRITE (COUT,22100) RH,RK,RL,PSI
ENDIF
CALL GWRITE (ITP,' ')
ENDIF
IF (IVALID .EQ. 0 .AND. IROT .EQ. 0) THEN
IF (INTFLT .EQ. 'INT') THEN
WRITE (COUT,23000) IH,IK,IL,THETA,OMEGA,CHI,PHI,PSI
ELSE
WRITE (COUT,23100) RH,RK,RL,THETA,OMEGA,CHI,PHI,PSI
ENDIF
CALL GWRITE (ITP,' ')
ENDIF
GO TO 200
ENDIF
10000 FORMAT (' Orientation Matrix from 3 Reflections (Y) ? ',$)
11000 FORMAT (' Type the Wavelength (',F7.5,') ',$)
12000 FORMAT (' Are the angles to be typed (N) ? ',$)
12100 FORMAT (' The three reflections being used are')
12200 FORMAT (3I4,4F8.3)
13000 FORMAT (' Type h,k,l,2Theta,Omega,Chi,Phi ')
14000 FORMAT (' > ',$)
15000 FORMAT (' The determinant of the matrix is 0.')
16000 FORMAT (/' RIGHT-handed Orientation Matrix from ',A2/(3F12.8))
17000 FORMAT (/' LEFT-handed Orientation Matrix from ',A2/(3F12.8))
18000 FORMAT (/' a* ',F8.5,' b* ',F8.5,' c* ',F8.5,
$ ' Alf* ',F7.3,' Bet* ',F7.3,' Gam* ',F7.3)
19000 FORMAT (' a ',F8.5,' b ',F8.5,' c ',F8.5,
$ ' Alf ',F7.3,' Bet ',F7.3,' Gam ',F7.3/)
20000 FORMAT (' Type h,k,l,Psi (End) ',$)
22000 FORMAT (3I4,' Psi ',F7.3,' Rotation not possible')
22100 FORMAT (3F8.3,' Psi ',F7.3,' Rotation not possible')
23000 FORMAT (3I4,5F8.3)
23100 FORMAT (8F8.3)
END