123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- *DECK DPLPFE
- SUBROUTINE DPLPFE (MRELAS, NVARS, LMX, LBM, IENTER, IBASIS, IMAT,
- + IBRC, IPR, IWR, IND, IBB, ERDNRM, EPS, GG, DULNRM, DIRNRM,
- + AMAT, BASMAT, CSC, WR, WW, BL, BU, RZ, RG, COLNRM, DUALS,
- + FOUND)
- C***BEGIN PROLOGUE DPLPFE
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to DSPLP
- C***LIBRARY SLATEC
- C***TYPE DOUBLE PRECISION (SPLPFE-S, DPLPFE-D)
- C***AUTHOR (UNKNOWN)
- C***DESCRIPTION
- C
- C THE EDITING REQUIRED TO CONVERT THIS SUBROUTINE FROM SINGLE TO
- C DOUBLE PRECISION INVOLVES THE FOLLOWING CHARACTER STRING CHANGES.
- C
- C USE AN EDITING COMMAND (CHANGE) /STRING-1/(TO)STRING-2/.
- C /REAL (12 BLANKS)/DOUBLE PRECISION/,/SASUM/DASUM/,
- C /SCOPY/DCOPY/.
- C
- C THIS SUBPROGRAM IS PART OF THE DSPLP( ) PACKAGE.
- C IT IMPLEMENTS THE PROCEDURE (FIND VARIABLE TO ENTER BASIS
- C AND GET SEARCH DIRECTION).
- C REVISED 811130-1100
- C REVISED YYMMDD-HHMM
- C
- C***SEE ALSO DSPLP
- C***ROUTINES CALLED DASUM, DCOPY, DPRWPG, IDLOC, LA05BD
- C***REVISION HISTORY (YYMMDD)
- C 811215 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890605 Removed unreferenced labels. (WRB)
- C 890606 Changed references from IPLOC to IDLOC. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900328 Added TYPE section. (WRB)
- C***END PROLOGUE DPLPFE
- INTEGER IBASIS(*),IMAT(*),IBRC(LBM,2),IPR(*),IWR(*),IND(*),IBB(*)
- DOUBLE PRECISION AMAT(*),BASMAT(*),CSC(*),WR(*),WW(*),BL(*),BU(*),
- * RZ(*),RG(*),COLNRM(*),DUALS(*),CNORM,DIRNRM,DULNRM,EPS,ERDNRM,GG,
- * ONE,RATIO,RCOST,RMAX,ZERO
- DOUBLE PRECISION DASUM
- LOGICAL FOUND,TRANS
- C***FIRST EXECUTABLE STATEMENT DPLPFE
- LPG=LMX-(NVARS+4)
- ZERO=0.D0
- ONE=1.D0
- RMAX=ZERO
- FOUND=.FALSE.
- I=MRELAS+1
- N20002=MRELAS+NVARS
- GO TO 20003
- 20002 I=I+1
- 20003 IF ((N20002-I).LT.0) GO TO 20004
- J=IBASIS(I)
- C
- C IF J=IBASIS(I) .LT. 0 THEN THE VARIABLE LEFT AT A ZERO LEVEL
- C AND IS NOT CONSIDERED AS A CANDIDATE TO ENTER.
- IF (.NOT.(J.GT.0)) GO TO 20006
- C
- C DO NOT CONSIDER VARIABLES CORRESPONDING TO UNBOUNDED STEP LENGTHS.
- IF (.NOT.(IBB(J).EQ.0)) GO TO 20009
- GO TO 20002
- 20009 CONTINUE
- C
- C IF A VARIABLE CORRESPONDS TO AN EQUATION(IND=3 AND BL=BU),
- C THEN DO NOT CONSIDER IT AS A CANDIDATE TO ENTER.
- IF (.NOT.(IND(J).EQ.3)) GO TO 20012
- IF (.NOT.((BU(J)-BL(J)).LE.EPS*(ABS(BL(J))+ABS(BU(J)))))
- *GO TO 20015
- GO TO 20002
- 20015 CONTINUE
- CONTINUE
- 20012 CONTINUE
- RCOST=RZ(J)
- C
- C IF VARIABLE IS AT UPPER BOUND IT CAN ONLY DECREASE. THIS
- C ACCOUNTS FOR THE POSSIBLE CHANGE OF SIGN.
- IF(MOD(IBB(J),2).EQ.0) RCOST=-RCOST
- C
- C IF THE VARIABLE IS FREE, USE THE NEGATIVE MAGNITUDE OF THE
- C REDUCED COST FOR THAT VARIABLE.
- IF(IND(J).EQ.4) RCOST=-ABS(RCOST)
- CNORM=ONE
- IF(J.LE.NVARS)CNORM=COLNRM(J)
- C
- C TEST FOR NEGATIVITY OF REDUCED COSTS.
- IF (.NOT.(RCOST+ERDNRM*DULNRM*CNORM.LT.ZERO)) GO TO 20018
- FOUND=.TRUE.
- RATIO=RCOST**2/RG(J)
- IF (.NOT.(RATIO.GT.RMAX)) GO TO 20021
- RMAX=RATIO
- IENTER=I
- 20021 CONTINUE
- CONTINUE
- 20018 CONTINUE
- CONTINUE
- 20006 GO TO 20002
- C
- C USE COL. CHOSEN TO COMPUTE SEARCH DIRECTION.
- 20004 IF (.NOT.(FOUND)) GO TO 20024
- J=IBASIS(IENTER)
- WW(1)=ZERO
- CALL DCOPY(MRELAS,WW,0,WW,1)
- IF (.NOT.(J.LE.NVARS)) GO TO 20027
- IF (.NOT.(J.EQ.1)) GO TO 20030
- ILOW=NVARS+5
- GO TO 20031
- 20030 ILOW=IMAT(J+3)+1
- 20031 CONTINUE
- IL1=IDLOC(ILOW,AMAT,IMAT)
- IF (.NOT.(IL1.GE.LMX-1)) GO TO 20033
- ILOW=ILOW+2
- IL1=IDLOC(ILOW,AMAT,IMAT)
- 20033 CONTINUE
- IPAGE=ABS(IMAT(LMX-1))
- IHI=IMAT(J+4)-(ILOW-IL1)
- 20036 IU1=MIN(LMX-2,IHI)
- IF (.NOT.(IL1.GT.IU1)) GO TO 20038
- GO TO 20037
- 20038 CONTINUE
- DO 30 I=IL1,IU1
- WW(IMAT(I))=AMAT(I)*CSC(J)
- 30 CONTINUE
- IF (.NOT.(IHI.LE.LMX-2)) GO TO 20041
- GO TO 20037
- 20041 CONTINUE
- IPAGE=IPAGE+1
- KEY=1
- CALL DPRWPG(KEY,IPAGE,LPG,AMAT,IMAT)
- IL1=NVARS+5
- IHI=IHI-LPG
- GO TO 20036
- 20037 GO TO 20028
- 20027 IF (.NOT.(IND(J).EQ.2)) GO TO 20044
- WW(J-NVARS)=ONE
- GO TO 20045
- 20044 WW(J-NVARS)=-ONE
- 20045 CONTINUE
- CONTINUE
- C
- C COMPUTE SEARCH DIRECTION.
- 20028 TRANS=.FALSE.
- CALL LA05BD(BASMAT,IBRC,LBM,MRELAS,IPR,IWR,WR,GG,WW,TRANS)
- C
- C THE SEARCH DIRECTION REQUIRES THE FOLLOWING SIGN CHANGE IF EITHER
- C VARIABLE ENTERING IS AT ITS UPPER BOUND OR IS FREE AND HAS
- C POSITIVE REDUCED COST.
- IF (.NOT.(MOD(IBB(J),2).EQ.0.OR.(IND(J).EQ.4 .AND. RZ(J).GT.ZERO))
- *) GO TO 20047
- I=1
- N20050=MRELAS
- GO TO 20051
- 20050 I=I+1
- 20051 IF ((N20050-I).LT.0) GO TO 20052
- WW(I)=-WW(I)
- GO TO 20050
- 20052 CONTINUE
- 20047 DIRNRM=DASUM(MRELAS,WW,1)
- C
- C COPY CONTENTS OF WR(*) TO DUALS(*) FOR USE IN
- C ADD-DROP (EXCHANGE) STEP, LA05CD( ).
- CALL DCOPY(MRELAS,WR,1,DUALS,1)
- 20024 RETURN
- END
|