]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MINICERN/mathlib/gen/d/linsq.F
Bugfix in AliPoints2Memory
[u/mrichter/AliRoot.git] / MINICERN / mathlib / gen / d / linsq.F
CommitLineData
fe4da5cc 1*
2* $Id$
3*
4* $Log$
5* Revision 1.1.1.1 1996/04/01 15:02:21 mclareni
6* Mathlib gen
7*
8*
9#include "gen/pilot.h"
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)
12 DIMENSION INDEX(100)
13 DOUBLE PRECISION H,DETERM
14 DOUBLE PRECISION DWI,DYI,DFK1
15 KPLUS=K+1
16 APRINT=QPRINT
17 DO 11 I=1,K
18 DO 11 J=1,KPLUS
19 11 H(I,J) = 0.D0
20 IFLAG=1
21 DO 2 I=1,N
22 CALL FCN(K,M,F,X(1,I),IFLAG)
23 IFLAG=4
24 DWI = DBLE(W(I))
25 DYI = DBLE(Y(I))
26 DO 2 K1=1,K
27 DFK1 = DBLE(F(K1))
28 H(K1,K+1) = H(K1,K+1) + DWI*DFK1*DYI
29 DO 2 L=1,K1
30 2 H(K1,L) = H(K1,L) + DWI*DFK1*DBLE(F(L))
31 DO 3 J=1,K
32 DO 3 I=1,J
33 3 H(I,J)=H(J,I)
34 IF(COV)5,4,5
35 4 CALL D508R2(H,K,K,K+1,1,INDEX,NERROR,DETERM)
36 MM=1
37 QMIN = QLINSQ(K,N,M,F,X,Y,W,DA,H,MM)
38 DO 7 I=1,K
39 7 F(I)=H(I,1)
40 IF(APRINT.NE.0.) GO TO 10
41 RETURN
42 5 CALL D508R1(H,K,K,K+1,1,INDEX,NERROR,DETERM)
43 MM=K+1
44 QMIN = QLINSQ(K,N,M,F,X,Y,W,DA,H,MM)
45 DO 6 I=1,K
46 6 F(I)=H(I,K+1)
47 DO 8 I=1,K
48 HDA=H(I,I)
49 8 DA(I)=SQRT(HDA)
50 IF(APRINT.EQ.0.) RETURN
51C
52C PRINTS ERRORS IN THE COEFFICIENTS
53C
54 WRITE(6,100)
55 100 FORMAT(45X,'ERRORS IN THE COEFFICIENTS')
56 WRITE(6,101)(DA(I),I=1,K)
57 101 FORMAT(5X,5G16.6)
58C
59C PRINTS LOWER DIAGONAL COVARIANCE MATRIX
60C
61 WRITE(6,102)
62 102 FORMAT(///40X,'VARIANCE-COVARIANCE MATRIX'///)
63 DO 9 I=1,K
64 DO 12 J=1,K
65 12 F(J)=H(I,J)
66 9 WRITE(6,103)(F(JJ),JJ=1,I)
67 103 FORMAT(10X,5G20.6//)
68 DO 13 I=1,K
69 13 F(I)=H(I,K+1)
70 10 CONTINUE
71C
72C PRINTS COEFFICIENTS AND SUM OF SQUARES
73C
74 WRITE(6,104)QMIN
75 104 FORMAT(///30X,'SUM OF SQUARES=',G20.6///)
76 WRITE(6,105)
77 105 FORMAT(45X,'COEFFICIENTS'///)
78 WRITE(6,103)(F(I),I=1,K)
79 RETURN
80 END
81 FUNCTION QLINSQ(K,N,M,F,X,Y,W,DA,H,MM)
82C COMPUTES THE SUM OF SQUARES
83 DIMENSION F(K),X(M,N),DA(K),H(K,K),Y(N),W(N)
84 DOUBLE PRECISION H
85 IFLAG = 4
86 Q=0.
87 DO 3 I=1,N
88 CALL FCN(K,M,F,X(1,I),IFLAG)
89 HSUM=0.
90 DO 2 I1=1,K
91 2 HSUM=H(I1,MM)*F(I1)+HSUM
92 3 Q=(HSUM-Y(I))*(HSUM-Y(I))*W(I)+Q
93 QLINSQ = Q
94 RETURN
95 END
96 SUBROUTINE D508R1 (A,IDIM1,N1,IDIM2,N2,INDEX,NERROR,DETERM)
97C
98C MATRIX INVERSION WITH ACCOMPANYING SOLUTION OF LINEAR EQUATIONS
99 DOUBLE PRECISION A,DETERM,DETER,PIVOT,SWAP
100 DIMENSION A(IDIM1),INDEX(IDIM1)
101 DETER=1.0D0
102 N=N1
103 IEMAT=N+N2
104 IDIM=IDIM1
105 NMIN1=N-1
106C THE ROUTINE DOES ITS OWN EVALUATION FOR DOUBLE SUBSCRIPTING OF
107C ARRAY A.
108 IPIVC=1-IDIM
109C MAIN LOOP TO INVERT THE MATRIX
110 DO 11 MAIN=1,N
111 PIVOT=0.0D0
112 IPIVC=IPIVC+IDIM
113C SEARCH FOR NEXT PIVOT IN COLUMN MAIN.
114 IPIVC1=IPIVC+MAIN-1
115 IPIVC2=IPIVC +NMIN1
116 DO 2 I1=IPIVC1,IPIVC2
117 IF(ABS(A(I1))-ABS(PIVOT)) 2,2,1
118 1 PIVOT=A(I1)
119 LPIV=I1
120 2 CONTINUE
121C IS PIVOT DIFFERENT FROM ZERO
122 IF(PIVOT) 3,15,3
123C GET THE PIVOT-LINE INDICATOR AND SWAP LINES IF NECESSARY
124 3 ICOL=LPIV-IPIVC+1
125 INDEX(MAIN)=ICOL
126 IF(ICOL-MAIN) 6,6,4
127C COMPLEMENT THE DETERMINANT
128 4 DETER=-DETER
129C POINTER TO LINE PIVOT FOUND
130 ICOL=ICOL-IDIM
131C POINTER TO EXACT PIVOT LINE
132 I3=MAIN-IDIM
133 DO 5 I=1,IEMAT
134 ICOL=ICOL+IDIM
135 I3=I3+IDIM
136 SWAP=A(I3)
137 A(I3)=A(ICOL)
138 5 A(ICOL)=SWAP
139C COMPUTE DETERMINANT
140 6 DETER=DETER*PIVOT
141 PIVOT=1./PIVOT
142C TRANSFORM PIVOT COLUMN
143 I3=IPIVC+NMIN1
144 DO 7 I=IPIVC,I3
145 7 A(I)=-A(I)*PIVOT
146 A(IPIVC1)=PIVOT
147C PIVOT ELEMENT TRANSFORMED
148C
149C NOW CONVERT REST OF THE MATRIX
150 I1=MAIN-IDIM
151C POINTER TO PIVOT LINE ELEMENTS
152 ICOL=1-IDIM
153C GENERAL COLUMN POINTER
154 DO 10 I=1,IEMAT
155 ICOL=ICOL+IDIM
156 I1=I1+IDIM
157C POINTERS MOVED
158 IF(I-MAIN) 8,10,8
159C PIVOT COLUMN EXCLUDED
160 8 JCOL=ICOL+NMIN1
161 SWAP=A(I1)
162 I3=IPIVC-1
163 DO 9 I2=ICOL,JCOL
164 I3=I3+1
165 9 A(I2)=A(I2)+SWAP*A(I3)
166 A(I1)=SWAP*PIVOT
167 10 CONTINUE
168 11 CONTINUE
169C NOW REARRANGE THE MATRIX TO GET RIGHT INVERS
170 DO 14 I1=1,N
171 MAIN=N+1-I1
172 LPIV=INDEX(MAIN)
173 IF(LPIV-MAIN) 12,14,12
174 12 ICOL=(LPIV-1)*IDIM+1
175 JCOL=ICOL+NMIN1
176 IPIVC=(MAIN-1)*IDIM+1-ICOL
177 DO 13 I2=ICOL,JCOL
178 I3=I2+IPIVC
179 SWAP=A(I2)
180 A(I2)=A(I3)
181 13 A(I3)=SWAP
182 14 CONTINUE
183 DETERM=DETER
184 NERROR=0
185 RETURN
186 15 NERROR=MAIN
187 DETERM=DETER
188 RETURN
189 END
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
194 DIM=DIM1
195 DETER=1.0D0
196 N=N1
197 EMAT=N+N2
198 NMIN1=N-1
199 PIVCOL=-DIM
200C MAIN LOOP TO CREATE TRIANGULAR
201 DO 10 MAIN=1,N
202 PIVOT=0.0D0
203 PIVCOL=PIVCOL+DIM+1
204 PIVCO1=PIVCOL+N-MAIN
205C SEARCH PIVOT
206 DO 2 I1=PIVCOL,PIVCO1
207 IF(ABS(A(I1))-ABS(PIVOT)) 2,2,1
208 1 PIVOT=A(I1)
209 LPIV=I1
210 2 CONTINUE
211C IS PIVOT DIFFERENT FROM ZERO
212 IF(PIVOT) 3,15,3
213C IS IT NECESSARY TO BRING PIVOT TO DIAGONAL
214 3 IF(LPIV-PIVCOL) 4,6,4
215 4 DETER=-DETER
216 LPIV=LPIV-DIM
217 I1=PIVCOL-DIM
218 DO 5 I2=MAIN,EMAT
219 LPIV=LPIV+DIM
220 I1=I1+DIM
221 SWAP=A(I1)
222 A(I1)=A(LPIV)
223 5 A(LPIV)=SWAP
224 6 DETER=DETER*PIVOT
225 IF (MAIN .EQ. N) GO TO 10
226 PIVOT=1./PIVOT
227C MODIFY PIVOT COLUMN
228 I1=PIVCOL+1
229 DO 7 I2=I1,PIVCO1
230 7 A(I2)=A(I2)*PIVOT
231C CONVERT THE SUBMATRIX AND RIGHT SIDES
232 I3=PIVCOL
233 IROW=MAIN+1
234 DO 9 I1=IROW,N
235 I3=I3+1
236 I4=PIVCOL
237 I5=I3
238 DO 8 I2=IROW,EMAT
239 I4=I4+DIM
240 I5=I5+DIM
241 8 A(I5)=A(I5)-A(I4)*A(I3)
242 9 CONTINUE
243 10 CONTINUE
244 DETERM=DETER
245 NERROR=0
246C COMPUTE THE SOLUTIONS
247 NO=N+1
248 TOPX=NMIN1*DIM+1
249 DO 13 I=NO,EMAT
250 TOPX=TOPX+DIM
251 ENDX=TOPX+N
252 TOPCOL=N*DIM+1
253 ENDCOL=TOPCOL+NMIN1
254 DO 12 I1=1,NMIN1
255 ENDX=ENDX-1
256 TOPCOL=TOPCOL-DIM
257 ENDCOL=ENDCOL-DIM-1
258 A(ENDX)=A(ENDX)/A(ENDCOL+1)
259 SWAP=A(ENDX)
260 I3=TOPX-1
261 DO 11 I2=TOPCOL,ENDCOL
262 I3=I3+1
263 11 A(I3)=A(I3)-A(I2)*SWAP
264 12 CONTINUE
265 A(TOPX)=A(TOPX)/A(1)
266 13 CONTINUE
267C LEFTADJUST THE SOLUTIONS
268 I=-DIM
269 TOPX=NMIN1*DIM+1
270 ENDX=TOPX+NMIN1
271 DO 14 I1=NO,EMAT
272 TOPX=TOPX+DIM
273 ENDX=ENDX+DIM
274 I=I+DIM
275 I3=I
276 DO 14 I2=TOPX,ENDX
277 I3=I3+1
278 14 A(I3)=A(I2)
279 RETURN
280C ERROR EXIT
281 15 NERROR=-1
282 DETERM=DETER
283 WRITE(6,100)MAIN,MAIN
284 RETURN
285 100 FORMAT(' LINEQ1 ..... THE ',I10,'. COLUMN OF THE MATRIX CONTAINS'
286 1 ,' ONLY ZEROS AT THE',I10,'. ELIMINATIONSTEP')
287 END