soseqs.f 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  1. *DECK SOSEQS
  2. SUBROUTINE SOSEQS (FNC, N, S, RTOLX, ATOLX, TOLF, IFLAG, MXIT,
  3. + NCJS, NSRRC, NSRI, IPRINT, FMAX, C, NC, B, P, TEMP, X, Y, FAC,
  4. + IS)
  5. C***BEGIN PROLOGUE SOSEQS
  6. C***SUBSIDIARY
  7. C***PURPOSE Subsidiary to SOS
  8. C***LIBRARY SLATEC
  9. C***TYPE SINGLE PRECISION (SOSEQS-S, DSOSEQ-D)
  10. C***AUTHOR (UNKNOWN)
  11. C***DESCRIPTION
  12. C
  13. C SOSEQS solves a system of N simultaneous nonlinear equations.
  14. C See the comments in the interfacing routine SOS for a more
  15. C detailed description of some of the items in the calling list.
  16. C
  17. C ********************************************************************
  18. C
  19. C -INPUT-
  20. C FNC -Function subprogram which evaluates the equations
  21. C N -Number of equations
  22. C S -Solution vector of initial guesses
  23. C RTOLX-Relative error tolerance on solution components
  24. C ATOLX-Absolute error tolerance on solution components
  25. C TOLF-Residual error tolerance
  26. C MXIT-Maximum number of allowable iterations.
  27. C NCJS-Maximum number of consecutive iterative steps to perform
  28. C using the same triangular Jacobian matrix approximation.
  29. C NSRRC-Number of consecutive iterative steps for which the
  30. C limiting precision accuracy test must be satisfied
  31. C before the routine exits with IFLAG=4.
  32. C NSRI-Number of consecutive iterative steps for which the
  33. C diverging condition test must be satisfied before
  34. C the routine exits with IFLAG=7.
  35. C IPRINT-Internal printing parameter. You must set IPRINT=-1 if you
  36. C want the intermediate solution iterates and a residual norm
  37. C to be printed.
  38. C C -Internal work array, dimensioned at least N*(N+1)/2.
  39. C NC -Dimension of C array. NC .GE. N*(N+1)/2.
  40. C B -Internal work array, dimensioned N.
  41. C P -Internal work array, dimensioned N.
  42. C TEMP-Internal work array, dimensioned N.
  43. C X -Internal work array, dimensioned N.
  44. C Y -Internal work array, dimensioned N.
  45. C FAC -Internal work array, dimensioned N.
  46. C IS -Internal work array, dimensioned N.
  47. C
  48. C -OUTPUT-
  49. C S -Solution vector
  50. C IFLAG-Status indicator flag
  51. C MXIT-The actual number of iterations performed
  52. C FMAX-Residual norm
  53. C C -Upper unit triangular matrix which approximates the
  54. C forward triangularization of the full Jacobian matrix.
  55. C stored in a vector with dimension at least N*(N+1)/2.
  56. C B -Contains the residuals (function values) divided
  57. C by the corresponding components of the P vector
  58. C P -Array used to store the partial derivatives. After
  59. C each iteration P(K) contains the maximal derivative
  60. C occurring in the K-th reduced equation.
  61. C TEMP-Array used to store the previous solution iterate.
  62. C X -Solution vector. Contains the values achieved on the
  63. C last iteration loop upon exit from SOS.
  64. C Y -Array containing the solution increments.
  65. C FAC -Array containing factors used in computing numerical
  66. C derivatives.
  67. C IS -Records the pivotal information (column interchanges)
  68. C
  69. C **********************************************************************
  70. C *** Three machine dependent parameters appear in this subroutine.
  71. C
  72. C *** The smallest positive magnitude, zero, is defined by the function
  73. C *** routine R1MACH(1).
  74. C
  75. C *** URO, The computer unit roundoff value, is defined by R1MACH(3) for
  76. C *** machines that round or R1MACH(4) for machines that truncate.
  77. C *** URO is the smallest positive number such that 1.+URO .GT. 1.
  78. C
  79. C *** The output tape unit number, LOUN, is defined by the function
  80. C *** I1MACH(2).
  81. C **********************************************************************
  82. C
  83. C***SEE ALSO SOS
  84. C***ROUTINES CALLED I1MACH, R1MACH, SOSSOL
  85. C***REVISION HISTORY (YYMMDD)
  86. C 801001 DATE WRITTEN
  87. C 890531 Changed all specific intrinsics to generic. (WRB)
  88. C 890831 Modified array declarations. (WRB)
  89. C 891214 Prologue converted to Version 4.0 format. (BAB)
  90. C 900328 Added TYPE section. (WRB)
  91. C***END PROLOGUE SOSEQS
  92. C
  93. C
  94. DIMENSION S(*), C(NC), B(*), IS(*), P(*), TEMP(*), X(*), Y(*),
  95. 1 FAC(*)
  96. C
  97. C***FIRST EXECUTABLE STATEMENT SOSEQS
  98. URO = R1MACH(4)
  99. LOUN = I1MACH(2)
  100. ZERO = R1MACH(1)
  101. RE = MAX(RTOLX,URO)
  102. SRURO = SQRT(URO)
  103. C
  104. IFLAG = 0
  105. NP1 = N + 1
  106. ICR = 0
  107. IC = 0
  108. ITRY = NCJS
  109. YN1 = 0.
  110. YN2 = 0.
  111. YN3 = 0.
  112. YNS = 0.
  113. MIT = 0
  114. FN1 = 0.
  115. FN2 = 0.
  116. FMXS = 0.
  117. C
  118. C INITIALIZE THE INTERCHANGE (PIVOTING) VECTOR AND
  119. C SAVE THE CURRENT SOLUTION APPROXIMATION FOR FUTURE USE.
  120. C
  121. DO 10 K=1,N
  122. IS(K) = K
  123. X(K) = S(K)
  124. TEMP(K) = X(K)
  125. 10 CONTINUE
  126. C
  127. C
  128. C *****************************************
  129. C **** BEGIN PRINCIPAL ITERATION LOOP ****
  130. C *****************************************
  131. C
  132. DO 330 M=1,MXIT
  133. C
  134. DO 20 K=1,N
  135. FAC(K) = SRURO
  136. 20 CONTINUE
  137. C
  138. 30 KN = 1
  139. FMAX = 0.
  140. C
  141. C
  142. C ******** BEGIN SUBITERATION LOOP DEFINING THE LINEARIZATION OF EACH
  143. C ******** EQUATION WHICH RESULTS IN THE CONSTRUCTION OF AN UPPER
  144. C ******** TRIANGULAR MATRIX APPROXIMATING THE FORWARD
  145. C ******** TRIANGULARIZATION OF THE FULL JACOBIAN MATRIX
  146. C
  147. DO 170 K=1,N
  148. KM1 = K - 1
  149. C
  150. C BACK-SOLVE A TRIANGULAR LINEAR SYSTEM OBTAINING
  151. C IMPROVED SOLUTION VALUES FOR K-1 OF THE VARIABLES
  152. C FROM THE FIRST K-1 EQUATIONS. THESE VARIABLES ARE THEN
  153. C ELIMINATED FROM THE K-TH EQUATION.
  154. C
  155. IF (KM1 .EQ. 0) GO TO 50
  156. CALL SOSSOL(K, N, KM1, Y, C, B, KN)
  157. DO 40 J=1,KM1
  158. JS = IS(J)
  159. X(JS) = TEMP(JS) + Y(J)
  160. 40 CONTINUE
  161. C
  162. C
  163. C EVALUATE THE K-TH EQUATION AND THE INTERMEDIATE COMPUTATION
  164. C FOR THE MAX NORM OF THE RESIDUAL VECTOR.
  165. C
  166. 50 F = FNC(X,K)
  167. FMAX = MAX(FMAX,ABS(F))
  168. C
  169. C IF WE WISH TO PERFORM SEVERAL ITERATIONS USING A FIXED
  170. C FACTORIZATION OF AN APPROXIMATE JACOBIAN,WE NEED ONLY
  171. C UPDATE THE CONSTANT VECTOR.
  172. C
  173. IF (ITRY .LT. NCJS) GO TO 160
  174. C
  175. C
  176. IT = 0
  177. C
  178. C COMPUTE PARTIAL DERIVATIVES THAT ARE REQUIRED IN THE LINEARIZATION
  179. C OF THE K-TH REDUCED EQUATION
  180. C
  181. DO 90 J=K,N
  182. ITEM = IS(J)
  183. HX = X(ITEM)
  184. H = FAC(ITEM)*HX
  185. IF (ABS(H) .LE. ZERO) H = FAC(ITEM)
  186. X(ITEM) = HX + H
  187. IF (KM1 .EQ. 0) GO TO 70
  188. Y(J) = H
  189. CALL SOSSOL(K, N, J, Y, C, B, KN)
  190. DO 60 L=1,KM1
  191. LS = IS(L)
  192. X(LS) = TEMP(LS) + Y(L)
  193. 60 CONTINUE
  194. 70 FP = FNC(X,K)
  195. X(ITEM) = HX
  196. FDIF = FP - F
  197. IF (ABS(FDIF) .GT. URO*ABS(F)) GO TO 80
  198. FDIF = 0.
  199. IT = IT + 1
  200. 80 P(J) = FDIF/H
  201. 90 CONTINUE
  202. C
  203. IF (IT .LE. (N-K)) GO TO 110
  204. C
  205. C ALL COMPUTED PARTIAL DERIVATIVES OF THE K-TH EQUATION
  206. C ARE EFFECTIVELY ZERO.TRY LARGER PERTURBATIONS OF THE
  207. C INDEPENDENT VARIABLES.
  208. C
  209. DO 100 J=K,N
  210. ISJ = IS(J)
  211. FACT = 100.*FAC(ISJ)
  212. IF (FACT .GT. 1.E+10) GO TO 340
  213. FAC(ISJ) = FACT
  214. 100 CONTINUE
  215. GO TO 30
  216. C
  217. 110 IF (K .EQ. N) GO TO 160
  218. C
  219. C ACHIEVE A PIVOTING EFFECT BY CHOOSING THE MAXIMAL DERIVATIVE
  220. C ELEMENT
  221. C
  222. PMAX = 0.
  223. DO 120 J=K,N
  224. TEST = ABS(P(J))
  225. IF (TEST .LE. PMAX) GO TO 120
  226. PMAX = TEST
  227. ISV = J
  228. 120 CONTINUE
  229. IF (PMAX .EQ. 0.) GO TO 340
  230. C
  231. C SET UP THE COEFFICIENTS FOR THE K-TH ROW OF THE TRIANGULAR
  232. C LINEAR SYSTEM AND SAVE THE PARTIAL DERIVATIVE OF
  233. C LARGEST MAGNITUDE
  234. C
  235. PMAX = P(ISV)
  236. KK = KN
  237. DO 140 J=K,N
  238. IF (J .EQ. ISV) GO TO 130
  239. C(KK) = -P(J)/PMAX
  240. 130 KK = KK + 1
  241. 140 CONTINUE
  242. P(K) = PMAX
  243. C
  244. C
  245. IF (ISV .EQ. K) GO TO 160
  246. C
  247. C INTERCHANGE THE TWO COLUMNS OF C DETERMINED BY THE
  248. C PIVOTAL STRATEGY
  249. C
  250. KSV = IS(K)
  251. IS(K) = IS(ISV)
  252. IS(ISV) = KSV
  253. C
  254. KD = ISV - K
  255. KJ = K
  256. DO 150 J=1,K
  257. CSV = C(KJ)
  258. JK = KJ + KD
  259. C(KJ) = C(JK)
  260. C(JK) = CSV
  261. KJ = KJ + N - J
  262. 150 CONTINUE
  263. C
  264. 160 KN = KN + NP1 - K
  265. C
  266. C STORE THE COMPONENTS FOR THE CONSTANT VECTOR
  267. C
  268. B(K) = -F/P(K)
  269. C
  270. 170 CONTINUE
  271. C
  272. C ********
  273. C ******** END OF LOOP CREATING THE TRIANGULAR LINEARIZATION MATRIX
  274. C ********
  275. C
  276. C
  277. C SOLVE THE RESULTING TRIANGULAR SYSTEM FOR A NEW SOLUTION
  278. C APPROXIMATION AND OBTAIN THE SOLUTION INCREMENT NORM.
  279. C
  280. KN = KN - 1
  281. Y(N) = B(N)
  282. IF (N .GT. 1) CALL SOSSOL(N, N, N, Y, C, B, KN)
  283. XNORM = 0.
  284. YNORM = 0.
  285. DO 180 J=1,N
  286. YJ = Y(J)
  287. YNORM = MAX(YNORM,ABS(YJ))
  288. JS = IS(J)
  289. X(JS) = TEMP(JS) + YJ
  290. XNORM = MAX(XNORM,ABS(X(JS)))
  291. 180 CONTINUE
  292. C
  293. C
  294. C PRINT INTERMEDIATE SOLUTION ITERATES AND RESIDUAL NORM IF DESIRED
  295. C
  296. IF (IPRINT.NE.(-1)) GO TO 190
  297. MM = M - 1
  298. WRITE (LOUN,1234) FMAX, MM, (X(J),J=1,N)
  299. 1234 FORMAT ('0RESIDUAL NORM =', E9.2, /1X, 'SOLUTION ITERATE',
  300. 1 ' (', I3, ')', /(1X, 5E26.14))
  301. 190 CONTINUE
  302. C
  303. C TEST FOR CONVERGENCE TO A SOLUTION (RELATIVE AND/OR ABSOLUTE ERROR
  304. C COMPARISON ON SUCCESSIVE APPROXIMATIONS OF EACH SOLUTION VARIABLE)
  305. C
  306. DO 200 J=1,N
  307. JS = IS(J)
  308. IF (ABS(Y(J)) .GT. RE*ABS(X(JS))+ATOLX) GO TO 210
  309. 200 CONTINUE
  310. IF (FMAX .LE. FMXS) IFLAG = 1
  311. C
  312. C TEST FOR CONVERGENCE TO A SOLUTION BASED ON RESIDUALS
  313. C
  314. 210 IF (FMAX .GT. TOLF) GO TO 220
  315. IFLAG = IFLAG + 2
  316. 220 IF (IFLAG .GT. 0) GO TO 360
  317. C
  318. C
  319. IF (M .GT. 1) GO TO 230
  320. FMIN = FMAX
  321. GO TO 280
  322. C
  323. C SAVE SOLUTION HAVING MINIMUM RESIDUAL NORM.
  324. C
  325. 230 IF (FMAX .GE. FMIN) GO TO 250
  326. MIT = M + 1
  327. YN1 = YNORM
  328. YN2 = YNS
  329. FN1 = FMXS
  330. FMIN = FMAX
  331. DO 240 J=1,N
  332. S(J) = X(J)
  333. 240 CONTINUE
  334. IC = 0
  335. C
  336. C TEST FOR LIMITING PRECISION CONVERGENCE. VERY SLOWLY CONVERGENT
  337. C PROBLEMS MAY ALSO BE DETECTED.
  338. C
  339. 250 IF (YNORM .GT. SRURO*XNORM) GO TO 260
  340. IF ((FMAX .LT. 0.2*FMXS) .OR. (FMAX .GT. 5.*FMXS)) GO TO 260
  341. IF ((YNORM .LT. 0.2*YNS) .OR. (YNORM .GT. 5.*YNS)) GO TO 260
  342. ICR = ICR + 1
  343. IF (ICR .LT. NSRRC) GO TO 270
  344. IFLAG = 4
  345. FMAX = FMIN
  346. GO TO 380
  347. 260 ICR = 0
  348. C
  349. C TEST FOR DIVERGENCE OF THE ITERATIVE SCHEME.
  350. C
  351. IF ((YNORM .LE. 2.*YNS) .AND. (FMAX .LE. 2.*FMXS)) GO TO 270
  352. IC = IC + 1
  353. IF (IC .LT. NSRI) GO TO 280
  354. IFLAG = 7
  355. GO TO 360
  356. 270 IC = 0
  357. C
  358. C CHECK TO SEE IF NEXT ITERATION CAN USE THE OLD JACOBIAN
  359. C FACTORIZATION
  360. C
  361. 280 ITRY = ITRY - 1
  362. IF (ITRY .EQ. 0) GO TO 290
  363. IF (20.*YNORM .GT. XNORM) GO TO 290
  364. IF (YNORM .GT. 2.*YNS) GO TO 290
  365. IF (FMAX .LT. 2.*FMXS) GO TO 300
  366. 290 ITRY = NCJS
  367. C
  368. C SAVE THE CURRENT SOLUTION APPROXIMATION AND THE RESIDUAL AND
  369. C SOLUTION INCREMENT NORMS FOR USE IN THE NEXT ITERATION.
  370. C
  371. 300 DO 310 J=1,N
  372. TEMP(J) = X(J)
  373. 310 CONTINUE
  374. IF (M.NE.MIT) GO TO 320
  375. FN2 = FMAX
  376. YN3 = YNORM
  377. 320 FMXS = FMAX
  378. YNS = YNORM
  379. C
  380. C
  381. 330 CONTINUE
  382. C
  383. C *****************************************
  384. C **** END OF PRINCIPAL ITERATION LOOP ****
  385. C *****************************************
  386. C
  387. C
  388. C TOO MANY ITERATIONS, CONVERGENCE WAS NOT ACHIEVED.
  389. M = MXIT
  390. IFLAG = 5
  391. IF (YN1 .GT. 10.0*YN2 .OR. YN3 .GT. 10.0*YN1) IFLAG = 6
  392. IF (FN1 .GT. 5.0*FMIN .OR. FN2 .GT. 5.0*FMIN) IFLAG = 6
  393. IF (FMAX .GT. 5.0*FMIN) IFLAG = 6
  394. GO TO 360
  395. C
  396. C
  397. C A JACOBIAN-RELATED MATRIX IS EFFECTIVELY SINGULAR.
  398. 340 IFLAG = 8
  399. DO 350 J=1,N
  400. S(J) = TEMP(J)
  401. 350 CONTINUE
  402. GO TO 380
  403. C
  404. C
  405. 360 DO 370 J=1,N
  406. S(J) = X(J)
  407. 370 CONTINUE
  408. C
  409. C
  410. 380 MXIT = M
  411. RETURN
  412. END