mirror of
https://git.planet-casio.com/Lephenixnoir/OpenLibm.git
synced 2025-01-01 06:23:39 +01:00
c977aa998f
Replace amos with slatec
159 lines
4.7 KiB
Fortran
159 lines
4.7 KiB
Fortran
*DECK SPLPFE
|
|
SUBROUTINE SPLPFE (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 SPLPFE
|
|
C***SUBSIDIARY
|
|
C***PURPOSE Subsidiary to SPLP
|
|
C***LIBRARY SLATEC
|
|
C***TYPE SINGLE 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 SPLP( ) 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 SPLP
|
|
C***ROUTINES CALLED IPLOC, LA05BS, PRWPGE, SASUM, SCOPY
|
|
C***REVISION HISTORY (YYMMDD)
|
|
C 811215 DATE WRITTEN
|
|
C 890531 Changed all specific intrinsics to generic. (WRB)
|
|
C 890605 Removed unreferenced labels. (WRB)
|
|
C 891214 Prologue converted to Version 4.0 format. (BAB)
|
|
C 900328 Added TYPE section. (WRB)
|
|
C***END PROLOGUE SPLPFE
|
|
INTEGER IBASIS(*),IMAT(*),IBRC(LBM,2),IPR(*),IWR(*),IND(*),IBB(*)
|
|
REAL AMAT(*),BASMAT(*),CSC(*),WR(*),WW(*),BL(*),BU(*),
|
|
* RZ(*),RG(*),COLNRM(*),DUALS(*),CNORM,DIRNRM,DULNRM,EPS,ERDNRM,GG,
|
|
* ONE,RATIO,RCOST,RMAX,ZERO
|
|
LOGICAL FOUND,TRANS
|
|
C***FIRST EXECUTABLE STATEMENT SPLPFE
|
|
LPG=LMX-(NVARS+4)
|
|
ZERO=0.E0
|
|
ONE=1.E0
|
|
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 200
|
|
*15
|
|
GO TO 20002
|
|
20015 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
|
|
20018 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 SCOPY(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=IPLOC(ILOW,AMAT,IMAT)
|
|
IF (.NOT.(IL1.GE.LMX-1)) GO TO 20033
|
|
ILOW=ILOW+2
|
|
IL1=IPLOC(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 PRWPGE(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 LA05BS(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=SASUM(MRELAS,WW,1)
|
|
C
|
|
C COPY CONTENTS OF WR(*) TO DUALS(*) FOR USE IN
|
|
C ADD-DROP (EXCHANGE) STEP, LA05CS( ).
|
|
CALL SCOPY(MRELAS,WR,1,DUALS,1)
|
|
20024 RETURN
|
|
END
|