OpenLibm/slatec/dplpfe.f
Viral B. Shah c977aa998f Add Makefile.extras to build libopenlibm-extras.
Replace amos with slatec
2012-12-31 16:37:05 -05:00

164 lines
4.9 KiB
Fortran

*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