spinit.f 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. *DECK SPINIT
  2. SUBROUTINE SPINIT (MRELAS, NVARS, COSTS, BL, BU, IND, PRIMAL,
  3. + INFO, AMAT, CSC, COSTSC, COLNRM, XLAMDA, ANORM, RHS, RHSNRM,
  4. + IBASIS, IBB, IMAT, LOPT)
  5. C***BEGIN PROLOGUE SPINIT
  6. C***SUBSIDIARY
  7. C***PURPOSE Subsidiary to SPLP
  8. C***LIBRARY SLATEC
  9. C***TYPE SINGLE PRECISION (SPINIT-S, DPINIT-D)
  10. C***AUTHOR (UNKNOWN)
  11. C***DESCRIPTION
  12. C
  13. C THE EDITING REQUIRED TO CONVERT THIS SUBROUTINE FROM SINGLE TO
  14. C DOUBLE PRECISION INVOLVES THE FOLLOWING CHARACTER STRING CHANGES.
  15. C
  16. C USE AN EDITING COMMAND (CHANGE) /STRING-1/(TO)STRING-2/.
  17. C /REAL (12 BLANKS)/DOUBLE PRECISION/,/SCOPY/DCOPY/
  18. C REVISED 810519-0900
  19. C REVISED YYMMDD-HHMM
  20. C
  21. C INITIALIZATION SUBROUTINE FOR SPLP(*) PACKAGE.
  22. C
  23. C***SEE ALSO SPLP
  24. C***ROUTINES CALLED PNNZRS, SASUM, SCOPY
  25. C***REVISION HISTORY (YYMMDD)
  26. C 811215 DATE WRITTEN
  27. C 890531 Changed all specific intrinsics to generic. (WRB)
  28. C 890605 Removed unreferenced labels. (WRB)
  29. C 891214 Prologue converted to Version 4.0 format. (BAB)
  30. C 900328 Added TYPE section. (WRB)
  31. C***END PROLOGUE SPINIT
  32. REAL AIJ,AMAT(*),ANORM,BL(*),BU(*),CMAX,
  33. * COLNRM(*),COSTS(*),COSTSC,CSC(*),CSUM,ONE,PRIMAL(*),
  34. * RHS(*),RHSNRM,SCALR,TESTSC,XLAMDA,ZERO
  35. INTEGER IBASIS(*),IBB(*),IMAT(*),IND(*)
  36. LOGICAL CONTIN,USRBAS,COLSCP,CSTSCP,MINPRB,LOPT(8)
  37. C
  38. C***FIRST EXECUTABLE STATEMENT SPINIT
  39. ZERO=0.
  40. ONE=1.
  41. CONTIN=LOPT(1)
  42. USRBAS=LOPT(2)
  43. COLSCP=LOPT(5)
  44. CSTSCP=LOPT(6)
  45. MINPRB=LOPT(7)
  46. C
  47. C SCALE DATA. NORMALIZE BOUNDS. FORM COLUMN CHECK SUMS.
  48. GO TO 30001
  49. C
  50. C INITIALIZE ACTIVE BASIS MATRIX.
  51. 20002 CONTINUE
  52. GO TO 30002
  53. 20003 RETURN
  54. C
  55. C PROCEDURE (SCALE DATA. NORMALIZE BOUNDS. FORM COLUMN CHECK SUMS)
  56. C
  57. C DO COLUMN SCALING IF NOT PROVIDED BY THE USER.
  58. 30001 IF (.NOT.(.NOT. COLSCP)) GO TO 20004
  59. J=1
  60. N20007=NVARS
  61. GO TO 20008
  62. 20007 J=J+1
  63. 20008 IF ((N20007-J).LT.0) GO TO 20009
  64. CMAX=ZERO
  65. I=0
  66. 20011 CALL PNNZRS(I,AIJ,IPLACE,AMAT,IMAT,J)
  67. IF (.NOT.(I.EQ.0)) GO TO 20013
  68. GO TO 20012
  69. 20013 CONTINUE
  70. CMAX=MAX(CMAX,ABS(AIJ))
  71. GO TO 20011
  72. 20012 IF (.NOT.(CMAX.EQ.ZERO)) GO TO 20016
  73. CSC(J)=ONE
  74. GO TO 20017
  75. 20016 CSC(J)=ONE/CMAX
  76. 20017 CONTINUE
  77. GO TO 20007
  78. 20009 CONTINUE
  79. C
  80. C FORM CHECK SUMS OF COLUMNS. COMPUTE MATRIX NORM OF SCALED MATRIX.
  81. 20004 ANORM = ZERO
  82. J=1
  83. N20019=NVARS
  84. GO TO 20020
  85. 20019 J=J+1
  86. 20020 IF ((N20019-J).LT.0) GO TO 20021
  87. PRIMAL(J)=ZERO
  88. CSUM = ZERO
  89. I=0
  90. 20023 CALL PNNZRS(I,AIJ,IPLACE,AMAT,IMAT,J)
  91. IF (.NOT.(I.LE.0)) GO TO 20025
  92. GO TO 20024
  93. 20025 CONTINUE
  94. PRIMAL(J)=PRIMAL(J)+AIJ
  95. CSUM = CSUM+ABS(AIJ)
  96. GO TO 20023
  97. 20024 IF (IND(J).EQ.2) CSC(J)=-CSC(J)
  98. PRIMAL(J)=PRIMAL(J)*CSC(J)
  99. COLNRM(J)=ABS(CSC(J)*CSUM)
  100. ANORM = MAX(ANORM,COLNRM(J))
  101. GO TO 20019
  102. C
  103. C IF THE USER HAS NOT PROVIDED COST VECTOR SCALING THEN SCALE IT
  104. C USING THE MAX. NORM OF THE TRANSFORMED COST VECTOR, IF NONZERO.
  105. 20021 TESTSC=ZERO
  106. J=1
  107. N20028=NVARS
  108. GO TO 20029
  109. 20028 J=J+1
  110. 20029 IF ((N20028-J).LT.0) GO TO 20030
  111. TESTSC=MAX(TESTSC,ABS(CSC(J)*COSTS(J)))
  112. GO TO 20028
  113. 20030 IF (.NOT.(.NOT.CSTSCP)) GO TO 20032
  114. IF (.NOT.(TESTSC.GT.ZERO)) GO TO 20035
  115. COSTSC=ONE/TESTSC
  116. GO TO 20036
  117. 20035 COSTSC=ONE
  118. 20036 CONTINUE
  119. CONTINUE
  120. 20032 XLAMDA=(COSTSC+COSTSC)*TESTSC
  121. IF (XLAMDA.EQ.ZERO) XLAMDA=ONE
  122. C
  123. C IF MAXIMIZATION PROBLEM, THEN CHANGE SIGN OF COSTSC AND LAMDA
  124. C =WEIGHT FOR PENALTY-FEASIBILITY METHOD.
  125. IF (.NOT.(.NOT.MINPRB)) GO TO 20038
  126. COSTSC=-COSTSC
  127. 20038 GO TO 20002
  128. C:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  129. C PROCEDURE (INITIALIZE RHS(*),IBASIS(*), AND IBB(*))
  130. C
  131. C INITIALLY SET RIGHT-HAND SIDE VECTOR TO ZERO.
  132. 30002 CALL SCOPY(MRELAS,ZERO,0,RHS,1)
  133. C
  134. C TRANSLATE RHS ACCORDING TO CLASSIFICATION OF INDEPENDENT VARIABLES
  135. J=1
  136. N20041=NVARS
  137. GO TO 20042
  138. 20041 J=J+1
  139. 20042 IF ((N20041-J).LT.0) GO TO 20043
  140. IF (.NOT.(IND(J).EQ.1)) GO TO 20045
  141. SCALR=-BL(J)
  142. GO TO 20046
  143. 20045 IF (.NOT.(IND(J).EQ.2)) GO TO 10001
  144. SCALR=-BU(J)
  145. GO TO 20046
  146. 10001 IF (.NOT.(IND(J).EQ.3)) GO TO 10002
  147. SCALR=-BL(J)
  148. GO TO 20046
  149. 10002 IF (.NOT.(IND(J).EQ.4)) GO TO 10003
  150. SCALR=ZERO
  151. 10003 CONTINUE
  152. 20046 CONTINUE
  153. IF (.NOT.(SCALR.NE.ZERO)) GO TO 20048
  154. I=0
  155. 20051 CALL PNNZRS(I,AIJ,IPLACE,AMAT,IMAT,J)
  156. IF (.NOT.(I.LE.0)) GO TO 20053
  157. GO TO 20052
  158. 20053 CONTINUE
  159. RHS(I)=SCALR*AIJ+RHS(I)
  160. GO TO 20051
  161. 20052 CONTINUE
  162. 20048 CONTINUE
  163. GO TO 20041
  164. C
  165. C TRANSLATE RHS ACCORDING TO CLASSIFICATION OF DEPENDENT VARIABLES.
  166. 20043 I=NVARS+1
  167. N20056=NVARS+MRELAS
  168. GO TO 20057
  169. 20056 I=I+1
  170. 20057 IF ((N20056-I).LT.0) GO TO 20058
  171. IF (.NOT.(IND(I).EQ.1)) GO TO 20060
  172. SCALR=BL(I)
  173. GO TO 20061
  174. 20060 IF (.NOT.(IND(I).EQ.2)) GO TO 10004
  175. SCALR=BU(I)
  176. GO TO 20061
  177. 10004 IF (.NOT.(IND(I).EQ.3)) GO TO 10005
  178. SCALR=BL(I)
  179. GO TO 20061
  180. 10005 IF (.NOT.(IND(I).EQ.4)) GO TO 10006
  181. SCALR=ZERO
  182. 10006 CONTINUE
  183. 20061 CONTINUE
  184. RHS(I-NVARS)=RHS(I-NVARS)+SCALR
  185. GO TO 20056
  186. 20058 RHSNRM=SASUM(MRELAS,RHS,1)
  187. C
  188. C IF THIS IS NOT A CONTINUATION OR THE USER HAS NOT PROVIDED THE
  189. C INITIAL BASIS, THEN THE INITIAL BASIS IS COMPRISED OF THE
  190. C DEPENDENT VARIABLES.
  191. IF (.NOT.(.NOT.(CONTIN .OR. USRBAS))) GO TO 20063
  192. J=1
  193. N20066=MRELAS
  194. GO TO 20067
  195. 20066 J=J+1
  196. 20067 IF ((N20066-J).LT.0) GO TO 20068
  197. IBASIS(J)=NVARS+J
  198. GO TO 20066
  199. 20068 CONTINUE
  200. C
  201. C DEFINE THE ARRAY IBB(*)
  202. 20063 J=1
  203. N20070=NVARS+MRELAS
  204. GO TO 20071
  205. 20070 J=J+1
  206. 20071 IF ((N20070-J).LT.0) GO TO 20072
  207. IBB(J)=1
  208. GO TO 20070
  209. 20072 J=1
  210. N20074=MRELAS
  211. GO TO 20075
  212. 20074 J=J+1
  213. 20075 IF ((N20074-J).LT.0) GO TO 20076
  214. IBB(IBASIS(J))=-1
  215. GO TO 20074
  216. C
  217. C DEFINE THE REST OF IBASIS(*)
  218. 20076 IP=MRELAS
  219. J=1
  220. N20078=NVARS+MRELAS
  221. GO TO 20079
  222. 20078 J=J+1
  223. 20079 IF ((N20078-J).LT.0) GO TO 20080
  224. IF (.NOT.(IBB(J).GT.0)) GO TO 20082
  225. IP=IP+1
  226. IBASIS(IP)=J
  227. 20082 GO TO 20078
  228. 20080 GO TO 20003
  229. END