mma
C MMA SOURCE FD218221 25/09/03 21:15:03 12351 SUBROUTINE MMA 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 SMTABLE C Segment pour stocker les donnees de la MMA C Parametres : NN = nombre d'inconnues C MM = nombre de contraintes SEGMENT SMMA INTEGER ITER REAL*8 XVAL(NN,1),XMIN(NN,1),XMAX(NN,1) REAL*8 A0,F0VAL,FVAL(MM,1),XOLD1(NN,1),XOLD2(NN,1) REAL*8 DF0DX(NN,1),DFDX(MM,NN),LOW(NN,1),UPP(NN,1) REAL*8 A(MM,1),C(MM,1),D(MM,1) REAL*8 XMMA(NN,1),YMMA(MM,1),ZMMA REAL*8 LAM(MM,1),XSI(NN,1),ETA(NN,1),MU(MM,1),ZET,S(MM,1) ENDSEGMENT POINTEUR MMA1.SMMA,MMA2.SMMA C Quelques objets LOGICAL BIND,BVALE CHARACTER*1 MOTVAL CHARACTER*8 TYPOBJ REAL*8 MOVE C Acquisition des donnees d'entree utilisateur C --> La table principale IF(IERR.NE.0) RETURN C --> Vecteur des inconnues : XVAL & '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 --> Valeurs des fonctions contraintes en XVAL : FVAL & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE2) IF (IERR.NE.0) GOTO 999 SEGACT MLREE2 C --> Nombre de fonctions contraites : M IF (M.LT.1) THEN RETURN ENDIF C Initialisation du segment pour la MMA NN=N MM=M SEGINI SMMA C Remplissage des attributs XVAL et FVAL DO I=1,N ENDDO DO J=1,M ENDDO IXVAL=MLREE1 SEGDES MLREE1,MLREE2 C --> Numero d'iteration : ITER (facultatif) TYPOBJ=' ' & TYPOBJ,IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 IF (TYPOBJ.EQ.'ENTIER ') THEN ITER=IVALE C Si indice 'ITER' non present, on prend 1 ELSE ITER=1 ENDIF C --> Vecteur des valeurs min pou les inconnues : XMIN (LISTREEL ou FLOTTANT) TYPOBJ=' ' & TYPOBJ,IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 C Si on a lu un LISTREEL, on le prend IF (TYPOBJ.EQ.'LISTREEL') THEN MLREE1=IOVALE SEGACT MLREE1 print*,'Mauvaise dimension pour XMIN' GOTO 999 ENDIF DO I=1,N ENDDO SEGDES MLREE1 C Si on a lu un FLOTTANT, on l'utilise pour toutes les inconnues ELSEIF (TYPOBJ.EQ.'FLOTTANT') THEN DO I=1,N XMIN(I,1)=XVALE ENDDO C Dans les autres cas, erreur ELSE MOTERR(1:11)='XMIN' MOTERR(12:20)='LISTREEL' RETURN ENDIF C --> Vecteur des valeurs min pou les inconnues : XMAX (LISTREEL ou FLOTTANT) TYPOBJ=' ' & TYPOBJ,IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 C Si on a lu un LISTREEL, on le prend IF (TYPOBJ.EQ.'LISTREEL') THEN MLREE1=IOVALE SEGACT MLREE1 print*,'Mauvaise dimension pour XMAX' GOTO 999 ENDIF DO I=1,N ENDDO SEGDES MLREE1 C Si on a lu un FLOTTANT, on l'utilise pour toutes les inconnues ELSEIF (TYPOBJ.EQ.'FLOTTANT') THEN DO I=1,N XMAX(I,1)=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) TYPOBJ=' ' & TYPOBJ,IVALE,XVALE,MOTVAL,BVALE,MLREE1) IF (IERR.NE.0) GOTO 999 C Si indice 'XOLD1' non present, on prend XVAL IF (TYPOBJ.NE.'LISTREEL') THEN MLREE1=IXVAL ENDIF SEGACT MLREE1 print*,'Mauvaise dimension pour XOLD1' GOTO 999 ENDIF DO I=1,N ENDDO IXOLD1=MLREE1 SEGDES MLREE1 C --> Vecteur des inconnues precedentes : XOLD2 (facultatif) TYPOBJ=' ' & TYPOBJ,IVALE,XVALE,MOTVAL,BVALE,MLREE1) IF (IERR.NE.0) GOTO 999 C Si indice 'XOLD2' non present, on prend XOLD1 IF (TYPOBJ.NE.'LISTREEL') THEN MLREE1=IXOLD1 ENDIF SEGACT MLREE1 print*,'Mauvaise dimension pour XOLD2' GOTO 999 ENDIF DO I=1,N ENDDO SEGDES MLREE1 C --> Vecteur de l'asymptote inferieure : LOW (facultatif) TYPOBJ=' ' & TYPOBJ,IVALE,XVALE,MOTVAL,BVALE,MLREE1) IF (IERR.NE.0) GOTO 999 IF (TYPOBJ.EQ.'LISTREEL') THEN SEGACT MLREE1 print*,'Mauvaise dimension pour LOW' GOTO 999 ENDIF DO I=1,N ENDDO SEGDES MLREE1 C Si indice 'LOW' non present, on prend XMIN ELSE LOW=XMIN ENDIF C --> Vecteur de l'asymptote superieure : UPP (facultatif) TYPOBJ=' ' & TYPOBJ,IVALE,XVALE,MOTVAL,BVALE,MLREE1) IF (IERR.NE.0) GOTO 999 IF (TYPOBJ.EQ.'LISTREEL') THEN SEGACT MLREE1 print*,'Mauvaise dimension pour UPP' GOTO 999 ENDIF DO I=1,N ENDDO SEGDES MLREE1 C Si indice 'UPP' non present, on prend XMAX ELSE UPP=XMAX ENDIF C --> Valeur de la fonction objectif en XVAL : 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 print*,'Mauvaise dimension pour DF0DX' GOTO 999 ENDIF DO I=1,N ENDDO SEGDES MLREE1 C --> Matrice des derivees partielles dFj/dxi : DFDX & 'TABLE ',IVALE,XVALE,MOTVAL,BVALE,MTAB1) IF (IERR.NE.0) GOTO 999 SEGACT MTAB1 DO J=1,M & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE1) IF (IERR.NE.0) GOTO 999 SEGACT MLREE1 print*,'Mauvaise dimension pour la liste DFDX . ',J GOTO 999 ENDIF DO I=1,N ENDDO SEGDES MLREE1 ENDDO SEGDES MTAB1 C --> Valeur du coefficient A0 : A0 & 'FLOTTANT',IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 A0=XVALE C --> Vecteur des coefficients A : A & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE1) IF (IERR.NE.0) GOTO 999 SEGACT MLREE1 print*,'Mauvaise dimension pour A' GOTO 999 ENDIF DO I=1,M ENDDO SEGDES MLREE1 C --> Vecteur des coefficients C : C & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE1) IF (IERR.NE.0) GOTO 999 SEGACT MLREE1 print*,'Mauvaise dimension pour C' GOTO 999 ENDIF DO I=1,M ENDDO SEGDES MLREE1 C --> Vecteur des coefficients D : D & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE1) IF (IERR.NE.0) GOTO 999 SEGACT MLREE1 print*,'Mauvaise dimension pour D' GOTO 999 ENDIF DO I=1,M ENDDO SEGDES MLREE1 C --> Parametre de mise a jour des asymptotes : MOVE (facultatif) TYPOBJ=' ' & TYPOBJ,IVALE,XVALE,MOTVAL,BVALE,IOVALE) IF (IERR.NE.0) GOTO 999 IF (TYPOBJ.EQ.'FLOTTANT') THEN MOVE=XVALE C Si indice 'MOVE' non present, on prend 0.1 et on l'ecrit dans la table ELSE MOVE=0.1D0 & 'FLOTTANT',IVALE,MOVE,MOTVAL,BVALE,IOVALE) ENDIF C Appel a la subroutine qui fait le travail C Pour la MMA classique ... CALL MMASUB(M,N,ITER,XVAL,XMIN,XMAX,XOLD1,XOLD2, & F0VAL,DF0DX,FVAL,DFDX,A0,A,C,D,MOVE, & XMMA,YMMA,ZMMA,LAM,XSI,ETA,MU,ZET,S,LOW,UPP) C Fin normale du programme IF (IERR.NE.0) RETURN C On ecrit les resultats dans la table d'entree sous forme de LISTREEL C Ecrasement du numero d'iteration ITER <-- ITER+1 ITERP1=ITER+1 & 'ENTIER ',ITERP1,XVALE,MOTVAL,BVALE,IOVALE) C Ecrasement des inconnues XVAL <-- XMMA JG=N SEGINI MLREE1 DO I=1,N ENDDO & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE1) SEGDES MLREE1 C Ecrasement des inconnues precedentes XOLD1 <-- XVAL MLREE1=IXVAL & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE1) SEGDES MLREE1 C Ecrasement des inconnues pre-precedentes XOLD2 <-- XOLD1 MLREE1=IXOLD1 & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE1) SEGDES MLREE1 C Ecrasement des asymptotes inferieures LOW <-- LOW JG=N SEGINI MLREE1 DO I=1,N ENDDO & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE1) SEGDES MLREE1 C Ecrasement des asymptotes superieures UPP <-- UPP JG=N SEGINI MLREE1 DO I=1,N ENDDO & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE1) SEGDES MLREE1 C On rend aussi les autres variables C Vecteur YMMA (variables y) JG=M SEGINI MLREE1 DO I=1,M ENDDO & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE1) SEGDES MLREE1 C Scalaire ZMMA (variable z) XVALE=ZMMA & 'FLOTTANT',IVALE,XVALE,MOTVAL,BVALE,IOVALE) C Vecteur LAM (multiplicateurs de Lagrange pour les contraintes f_i) JG=M SEGINI MLREE1 DO I=1,M ENDDO & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE1) SEGDES MLREE1 C Vecteur XSI (multiplicateurs de Lagrange pour les bornes inferieures) JG=N SEGINI MLREE1 DO I=1,N ENDDO & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE1) SEGDES MLREE1 C Vecteur ETA (multiplicateurs de Lagrange pour les bornes superieures) JG=N SEGINI MLREE1 DO I=1,N ENDDO & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE1) SEGDES MLREE1 C Vecteur MU (multiplicateurs de Lagrange y_i > 0) JG=M SEGINI MLREE1 DO I=1,M ENDDO & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE1) SEGDES MLREE1 C Scalaire ZET (multiplicateur de Lagrange pour z > 0) XVALE=ZET & 'FLOTTANT',IVALE,XVALE,MOTVAL,BVALE,IOVALE) C Vecteur S (variables d'ecart pour les contraintes f_i) JG=M SEGINI MLREE1 DO I=1,M ENDDO & 'LISTREEL',IVALE,XVALE,MOTVAL,BVALE,MLREE1) SEGDES MLREE1 C Et c'est fini ! RETURN C En cas d'erreur 999 CONTINUE RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales