dsoseq.f 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501
  1. *DECK DSOSEQ
  2. SUBROUTINE DSOSEQ (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 DSOSEQ
  6. C***SUBSIDIARY
  7. C***PURPOSE Subsidiary to DSOS
  8. C***LIBRARY SLATEC
  9. C***TYPE DOUBLE PRECISION (SOSEQS-S, DSOSEQ-D)
  10. C***AUTHOR (UNKNOWN)
  11. C***DESCRIPTION
  12. C
  13. C DSOSEQ solves a system of N simultaneous nonlinear equations.
  14. C See the comments in the interfacing routine DSOS for a more
  15. C detailed description of some of the items in the calling list.
  16. C
  17. C **********************************************************************
  18. C -Input-
  19. C
  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 DSOS.
  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 D1MACH(1).
  74. C
  75. C *** URO, the computer unit roundoff value, is defined by D1MACH(3) for
  76. C *** machines that round or D1MACH(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 DSOS
  84. C***ROUTINES CALLED D1MACH, DSOSSL, I1MACH
  85. C***REVISION HISTORY (YYMMDD)
  86. C 801001 DATE WRITTEN
  87. C 890531 Changed all specific intrinsics to generic. (WRB)
  88. C 891214 Prologue converted to Version 4.0 format. (BAB)
  89. C 900328 Added TYPE section. (WRB)
  90. C***END PROLOGUE DSOSEQ
  91. C
  92. C
  93. INTEGER I1MACH
  94. DOUBLE PRECISION D1MACH
  95. INTEGER IC, ICR, IFLAG, IPRINT, IS(*), ISJ, ISV, IT, ITEM, ITRY,
  96. 1 J, JK, JS, K, KD, KJ, KK, KM1, KN, KSV, L, LOUN, LS, M, MIT,
  97. 2 MM, MXIT, N, NC, NCJS, NP1, NSRI, NSRRC
  98. DOUBLE PRECISION ATOLX, B(*), C(*), CSV, F, FAC(*), FACT, FDIF,
  99. 1 FMAX, FMIN, FMXS, FN1, FN2, FNC, FP, H, HX, P(*), PMAX, RE,
  100. 2 RTOLX, S(*), SRURO, TEMP(*), TEST, TOLF, URO, X(*), XNORM,
  101. 3 Y(*), YJ, YN1, YN2, YN3, YNORM, YNS, ZERO
  102. C
  103. C BEGIN BLOCK PERMITTING ...EXITS TO 430
  104. C BEGIN BLOCK PERMITTING ...EXITS TO 410
  105. C BEGIN BLOCK PERMITTING ...EXITS TO 390
  106. C***FIRST EXECUTABLE STATEMENT DSOSEQ
  107. URO = D1MACH(4)
  108. LOUN = I1MACH(2)
  109. ZERO = D1MACH(1)
  110. RE = MAX(RTOLX,URO)
  111. SRURO = SQRT(URO)
  112. C
  113. IFLAG = 0
  114. NP1 = N + 1
  115. ICR = 0
  116. IC = 0
  117. ITRY = NCJS
  118. YN1 = 0.0D0
  119. YN2 = 0.0D0
  120. YN3 = 0.0D0
  121. YNS = 0.0D0
  122. MIT = 0
  123. FN1 = 0.0D0
  124. FN2 = 0.0D0
  125. FMXS = 0.0D0
  126. C
  127. C INITIALIZE THE INTERCHANGE (PIVOTING) VECTOR AND
  128. C SAVE THE CURRENT SOLUTION APPROXIMATION FOR FUTURE USE.
  129. C
  130. DO 10 K = 1, N
  131. IS(K) = K
  132. X(K) = S(K)
  133. TEMP(K) = X(K)
  134. 10 CONTINUE
  135. C
  136. C
  137. C *********************************************************
  138. C **** BEGIN PRINCIPAL ITERATION LOOP ****
  139. C *********************************************************
  140. C
  141. DO 380 M = 1, MXIT
  142. C BEGIN BLOCK PERMITTING ...EXITS TO 350
  143. C BEGIN BLOCK PERMITTING ...EXITS TO 240
  144. C
  145. DO 20 K = 1, N
  146. FAC(K) = SRURO
  147. 20 CONTINUE
  148. C
  149. 30 CONTINUE
  150. C BEGIN BLOCK PERMITTING ...EXITS TO 180
  151. KN = 1
  152. FMAX = 0.0D0
  153. C
  154. C
  155. C ******** BEGIN SUBITERATION LOOP DEFINING
  156. C THE LINEARIZATION OF EACH ********
  157. C EQUATION WHICH RESULTS IN THE CONSTRUCTION
  158. C OF AN UPPER ******** TRIANGULAR MATRIX
  159. C APPROXIMATING THE FORWARD ********
  160. C TRIANGULARIZATION OF THE FULL JACOBIAN
  161. C MATRIX
  162. C
  163. DO 170 K = 1, N
  164. C BEGIN BLOCK PERMITTING ...EXITS TO 160
  165. KM1 = K - 1
  166. C
  167. C BACK-SOLVE A TRIANGULAR LINEAR
  168. C SYSTEM OBTAINING IMPROVED SOLUTION
  169. C VALUES FOR K-1 OF THE VARIABLES FROM
  170. C THE FIRST K-1 EQUATIONS. THESE
  171. C VARIABLES ARE THEN ELIMINATED FROM
  172. C THE K-TH EQUATION.
  173. C
  174. IF (KM1 .EQ. 0) GO TO 50
  175. CALL DSOSSL(K,N,KM1,Y,C,B,KN)
  176. DO 40 J = 1, KM1
  177. JS = IS(J)
  178. X(JS) = TEMP(JS) + Y(J)
  179. 40 CONTINUE
  180. 50 CONTINUE
  181. C
  182. C
  183. C EVALUATE THE K-TH EQUATION AND THE
  184. C INTERMEDIATE COMPUTATION FOR THE MAX
  185. C NORM OF THE RESIDUAL VECTOR.
  186. C
  187. F = FNC(X,K)
  188. FMAX = MAX(FMAX,ABS(F))
  189. C
  190. C IF WE WISH TO PERFORM SEVERAL
  191. C ITERATIONS USING A FIXED
  192. C FACTORIZATION OF AN APPROXIMATE
  193. C JACOBIAN,WE NEED ONLY UPDATE THE
  194. C CONSTANT VECTOR.
  195. C
  196. C ...EXIT
  197. IF (ITRY .LT. NCJS) GO TO 160
  198. C
  199. C
  200. IT = 0
  201. C
  202. C COMPUTE PARTIAL DERIVATIVES THAT ARE
  203. C REQUIRED IN THE LINEARIZATION OF THE
  204. C K-TH REDUCED EQUATION
  205. C
  206. DO 90 J = K, N
  207. ITEM = IS(J)
  208. HX = X(ITEM)
  209. H = FAC(ITEM)*HX
  210. IF (ABS(H) .LE. ZERO)
  211. 1 H = FAC(ITEM)
  212. X(ITEM) = HX + H
  213. IF (KM1 .EQ. 0) GO TO 70
  214. Y(J) = H
  215. CALL DSOSSL(K,N,J,Y,C,B,KN)
  216. DO 60 L = 1, KM1
  217. LS = IS(L)
  218. X(LS) = TEMP(LS) + Y(L)
  219. 60 CONTINUE
  220. 70 CONTINUE
  221. FP = FNC(X,K)
  222. X(ITEM) = HX
  223. FDIF = FP - F
  224. IF (ABS(FDIF) .GT. URO*ABS(F))
  225. 1 GO TO 80
  226. FDIF = 0.0D0
  227. IT = IT + 1
  228. 80 CONTINUE
  229. P(J) = FDIF/H
  230. 90 CONTINUE
  231. C
  232. IF (IT .LE. (N - K)) GO TO 110
  233. C
  234. C ALL COMPUTED PARTIAL DERIVATIVES
  235. C OF THE K-TH EQUATION ARE
  236. C EFFECTIVELY ZERO.TRY LARGER
  237. C PERTURBATIONS OF THE INDEPENDENT
  238. C VARIABLES.
  239. C
  240. DO 100 J = K, N
  241. ISJ = IS(J)
  242. FACT = 100.0D0*FAC(ISJ)
  243. C ..............................EXIT
  244. IF (FACT .GT. 1.0D10)
  245. 1 GO TO 390
  246. FAC(ISJ) = FACT
  247. 100 CONTINUE
  248. C ............EXIT
  249. GO TO 180
  250. 110 CONTINUE
  251. C
  252. C ...EXIT
  253. IF (K .EQ. N) GO TO 160
  254. C
  255. C ACHIEVE A PIVOTING EFFECT BY
  256. C CHOOSING THE MAXIMAL DERIVATIVE
  257. C ELEMENT
  258. C
  259. PMAX = 0.0D0
  260. DO 130 J = K, N
  261. TEST = ABS(P(J))
  262. IF (TEST .LE. PMAX) GO TO 120
  263. PMAX = TEST
  264. ISV = J
  265. 120 CONTINUE
  266. 130 CONTINUE
  267. C ........................EXIT
  268. IF (PMAX .EQ. 0.0D0) GO TO 390
  269. C
  270. C SET UP THE COEFFICIENTS FOR THE K-TH
  271. C ROW OF THE TRIANGULAR LINEAR SYSTEM
  272. C AND SAVE THE PARTIAL DERIVATIVE OF
  273. C LARGEST MAGNITUDE
  274. C
  275. PMAX = P(ISV)
  276. KK = KN
  277. DO 140 J = K, N
  278. IF (J .NE. ISV)
  279. 1 C(KK) = -P(J)/PMAX
  280. KK = KK + 1
  281. 140 CONTINUE
  282. P(K) = PMAX
  283. C
  284. C
  285. C ...EXIT
  286. IF (ISV .EQ. K) GO TO 160
  287. C
  288. C INTERCHANGE THE TWO COLUMNS OF C
  289. C DETERMINED BY THE PIVOTAL STRATEGY
  290. C
  291. KSV = IS(K)
  292. IS(K) = IS(ISV)
  293. IS(ISV) = KSV
  294. C
  295. KD = ISV - K
  296. KJ = K
  297. DO 150 J = 1, K
  298. CSV = C(KJ)
  299. JK = KJ + KD
  300. C(KJ) = C(JK)
  301. C(JK) = CSV
  302. KJ = KJ + N - J
  303. 150 CONTINUE
  304. 160 CONTINUE
  305. C
  306. KN = KN + NP1 - K
  307. C
  308. C STORE THE COMPONENTS FOR THE CONSTANT
  309. C VECTOR
  310. C
  311. B(K) = -F/P(K)
  312. C
  313. 170 CONTINUE
  314. C ......EXIT
  315. GO TO 190
  316. 180 CONTINUE
  317. GO TO 30
  318. 190 CONTINUE
  319. C
  320. C ********
  321. C ******** END OF LOOP CREATING THE TRIANGULAR
  322. C LINEARIZATION MATRIX
  323. C ********
  324. C
  325. C
  326. C SOLVE THE RESULTING TRIANGULAR SYSTEM FOR A NEW
  327. C SOLUTION APPROXIMATION AND OBTAIN THE SOLUTION
  328. C INCREMENT NORM.
  329. C
  330. KN = KN - 1
  331. Y(N) = B(N)
  332. IF (N .GT. 1) CALL DSOSSL(N,N,N,Y,C,B,KN)
  333. XNORM = 0.0D0
  334. YNORM = 0.0D0
  335. DO 200 J = 1, N
  336. YJ = Y(J)
  337. YNORM = MAX(YNORM,ABS(YJ))
  338. JS = IS(J)
  339. X(JS) = TEMP(JS) + YJ
  340. XNORM = MAX(XNORM,ABS(X(JS)))
  341. 200 CONTINUE
  342. C
  343. C
  344. C PRINT INTERMEDIATE SOLUTION ITERATES AND
  345. C RESIDUAL NORM IF DESIRED
  346. C
  347. IF (IPRINT .NE. (-1)) GO TO 220
  348. MM = M - 1
  349. WRITE (LOUN,210) FMAX,MM,(X(J), J = 1, N)
  350. 210 FORMAT ('0RESIDUAL NORM =', D9.2, / 1X,
  351. 1 'SOLUTION ITERATE (', I3, ')', /
  352. 2 (1X, 5D26.14))
  353. 220 CONTINUE
  354. C
  355. C TEST FOR CONVERGENCE TO A SOLUTION (RELATIVE
  356. C AND/OR ABSOLUTE ERROR COMPARISON ON SUCCESSIVE
  357. C APPROXIMATIONS OF EACH SOLUTION VARIABLE)
  358. C
  359. DO 230 J = 1, N
  360. JS = IS(J)
  361. C ......EXIT
  362. IF (ABS(Y(J)) .GT. RE*ABS(X(JS)) + ATOLX)
  363. 1 GO TO 240
  364. 230 CONTINUE
  365. IF (FMAX .LE. FMXS) IFLAG = 1
  366. 240 CONTINUE
  367. C
  368. C TEST FOR CONVERGENCE TO A SOLUTION BASED ON
  369. C RESIDUALS
  370. C
  371. IF (FMAX .LE. TOLF) IFLAG = IFLAG + 2
  372. C ............EXIT
  373. IF (IFLAG .GT. 0) GO TO 410
  374. C
  375. C
  376. IF (M .GT. 1) GO TO 250
  377. FMIN = FMAX
  378. GO TO 330
  379. 250 CONTINUE
  380. C BEGIN BLOCK PERMITTING ...EXITS TO 320
  381. C
  382. C SAVE SOLUTION HAVING MINIMUM RESIDUAL NORM.
  383. C
  384. IF (FMAX .GE. FMIN) GO TO 270
  385. MIT = M + 1
  386. YN1 = YNORM
  387. YN2 = YNS
  388. FN1 = FMXS
  389. FMIN = FMAX
  390. DO 260 J = 1, N
  391. S(J) = X(J)
  392. 260 CONTINUE
  393. IC = 0
  394. 270 CONTINUE
  395. C
  396. C TEST FOR LIMITING PRECISION CONVERGENCE. VERY
  397. C SLOWLY CONVERGENT PROBLEMS MAY ALSO BE
  398. C DETECTED.
  399. C
  400. IF (YNORM .GT. SRURO*XNORM) GO TO 290
  401. IF (FMAX .LT. 0.2D0*FMXS
  402. 1 .OR. FMAX .GT. 5.0D0*FMXS) GO TO 290
  403. IF (YNORM .LT. 0.2D0*YNS
  404. 1 .OR. YNORM .GT. 5.0D0*YNS) GO TO 290
  405. ICR = ICR + 1
  406. IF (ICR .GE. NSRRC) GO TO 280
  407. IC = 0
  408. C .........EXIT
  409. GO TO 320
  410. 280 CONTINUE
  411. IFLAG = 4
  412. FMAX = FMIN
  413. C ........................EXIT
  414. GO TO 430
  415. 290 CONTINUE
  416. ICR = 0
  417. C
  418. C TEST FOR DIVERGENCE OF THE ITERATIVE SCHEME.
  419. C
  420. IF (YNORM .GT. 2.0D0*YNS
  421. 1 .OR. FMAX .GT. 2.0D0*FMXS) GO TO 300
  422. IC = 0
  423. GO TO 310
  424. 300 CONTINUE
  425. IC = IC + 1
  426. C ......EXIT
  427. IF (IC .LT. NSRI) GO TO 320
  428. IFLAG = 7
  429. C .....................EXIT
  430. GO TO 410
  431. 310 CONTINUE
  432. 320 CONTINUE
  433. 330 CONTINUE
  434. C
  435. C CHECK TO SEE IF NEXT ITERATION CAN USE THE OLD
  436. C JACOBIAN FACTORIZATION
  437. C
  438. ITRY = ITRY - 1
  439. IF (ITRY .EQ. 0) GO TO 340
  440. IF (20.0D0*YNORM .GT. XNORM) GO TO 340
  441. IF (YNORM .GT. 2.0D0*YNS) GO TO 340
  442. C ......EXIT
  443. IF (FMAX .LT. 2.0D0*FMXS) GO TO 350
  444. 340 CONTINUE
  445. ITRY = NCJS
  446. 350 CONTINUE
  447. C
  448. C SAVE THE CURRENT SOLUTION APPROXIMATION AND THE
  449. C RESIDUAL AND SOLUTION INCREMENT NORMS FOR USE IN THE
  450. C NEXT ITERATION.
  451. C
  452. DO 360 J = 1, N
  453. TEMP(J) = X(J)
  454. 360 CONTINUE
  455. IF (M .NE. MIT) GO TO 370
  456. FN2 = FMAX
  457. YN3 = YNORM
  458. 370 CONTINUE
  459. FMXS = FMAX
  460. YNS = YNORM
  461. C
  462. C
  463. 380 CONTINUE
  464. C
  465. C *********************************************************
  466. C **** END OF PRINCIPAL ITERATION LOOP ****
  467. C *********************************************************
  468. C
  469. C
  470. C TOO MANY ITERATIONS, CONVERGENCE WAS NOT ACHIEVED.
  471. M = MXIT
  472. IFLAG = 5
  473. IF (YN1 .GT. 10.0D0*YN2 .OR. YN3 .GT. 10.0D0*YN1)
  474. 1 IFLAG = 6
  475. IF (FN1 .GT. 5.0D0*FMIN .OR. FN2 .GT. 5.0D0*FMIN)
  476. 1 IFLAG = 6
  477. IF (FMAX .GT. 5.0D0*FMIN) IFLAG = 6
  478. C ......EXIT
  479. GO TO 410
  480. 390 CONTINUE
  481. C
  482. C
  483. C A JACOBIAN-RELATED MATRIX IS EFFECTIVELY SINGULAR.
  484. IFLAG = 8
  485. DO 400 J = 1, N
  486. S(J) = TEMP(J)
  487. 400 CONTINUE
  488. C ......EXIT
  489. GO TO 430
  490. 410 CONTINUE
  491. C
  492. C
  493. DO 420 J = 1, N
  494. S(J) = X(J)
  495. 420 CONTINUE
  496. 430 CONTINUE
  497. C
  498. C
  499. MXIT = M
  500. RETURN
  501. END