*IF DEF,OCEAN @DYALLOC.4434 C ******************************COPYRIGHT****************************** GTS2F400.5509 C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.5510 C GTS2F400.5511 C Use, duplication or disclosure of this code is subject to the GTS2F400.5512 C restrictions as set forth in the contract. GTS2F400.5513 C GTS2F400.5514 C Meteorological Office GTS2F400.5515 C London Road GTS2F400.5516 C BRACKNELL GTS2F400.5517 C Berkshire UK GTS2F400.5518 C RG12 2SZ GTS2F400.5519 C GTS2F400.5520 C If no contract has been raised with this copy of the code, the use, GTS2F400.5521 C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.5522 C to do so must first be obtained in writing from the Head of Numerical GTS2F400.5523 C Modelling at the above address. GTS2F400.5524 C ******************************COPYRIGHT****************************** GTS2F400.5525 C GTS2F400.5526 CLL======== SUBROUTINE LSQLS2========================== LSQLS2.2 CLL LSQLS2.3 CLL CONVERTED FOR IN-LINE INCLUSION IN THE LSQLS2.4 CLL UNIFIED MODEL BY : OSCAR ALVES 22/2/93 LSQLS2.5 CLL REVIEWED BY: LSQLS2.6 CLL LSQLS2.7 CLL HAS BEEN IMPORTED AND DOES NOT COMPLY WITH UM STANDARDS LSQLS2.8 CLL LSQLS2.9 CLL*** NO AMENDMENTS HAVE BEEN MADE TO THE BRYAN/COX *** LSQLS2.10 CLL*** VERSION OF THIS ROUTINE *** LSQLS2.11 CLL RH141293.86 CLL Modification for V3.3: RH141293.87 CLL Author : R. Hill Date : 14/12/93 RH141293.88 CLL RH141293.89 CLL Description: Ensure all variables are explicitly declared. RH141293.90 CLL Since this code does not conform to UM standards, RH141293.91 CLL description of variables is limited. RH141293.92 CLL RH141293.93 CLL Modification for V4.2 OSI1F402.4 CLL Author : S. Ineson Date : 15/11/96 OSI1F402.5 CLL LSQLS2.12 CLL Description: (1) Double precision is not supported on the T3E. OSI1F402.6 CLL Enclose all references by -DEF,T3E to suppress OSI1F402.7 CLL warning messages. Single precision (64 bit on T3E) OSI1F402.8 CLL alternative supplied. OSI1F402.9 CLL (2) SAVE IRP1 to suppress warning message from T3E OSI1F402.10 CLL compiler OSI1F402.11 CLL ** Caution ** (S.Inesons observations) OSI1F402.12 CLL Comments in code say that column lengths are OSI1F402.13 CLL computed with D.P. sums, although no variables are explicitly OSI1F402.14 CLL typed as D.P. (presumably achieved by SJ=0.D0 etc ). Tests OSI1F402.15 CLL suggest that on the HP system single precision would OSI1F402.16 CLL be used. OSI1F402.17 CLL If using IN > 1 then some variables may need to be SAVED OSI1F402.18 CLL explicitly (probably compiler dependent) OSI1F402.19 CLL OSI1F402.20 CLL OSI1F402.21 CLL THIS ROUTINE IS A MODIFICATION OF LSQSOL. MARCH,1968. R. HANSON. LSQLS2.13 CLL LINEAR LEAST SQUARES SOLUTION LSQLS2.14 CLL LSQLS2.15 CLL THIS ROUTINE FINDS X SUCH THAT THE EUCLIDEAN LENGTH OF LSQLS2.16 CLL (*) AX-B IS A MINIMUM. LSQLS2.17 CLL LSQLS2.18 CLL HERE A HAS K ROWS AND N COLUMNS, WHILE B IS A COLUMN VECTOR WITH LSQLS2.19 CLL K COMPONENTS. LSQLS2.20 CLL LSQLS2.21 CLL AN ORTHOGONAL MATRIX Q IS FOUND SO THAT QA IS ZERO BELOW LSQLS2.22 CLL THE MAIN DIAGONAL. LSQLS2.23 CLL SUPPOSE THAT RANK (A)=R LSQLS2.24 CLL AN ORTHOGONAL MATRIX S IS FOUND SUCH THAT LSQLS2.25 CLL QAS=T IS AN R X N UPPER TRIANGULAR MATRIX WHOSE LAST N-R COLUMNS LSQLS2.26 CLL ARE ZERO. LSQLS2.27 CLL THE SYSTEM TZ=C (C THE FIRST R COMPONENTS OF QB) IS THEN LSQLS2.28 CLL SOLVED. WITH W=SZ, THE SOLUTION MAY BE EXPRESSED LSQLS2.29 CLL AS X = W + SY, WHERE W IS THE SOLUTION OF (*) OF MINIMUM EUCLID- LSQLS2.30 CLL EAN LENGTH AND Y IS ANY SOLUTION TO (QAS)Y=TY=0. LSQLS2.31 CLL LSQLS2.32 CLL ITERATIVE IMPROVEMENTS ARE CALCULATED USING RESIDUALS AND LSQLS2.33 CLL THE ABOVE PROCEDURES WITH B REPLACED BY B-AX, WHERE X IS AN LSQLS2.34 CLL APPROXIMATE SOLUTION. LSQLS2.35 CLLEND LSQLS2.36 C*L LSQLS2.37SUBROUTINE LSQSL2 (NDIM,A,D,W,B,X,IRANK,IN,ITMAX,IT,IEQ,ENORM,EPS1 2LSQLS2.38 1,NHDIM,H,AA,R,S) LSQLS2.39 C LSQLS2.40 C RH141293.94 IMPLICIT NONE RH141293.95 C RH141293.96 C LSQLS2.41 LOGICAL ERM LSQLS2.42 INTEGER D,W LSQLS2.43 & ,I ! Loop index RH141293.97 & ,IEQ ! Column scaling indicator RH141293.98 & ,II ! IP - 1 RH141293.99 & ,IN ! Least squares option no. RH141293.100 & ,IP ! Pivot row RH141293.101 & ,IPM1 ! Pivot row - 1 RH141293.102 & ,IPP1 ! Pivot row + 1 RH141293.103 & ,IRANK ! RH141293.104 & ,IRM1 ! IRANK - 1 RH141293.105 & ,IRP1 ! IRANK + 1 RH141293.106 & ,ISW ! RH141293.107 & ,IT ! Iteration counter RH141293.108 & ,ITMAX ! Max no of iterations RH141293.109 & ,J ! Loop index RH141293.110 & ,J1,J2,J3,J4,J5,J6,J7,J8,J9 ! RH141293.111 & ,K1 ! RH141293.112 & ,K ! Row index for A RH141293.113 & ,L ! Loop index RH141293.114 & ,LM ! RH141293.115 & ,N ! Column index for A RH141293.116 & ,NS ! RH141293.117 & ,N1,N2,N3,N4,N5,N6,N7,N8 ! RH141293.118 & ,NDIM ! Dimension for arrays RH141293.119 & ,NHDIM ! Dimension for arrays RH141293.120 & ,M ! RH141293.121 C LSQLS2.44 C IN=1 FOR FIRST ENTRY. LSQLS2.45 C A IS DECOMPOSED AND SAVED. AX-B IS SOLVED. LSQLS2.46 C IN = 2 FOR SUBSEQUENT ENTRIES WITH A NEW VECTOR B. LSQLS2.47 C IN=3 TO RESTORE A FROM THE PREVIOUS ENTRY. LSQLS2.48 C IN=4 TO CONTINUE THE ITERATIVE IMPROVEMENT FOR THIS SYSTEM. LSQLS2.49 C IN = 5 TO CALCULATE SOLUTIONS TO AX=0, THEN STORE IN THE ARRAY H. LSQLS2.50 C IN = 6 DO NOT STORE A IN AA. OBTAIN T = QAS, WHERE T IS LSQLS2.51 C MIN(K,N) X MIN(K,N) AND UPPER TRIANGULAR. NOW RETURN.DO NOT OBTAIN LSQLS2.52 C A SOLUTION. LSQLS2.53 C NO SCALING OR COLUMN INTERCHANGES ARE PERFORMED. LSQLS2.54 C IN = 7 SAME AS WITH IN = 6 EXCEPT THAT SOLN. OF MIN. LENGTH LSQLS2.55 C IS PLACED INTO X. NO ITERATIVE REFINEMENT. NOW RETURN. LSQLS2.56 C COLUMN INTERCHANGES ARE PERFORMED. NO SCALING IS PERFORMED. LSQLS2.57 C IN = 8 SET ADDRESSES. NOW RETURN. LSQLS2.58 C LSQLS2.59 C OPTIONS FOR COMPUTING A MATRIX PRODUCT Y*H OR H*Y ARE LSQLS2.60 C AVAILABLE WITH THE USE OF THE ENTRY POINTS MYH AND MHY. LSQLS2.61 C USE OF THESE OPTIONS IN THESE ENTRY POINTS ALLOW A GREAT SAVING IN LSQLS2.62 C STORAGE REQUIRED. LSQLS2.63 C LSQLS2.64 C LSQLS2.65 REAL A(NDIM,NDIM),AA(D,W),H(NHDIM,NHDIM) @DYALLOC.4435 REAL B(NDIM),S(4*NDIM), X(NHDIM),R(4*NDIM) @DYALLOC.4436 & ,A1 ! RH141293.122 & ,A2 ! RH141293.123 & ,AJ ! Jth row of A RH141293.124 & ,AM ! RH141293.125 & ,AZ ! RH141293.126 & ,BP ! 2/length of U**2 RH141293.127 & ,DP ! RH141293.128 & ,EN1 ! RH141293.129 & ,ENM1 ! RH141293.130 & ,ENORM ! RH141293.131 & ,EPS1 ! Rank control variable RH141293.132 & ,EPS2 ! Rank comtrol variable RH141293.133 & ,UP ! RH141293.134 & ,SJ ! RH141293.135 & ,SP ! RH141293.136 & ,TOP ! RH141293.137 & ,TOP1 ! RH141293.138 & ,TOP2 ! RH141293.139 SAVE IRP1 OSI1F402.23 C D = DEPTH OF MATRIX. LSQLS2.67 C W = WIDTH OF MATRIX. LSQLS2.68 K=D LSQLS2.69 N=W LSQLS2.70 ERM=.TRUE. LSQLS2.71 C LSQLS2.72 C IF IT=0 ON ENTRY, THE POSSIBLE ERROR MESSAGE WILL BE SUPPRESSED. LSQLS2.73 C LSQLS2.74 IF (IT.EQ.0) ERM=.FALSE. LSQLS2.75 C LSQLS2.76 C IEQ = 2 IF COLUMN SCALING BY LEAST MAX. COLUMN LENGTH IS LSQLS2.77 C TO BE PERFORMED. LSQLS2.78 C LSQLS2.79 C IEQ = 1 IF SCALING OF ALL COMPONENTS IS TO BE DONE WITH LSQLS2.80 C THE SCALAR MAX(ABS(AIJ))/K*N. LSQLS2.81 C LSQLS2.82 C IEQ = 3 IF COLUMN SCALING AS WITH IN =2 WILL BE RETAINED IN LSQLS2.83 C RANK DEFICIENT CASES. LSQLS2.84 C LSQLS2.85 C THE ARRAY S MUST CONTAIN AT LEAST MAX(K,N) + 4N + 4MIN(K,N) CELLS LSQLS2.86 C THE ARRAY R MUST CONTAIN K+4N S.P. CELLS. LSQLS2.87 C LSQLS2.88 DATA EPS2/1.E-16/ LSQLS2.89 C THE LAST CARD CONTROLS DESIRED RELATIVE ACCURACY. LSQLS2.90 C EPS1 CONTROLS (EPS) RANK. LSQLS2.91 C LSQLS2.92 ISW=1 LSQLS2.93 L=MIN0(K,N) LSQLS2.94 M=MAX0(K,N) LSQLS2.95 J1=M LSQLS2.96 J2=N+J1 LSQLS2.97 J3=J2+N LSQLS2.98 J4=J3+L LSQLS2.99 J5=J4+L LSQLS2.100 J6=J5+L LSQLS2.101 J7=J6+L LSQLS2.102 J8=J7+N LSQLS2.103 J9=J8+N LSQLS2.104 LM=L LSQLS2.105 IF (IRANK.GE.1.AND.IRANK.LE.L) LM=IRANK LSQLS2.106 IF (IN.EQ.6) LM=L LSQLS2.107 IF (IN.EQ.8) RETURN LSQLS2.108 C LSQLS2.109 C RETURN AFTER SETTING ADDRESSES WHEN IN=8. LSQLS2.110 C LSQLS2.111 GO TO (10,360,810,390,830,10,10), IN LSQLS2.112 C LSQLS2.113 C EQUILIBRATE COLUMNS OF A (1)-(2). LSQLS2.114 C LSQLS2.115 C (1) LSQLS2.116 C LSQLS2.117 10 CONTINUE LSQLS2.118 C LSQLS2.119 C SAVE DATA WHEN IN = 1. LSQLS2.120 C LSQLS2.121 IF (IN.GT.5) GO TO 30 LSQLS2.122 DO 20 J=1,N LSQLS2.123 DO 20 I=1,K LSQLS2.124 20 AA(I,J)=A(I,J) LSQLS2.125 30 CONTINUE LSQLS2.126 IF (IEQ.EQ.1) GO TO 60 LSQLS2.127 DO 50 J=1,N LSQLS2.128 AM=0.E0 LSQLS2.129 DO 40 I=1,K LSQLS2.130 40 AM=MAX(AM,ABS(A(I,J))) LSQLS2.131 C LSQLS2.132 C S(M+N+1)-S(M+2N) CONTAINS SCALING FOR OUTPUT VARIABLES. LSQLS2.133 C LSQLS2.134 N2=J2+J LSQLS2.135 IF (IN.EQ.6) AM=1.E0 LSQLS2.136 S(N2)=1.E0/AM LSQLS2.137 DO 50 I=1,K LSQLS2.138 50 A(I,J)=A(I,J)*S(N2) LSQLS2.139 GO TO 100 LSQLS2.140 60 AM=0.E0 LSQLS2.141 DO 70 J=1,N LSQLS2.142 DO 70 I=1,K LSQLS2.143 70 AM=MAX(AM,ABS(A(I,J))) LSQLS2.144 AM=AM/FLOAT(K*N) LSQLS2.145 IF (IN.EQ.6) AM=1.E0 LSQLS2.146 DO 80 J=1,N LSQLS2.147 N2=J2+J LSQLS2.148 80 S(N2)=1.E0/AM LSQLS2.149 DO 90 J=1,N LSQLS2.150 N2=J2+J LSQLS2.151 DO 90 I=1,K LSQLS2.152 90 A(I,J)=A(I,J)*S(N2) LSQLS2.153 C COMPUTE COLUMN LENGTHS WITH D.P. SUMS FINALLY ROUNDED TO S.P. LSQLS2.154 C LSQLS2.155 C (2) LSQLS2.156 C LSQLS2.157 100 DO 110 J=1,N LSQLS2.158 N7=J7+J LSQLS2.159 N2=J2+J LSQLS2.160 110 S(N7)=S(N2) LSQLS2.161 C LSQLS2.162 C S(M+1)-S(M+ N) CONTAINS VARIABLE PERMUTATIONS. LSQLS2.163 C LSQLS2.164 C SET PERMUTATION TO IDENTITY. LSQLS2.165 C LSQLS2.166 DO 120 J=1,N LSQLS2.167 N1=J1+J LSQLS2.168 120 S(N1)=J LSQLS2.169 C LSQLS2.170 C BEGIN ELIMINATION ON THE MATRIX A WITH ORTHOGONAL MATRICES . LSQLS2.171 C LSQLS2.172 C IP=PIVOT ROW LSQLS2.173 C LSQLS2.174 DO 250 IP=1,LM LSQLS2.175 C LSQLS2.176 C LSQLS2.177 *IF -DEF,T3E OSI1F402.25 DP=0.D0 LSQLS2.178 *ELSE OSI1F402.26 DP=0.0 OSI1F402.27 *ENDIF OSI1F402.28 LM=IP LSQLS2.179 DO 140 J=IP,N LSQLS2.180 *IF -DEF,T3E OSI1F402.29 SJ=0.D0 LSQLS2.181 *ELSE OSI1F402.30 SJ=0.0 OSI1F402.31 *ENDIF OSI1F402.32 DO 130 I=IP,K LSQLS2.182 SJ=SJ+A(I,J)**2 LSQLS2.183 130 CONTINUE LSQLS2.184 IF (DP.GT.SJ) GO TO 140 LSQLS2.185 DP=SJ LSQLS2.186 LM=J LSQLS2.187 IF (IN.EQ.6) GO TO 160 LSQLS2.188 140 CONTINUE LSQLS2.189 C LSQLS2.190 C MAXIMIZE (SIGMA)**2 BY COLUMN INTERCHANGE. LSQLS2.191 C LSQLS2.192 C SUPRESS COLUMN INTERCHANGES WHEN IN=6. LSQLS2.193 C LSQLS2.194 C LSQLS2.195 C EXCHANGE COLUMNS IF NECESSARY. LSQLS2.196 C LSQLS2.197 IF (LM.EQ.IP) GO TO 160 LSQLS2.198 DO 150 I=1,K LSQLS2.199 A1=A(I,IP) LSQLS2.200 A(I,IP)=A(I,LM) LSQLS2.201 150 A(I,LM)=A1 LSQLS2.202 C LSQLS2.203 C RECORD PERMUTATION AND EXCHANGE SQUARES OF COLUMN LENGTHS. LSQLS2.204 C LSQLS2.205 N1=J1+LM LSQLS2.206 A1=S(N1) LSQLS2.207 N2=J1+IP LSQLS2.208 S(N1)=S(N2) LSQLS2.209 S(N2)=A1 LSQLS2.210 N7=J7+LM LSQLS2.211 N8=J7+IP LSQLS2.212 A1=S(N7) LSQLS2.213 S(N7)=S(N8) LSQLS2.214 S(N8)=A1 LSQLS2.215 160 IF (IP.EQ.1) GO TO 180 LSQLS2.216 A1=0.E0 LSQLS2.217 IPM1=IP-1 LSQLS2.218 DO 170 I=1,IPM1 LSQLS2.219 A1=A1+A(I,IP)**2 LSQLS2.220 170 CONTINUE LSQLS2.221 IF (A1.GT.0.E0) GO TO 190 LSQLS2.222 *IF -DEF,T3E OSI1F402.33 180 IF (DP.GT.0.D0) GO TO 200 LSQLS2.223 *ELSE OSI1F402.34 180 IF (DP.GT.0.0) GO TO 200 OSI1F402.35 *ENDIF OSI1F402.36 C LSQLS2.224 C TEST FOR RANK DEFICIENCY. LSQLS2.225 C LSQLS2.226 190 IF (SQRT(DP/A1).GT.EPS1) GO TO 200 LSQLS2.227 IF (IN.EQ.6) GO TO 200 LSQLS2.228 II=IP-1 LSQLS2.229 IF (ERM) WRITE (6,1140) IRANK,EPS1,II,II LSQLS2.230 IRANK=IP-1 LSQLS2.231 ERM=.FALSE. LSQLS2.232 GO TO 260 LSQLS2.233 C LSQLS2.234 C (EPS1) RANK IS DEFICIENT. LSQLS2.235 C LSQLS2.236 200 SP=SQRT(DP) LSQLS2.237 C LSQLS2.238 C BEGIN FRONT ELIMINATION ON COLUMN IP. LSQLS2.239 C LSQLS2.240 C SP=SQROOT(SIGMA**2). LSQLS2.241 C LSQLS2.242 *IF -DEF,T3E OSI1F402.37 BP=1.D0/(DP+SP*ABS(A(IP,IP))) LSQLS2.243 *ELSE OSI1F402.38 BP=1.0/(DP+SP*ABS(A(IP,IP))) OSI1F402.39 *ENDIF OSI1F402.40 C LSQLS2.244 C STORE BETA IN S(3N+1)-S(3N+L). LSQLS2.245 C LSQLS2.246 *IF -DEF,T3E OSI1F402.41 IF (IP.EQ.K) BP=0.D0 LSQLS2.247 *ELSE OSI1F402.42 IF (IP.EQ.K) BP=0.0 OSI1F402.43 *ENDIF OSI1F402.44 N3=K+2*N+IP LSQLS2.248 R(N3)=BP LSQLS2.249 UP=SIGN(SP+ABS(A(IP,IP)),A(IP,IP)) LSQLS2.250 IF (IP.GE.K) GO TO 250 LSQLS2.251 IPP1=IP+1 LSQLS2.252 IF (IP.GE.N) GO TO 240 LSQLS2.253 DO 230 J=IPP1,N LSQLS2.254 *IF -DEF,T3E OSI1F402.45 SJ=0.D0 LSQLS2.255 *ELSE OSI1F402.46 SJ=0.0 OSI1F402.47 *ENDIF OSI1F402.48 DO 210 I=IPP1,K LSQLS2.256 210 SJ=SJ+A(I,J)*A(I,IP) LSQLS2.257 SJ=SJ+UP*A(IP,J) LSQLS2.258 SJ=BP*SJ LSQLS2.259 C LSQLS2.260 C SJ=YJ NOW LSQLS2.261 C LSQLS2.262 DO 220 I=IPP1,K LSQLS2.263 220 A(I,J)=A(I,J)-A(I,IP)*SJ LSQLS2.264 230 A(IP,J)=A(IP,J)-SJ*UP LSQLS2.265 240 A(IP,IP)=-SIGN(SP,A(IP,IP)) LSQLS2.266 C LSQLS2.267 N4=K+3*N+IP LSQLS2.268 R(N4)=UP LSQLS2.269 250 CONTINUE LSQLS2.270 IRANK=LM LSQLS2.271 260 IRP1=IRANK+1 LSQLS2.272 IRM1=IRANK-1 LSQLS2.273 IF (IRANK.EQ.0.OR.IRANK.EQ.N) GO TO 360 LSQLS2.274 IF (IEQ.EQ.3) GO TO 290 LSQLS2.275 C LSQLS2.276 C BEGIN BACK PROCESSING FOR RANK DEFICIENCY CASE LSQLS2.277 C IF IRANK IS LESS THAN N. LSQLS2.278 C LSQLS2.279 DO 280 J=1,N LSQLS2.280 N2=J2+J LSQLS2.281 N7=J7+J LSQLS2.282 L=MIN0(J,IRANK) LSQLS2.283 C LSQLS2.284 C UNSCALE COLUMNS FOR RANK DEFICIENT MATRICES WHEN IEQ.NE.3. LSQLS2.285 C LSQLS2.286 DO 270 I=1,L LSQLS2.287 270 A(I,J)=A(I,J)/S(N7) LSQLS2.288 S(N7)=1.E0 LSQLS2.289 280 S(N2)=1.E0 LSQLS2.290 290 IP=IRANK LSQLS2.291 *IF -DEF,T3E OSI1F402.49 300 SJ=0.D0 LSQLS2.292 *ELSE OSI1F402.50 300 SJ=0.0 OSI1F402.51 *ENDIF OSI1F402.52 DO 310 J=IRP1,N LSQLS2.293 SJ=SJ+A(IP,J)**2 LSQLS2.294 310 CONTINUE LSQLS2.295 SJ=SJ+A(IP,IP)**2 LSQLS2.296 AJ=SQRT(SJ) LSQLS2.297 UP=SIGN(AJ+ABS(A(IP,IP)),A(IP,IP)) LSQLS2.298 C LSQLS2.299 C IP TH ELEMENT OF U VECTOR CALCULATED. LSQLS2.300 C LSQLS2.301 *IF -DEF,T3E OSI1F402.53 BP=1.D0/(SJ+ABS(A(IP,IP))*AJ) LSQLS2.302 *ELSE OSI1F402.54 BP=1.0/(SJ+ABS(A(IP,IP))*AJ) OSI1F402.55 *ENDIF OSI1F402.56 C LSQLS2.303 C BP = 2/LENGTH OF U SQUARED. LSQLS2.304 C LSQLS2.305 IPM1=IP-1 LSQLS2.306 IF (IPM1.LE.0) GO TO 340 LSQLS2.307 DO 330 I=1,IPM1 LSQLS2.308 DP=A(I,IP)*UP LSQLS2.309 DO 320 J=IRP1,N LSQLS2.310 DP=DP+A(I,J)*A(IP,J) LSQLS2.311 320 CONTINUE LSQLS2.312 DP=DP/(SJ+ABS(A(IP,IP))*AJ) LSQLS2.313 C LSQLS2.314 C CALC. (AJ,U), WHERE AJ=JTH ROW OF A LSQLS2.315 C LSQLS2.316 A(I,IP)=A(I,IP)-UP*DP LSQLS2.317 C LSQLS2.318 C MODIFY ARRAY A. LSQLS2.319 C LSQLS2.320 DO 330 J=IRP1,N LSQLS2.321 330 A(I,J)=A(I,J)-A(IP,J)*DP LSQLS2.322 340 A(IP,IP)=-SIGN(AJ,A(IP,IP)) LSQLS2.323 C LSQLS2.324 C CALC. MODIFIED PIVOT. LSQLS2.325 C LSQLS2.326 C LSQLS2.327 C SAVE BETA AND IP TH ELEMENT OF U VECTOR IN R ARRAY. LSQLS2.328 C LSQLS2.329 N6=K+IP LSQLS2.330 N7=K+N+IP LSQLS2.331 R(N6)=BP LSQLS2.332 R(N7)=UP LSQLS2.333 C LSQLS2.334 C TEST FOR END OF BACK PROCESSING. LSQLS2.335 C LSQLS2.336 IF (IP-1) 360,360,350 LSQLS2.337 350 IP=IP-1 LSQLS2.338 GO TO 300 LSQLS2.339 360 IF (IN.EQ.6) RETURN LSQLS2.340 DO 370 J=1,K LSQLS2.341 370 R(J)=B(J) LSQLS2.342 IT=0 LSQLS2.343 C LSQLS2.344 C SET INITIAL X VECTOR TO ZERO. LSQLS2.345 C LSQLS2.346 DO 380 J=1,N LSQLS2.347 *IF -DEF,T3E OSI1F402.57 380 X(J)=0.D0 LSQLS2.348 *ELSE OSI1F402.58 380 X(J)=0.0 OSI1F402.59 *ENDIF OSI1F402.60 IF (IRANK.EQ.0) GO TO 690 LSQLS2.349 C LSQLS2.350 C APPLY Q TO RT. HAND SIDE. LSQLS2.351 C LSQLS2.352 390 DO 430 IP=1,IRANK LSQLS2.353 N4=K+3*N+IP LSQLS2.354 SJ=R(N4)*R(IP) LSQLS2.355 IPP1=IP+1 LSQLS2.356 IF (IPP1.GT.K) GO TO 410 LSQLS2.357 DO 400 I=IPP1,K LSQLS2.358 400 SJ=SJ+A(I,IP)*R(I) LSQLS2.359 410 N3=K+2*N+IP LSQLS2.360 BP=R(N3) LSQLS2.361 IF (IPP1.GT.K) GO TO 430 LSQLS2.362 DO 420 I=IPP1,K LSQLS2.363 420 R(I)=R(I)-BP*A(I,IP)*SJ LSQLS2.364 430 R(IP)=R(IP)-BP*R(N4)*SJ LSQLS2.365 DO 440 J=1,IRANK LSQLS2.366 440 S(J)=R(J) LSQLS2.367 ENORM=0.E0 LSQLS2.368 IF (IRP1.GT.K) GO TO 510 LSQLS2.369 DO 450 J=IRP1,K LSQLS2.370 450 ENORM=ENORM+R(J)**2 LSQLS2.371 ENORM=SQRT(ENORM) LSQLS2.372 GO TO 510 LSQLS2.373 460 DO 480 J=1,N LSQLS2.374 *IF -DEF,T3E OSI1F402.61 SJ=0.D0 LSQLS2.375 *ELSE OSI1F402.62 SJ=0.0 OSI1F402.63 *ENDIF OSI1F402.64 N1=J1+J LSQLS2.376 IP=S(N1) LSQLS2.377 DO 470 I=1,K LSQLS2.378 470 SJ=SJ+R(I)*AA(I,IP) LSQLS2.379 C LSQLS2.380 C APPLY AT TO RT. HAND SIDE. LSQLS2.381 C APPLY SCALING. LSQLS2.382 C LSQLS2.383 N7=J2+IP LSQLS2.384 N1=K+N+J LSQLS2.385 480 R(N1)=SJ*S(N7) LSQLS2.386 N1=K+N LSQLS2.387 S(1)=R(N1+1)/A(1,1) LSQLS2.388 IF (N.EQ.1) GO TO 510 LSQLS2.389 DO 500 J=2,N LSQLS2.390 N1=J-1 LSQLS2.391 *IF -DEF,T3E OSI1F402.65 SJ=0.D0 LSQLS2.392 *ELSE OSI1F402.66 SJ=0.0 OSI1F402.67 *ENDIF OSI1F402.68 DO 490 I=1,N1 LSQLS2.393 490 SJ=SJ+A(I,J)*S(I) LSQLS2.394 N2=K+J+N LSQLS2.395 500 S(J)=(R(N2)-SJ)/A(J,J) LSQLS2.396 C LSQLS2.397 C ENTRY TO CONTINUE ITERATING. SOLVES TZ = C = 1ST IRANK LSQLS2.398 C COMPONENTS OF QB . LSQLS2.399 C LSQLS2.400 510 S(IRANK)=S(IRANK)/A(IRANK,IRANK) LSQLS2.401 IF (IRM1.EQ.0) GO TO 540 LSQLS2.402 DO 530 J=1,IRM1 LSQLS2.403 N1=IRANK-J LSQLS2.404 N2=N1+1 LSQLS2.405 SJ=0. LSQLS2.406 DO 520 I=N2,IRANK LSQLS2.407 520 SJ=SJ+A(N1,I)*S(I) LSQLS2.408 530 S(N1)=(S(N1)-SJ)/A(N1,N1) LSQLS2.409 C LSQLS2.410 C Z CALCULATED. COMPUTE X = SZ. LSQLS2.411 C LSQLS2.412 540 IF (IRANK.EQ.N) GO TO 590 LSQLS2.413 DO 550 J=IRP1,N LSQLS2.414 550 S(J)=0.E0 LSQLS2.415 DO 580 I=1,IRANK LSQLS2.416 N7=K+N+I LSQLS2.417 SJ=R(N7)*S(I) LSQLS2.418 DO 560 J=IRP1,N LSQLS2.419 SJ=SJ+A(I,J)*S(J) LSQLS2.420 560 CONTINUE LSQLS2.421 N6=K+I LSQLS2.422 DO 570 J=IRP1,N LSQLS2.423 570 S(J)=S(J)-A(I,J)*R(N6)*SJ LSQLS2.424 580 S(I)=S(I)-R(N6)*R(N7)*SJ LSQLS2.425 C LSQLS2.426 C INCREMENT FOR X OF MINIMAL LENGTH CALCULATED. LSQLS2.427 C LSQLS2.428 590 DO 600 I=1,N LSQLS2.429 600 X(I)=X(I)+S(I) LSQLS2.430 IF (IN.EQ.7) GO TO 750 LSQLS2.431 C LSQLS2.432 C CALC. SUP NORM OF INCREMENT AND RESIDUALS LSQLS2.433 C LSQLS2.434 TOP1=0.E0 LSQLS2.435 DO 610 J=1,N LSQLS2.436 N2=J7+J LSQLS2.437 610 TOP1=MAX(TOP1,ABS(S(J))*S(N2)) LSQLS2.438 DO 630 I=1,K LSQLS2.439 *IF -DEF,T3E OSI1F402.69 SJ=0.D0 LSQLS2.440 *ELSE OSI1F402.70 SJ=0.0 OSI1F402.71 *ENDIF OSI1F402.72 DO 620 J=1,N LSQLS2.441 N1=J1+J LSQLS2.442 IP=S(N1) LSQLS2.443 N7=J2+IP LSQLS2.444 620 SJ=SJ+AA(I,IP)*X(J)*S(N7) LSQLS2.445 630 R(I)=B(I)-SJ LSQLS2.446 IF (ITMAX.LE.0) GO TO 750 LSQLS2.447 C LSQLS2.448 C CALC. SUP NORM OF X. LSQLS2.449 C LSQLS2.450 TOP=0.E0 LSQLS2.451 DO 640 J=1,N LSQLS2.452 N2=J7+J LSQLS2.453 640 TOP=MAX(TOP,ABS(X(J))*S(N2)) LSQLS2.454 C LSQLS2.455 C COMPARE RELATIVE CHANGE IN X WITH TOLERANCE EPS . LSQLS2.456 C LSQLS2.457 IF (TOP1-TOP*EPS2) 690,650,650 LSQLS2.458 650 IF (IT-ITMAX) 660,680,680 LSQLS2.459 660 IT=IT+1 LSQLS2.460 IF (IT.EQ.1) GO TO 670 LSQLS2.461 IF (TOP1.GT..25*TOP2) GO TO 690 LSQLS2.462 670 TOP2=TOP1 LSQLS2.463 GO TO (390,460), ISW LSQLS2.464 680 IT=0 LSQLS2.465 *IF -DEF,T3E OSI1F402.73 690 SJ=0.D0 LSQLS2.466 *ELSE OSI1F402.74 690 SJ=0.0 OSI1F402.75 *ENDIF OSI1F402.76 DO 700 J=1,K LSQLS2.467 SJ=SJ+R(J)**2 LSQLS2.468 700 CONTINUE LSQLS2.469 ENORM=SQRT(SJ) LSQLS2.470 IF (IRANK.EQ.N.AND.ISW.EQ.1) GO TO 710 LSQLS2.471 GO TO 730 LSQLS2.472 710 ENM1=ENORM LSQLS2.473 C LSQLS2.474 C SAVE X ARRAY. LSQLS2.475 C LSQLS2.476 DO 720 J=1,N LSQLS2.477 N1=K+J LSQLS2.478 720 R(N1)=X(J) LSQLS2.479 ISW=2 LSQLS2.480 IT=0 LSQLS2.481 GO TO 460 LSQLS2.482 C LSQLS2.483 C CHOOSE BEST SOLUTION LSQLS2.484 C LSQLS2.485 730 IF (IRANK.LT.N) GO TO 750 LSQLS2.486 IF (ENORM.LE.ENM1) GO TO 750 LSQLS2.487 DO 740 J=1,N LSQLS2.488 N1=K+J LSQLS2.489 740 X(J)=R(N1) LSQLS2.490 ENORM=ENM1 LSQLS2.491 C LSQLS2.492 C NORM OF AX - B LOCATED IN THE CELL ENORM . LSQLS2.493 C LSQLS2.494 C LSQLS2.495 C REARRANGE VARIABLES. LSQLS2.496 C LSQLS2.497 750 DO 760 J=1,N LSQLS2.498 N1=J1+J LSQLS2.499 760 S(J)=S(N1) LSQLS2.500 DO 790 J=1,N LSQLS2.501 DO 770 I=J,N LSQLS2.502 IP=S(I) LSQLS2.503 IF (J.EQ.IP) GO TO 780 LSQLS2.504 770 CONTINUE LSQLS2.505 780 S(I)=S(J) LSQLS2.506 S(J)=J LSQLS2.507 SJ=X(J) LSQLS2.508 X(J)=X(I) LSQLS2.509 790 X(I)=SJ LSQLS2.510 C LSQLS2.511 C SCALE VARIABLES. LSQLS2.512 C LSQLS2.513 DO 800 J=1,N LSQLS2.514 N2=J2+J LSQLS2.515 800 X(J)=X(J)*S(N2) LSQLS2.516 RETURN LSQLS2.517 C LSQLS2.518 C RESTORE A. LSQLS2.519 C LSQLS2.520 810 DO 820 J=1,N LSQLS2.521 N2=J2+J LSQLS2.522 DO 820 I=1,K LSQLS2.523 820 A(I,J)=AA(I,J) LSQLS2.524 RETURN LSQLS2.525 C LSQLS2.526 C GENERATE SOLUTIONS TO THE HOMOGENEOUS EQUATION AX = 0. LSQLS2.527 C LSQLS2.528 830 IF (IRANK.EQ.N) RETURN LSQLS2.529 NS=N-IRANK LSQLS2.530 DO 840 I=1,N LSQLS2.531 DO 840 J=1,NS LSQLS2.532 840 H(I,J)=0.E0 LSQLS2.533 DO 850 J=1,NS LSQLS2.534 N2=IRANK+J LSQLS2.535 850 H(N2,J)=1.E0 LSQLS2.536 IF (IRANK.EQ.0) RETURN LSQLS2.537 DO 870 J=1,IRANK LSQLS2.538 DO 870 I=1,NS LSQLS2.539 N7=K+N+J LSQLS2.540 SJ=R(N7)*H(J,I) LSQLS2.541 DO 860 K1=IRP1,N LSQLS2.542 860 SJ=SJ+H(K1,I)*A(J,K1) LSQLS2.543 N6=K+J LSQLS2.544 BP=R(N6) LSQLS2.545 DP=BP*R(N7)*SJ LSQLS2.546 A1=DP LSQLS2.547 A2=DP-A1 LSQLS2.548 H(J,I)=H(J,I)-(A1+2.*A2) LSQLS2.549 DO 870 K1=IRP1,N LSQLS2.550 DP=BP*A(J,K1)*SJ LSQLS2.551 A1=DP LSQLS2.552 A2=DP-A1 LSQLS2.553 870 H(K1,I)=H(K1,I)-(A1+2.*A2) LSQLS2.554 C LSQLS2.555 C REARRANGE ROWS OF SOLUTION MATRIX. LSQLS2.556 C LSQLS2.557 DO 880 J=1,N LSQLS2.558 N1=J1+J LSQLS2.559 880 S(J)=S(N1) LSQLS2.560 DO 910 J=1,N LSQLS2.561 DO 890 I=J,N LSQLS2.562 IP=S(I) LSQLS2.563 IF (J.EQ.IP) GO TO 900 LSQLS2.564 890 CONTINUE LSQLS2.565 900 S(I)=S(J) LSQLS2.566 S(J)=J LSQLS2.567 DO 910 K1=1,NS LSQLS2.568 A1=H(J,K1) LSQLS2.569 H(J,K1)=H(I,K1) LSQLS2.570 910 H(I,K1)=A1 LSQLS2.571 RETURN LSQLS2.572 C LSQLS2.573 1140 FORMAT (31H0WARNING. IRANK HAS BEEN SET TO,I4,6H BUT(,1PE10.3,9H) LSQLS2.574 1 RANK IS,I4,25H. IRANK IS NOW TAKEN AS ,I4,1H.) LSQLS2.575 END LSQLS2.576 *ENDIF @DYALLOC.4437