5 * Revision 1.1.1.1 1996/04/01 15:02:21 mclareni
10 SUBROUTINE LINSQ(K,N,M,F,X,Y,W,DA,H,COV,QPRINT,QMIN)
11 DIMENSION X(M,N),F(K),Y(N),W(N),H(K,K),DA(K)
13 DOUBLE PRECISION H,DETERM
14 DOUBLE PRECISION DWI,DYI,DFK1
22 CALL FCN(K,M,F,X(1,I),IFLAG)
28 H(K1,K+1) = H(K1,K+1) + DWI*DFK1*DYI
30 2 H(K1,L) = H(K1,L) + DWI*DFK1*DBLE(F(L))
35 4 CALL D508R2(H,K,K,K+1,1,INDEX,NERROR,DETERM)
37 QMIN = QLINSQ(K,N,M,F,X,Y,W,DA,H,MM)
40 IF(APRINT.NE.0.) GO TO 10
42 5 CALL D508R1(H,K,K,K+1,1,INDEX,NERROR,DETERM)
44 QMIN = QLINSQ(K,N,M,F,X,Y,W,DA,H,MM)
50 IF(APRINT.EQ.0.) RETURN
52 C PRINTS ERRORS IN THE COEFFICIENTS
55 100 FORMAT(45X,'ERRORS IN THE COEFFICIENTS')
56 WRITE(6,101)(DA(I),I=1,K)
59 C PRINTS LOWER DIAGONAL COVARIANCE MATRIX
62 102 FORMAT(///40X,'VARIANCE-COVARIANCE MATRIX'///)
66 9 WRITE(6,103)(F(JJ),JJ=1,I)
67 103 FORMAT(10X,5G20.6//)
72 C PRINTS COEFFICIENTS AND SUM OF SQUARES
75 104 FORMAT(///30X,'SUM OF SQUARES=',G20.6///)
77 105 FORMAT(45X,'COEFFICIENTS'///)
78 WRITE(6,103)(F(I),I=1,K)
81 FUNCTION QLINSQ(K,N,M,F,X,Y,W,DA,H,MM)
82 C COMPUTES THE SUM OF SQUARES
83 DIMENSION F(K),X(M,N),DA(K),H(K,K),Y(N),W(N)
88 CALL FCN(K,M,F,X(1,I),IFLAG)
91 2 HSUM=H(I1,MM)*F(I1)+HSUM
92 3 Q=(HSUM-Y(I))*(HSUM-Y(I))*W(I)+Q
96 SUBROUTINE D508R1 (A,IDIM1,N1,IDIM2,N2,INDEX,NERROR,DETERM)
98 C MATRIX INVERSION WITH ACCOMPANYING SOLUTION OF LINEAR EQUATIONS
99 DOUBLE PRECISION A,DETERM,DETER,PIVOT,SWAP
100 DIMENSION A(IDIM1),INDEX(IDIM1)
106 C THE ROUTINE DOES ITS OWN EVALUATION FOR DOUBLE SUBSCRIPTING OF
109 C MAIN LOOP TO INVERT THE MATRIX
113 C SEARCH FOR NEXT PIVOT IN COLUMN MAIN.
116 DO 2 I1=IPIVC1,IPIVC2
117 IF(ABS(A(I1))-ABS(PIVOT)) 2,2,1
121 C IS PIVOT DIFFERENT FROM ZERO
123 C GET THE PIVOT-LINE INDICATOR AND SWAP LINES IF NECESSARY
127 C COMPLEMENT THE DETERMINANT
129 C POINTER TO LINE PIVOT FOUND
131 C POINTER TO EXACT PIVOT LINE
139 C COMPUTE DETERMINANT
142 C TRANSFORM PIVOT COLUMN
147 C PIVOT ELEMENT TRANSFORMED
149 C NOW CONVERT REST OF THE MATRIX
151 C POINTER TO PIVOT LINE ELEMENTS
153 C GENERAL COLUMN POINTER
159 C PIVOT COLUMN EXCLUDED
165 9 A(I2)=A(I2)+SWAP*A(I3)
169 C NOW REARRANGE THE MATRIX TO GET RIGHT INVERS
173 IF(LPIV-MAIN) 12,14,12
174 12 ICOL=(LPIV-1)*IDIM+1
176 IPIVC=(MAIN-1)*IDIM+1-ICOL
190 SUBROUTINE D508R2 (A,DIM1,N1,DIM2,N2,INDEX,NERROR,DETERM)
191 INTEGER DIM1,DIM,PIVCOL,PIVCO1,TOPX,ENDX,TOPCOL,ENDCOL,EMAT
192 DIMENSION A(DIM1),INDEX(DIM1)
193 DOUBLE PRECISION A,DETERM,DETER,PIVOT,SWAP
200 C MAIN LOOP TO CREATE TRIANGULAR
206 DO 2 I1=PIVCOL,PIVCO1
207 IF(ABS(A(I1))-ABS(PIVOT)) 2,2,1
211 C IS PIVOT DIFFERENT FROM ZERO
213 C IS IT NECESSARY TO BRING PIVOT TO DIAGONAL
214 3 IF(LPIV-PIVCOL) 4,6,4
225 IF (MAIN .EQ. N) GO TO 10
227 C MODIFY PIVOT COLUMN
231 C CONVERT THE SUBMATRIX AND RIGHT SIDES
241 8 A(I5)=A(I5)-A(I4)*A(I3)
246 C COMPUTE THE SOLUTIONS
258 A(ENDX)=A(ENDX)/A(ENDCOL+1)
261 DO 11 I2=TOPCOL,ENDCOL
263 11 A(I3)=A(I3)-A(I2)*SWAP
267 C LEFTADJUST THE SOLUTIONS
283 WRITE(6,100)MAIN,MAIN
285 100 FORMAT(' LINEQ1 ..... THE ',I10,'. COLUMN OF THE MATRIX CONTAINS'
286 1 ,' ONLY ZEROS AT THE',I10,'. ELIMINATIONSTEP')