123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412 |
- *DECK SOSEQS
- SUBROUTINE SOSEQS (FNC, N, S, RTOLX, ATOLX, TOLF, IFLAG, MXIT,
- + NCJS, NSRRC, NSRI, IPRINT, FMAX, C, NC, B, P, TEMP, X, Y, FAC,
- + IS)
- C***BEGIN PROLOGUE SOSEQS
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to SOS
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (SOSEQS-S, DSOSEQ-D)
- C***AUTHOR (UNKNOWN)
- C***DESCRIPTION
- C
- C SOSEQS solves a system of N simultaneous nonlinear equations.
- C See the comments in the interfacing routine SOS for a more
- C detailed description of some of the items in the calling list.
- C
- C ********************************************************************
- C
- C -INPUT-
- C FNC -Function subprogram which evaluates the equations
- C N -Number of equations
- C S -Solution vector of initial guesses
- C RTOLX-Relative error tolerance on solution components
- C ATOLX-Absolute error tolerance on solution components
- C TOLF-Residual error tolerance
- C MXIT-Maximum number of allowable iterations.
- C NCJS-Maximum number of consecutive iterative steps to perform
- C using the same triangular Jacobian matrix approximation.
- C NSRRC-Number of consecutive iterative steps for which the
- C limiting precision accuracy test must be satisfied
- C before the routine exits with IFLAG=4.
- C NSRI-Number of consecutive iterative steps for which the
- C diverging condition test must be satisfied before
- C the routine exits with IFLAG=7.
- C IPRINT-Internal printing parameter. You must set IPRINT=-1 if you
- C want the intermediate solution iterates and a residual norm
- C to be printed.
- C C -Internal work array, dimensioned at least N*(N+1)/2.
- C NC -Dimension of C array. NC .GE. N*(N+1)/2.
- C B -Internal work array, dimensioned N.
- C P -Internal work array, dimensioned N.
- C TEMP-Internal work array, dimensioned N.
- C X -Internal work array, dimensioned N.
- C Y -Internal work array, dimensioned N.
- C FAC -Internal work array, dimensioned N.
- C IS -Internal work array, dimensioned N.
- C
- C -OUTPUT-
- C S -Solution vector
- C IFLAG-Status indicator flag
- C MXIT-The actual number of iterations performed
- C FMAX-Residual norm
- C C -Upper unit triangular matrix which approximates the
- C forward triangularization of the full Jacobian matrix.
- C stored in a vector with dimension at least N*(N+1)/2.
- C B -Contains the residuals (function values) divided
- C by the corresponding components of the P vector
- C P -Array used to store the partial derivatives. After
- C each iteration P(K) contains the maximal derivative
- C occurring in the K-th reduced equation.
- C TEMP-Array used to store the previous solution iterate.
- C X -Solution vector. Contains the values achieved on the
- C last iteration loop upon exit from SOS.
- C Y -Array containing the solution increments.
- C FAC -Array containing factors used in computing numerical
- C derivatives.
- C IS -Records the pivotal information (column interchanges)
- C
- C **********************************************************************
- C *** Three machine dependent parameters appear in this subroutine.
- C
- C *** The smallest positive magnitude, zero, is defined by the function
- C *** routine R1MACH(1).
- C
- C *** URO, The computer unit roundoff value, is defined by R1MACH(3) for
- C *** machines that round or R1MACH(4) for machines that truncate.
- C *** URO is the smallest positive number such that 1.+URO .GT. 1.
- C
- C *** The output tape unit number, LOUN, is defined by the function
- C *** I1MACH(2).
- C **********************************************************************
- C
- C***SEE ALSO SOS
- C***ROUTINES CALLED I1MACH, R1MACH, SOSSOL
- C***REVISION HISTORY (YYMMDD)
- C 801001 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900328 Added TYPE section. (WRB)
- C***END PROLOGUE SOSEQS
- C
- C
- DIMENSION S(*), C(NC), B(*), IS(*), P(*), TEMP(*), X(*), Y(*),
- 1 FAC(*)
- C
- C***FIRST EXECUTABLE STATEMENT SOSEQS
- URO = R1MACH(4)
- LOUN = I1MACH(2)
- ZERO = R1MACH(1)
- RE = MAX(RTOLX,URO)
- SRURO = SQRT(URO)
- C
- IFLAG = 0
- NP1 = N + 1
- ICR = 0
- IC = 0
- ITRY = NCJS
- YN1 = 0.
- YN2 = 0.
- YN3 = 0.
- YNS = 0.
- MIT = 0
- FN1 = 0.
- FN2 = 0.
- FMXS = 0.
- C
- C INITIALIZE THE INTERCHANGE (PIVOTING) VECTOR AND
- C SAVE THE CURRENT SOLUTION APPROXIMATION FOR FUTURE USE.
- C
- DO 10 K=1,N
- IS(K) = K
- X(K) = S(K)
- TEMP(K) = X(K)
- 10 CONTINUE
- C
- C
- C *****************************************
- C **** BEGIN PRINCIPAL ITERATION LOOP ****
- C *****************************************
- C
- DO 330 M=1,MXIT
- C
- DO 20 K=1,N
- FAC(K) = SRURO
- 20 CONTINUE
- C
- 30 KN = 1
- FMAX = 0.
- C
- C
- C ******** BEGIN SUBITERATION LOOP DEFINING THE LINEARIZATION OF EACH
- C ******** EQUATION WHICH RESULTS IN THE CONSTRUCTION OF AN UPPER
- C ******** TRIANGULAR MATRIX APPROXIMATING THE FORWARD
- C ******** TRIANGULARIZATION OF THE FULL JACOBIAN MATRIX
- C
- DO 170 K=1,N
- KM1 = K - 1
- C
- C BACK-SOLVE A TRIANGULAR LINEAR SYSTEM OBTAINING
- C IMPROVED SOLUTION VALUES FOR K-1 OF THE VARIABLES
- C FROM THE FIRST K-1 EQUATIONS. THESE VARIABLES ARE THEN
- C ELIMINATED FROM THE K-TH EQUATION.
- C
- IF (KM1 .EQ. 0) GO TO 50
- CALL SOSSOL(K, N, KM1, Y, C, B, KN)
- DO 40 J=1,KM1
- JS = IS(J)
- X(JS) = TEMP(JS) + Y(J)
- 40 CONTINUE
- C
- C
- C EVALUATE THE K-TH EQUATION AND THE INTERMEDIATE COMPUTATION
- C FOR THE MAX NORM OF THE RESIDUAL VECTOR.
- C
- 50 F = FNC(X,K)
- FMAX = MAX(FMAX,ABS(F))
- C
- C IF WE WISH TO PERFORM SEVERAL ITERATIONS USING A FIXED
- C FACTORIZATION OF AN APPROXIMATE JACOBIAN,WE NEED ONLY
- C UPDATE THE CONSTANT VECTOR.
- C
- IF (ITRY .LT. NCJS) GO TO 160
- C
- C
- IT = 0
- C
- C COMPUTE PARTIAL DERIVATIVES THAT ARE REQUIRED IN THE LINEARIZATION
- C OF THE K-TH REDUCED EQUATION
- C
- DO 90 J=K,N
- ITEM = IS(J)
- HX = X(ITEM)
- H = FAC(ITEM)*HX
- IF (ABS(H) .LE. ZERO) H = FAC(ITEM)
- X(ITEM) = HX + H
- IF (KM1 .EQ. 0) GO TO 70
- Y(J) = H
- CALL SOSSOL(K, N, J, Y, C, B, KN)
- DO 60 L=1,KM1
- LS = IS(L)
- X(LS) = TEMP(LS) + Y(L)
- 60 CONTINUE
- 70 FP = FNC(X,K)
- X(ITEM) = HX
- FDIF = FP - F
- IF (ABS(FDIF) .GT. URO*ABS(F)) GO TO 80
- FDIF = 0.
- IT = IT + 1
- 80 P(J) = FDIF/H
- 90 CONTINUE
- C
- IF (IT .LE. (N-K)) GO TO 110
- C
- C ALL COMPUTED PARTIAL DERIVATIVES OF THE K-TH EQUATION
- C ARE EFFECTIVELY ZERO.TRY LARGER PERTURBATIONS OF THE
- C INDEPENDENT VARIABLES.
- C
- DO 100 J=K,N
- ISJ = IS(J)
- FACT = 100.*FAC(ISJ)
- IF (FACT .GT. 1.E+10) GO TO 340
- FAC(ISJ) = FACT
- 100 CONTINUE
- GO TO 30
- C
- 110 IF (K .EQ. N) GO TO 160
- C
- C ACHIEVE A PIVOTING EFFECT BY CHOOSING THE MAXIMAL DERIVATIVE
- C ELEMENT
- C
- PMAX = 0.
- DO 120 J=K,N
- TEST = ABS(P(J))
- IF (TEST .LE. PMAX) GO TO 120
- PMAX = TEST
- ISV = J
- 120 CONTINUE
- IF (PMAX .EQ. 0.) GO TO 340
- C
- C SET UP THE COEFFICIENTS FOR THE K-TH ROW OF THE TRIANGULAR
- C LINEAR SYSTEM AND SAVE THE PARTIAL DERIVATIVE OF
- C LARGEST MAGNITUDE
- C
- PMAX = P(ISV)
- KK = KN
- DO 140 J=K,N
- IF (J .EQ. ISV) GO TO 130
- C(KK) = -P(J)/PMAX
- 130 KK = KK + 1
- 140 CONTINUE
- P(K) = PMAX
- C
- C
- IF (ISV .EQ. K) GO TO 160
- C
- C INTERCHANGE THE TWO COLUMNS OF C DETERMINED BY THE
- C PIVOTAL STRATEGY
- C
- KSV = IS(K)
- IS(K) = IS(ISV)
- IS(ISV) = KSV
- C
- KD = ISV - K
- KJ = K
- DO 150 J=1,K
- CSV = C(KJ)
- JK = KJ + KD
- C(KJ) = C(JK)
- C(JK) = CSV
- KJ = KJ + N - J
- 150 CONTINUE
- C
- 160 KN = KN + NP1 - K
- C
- C STORE THE COMPONENTS FOR THE CONSTANT VECTOR
- C
- B(K) = -F/P(K)
- C
- 170 CONTINUE
- C
- C ********
- C ******** END OF LOOP CREATING THE TRIANGULAR LINEARIZATION MATRIX
- C ********
- C
- C
- C SOLVE THE RESULTING TRIANGULAR SYSTEM FOR A NEW SOLUTION
- C APPROXIMATION AND OBTAIN THE SOLUTION INCREMENT NORM.
- C
- KN = KN - 1
- Y(N) = B(N)
- IF (N .GT. 1) CALL SOSSOL(N, N, N, Y, C, B, KN)
- XNORM = 0.
- YNORM = 0.
- DO 180 J=1,N
- YJ = Y(J)
- YNORM = MAX(YNORM,ABS(YJ))
- JS = IS(J)
- X(JS) = TEMP(JS) + YJ
- XNORM = MAX(XNORM,ABS(X(JS)))
- 180 CONTINUE
- C
- C
- C PRINT INTERMEDIATE SOLUTION ITERATES AND RESIDUAL NORM IF DESIRED
- C
- IF (IPRINT.NE.(-1)) GO TO 190
- MM = M - 1
- WRITE (LOUN,1234) FMAX, MM, (X(J),J=1,N)
- 1234 FORMAT ('0RESIDUAL NORM =', E9.2, /1X, 'SOLUTION ITERATE',
- 1 ' (', I3, ')', /(1X, 5E26.14))
- 190 CONTINUE
- C
- C TEST FOR CONVERGENCE TO A SOLUTION (RELATIVE AND/OR ABSOLUTE ERROR
- C COMPARISON ON SUCCESSIVE APPROXIMATIONS OF EACH SOLUTION VARIABLE)
- C
- DO 200 J=1,N
- JS = IS(J)
- IF (ABS(Y(J)) .GT. RE*ABS(X(JS))+ATOLX) GO TO 210
- 200 CONTINUE
- IF (FMAX .LE. FMXS) IFLAG = 1
- C
- C TEST FOR CONVERGENCE TO A SOLUTION BASED ON RESIDUALS
- C
- 210 IF (FMAX .GT. TOLF) GO TO 220
- IFLAG = IFLAG + 2
- 220 IF (IFLAG .GT. 0) GO TO 360
- C
- C
- IF (M .GT. 1) GO TO 230
- FMIN = FMAX
- GO TO 280
- C
- C SAVE SOLUTION HAVING MINIMUM RESIDUAL NORM.
- C
- 230 IF (FMAX .GE. FMIN) GO TO 250
- MIT = M + 1
- YN1 = YNORM
- YN2 = YNS
- FN1 = FMXS
- FMIN = FMAX
- DO 240 J=1,N
- S(J) = X(J)
- 240 CONTINUE
- IC = 0
- C
- C TEST FOR LIMITING PRECISION CONVERGENCE. VERY SLOWLY CONVERGENT
- C PROBLEMS MAY ALSO BE DETECTED.
- C
- 250 IF (YNORM .GT. SRURO*XNORM) GO TO 260
- IF ((FMAX .LT. 0.2*FMXS) .OR. (FMAX .GT. 5.*FMXS)) GO TO 260
- IF ((YNORM .LT. 0.2*YNS) .OR. (YNORM .GT. 5.*YNS)) GO TO 260
- ICR = ICR + 1
- IF (ICR .LT. NSRRC) GO TO 270
- IFLAG = 4
- FMAX = FMIN
- GO TO 380
- 260 ICR = 0
- C
- C TEST FOR DIVERGENCE OF THE ITERATIVE SCHEME.
- C
- IF ((YNORM .LE. 2.*YNS) .AND. (FMAX .LE. 2.*FMXS)) GO TO 270
- IC = IC + 1
- IF (IC .LT. NSRI) GO TO 280
- IFLAG = 7
- GO TO 360
- 270 IC = 0
- C
- C CHECK TO SEE IF NEXT ITERATION CAN USE THE OLD JACOBIAN
- C FACTORIZATION
- C
- 280 ITRY = ITRY - 1
- IF (ITRY .EQ. 0) GO TO 290
- IF (20.*YNORM .GT. XNORM) GO TO 290
- IF (YNORM .GT. 2.*YNS) GO TO 290
- IF (FMAX .LT. 2.*FMXS) GO TO 300
- 290 ITRY = NCJS
- C
- C SAVE THE CURRENT SOLUTION APPROXIMATION AND THE RESIDUAL AND
- C SOLUTION INCREMENT NORMS FOR USE IN THE NEXT ITERATION.
- C
- 300 DO 310 J=1,N
- TEMP(J) = X(J)
- 310 CONTINUE
- IF (M.NE.MIT) GO TO 320
- FN2 = FMAX
- YN3 = YNORM
- 320 FMXS = FMAX
- YNS = YNORM
- C
- C
- 330 CONTINUE
- C
- C *****************************************
- C **** END OF PRINCIPAL ITERATION LOOP ****
- C *****************************************
- C
- C
- C TOO MANY ITERATIONS, CONVERGENCE WAS NOT ACHIEVED.
- M = MXIT
- IFLAG = 5
- IF (YN1 .GT. 10.0*YN2 .OR. YN3 .GT. 10.0*YN1) IFLAG = 6
- IF (FN1 .GT. 5.0*FMIN .OR. FN2 .GT. 5.0*FMIN) IFLAG = 6
- IF (FMAX .GT. 5.0*FMIN) IFLAG = 6
- GO TO 360
- C
- C
- C A JACOBIAN-RELATED MATRIX IS EFFECTIVELY SINGULAR.
- 340 IFLAG = 8
- DO 350 J=1,N
- S(J) = TEMP(J)
- 350 CONTINUE
- GO TO 380
- C
- C
- 360 DO 370 J=1,N
- S(J) = X(J)
- 370 CONTINUE
- C
- C
- 380 MXIT = M
- RETURN
- END
|