dplpfe.f 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. *DECK DPLPFE
  2. SUBROUTINE DPLPFE (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 DPLPFE
  7. C***SUBSIDIARY
  8. C***PURPOSE Subsidiary to DSPLP
  9. C***LIBRARY SLATEC
  10. C***TYPE DOUBLE 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 DSPLP( ) 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 DSPLP
  28. C***ROUTINES CALLED DASUM, DCOPY, DPRWPG, IDLOC, LA05BD
  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 890606 Changed references from IPLOC to IDLOC. (WRB)
  34. C 891214 Prologue converted to Version 4.0 format. (BAB)
  35. C 900328 Added TYPE section. (WRB)
  36. C***END PROLOGUE DPLPFE
  37. INTEGER IBASIS(*),IMAT(*),IBRC(LBM,2),IPR(*),IWR(*),IND(*),IBB(*)
  38. DOUBLE PRECISION AMAT(*),BASMAT(*),CSC(*),WR(*),WW(*),BL(*),BU(*),
  39. * RZ(*),RG(*),COLNRM(*),DUALS(*),CNORM,DIRNRM,DULNRM,EPS,ERDNRM,GG,
  40. * ONE,RATIO,RCOST,RMAX,ZERO
  41. DOUBLE PRECISION DASUM
  42. LOGICAL FOUND,TRANS
  43. C***FIRST EXECUTABLE STATEMENT DPLPFE
  44. LPG=LMX-(NVARS+4)
  45. ZERO=0.D0
  46. ONE=1.D0
  47. RMAX=ZERO
  48. FOUND=.FALSE.
  49. I=MRELAS+1
  50. N20002=MRELAS+NVARS
  51. GO TO 20003
  52. 20002 I=I+1
  53. 20003 IF ((N20002-I).LT.0) GO TO 20004
  54. J=IBASIS(I)
  55. C
  56. C IF J=IBASIS(I) .LT. 0 THEN THE VARIABLE LEFT AT A ZERO LEVEL
  57. C AND IS NOT CONSIDERED AS A CANDIDATE TO ENTER.
  58. IF (.NOT.(J.GT.0)) GO TO 20006
  59. C
  60. C DO NOT CONSIDER VARIABLES CORRESPONDING TO UNBOUNDED STEP LENGTHS.
  61. IF (.NOT.(IBB(J).EQ.0)) GO TO 20009
  62. GO TO 20002
  63. 20009 CONTINUE
  64. C
  65. C IF A VARIABLE CORRESPONDS TO AN EQUATION(IND=3 AND BL=BU),
  66. C THEN DO NOT CONSIDER IT AS A CANDIDATE TO ENTER.
  67. IF (.NOT.(IND(J).EQ.3)) GO TO 20012
  68. IF (.NOT.((BU(J)-BL(J)).LE.EPS*(ABS(BL(J))+ABS(BU(J)))))
  69. *GO TO 20015
  70. GO TO 20002
  71. 20015 CONTINUE
  72. CONTINUE
  73. 20012 CONTINUE
  74. RCOST=RZ(J)
  75. C
  76. C IF VARIABLE IS AT UPPER BOUND IT CAN ONLY DECREASE. THIS
  77. C ACCOUNTS FOR THE POSSIBLE CHANGE OF SIGN.
  78. IF(MOD(IBB(J),2).EQ.0) RCOST=-RCOST
  79. C
  80. C IF THE VARIABLE IS FREE, USE THE NEGATIVE MAGNITUDE OF THE
  81. C REDUCED COST FOR THAT VARIABLE.
  82. IF(IND(J).EQ.4) RCOST=-ABS(RCOST)
  83. CNORM=ONE
  84. IF(J.LE.NVARS)CNORM=COLNRM(J)
  85. C
  86. C TEST FOR NEGATIVITY OF REDUCED COSTS.
  87. IF (.NOT.(RCOST+ERDNRM*DULNRM*CNORM.LT.ZERO)) GO TO 20018
  88. FOUND=.TRUE.
  89. RATIO=RCOST**2/RG(J)
  90. IF (.NOT.(RATIO.GT.RMAX)) GO TO 20021
  91. RMAX=RATIO
  92. IENTER=I
  93. 20021 CONTINUE
  94. CONTINUE
  95. 20018 CONTINUE
  96. CONTINUE
  97. 20006 GO TO 20002
  98. C
  99. C USE COL. CHOSEN TO COMPUTE SEARCH DIRECTION.
  100. 20004 IF (.NOT.(FOUND)) GO TO 20024
  101. J=IBASIS(IENTER)
  102. WW(1)=ZERO
  103. CALL DCOPY(MRELAS,WW,0,WW,1)
  104. IF (.NOT.(J.LE.NVARS)) GO TO 20027
  105. IF (.NOT.(J.EQ.1)) GO TO 20030
  106. ILOW=NVARS+5
  107. GO TO 20031
  108. 20030 ILOW=IMAT(J+3)+1
  109. 20031 CONTINUE
  110. IL1=IDLOC(ILOW,AMAT,IMAT)
  111. IF (.NOT.(IL1.GE.LMX-1)) GO TO 20033
  112. ILOW=ILOW+2
  113. IL1=IDLOC(ILOW,AMAT,IMAT)
  114. 20033 CONTINUE
  115. IPAGE=ABS(IMAT(LMX-1))
  116. IHI=IMAT(J+4)-(ILOW-IL1)
  117. 20036 IU1=MIN(LMX-2,IHI)
  118. IF (.NOT.(IL1.GT.IU1)) GO TO 20038
  119. GO TO 20037
  120. 20038 CONTINUE
  121. DO 30 I=IL1,IU1
  122. WW(IMAT(I))=AMAT(I)*CSC(J)
  123. 30 CONTINUE
  124. IF (.NOT.(IHI.LE.LMX-2)) GO TO 20041
  125. GO TO 20037
  126. 20041 CONTINUE
  127. IPAGE=IPAGE+1
  128. KEY=1
  129. CALL DPRWPG(KEY,IPAGE,LPG,AMAT,IMAT)
  130. IL1=NVARS+5
  131. IHI=IHI-LPG
  132. GO TO 20036
  133. 20037 GO TO 20028
  134. 20027 IF (.NOT.(IND(J).EQ.2)) GO TO 20044
  135. WW(J-NVARS)=ONE
  136. GO TO 20045
  137. 20044 WW(J-NVARS)=-ONE
  138. 20045 CONTINUE
  139. CONTINUE
  140. C
  141. C COMPUTE SEARCH DIRECTION.
  142. 20028 TRANS=.FALSE.
  143. CALL LA05BD(BASMAT,IBRC,LBM,MRELAS,IPR,IWR,WR,GG,WW,TRANS)
  144. C
  145. C THE SEARCH DIRECTION REQUIRES THE FOLLOWING SIGN CHANGE IF EITHER
  146. C VARIABLE ENTERING IS AT ITS UPPER BOUND OR IS FREE AND HAS
  147. C POSITIVE REDUCED COST.
  148. IF (.NOT.(MOD(IBB(J),2).EQ.0.OR.(IND(J).EQ.4 .AND. RZ(J).GT.ZERO))
  149. *) GO TO 20047
  150. I=1
  151. N20050=MRELAS
  152. GO TO 20051
  153. 20050 I=I+1
  154. 20051 IF ((N20050-I).LT.0) GO TO 20052
  155. WW(I)=-WW(I)
  156. GO TO 20050
  157. 20052 CONTINUE
  158. 20047 DIRNRM=DASUM(MRELAS,WW,1)
  159. C
  160. C COPY CONTENTS OF WR(*) TO DUALS(*) FOR USE IN
  161. C ADD-DROP (EXCHANGE) STEP, LA05CD( ).
  162. CALL DCOPY(MRELAS,WR,1,DUALS,1)
  163. 20024 RETURN
  164. END