- Fixed a bug in UserWait - Improved scan message in scancom - Added zero point correction in lin2ang - fixed an issue with uuencoded messages
467 lines
15 KiB
Fortran
467 lines
15 KiB
Fortran
C-----------------------------------------------------------------------
|
|
C Subroutine for the following functions
|
|
C 1. To set and measure a given hkl reflection IR
|
|
C 2. To set only a given hkl reflection SR
|
|
C 3. To measure only a given hkl reflection IM
|
|
C 4. To move the circles to given angles SA (& ST,SO,SC,SP)
|
|
C 5. Perform Psi scans IP
|
|
C-----------------------------------------------------------------------
|
|
SUBROUTINE INDMES
|
|
INCLUDE 'COMDIF'
|
|
CHARACTER ITF*1,IT(NSIZE)*1,PSNAME*40
|
|
REAL RW(3,3)
|
|
NJREF = NREF
|
|
NATT = 0
|
|
PSI = 0.0
|
|
C-----------------------------------------------------------------------
|
|
C Set up for the DE function
|
|
C-----------------------------------------------------------------------
|
|
IF (KI .EQ. 'DE') THEN
|
|
CALL HKLN (IH,IK,IL,NJREF)
|
|
CALL ANGET (THETA,OMEGA,CHI,PHI)
|
|
CALL MESRIT
|
|
CALL ANGSET (THETA,OMEGA,CHI,PHI,0,ICOL)
|
|
RETURN
|
|
ENDIF
|
|
C-----------------------------------------------------------------------
|
|
C Default values for IH,IK,IL and write the appropriate header
|
|
C-----------------------------------------------------------------------
|
|
IH = 0
|
|
IK = 0
|
|
IL = 0
|
|
NIREF = 0
|
|
IF (KI .EQ. 'IR') THEN
|
|
WRITE (COUT,10000)
|
|
CALL GWRITE (ITP,' ')
|
|
ENDIF
|
|
IF (KI .EQ. 'IE') THEN
|
|
WRITE (COUT,11000)
|
|
CALL YESNO ('Y',ANS)
|
|
IF (ANS .EQ. 'N') THEN
|
|
KI = ' '
|
|
RETURN
|
|
ENDIF
|
|
ENDIF
|
|
IF (KI .EQ. 'SR') THEN
|
|
WRITE (COUT,14000)
|
|
CALL GWRITE (ITP,' ')
|
|
ENDIF
|
|
IF (KI .EQ. 'MS') THEN
|
|
WRITE (COUT,14100)
|
|
CALL GWRITE (ITP,' ')
|
|
ENDIF
|
|
IF (KI .EQ. 'IM') THEN
|
|
WRITE (COUT,15000)
|
|
CALL GWRITE (ITP,' ')
|
|
ENDIF
|
|
IF (KI .EQ. 'SA') THEN
|
|
WRITE (COUT,24000)
|
|
CALL GWRITE (ITP,'$')
|
|
ENDIF
|
|
IF (KI .EQ. 'ST') THEN
|
|
WRITE (COUT,28000)
|
|
CALL GWRITE (ITP,'$')
|
|
ENDIF
|
|
IF (KI .EQ. 'SO') THEN
|
|
WRITE (COUT,29000)
|
|
CALL GWRITE (ITP,'$')
|
|
ENDIF
|
|
IF (KI .EQ. 'SC') THEN
|
|
WRITE (COUT,30000)
|
|
CALL GWRITE (ITP,'$')
|
|
ENDIF
|
|
IF (KI .EQ. 'SP') THEN
|
|
WRITE (COUT,31000)
|
|
CALL GWRITE (ITP,'$')
|
|
ENDIF
|
|
C-----------------------------------------------------------------------
|
|
C The SA function angle input
|
|
C-----------------------------------------------------------------------
|
|
IF (KI .EQ. 'SA') THEN
|
|
CALL ANGET (THETA,OMEGA,CHI,PHI)
|
|
CALL FREEFM (ITR)
|
|
THETA = RFREE(1)
|
|
OMEGA = RFREE(2)
|
|
CHI = RFREE(3)
|
|
PHI = RFREE(4)
|
|
NJREF = -NJREF
|
|
CALL SETIT (NJREF)
|
|
RETURN
|
|
ENDIF
|
|
C-----------------------------------------------------------------------
|
|
C The ST, SO, SC, SP functions angle input
|
|
C-----------------------------------------------------------------------
|
|
IF (KI .EQ. 'ST' .OR. KI .EQ. 'SO' .OR.
|
|
$ KI .EQ. 'SC' .OR. KI .EQ. 'SP') THEN
|
|
CALL ANGET (THETA,OMEGA,CHI,PHI)
|
|
CALL FREEFM (ITR)
|
|
IF (KI .EQ. 'ST' )THETA = RFREE(1)
|
|
IF (KI .EQ. 'SO') OMEGA = RFREE(1)
|
|
IF (KI .EQ. 'SC') CHI = RFREE(1)
|
|
IF (KI .EQ. 'SP') PHI = RFREE(1)
|
|
NJREF = -NJREF
|
|
CALL SETIT (NJREF)
|
|
RETURN
|
|
ENDIF
|
|
C-----------------------------------------------------------------------
|
|
C Only the IM, IR, IE and SR functions are left at this point. Do IM.
|
|
C-----------------------------------------------------------------------
|
|
IF (KI .EQ. 'IM' ) THEN
|
|
WRITE (COUT,13000)
|
|
CALL FREEFM (ITR)
|
|
IH = IFREE(1)
|
|
IK = IFREE(2)
|
|
IL = IFREE(3)
|
|
CALL HKLN (IH,IK,IL, NJREF)
|
|
CALL ANGET (THETA,OMEGA,CHI,PHI)
|
|
CALL MESRIT
|
|
CALL ANGSET (THETA,OMEGA,CHI,PHI,0,ICC)
|
|
KI = ' '
|
|
RETURN
|
|
ENDIF
|
|
C-----------------------------------------------------------------------
|
|
C Input instruction for the IE function
|
|
C-----------------------------------------------------------------------
|
|
IOUT = -1
|
|
IF (KI .EQ. 'IE') THEN
|
|
CALL SPACEG (IOUT,0)
|
|
WRITE (COUT,17000)
|
|
ENDIF
|
|
C-----------------------------------------------------------------------
|
|
C Input instruction for the SR AND IR functions
|
|
C-----------------------------------------------------------------------
|
|
IF (KI .EQ. 'SR' .OR. KI .EQ. 'MS') THEN
|
|
WRITE (COUT,18000)
|
|
ENDIF
|
|
IF (KI .EQ. 'IR') THEN
|
|
IF (SGSYMB(1) .EQ. 0.0 .AND. SGSYMB(2) .EQ. 0.0)
|
|
$ CALL SPACEG (IOUT,0)
|
|
WRITE (COUT,16000)
|
|
ENDIF
|
|
C-----------------------------------------------------------------------
|
|
C Set up the IP instruction and CURVES.DAT
|
|
C-----------------------------------------------------------------------
|
|
IF (KI .EQ. 'IP') THEN
|
|
WRITE (COUT,33000)
|
|
IIP = LPT
|
|
CALL YESNO ('Y',ANS)
|
|
IF (ANS .EQ. 'Y') THEN
|
|
IIP = IOUNIT(8)
|
|
PSNAME = 'CURVES.DAT'
|
|
CALL IBMFIL (PSNAME,IIP,80,'US',IERR)
|
|
WRITE (IIP,34000) WAVE
|
|
DO 100 I = 1,3
|
|
DO 110 J = 1,3
|
|
RW(I,J) = R(I,J)/WAVE
|
|
110 CONTINUE
|
|
WRITE (IIP,35000) (RW(I,J),J=1,3)
|
|
100 CONTINUE
|
|
ENDIF
|
|
DPSI = 10
|
|
PSIMIN = 0.0
|
|
PSIMAX = 360.0
|
|
WRITE (COUT,17000)
|
|
ENDIF
|
|
CALL GWRITE (ITP,' ')
|
|
C-----------------------------------------------------------------------
|
|
C Interpret the free-form input for SR, IR and IE
|
|
C-----------------------------------------------------------------------
|
|
150 WRITE (COUT,32000)
|
|
CALL ALFNUM (OCHAR)
|
|
DO 160 J = 1,100
|
|
I = 101 - J
|
|
ANS = OCHAR(I:I)
|
|
IF (ANS .NE. ' ') THEN
|
|
ITF = '+'
|
|
IF (ANS .EQ. '-') ITF = '-'
|
|
IF (ANS .EQ. '-' .OR. ANS .EQ. '+') OCHAR(I:I) = ' '
|
|
GO TO 170
|
|
ENDIF
|
|
160 CONTINUE
|
|
170 CALL FREEFM (1000)
|
|
IH = IFREE(1)
|
|
IK = IFREE(2)
|
|
IL = IFREE(3)
|
|
C-----------------------------------------------------------------------
|
|
C SR Function - Set the display and then the reflection
|
|
C MS Function for the CAD4 only
|
|
C-----------------------------------------------------------------------
|
|
IF (KI .EQ. 'SR' .OR. KI .EQ. 'MS') THEN
|
|
CALL HKLN (IH,IK,IL,NJREF)
|
|
ISTAN = 0
|
|
DPSISV = DPSI
|
|
DPSI = 180.
|
|
IPRVAL = 1
|
|
CALL ANGCAL
|
|
DPSI = DPSISV
|
|
IF (IVALID .EQ. 32) THEN
|
|
KI = ' '
|
|
RETURN
|
|
ENDIF
|
|
IF (IVALID .NE. 0) THEN
|
|
WRITE (COUT,19000)
|
|
CALL YESNO ('N',ANS)
|
|
IF (ANS .EQ. 'N') THEN
|
|
KI = ' '
|
|
RETURN
|
|
ENDIF
|
|
ENDIF
|
|
IF (KI .EQ. 'MS') OMEGA = OMEGA + 90.0 - 0.5*THETA
|
|
IF (ITF .EQ. '-') THETA = 360.0 - THETA
|
|
CALL SETIT (NJREF)
|
|
RETURN
|
|
ENDIF
|
|
C-----------------------------------------------------------------------
|
|
C Store the h,k,l values for the IR and IE functions
|
|
C-----------------------------------------------------------------------
|
|
IF (IH .NE. 0 .OR. IK .NE. 0 .OR. IL .NE. 0) THEN
|
|
ILIST = 0
|
|
IF (KI .EQ. 'IE') ILIST = 1
|
|
IPRVAL = 1
|
|
CALL ANGCAL
|
|
IF (IVALID .EQ. 32) GO TO 150
|
|
IF (IVALID .NE. 0) THEN
|
|
WRITE (COUT,19100)
|
|
CALL YESNO ('N',ANS)
|
|
IF (ANS .EQ. 'N') GO TO 150
|
|
ENDIF
|
|
CALL DEQHKL (NHKL,ILIST)
|
|
NIREF = NIREF + 1
|
|
IOH(NIREF) = IH
|
|
IOK(NIREF) = IK
|
|
IOL(NIREF) = IL
|
|
IT(NIREF) = ITF
|
|
IF (NIREF .EQ. NSIZE) THEN
|
|
WRITE (COUT,18500)
|
|
CALL GWRITE (ITP,' ')
|
|
GO TO 180
|
|
ENDIF
|
|
GO TO 150
|
|
ENDIF
|
|
C-----------------------------------------------------------------------
|
|
C IR and IE Functions
|
|
C-----------------------------------------------------------------------
|
|
180 DO 220 I = 1,NIREF
|
|
IH = IOH(I)
|
|
IK = IOK(I)
|
|
IL = IOL(I)
|
|
ITF = IT(I)
|
|
JHKL(1,1) = IH
|
|
JHKL(2,1) = IK
|
|
JHKL(3,1) = IL
|
|
NHKL = 1
|
|
ILIST = 0
|
|
IPRVAL = 0
|
|
IF (KI .EQ. 'IE') CALL DEQHKL (NHKL,ILIST)
|
|
DO 210 J = 1,NHKL
|
|
IH = JHKL(1,J)
|
|
IK = JHKL(2,J)
|
|
IL = JHKL(3,J)
|
|
PSI = 0.0
|
|
C-----------------------------------------------------------------------
|
|
C Set the display
|
|
C-----------------------------------------------------------------------
|
|
CALL HKLN (IH,IK,IL,NJREF)
|
|
ISTAN = 0
|
|
C-----------------------------------------------------------------------
|
|
C Test if psi rotation is required
|
|
C-----------------------------------------------------------------------
|
|
IF (ABS(DPSI) .GT. 0.0001) THEN
|
|
TPSI = PSIMIN
|
|
IF (TPSI .GE. 180.0) TPSI = TPSI - 360.0
|
|
PSI = PSIMIN
|
|
ENDIF
|
|
C-----------------------------------------------------------------------
|
|
C Calculate angles for given h,k,l and psi. Why is Psi reversed ???
|
|
C Psi has to be reversed for the absorp calculation to work
|
|
C could have something to do with the handedness of the NRC
|
|
C Picker.
|
|
C-----------------------------------------------------------------------
|
|
200 PSISAV = PSI
|
|
PSI = 360.0 - PSI
|
|
IPRVAL = 0
|
|
CALL ANGCAL
|
|
IF (ITF .EQ. '-') THETA = 360.0 - THETA
|
|
PSI = PSISAV
|
|
C-----------------------------------------------------------------------
|
|
C If ANGCAL found rotation is possible set the circles and measure
|
|
C-----------------------------------------------------------------------
|
|
IF (IROT .EQ. 0) THEN
|
|
CALL MESRIT
|
|
ELSE
|
|
WRITE (COUT,25000) IH,IK,IL,PSI
|
|
CALL GWRITE (ITP,' ')
|
|
ENDIF
|
|
CALL KORQ (KQFLAG)
|
|
IF (KQFLAG .EQ. 1) THEN
|
|
C-----------------------------------------------------------------------
|
|
C Increment the psi value for rotation
|
|
C-----------------------------------------------------------------------
|
|
IF (ABS(DPSI) .GT. 0.0001) THEN
|
|
TPSI = TPSI + DPSI
|
|
PSI = PSI + DPSI
|
|
IF (PSI .GE. 360.0) PSI = PSI - 360.0
|
|
IF (TPSI .LE. PSIMAX) GO TO 200
|
|
ENDIF
|
|
ENDIF
|
|
C-----------------------------------------------------------------------
|
|
C Return circles to omega=0 and peak centre before exit
|
|
C-----------------------------------------------------------------------
|
|
ICC = 0
|
|
PSI = 0.0
|
|
SDPSI = DPSI
|
|
DPSI = 0.0
|
|
IPRVAL = 0
|
|
CALL ANGCAL
|
|
IF (ITF .EQ. '-') THETA = 360.0 - THETA
|
|
DPSI = SDPSI
|
|
CALL ANGSET (THETA,OMEGA,CHI,PHI,NATT,ICC)
|
|
IF (ICC .NE. 0) THEN
|
|
WRITE (COUT,26000)
|
|
CALL GWRITE (ITP,' ')
|
|
KI = ' '
|
|
RETURN
|
|
ENDIF
|
|
C CALL KORQ (KQFLAG)
|
|
IF (KQFLAG .NE. 1) THEN
|
|
KI = ' '
|
|
RETURN
|
|
ENDIF
|
|
210 CONTINUE
|
|
220 CONTINUE
|
|
IF (KI .EQ. 'IP') THEN
|
|
IF (IIP .NE. LPT)
|
|
$ CALL IBMFIL (PSNAME,-IIP,80,'US',IERR)
|
|
ENDIF
|
|
KI = ' '
|
|
RETURN
|
|
10000 FORMAT (' Intensity Measurements for Individual Reflections')
|
|
11000 FORMAT (' Intensity Measurements for Equivalent Reflections',
|
|
$ ' (Y) ? ',$)
|
|
13000 FORMAT (' Type h,k,l for label ',$)
|
|
14000 FORMAT (' Set One Reflection')
|
|
14100 FORMAT (' Set a Crystal Face for absorption measurements')
|
|
15000 FORMAT (' Measure the Reflection which is now in the Detector')
|
|
16000 FORMAT (' Type h,k,l and +/- 2Theta sense (+) for up to 50',
|
|
$ ' reflections. CR = End.')
|
|
17000 FORMAT (' Type h,k,l for up to 50 reflections. CR = End.')
|
|
18000 FORMAT (' Type h,k,l and +/- 2theta sense (+) ',$)
|
|
18500 FORMAT (' No more reflections allowed.')
|
|
19000 FORMAT (' Do you want to set it anyway (N) ? ',$)
|
|
19100 FORMAT (' Do you want to measure it anyway (N) ? ',$)
|
|
20000 FORMAT (3I4,5F8.3)
|
|
24000 FORMAT (' Type 2Theta,Omega,Chi,Phi (0) ',$)
|
|
25000 FORMAT (3I4,' Rotation to Psi',F7.2,' is NOT possible.')
|
|
26000 FORMAT (' Setting Collision')
|
|
28000 FORMAT (' Type 2-Theta ',$)
|
|
29000 FORMAT (' Type Omega ',$)
|
|
30000 FORMAT (' Type Chi ',$)
|
|
31000 FORMAT (' Type Phi ',$)
|
|
32000 FORMAT (' Next h,k,l (End) > ',$)
|
|
33000 FORMAT (' Collect Psi scan data'/
|
|
$ ' Do you want to write data to CURVES.DAT (Y) ? ')
|
|
34000 FORMAT (1X,F8.5)
|
|
35000 FORMAT (1X,3F10.6)
|
|
END
|
|
C-----------------------------------------------------------------------
|
|
C Measure the reflection
|
|
C-----------------------------------------------------------------------
|
|
SUBROUTINE MESRIT
|
|
INCLUDE 'COMDIF'
|
|
ITIME = 1
|
|
IF (ISCAN .EQ. 3 .OR. ISCAN .EQ. 4) THEN
|
|
CALL SAMMES (ITIME,ICC)
|
|
ELSE
|
|
CALL MESINT (IROFL,ICC)
|
|
ENDIF
|
|
IF (ICC .EQ. 2) THEN
|
|
WRITE (COUT,10000)
|
|
CALL GWRITE (ITP,' ')
|
|
RETURN
|
|
ENDIF
|
|
CALL PROFIL
|
|
IBGRD1 = BGRD1
|
|
IBGRD2 = BGRD2
|
|
ISUM = SUM
|
|
ICOUNT = COUNT
|
|
ATT = ATTEN(NATT+1)
|
|
IF (IPRFLG .EQ. 0) THEN
|
|
if(FRAC1 .GT. 0.01) THEN
|
|
PEAK = ATT*(SUM - (0.5*(BGRD1 + BGRD2)/FRAC1)*NPK)
|
|
ELSE
|
|
PEAK = 0.
|
|
END IF
|
|
IPEAK = PEAK
|
|
IF (KI .EQ. 'DE') THEN
|
|
WRITE (COUT,11000)
|
|
CALL GWRITE (ITP,' ')
|
|
ENDIF
|
|
IF (LPT .NE. ITP)
|
|
$ WRITE (LPT,12000) IH,IK,IL,THETA,FRAC1,NATT,
|
|
$ IBGRD1,ISUM,IBGRD2,PSI,IPEAK,ITIME
|
|
WRITE (COUT,12000) IH,IK,IL,THETA,FRAC1,NATT,
|
|
$ IBGRD1,ISUM,IBGRD2,PSI,IPEAK,ITIME
|
|
CALL GWRITE (ITP,' ')
|
|
ELSE
|
|
FFRAC = FRAC
|
|
IF (ITYPE .EQ. 7 .OR. ITYPE .EQ. 8) THEN
|
|
IP = PRESET
|
|
BB = 1000*(PRESET - IP)
|
|
FFRAC = BB/IP
|
|
ENDIF
|
|
PEAK = ATT*(COUNT - 0.5*(BGRD1 + BGRD2)/FFRAC)
|
|
IPEAK = PEAK
|
|
IF (LPT .NE. ITP)
|
|
$ WRITE (LPT,12000) IH,IK,IL,THETA,PRESET,NATT,
|
|
$ IBGRD1,ICOUNT,IBGRD2,PSI,IPEAK,ITIME
|
|
WRITE (COUT,12000) IH,IK,IL,THETA,TIME,NATT,
|
|
$ IBGRD1,ICOUNT,IBGRD2,PSI,IPEAK,ITIME
|
|
CALL GWRITE (ITP,' ')
|
|
ENDIF
|
|
IF (KI .EQ. 'IP') THEN
|
|
WRITE (IIP,13000) IH,IK,IL,THETA,OMEGA,CHI,PHI,PSI,
|
|
$ IPEAK
|
|
ENDIF
|
|
RETURN
|
|
10000 FORMAT (' Scan Collision')
|
|
11000 FORMAT (/,3X, ' h k l 2-Theta Time',
|
|
$ ' Att Bkg Peak Bkg Psi Inet ')
|
|
12000 FORMAT (3I4,F7.2,F7.3,1X,I1,I5,I7,I5,F7.2,I7,I4)
|
|
13000 FORMAT (3I4,5F8.2,I8)
|
|
END
|
|
C-----------------------------------------------------------------------
|
|
C Set the display and the circles
|
|
C-----------------------------------------------------------------------
|
|
SUBROUTINE SETIT (NJREF)
|
|
INCLUDE 'COMDIF'
|
|
IF (NJREF .LT. 0) THEN
|
|
RH = IH
|
|
RK = IK
|
|
RL = IL
|
|
NJREF = -NJREF
|
|
ELSE
|
|
RH = RFREE(1)
|
|
RK = RFREE(2)
|
|
RL = RFREE(3)
|
|
ENDIF
|
|
IF (ABS(RH - IH) .GT. 0.0001 .OR.
|
|
$ ABS(RK - IK) .GT. 0.0001 .OR.
|
|
$ ABS(RL - IL) .GT. 0.0001) THEN
|
|
WRITE (COUT,10100) RH,RK,RL,THETA,OMEGA,CHI,PHI,PSI
|
|
ELSE
|
|
WRITE (COUT,10000) IH,IK,IL,THETA,OMEGA,CHI,PHI,PSI
|
|
ENDIF
|
|
CALL GWRITE (ITP,' ')
|
|
CALL HKLN (IH,IK,IL,NJREF)
|
|
CALL ANGSET (THETA,OMEGA,CHI,PHI,NATT,ICC)
|
|
IF (ICC .NE. 0) THEN
|
|
WRITE (COUT,11000)
|
|
CALL GWRITE (ITP,' ')
|
|
ENDIF
|
|
KI = ' '
|
|
RETURN
|
|
10000 FORMAT (3I4,5F8.3)
|
|
10100 FORMAT (8F8.3)
|
|
11000 FORMAT (' Setting Collision')
|
|
END
|