Trailing-Edge
-
PDP-10 Archives
-
decuslib20-03
-
decus/20-0077/nmrsim.for
There is 1 other file named nmrsim.for in the archive. Click here to see a list.
C NMR SIMULATION AND PLOTTING PROGRAM
C
C
C
C 9 JUNE 1973
C JAMES S. EVANS
C
C
C PROGRAM IS BASED ON FORMALISM, THEOREMS, AND METHODS
C DETAILED BY P. L. CORIO, "STRUCTURE OF HIGH-RESOLUTION
C NMR SPECTRA" (ACADEMIC PRESS, 1966)
C
IMPLICIT INTEGER (P,W)
C
C AS SYMBOLS FOR AVAILABLE NUCLEI
C AX NUCLEAR SPIN QUANTUM NUMBERS
C AG GYROMAGNETIC RATIOS (RECIPROCAL MILLIGAUSS-SEC)
C
COMMON /NUCL/ AS(10),AX(10),AG(10)
C
C A HAMILTONIAN MATRIX
C S MATRIX OF EIGENVECTORS (STORED COLUMNWISE)
C T TRANSITION PROBABILITY MATRIX
C R TEMPORARY STORAGE FOR HAMIL
C X TEMPORARY STORAGE FOR SPINS AND EIGEN2
C MY TEMPORARY STORAGE FOR EIGEN2
C P POINTING VECTOR (AVOIDS SORTING SPIN FUNCTIONS)
C Z SPIN FUNCTIONS (Z-COMPONENT FOR EACH NUCLEUS,
C TOTAL Z-COMPONENT IN COL 0, ONE ROW PER SPIN STATE)
C GZ GYROMAGNETIC RATIOS OF NUCLEI IN MOLECULE
C YJ CHEMICAL SHIFTS (ON-DIAGONAL) AND COUPLING CONSTANTS
C (OFF-DIAGONAL)
C YL SPINS OF NUCLEI IN MOLECULE
C BS SYMBOLS OF NUCLEI IN MOLECULE
C W SIZE OF HAMILTONIAN MATRIX FOR EACH SPIN
C WV TRANSFER VECTOR (USED WITH P TO ACCESS SPIN FUNCTIONS)
C
COMMON /CALC/ A(35,35),S(35,35),T(35,35),R(35),X(35),MY(35),
1 P(128),Z(128,0/7),GZ(7),YJ(7,7),YL(7),BS(0/7),W(15),WV(15)
C
C E FREQUENCIES IN LINE SPECTRUM
C YI INTENSITIES IN LINE SPECTRUM (REAL I IN SUBS.
C ORDER AND SHAPE)
C IX FREQUENCY SCALE FOR PLOT (INTEGER X IN SUBS.
C ORDER AND SHAPE)
C Y INTENSITY SCALE FOR PLOT
C
COMMON /SPEC/ E(500),YI(500),IX(500),Y(0/510)
C
C IO2,IO3,IO4 INPUT,OUTPUT TO DISK (OR MAG TAPE)
C IO5,IO6 INPUT,OUTPUT TO USER'S TERMINAL
C
COMMON /IODEV/ IO2,IO3,IO4,IO5,IO6
C
C KWIT SIGNAL FOR ESCAPE KEY STRUCK
C L PEN UP (.NE. 0) OR DOWN (.EQ. 0)
C X0 MINIMUM X BOUNDARY
C X1 MAXIMUM X BOUNDARY
C X2 NEW X
C X3 OLD X, ALSO TOTAL X DISPLACEMENT
C X4 INTERMEDIATE X DISPLACEMENT
C X5 DIGITAL RESOLUTION OF TSP-12 PLOTTER INTERFACE
C Y0-Y5 DEFINED SIMILARLY
C
COMMON /PLOT1/ KWIT,L,X0,X1,X2,X3,X4,X5,Y0,Y1,Y2,Y3,Y4,Y5
C
INTEGER X2,X3,X4,X5,Y2,Y3,Y4,Y5
C
DATA AS/'H','D','B10','B11','C13','N14','N15','F','P','LAST'/
DATA AX/0.5, 1.0, 3.0, 1.5, 0.5, 1.0, 0.5, 0.5, 0.5, 0.0/
DATA AG/26.7512, 4.10641, 2.87465, 8.58276, 6.72597,
1 1.93289, 2.71123, 25.1668, 10.829, 0./
C
C PROGRAM INITIALIZATION
C
IO2=20
IO3=21
IO4=22
IO5=5
IO6=5
BS(0)=' '
N9=500
R8=1.0E-5
X5=510
Y5=510
C
WRITE(IO6,6000)
NCHK=0
GO TO 20
C
C SUPERVISORY SECTION
C
C MODE CONTROLS FLOW OF OPERATIONS
C NCHK PREVENTS ACCESS TO ROUTINES LACKING NEEDED DATA
C NGO SPECIFIES DESTINATION, ALSO ERROR RETURN
C
C ERROR REENTRY AT STATEMENT 10
C
10 WRITE(IO6,6001) NGO
C
C NORMAL REENTRY AT STATEMENT 20
C
20 WRITE(IO6,6002)
READ(IO5,5000) NGO
IF(NGO .GE. 0 .AND. NGO .LE. 30) GO TO 50
C
C NONEXISTENT COMMAND CODES TRAP TO STATEMENT 30
C
30 WRITE(IO6,6003)
GO TO 20
C
C
C ROUTING TO VARIOUS OPTIONS
C
50 KWIT=0
GO TO (90,100,200,30,30,30,30,30,30,30,
1 1000,1100,1200,1300,1400,1500,1600,30,30,30,
2 30,2100,2200,2300,2400,2500,2600,2700,2800,30,3000),NGO+1
C
C HELP MESSAGE
C
90 WRITE(IO6,6004)
C
C CHANGE TO SEQUENTIAL RUN MODE (FOR DEBUGGING)
C
100 MODE=1
GO TO 20
C
C CHANGE TO EPISODIC RUN MODE (FOR DEBUGGING)
C
200 MODE=2
GO TO 20
C
C CALCULATION OF LINE SPECTRUM (OPTIONS 10-16)
C
C
C LIST AVAILABLE NUCLEI (OPTION 10)
C
1000 WRITE(IO6,6005)
I=1
1010 IF(AS(I) .EQ. 'LAST') GO TO 1020
WRITE(IO6,6006) AS(I)
I=I+1
GO TO 1010
1020 WRITE(IO6,6007)
NCHK=NCHK .OR. "2000
GO TO 20
C
C DEFINE NEW MOLECULE (OPTION 11)
C
C YI5 FACTOR CONTRIBUTING TO THEORETICAL INTENSITY
C N8 NUMBER OF NUCLEI IN MOLECULE WITH NONZERO SPIN
C YL9 SUM OF ALL SPINS IN MOLECULE (HIGHEST SPIN STATE)
C
1100 YI5=2./3.
YL9=0.
MODE=1
1110 NCHK=NCHK .AND. "777774003777
WRITE(IO6,6008)
READ(IO5,5000) N8
IF(N8 .LE. 0 .OR. N8 .GT. 7) GO TO 1110
WRITE(IO6,6009)
DO 1150 I=1,N8
1120 WRITE(IO6,6010) I
READ(IO5,5001) BS(I)
J=0
1130 J=J+1
IF(AS(J) .NE. 'LAST') GO TO 1140
WRITE(IO6,6011) BS(I)
GO TO 1120
1140 IF(AS(J) .NE. BS(I)) GO TO 1130
GZ(I)=AG(J)
YL(I)=AX(J)
X(I)=AX(J)
YL9=YL9+AX(J)
YI5=YI5*(2.*AX(J)+1.)
1150 CONTINUE
CALL SPINS (YL9,N8)
IF(YL9 .GT. 0.) GO TO 1160
WRITE(IO6,6012)
GO TO 1100
1160 NCHK=NCHK .OR. "4000
C
C ENTER COUPLING CONSTANTS (OPTION 12)
C
1200 IF((NCHK .AND. "4000) .EQ. "4000) GO TO 1210
NGO=12
GO TO 10
1210 NCHK=NCHK .AND. "777777567777
WRITE(IO6,6013)
DO 1220 I=1,N8-1
DO 1220 J=I+1,N8
WRITE(IO6,6014) I,J
READ(IO5,5002) YJ(I,J)
YJ(J,I)=YJ(I,J)
1220 CONTINUE
NCHK=NCHK .OR. "10000
IF(MODE .EQ. 2) GO TO 20
C
C ENTER CHEMICAL SHIFTS (OPTION 13)
C
1300 IF((NCHK .AND. "4000) .EQ. "4000) GO TO 1310
NGO=13
GO TO 10
1310 NCHK=NCHK .AND. "777777557777
WRITE(IO6,6015)
DO 1320 I=1,N8
IF(BS(I) .NE. BS(I-1)) WRITE(IO6,6007)
WRITE(IO6,6016) I,BS(I)
READ(IO5,5002) YJ(I,I)
1320 CONTINUE
NCHK=NCHK .OR. "20000
IF(MODE .EQ. 2) GO TO 20
C
C ENTER NUCLEUS OBSERVED (OPTION 14)
C
C ASO SYMBOL FOR NUCLEUS IN RESONANCE
C YI9 TOTAL THEORETICAL INTENSITY
C (CORIO, EQS. 2.12 AND 2.13, P. 288)
C
1400 IF((NCHK .AND. "4000) .EQ. "4000) GO TO 1410
NGO=14
GO TO 10
1410 NCHK=NCHK .AND. "777777537777
WRITE(IO6,6017)
READ(IO5,5001) ASO
YI9=0.0
DO 1420 I=1,N8
IF(BS(I) .NE. ASO) GO TO 1420
G=GZ(I)
YI9=YI9+YL(I)*(YL(I)+1.)
1420 CONTINUE
IF(YI9 .GT. 0.0) GO TO 1430
WRITE(IO6,6018) ASO
NGO=14
GO TO 10
1430 YI9=YI5*YI9
NCHK=NCHK .OR. "40000
IF(MODE .EQ. 2) GO TO 20
C
C ENTER INTENSITY THRESHOLD (OPTION 15)
C
C YI2 CUT-OFF INTENSITY TO REJECT NUMERICAL ARTIFACTS
C
1500 IF((NCHK .AND. "44000) .EQ. "44000) GO TO 1510
NGO=15
GO TO 10
1510 NCHK=NCHK .AND. "777777477777
WRITE(IO6,6019) YI9
READ(IO5,5002) YI2
YI2=SQRT(ABS(YI2))
NCHK=NCHK .OR. "100000
IF(MODE .EQ. 2) GO TO 20
C
C START DIAGONALIZATIONS (OPTION 16)
C
C FNAME FILENAME ON THE DISK WILL BE FNAME.DAT
C YI4 TOTAL CALCULATED INTENSITY
C N7 TOTAL NUMBER OF UNSORTED AND UNCOMBINED LINES
C E1 MOST NEGATIVE FREQUENCY IN LINE SPECTRUM
C E2 MOST POSITIVE FREQUENCY IN LINE SPECTRUM
C
1600 IF((NCHK .AND. "174000) .EQ. "174000) GO TO 1610
NGO=16
GO TO 10
1610 NCHK=NCHK .AND. "777777577777
WRITE(IO6,6020)
READ(IO5,5001) FNAME
CALL OFILE(IO3,FNAME)
WRITE(IO3,6021) G
CALL HAMIL (ASO,R8,YL9,N8,YI2,YI4,N7,E1,E2,KWIT)
IF(KWIT .NE. 32) GO TO 1620
WRITE(IO6,6022) FNAME
GO TO 1630
1620 END FILE IO3
WRITE(IO6,6023) FNAME,YI4,N7,E2,E1
1630 REWIND IO3
IF(MODE .EQ. 1) MODE=2
NCHK=NCHK .OR. "200000
GO TO 20
C PLOTTING SECTION (OPTIONS 21-28)
C
C
C RETRIEVE LINE SPECTRUM FOR PLOTTING (OPTION 21)
C
C FILE FILENAME TO BE PLOTTED (WON'T INTERFERE WITH FNAME)
C GP GYROMAGNETIC RATIO
C
2100 NCHK=NCHK .AND. "7777777
WRITE(IO6,6020)
READ(IO5,5001) FILE
CALL IFILE(IO2,FILE)
READ(IO2,6021) GP
NCHK=NCHK .OR. "10000000
C
C ENTER MINIMUM RESOLUTION (OPTION 22)
C
C R1 RESOLUTION (HZ)
C R0 RESOLUTION (SEC)
C N7 NUMBER OF SORTED AND COMBINED LINES
C N9 DIMENSIONED SIZE OF ENERGY AND INTENSITY ARRAYS
C
2200 IF(MODE .EQ. 2) MODE=1
IF((NCHK .AND. "10000000) .EQ. "10000000) GO TO 2210
NGO=22
GO TO 10
2210 NCHK=NCHK .AND. "770017777777
WRITE(IO6,6024)
READ(IO5,5002) R1
R0=1./(R1+1.0E-10)
CALL ORDER (N7,N9,R0,KWIT)
IF(KWIT .GT. 0) GO TO 2220
R1=1./R0
WRITE(IO6,6025) N9
WRITE(IO6,6026) R1
2220 WRITE(IO6,6027) N7
WRITE(IO6,6031) E(N7),E(1)
NCHK=NCHK .OR. "20000000
IF(MODE .EQ. 2) GO TO 20
C
C TABULATE LINE SPECTRUM (OPTION 23)
C
2300 IF((NCHK .AND. "30000000) .EQ. "30000000) GO TO 2310
NGO=23
GO TO 10
2310 NCHK=NCHK .AND. "777737777777
WRITE(IO6,6028)
READ(IO5,5002) J
IF((J .NE. 1) .AND. (J .NE. 2)) GO TO 2360
WRITE(IO6,6038)
READ(IO5,5001) FILE2
CALL OFILE(IO4,FILE2)
WRITE(IO4,6007)
WRITE(IO4,5001) FILE2
WRITE(IO4,6007)
WRITE(IO4,6029)
WRITE(IO4,6030)(E(I),YI(I),I=1,N7)
WRITE(IO4,6007)
WRITE(IO4,6027) N7
WRITE(IO4,6026) R1
END FILE IO4
REWIND IO4
IF(J .NE. 2) GO TO 2350
WRITE(IO6,6039)
READ(IO5,5002) YI3
IF(YI3 .EQ. 0.) YI3=1.0E-10
WRITE(IO6,6029)
KWIT=0
DO 2320 I=1,N7
IF(YI(I) .GE. YI3) WRITE(IO6,6030) E(I),YI(I)
CALL TTYTST(KWIT,K)
IF(KWIT .EQ. 32) GO TO 2360
2320 CONTINUE
2350 WRITE(IO6,6007)
WRITE(IO6,6027) N7
WRITE(IO6,6026) R1
WRITE(IO6,6007)
2360 NCHK=NCHK .OR. "40000000
IF(MODE .EQ. 2) GO TO 20
C
C ENTER X-SCALE (OPTION 24)
C
2400 IF((NCHK .AND. "30000000) .EQ. "30000000) GO TO 2410
NGO=24
GO TO 10
2410 NCHK=NCHK .AND. "771277777777
WRITE(IO6,6031) E(N7),E(1)
WRITE(IO6,6032)
READ(IO5,5002) X0,X1
NCHK=NCHK .OR. "100000000
IF(MODE .EQ. 2) GO TO 20
C
C ENTER H1,T1,T2
C
C H1 RF POWER (MILLIGAUSS)
C T1,T2 RELAXATION TIMES (SEC)
C
2500 IF((NCHK .AND. "30000000) .EQ. "30000000) GO TO 2510
NGO=25
GO TO 10
2510 NCHK=NCHK .AND. "771177777777
WRITE(IO6,6033)
READ(IO5,5002) H1
WRITE(IO6,6034)
READ(IO5,5002) T1,T2
NCHK=NCHK .OR. "200000000
IF(MODE .EQ. 2) GO TO 20
C
C ENTER Y-SCALE (OPTION 26)
C
C Y9 HEIGHT OF BIGGEST PEAK TO BE PLOTTED
C
2600 IF((NCHK .AND. "330000000) .EQ. "330000000) GO TO 2610
NGO=26
GO TO 10
2610 NCHK=NCHK .AND. "771377777777
CALL SHAPE (N7,GP,H1,T1,T2,Y9)
WRITE(IO6,6035) Y9
READ(IO5,5002) Y0,Y1
NCHK=NCHK .OR. "400000000
IF(MODE .EQ. 2) GO TO 20
C
C ENTER PLOT SPEED (OPTION 27)
C
C P4 NUMBER OF BITS (OUT OF 511) FOR TYPICAL PEN MOVEMENT
C
2700 NCHK=NCHK .AND. "776777777777
WRITE(IO6,6036) X5
READ(IO5,5000) P4
IF(P4 .LT. 1) P4=1
NCHK=NCHK .OR. "1000000000
IF(MODE .EQ. 2) GO TO 20
C
C PLOT WITH CURRENT PARAMETERS (OPTION 28)
C
2800 IF((NCHK .AND. "1730000000) .EQ. "1730000000) GO TO 2810
NGO=28
GO TO 10
2810 NCHK=NCHK .AND. "775777777777
CALL PCTRL(1)
L=1
J=0
YY=-Y(0)-1
DO 2840 X2=0,X5
IF(Y(X2) .NE. YY) GO TO 2830
J=J+1
IF(J .LT. P4) GO TO 2840
2830 J=0
YY=Y(X2)
CALL YPLOT (YY,P4)
IF(KWIT .EQ. 32) GO TO 2850
2840 CONTINUE
CALL PCTRL(3)
2850 IF(MODE .EQ. 1) MODE=2
NCHK=NCHK .OR. "2000000000
GO TO 20
C
C EXIT FROM PROGRAM TO SYSTEM MONITOR
C
3000 CONTINUE
WRITE(IO6,6037)
CALL EXIT
C
5000 FORMAT(I)
5001 FORMAT(A5)
5002 FORMAT(2G)
C
6000 FORMAT(/' NMR SIMULATION AND PLOTTING PROGRAM'/
1 '0USER MUST GIVE TWO-DIGIT REPLY WHENEVER PROGRAM'/
1 ' ASKS "NEXT?" TO EXIT, TYPE 30. FOR HELP, TYPE 0.')
6001 FORMAT(' COMMAND SEQUENCE ERROR AT OPTION'I3,'--BACK UP?')
6002 FORMAT('0NEXT? '$)
6003 FORMAT(' COMMAND CODE NOT RECOGNIZED')
6004 FORMAT(' 0=TYPE THIS TEXT'//
1 ' 10=LIST AVAILABLE NUCLEI'/
1 ' 11=DEFINE NEW SPIN SYSTEM'/
1 ' 12=ENTER COUPLING CONSTANTS'/
1 ' 13=ENTER CHEMICAL SHIFTS'/
1 ' 14=ENTER NUCLEUS OBSERVED'/
1 ' 15=ENTER INTENSITY THRESHOLD'/
1 ' 16=START DIAGONALIZATIONS'//
1 ' 21=RETRIEVE LINE SPECTRUM TO PLOT'/
1 ' 22=ENTER MINIMUM RESOLUTION'/
1 ' 23=TABULATE LINE SPECTRUM'/
1 ' 24=ENTER X-SCALE'/
1 ' 25=ENTER H1,T1,T2'/
1 ' 26=ENTER Y-SCALE'/
1 ' 27=ENTER PLOT SPEED'/
1 ' 28=PLOT WITH CURRENT PARAMETERS'//
1 ' 30=QUIT')
6005 FORMAT(' AVAILABLE NUCLEI: '$)
6006 FORMAT('+'A5,$)
6007 FORMAT(' ')
6008 FORMAT(' HOW MANY NUCLEI (MAX=7)? '$)
6009 FORMAT(' IDENTIFY NUCLEI (ALL OF ONE TYPE,'
1 ' THEN NEXT TYPE, ETC.)'/)
6010 FORMAT('+#'I1,' '$)
6011 FORMAT(' 'A5,' NOT AVAILABLE: REENTER'$)
6012 FORMAT(' TOO MANY SPIN FUNCTIONS: USE FEWER NUCLEI')
6013 FORMAT(' PAIR COUPLING CONSTANT (HZ)'/)
6014 FORMAT('+'2I2,' '$)
6015 FORMAT(' ATOM# TYPE CHEMICAL SHIFT (HZ)')
6016 FORMAT('+'I3,5X,A5,1X,$)
6017 FORMAT(' TYPE OF NUCLEUS OBSERVED? '$)
6018 FORMAT(' NUCLEUS 'A5,' NOT DEFINED IN MOLECULE')
6019 FORMAT(' TOTAL INTENSITY EXPECTED = 'F6.1/
1 ' MINIMUM INTENSITY? '$)
6020 FORMAT(' NAME FOR LINE SPECTRUM DISK FILE (MAX=5 CHARS)? '$)
6021 FORMAT(E15.8)
6022 FORMAT(' DIAGONALIZATION ABORTED, CAN REUSE FILE 'A5)
6023 FORMAT(' DIAGONALIZATIONS COMPLETED FOR FILE 'A5/
1 ' TOTAL COMPUTED INTENSITY = 'F10.5,' IN 'I5,' LINES'/
1 ' FROM'F10.3,' TO 'F10.3,' HZ')
6024 FORMAT(' MINIMUM MEANINGFUL RESOLUTION (HZ)? '$)
6025 FORMAT(' MORE THAN 'I4,' LINES WITH DEGRADED')
6026 FORMAT(' RESOLUTION = 'F8.4,' HZ')
6027 FORMAT(' NUMBER OF LINES = 'I4)
6028 FORMAT(' FOR LISTING OF LINES, SPECIFY 1=DSK, 2=TTY ALSO,',
1 ' ELSE SKIP? '$)
6029 FORMAT(' FREQUENCY INTENSITY'/)
6030 FORMAT(2F15.5)
6031 FORMAT(' LINES EXTEND FROM'F10.3,' TO'F10.3,' HZ')
6032 FORMAT(' WHAT LEFT,RIGHT FREQUENCIES (HZ) FOR X-AXIS? '$)
6033 FORMAT(' WHAT RF POWER (MILLIGAUSS,APPROX 0.01)? '$)
6034 FORMAT(' WHAT T1,T2 (SEC)? '$)
6035 FORMAT(' MAXIMUM INTENSITY (ARBITRARY) ='F8.4/
1 ' WHAT BOTTOM,TOP INTENSITIES FOR Y AXIS? '$)
6036 FORMAT(' WHAT PLOT SPEED (PARTS IN'I4,')? '$)
6037 FORMAT(' DISK FILES CREATED BY THIS PROGRAM HAVE .DAT'/
1 ' EXTENSION AND 057 PROTECTION CODE')
6038 FORMAT(' NAME FOR LISTING FILE (MAX=5 CHARS)? '$)
6039 FORMAT(' FOR TTY, SPECIFY 0=TYPE ALL LINES,',
1 ' ELSE ENTER MIN INTENSITY? '$)
END
SUBROUTINE SPINS (YL9,N8)
C
IMPLICIT INTEGER (P,W)
C
C PREPARES SPIN BASIS FUNCTIONS FOR THE MOLECULE
C
COMMON /CALC/ A(35,35),S(35,35),T(35,35),R(35),X(35),MY(35),
1 P(128),Z(128,0/7),GZ(7),YJ(7,7),YL(7),BS(0/7),W(15),WV(15)
C
C
C W9 TOTAL NUMBER OF HAMILTONIAN MATRICES
C WZ9 TOTAL NUMBER OF SPIN MICROSTATES
C
W9=2.*YL9+1.
DO 110 I=1,W9
110 W(I)=0
C
DO 140 I=1,128
Z(I,0)=0.
DO 120 J=1,N8
Z(I,J)=X(J)
120 Z(I,0)=Z(I,0)+X(J)
K=IFIX(YL9-Z(I,0))+1
W(K)=W(K)+1
L=1
130 X(L)=X(L)-1.
IF(YL(L) .GE. -X(L)) GO TO 140
X(L)=YL(L)
L=L+1
IF(L .GT. N8) GO TO 150
GO TO 130
140 CONTINUE
YL9=-YL9
RETURN
C
150 WZ9=I
WV(1)=1
DO 160 I=2,W9
160 WV(I)=WV(I-1)+W(I)
C
DO 170 I=1,WZ9
L=IFIX(YL9-Z(I,0))+1
P(WV(L))=I
170 WV(L)=WV(L)-1
C
WV(1)=1
DO 180 I=2,W9
180 WV(I)=WV(I-1)+W(I)
RETURN
END
SUBROUTINE HAMIL (ASO,R8,L9,N8,I2,I4,N7,E1,E2,ESCAP)
C
C
C PREPARES HAMILTONIAN MATRICES, DIAGONALIZES THEM,
C COMPUTES TRANSITION ENERGIES AND INTENSITIES
C
COMMON /CALC/ A(35,35),S(35,35),T(35,35),R(35),X(35),MY(35),
1 P(128),Z(128,0/7),GZ(7),YJ(7,7),YL(7),BS(0/7),W(15),WV(15)
C
COMMON /IODEV/ IO2,IO3,IO4,IO5,IO6
C
INTEGER ESCAP,P,W,WV
REAL I2,I4,I7,I8,L9
C
C
C H SPIN VALUE FOR CURRENT MATRIX
C L9 MAX SPIN (YL9 IN MAIN PROGRAM)
C N SIZE OF MATRIX
C I2 INTENSITY CUT-OFF (YI2 IN MAIN PROGRAM)
C I4 TOTAL INTENSITY (YI4 IN MAIN PROGRAM)
C R8 CONVERGENCE CRITERION FOR DIAGONALIZATION
C I7 INTENSITY OF LINE
C E7 ENERGY OF LINE
C N7 COUNTER FOR NUMBER OF LINES
C
I4=0.
N7=0
E1=1.0E10
E2=-E1
H=L9
C
100 IH=L9-H+1.
N=W(IH)
I0=WV(IH)-N
IF(H .EQ. L9) GO TO 200
C
C MAKE ALLOWED TRANSITION MATRIX T FROM OLD EIGENVECTORS S
C (THIS SECTION SKIPPED FOR H=L9)
C
C MATRIX T IS CONSTRUCTED SO THAT ELEMENTS OF THE MATRIX
C PRODUCT T.S WILL GIVE INTENSITIES (CORIO, EQ. 3.41, P. 166)
C
C SELECTION RULES IN THE X APPROXIMATION (CORIO, PP. 286-7)
C (1) SPIN DECREASE OF UNITY FOR ASO
C (2) OTHER NUCLEI MAY NOT CHANGE
C (3) ONLY A SINGLE ASO-TYPE NUCLEUS MAY CHANGE
C
DO 110 I=1,N6
R(I)=A(I,I)
DO 110 J=1,N
T(I,J)=0.
110 CONTINUE
C
DO 170 I=1,N
I1=P(I0+I)
DO 160 J=1,N6
J1=P(I6+J)
L=0
DO 140 K=1,N8
I8=Z(I1,K)-Z(J1,K)
IF(I8 .EQ. 0.) GO TO 140
IF((I8 .NE. -1.) .OR. (BS(K) .NE. ASO)) GO TO 160
K1=K
L=L+1
140 CONTINUE
IF(L .NE. 1) GO TO 160
C=SQRT((YL(K1)+Z(J1,K1))*(YL(K1)-Z(J1,K1)+1.))
DO 150 L=1,N6
150 T(L,I)=T(L,I)+C*S(J,L)
160 CONTINUE
170 CONTINUE
C
C MAKE HAMILTONIAN SUBMATRIX FOR SPIN H
C
C SIGNS OF MATRIX ELEMENTS ARE OPPOSITE TO THOSE OF CORIO,
C BUT COMPENSATION OCCURS WHEN TRANSITION ENERGY IS COMPUTED
C BY DIFFERENCE
C
200 DO 280 I=1,N
I1=P(I0+I)
A(I,I)=0.
C
C ON-DIAGONAL ELEMENTS (CORIO, EQ. 2.15, P. 152)
C
DO 220 J=1,N8
A(I,I)=A(I,I)+YJ(J,J)*Z(I1,J)
IF(J .EQ. N8) GO TO 220
DO 210 K=J+1,N8
210 A(I,I)=A(I,I)+YJ(J,K)*Z(I1,J)*Z(I1,K)
220 CONTINUE
C
C OFF-DIAGONAL ELEMENTS (CORIO, EQ. 2.16, P. 153)
C
C I8=SPIN CHANGE FOR NUCLEUS K
C SPIN-SPIN INTERACTION INCREASES SPIN OF NUCLEUS J1
C AND DECREASES SPIN OF K1 BY ONE UNIT EACH
C NO OTHER NUCLEUS MAY CHANGE
C
IF(I .EQ. N) GO TO 280
DO 270 J=I+1,N
L=0
A(I,J)=0.
A(J,I)=0.
C
DO 260 K=1,N8
I8=Z(I1,K)-Z(P(I0+J),K)
IF(ABS(I8) .GT. 1.) GO TO 270
IF(I8) 230,260,240
230 J1=K
GO TO 250
240 K1=K
250 L=L+1
IF(L .GT. 2) GO TO 270
260 CONTINUE
C
C X APPROXIMATION ALLOWS THIS SKIP
C
IF(BS(J1) .NE. BS(K1)) GO TO 270
XL=YL(J1)
A(I,J)=(XL-Z(I1,J1))*(XL+Z(I1,K1))*(XL+Z(I1,J1)+1.)
1 *(XL-Z(I1,K1)+1.)
A(I,J)=0.5*YJ(J1,K1)*SQRT(A(I,J))
A(J,I)=A(I,J)
270 CONTINUE
280 CONTINUE
C
C CALL MATRIX DIAGONALIZATION (JACOBI METHOD, BUT ANY OTHER
C SUBROUTINE MAY BE SUBSTITUTED)
C
CALL EIGEN2(N,R8)
IF(H .EQ. L9) GO TO 360
C
C COMPUTE INTENSITIES AND ENERGIES, WRITE THEM TO DISK FILE
C (THIS SECTION SKIPPED FOR H=L9)
C
DO 350 I=1,N6
DO 340 J=1,N
I7=0.
DO 310 K=1,N
310 I7=I7+T(I,K)*S(K,J)
IF(ABS(I7) .LT. I2) GO TO 340
N7=N7+1
I7=I7*I7
I4=I4+I7
E7=R(I)-A(J,J)
IF(E7 .GE. E1) GO TO 320
E1=E7
GO TO 330
320 IF(E7 .LE. E2) GO TO 330
E2=E7
330 WRITE(IO3,600) E7,I7
340 CONTINUE
350 CONTINUE
C
C TEST IF ESCAPE KEY STRUCK DURING DIAGONALIZATION
C
360 N6=N
I6=I0
ESCAP=0
IF(H .LE. -L9) RETURN
H=H-1.
CALL TTYTST (ESCAP,KDUM)
IF(ESCAP .EQ. 32) RETURN
GO TO 100
C
600 FORMAT(2E15.8)
END
SUBROUTINE ORDER (N7,N9,R0,KWIT)
C
C
C READS ENERGIES AND INTENSITIES FROM DISK FILE, SORTS THEM,
C DEGRADES RESOLUTION IF NEEDED TO COMPRESS TO NO MORE THAN
C N9 LINES
C
COMMON /SPEC/ E(500),I(500),X(500),Y(0/510)
C
COMMON /IODEV/ IO2,IO3,IO4,IO5,IO6
C
REAL I,I7
INTEGER X
C
C N7 COUNTER FOR NUMBER OF LINES
C N9 STORAGE LIMIT
C E7 ENERGY FOR LINE
C I7 INTENSITY FOR LINE
C
C FNR ROUNDING FUNCTION TO COMPRESS SPECTRUM
C
FNR(XX)=AINT(XX*R0+SIGN(0.5,XX))/R0
C
C READ NEW LINE, INSERT INTO PROPER SEQUENCE
C
KWIT=1
N7=1
READ(IO2,500,END=300) E7,I(1)
E(1)=FNR(E7)
C
100 READ(IO2,500,END=300) E7,I7
E7=FNR(E7)
DO 120 L=1,N7
IF(E7-E(L)) 110,140,120
110 T=E(L)
E(L)=E7
E7=T
T=I(L)
I(L)=I7
I7=T
120 CONTINUE
C
130 IF(N7 .GE. N9) GO TO 200
N7=N7+1
E(N7)=E7
I(N7)=I7
GO TO 100
140 I(L)=I(L)+I7
GO TO 100
C
C DEGRADE RESOLUTION IF OUT OF STORAGE
C
200 KWIT=-1
R0=0.5*R0
E(1)=FNR(E(1))
E7=FNR(E7)
K=1
DO 220 L=2,N7
E(L)=FNR(E(L))
IF(E(L) .NE. E(K)) GO TO 210
I(K)=I(K)+I(L)
GO TO 220
210 K=K+1
E(K)=E(L)
I(K)=I(L)
220 CONTINUE
N7=K
IF(E7 .EQ. E(N7)) GO TO 140
GO TO 130
C
300 REWIND IO2
RETURN
C
500 FORMAT(2E15.8)
END
SUBROUTINE SHAPE (N7,GP,H1,T1,T2,Y9)
C
C
C USES LORENTZ LINESHAPE FUNCTION TO CONVERT LINE SPECTRUM
C FROM E(N7) TO E(1) INTO SIMULATED SPECTRUM
C
COMMON /SPEC/ E(500),I(500),X(500),Y(0/510)
C
COMMON /PLOT1/ KWIT,L,X0,X1,X2,X3,X4,X5,Y0,Y1,Y2,Y3,Y4,Y5
C
INTEGER X,X2,X3,X4,X5,Y2,Y3,Y4,Y5
REAL I,LO
C
C X6 NUMBER OF BITS FOR 1 HZ
C B4 CUT-OFF CRITERION FOR TAILS OF PEAKS
C LO LORENTZ AMPLITUDE FACTOR
C
C INDEX LINES DIGITALLY ALONG X AXIS
C
X6=FLOAT(X5)/(X1-X0+1.0E-5)
DO 110 J=1,N7
XT=X6*(E(J)-X0)
110 X(J)=IFIX(XT+SIGN(0.5,XT))
C
C ZERO PREVIOUS PLOT
C
DO 120 J=0,X5
120 Y(J)=0.
C
C CONSTANTS FOR LORENTZ FUNCTION
C
B1=GP*H1*T2
B2=1.+GP*GP*H1*H1*T1*T2
B3=(T2*T2)/(X6*X6)
LO=B1/B2
J1=0
Y9=0.
C
C ADJUST HEIGHTS AT PEAK CENTERS
C
DO 130 J=1,N7
MT=X(J)
IF((MT .LT. 0) .OR. (MT .GT. X5)) GO TO 130
YY=Y(MT)+LO*I(J)
IF(YY .GT. Y9) Y9=YY
Y(MT)=YY
130 CONTINUE
C
B4=1.0E-5 + 2.*LO/FLOAT(Y5)
140 J1=J1+1
LO=B1/(B2+B3*FLOAT(J1)*FLOAT(J1))
IF(LO .LT. B4) RETURN
C
C ADD OFF-CENTER AMPLITUDES FOR EVERY LINE
C (NOTE THAT J1 ALTERNATES LEFT AND RIGHT SIDES OF PEAK)
C
DO 160 J=1,N7
MT=X(J)
DO 160 K=1,2
K1=MT+J1
IF((K1 .LT. 0) .OR. (K1 .GT. X5)) GO TO 150
YY=Y(K1)+LO*I(J)
IF(YY .GT. Y9) Y9=YY
Y(K1)=YY
150 J1=-J1
160 CONTINUE
GO TO 140
END
SUBROUTINE YPLOT (Y,P44)
C
IMPLICIT INTEGER (A-Z)
C
C DRAWS A LINE FROM PREVIOUS POINT TO THIS ONE AT SPEED P44
C
C CALLING PROGRAM SETS L,X0,X1,X2,X5,Y0,Y1,Y5,
C BUT IT MUST NOT CHANGE OTHER VARIABLES IN BLOCK PLOT1
C
COMMON /PLOT1/ KWIT,L,X0,X1,X2,X3,X4,X5,Y0,Y1,Y2,Y3,Y4,Y5
C
C P BUFFER CONTAINING CHARACTER CODES FOR PLOT COMMANDS
C P0 NUMBER OF SMALL MOVEMENTS TO NEW POINT
C P1 INDEX
C P2 INDEX
C P3 CHARACTER CODE (DECIMAL FOR 7-BIT ASCII)
C P4(4) NUMBER OF BITS PER SMALL MOVEMENT
C P9 NUMBER OF BUFFER CELLS FILLED
C
COMMON /PLOT2/ P(-2/66),P0,P1,P2,P3,P4,P9
C
REAL X0,X1,Y,Y0,Y1
C
C CONVERT Y TO INTEGER REPRESENTATION Y0 .LE. Y .LE. Y1
C
P4=P44
Y2=IFIX(FLOAT(Y5)*(Y-Y0)/(Y1-Y0+1.0E-5))
IF(Y2 .LE. 0) Y2=0
IF(Y2 .GT. Y5) Y2=Y5
C
C COMPUTE DISPLACEMENT, ADJUST PEN VARIABLE (0=DOWN)
C
X3=X2-X3
Y3=Y2-Y3
IF(L .NE. 0) L=64
C
C VECTOR GENERATOR, P4=MAX MOVEMENT PER STEP
C
P0=1+IABS(X3)/P4+IABS(Y3)/P4
DO 100 P1=1,P0
P9=P9+3
X4=X2-(P0-P1)*X3/P0
Y4=Y2-(P0-P1)*Y3/P0
P3=64+X4/8
IF(P3 .GE. 127) P3=63
P(P9-2)=P3
P3=64+Y4/8
IF(P3 .GE. 127) P3=63
P(P9-1)=P3
P3=L+Y4-8*(Y4/8)+8*(X4-8*(X4/8))
IF(P3 .GE. 127) P3=126
P(P9)=P3
IF(P9 .GE. 66) CALL PCTRL(2)
IF(KWIT .EQ. 32) RETURN
100 CONTINUE
C
C SET X3,Y3 = DESTINATION POINT, DROP PEN
C
X3=X2
Y3=Y2
L=0
RETURN
END
SUBROUTINE PCTRL(N)
C
IMPLICIT INTEGER (A-Z)
C
C N=1, ENTER PLOT MODE, TURN OFF TTY ECHO
C N=2, PLOT CONTENTS OF BUFFER, TEST IF ESCAPE KEY STRUCK
C N=3, RETURN TO PRINT MODE, RESTORE TTY ECHO
C
COMMON /PLOT1/ KWIT,L,X0,X1,X2,X3,X4,X5,Y0,Y1,Y2,Y3,Y4,Y5
C
COMMON /PLOT2/ P(-2/66),P0,P1,P2,P3,P4,P9
C
REAL X0,X1,Y0,Y1
C
GO TO (10,20,20) N
C
10 P(-2)=13
P(-1)=10
P(0)=16
P9=0
CALL NECHO
RETURN
C
20 KWIT=0
CALL TTYTST(KWIT,K)
IF(KWIT .EQ. 32) GO TO 24
DO 22 P2=-2,P9
22 CALL CHOUT(P(P2))
24 P9=0
IF((N .EQ. 2) .AND. (KWIT .NE. 32)) RETURN
C
P(0)=0
DO 28 P2=-2,0
28 CALL CHOUT(P(P2))
CALL ECHO
RETURN
END
SUBROUTINE EIGEN2(N,R8)
C
C
C MATRIX DIAGONALIZATION BY METHOD OF JACOBI(1846) USING
C PIVOT SEARCH TECHNIQUE OF F. J. CORBATO(J.ASSOC. COMPUT.
C MACH. 10, 123-5 (1963)) BUT NOTATION OF J. GREENSTADT
C (PP. 84-91 IN "MATHEMATICAL METHODS FOR DIGITAL COMPUTERS"
C ED. BY A. RALSTON & H. S. WILF (WILEY, 1960))
C
FNA(A1,A2)=C1*(A1-A2*T1)
FNB(A1,A2)=C1*(A2+A1*T1)
C
COMMON /CALC/ A(35,35),S(35,35),T(35,35),R(35),X(35),MY(35),
1 OP(128),Z(128,0/7),GZ(7),YJ(7,7),YL(7),BS(0/7),W(15),WV(15)
C
INTEGER P,Q
C
C SET S TO IDENTITY MATRIX
C FIND BIGGEST ELEMENT IN EACH COLUMN OF A
C
S(1,1)=1.0
IF(N.LT.2) GO TO 2760
DO 2640 J=2,N
CALL BIGJ(J)
S(J,J)=1.0
DO 2630 I=1,J-1
S(I,J)=0.0
S(J,I)=0.0
2630 CONTINUE
2640 CONTINUE
C
C FIND PIVOT
C
2660 V2=X(2)
P=MY(2)
Q=2
IF(N .LT. 3) GO TO 2750
DO 2740 J=3,N
IF(V2.GE.X(J)) GO TO 2740
V2=X(J)
P=MY(J)
Q=J
2740 CONTINUE
C
C TEST FOR CONVERGENCE
C
2750 IF(V2.GT.R8) GO TO 2770
2760 RETURN
C
C CALCULATE TRIG FUNCTIONS
C
2770 V1=A(P,P)
V2=A(P,Q)
V3=A(Q,Q)
V4=V1-V3
T1=-2*V2*SIGN(1.,V4)/(ABS(V4)+SQRT(V4*V4+4*V2*V2))
IF(V4.EQ.0.) T1=-1.0
T2=T1*T1
C2=1/(1+T2)
C1=SQRT(C2)
C
C ROTATE MATRIX; REVISE X & MY AS NECESSARY
C
V5=2*T1*V2
A(P,P)=C2*(V1-V5+T2*V3)
A(Q,Q)=C2*(V3+V5+T2*V1)
A(P,Q)=0.0
C
IF(Q.LT.(P+2)) GO TO 3010
DO 3000 J=P+1,Q-1
IF(MY(J).NE.P) GO TO 3000
A1=A(P,J)
A(P,J)=0.0
CALL BIGJ(J)
A(P,J)=A1
3000 CONTINUE
C
3010 IF((Q+1).GT.N) GO TO 3100
DO 3090 J=Q+1,N
IF((MY(J) .NE. P) .AND. (MY(J) .NE. Q)) GO TO 3090
A1=A(P,J)
A2=A(Q,J)
A(P,J)=0.0
A(Q,J)=0.0
CALL BIGJ(J)
A(P,J)=A1
A(Q,J)=A2
3090 CONTINUE
C
3100 IF(P.LT.2) GO TO 3160
DO 3150 I=1,P-1
A1=A(I,P)
A(I,P)=FNA(A1,A(I,Q))
A(I,Q)=FNB(A1,A(I,Q))
3150 CONTINUE
C
3160 IF(Q.LT.(P+2)) GO TO 3240
DO 3230 J=P+1,Q-1
A1=A(P,J)
A(P,J)=FNA(A1,A(J,Q))
A(J,Q)=FNB(A1,A(J,Q))
IF(X(J).GE.ABS(A(P,J))) GO TO 3230
MY(J)=P
X(J)=ABS(A(P,J))
3230 CONTINUE
C
3240 IF((Q+1).GT.N) GO TO 3340
DO 3330 J=Q+1,N
A1=A(P,J)
A(P,J)=FNA(A1,A(Q,J))
A(Q,J)=FNB(A1,A(Q,J))
IF(X(J).GE.ABS(A(P,J))) GO TO 3320
MY(J)=P
X(J)=ABS(A(P,J))
3320 IF(X(J).GE.ABS(A(Q,J))) GO TO 3330
MY(J)=Q
X(J)=ABS(A(Q,J))
3330 CONTINUE
C
3340 CALL BIGJ(P)
CALL BIGJ(Q)
C
C ROTATE EIGENVECTOR MATRIX
C
DO 3440 I=1,N
A1=S(I,P)
S(I,P)=FNA(A1,S(I,Q))
S(I,Q)=FNB(A1,S(I,Q))
3440 CONTINUE
GO TO 2660
END
SUBROUTINE BIGJ(J)
C
C
C FINDS BIGGEST ELEMENT IN COLUMN J (ABOVE DIAGONAL)
C SAVES MAGNITUDE IN X(J), ROW INDEX IN MY(J)
C
COMMON /CALC/ A(35,35),S(35,35),T(35,35),R(35),X(35),MY(35),
1 P(128),Z(128,0/7),GZ(7),YJ(7,7),YL(7),BS(0/7),W(15),WV(15)
C
X(J)=ABS(A(1,J))
MY(J)=1
IF(J .LT. 3) RETURN
DO 3510 I=2,J-1
IF(X(J).GE.ABS(A(I,J))) GO TO 3510
MY(J)=I
X(J)=ABS(A(I,J))
3510 CONTINUE
RETURN
END