PageRenderTime 56ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/UAFWLIS2.4/slatec/splpup.f

http://ua-fwlis.googlecode.com/
FORTRAN Legacy | 214 lines | 104 code | 0 blank | 110 comment | 0 complexity | 3c4a88ba539d53a35317007fddee9fba MD5 | raw file
Possible License(s): GPL-3.0
  1. *DECK SPLPUP
  2. SUBROUTINE SPLPUP (USRMAT, MRELAS, NVARS, PRGOPT, DATTRV, BL, BU,
  3. + IND, INFO, AMAT, IMAT, SIZEUP, ASMALL, ABIG)
  4. C***BEGIN PROLOGUE SPLPUP
  5. C***SUBSIDIARY
  6. C***PURPOSE Subsidiary to SPLP
  7. C***LIBRARY SLATEC
  8. C***TYPE SINGLE PRECISION (SPLPUP-S, DPLPUP-D)
  9. C***AUTHOR (UNKNOWN)
  10. C***DESCRIPTION
  11. C
  12. C THE EDITING REQUIRED TO CONVERT THIS SUBROUTINE FROM SINGLE TO
  13. C DOUBLE PRECISION INVOLVES THE FOLLOWING CHARACTER STRING CHANGES.
  14. C
  15. C USE AN EDITING COMMAND (CHANGE) /STRING-1/(TO)STRING-2/.
  16. C /REAL (12 BLANKS)/DOUBLE PRECISION/.
  17. C
  18. C REVISED 810613-1130
  19. C REVISED YYMMDD-HHMM
  20. C
  21. C THIS SUBROUTINE COLLECTS INFORMATION ABOUT THE BOUNDS AND MATRIX
  22. C FROM THE USER. IT IS PART OF THE SPLP( ) PACKAGE.
  23. C
  24. C***SEE ALSO SPLP
  25. C***ROUTINES CALLED PCHNGS, PNNZRS, XERMSG
  26. C***REVISION HISTORY (YYMMDD)
  27. C 811215 DATE WRITTEN
  28. C 890531 Changed all specific intrinsics to generic. (WRB)
  29. C 890605 Corrected references to XERRWV. (WRB)
  30. C 890605 Removed unreferenced labels. (WRB)
  31. C 891009 Removed unreferenced variables. (WRB)
  32. C 891214 Prologue converted to Version 4.0 format. (BAB)
  33. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  34. C 900328 Added TYPE section. (WRB)
  35. C 900510 Convert XERRWV calls to XERMSG calls, changed do-it-yourself
  36. C DO loops to DO loops. (RWC)
  37. C 900602 Get rid of ASSIGNed GOTOs. (RWC)
  38. C***END PROLOGUE SPLPUP
  39. REAL ABIG,AIJ,AMAT(*),AMN,AMX,ASMALL,BL(*),
  40. * BU(*),DATTRV(*),PRGOPT(*),XVAL,ZERO
  41. INTEGER IFLAG(10),IMAT(*),IND(*)
  42. LOGICAL SIZEUP,FIRST
  43. CHARACTER*8 XERN1, XERN2
  44. CHARACTER*16 XERN3, XERN4
  45. C
  46. C***FIRST EXECUTABLE STATEMENT SPLPUP
  47. ZERO = 0.E0
  48. C
  49. C CHECK USER-SUPPLIED BOUNDS
  50. C
  51. C CHECK THAT IND(*) VALUES ARE 1,2,3 OR 4.
  52. C ALSO CHECK CONSISTENCY OF UPPER AND LOWER BOUNDS.
  53. C
  54. DO 10 J=1,NVARS
  55. IF (IND(J).LT.1 .OR. IND(J).GT.4) THEN
  56. WRITE (XERN1, '(I8)') J
  57. CALL XERMSG ('SLATEC', 'SPLPUP',
  58. * 'IN SPLP, INDEPENDENT VARIABLE = ' // XERN1 //
  59. * ' IS NOT DEFINED.', 10, 1)
  60. INFO = -10
  61. RETURN
  62. ENDIF
  63. C
  64. IF (IND(J).EQ.3) THEN
  65. IF (BL(J).GT.BU(J)) THEN
  66. WRITE (XERN1, '(I8)') J
  67. WRITE (XERN3, '(1PE15.6)') BL(J)
  68. WRITE (XERN4, '(1PE15.6)') BU(J)
  69. CALL XERMSG ('SLATEC', 'SPLPUP',
  70. * 'IN SPLP, LOWER BOUND = ' // XERN3 //
  71. * ' AND UPPER BOUND = ' // XERN4 //
  72. * ' FOR INDEPENDENT VARIABLE = ' // XERN1 //
  73. * ' ARE NOT CONSISTENT.', 11, 1)
  74. RETURN
  75. ENDIF
  76. ENDIF
  77. 10 CONTINUE
  78. C
  79. DO 20 I=NVARS+1,NVARS+MRELAS
  80. IF (IND(I).LT.1 .OR. IND(I).GT.4) THEN
  81. WRITE (XERN1, '(I8)') I-NVARS
  82. CALL XERMSG ('SLATEC', 'SPLPUP',
  83. * 'IN SPLP, DEPENDENT VARIABLE = ' // XERN1 //
  84. * ' IS NOT DEFINED.', 12, 1)
  85. INFO = -12
  86. RETURN
  87. ENDIF
  88. C
  89. IF (IND(I).EQ.3) THEN
  90. IF (BL(I).GT.BU(I)) THEN
  91. WRITE (XERN1, '(I8)') I
  92. WRITE (XERN3, '(1PE15.6)') BL(I)
  93. WRITE (XERN4, '(1PE15.6)') BU(I)
  94. CALL XERMSG ('SLATEC', 'SPLPUP',
  95. * 'IN SPLP, LOWER BOUND = ' // XERN3 //
  96. * ' AND UPPER BOUND = ' // XERN4 //
  97. * ' FOR DEPENDANT VARIABLE = ' // XERN1 //
  98. * ' ARE NOT CONSISTENT.',13,1)
  99. INFO = -13
  100. RETURN
  101. ENDIF
  102. ENDIF
  103. 20 CONTINUE
  104. C
  105. C GET UPDATES OR DATA FOR MATRIX FROM THE USER
  106. C
  107. C GET THE ELEMENTS OF THE MATRIX FROM THE USER. IT WILL BE STORED
  108. C BY COLUMNS USING THE SPARSE STORAGE CODES OF RJ HANSON AND
  109. C JA WISNIEWSKI.
  110. C
  111. IFLAG(1) = 1
  112. C
  113. C KEEP ACCEPTING ELEMENTS UNTIL THE USER IS FINISHED GIVING THEM.
  114. C LIMIT THIS LOOP TO 2*NVARS*MRELAS ITERATIONS.
  115. C
  116. ITMAX = 2*NVARS*MRELAS+1
  117. ITCNT = 0
  118. FIRST = .TRUE.
  119. C
  120. C CHECK ON THE ITERATION COUNT.
  121. C
  122. 30 ITCNT = ITCNT+1
  123. IF (ITCNT.GT.ITMAX) THEN
  124. CALL XERMSG ('SLATEC', 'SPLPUP',
  125. + 'IN SPLP, MORE THAN 2*NVARS*MRELAS ITERATIONS DEFINING ' //
  126. + 'OR UPDATING MATRIX DATA.', 7, 1)
  127. INFO = -7
  128. RETURN
  129. ENDIF
  130. C
  131. AIJ = ZERO
  132. CALL USRMAT(I,J,AIJ,INDCAT,PRGOPT,DATTRV,IFLAG)
  133. IF (IFLAG(1).EQ.1) THEN
  134. IFLAG(1) = 2
  135. GO TO 30
  136. ENDIF
  137. C
  138. C CHECK TO SEE THAT THE SUBSCRIPTS I AND J ARE VALID.
  139. C
  140. IF (I.LT.1 .OR. I.GT.MRELAS .OR. J.LT.1 .OR. J.GT.NVARS) THEN
  141. C
  142. C CHECK ON SIZE OF MATRIX DATA
  143. C RECORD THE LARGEST AND SMALLEST(IN MAGNITUDE) NONZERO ELEMENTS.
  144. C
  145. IF (IFLAG(1).EQ.3) THEN
  146. IF (SIZEUP .AND. ABS(AIJ).NE.ZERO) THEN
  147. IF (FIRST) THEN
  148. AMX = ABS(AIJ)
  149. AMN = ABS(AIJ)
  150. FIRST = .FALSE.
  151. ELSEIF (ABS(AIJ).GT.AMX) THEN
  152. AMX = ABS(AIJ)
  153. ELSEIF (ABS(AIJ).LT.AMN) THEN
  154. AMN = ABS(AIJ)
  155. ENDIF
  156. ENDIF
  157. GO TO 40
  158. ENDIF
  159. C
  160. WRITE (XERN1, '(I8)') I
  161. WRITE (XERN2, '(I8)') J
  162. CALL XERMSG ('SLATEC', 'SPLPUP',
  163. * 'IN SPLP, ROW INDEX = ' // XERN1 // ' OR COLUMN INDEX = '
  164. * // XERN2 // ' IS OUT OF RANGE.', 8, 1)
  165. INFO = -8
  166. RETURN
  167. ENDIF
  168. C
  169. C IF INDCAT=0 THEN SET A(I,J)=AIJ.
  170. C IF INDCAT=1 THEN ACCUMULATE ELEMENT, A(I,J)=A(I,J)+AIJ.
  171. C
  172. IF (INDCAT.EQ.0) THEN
  173. CALL PCHNGS(I,AIJ,IPLACE,AMAT,IMAT,J)
  174. ELSEIF (INDCAT.EQ.1) THEN
  175. INDEX = -(I-1)
  176. CALL PNNZRS(INDEX,XVAL,IPLACE,AMAT,IMAT,J)
  177. IF (INDEX.EQ.I) AIJ=AIJ+XVAL
  178. CALL PCHNGS(I,AIJ,IPLACE,AMAT,IMAT,J)
  179. ELSE
  180. WRITE (XERN1, '(I8)') INDCAT
  181. CALL XERMSG ('SLATEC', 'SPLPUP',
  182. * 'IN SPLP, INDICATION FLAG = ' // XERN1 //
  183. * ' FOR MATRIX DATA MUST BE EITHER 0 OR 1.', 9, 1)
  184. INFO = -9
  185. RETURN
  186. ENDIF
  187. C
  188. C CHECK ON SIZE OF MATRIX DATA
  189. C RECORD THE LARGEST AND SMALLEST(IN MAGNITUDE) NONZERO ELEMENTS.
  190. C
  191. IF (SIZEUP .AND. ABS(AIJ).NE.ZERO) THEN
  192. IF (FIRST) THEN
  193. AMX = ABS(AIJ)
  194. AMN = ABS(AIJ)
  195. FIRST = .FALSE.
  196. ELSEIF (ABS(AIJ).GT.AMX) THEN
  197. AMX = ABS(AIJ)
  198. ELSEIF (ABS(AIJ).LT.AMN) THEN
  199. AMN = ABS(AIJ)
  200. ENDIF
  201. ENDIF
  202. IF (IFLAG(1).NE.3) GO TO 30
  203. C
  204. 40 IF (SIZEUP .AND. .NOT. FIRST) THEN
  205. IF (AMN.LT.ASMALL .OR. AMX.GT.ABIG) THEN
  206. CALL XERMSG ('SLATEC', 'SPLPUP',
  207. + 'IN SPLP, A MATRIX ELEMENT''S SIZE IS OUT OF THE ' //
  208. + 'SPECIFIED RANGE.', 22, 1)
  209. INFO = -22
  210. RETURN
  211. ENDIF
  212. ENDIF
  213. RETURN
  214. END