**************************************************************
* THIS EQUATION SOLVER IMPLEMENTS THE
***************************************************************
LOGICAL
IV[ALLOCATABLE](:)
INTEGER*2
INDX[ALLOCATABLE](:)
CHARACTER*3
SYMB[ALLOCATABLE](:),CH
REAL
X[ALLOCATABLE](:),F[ALLOCATABLE](:),F1[ALLOCATABLE](:),
&D[ALLOCATABLE](:,:),VEC[ALLOCATABLE](:)
WRITE(*,*)' Give:
(1) No. of Eqs, (2) No. of variables, (3) Input
&unit, (4)
Output unit'
READ(*,*)
N,NV,IN,IOUT
ALLOCATE
(X(NV),F(N),F1(N),D(N,N),SYMB(NV),IV(NV),INDX(N),VEC(N))
IF(IN.EQ.0 .OR.
IN.EQ.5) WRITE(IN,100) NV
100 FORMAT('
Give',I3,' Lines with:',/,3X,'(1) Symbol for var.(3 Ch)',
&/,3X,'(2) K
or U for known, or unknown and',/,3X,'(3) Value')
J=0
DO 10 I=1,NV
READ(IN,110)
SYMB(I),CH,X(I)
110
FORMAT(A3,1X,A1,1X,F10.0)
IF(CH.EQ.'U'
.OR. CH.EQ.'u') THEN
IV(I)=.TRUE.
J=J+1
ELSE IF(CH.EQ.'K'
.OR. CH.EQ.'k') THEN
IV(I)=.FALSE.
ELSE
WRITE(*,*)' Error
in Input for variable',I
STOP
ENDIF
10 CONTINUE
IF(J.EQ.N) GO TO
12
WRITE(*,*)' You
gave',N,' eqs., but',J,' unknowns'
STOP
12 NCT=0
15 CALL
FUNCT(X,F)
J=0
DO 30 JJ=1,NV
IF(IV(JJ))
THEN
XX=X(JJ)
X(JJ)=1.005*X(JJ)
J=J+1
CALL
FUNCT(X,F1)
DO 20
I=1,N
20
D(I,J)=(F1(I)-F(I))/(X(JJ)-XX)
X(JJ)=XX
ENDIF
30 CONTINUE
CALL
SOLVEQ(N,N,D,F,INDX,VEC)
NCT=NCT+1
SUM=0.
J=0
DO 40
I=1,NV
IF(IV(I))
THEN
J=J+1
X(I)=X(I)-F(J)
SUM=SUM+ABS(F(J))
ENDIF
40 CONTINUE
WRITE(*,*)' NCT=',NCT,' SUM=',SUM
WRITE(IOUT,120)(I,SYMB(I),X(I),I=1,NV)
120 FORMAT(I5,1X,A3,'
=',F10.3)
DEALLOCATE
(X,F,F1,D,SYMB,IV,INDX,VEC)
END
***************************************************************
SUBROUTINE
FUNCT(X,F)
REAL F(22),X(41)
DATA
E,G2,P,AP/.005,64.4,8.6714174E-6,5.4541539E-3/
F(1)=X(41)-X(1)-X(3)-X(35) !Unknowns
F(2)=X(1)-X(2)-X(36) ! 1=Q2
15=H4 29=L1
F(3)=X(3)-X(4)-X(37) ! 2=Q3
16=H5 30=L2
F(4)=X(2)+X(4)-X(5)-X(38) ! 3=Q4
17=f1 31=L3
F(5)=X(12)-X(40)+X(6) !
4=Q5 18=f2 32=L4
F(6)=X(13)-X(12)+X(7) ! 5=Q6
19=f3 33=L5
F(7)=X(14)-X(12)+X(9) ! 6=hf1
20=f4 34=L6
F(8)=X(15)-X(13)+X(8) ! 7=hf2
21=f5 35=QJ1
F(9)=X(16)-X(15)+X(11) ! 8=hf3
22=f6 36=QJ2
F(10)=X(7)+X(8)-X(10)-X(9) !
9=hf4 Knowns 37=QJ3
RF1=1./SQRT(X(17)) !
10=hf5 23=D1 38=QJ4
RF2=1./SQRT(X(18)) !
11=hf6 24=D2 39=QJ5
RF3=1./SQRT(X(19)) !
12=H1 25=D3 40=WS1
RF4=1./SQRT(X(20)) ! 13=H2 26=D4
41=Q1
RF5=1./SQRT(X(21)) !
14=H3 27=D5
RF6=1./SQRT(X(22)) ! 28=D6
F(11)=X(6)-X(17)*X(29)*12./X(23)*(X(41)/(AP*X(23)**2))**2/G2
F(12)=X(7)-X(18)*X(30)*12./X(24)*(X(1)/(AP*X(24)**2))**2/G2
F(13)=X(8)-X(19)*X(31)*12./X(25)*(X(2)/(AP*X(25)**2))**2/G2
F(14)=X(9)-X(20)*X(32)*12./X(26)*(X(3)/(AP*X(26)**2))**2/G2
F(15)=X(10)-X(21)*X(33)*12./X(27)*(X(4)/(AP*X(27)**2))**2/G2
F(16)=X(11)-X(22)*X(34)*12./X(28)*(X(5)/(AP*X(28)**2))**2/G2
F(17)=RF1-1.14+2.*ALOG10(E/X(23)+P*X(23)*RF1/X(41))
F(18)=RF2-1.14+2.*ALOG10(E/X(24)+P*X(24)*RF2/X(1))
F(19)=RF3-1.14+2.*ALOG10(E/X(25)+P*X(25)*RF3/X(2))
F(20)=RF4-1.14+2.*ALOG10(E/X(26)+P*X(26)*RF4/X(3))
F(21)=RF5-1.14+2.*ALOG10(E/X(27)+P*X(27)*RF5/X(4))
F(22)=RF6-1.14+2.*ALOG10(E/X(28)+P*X(28)*RF6/X(5))
RETURN
END
**********************************************************
SUBROUTINE SOLVEQ(N,NP,A,B,INDX,VEC)
REAL A(NP,NP),B(NP),VEC(N)
INTEGER*2
INDX(NP),LL
DO 20 I=1,N
AMAX=0.
DO 10 J=1,N
IF(ABS(A(I,J)).GT.AMAX) AMAX=ABS(A(I,J))
10 CONTINUE
IF(AMAX.EQ.0.)
STOP 'Singular matrix.'
20 VEC(I)=1./AMAX
DO 65 J=1,N
IF(J.EQ.1) GO TO
32
DO 30 I=1,J-1
TOL=A(I,J)
DO 25 K=1,I-1
25
TOL=TOL-A(I,K)*A(K,J)
A(I,J)=TOL
30 CONTINUE
32 AMAX=0.
DO 45 I=J,N
TOL=A(I,J)
IF(J.EQ.1) GO TO
40
DO 35 K=1,J-1
35
TOL=TOL-A(I,K)*A(K,J)
A(I,J)=TOL
40
TEMP=VEC(I)*ABS(TOL)
IF(TEMP.LT.AMAX)
GO TO 45
MAX=I
AMAX=TEMP
45 CONTINUE
IF(J.EQ.MAX) GO
TO 55
DO 50 K=1,N
TEMP=A(MAX,K)
A(MAX,K)=A(J,K)
50 A(J,K)=TEMP
VEC(MAX)=VEC(J)
55 INDX(J)=MAX
IF(J.EQ.N) GO TO
65
IF(A(J,J).EQ.0.)
A(J,J)=1.E-10
TEMP=1./A(J,J)
DO 60 I=J+1,N
60
A(I,J)=A(I,J)*TEMP
65 CONTINUE
IF(A(N,N).EQ.0.)
A(N,N)=1.E-10
II=0
DO 75 I=1,N
LL=INDX(I)
TOLL=B(LL)
B(LL)=B(I)
IF (II.NE.0)THEN
DO 70 J=II,I-1
70
TOLL=TOLL-A(I,J)*B(J)
ELSE
IF(TOLL.NE.0.) THEN
II=I
ENDIF
75 B(I)=TOLL
DO 85 I=N,1,-1
TOLL=B(I)
IF(I.EQ.N) GO TO
85
DO 80 J=I+1,N
80
TOLL=TOLL-A(I,J)*B(J)
85 B(I)=TOLL/A(I,I)
RETURN
END