dpchng.f 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. *DECK DPCHNG
  2. SUBROUTINE DPCHNG (II, XVAL, IPLACE, SX, IX, IRCX)
  3. C***BEGIN PROLOGUE DPCHNG
  4. C***SUBSIDIARY
  5. C***PURPOSE Subsidiary to DSPLP
  6. C***LIBRARY SLATEC
  7. C***TYPE DOUBLE PRECISION (PCHNGS-S, DPCHNG-D)
  8. C***AUTHOR Hanson, R. J., (SNLA)
  9. C Wisniewski, J. A., (SNLA)
  10. C***DESCRIPTION
  11. C
  12. C SUBROUTINE DPCHNG CHANGES ELEMENT II IN VECTOR +/- IRCX TO THE
  13. C VALUE XVAL.
  14. C DPCHNG LIMITS THE TYPE OF STORAGE TO A SEQUENTIAL SCHEME.
  15. C SPARSE MATRIX ELEMENT ALTERATION SUBROUTINE.
  16. C
  17. C II THE ABSOLUTE VALUE OF THIS INTEGER IS THE SUBSCRIPT FOR
  18. C THE ELEMENT TO BE CHANGED.
  19. C XVAL NEW VALUE OF THE MATRIX ELEMENT BEING CHANGED.
  20. C IPLACE POINTER INFORMATION WHICH IS MAINTAINED BY THE PACKAGE.
  21. C SX(*),IX(*) THE WORK ARRAYS WHICH ARE USED TO STORE THE SPARSE
  22. C MATRIX. THESE ARRAYS ARE AUTOMATICALLY MAINTAINED BY THE
  23. C PACKAGE FOR THE USER.
  24. C IRCX POINTS TO THE VECTOR OF THE MATRIX BEING UPDATED.
  25. C A NEGATIVE VALUE OF IRCX INDICATES THAT ROW -IRCX IS
  26. C BEING UPDATED. A POSITIVE VALUE OF IRCX INDICATES THAT
  27. C COLUMN IRCX IS BEING UPDATED. A ZERO VALUE OF IRCX IS
  28. C AN ERROR.
  29. C
  30. C SINCE DATA ITEMS ARE KEPT SORTED IN THE SEQUENTIAL DATA STRUCTURE,
  31. C CHANGING A MATRIX ELEMENT CAN REQUIRE THE MOVEMENT OF ALL THE DATA
  32. C ITEMS IN THE MATRIX. FOR THIS REASON, IT IS SUGGESTED THAT DATA
  33. C ITEMS BE ADDED A COL. AT A TIME, IN ASCENDING COL. SEQUENCE.
  34. C FURTHERMORE, SINCE DELETING ITEMS FROM THE DATA STRUCTURE MAY ALSO
  35. C REQUIRE MOVING LARGE AMOUNTS OF DATA, ZERO ELEMENTS ARE EXPLICITLY
  36. C STORED IN THE MATRIX.
  37. C
  38. C THIS SUBROUTINE IS A MODIFICATION OF THE SUBROUTINE LCHNGS,
  39. C SANDIA LABS. REPT. SAND78-0785.
  40. C MODIFICATIONS BY K.L. HIEBERT AND R.J. HANSON
  41. C REVISED 811130-1000
  42. C REVISED YYMMDD-HHMM
  43. C
  44. C***SEE ALSO DSPLP
  45. C***ROUTINES CALLED DPRWPG, IDLOC, XERMSG
  46. C***REVISION HISTORY (YYMMDD)
  47. C 811215 DATE WRITTEN
  48. C 890531 Changed all specific intrinsics to generic. (WRB)
  49. C 890606 Changed references from IPLOC to IDLOC. (WRB)
  50. C 891214 Prologue converted to Version 4.0 format. (BAB)
  51. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  52. C 900328 Added TYPE section. (WRB)
  53. C 910403 Updated AUTHOR and DESCRIPTION sections. (WRB)
  54. C***END PROLOGUE DPCHNG
  55. DIMENSION IX(*)
  56. INTEGER IDLOC
  57. DOUBLE PRECISION SX(*),XVAL,ZERO,ONE,SXLAST,SXVAL
  58. SAVE ZERO, ONE
  59. DATA ZERO,ONE /0.D0,1.D0/
  60. C***FIRST EXECUTABLE STATEMENT DPCHNG
  61. IOPT=1
  62. C
  63. C DETERMINE NULL-CASES..
  64. IF(II.EQ.0) RETURN
  65. C
  66. C CHECK VALIDITY OF ROW/COL. INDEX.
  67. C
  68. IF (.NOT.(IRCX.EQ.0)) GO TO 20002
  69. NERR=55
  70. CALL XERMSG ('SLATEC', 'DPCHNG', 'IRCX=0', NERR, IOPT)
  71. 20002 LMX = IX(1)
  72. C
  73. C LMX IS THE LENGTH OF THE IN-MEMORY STORAGE AREA.
  74. C
  75. IF (.NOT.(IRCX.LT.0)) GO TO 20005
  76. C
  77. C CHECK SUBSCRIPTS OF THE ROW. THE ROW NUMBER MUST BE .LE. M AND
  78. C THE INDEX MUST BE .LE. N.
  79. C
  80. IF (.NOT.(IX(2).LT.-IRCX .OR. IX(3).LT.ABS(II))) GO TO 20008
  81. NERR=55
  82. CALL XERMSG ('SLATEC', 'DPCHNG',
  83. + 'SUBSCRIPTS FOR ARRAY ELEMENT TO BE ACCESSED WERE OUT OF ' //
  84. + 'BOUNDS', NERR, IOPT)
  85. 20008 GO TO 20006
  86. C
  87. C CHECK SUBSCRIPTS OF THE COLUMN. THE COL. NUMBER MUST BE .LE. N AND
  88. C THE INDEX MUST BE .LE. M.
  89. C
  90. 20005 IF (.NOT.(IX(3).LT.IRCX .OR. IX(2).LT.ABS(II))) GO TO 20011
  91. NERR=55
  92. CALL XERMSG ('SLATEC', 'DPCHNG',
  93. + 'SUBSCRIPTS FOR ARRAY ELEMENT TO BE ACCESSED WERE OUT OF ' //
  94. + 'BOUNDS', NERR, IOPT)
  95. 20011 CONTINUE
  96. C
  97. C SET I TO BE THE ELEMENT OF ROW/COLUMN J TO BE CHANGED.
  98. C
  99. 20006 IF (.NOT.(IRCX.GT.0)) GO TO 20014
  100. I = ABS(II)
  101. J = ABS(IRCX)
  102. GO TO 20015
  103. 20014 I = ABS(IRCX)
  104. J = ABS(II)
  105. C
  106. C THE INTEGER LL POINTS TO THE START OF THE MATRIX ELEMENT DATA.
  107. C
  108. 20015 LL=IX(3)+4
  109. II = ABS(II)
  110. LPG = LMX - LL
  111. C
  112. C SET IPLACE TO START OUR SCAN FOR THE ELEMENT AT THE BEGINNING
  113. C OF THE VECTOR.
  114. C
  115. IF (.NOT.(J.EQ.1)) GO TO 20017
  116. IPLACE=LL+1
  117. GO TO 20018
  118. 20017 IPLACE=IX(J+3)+1
  119. C
  120. C IEND POINTS TO THE LAST ELEMENT OF THE VECTOR TO BE SCANNED.
  121. C
  122. 20018 IEND = IX(J+4)
  123. C
  124. C SCAN THROUGH SEVERAL PAGES, IF NECESSARY, TO FIND MATRIX ELEMENT.
  125. C
  126. IPL = IDLOC(IPLACE,SX,IX)
  127. NP = ABS(IX(LMX-1))
  128. GO TO 20021
  129. 20020 IF (ILAST.EQ.IEND) GO TO 20022
  130. C
  131. C THE VIRTUAL END OF DATA FOR THIS PAGE IS ILAST.
  132. C
  133. 20021 ILAST = MIN(IEND,NP*LPG+LL-2)
  134. C
  135. C THE RELATIVE END OF DATA FOR THIS PAGE IS IL.
  136. C SEARCH FOR A MATRIX VALUE WITH AN INDEX .GE. I ON THE PRESENT
  137. C PAGE.
  138. C
  139. IL = IDLOC(ILAST,SX,IX)
  140. IL = MIN(IL,LMX-2)
  141. 20023 IF (.NOT.(.NOT.(IPL.GE.IL .OR. IX(IPL).GE.I))) GO TO 20024
  142. IPL=IPL+1
  143. GO TO 20023
  144. C
  145. C SET IPLACE AND STORE DATA ITEM IF FOUND.
  146. C
  147. 20024 IF (.NOT.(IX(IPL).EQ.I .AND. IPL.LE.IL)) GO TO 20025
  148. SX(IPL) = XVAL
  149. SX(LMX) = ONE
  150. RETURN
  151. C
  152. C EXIT FROM LOOP IF ITEM WAS FOUND.
  153. C
  154. 20025 IF(IX(IPL).GT.I .AND. IPL.LE.IL) ILAST = IEND
  155. IF (.NOT.(ILAST.NE.IEND)) GO TO 20028
  156. IPL = LL + 1
  157. NP = NP + 1
  158. 20028 GO TO 20020
  159. C
  160. C INSERT NEW DATA ITEM INTO LOCATION AT IPLACE(IPL).
  161. C
  162. 20022 IF (.NOT.(IPL.GT.IL.OR.(IPL.EQ.IL.AND.I.GT.IX(IPL)))) GO TO 20031
  163. IPL = IL + 1
  164. IF(IPL.EQ.LMX-1) IPL = IPL + 2
  165. 20031 IPLACE = (NP-1)*LPG + IPL
  166. C
  167. C GO TO A NEW PAGE, IF NECESSARY, TO INSERT THE ITEM.
  168. C
  169. IF (.NOT.(IPL.LE.LMX .OR. IX(LMX-1).GE.0)) GO TO 20034
  170. IPL=IDLOC(IPLACE,SX,IX)
  171. 20034 IEND = IX(LL)
  172. NP = ABS(IX(LMX-1))
  173. SXVAL = XVAL
  174. C
  175. C LOOP THROUGH ALL SUBSEQUENT PAGES OF THE MATRIX MOVING DATA DOWN.
  176. C THIS IS NECESSARY TO MAKE ROOM FOR THE NEW MATRIX ELEMENT AND
  177. C KEEP THE ENTRIES SORTED.
  178. C
  179. GO TO 20038
  180. 20037 IF (IX(LMX-1).LE.0) GO TO 20039
  181. 20038 ILAST = MIN(IEND,NP*LPG+LL-2)
  182. IL = IDLOC(ILAST,SX,IX)
  183. IL = MIN(IL,LMX-2)
  184. SXLAST = SX(IL)
  185. IXLAST = IX(IL)
  186. ISTART = IPL + 1
  187. IF (.NOT.(ISTART.LE.IL)) GO TO 20040
  188. K = ISTART + IL
  189. DO 50 JJ=ISTART,IL
  190. SX(K-JJ) = SX(K-JJ-1)
  191. IX(K-JJ) = IX(K-JJ-1)
  192. 50 CONTINUE
  193. SX(LMX) = ONE
  194. 20040 IF (.NOT.(IPL.LE.LMX)) GO TO 20043
  195. SX(IPL) = SXVAL
  196. IX(IPL) = I
  197. SXVAL = SXLAST
  198. I = IXLAST
  199. SX(LMX) = ONE
  200. IF (.NOT.(IX(LMX-1).GT.0)) GO TO 20046
  201. IPL = LL + 1
  202. NP = NP + 1
  203. 20046 CONTINUE
  204. 20043 GO TO 20037
  205. 20039 NP = ABS(IX(LMX-1))
  206. C
  207. C DETERMINE IF A NEW PAGE IS TO BE CREATED FOR THE LAST ELEMENT
  208. C MOVED DOWN.
  209. C
  210. IL = IL + 1
  211. IF (.NOT.(IL.EQ.LMX-1)) GO TO 20049
  212. C
  213. C CREATE A NEW PAGE.
  214. C
  215. IX(LMX-1) = NP
  216. C
  217. C WRITE THE OLD PAGE.
  218. C
  219. SX(LMX) = ZERO
  220. KEY = 2
  221. CALL DPRWPG(KEY,NP,LPG,SX,IX)
  222. SX(LMX) = ONE
  223. C
  224. C STORE LAST ELEMENT MOVED DOWN IN A NEW PAGE.
  225. C
  226. IPL = LL + 1
  227. NP = NP + 1
  228. IX(LMX-1) = -NP
  229. SX(IPL) = SXVAL
  230. IX(IPL) = I
  231. GO TO 20050
  232. C
  233. C LAST ELEMENT MOVED REMAINED ON THE OLD PAGE.
  234. C
  235. 20049 IF (.NOT.(IPL.NE.IL)) GO TO 20052
  236. SX(IL) = SXVAL
  237. IX(IL) = I
  238. SX(LMX) = ONE
  239. 20052 CONTINUE
  240. C
  241. C INCREMENT POINTERS TO LAST ELEMENT IN VECTORS J,J+1,... .
  242. C
  243. 20050 JSTART = J + 4
  244. JJ=JSTART
  245. N20055=LL
  246. GO TO 20056
  247. 20055 JJ=JJ+1
  248. 20056 IF ((N20055-JJ).LT.0) GO TO 20057
  249. IX(JJ) = IX(JJ) + 1
  250. IF(MOD(IX(JJ)-LL,LPG).EQ.LPG-1) IX(JJ) = IX(JJ) + 2
  251. GO TO 20055
  252. C
  253. C IPLACE POINTS TO THE INSERTED DATA ITEM.
  254. C
  255. 20057 IPL=IDLOC(IPLACE,SX,IX)
  256. RETURN
  257. END