dplpfl.f 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. *DECK DPLPFL
  2. SUBROUTINE DPLPFL (MRELAS, NVARS, IENTER, ILEAVE, IBASIS, IND,
  3. + IBB, THETA, DIRNRM, RPRNRM, CSC, WW, BL, BU, ERP, RPRIM,
  4. + PRIMAL, FINITE, ZEROLV)
  5. C***BEGIN PROLOGUE DPLPFL
  6. C***SUBSIDIARY
  7. C***PURPOSE Subsidiary to DSPLP
  8. C***LIBRARY SLATEC
  9. C***TYPE DOUBLE PRECISION (SPLPFL-S, DPLPFL-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/.
  18. C
  19. C THIS SUBPROGRAM IS PART OF THE DSPLP( ) PACKAGE.
  20. C IT IMPLEMENTS THE PROCEDURE (CHOOSE VARIABLE TO LEAVE BASIS).
  21. C REVISED 811130-1045
  22. C REVISED YYMMDD-HHMM
  23. C
  24. C***SEE ALSO DSPLP
  25. C***ROUTINES CALLED (NONE)
  26. C***REVISION HISTORY (YYMMDD)
  27. C 811215 DATE WRITTEN
  28. C 890531 Changed all specific intrinsics to generic. (WRB)
  29. C 890605 Removed unreferenced labels. (WRB)
  30. C 891214 Prologue converted to Version 4.0 format. (BAB)
  31. C 900328 Added TYPE section. (WRB)
  32. C***END PROLOGUE DPLPFL
  33. INTEGER IBASIS(*),IND(*),IBB(*)
  34. DOUBLE PRECISION CSC(*),WW(*),BL(*),BU(*),ERP(*),RPRIM(*),
  35. * PRIMAL(*),BOUND,DIRNRM,RATIO,RPRNRM,THETA,ZERO
  36. LOGICAL FINITE,ZEROLV
  37. C***FIRST EXECUTABLE STATEMENT DPLPFL
  38. ZERO=0.D0
  39. C
  40. C SEE IF THE ENTERING VARIABLE IS RESTRICTING THE STEP LENGTH
  41. C BECAUSE OF AN UPPER BOUND.
  42. FINITE=.FALSE.
  43. J=IBASIS(IENTER)
  44. IF (.NOT.(IND(J).EQ.3)) GO TO 20002
  45. THETA=BU(J)-BL(J)
  46. IF(J.LE.NVARS)THETA=THETA/CSC(J)
  47. FINITE=.TRUE.
  48. ILEAVE=IENTER
  49. C
  50. C NOW USE THE BASIC VARIABLES TO POSSIBLY RESTRICT THE STEP
  51. C LENGTH EVEN FURTHER.
  52. 20002 I=1
  53. N20005=MRELAS
  54. GO TO 20006
  55. 20005 I=I+1
  56. 20006 IF ((N20005-I).LT.0) GO TO 20007
  57. J=IBASIS(I)
  58. C
  59. C IF THIS IS A FREE VARIABLE, DO NOT USE IT TO
  60. C RESTRICT THE STEP LENGTH.
  61. IF (.NOT.(IND(J).EQ.4)) GO TO 20009
  62. GO TO 20005
  63. C
  64. C IF DIRECTION COMPONENT IS ABOUT ZERO, IGNORE IT FOR COMPUTING
  65. C THE STEP LENGTH.
  66. 20009 IF (.NOT.(ABS(WW(I)).LE.DIRNRM*ERP(I))) GO TO 20012
  67. GO TO 20005
  68. 20012 IF (.NOT.(WW(I).GT.ZERO)) GO TO 20015
  69. C
  70. C IF RPRIM(I) IS ESSENTIALLY ZERO, SET RATIO TO ZERO AND EXIT LOOP.
  71. IF (.NOT.(ABS(RPRIM(I)).LE.RPRNRM*ERP(I))) GO TO 20018
  72. THETA=ZERO
  73. ILEAVE=I
  74. FINITE=.TRUE.
  75. GO TO 20008
  76. C
  77. C THE VALUE OF RPRIM(I) WILL DECREASE ONLY TO ITS LOWER BOUND OR
  78. C ONLY TO ITS UPPER BOUND. IF IT DECREASES TO ITS
  79. C UPPER BOUND, THEN RPRIM(I) HAS ALREADY BEEN TRANSLATED
  80. C TO ITS UPPER BOUND AND NOTHING NEEDS TO BE DONE TO IBB(J).
  81. 20018 IF (.NOT.(RPRIM(I).GT.ZERO)) GO TO 10001
  82. RATIO=RPRIM(I)/WW(I)
  83. IF (.NOT.(.NOT.FINITE)) GO TO 20021
  84. ILEAVE=I
  85. THETA=RATIO
  86. FINITE=.TRUE.
  87. GO TO 20022
  88. 20021 IF (.NOT.(RATIO.LT.THETA)) GO TO 10002
  89. ILEAVE=I
  90. THETA=RATIO
  91. 10002 CONTINUE
  92. 20022 CONTINUE
  93. GO TO 20019
  94. C
  95. C THE VALUE RPRIM(I).LT.ZERO WILL NOT RESTRICT THE STEP.
  96. 10001 CONTINUE
  97. C
  98. C THE DIRECTION COMPONENT IS NEGATIVE, THEREFORE THE VARIABLE WILL
  99. C INCREASE.
  100. 20019 GO TO 20016
  101. C
  102. C IF THE VARIABLE IS LESS THAN ITS LOWER BOUND, IT CAN
  103. C INCREASE ONLY TO ITS LOWER BOUND.
  104. 20015 IF (.NOT.(PRIMAL(I+NVARS).LT.ZERO)) GO TO 20024
  105. RATIO=RPRIM(I)/WW(I)
  106. IF (RATIO.LT.ZERO) RATIO=ZERO
  107. IF (.NOT.(.NOT.FINITE)) GO TO 20027
  108. ILEAVE=I
  109. THETA=RATIO
  110. FINITE=.TRUE.
  111. GO TO 20028
  112. 20027 IF (.NOT.(RATIO.LT.THETA)) GO TO 10003
  113. ILEAVE=I
  114. THETA=RATIO
  115. 10003 CONTINUE
  116. 20028 CONTINUE
  117. C
  118. C IF THE BASIC VARIABLE IS FEASIBLE AND IS NOT AT ITS UPPER BOUND,
  119. C THEN IT CAN INCREASE TO ITS UPPER BOUND.
  120. GO TO 20025
  121. 20024 IF (.NOT.(IND(J).EQ.3 .AND. PRIMAL(I+NVARS).EQ.ZERO)) GO TO 10004
  122. BOUND=BU(J)-BL(J)
  123. IF(J.LE.NVARS) BOUND=BOUND/CSC(J)
  124. RATIO=(BOUND-RPRIM(I))/(-WW(I))
  125. IF (.NOT.(.NOT.FINITE)) GO TO 20030
  126. ILEAVE=-I
  127. THETA=RATIO
  128. FINITE=.TRUE.
  129. GO TO 20031
  130. 20030 IF (.NOT.(RATIO.LT.THETA)) GO TO 10005
  131. ILEAVE=-I
  132. THETA=RATIO
  133. 10005 CONTINUE
  134. 20031 CONTINUE
  135. CONTINUE
  136. 10004 CONTINUE
  137. 20025 CONTINUE
  138. 20016 GO TO 20005
  139. 20007 CONTINUE
  140. C
  141. C IF STEP LENGTH IS FINITE, SEE IF STEP LENGTH IS ABOUT ZERO.
  142. 20008 IF (.NOT.(FINITE)) GO TO 20033
  143. ZEROLV=.TRUE.
  144. I=1
  145. N20036=MRELAS
  146. GO TO 20037
  147. 20036 I=I+1
  148. 20037 IF ((N20036-I).LT.0) GO TO 20038
  149. ZEROLV=ZEROLV.AND. ABS(THETA*WW(I)).LE.ERP(I)*RPRNRM
  150. IF (.NOT.(.NOT. ZEROLV)) GO TO 20040
  151. GO TO 20039
  152. 20040 GO TO 20036
  153. 20038 CONTINUE
  154. 20039 CONTINUE
  155. 20033 CONTINUE
  156. RETURN
  157. END