splpfe.f 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. *DECK SPLPFE
  2. SUBROUTINE SPLPFE (MRELAS, NVARS, LMX, LBM, IENTER, IBASIS, IMAT,
  3. + IBRC, IPR, IWR, IND, IBB, ERDNRM, EPS, GG, DULNRM, DIRNRM,
  4. + AMAT, BASMAT, CSC, WR, WW, BL, BU, RZ, RG, COLNRM, DUALS,
  5. + FOUND)
  6. C***BEGIN PROLOGUE SPLPFE
  7. C***SUBSIDIARY
  8. C***PURPOSE Subsidiary to SPLP
  9. C***LIBRARY SLATEC
  10. C***TYPE SINGLE PRECISION (SPLPFE-S, DPLPFE-D)
  11. C***AUTHOR (UNKNOWN)
  12. C***DESCRIPTION
  13. C
  14. C THE EDITING REQUIRED TO CONVERT THIS SUBROUTINE FROM SINGLE TO
  15. C DOUBLE PRECISION INVOLVES THE FOLLOWING CHARACTER STRING CHANGES.
  16. C
  17. C USE AN EDITING COMMAND (CHANGE) /STRING-1/(TO)STRING-2/.
  18. C /REAL (12 BLANKS)/DOUBLE PRECISION/,/SASUM/DASUM/,
  19. C /SCOPY/DCOPY/.
  20. C
  21. C THIS SUBPROGRAM IS PART OF THE SPLP( ) PACKAGE.
  22. C IT IMPLEMENTS THE PROCEDURE (FIND VARIABLE TO ENTER BASIS
  23. C AND GET SEARCH DIRECTION).
  24. C REVISED 811130-1100
  25. C REVISED YYMMDD-HHMM
  26. C
  27. C***SEE ALSO SPLP
  28. C***ROUTINES CALLED IPLOC, LA05BS, PRWPGE, SASUM, SCOPY
  29. C***REVISION HISTORY (YYMMDD)
  30. C 811215 DATE WRITTEN
  31. C 890531 Changed all specific intrinsics to generic. (WRB)
  32. C 890605 Removed unreferenced labels. (WRB)
  33. C 891214 Prologue converted to Version 4.0 format. (BAB)
  34. C 900328 Added TYPE section. (WRB)
  35. C***END PROLOGUE SPLPFE
  36. INTEGER IBASIS(*),IMAT(*),IBRC(LBM,2),IPR(*),IWR(*),IND(*),IBB(*)
  37. REAL AMAT(*),BASMAT(*),CSC(*),WR(*),WW(*),BL(*),BU(*),
  38. * RZ(*),RG(*),COLNRM(*),DUALS(*),CNORM,DIRNRM,DULNRM,EPS,ERDNRM,GG,
  39. * ONE,RATIO,RCOST,RMAX,ZERO
  40. LOGICAL FOUND,TRANS
  41. C***FIRST EXECUTABLE STATEMENT SPLPFE
  42. LPG=LMX-(NVARS+4)
  43. ZERO=0.E0
  44. ONE=1.E0
  45. RMAX=ZERO
  46. FOUND=.FALSE.
  47. I=MRELAS+1
  48. N20002=MRELAS+NVARS
  49. GO TO 20003
  50. 20002 I=I+1
  51. 20003 IF ((N20002-I).LT.0) GO TO 20004
  52. J=IBASIS(I)
  53. C
  54. C IF J=IBASIS(I) .LT. 0 THEN THE VARIABLE LEFT AT A ZERO LEVEL
  55. C AND IS NOT CONSIDERED AS A CANDIDATE TO ENTER.
  56. IF (.NOT.(J.GT.0)) GO TO 20006
  57. C
  58. C DO NOT CONSIDER VARIABLES CORRESPONDING TO UNBOUNDED STEP LENGTHS.
  59. IF (.NOT.(IBB(J).EQ.0)) GO TO 20009
  60. GO TO 20002
  61. 20009 CONTINUE
  62. C
  63. C IF A VARIABLE CORRESPONDS TO AN EQUATION(IND=3 AND BL=BU),
  64. C THEN DO NOT CONSIDER IT AS A CANDIDATE TO ENTER.
  65. IF (.NOT.(IND(J).EQ.3)) GO TO 20012
  66. IF (.NOT.((BU(J)-BL(J)).LE.EPS*(ABS(BL(J))+ABS(BU(J))))) GO TO 200
  67. *15
  68. GO TO 20002
  69. 20015 CONTINUE
  70. 20012 CONTINUE
  71. RCOST=RZ(J)
  72. C
  73. C IF VARIABLE IS AT UPPER BOUND IT CAN ONLY DECREASE. THIS
  74. C ACCOUNTS FOR THE POSSIBLE CHANGE OF SIGN.
  75. IF(MOD(IBB(J),2).EQ.0) RCOST=-RCOST
  76. C
  77. C IF THE VARIABLE IS FREE, USE THE NEGATIVE MAGNITUDE OF THE
  78. C REDUCED COST FOR THAT VARIABLE.
  79. IF(IND(J).EQ.4) RCOST=-ABS(RCOST)
  80. CNORM=ONE
  81. IF(J.LE.NVARS)CNORM=COLNRM(J)
  82. C
  83. C TEST FOR NEGATIVITY OF REDUCED COSTS.
  84. IF (.NOT.(RCOST+ERDNRM*DULNRM*CNORM.LT.ZERO)) GO TO 20018
  85. FOUND=.TRUE.
  86. RATIO=RCOST**2/RG(J)
  87. IF (.NOT.(RATIO.GT.RMAX)) GO TO 20021
  88. RMAX=RATIO
  89. IENTER=I
  90. 20021 CONTINUE
  91. 20018 CONTINUE
  92. 20006 GO TO 20002
  93. C
  94. C USE COL. CHOSEN TO COMPUTE SEARCH DIRECTION.
  95. 20004 IF (.NOT.(FOUND)) GO TO 20024
  96. J=IBASIS(IENTER)
  97. WW(1)=ZERO
  98. CALL SCOPY(MRELAS,WW,0,WW,1)
  99. IF (.NOT.(J.LE.NVARS)) GO TO 20027
  100. IF (.NOT.(J.EQ.1)) GO TO 20030
  101. ILOW=NVARS+5
  102. GO TO 20031
  103. 20030 ILOW=IMAT(J+3)+1
  104. 20031 CONTINUE
  105. IL1=IPLOC(ILOW,AMAT,IMAT)
  106. IF (.NOT.(IL1.GE.LMX-1)) GO TO 20033
  107. ILOW=ILOW+2
  108. IL1=IPLOC(ILOW,AMAT,IMAT)
  109. 20033 CONTINUE
  110. IPAGE=ABS(IMAT(LMX-1))
  111. IHI=IMAT(J+4)-(ILOW-IL1)
  112. 20036 IU1=MIN(LMX-2,IHI)
  113. IF (.NOT.(IL1.GT.IU1)) GO TO 20038
  114. GO TO 20037
  115. 20038 CONTINUE
  116. DO 30 I=IL1,IU1
  117. WW(IMAT(I))=AMAT(I)*CSC(J)
  118. 30 CONTINUE
  119. IF (.NOT.(IHI.LE.LMX-2)) GO TO 20041
  120. GO TO 20037
  121. 20041 CONTINUE
  122. IPAGE=IPAGE+1
  123. KEY=1
  124. CALL PRWPGE(KEY,IPAGE,LPG,AMAT,IMAT)
  125. IL1=NVARS+5
  126. IHI=IHI-LPG
  127. GO TO 20036
  128. 20037 GO TO 20028
  129. 20027 IF (.NOT.(IND(J).EQ.2)) GO TO 20044
  130. WW(J-NVARS)=ONE
  131. GO TO 20045
  132. 20044 WW(J-NVARS)=-ONE
  133. 20045 CONTINUE
  134. CONTINUE
  135. C
  136. C COMPUTE SEARCH DIRECTION.
  137. 20028 TRANS=.FALSE.
  138. CALL LA05BS(BASMAT,IBRC,LBM,MRELAS,IPR,IWR,WR,GG,WW,TRANS)
  139. C
  140. C THE SEARCH DIRECTION REQUIRES THE FOLLOWING SIGN CHANGE IF EITHER
  141. C VARIABLE ENTERING IS AT ITS UPPER BOUND OR IS FREE AND HAS
  142. C POSITIVE REDUCED COST.
  143. IF (.NOT.(MOD(IBB(J),2).EQ.0.OR.(IND(J).EQ.4 .AND. RZ(J).GT.ZERO))
  144. *) GO TO 20047
  145. I=1
  146. N20050=MRELAS
  147. GO TO 20051
  148. 20050 I=I+1
  149. 20051 IF ((N20050-I).LT.0) GO TO 20052
  150. WW(I)=-WW(I)
  151. GO TO 20050
  152. 20052 CONTINUE
  153. 20047 DIRNRM=SASUM(MRELAS,WW,1)
  154. C
  155. C COPY CONTENTS OF WR(*) TO DUALS(*) FOR USE IN
  156. C ADD-DROP (EXCHANGE) STEP, LA05CS( ).
  157. CALL SCOPY(MRELAS,WR,1,DUALS,1)
  158. 20024 RETURN
  159. END