mma
C MMA SOURCE FD218221 26/10/07 21:15:07 12662 SUBROUTINE MMA C Gestion de l'operateur MMA (Method of Moving Asymptotes) C C Effectue une iteration de la methode : C - transofrme le probleme d'optimisation complexe (non lineaire) C en un sous-probleme strictement convexe (MMASUB ou GCMMASUB) C - resout ce sous-probleme (SUBSOLVE) C Typages implicites habituels IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) C Les includes necessaires -INC PPARAM -INC CCOPTIO -INC CCREEL -INC SMLREEL -INC SMLOBJE -INC SMTABLE C N : nombre de variables du probleme d'optimisation C M : nombre de contraintes du probleme d'optimisation C NMAT : taille de la matrice du systeme lineaire dans SUBSOLVE C NMAT = MIN(N,M) + 1 C NR : taille du vecteur residu pour les conditions kkt C NR = 4M + 3N + 2 C Segment des tableaux de travail pour MMASUB SEGMENT KMMA REAL*8 XVAL(N),XMIN(N),XMAX(N),XOLD1(N),XOLD2(N) REAL*8 DF0DX(N),FVAL(M),DFDX(M,N),FAPP(M) REAL*8 LOW(N),UPP(N),ALFA(N),BETA(N) REAL*8 P0(N),Q0(N),P(M,N),Q(M,N),A(M),B(M),C(M),D(M) REAL*8 XMMA(N),YMMA(M),LAM(M),XSI(N),ETA(N),MU(M),S(M) ENDSEGMENT C Segment des tableaux de travail pour GCMMASUB SEGMENT KGCMMA REAL*8 RAA(M),RAAEPS(M),FVALNEW(M) ENDSEGMENT C Segment des tableaux de travail pour SUBSOLVE SEGMENT KSUB INTEGER IPIV(NMAT) REAL*8 XS(N), YS(M), LAMS(M), XSIS(N), ETAS(N), MUS(M), SS(M) REAL*8 DXS(N),DYS(M),DLAMS(M),DXSIS(N),DETAS(N),DMUS(M),DSS(M) REAL*8 XO(N), YO(M), LAMO(M), XSIO(N), ETAO(N), MUO(M), SO(M) REAL*8 PLAM(N),QLAM(N),GVEC(M),GG(M,N) REAL*8 DIAGX(N),DIAGXINV(N),DIAGY(M),DIAGYINV(M) REAL*8 DIAGLAM(M),DIAGLAMYI(M),DIAGLAMYIINV(M) REAL*8 DELX(N),DELY(M),DELLAM(M),DELLAMYI(M) REAL*8 AA(NMAT,NMAT),BB(NMAT) REAL*8 RESIDU(NR) ENDSEGMENT C Autres variables scalaires REAL*8 ZMMA,ZET,R0,F0APP,F0VALNEW C Indicateurs pour la GCMMA LOGICAL BGCMMA,BCONS INTEGER SSITER C Variables pour la lecture/ecriture dans les objets TABLE LOGICAL BIND,BVALE CHARACTER*1 MOTVAL CHARACTER*8 TYPE,MOT1 C Parametres de la methode REAL*8 MOVE,ALBEFA,RAA0,ASYINIT,ASYINCR,ASYDECR,ASYMIN,ASYMAX REAL*8 EPSIMIN C Listes des noms (MOTPAR1, MOTPAR2), des valeurs par defaut C (VAPDEF1, VAPDEF2) et des valeurs lues (VALPAR2) PARAMETER (NPAR1=4,NPAR2=9) CHARACTER*2 MOTPAR1(NPAR1) CHARACTER*8 MOTPAR2(NPAR2) REAL*8 VAPDEF1(NPAR1),VAPDEF2(NPAR2),VALPAR2(NPAR2) DATA MOTPAR1 /'A0' ,'A' ,'C' ,'D'/ DATA VAPDEF1 /1.0D0 ,0.0D0 ,1.0D4 ,1.0D0/ DATA MOTPAR2 /'MOVE' ,'ALBEFA','RAA0' ,'ASYINIT','ASYINCR', & 'ASYDECR','ASYMIN','ASYMAX','EPSIMIN'/ DATA VAPDEF2 /0.1D0 ,0.1D0 ,1.0D-5 ,0.5D0 ,1.2D0, & 0.7D0 ,0.01D0 ,10.D0 ,1.0D-7/ DATA RAADEF /1.0D-5/ C----------- A C Q U I S I T I O N D E S D O N N E E S ------------C C E T P R E P A R A T I O N D E S C C T A B L E A U X D E T R A V A I L C C Acquisition des donnees d'entree utilisateur C---- La table principale IF(IERR.NE.0) RETURN C---- Vecteur des inconnues : X & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE1) IF (IERR.NE.0) GOTO 999 SEGACT MLREE1 C Nombre d'inconnues : N IF (N.LT.1) THEN RETURN ENDIF C---- Vecteur des fonctions contraintes en X : FVAL & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE2) IF (IERR.NE.0) GOTO 999 SEGACT MLREE2 C Nombre de fonctions contraintes : M IF (M.LT.1) THEN RETURN ENDIF C---- Initialisation du segment pour la MMA SEGINI KMMA C Remplissage des premiers tableaux du segment DO I=1,N ENDDO DO J=1,M ENDDO IXVAL=MLREE1 SEGDES MLREE1,MLREE2 C---- Numero d'iteration : ITER (facultatif, defaut = 0) TYPE=' ' & TYPE,IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 IF (TYPE.EQ.'ENTIER ') THEN ITER=IVALE ELSE ITER=0 ENDIF C---- Vecteur des bornes inferieures : XMIN (LISTREEL ou FLOTTANT) TYPE=' ' & TYPE,IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 C Si on a lu un LISTREEL, on le prend IF (TYPE.EQ.'LISTREEL') THEN MLREE1=IOVALE SEGACT MLREE1 write(ioimp,*) 'Mauvaise dimension pour XMIN' INTERR(1)=N RETURN ENDIF DO I=1,N ENDDO SEGDES MLREE1 C Si on a lu un FLOTTANT, on l'utilise pour toutes les inconnues ELSEIF (TYPE.EQ.'FLOTTANT') THEN DO I=1,N XMIN(I)=XVALE ENDDO C Dans les autres cas, erreur ELSE MOTERR(1:11)='XMIN' MOTERR(12:20)='LISTREEL' RETURN ENDIF C---- Vecteur des bornes superieures : XMAX (LISTREEL ou FLOTTANT) TYPE=' ' & TYPE,IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 C Si on a lu un LISTREEL, on le prend IF (TYPE.EQ.'LISTREEL') THEN MLREE1=IOVALE SEGACT MLREE1 write(ioimp,*) 'Mauvaise dimension pour XMAX' INTERR(1)=N RETURN ENDIF DO I=1,N ENDDO SEGDES MLREE1 C Si on a lu un FLOTTANT, on l'utilise pour toutes les inconnues ELSEIF (TYPE.EQ.'FLOTTANT') THEN DO I=1,N XMAX(I)=XVALE ENDDO C Dans les autres cas, erreur ELSE MOTERR(1:11)='XMAX' MOTERR(12:20)='LISTREEL' RETURN ENDIF C---- Vecteur des inconnues precedentes : XOLD1 (facultatif, defaut = X) TYPE=' ' & TYPE,IVALE,XVALE,MOTVAL,BVALE,MLREE1) IF (IERR.NE.0) GOTO 999 IF (TYPE.NE.'LISTREEL') THEN MLREE1=IXVAL ENDIF SEGACT MLREE1 write(ioimp,*) 'Mauvaise dimension pour XOLD1' INTERR(1)=N RETURN ENDIF DO I=1,N ENDDO IXOLD1=MLREE1 SEGDES MLREE1 C---- Vecteur des inconnues precedentes : XOLD2 (facultatif, defaut = XOLD1) TYPE=' ' & TYPE,IVALE,XVALE,MOTVAL,BVALE,MLREE1) IF (IERR.NE.0) GOTO 999 IF (TYPE.NE.'LISTREEL') THEN MLREE1=IXOLD1 ENDIF SEGACT MLREE1 write(ioimp,*) 'Mauvaise dimension pour XOLD2' INTERR(1)=N RETURN ENDIF DO I=1,N ENDDO SEGDES MLREE1 C---- Vecteur des asymptotes inferieures : LOW (facultatif, defaut = XMIN) TYPE=' ' & TYPE,IVALE,XVALE,MOTVAL,BVALE,MLREE1) IF (IERR.NE.0) GOTO 999 IF (TYPE.EQ.'LISTREEL') THEN SEGACT MLREE1 write(ioimp,*) 'Mauvaise dimension pour LOW' INTERR(1)=N RETURN ENDIF DO I=1,N ENDDO SEGDES MLREE1 ELSE LOW=XMIN ENDIF C---- Vecteur des asymptotes superieures : UPP (facultatif, defaut = XMAX) TYPE=' ' & TYPE,IVALE,XVALE,MOTVAL,BVALE,MLREE1) IF (IERR.NE.0) GOTO 999 IF (TYPE.EQ.'LISTREEL') THEN SEGACT MLREE1 write(ioimp,*) 'Mauvaise dimension pour UPP' GOTO 999 ENDIF DO I=1,N ENDDO SEGDES MLREE1 ELSE UPP=XMAX ENDIF C---- Valeur de la fonction objectif F0 : F0VAL & 'FLOTTANT',IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 F0VAL=XVALE C---- Vecteur des derivees partielles dF0/dxi : DF0DX & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE1) IF (IERR.NE.0) GOTO 999 SEGACT MLREE1 write(ioimp,*) 'Mauvaise dimension pour DF0DX' INTERR(1)=N RETURN ENDIF DO I=1,N ENDDO SEGDES MLREE1 C---- Matrice des derivees partielles dFj/dxi : DFDX TYPE=' ' & TYPE,IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 C Si on a lu une TABLE, on la parcourt IF (TYPE.EQ.'TABLE') THEN MTAB1=IOVALE SEGACT MTAB1 DO J=1,M & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE1) IF (IERR.NE.0) GOTO 999 SEGACT MLREE1 write(ioimp,*) 'Mauvaise dimension pour la liste DFDX . ',J INTERR(1)=N RETURN ENDIF DO I=1,N ENDDO SEGDES MLREE1 ENDDO SEGDES MTAB1 C Si on a lu un LISTOBJE, on le parcourt ELSEIF (TYPE.EQ.'LISTOBJE') THEN MLOBJ1=IOVALE SEGACT MLOBJ1 IF (MLOBJ1.TYPOBJ.NE.'LISTREEL') THEN MOTERR(1:8)='LISTREEL' RETURN ENDIF IF (MLOBJ1.LISOBJ(/1).NE.M) THEN write(ioimp,*) 'Mauvaise dimension pour DFDX' INTERR(1)=M RETURN ENDIF DO J=1,M MLREE1=MLOBJ1.LISOBJ(J) SEGACT MLREE1 write(ioimp,*) 'Mauvaise dimension pour la liste ',J, & ' de DFDX' INTERR(1)=N RETURN GOTO 999 ENDIF DO I=1,N ENDDO SEGDES MLREE1 ENDDO SEGDES MLOBJ1 C Dans les autres cas, erreur ELSE MOTERR(1:11)='DFDX' MOTERR(12:20)='LISTOBJE' RETURN ENDIF C---- Valeur du coefficient A0 : A0 (facultatif, defaut = voir VAPDEF1) TYPE=' ' & TYPE,IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 IF (TYPE.EQ.'FLOTTANT') THEN A0=XVALE ELSE A0=VAPDEF1(1) & 'FLOTTANT',IVALE,A0,MOTVAL,BVALE,IOVALE) ENDIF C---- Vecteur des coefficients A : A (facultatif, defaut = voir VAPDEF1) TYPE=' ' & TYPE,IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 C Si on a lu un LISTREEL, on le prend IF (TYPE.EQ.'LISTREEL') THEN MLREE1=IOVALE SEGACT MLREE1 write(ioimp,*) 'Mauvaise dimension pour A' INTERR(1)=M RETURN ENDIF DO I=1,M ENDDO SEGDES MLREE1 C Si on a lu un FLOTTANT, on l'utilise pour toutes les contraintes ELSEIF (TYPE.EQ.'FLOTTANT') THEN DO I=1,M A(I)=XVALE ENDDO C Si l'indice n'est pas present, on prend la valeur par defaut ELSEIF (TYPE.EQ.' ') THEN JG=M SEGINI MLREE1 DO I=1,M A(I)=VAPDEF1(2) ENDDO SEGDES MLREE1 & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE1) C Dans les autres cas, erreur ELSE MOTERR(1:11)='A' MOTERR(12:20)='LISTREEL' RETURN ENDIF C---- Vecteur des coefficients C : C (facultatif, defaut = voir VAPDEF1) TYPE=' ' & TYPE,IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 C Si on a lu un LISTREEL, on le prend IF (TYPE.EQ.'LISTREEL') THEN MLREE1=IOVALE SEGACT MLREE1 write(ioimp,*) 'Mauvaise dimension pour C' INTERR(1)=M RETURN ENDIF DO I=1,M ENDDO SEGDES MLREE1 C Si on a lu un FLOTTANT, on l'utilise pour toutes les contraintes ELSEIF (TYPE.EQ.'FLOTTANT') THEN DO I=1,M C(I)=XVALE ENDDO C Si l'indice n'est pas present, on prend la valeur par defaut ELSEIF (TYPE.EQ.' ') THEN JG=M SEGINI MLREE1 DO I=1,M C(I)=VAPDEF1(3) ENDDO SEGDES MLREE1 & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE1) C Dans les autres cas, erreur ELSE MOTERR(1:11)='C' MOTERR(12:20)='LISTREEL' RETURN ENDIF C---- Vecteur des coefficients D : D (facultatif, defaut = voir VAPDEF1) TYPE=' ' & TYPE,IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 C Si on a lu un LISTREEL, on le prend IF (TYPE.EQ.'LISTREEL') THEN MLREE1=IOVALE SEGACT MLREE1 write(ioimp,*) 'Mauvaise dimension pour D' INTERR(1)=M RETURN ENDIF DO I=1,M ENDDO SEGDES MLREE1 C Si on a lu un FLOTTANT, on l'utilise pour toutes les contraintes ELSEIF (TYPE.EQ.'FLOTTANT') THEN DO I=1,M D(I)=XVALE ENDDO C Si l'indice n'est pas present, on prend la valeur par defaut ELSEIF (TYPE.EQ.' ') THEN JG=M SEGINI MLREE1 DO I=1,M D(I)=VAPDEF1(4) ENDDO SEGDES MLREE1 & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE1) C Dans les autres cas, erreur ELSE MOTERR(1:11)='D' MOTERR(12:20)='LISTREEL' RETURN ENDIF C---- Parametres de mise a jour des asymptotes (facultatifs) C Noms et valeurs par defaut = voir les DATA MOTPAR2 et VAPDEF2 DO I=1,NPAR2 TYPE=' ' MOT1=MOTPAR2(I) & TYPE,IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 IF (TYPE.EQ.'FLOTTANT') THEN VALPAR2(I)=XVALE ELSE VALPAR2(I)=VAPDEF2(I) XVALE=VALPAR2(I) ENDIF ENDDO C---- Option "Globaly Convergent" : GC (facultatif, defaut = FAUX) BGCMMA=.FALSE. TYPE=' ' & TYPE,IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 IF (TYPE.EQ.'LOGIQUE ') THEN BGCMMA=BVALE ENDIF IF (BGCMMA) THEN C------ Initialisation du segment pour la GCMMA SEGINI KGCMMA C - - - Logique indiquant le conservatisme : CONSERV (facultatif, defaut = VRAI) TYPE=' ' & TYPE,IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 IF (TYPE.EQ.'LOGIQUE') THEN BCONS=BVALE ELSE BCONS=.TRUE. ENDIF C - - - Parametres RAA (controle des asymptotes du sous probleme) TYPE=' ' & TYPE,IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 C Si on a lu un LISTREEL, on le prend IF (TYPE.EQ.'LISTREEL') THEN MLREE1=IOVALE SEGACT MLREE1 write(ioimp,*) 'Mauvaise dimension pour RAA' INTERR(1)=M RETURN ENDIF DO I=1,M ENDDO SEGDES MLREE1 C Si on a lu un FLOTTANT, on l'utilise ELSEIF (TYPE.EQ.'FLOTTANT') THEN DO I=1,M RAA(I)=XVALE ENDDO C Si l'indice n'est pas present, on prend la valeur par defaut ELSEIF (TYPE.EQ.' ') THEN JG=M SEGINI MLREE1 DO I=1,M RAA(I)=RAADEF ENDDO SEGDES MLREE1 & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE1) C Dans les autres cas, erreur ELSE MOTERR(1:11)='RAA' MOTERR(12:20)='LISTREEL' RETURN ENDIF C - - - Table de travail : WTABLE TYPE=' ' & TYPE,IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 C Si la table existe, on la prend IF (TYPE.EQ.'TABLE') THEN IWTAB=IOVALE C Sinon, on l'initialise ELSE RAA0=VALPAR2(3) JG=M SEGINI MLREE3 DO I=1,M ENDDO SEGDES MLREE3 MBACKUP=M M=0 SEGINI MTAB1 M=MBACKUP IWTAB=MTAB1 & 'FLOTTANT',IVALE,RAA0,MOTVAL,BVALE,IOIND) & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE3) & 'TABLE ',IVALE,XVALE,MOTVAL,BVALE,IWTAB) ENDIF C - - - Numero de sous iteration : SSITER (dans WTABLE) TYPE=' ' & TYPE,IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 IF (TYPE.EQ.'ENTIER') THEN SSITER=IVALE ELSE SSITER=0 ENDIF C - - - Parametre RAA0 (dans WTABLE) TYPE='FLOTTANT' & TYPE,IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 RAA0=XVALE VALPAR2(3)=RAA0 C - - - Parametres RAA (dans WTABLE) TYPE='LISTREEL' & TYPE,IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 MLREE3=IOVALE SEGACT MLREE3 DO I=1,M ENDDO SEGDES MLREE3 ENDIF C----------- O P T I M I S A T I O N P A R L A M M A ------------C C Recuperation des valeurs des parametres MOVE =VALPAR2(1) ALBEFA =VALPAR2(2) RAA0 =VALPAR2(3) ASYINIT=VALPAR2(4) ASYINCR=VALPAR2(5) ASYDECR=VALPAR2(6) ASYMIN =VALPAR2(7) ASYMAX =VALPAR2(8) EPSIMIN=VALPAR2(9) C Cas de la MMA "Globally Convergent" IF (BGCMMA) THEN C Si le precedent probleme conservatif, alors nouvelle iteration IF (BCONS) THEN ITER=ITER+1 C Parametres RAA0EPS et RAAEPS RAA0EPS=1.0D-6 DO I=1,M RAAEPS(I)=1.0D-6 ENDDO C Mise a jour des asymptotes LOW/UPP et des parametres RAA0 et RAA CALL ASYMP(ITER,N,M,XVAL,XOLD1,XOLD2,XMIN,XMAX, & RAA0EPS,RAAEPS,DF0DX,DFDX, & ASYINIT,ASYDECR,ASYINCR,ASYMIN,ASYMAX, & LOW,UPP,RAA0,RAA) C Calcul des matrices/vecteurs du sous-probleme convexe CALL GCMMASUB(M,N,XVAL,XMIN,XMAX,LOW,UPP, & F0VAL,DF0DX,FVAL,DFDX, & RAA0,RAA,ALBEFA, & ALFA,BETA,P0,Q0,P,Q,B,R0) C Resolution du sous-probleme convexe NMAT=MIN(M+1,N+1) NR=4*M+3*N+2 SEGINI KSUB ISUB=KSUB CALL SUBSOLVE(ISUB,BGCMMA,M,N,EPSIMIN,LOW,UPP,ALFA,BETA, & P0,Q0,P,Q,A0,A,B,C,D,R0, & XMMA,YMMA,ZMMA,LAM,XSI,ETA,MU,ZET,S,F0APP,FAPP) C On part du principe que ce nouveau sous probleme est non conservatif C et on initialise le compteur des sous iterations BCONS=.FALSE. SSITER=0 C Si le precedent probleme n'est pas conservatif, alors on teste C si c'est toujours le cas par comparaison entre : C - les valeurs approchees des fonctions objectif et contraintes C - les nouvelles valeurs des fonctions objectif et contraintes ELSE TYPE='FLOTTANT' & TYPE,IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 F0APP=XVALE TYPE='LISTREEL' & TYPE,IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 MLREE1=IOVALE SEGACT MLREE1 DO I=1,M ENDDO SEGDES MLREE1 TYPE='FLOTTANT' & TYPE,IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 F0VALNEW=XVALE TYPE='LISTREEL' & TYPE,IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 MLREE1=IOVALE SEGACT MLREE1 DO I=1,M ENDDO SEGDES MLREE1 CALL CONCHECK(M,EPSIMIN,F0APP,F0VALNEW,FAPP,FVALNEW,BCONS) C Si probleme non conservatif, alors on fait une sous iteration C en resserant les asymptotes IF (.NOT.BCONS) THEN SSITER=SSITER+1 C Recuperation de la solution de la precedente sous iteration (WTABLE) TYPE='LISTREEL' & TYPE,IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 MLREE1=IOVALE SEGACT MLREE1 DO I=1,N ENDDO C Mise a jour de RAA0 et RAA pour tenter d'avoir un probleme conservatif CALL RAAUPDT(N,M,XMMA,XVAL,XMIN,XMAX,LOW,UPP, & F0VALNEW,FVALNEW,F0APP,FAPP,EPSIMIN, & RAA0,RAA) C Resolution du nouveau sous probleme CALL GCMMASUB(M,N,XVAL,XMIN,XMAX,LOW,UPP, & F0VAL,DF0DX,FVAL,DFDX, & RAA0,RAA,ALBEFA,ALFA,BETA,P0,Q0,P,Q,B,R0) C Resolution du sous-probleme convexe NMAT=MIN(M+1,N+1) NR=4*M+3*N+2 SEGINI KSUB ISUB=KSUB CALL SUBSOLVE(ISUB,BGCMMA,M,N,EPSIMIN,LOW,UPP,ALFA,BETA, & P0,Q0,P,Q,A0,A,B,C,D,R0, & XMMA,YMMA,ZMMA,LAM,XSI,ETA,MU,ZET,S,F0APP,FAPP) C On part du principe que ce nouveau sous probleme est non conservatif BCONS=.FALSE. ENDIF ENDIF C Cas de la MMA "classique" ELSE ITER=ITER+1 C Calcul des matrices/vecteurs du sous-probleme convexe CALL MMASUB(M,N,ITER,XVAL,XMIN,XMAX,XOLD1,XOLD2, & DF0DX,FVAL,DFDX,MOVE,ALBEFA,RAA0, & ASYINIT,ASYINCR,ASYDECR,ASYMIN,ASYMAX, & LOW,UPP,ALFA,BETA,P0,Q0,P,Q,B) C Resolution du sous-probleme convexe NMAT=MIN(M+1,N+1) NR=4*M+3*N+2 SEGINI KSUB ISUB=KSUB CALL SUBSOLVE(ISUB,BGCMMA,M,N,EPSIMIN,LOW,UPP,ALFA,BETA, & P0,Q0,P,Q,A0,A,B,C,D,R0, & XMMA,YMMA,ZMMA,LAM,XSI,ETA,MU,ZET,S,F0APP,FAPP) ENDIF C------------ E C R I T U R E D E S R E S U L T A T S -------------C C Dans tous les cas C---- Numero d'iteration : ITER & 'ENTIER ',ITER,XVALE,MOTVAL,BVALE,IOVALE) C---- Vecteur des asymptotes inferieures : LOW <-- LOW JG=N SEGINI MLREE1 DO I=1,N ENDDO & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE1) SEGDES MLREE1 C---- Vecteur des asymptotes inferieures : UPP <-- UPP JG=N SEGINI MLREE1 DO I=1,N ENDDO & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE1) SEGDES MLREE1 C Dans le cas de la MMA ou bien la GCMMA conservative IF ((.NOT.BGCMMA).OR.(BCONS)) THEN C------ Vecteur des inconnues : X <-- XMMA IF (.NOT.BGCMMA) THEN JG=N SEGINI MLREE1 DO I=1,N ENDDO ELSEIF (BCONS) THEN TYPE='LISTREEL' & TYPE,IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 MLREE1=IOVALE ENDIF & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE1) SEGDES MLREE1 C------ Vecteur des inconnues precedentes : XOLD1 <-- XVAL MLREE1=IXVAL & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE1) SEGDES MLREE1 C------ Vecteur des inconnues precedentes : XOLD2 <-- XOLD1 MLREE1=IXOLD1 & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE1) SEGDES MLREE1 C------ Vecteurs des multiplicateurs de Lagrange (Y,Z,LAM,XSI,ETA,MU,ZET,S) C Pour la MMA classique, ils viennent d'etre calcules C Pour la GCMMA, ils sont stockes dans WTABLE C Vecteur Y (variables y_j optimales) IF (.NOT.BGCMMA) THEN JG=M SEGINI MLREE1 DO I=1,M ENDDO ELSEIF (BCONS) THEN TYPE='LISTREEL' & TYPE,IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 MLREE1=IOVALE ENDIF & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE1) SEGDES MLREE1 C Scalaire ZMMA (variable z optimale) IF (.NOT.BGCMMA) THEN XVALE=ZMMA ELSEIF (BCONS) THEN TYPE='FLOTTANT' & TYPE,IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 ENDIF & 'FLOTTANT',IVALE,XVALE,MOTVAL,BVALE,IOVALE) C Vecteur LAM (multiplicateurs de Lagrange pour les contraintes f_i) IF (.NOT.BGCMMA) THEN JG=M SEGINI MLREE1 DO I=1,M ENDDO ELSEIF (BCONS) THEN TYPE='LISTREEL' & TYPE,IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 MLREE1=IOVALE ENDIF & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE1) SEGDES MLREE1 C Vecteur XSI (multiplicateurs de Lagrange pour les bornes inferieures) IF (.NOT.BGCMMA) THEN JG=N SEGINI MLREE1 DO I=1,N ENDDO ELSEIF (BCONS) THEN TYPE='LISTREEL' & TYPE,IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 MLREE1=IOVALE ENDIF & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE1) SEGDES MLREE1 C Vecteur ETA (multiplicateurs de Lagrange pour les bornes superieures) IF (.NOT.BGCMMA) THEN JG=N SEGINI MLREE1 DO I=1,N ENDDO ELSEIF (BCONS) THEN TYPE='LISTREEL' & TYPE,IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 MLREE1=IOVALE ENDIF & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE1) SEGDES MLREE1 C Vecteur MU (multiplicateurs de Lagrange y_i > 0) IF (.NOT.BGCMMA) THEN JG=M SEGINI MLREE1 DO I=1,M ENDDO ELSEIF (BCONS) THEN TYPE='LISTREEL' & TYPE,IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 MLREE1=IOVALE ENDIF & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE1) SEGDES MLREE1 C Scalaire ZET (multiplicateur de Lagrange pour z > 0) IF (.NOT.BGCMMA) THEN XVALE=ZET ELSEIF (BCONS) THEN TYPE='FLOTTANT' & TYPE,IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 ENDIF & 'FLOTTANT',IVALE,XVALE,MOTVAL,BVALE,IOVALE) C Vecteur S (variables d'ecart pour les contraintes f_i) IF (.NOT.BGCMMA) THEN JG=M SEGINI MLREE1 DO I=1,M ENDDO ELSEIF (BCONS) THEN TYPE='LISTREEL' & TYPE,IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 MLREE1=IOVALE ENDIF & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE1) SEGDES MLREE1 ENDIF C Dans le cas de la GCMMA IF (BGCMMA) THEN C------ Indicateur de conservatisme BCONS TYPE='LOGIQUE' & TYPE,IVALE,XVALE,MOTVAL,BCONS,IOVALE) C Dans le cas conservatif IF (BCONS) THEN C-------- On remonte RAA0 dans la table TYPE='FLOTTANT' & TYPE,IVALE,RAA0,MOTVAL,BVALE,IOVALE) C-------- On remonte le vecteur RAA dans la table TYPE='LISTREEL' JG=M SEGINI MLREE1 DO I=1,M ENDDO SEGDES MLREE1 & TYPE,IVALE,XVALE,MOTVAL,BVALE,MLREE1) C-------- Nettoyage de WTABLE, on ne laisse que RAA0, RAA et aussi ITER mais juste pour info JG=M SEGINI MLREE3 DO I=1,M ENDDO SEGDES MLREE3 MBACKUP=M M=0 SEGINI MTAB1 M=MBACKUP IWTAB=MTAB1 & 'ENTIER',SSITER,XVALE,MOTVAL,BVALE,IOIND) & 'FLOTTANT',IVALE,RAA0,MOTVAL,BVALE,IOIND) & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE3) & 'TABLE ',IVALE,XVALE,MOTVAL,BVALE,IWTAB) C Dans le cas non conservatif ELSE C - - - - Entier SSITER (dans WTABLE) TYPE='ENTIER' & TYPE,SSITER,XVALE,MOTVAL,BVALE,IOVALE) C - - - - Scalaire RAA0 (dans WTABLE) TYPE='FLOTTANT' & TYPE,IVALE,RAA0,MOTVAL,BVALE,IOVALE) C - - - - Vecteur RAA (dans WTABLE) JG=M SEGINI MLREE3 DO I=1,M ENDDO SEGDES MLREE3 TYPE='LISTREEL' & TYPE,IVALE,XVALE,MOTVAL,BVALE,MLREE3) C - - - - Vecteur X (dans WTABLE) JG=N SEGINI MLREE3 DO I=1,N ENDDO SEGDES MLREE3 TYPE='LISTREEL' & TYPE,IVALE,XVALE,MOTVAL,BVALE,MLREE3) C - - - - Vecteur Y (dans WTABLE) JG=M SEGINI MLREE3 DO I=1,M ENDDO SEGDES MLREE3 TYPE='LISTREEL' & TYPE,IVALE,XVALE,MOTVAL,BVALE,MLREE3) C - - - - Scalaire Z (dans WTABLE) TYPE='FLOTTANT' & TYPE,IVALE,ZMMA,MOTVAL,BVALE,IOIND) C - - - - Vecteur LAMBDA (dans WTABLE) JG=M SEGINI MLREE3 DO I=1,M ENDDO SEGDES MLREE3 TYPE='LISTREEL' & TYPE,IVALE,XVALE,MOTVAL,BVALE,MLREE3) C - - - - Vecteur XSI (dans WTABLE) JG=N SEGINI MLREE3 DO I=1,N ENDDO SEGDES MLREE3 TYPE='LISTREEL' & TYPE,IVALE,XVALE,MOTVAL,BVALE,MLREE3) C - - - - Vecteur ETA (dans WTABLE) JG=N SEGINI MLREE3 DO I=1,N ENDDO SEGDES MLREE3 TYPE='LISTREEL' & TYPE,IVALE,XVALE,MOTVAL,BVALE,MLREE3) C - - - - Vecteur MU (dans WTABLE) JG=M SEGINI MLREE3 DO I=1,M ENDDO SEGDES MLREE3 TYPE='LISTREEL' & TYPE,IVALE,XVALE,MOTVAL,BVALE,MLREE3) C - - - - Scalaire ZET (dans WTABLE) TYPE='FLOTTANT' & TYPE,IVALE,ZET,MOTVAL,BVALE,IOIND) C - - - - Vecteur S (dans WTABLE) JG=M SEGINI MLREE3 DO I=1,M ENDDO SEGDES MLREE3 TYPE='LISTREEL' & TYPE,IVALE,XVALE,MOTVAL,BVALE,MLREE3) C - - - - Scalaire F0APP (dans WTABLE) TYPE='FLOTTANT' & TYPE,IVALE,F0APP,MOTVAL,BVALE,IOIND) C - - - - Vecteur FAPP (dans WTABLE) JG=M SEGINI MLREE3 DO I=1,M ENDDO SEGDES MLREE3 TYPE='LISTREEL' & TYPE,IVALE,XVALE,MOTVAL,BVALE,MLREE3) ENDIF ENDIF C Suppression des segments de travail SEGSUP KMMA IF (KSUB.GT.0) SEGSUP KSUB IF (BGCMMA) SEGSUP KGCMMA C Fin RETURN C En cas d'erreur 999 CONTINUE RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales