diff options
| author | stainer_t <thomas.stainer@oecd-nea.org> | 2025-09-08 13:48:49 +0200 |
|---|---|---|
| committer | stainer_t <thomas.stainer@oecd-nea.org> | 2025-09-08 13:48:49 +0200 |
| commit | 7dfcc480ba1e19bd3232349fc733caef94034292 (patch) | |
| tree | 03ee104eb8846d5cc1a981d267687a729185d3f3 /Donjon/src/PLDRV.f | |
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Donjon/src/PLDRV.f')
| -rw-r--r-- | Donjon/src/PLDRV.f | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/Donjon/src/PLDRV.f b/Donjon/src/PLDRV.f new file mode 100644 index 0000000..7b75d2a --- /dev/null +++ b/Donjon/src/PLDRV.f @@ -0,0 +1,190 @@ +*DECK PLDRV + SUBROUTINE PLDRV(IPOPT,N0,NCST,M0,MINMAX,IMTHD,FCOST,XOBJ,PDG, + > GRAD,INEGAL,CONTR,DINF,DSUP,XDROIT,EPSIM,IMPR,IERR) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Prepares the different matrices for the resolution of a linear +* optimisation problem with a quadratic constraint. The different +* available methods are the MAP technique, the lemke, the augmented- +* Lagrangian and the penalty function. +* PLDRV = Linear Programmation DRiVer for options +* +*Copyright: +* Copyright (C) 2002 Ecole Polytechnique de Montreal +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version +* +*Author(s): +* A. Hebert and R. Chambon +* +*Parameters: input +* IPOPT pointer to the L_OPTIMIZE object. +* N0 number of control variables. +* NCST number of constraints. +* M0 number of constraints plus the number of lower/upper bounds +* intercepting the quadratic constraint. +* MINMAX type of optimization (=-1: minimize; =1: maximize). +* IMTHD type of solution (=1: SIMPLEX/LEMKE; =2: LEMKE/LEMKE; +* =3: MAP; =4: Augmented Lagragian; =5: External penalty +* funnction). +* FCOST objective function. +* XOBJ control variables. +* PDG weights assigned to control variables in the quadratic +* constraint. +* GRAD linearized gradients (GRAD(:,1) are control variable costs +* and GRAD(:,2:NCST+1) are linear constraint coefficients). +* INEGAL constraint relations (=-1 for .GE.; =0 for .EQ.; =1 for .LE.). +* CONTR constraint right hand sides. +* DINF lower bounds of control variables. +* DSUP upper bounds of control variables. +* XDROIT quadratic constraint radius squared. +* EPSIM tolerence used for inner linear LEMKE or SIMPLEX calculation. +* IMPR print flag. +* +*Parameters: ouput +* IERR return code (=0: normal completion). +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPOPT + INTEGER N0,NCST,M0,MINMAX,IMTHD,INEGAL(NCST),IMPR,IERR + DOUBLE PRECISION FCOST,XOBJ(N0),PDG(N0),GRAD(N0,NCST+1), + > CONTR(NCST),DINF(N0),DSUP(N0),XDROIT,EPSIM +*---- +* LOCAL VARIABLES +*---- + INTEGER ME,MI,I,J,NPM + DOUBLE PRECISION XX + CHARACTER CLNAME*6 + INTEGER, ALLOCATABLE, DIMENSION(:) :: INPLUS + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: BPLUS,GF + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: APLUS +*---- +* DATA STATEMENTS +*---- + DATA CLNAME /'PLDRV'/ +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(INPLUS(M0+1)) + ALLOCATE(BPLUS(M0+2),GF(N0),APLUS(M0+2,(M0+1)+N0)) +*---- +* SET COSTS OF CONTROL VARIABLES +*---- + DO 10 I=1,N0 + GF(I)=GRAD(I,1)*REAL(MINMAX) + 10 CONTINUE +*---- +* ORGANIZE TABLES APLUS AND BPLUS FOR EQUALITY CONSTRAINTS +*---- + ME=0 + DO 30 I=1,NCST + IF(INEGAL(I).EQ.0) THEN + ME = ME + 1 + DO 20 J=1,N0 + APLUS(ME,J) = GRAD(J,I+1) + 20 CONTINUE + BPLUS(ME) = CONTR(I) + INPLUS(ME) = 0 + ENDIF + 30 CONTINUE +*---- +* ORGANIZE TABLES APLUS AND BPLUS FOR INEQUALITY CONSTRAINTS +*---- + MI=0 + DO 50 I=1,NCST + IF(INEGAL(I).NE.0) THEN + MI = MI + 1 + DO 40 J=1,N0 + APLUS(ME+MI,J) = GRAD(J,I+1) + 40 CONTINUE + BPLUS(ME+MI) = CONTR(I) + INPLUS(ME+MI) = INEGAL(I) + ENDIF + 50 CONTINUE +*---- +* ORGANIZE TABLES APLUS AND BPLUS FOR CONTROL-VARIABLE BOUNDS +*---- + DO 80 I=1,N0 + XX = SQRT(XDROIT/PDG(I)) + IF(DINF(I).GT.-XX) THEN + MI = MI + 1 + DO 60 J=1,N0 + APLUS(ME+MI,J) = 0.0D0 + 60 CONTINUE + APLUS(ME+MI,I) = 1.0D0 + BPLUS(ME+MI) = DINF(I) + INPLUS(ME+MI) = -1 + ENDIF + IF(DSUP(I).LT.XX) THEN + MI = MI + 1 + DO 70 J=1,N0 + APLUS(ME+MI,J) = 0.0D0 + 70 CONTINUE + APLUS(ME+MI,I) = 1.0D0 + BPLUS(ME+MI) = DSUP(I) + INPLUS(ME+MI) = 1 + ENDIF + 80 CONTINUE +* + DO 90 J=1,N0 + APLUS(M0+1,J) = 0.0D0 + 90 CONTINUE + BPLUS(M0+1) = 0.0D0 + INPLUS(M0+1) = 0 +* + IF(M0.NE.ME+MI) THEN + WRITE (6,1000) M0,ME,MI + CALL XABORT('PLDRV: M0 AND ME+MI ARE NOT THE SAME') + ENDIF +*---- +* PRINT THE QUASILINEAR PROBLEM +*---- + IF(IMPR.GE.5) THEN + CALL PLNTAB(GF,APLUS,INPLUS,BPLUS,PDG,DINF,DSUP,N0,M0, + > CLNAME) + ENDIF +*---- +* LEMKE METHOD +*---- + NPM=(M0+1)+N0 + IF(IMTHD.LE.2) THEN + CALL PLMAP2(N0,M0,APLUS,PDG,BPLUS,INPLUS,XDROIT,GF,FCOST,XOBJ, + 1 IMTHD,EPSIM,IMPR,IERR) +*---- +* MAP +*---- + ELSE IF(IMTHD.EQ.3) THEN + CALL PLMAP1(N0,M0,APLUS,PDG,BPLUS,INPLUS,XDROIT,GF,FCOST, + 1 XOBJ,IMTHD,IMPR,IERR) +*---- +* AUGMENTED LAGRANGIAN +*---- + ELSE IF(IMTHD.EQ.4) THEN + CALL PLLA(IPOPT,N0,M0,APLUS,PDG,BPLUS,INPLUS,XDROIT, + 1 FCOST,GF,XOBJ,IMPR,EPSIM,NCST,GRAD,CONTR,INEGAL,IERR) +*---- +* EXTERNAL PENALTY METHOD +*---- + ELSE IF(IMTHD.EQ.5) THEN + CALL PLPNLT(IPOPT,N0,M0,APLUS,PDG,BPLUS,INPLUS,XDROIT, + 1 FCOST,GF,XOBJ,IMPR,EPSIM,NCST,GRAD,CONTR,INEGAL,IERR) + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(APLUS,GF,BPLUS) + DEALLOCATE(INPLUS) + RETURN +* +1000 FORMAT(/' PLDRV: INCONSISTENCY BETWEEN M0 AND ME+MI ',3I5) + END |
