la05ad.f 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516
  1. *DECK LA05AD
  2. SUBROUTINE LA05AD (A, IND, NZ, IA, N, IP, IW, W, G, U)
  3. C***BEGIN PROLOGUE LA05AD
  4. C***SUBSIDIARY
  5. C***PURPOSE Subsidiary to DSPLP
  6. C***LIBRARY SLATEC
  7. C***TYPE DOUBLE PRECISION (LA05AS-S, LA05AD-D)
  8. C***AUTHOR (UNKNOWN)
  9. C***DESCRIPTION
  10. C
  11. C THIS SUBPROGRAM IS A SLIGHT MODIFICATION OF A SUBPROGRAM
  12. C FROM THE C. 1979 AERE HARWELL LIBRARY. THE NAME OF THE
  13. C CORRESPONDING HARWELL CODE CAN BE OBTAINED BY DELETING
  14. C THE FINAL LETTER =D= IN THE NAMES USED HERE.
  15. C REVISIONS MADE BY R J HANSON, SNLA, AUGUST, 1979.
  16. C REVISED SEP. 13, 1979.
  17. C
  18. C ROYALTIES HAVE BEEN PAID TO AERE-UK FOR USE OF THEIR CODES
  19. C IN THE PACKAGE GIVEN HERE. ANY PRIMARY USAGE OF THE HARWELL
  20. C SUBROUTINES REQUIRES A ROYALTY AGREEMENT AND PAYMENT BETWEEN
  21. C THE USER AND AERE-UK. ANY USAGE OF THE SANDIA WRITTEN CODES
  22. C DSPLP( ) (WHICH USES THE HARWELL SUBROUTINES) IS PERMITTED.
  23. C
  24. C IP(I,1),IP(I,2) POINT TO THE START OF ROW/COL I.
  25. C IW(I,1),IW(I,2) HOLD THE NUMBER OF NON-ZEROS IN ROW/COL I.
  26. C DURING THE MAIN BODY OF THIS SUBROUTINE THE VECTORS IW(.,3),IW(.,5),
  27. C IW(.,7) ARE USED TO HOLD DOUBLY LINKED LISTS OF ROWS THAT HAVE
  28. C NOT BEEN PIVOTAL AND HAVE EQUAL NUMBERS OF NON-ZEROS.
  29. C IW(.,4),IW(.,6),IW(.,8) HOLD SIMILAR LISTS FOR THE COLUMNS.
  30. C IW(I,3),IW(I,4) HOLD FIRST ROW/COLUMN TO HAVE I NON-ZEROS
  31. C OR ZERO IF THERE ARE NONE.
  32. C IW(I,5), IW(I,6) HOLD ROW/COL NUMBER OF ROW/COL PRIOR TO ROW/COL I
  33. C IN ITS LIST, OR ZERO IF NONE.
  34. C IW(I,7), IW(I,8) HOLD ROW/COL NUMBER OF ROW/COL AFTER ROW/COL I
  35. C IN ITS LIST, OR ZERO IF NONE.
  36. C FOR ROWS/COLS THAT HAVE BEEN PIVOTAL IW(I,5),IW(I,6) HOLD NEGATION OF
  37. C POSITION OF ROW/COL I IN THE PIVOTAL ORDERING.
  38. C
  39. C***SEE ALSO DSPLP
  40. C***ROUTINES CALLED D1MACH, LA05ED, MC20AD, XERMSG, XSETUN
  41. C***COMMON BLOCKS LA05DD
  42. C***REVISION HISTORY (YYMMDD)
  43. C 811215 DATE WRITTEN
  44. C 890531 Changed all specific intrinsics to generic. (WRB)
  45. C 890605 Added D1MACH to list of DOUBLE PRECISION variables.
  46. C 890605 Corrected references to XERRWV. (WRB)
  47. C (WRB)
  48. C 890831 Modified array declarations. (WRB)
  49. C 891214 Prologue converted to Version 4.0 format. (BAB)
  50. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  51. C 900402 Added TYPE section. (WRB)
  52. C 900510 Convert XERRWV calls to XERMSG calls. (RWC)
  53. C***END PROLOGUE LA05AD
  54. INTEGER IP(N,2)
  55. INTEGER IND(IA,2), IW(N,8)
  56. DOUBLE PRECISION A(*), AMAX, AU, AM, D1MACH, EPS, G, U, SMALL,
  57. * W(*)
  58. LOGICAL FIRST
  59. CHARACTER*8 XERN0, XERN1, XERN2
  60. C
  61. COMMON /LA05DD/ SMALL, LP, LENL, LENU, NCP, LROW, LCOL
  62. C EPS IS THE RELATIVE ACCURACY OF FLOATING-POINT COMPUTATION
  63. SAVE EPS, FIRST
  64. DATA FIRST /.TRUE./
  65. C***FIRST EXECUTABLE STATEMENT LA05AD
  66. IF (FIRST) THEN
  67. EPS = 2.0D0 * D1MACH(4)
  68. ENDIF
  69. FIRST = .FALSE.
  70. C
  71. C SET THE OUTPUT UNIT NUMBER FOR THE ERROR PROCESSOR.
  72. C THE USAGE OF THIS ERROR PROCESSOR IS DOCUMENTED IN THE
  73. C SANDIA LABS. TECH. REPT. SAND78-1189, BY R E JONES.
  74. CALL XSETUN(LP)
  75. IF (U.GT.1.0D0) U = 1.0D0
  76. IF (U.LT.EPS) U = EPS
  77. IF (N.LT.1) GO TO 670
  78. G = 0.
  79. DO 50 I=1,N
  80. W(I) = 0.
  81. DO 40 J=1,5
  82. IW(I,J) = 0
  83. 40 CONTINUE
  84. 50 CONTINUE
  85. C
  86. C FLUSH OUT SMALL ENTRIES, COUNT ELEMENTS IN ROWS AND COLUMNS
  87. L = 1
  88. LENU = NZ
  89. DO 80 IDUMMY=1,NZ
  90. IF (L.GT.LENU) GO TO 90
  91. DO 60 K=L,LENU
  92. IF (ABS(A(K)).LE.SMALL) GO TO 70
  93. I = IND(K,1)
  94. J = IND(K,2)
  95. G = MAX(ABS(A(K)),G)
  96. IF (I.LT.1 .OR. I.GT.N) GO TO 680
  97. IF (J.LT.1 .OR. J.GT.N) GO TO 680
  98. IW(I,1) = IW(I,1) + 1
  99. IW(J,2) = IW(J,2) + 1
  100. 60 CONTINUE
  101. GO TO 90
  102. 70 L = K
  103. A(L) = A(LENU)
  104. IND(L,1) = IND(LENU,1)
  105. IND(L,2) = IND(LENU,2)
  106. LENU = LENU - 1
  107. 80 CONTINUE
  108. C
  109. 90 LENL = 0
  110. LROW = LENU
  111. LCOL = LROW
  112. C MCP IS THE MAXIMUM NUMBER OF COMPRESSES PERMITTED BEFORE AN
  113. C ERROR RETURN RESULTS.
  114. MCP = MAX(N/10,20)
  115. NCP = 0
  116. C CHECK FOR NULL ROW OR COLUMN AND INITIALIZE IP(I,2) TO POINT
  117. C JUST BEYOND WHERE THE LAST COMPONENT OF COLUMN I OF A WILL
  118. C BE STORED.
  119. K = 1
  120. DO 110 IR=1,N
  121. K = K + IW(IR,2)
  122. IP(IR,2) = K
  123. DO 100 L=1,2
  124. IF (IW(IR,L).LE.0) GO TO 700
  125. 100 CONTINUE
  126. 110 CONTINUE
  127. C REORDER BY ROWS
  128. C CHECK FOR DOUBLE ENTRIES WHILE USING THE NEWLY CONSTRUCTED
  129. C ROW FILE TO CONSTRUCT THE COLUMN FILE. NOTE THAT BY PUTTING
  130. C THE ENTRIES IN BACKWARDS AND DECREASING IP(J,2) EACH TIME IT
  131. C IS USED WE AUTOMATICALLY LEAVE IT POINTING TO THE FIRST ELEMENT.
  132. CALL MC20AD(N, LENU, A, IND(1,2), IP, IND(1,1), 0)
  133. KL = LENU
  134. DO 130 II=1,N
  135. IR = N + 1 - II
  136. KP = IP(IR,1)
  137. DO 120 K=KP,KL
  138. J = IND(K,2)
  139. IF (IW(J,5).EQ.IR) GO TO 660
  140. IW(J,5) = IR
  141. KR = IP(J,2) - 1
  142. IP(J,2) = KR
  143. IND(KR,1) = IR
  144. 120 CONTINUE
  145. KL = KP - 1
  146. 130 CONTINUE
  147. C
  148. C SET UP LINKED LISTS OF ROWS AND COLS WITH EQUAL NUMBERS OF NON-ZEROS.
  149. DO 150 L=1,2
  150. DO 140 I=1,N
  151. NZ = IW(I,L)
  152. IN = IW(NZ,L+2)
  153. IW(NZ,L+2) = I
  154. IW(I,L+6) = IN
  155. IW(I,L+4) = 0
  156. IF (IN.NE.0) IW(IN,L+4) = I
  157. 140 CONTINUE
  158. 150 CONTINUE
  159. C
  160. C
  161. C START OF MAIN ELIMINATION LOOP.
  162. DO 590 IPV=1,N
  163. C FIND PIVOT. JCOST IS MARKOWITZ COST OF CHEAPEST PIVOT FOUND SO FAR,
  164. C WHICH IS IN ROW IPP AND COLUMN JP.
  165. JCOST = N*N
  166. C LOOP ON LENGTH OF COLUMN TO BE SEARCHED
  167. DO 240 NZ=1,N
  168. IF (JCOST.LE.(NZ-1)**2) GO TO 250
  169. J = IW(NZ,4)
  170. C SEARCH COLUMNS WITH NZ NON-ZEROS.
  171. DO 190 IDUMMY=1,N
  172. IF (J.LE.0) GO TO 200
  173. KP = IP(J,2)
  174. KL = KP + IW(J,2) - 1
  175. DO 180 K=KP,KL
  176. I = IND(K,1)
  177. KCOST = (NZ-1)*(IW(I,1)-1)
  178. IF (KCOST.GE.JCOST) GO TO 180
  179. IF (NZ.EQ.1) GO TO 170
  180. C FIND LARGEST ELEMENT IN ROW OF POTENTIAL PIVOT.
  181. AMAX = 0.
  182. K1 = IP(I,1)
  183. K2 = IW(I,1) + K1 - 1
  184. DO 160 KK=K1,K2
  185. AMAX = MAX(AMAX,ABS(A(KK)))
  186. IF (IND(KK,2).EQ.J) KJ = KK
  187. 160 CONTINUE
  188. C PERFORM STABILITY TEST.
  189. IF (ABS(A(KJ)).LT.AMAX*U) GO TO 180
  190. 170 JCOST = KCOST
  191. IPP = I
  192. JP = J
  193. IF (JCOST.LE.(NZ-1)**2) GO TO 250
  194. 180 CONTINUE
  195. J = IW(J,8)
  196. 190 CONTINUE
  197. C SEARCH ROWS WITH NZ NON-ZEROS.
  198. 200 I = IW(NZ,3)
  199. DO 230 IDUMMY=1,N
  200. IF (I.LE.0) GO TO 240
  201. AMAX = 0.
  202. KP = IP(I,1)
  203. KL = KP + IW(I,1) - 1
  204. C FIND LARGEST ELEMENT IN THE ROW
  205. DO 210 K=KP,KL
  206. AMAX = MAX(ABS(A(K)),AMAX)
  207. 210 CONTINUE
  208. AU = AMAX*U
  209. DO 220 K=KP,KL
  210. C PERFORM STABILITY TEST.
  211. IF (ABS(A(K)).LT.AU) GO TO 220
  212. J = IND(K,2)
  213. KCOST = (NZ-1)*(IW(J,2)-1)
  214. IF (KCOST.GE.JCOST) GO TO 220
  215. JCOST = KCOST
  216. IPP = I
  217. JP = J
  218. IF (JCOST.LE.(NZ-1)**2) GO TO 250
  219. 220 CONTINUE
  220. I = IW(I,7)
  221. 230 CONTINUE
  222. 240 CONTINUE
  223. C
  224. C PIVOT FOUND.
  225. C REMOVE ROWS AND COLUMNS INVOLVED IN ELIMINATION FROM ORDERING VECTORS.
  226. 250 KP = IP(JP,2)
  227. KL = IW(JP,2) + KP - 1
  228. DO 290 L=1,2
  229. DO 280 K=KP,KL
  230. I = IND(K,L)
  231. IL = IW(I,L+4)
  232. IN = IW(I,L+6)
  233. IF (IL.EQ.0) GO TO 260
  234. IW(IL,L+6) = IN
  235. GO TO 270
  236. 260 NZ = IW(I,L)
  237. IW(NZ,L+2) = IN
  238. 270 IF (IN.GT.0) IW(IN,L+4) = IL
  239. 280 CONTINUE
  240. KP = IP(IPP,1)
  241. KL = KP + IW(IPP,1) - 1
  242. 290 CONTINUE
  243. C STORE PIVOT
  244. IW(IPP,5) = -IPV
  245. IW(JP,6) = -IPV
  246. C ELIMINATE PIVOTAL ROW FROM COLUMN FILE AND FIND PIVOT IN ROW FILE.
  247. DO 320 K=KP,KL
  248. J = IND(K,2)
  249. KPC = IP(J,2)
  250. IW(J,2) = IW(J,2) - 1
  251. KLC = KPC + IW(J,2)
  252. DO 300 KC=KPC,KLC
  253. IF (IPP.EQ.IND(KC,1)) GO TO 310
  254. 300 CONTINUE
  255. 310 IND(KC,1) = IND(KLC,1)
  256. IND(KLC,1) = 0
  257. IF (J.EQ.JP) KR = K
  258. 320 CONTINUE
  259. C BRING PIVOT TO FRONT OF PIVOTAL ROW.
  260. AU = A(KR)
  261. A(KR) = A(KP)
  262. A(KP) = AU
  263. IND(KR,2) = IND(KP,2)
  264. IND(KP,2) = JP
  265. C
  266. C PERFORM ELIMINATION ITSELF, LOOPING ON NON-ZEROS IN PIVOT COLUMN.
  267. NZC = IW(JP,2)
  268. IF (NZC.EQ.0) GO TO 550
  269. DO 540 NC=1,NZC
  270. KC = IP(JP,2) + NC - 1
  271. IR = IND(KC,1)
  272. C SEARCH NON-PIVOT ROW FOR ELEMENT TO BE ELIMINATED.
  273. KR = IP(IR,1)
  274. KRL = KR + IW(IR,1) - 1
  275. DO 330 KNP=KR,KRL
  276. IF (JP.EQ.IND(KNP,2)) GO TO 340
  277. 330 CONTINUE
  278. C BRING ELEMENT TO BE ELIMINATED TO FRONT OF ITS ROW.
  279. 340 AM = A(KNP)
  280. A(KNP) = A(KR)
  281. A(KR) = AM
  282. IND(KNP,2) = IND(KR,2)
  283. IND(KR,2) = JP
  284. AM = -A(KR)/A(KP)
  285. C COMPRESS ROW FILE UNLESS IT IS CERTAIN THAT THERE IS ROOM FOR NEW ROW.
  286. IF (LROW+IW(IR,1)+IW(IPP,1)+LENL.LE.IA) GO TO 350
  287. IF (NCP.GE.MCP .OR. LENU+IW(IR,1)+IW(IPP,1)+LENL.GT.IA) GO
  288. * TO 710
  289. CALL LA05ED(A, IND(1,2), IP, N, IW, IA, .TRUE.)
  290. KP = IP(IPP,1)
  291. KR = IP(IR,1)
  292. 350 KRL = KR + IW(IR,1) - 1
  293. KQ = KP + 1
  294. KPL = KP + IW(IPP,1) - 1
  295. C PLACE PIVOT ROW (EXCLUDING PIVOT ITSELF) IN W.
  296. IF (KQ.GT.KPL) GO TO 370
  297. DO 360 K=KQ,KPL
  298. J = IND(K,2)
  299. W(J) = A(K)
  300. 360 CONTINUE
  301. 370 IP(IR,1) = LROW + 1
  302. C
  303. C TRANSFER MODIFIED ELEMENTS.
  304. IND(KR,2) = 0
  305. KR = KR + 1
  306. IF (KR.GT.KRL) GO TO 430
  307. DO 420 KS=KR,KRL
  308. J = IND(KS,2)
  309. AU = A(KS) + AM*W(J)
  310. IND(KS,2) = 0
  311. C IF ELEMENT IS VERY SMALL REMOVE IT FROM U.
  312. IF (ABS(AU).LE.SMALL) GO TO 380
  313. G = MAX(G,ABS(AU))
  314. LROW = LROW + 1
  315. A(LROW) = AU
  316. IND(LROW,2) = J
  317. GO TO 410
  318. 380 LENU = LENU - 1
  319. C REMOVE ELEMENT FROM COL FILE.
  320. K = IP(J,2)
  321. KL = K + IW(J,2) - 1
  322. IW(J,2) = KL - K
  323. DO 390 KK=K,KL
  324. IF (IND(KK,1).EQ.IR) GO TO 400
  325. 390 CONTINUE
  326. 400 IND(KK,1) = IND(KL,1)
  327. IND(KL,1) = 0
  328. 410 W(J) = 0.
  329. 420 CONTINUE
  330. C
  331. C SCAN PIVOT ROW FOR FILLS.
  332. 430 IF (KQ.GT.KPL) GO TO 520
  333. DO 510 KS=KQ,KPL
  334. J = IND(KS,2)
  335. AU = AM*W(J)
  336. IF (ABS(AU).LE.SMALL) GO TO 500
  337. LROW = LROW + 1
  338. A(LROW) = AU
  339. IND(LROW,2) = J
  340. LENU = LENU + 1
  341. C
  342. C CREATE FILL IN COLUMN FILE.
  343. NZ = IW(J,2)
  344. K = IP(J,2)
  345. KL = K + NZ - 1
  346. IF (NZ .EQ. 0) GO TO 460
  347. C IF POSSIBLE PLACE NEW ELEMENT AT END OF PRESENT ENTRY.
  348. IF (KL.NE.LCOL) GO TO 440
  349. IF (LCOL+LENL.GE.IA) GO TO 460
  350. LCOL = LCOL + 1
  351. GO TO 450
  352. 440 IF (IND(KL+1,1).NE.0) GO TO 460
  353. 450 IND(KL+1,1) = IR
  354. GO TO 490
  355. C NEW ENTRY HAS TO BE CREATED.
  356. 460 IF (LCOL+LENL+NZ+1.LT.IA) GO TO 470
  357. C COMPRESS COLUMN FILE IF THERE IS NOT ROOM FOR NEW ENTRY.
  358. IF (NCP.GE.MCP .OR. LENU+LENL+NZ+1.GE.IA) GO TO 710
  359. CALL LA05ED(A, IND, IP(1,2), N, IW(1,2), IA, .FALSE.)
  360. K = IP(J,2)
  361. KL = K + NZ - 1
  362. C TRANSFER OLD ENTRY INTO NEW.
  363. 470 IP(J,2) = LCOL + 1
  364. IF (KL .LT. K) GO TO 485
  365. DO 480 KK=K,KL
  366. LCOL = LCOL + 1
  367. IND(LCOL,1) = IND(KK,1)
  368. IND(KK,1) = 0
  369. 480 CONTINUE
  370. 485 CONTINUE
  371. C ADD NEW ELEMENT.
  372. LCOL = LCOL + 1
  373. IND(LCOL,1) = IR
  374. 490 G = MAX(G,ABS(AU))
  375. IW(J,2) = NZ + 1
  376. 500 W(J) = 0.
  377. 510 CONTINUE
  378. 520 IW(IR,1) = LROW + 1 - IP(IR,1)
  379. C
  380. C STORE MULTIPLIER
  381. IF (LENL+LCOL+1.LE.IA) GO TO 530
  382. C COMPRESS COL FILE IF NECESSARY.
  383. IF (NCP.GE.MCP) GO TO 710
  384. CALL LA05ED(A, IND, IP(1,2), N, IW(1,2), IA, .FALSE.)
  385. 530 K = IA - LENL
  386. LENL = LENL + 1
  387. A(K) = AM
  388. IND(K,1) = IPP
  389. IND(K,2) = IR
  390. LENU = LENU - 1
  391. 540 CONTINUE
  392. C
  393. C INSERT ROWS AND COLUMNS INVOLVED IN ELIMINATION IN LINKED LISTS
  394. C OF EQUAL NUMBERS OF NON-ZEROS.
  395. 550 K1 = IP(JP,2)
  396. K2 = IW(JP,2) + K1 - 1
  397. IW(JP,2) = 0
  398. DO 580 L=1,2
  399. IF (K2.LT.K1) GO TO 570
  400. DO 560 K=K1,K2
  401. IR = IND(K,L)
  402. IF (L.EQ.1) IND(K,L) = 0
  403. NZ = IW(IR,L)
  404. IF (NZ.LE.0) GO TO 720
  405. IN = IW(NZ,L+2)
  406. IW(IR,L+6) = IN
  407. IW(IR,L+4) = 0
  408. IW(NZ,L+2) = IR
  409. IF (IN.NE.0) IW(IN,L+4) = IR
  410. 560 CONTINUE
  411. 570 K1 = IP(IPP,1) + 1
  412. K2 = IW(IPP,1) + K1 - 2
  413. 580 CONTINUE
  414. 590 CONTINUE
  415. C
  416. C RESET COLUMN FILE TO REFER TO U AND STORE ROW/COL NUMBERS IN
  417. C PIVOTAL ORDER IN IW(.,3),IW(.,4)
  418. DO 600 I=1,N
  419. J = -IW(I,5)
  420. IW(J,3) = I
  421. J = -IW(I,6)
  422. IW(J,4) = I
  423. IW(I,2) = 0
  424. 600 CONTINUE
  425. DO 620 I=1,N
  426. KP = IP(I,1)
  427. KL = IW(I,1) + KP - 1
  428. DO 610 K=KP,KL
  429. J = IND(K,2)
  430. IW(J,2) = IW(J,2) + 1
  431. 610 CONTINUE
  432. 620 CONTINUE
  433. K = 1
  434. DO 630 I=1,N
  435. K = K + IW(I,2)
  436. IP(I,2) = K
  437. 630 CONTINUE
  438. LCOL = K - 1
  439. DO 650 II=1,N
  440. I = IW(II,3)
  441. KP = IP(I,1)
  442. KL = IW(I,1) + KP - 1
  443. DO 640 K=KP,KL
  444. J = IND(K,2)
  445. KN = IP(J,2) - 1
  446. IP(J,2) = KN
  447. IND(KN,1) = I
  448. 640 CONTINUE
  449. 650 CONTINUE
  450. RETURN
  451. C
  452. C THE FOLLOWING INSTRUCTIONS IMPLEMENT THE FAILURE EXITS.
  453. C
  454. 660 IF (LP.GT.0) THEN
  455. WRITE (XERN1, '(I8)') IR
  456. WRITE (XERN2, '(I8)') J
  457. CALL XERMSG ('SLATEC', 'LA05AD', 'MORE THAN ONE MATRIX ' //
  458. * 'ENTRY. HERE ROW = ' // XERN1 // ' AND COL = ' // XERN2,
  459. * -4, 1)
  460. ENDIF
  461. G = -4.
  462. RETURN
  463. C
  464. 670 IF (LP.GT.0) CALL XERMSG ('SLATEC', 'LA05AD',
  465. * 'THE ORDER OF THE SYSTEM, N, IS NOT POSITIVE.', -1, 1)
  466. G = -1.0D0
  467. RETURN
  468. C
  469. 680 IF (LP.GT.0) THEN
  470. WRITE (XERN0, '(I8)') K
  471. WRITE (XERN1, '(I8)') I
  472. WRITE (XERN2, '(I8)') J
  473. CALL XERMSG ('SLATEC', 'LA05AD', 'ELEMENT K = ' // XERN0 //
  474. * ' IS OUT OF BOUNDS.$$HERE ROW = ' // XERN1 //
  475. * ' AND COL = ' // XERN2, -3, 1)
  476. ENDIF
  477. G = -3.
  478. RETURN
  479. C
  480. 700 IF (LP.GT.0) THEN
  481. WRITE (XERN1, '(I8)') L
  482. CALL XERMSG ('SLATEC', 'LA05AD', 'ROW OR COLUMN HAS NO ' //
  483. * 'ELEMENTS. HERE INDEX = ' // XERN1, -2, 1)
  484. ENDIF
  485. G = -2.
  486. RETURN
  487. C
  488. 710 IF (LP.GT.0) CALL XERMSG ('SLATEC', 'LA05AD',
  489. * 'LENGTHS OF ARRAYS A(*) AND IND(*,2) ARE TOO SMALL.', -7, 1)
  490. G = -7.
  491. RETURN
  492. C
  493. 720 IPV = IPV + 1
  494. IW(IPV,1) = IR
  495. DO 730 I=1,N
  496. II = -IW(I,L+4)
  497. IF (II.GT.0) IW(II,1) = I
  498. 730 CONTINUE
  499. C
  500. IF (LP.GT.0) THEN
  501. XERN1 = 'ROWS'
  502. IF (L.EQ.2) XERN1 = 'COLUMNS'
  503. CALL XERMSG ('SLATEC', 'LA05AD', 'DEPENDANT ' // XERN1, -5, 1)
  504. C
  505. 740 WRITE (XERN1, '(I8)') IW(I,1)
  506. XERN2 = ' '
  507. IF (I+1.LE.IPV) WRITE (XERN2, '(I8)') IW(I+1,1)
  508. CALL XERMSG ('SLATEC', 'LA05AD',
  509. * 'DEPENDENT VECTOR INDICES ARE ' // XERN1 // ' AND ' //
  510. * XERN2, -5, 1)
  511. I = I + 2
  512. IF (I.LE.IPV) GO TO 740
  513. ENDIF
  514. G = -5.
  515. RETURN
  516. END