excell
C EXCELL SOURCE FD218221 24/02/21 21:15:03 11844 SUBROUTINE EXCELL IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC CCREEL -INC TMXMAT -INC SMLREEL -INC SMLENTI -INC SMTABLE segment ibo integer ibon(n) endsegment LOGICAL PDR,RSPB,RSPD,TEST,ILOG1,ILOG2,TERMIN SEGMENT MBI INTEGER MBID(NN) ENDSEGMENT SEGMENT RBI REAL*8 RBID(NN) ENDSEGMENT LOGICAL LOGIN,LOGRE CHARACTER*8 TYPOBJ CHARACTER*1 CHARIN,CHARRE CHARACTER*3 CMETH POINTEUR MLREE4.MLREEL,mlent5.mlenti,mlree5.mlreel,mlree6.mlreel DELTA0=50.D0 XSMAX=500.D0 IPASS=1 IPART=0 MAXITE=100 ITTER=0 ITISAV=0 ITKSAV=0 IVGP=0 IVGM=0 IVGE=0 IVLAMB=0 IVXU=0 IVXL=0 IVU=0 IVN=0 IVD=0 IS0=0 IT0=0 MLAM1=0 IVGP=0 IVGE=0 IVGM=0 IPBASP=0 * * *TAB = EXCELL TAB ; * * IF(IERR.NE.0) RETURN * * * TRANSFORMATION DES INFORMATIONS DES TABLES EN SEGMENT * * REEL ( VECTEUR) OU MXMAT ( MATRICE) LES VALEURS .0 * SONT MISES DANS DES VARIABLES SEPAREES * * * VARIABLES X INITIALES IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT='('' VARIABLES X'')') TYPOBJ='TABLE' * TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,ITABLE) IF(IERR.NE.0) GO TO 1000 N=0 IF(IERR.NE.0) RETURN * DERIVEES DE F PAR RAPPORT A X. PUIS VALEUR DE F INITIALE IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT='('' VALEURS VF'')') TYPOBJ='TABLE' * TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,ITABLE) IF(IERR.NE.0) GO TO 1000 IF(IERR.NE.0) RETURN TYPOBJ='FLOTTANT' I = 0 * TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,IOBRE) * ** verification que pas de derivée nulle * mlree5=ivf segact mlree5 segini ibo nsup=0 xgr= 0. do iou=1,n enddo epscri= xgr * 1.e-30 do iou=1,n ibon(iou)=1 else ibon(iou)=0 * on debranche pour l'instant car pose probleme pour les reprises * nsup=nsup+1 endif enddo * elimination des pas bonnes et recopie des anciennes dans mlree6 if(nsup.ne.0)then jg=n mlree5=ivx0 mlree4=ivf segact mlree5,mlree4 segini mlree6 jg= n - nsup segini mlreel,mlree2 ia = 0 do iou=1,n if( ibon(iou).eq.1) then ia = ia + 1 endif enddo ivx0=mlreel ivf=mlree2 segdes mlree5,mlree4 nvr = n - nsup write(6,*) ' nombre de variables non prises en compte ' , nsup endif IF(IERR.NE.0) GO TO 1000 VF0=XVALRE * DERIVEES DES CJ PAR RAPPORT A X LE CJ0 SONT EN INDICE 0 ET SONT * RECUPERES JUSTE APRES IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT='('' VALEURS MC'')') TYPOBJ='TABLE' * TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,ITABLE) IF(IERR.NE.0) GO TO 1000 M = 0 if (iimpi.eq.1799) write (6,*) ' appel a tabmat(ITABLE,MC,M,N)' IF(IERR.NE.0) RETURN MXMAT=MC SEGACT MXMAT*MOD if(nsup.ne.0) then ldim2 = nvr ldim1=xmat(/1) segini mxma1 do iou=1,ldim1 ia = 0 do iyo=1,n if(ibon(iyo).eq.1) then ia=ia+1 mxma1.xmat(iou,ia)=xmat(iou,iyo) endif enddo enddo segsup mxmat mxmat=mxma1 mc=mxmat if( iimpi.eq.1799) then write(6,*) ' pointeur de mc ldim1 ldim2 ',mc,xmat(/1),xmat(/2) write(6,*) ' mc' , ( xmat(1,iou),iou=1,xmat(/2)) endif endif JG=XMAT(/1) SEGINI MLREEL IMC0=MLREEL DO 1 J=1,JG TYPOBJ=' ' * TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,IOBR) IF(TYPOBJ.NE.'TABLE ') GO TO 1 I= 0 TYPOBJ='FLOTTANT' * TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,IOBRE) 1 CONTINUE SEGDES MLREEL * VALEURS MINIMALES DES VARIABLES X IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT='('' VALEURS MINI DE X '')') TYPOBJ='TABLE' * TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,ITABLE) IF(IERR.NE.0) GO TO 1000 if(nsup.ne.0) then mlree4=ivxmin segact mlree4 jg=nvr segini mlree5 ia=0 do iou=1,n if(ibon(iou).eq.1) then ia=ia+1 endif enddo segsup mlree4 ivxmin=mlree5 endif IF(IERR.NE.0) RETURN * VALEURS MAXIMALES DES VARIABLES X IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT='('' VALEURS MAXI DE X '')') TYPOBJ='TABLE' * TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,ITABLE) IF(IERR.NE.0) GO TO 1000 if(nsup.ne.0) then mlree4=ivxmax segact mlree4 jg=nvr segini mlree5 ia=0 do iou=1,n if(ibon(iou).eq.1) then ia=ia+1 endif enddo segsup mlree4 ivxmax=mlree5 endif IF(IERR.NE.0) RETURN * VALEURS MAXIMALES DES CONTRAINTES CJ IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT='(''VALEURS MAXI DE CJ '')') TYPOBJ='TABLE' * TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,ITABLE) IF(IERR.NE.0) GO TO 1000 IF(IERR.NE.0) RETURN * VALEURS DES VARIABLES DISCRETES IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT='('' VALEURS DE MVD '')') TYPOBJ=' ' * TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,ITABLE) NVD=0 NNVD=0 IF(IERR.NE.0) RETURN IF(NVD.NE.0)THEN MXMAT=MVD if(nsup.ne.0) then ldim2 = nvr ldim1=xmat(/1) segini mxma1 do iou=1,ldim1 ia = 0 do iyo=1,n if(ibon(iyo).eq.1) then ia=ia+1 mxma1.xmat(iou,ia)=xmat(iou,iyo) endif enddo enddo segsup mxmat mxmat=mxma1 mvd=mxmat endif ENDIF * ITERATION IP IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT='(''VALEUR DE IP '')') TYPOBJ=' ' * TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,ITABLE) IF(TYPOBJ.EQ.'ENTIER ') THEN IP=IVALRE ELSE IP=1 ENDIF * valeur de delta0 TYPOBJ=' ' * TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,ITABLE) IF(TYPOBJ.EQ.'ENTIER ') THEN DELTA0=IVALRE ENDIF IF(TYPOBJ.EQ.'FLOTTANT') THEN DELTA0=XVALRE ENDIF * valeur de xsmax TYPOBJ=' ' * TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,ITABLE) IF(TYPOBJ.EQ.'ENTIER ') THEN XSMAX=IVALRE ENDIF IF(TYPOBJ.EQ.'FLOTTANT') THEN XSMAX=XVALRE ENDIF * valeur de maxite TYPOBJ=' ' * IOBIN,TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,ITABLE) IF(TYPOBJ.EQ.'ENTIER ') THEN MAXITE=IVALRE ENDIF * LECTURE DE L'OPTION CHOISIE IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT='('' OPTION CHOISIE '')') TYPOBJ=' ' * TYPOBJ,IVALRE,XVALRE,CMETH,LOGRE,ITABLE) IMETH=1 IF(TYPOBJ.EQ.'MOT ') THEN IF(CMETH.EQ.'MOV') IMETH=2 IF(CMETH.EQ.'LIN') IMETH=3 ENDIF * * POINTS PRECEDENTS * LIMITES PRECEDENTES IF(IP.EQ.1) THEN JG=N+1 SEGINI MLREEL,MLREE1 IVXPR1=MLREEL IVXPR2=MLREE1 SEGINI MLREE2,MLREE3 IVLL=MLREE2 IVUL=MLREE3 ELSE IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT='('' VARIABLES XP1'')') TYPOBJ='TABLE' * TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,ITABLE) IF(IERR.NE.0) GO TO 1000 IF(IERR.NE.0) RETURN IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT='('' VARIABLES XP2'')') TYPOBJ='TABLE' * TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,ITABLE) IF(IERR.NE.0) GO TO 1000 IF(IERR.NE.0) RETURN IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT='('' VARIABLES VUL '')') TYPOBJ='TABLE' * TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,ITABLE) IF(IERR.NE.0) GO TO 1000 IF(IERR.NE.0) RETURN JG=N+1 MLREEL=IVUL SEGADJ MLREEL IF(IERR.NE.0) RETURN IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT='('' VARIABLES VLL '')') TYPOBJ='TABLE' * TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,ITABLE) IF(IERR.NE.0) GO TO 1000 IF(IERR.NE.0) RETURN JG=N+1 MLREEL=IVLL SEGADJ MLREEL ENDIF * * VERIFICATION DU POINT DE DEPART * MLREEL=IVX0 MLREE1=IVXMAX MLREE2=IVXMIN SEGACT MLREEL*MOD,MLREE1*MOD,MLREE2*MOD N=jg DO 64 I=1,JG prod=prod/aux IF(PROD.GT.1D-4) THEN WRITE(6,63) WRITE(6,'(''!!LE POINT DE DEPART EST HORS-DOMAINE!!!'')') WRITE(6,63) 63 FORMAT('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!') GOTO 1000 ENDIF 64 CONTINUE * * calcu des Dj qui permettent de respecter les contraintes * en supposant que variable de relaxation egale DELTA0 * IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT='('' VALEURS DE WD '')') MLREEL=IVCMAX MLREE1=IMC0 SEGACT MLREEL*MOD,MLREE1*MOD JG=M SEGINI MLREE2 IWD=MLREE2 DO 17 K=1,M IF(Z.GT.1.D-20) THEN IF(IIMPI.GT.0) * WRITE(IOIMP,FMT='('' contrainte '',i3,'' pas satisfaite'')')K ELSE ENDIF 17 CONTINUE * * introduction de la variable de relaxation * N11 = N + 1 * dans X0 MLREEL = IVX0 SEGACT MLREEL*MOD IF(JG.NE.N11) GO TO 1000 SEGADJ MLREEL SEGDES MLREEL * dans Xmin MLREEL=IVXMIN SEGACT MLREEL*MOD IF(JG.NE.N11) GO TO 1000 SEGADJ MLREEL SEGDES MLREEL * dans Xmax MLREEL=IVXMAX SEGACT MLREEL*MOD IF(JG.NE.N11) GO TO 1000 SEGADJ MLREEL SEGDES MLREEL * dans les derivees de F MLREEL=IVF SEGACT MLREEL*MOD IF(JG.NE.N11) GO TO 1000 SEGADJ MLREEL SEGDES MLREEL * dans f(x0) contenu dans la variable VF0 VF0 = VF0 + 2. ** IP * (ABS( VF0)) * DELTA0 * dans les derivees de CJ MXMAT=MC MLREEL=IWD SEGACT MLREEL*MOD,MXMAT*MOD LDIM2=XMAT(/2)+1 LDIM1=XMAT(/1) if( iimpi.eq.1799) then write(6,*) ' mc pointeur ' , mc write(6,*) ' ldim1 ldim2 apres var relax',ldim1,ldim2 endif SEGADJ MXMAT DO 702 I=1,XMAT(/1) 702 CONTINUE SEGDES MLREEL,MXMAT * dans Cjmax MLREEL=IVCMAX MLREE1=IWD SEGACT MLREEL*MOD,MLREE1*MOD 703 CONTINUE SEGDES MLREEL,MLREE1 * dans cj0 MLREEL=IMC0 MLREE1=IWD SEGACT MLREEL*MOD,MLREE1*MOD 707 CONTINUE SEGDES MLREEL,MLREE1 * TYPOBJ=' ' * TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,ITABLE) IF(TYPOBJ.EQ.'FLOTTANT') THEN XPREC=XVALRE ELSEIF(TYPOBJ.EQ.'ENTIER ') THEN XPREC=IVALRE ELSE XPREC=500d0 ENDIF * * INTRODUCTION DES MOVE-LIMITS * IF (IMETH.EQ.1) THEN TYPOBJ=' ' * TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,ITABLE) IF(TYPOBJ.EQ.'TABLE ') THEN IF(IERR.NE.0) RETURN ELSE IF(TYPOBJ.EQ.'FLOTTANT') THEN XT0=XVALRE ELSEIF(TYPOBJ.EQ.'ENTIER ') THEN XT0=IVALRE ELSE XT0=0.333333d0 ENDIF JG=N11 SEGINI MLREEL IT0=MLREEL DO 704 I=1,JG 704 CONTINUE ENDIF ENDIF IF (IMETH.EQ.2) THEN TYPOBJ=' ' * TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,ITABLE) IF(TYPOBJ.EQ.'TABLE') THEN IF(IERR.NE.0) RETURN ELSE IF(TYPOBJ.EQ.'FLOTTANT') THEN XS0=XVALRE ELSEIF(TYPOBJ.EQ.'ENTIER ') THEN XS0=IVALRE ELSE XS0=0.7d0 ENDIF JG=N11 SEGINI MLREEL IS0=MLREEL DO 705 I=1,JG 705 CONTINUE ENDIF ENDIF * IVLL,IVUL,IVMIN,IVMAX,IMETH,IT0,IS0,XSMAX) * * SAUVEGARDE DES DERNIERES VALEURS DE VX0 * MLREEL=IVX0 MLREE1=IVXPR1 MLREE2=IVXPR2 SEGACT MLREEL*MOD,MLREE1*MOD,MLREE2*MOD DO 51 I=1,N 51 CONTINUE * * MODIFICATION DE LA VALEUR DE X * MLREEL=IVX0 MLREE1=IVUL MLREE2=IVLL SEGACT MLREEL*MOD,MLREE1*MOD,MLREE2*MOD SEGINI MLREE3,MLREE4 IVX0U=MLREE3 IVX0L=MLREE4 DO 52 I=1,JG 52 CONTINUE 57 FORMAT(' VALEUR DE DEPART EN VX0U : ',/,(1X,5E12.5)) 58 FORMAT(' VALEUR DE DEPART EN VX0L : ',/,(1X,5E12.5)) * * LINEARISATIONS CONVEXE DE F * MLREEL=IVF MLREE1=IVX0U MLREE2=IVX0L SEGACT MLREEL*MOD,MLREE1*MOD,MLREE2*MOD SEGINI,MLREE3 IVFP=MLREE3 SEGINI,MLREE4 IVFQ=MLREE4 DO 3 I=1,JG ELSE ENDIF 3 CONTINUE 4 FORMAT(' SENSIBILITES TYPE + DE F LINEARISEE : ',/,(1X,5E12.5)) 41 FORMAT(' SENSIBILITES TYPE - DE F LINEARISEE : ',/,(1X,5E12.5)) DO 53 I=1,N11 53 CONTINUE * * LINEARISATION CONVEXE DES CONTRAINTE CJ * MXMAT=MC SEGACT MXMAT*MOD LDIM1=XMAT(/1) LDIM2=XMAT(/2) if(iimpi.eq.1799) then write(6,*) ' xmat de mc' , (xmat(1,iou),iou=1,xmat(/2)) endif IF(LDIM2.NE.N11) GO TO 1000 SEGINI MXMA1 MCP=MXMA1 SEGINI MXMA2 MCQ=MXMA2 MLREE1=IVX0U MLREE3=IVX0L MLREEL=IVCMAX MLREE2=IMC0 SEGACT MLREEL*MOD,MLREE1*MOD,MLREE2*MOD,MLREE3*MOD JG=LDIM1 SEGINI MLREE4 IVB=MLREE4 DO 5 I=1,LDIM1 TIN=0. DO 7 J=1,N11 IF(XMAT(I,J).GT.0.D0) THEN ELSE ENDIF 7 CONTINUE 5 CONTINUE MLREEL=IWD MLREE1=IVB SEGACT MLREEL*MOD,MLREE1*MOD DO 56 I=1,JG IF(IIMPI.EQ.1799) WRITE(IOIMP,8)I,(MXMA1.XMAT(I,K),K=1,N11) 8 FORMAT(' SENSIBILITES TYPE + DE C',I3,' LINEARISEE : ', * /,(1X,5E12.5)) IF(IIMPI.EQ.1799) WRITE(IOIMP,9)I,(MXMA2.XMAT(I,K),K=1,N11) 9 FORMAT(' SENSIBILITES TYPE - DE C',I3,' LINEARISEE : ', * /,(1X,5E12.5)) 56 CONTINUE 6 FORMAT(' VALEURS DE IVB LINEARISEE : ',(1X,5E12.5)) * * CHANGEMENT DE VARIABLES DE XMAX * MLREEL=IVUL MLREE1=IVLL MLREE2=IVMAX SEGACT MLREEL*MOD,MLREE1*MOD,MLREE2*MOD SEGINI MLREE3,MLREE4 IVMAXU=MLREE3 IVMAXL=MLREE4 DO 10 I=1,JG 10 CONTINUE 11 FORMAT(' BORNES MAXIMA EN U ',/,(1X,5E12.5)) 12 FORMAT(' BORNES MAXIMA EN L ',/,(1X,5E12.5)) * * CHANGEMENT DE VARIABLES DE XMIN * MLREEL=IVUL MLREE1=IVLL MLREE2=IVMIN SEGACT MLREEL*MOD,MLREE1*MOD,MLREE2*MOD SEGINI MLREE3,MLREE4 IVMINU=MLREE3 IVMINL=MLREE4 DO 54 I=1,JG 54 CONTINUE 14 FORMAT(' BORNES MINIMA EN U ',/,(1X,5E12.5)) 15 FORMAT(' BORNES MINIMA EN L ',/,(1X,5E12.5)) * * NORMALISATION DES VARIABLES DISCRETES * IF(NVD.NE.0) THEN MXMAT=MVD SEGACT MXMAT*MOD NDIS=XMAT(/2) LDIM1=XMAT(/1) LDIM2=NDIS+2 SEGINI MXMA1 NMVD=MXMA1 DO 19 I=1,NVD DO 19 J=2,NDIS+1 MXMA1.XMAT(I,J)=XMAT(I,J-1) 19 CONTINUE MLREEL=IVUL MLREE1=IVLL SEGACT MLREEL*MOD,MLREE1*MOD JG=LDIM1 SEGINI MLENTI IDVD=MLENTI MVD=NMVD MXMAT=MVD SEGACT MXMAT*MOD LDIM1=XMAT(/1) LDIM2=XMAT(/2) SEGINI MXMA1,MXMA2 MVDU=MXMA1 MVDL=MXMA2 DO 18 I=1,NVD DO 13 J=2,NDIS+2 IF(XMAT(I,J).LT.1.D-20) THEN LECT(I)=J-1 XMAT(I,J)=XGRAND MXMA1.XMAT(I,J)=XGRAND MXMA2.XMAT(I,J)=XGRAND GO TO 18 ENDIF 13 CONTINUE 18 CONTINUE * IF(IIMPI.EQ.1799)THEN WRITE(IOIMP,'('' NOUVELLE MATRICE MVDU'')') DO 20 I=1,LDIM1 WRITE(IOIMP,'('' LIGNE '',I2)')I DO 20 J=1,LDIM2 WRITE(IOIMP,'(E12.5)')MXMA1.XMAT(I,J) 20 CONTINUE ENDIF IF(IIMPI.EQ.1799)THEN WRITE(IOIMP,'('' NOUVELLE MATRICE MVDL'')') DO 55 I=1,LDIM1 WRITE(IOIMP,'('' LIGNE '',I2)')I DO 55 J=1,LDIM2 WRITE(IOIMP,'(E12.5)')MXMA2.XMAT(I,J) 55 CONTINUE ENDIF ENDIF * * INITIALISATION DE L ALGORITHME * JG=M SEGINI MLREEL IVLAMB=MLREEL DO 16 I=1,JG 16 CONTINUE * * INITIALISATION DES PARAMETRES DE CONTROLES * TERMIN=.FALSE. PDR=.FALSE. RSPB=.FALSE. RSPD=.FALSE. NDR=0 EPSILO=0.001 JG=0 SEGINI MLENT1,MLENT2 ITI=MLENT1 ITK=MLENT2 JG=M SEGINI MLENTI MDR=MLENTI NDP=1 XL=0. NPDR=0 XLL=0. LDIM1=M LDIM2=M SEGINI MXMAT MP=MXMAT * * * DEBUT DE TOURNER EN ROND * * IT=0 JG= M SEGINI MLENTI IPBASE=MLENTI 101 CONTINUE IF(IIMPI.EQ.1799) *WRITE(IOIMP,FMT='('' ETAPE1: CALCUL DE X LAMBDA '')') *IVMINU,IVMINL,IVMAXU,IVMAXL,IVU,IVN,IVD,IVUL,IVLL,IVXU,IVXL) 102 CONTINUE IF(IT.EQ.0) THEN MLREEL=IVXU MLREE3=IVXL MLREE1=IVN MLREE2=IVD SEGACT MLREEL*MOD,MLREE1*MOD,MLREE2*MOD,MLREE3*MOD ENDIF IF(IIMPI.EQ.1799) *WRITE(IOIMP,FMT='('' ETAPE2:CALCUL DE LA DIRECTION DE MONTEE'')') IF(IT.GT.0 ) THEN IVZZ=IVGE ENDIF IVDR=IVGM IF(IT.EQ.0) THEN MLREEL=IVGM SEGACT MLREEL*MOD 10014 FORMAT(' VALEUR DE GRAD ',/ ,(1X,5(E12.5))) ENDIF * ON CONTINUE OBLIGATOIREMENT EN NDP=3 103 CONTINUE ITTER=ITTER+1 MLREEL=IVDR MLENTI=MDR DO 1020 I=1,M 1020 CONTINUE IF(ITTER.GT.MAXITE) THEN INTERR(1)=MAXITE GO TO 116 ENDIF IF(IIMPI.EQ.1799) *WRITE(IOIMP,FMT='('' ETAPE3:TEST NORME DIRECTION DE RECHERCHE'')') IF(IIMPI.NE.0) WRITE(6,1564) ITTER,XNORZ 1564 FORMAT(' iteration ', I5,' critere : ',E12.5) ***** TEST BIDON POUR CREER UN GO TO EN 104||| IF(IOIMP.EQ.-598) GO TO 104 IF(ITTER.EQ.1) THEN EPSILO= XNORZ / XPREC c WRITE(IOIMP,FMT='('' valeur du test de convergence'' c $ ,2e12.5 )') EPSILO,XPREC ENDIF IF( XNORZ.LE.EPSILO.AND.IPART.NE.1) THEN GO TO 116 ELSE IPART=0 GO TO 106 ENDIF 104 CONTINUE IF(IIMPI.EQ.1799) *WRITE(IOIMP,FMT='('' ETAPE4: CALCUL DU HESSIEN'')') IF ( IT .GT.0) THEN IF(XRES.EQ.0.D0) THEN IF(IIMPI.GT.1) *WRITE(IOIMP,FMT='('' COMBINAISON DES RECHERCHES IMPOSSIBLE'')') GO TO 106 ELSE IF(IIMPI.EQ.1799) * WRITE(IOIMP,FMT='('' COMBINAISON DES RECHERCHES POSSIBLE'')') GO TO 105 ENDIF ELSE IF(IIMPI.GT.1) * WRITE(IOIMP,FMT='('' COMBINAISON DES RECHERCHES IMPOSSIBLE'')') GO TO 106 ENDIF 105 CONTINUE IF(IIMPI.GT.1) WRITE(IOIMP,FMT= *'('' ETAPE5 CONJUGAISON DES DIRECTIONS DE RECHERCHE'' )') * ON VA OBLIGATOIREMENT EN NDP=6 106 CONTINUE IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT='( *'' ETAP6 RECHERCHE LINEAIRE SUIVANT LA DIRECTION DE RECHERCHE'')') * M,N,NVD,IVFP,IVFQ,MVDU,MVDL,IVB,IVD,IVN,II,KK,IVDR,IDVD, * NDR,TERMIN,IVLL,IVUL,IPBASE) IF(TERMIN)THEN ITI=ITISAV ITK=ITKSAV NPDR=NPDRSV GO TO 121 ENDIF IF(II.GT.0) THEN IF(KK.EQ.-3) THEN MLENTI=IPBASE SEGACT MLENTI*MOD LECT(II)=1 SEGDES MLENTI ENDIF ENDIF *IVMINU,IVMINL,IVMAXU,IVMAXL,IVU,IVN,IVD,IVUL,IVLL,IVXU,IVXL) MLREEL=IVLAMB SEGACT MLREEL*MOD IF(IIMPI.GT.1) WRITE(IOIMP,FMT= MLREEL=IVGM SEGACT MLREEL*MOD IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT=' *('' VALEUR DU GRADIENT MODIF SORTIE ETAPE6 : '',/,(1X,5E12.5))') IF(IIMPI.GT.1) WRITE(IOIMP,FMT='('' VALEUR DE II ETAPE6 *: '',/,(1X,I2))')II IF(IIMPI.GT.1) WRITE(IOIMP,FMT='('' VALEUR DE KK ETAPE6 *: '',/,(1X,I2))')KK MLREEL=IVXU SEGACT MLREEL*MOD IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT='('' VALEUR DE VXU : '' MLREEL=IVXL SEGACT MLREEL*MOD IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT='('' VALEUR DE VXL : '' * ON VA OBLIGATOIREMENT EN NDP=7 107 CONTINUE IF(IIMPI.GT.1)WRITE(IOIMP,FMT='('' ETAPE7: TEST ... '')') IF(II.GT.0) THEN IF(KK.GT.0) THEN RSPD=.TRUE. RSPB=.FALSE. IF(IIMPI.GT.1) WRITE(IOIMP,FMT=' *('' LA RECHERCHE SE TERMINE SUR UN PLAN DE DISCONTINUITE '')') GO TO 111 ENDIF ENDIF IF(IIMPI.GT.1)WRITE(IOIMP,FMT=' * ('' LA RECHERCHE NE SE TERMINE'', *''PAS SUR UN PLAN DE DISCONTINUITE '')') * EN CE CAS ON CONTINUE OBLIGATOIREMENT EN NDP=8 108 CONTINUE IF(IIMPI.GT.1)WRITE(IOIMP,FMT='('' ETAPE8: TEST ... '')') IF(II.GT.0) THEN IF(KK.EQ.-3) THEN RSPD=.FALSE. RSPB=.TRUE. IF(IIMPI.GT.1)WRITE(IOIMP,FMT=' *('' LA RECHERCHE SE TERMINE SUR UN PLAN DE BASE '')') GO TO 110 ENDIF ENDIF IF(IIMPI.GT.1) WRITE(IOIMP,FMT=' *('' LA RECHERCHE NE SE TERMINE PAS SUR UN PLAN DE BASE '')') * EN CE CAS ON CONTINUE OBLIGATOIREMENT EN NDP=9 109 CONTINUE RSPD=.FALSE. * RSPB=.FALSE. IF(IIMPI.GT.1)WRITE(IOIMP,FMT='('' ETAPE9: TEST ... '')') IF(IIMPI.EQ.1799)WRITE(IOIMP,FMT=' *('' PREMIER PLAN DE DISCONTINUITE ?'')') IF(PDR) THEN GO TO 115 ELSE IF(IPASS.EQ.1) THEN MLREEL=IVLAMB SEGINI,MLREE1=MLREEL MLAM1=MLREE1 SEGDES MLREE1 ELSEIF(IPASS.EQ.3) THEN IPART=1 MLREEL=IVGM IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT=' * ('' VALEUR DU GRADIENT MODIF SORTIE PARTAN: '', IPASS=0 ENDIF IPASS=IPASS + 1 IT = IT + 1 IVDR=IVGM GO TO 103 ENDIF 110 CONTINUE IF(IIMPI.GT.1)WRITE(IOIMP,FMT='('' ETAPE10: TEST ... '')') IF(PDR) THEN GO TO 114 ELSE IPASS=1 IT = IT + 1 IVDR=IVGM GO TO 103 ENDIF 111 CONTINUE NPDR=NPDR + 1 IF(IIMPI.GT.1) *WRITE(IOIMP,FMT='('' ETAPE11: UN NOUVEAU PLAN DE '', *''DISCONTINUITE EST PRIS EN COMPTE '')') IF(IIMPI.GT.1) *WRITE(IOIMP,FMT='('' NOMBRE DE PLAN DE DISCONTINUITE '', *''A CONSIDERER :'',I4)')NPDR IF(IIMPI.GT.1)WRITE(IOIMP,FMT=' *('' INDICE DE LA VARIABLE DISCRETE :'',I4)')II IF(IIMPI.GT.1) *WRITE(IOIMP,FMT='('' INDICE DE SA VALEUR :'',I4)')KK JG=NPDR MLENT1=ITI MLENT2=ITK SEGADJ MLENT1 SEGADJ MLENT2 MLENT1.LECT(JG)=II MLENT2.LECT(JG)=KK IF(PDR) THEN GO TO 113 ENDIF * SINON ON CONTINUE OBLIGATOIREMENT EN 112 112 CONTINUE PDR=.TRUE. IF(IIMPI.GT.1) WRITE(IOIMP,FMT=' *('' ETAP12 : INITIALISATION DE LA MATRICE DE PROJECTION'')') MXMAT=MP JG=M SEGINI MLREE1 MLREEL=IVGE IF(IVGP.NE.0) THEN MLREEL=IVGP SEGSUP MLREEL ENDIF IVGP=MLREE1 IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT=' *('' VALEUR DU GRADIENT PROJETE DANS ETAPE12 : '',/,(1X,5E12.5))') MLREE2=IVLAMB JG=0 SEGINI MLENTI DO 130 I=1,M JG=JG+1 SEGADJ MLENTI IF(IIMPI.GT.1) WRITE(IOIMP,FMT='( *'' ON CONSIDERE DANS L INITIALISATION LE PLAN DE BASE :'',I2)')I LECT(JG)=I ENDIF ENDIF 130 CONTINUE IF(JG.NE.0)THEN DO 131 I=1,JG IK=LECT(I) 131 CONTINUE SEGSUP MLENTI ENDIF GO TO 115 113 CONTINUE IF(IIMPI.GT.1)WRITE(IOIMP,FMT=' *('' ETAPE13 : REMISE A JOUR DE LA MATRICE DE PROJECTION '')') IF(IIMPI.GT.1)THEN WRITE(IOIMP,'('' MATRICE DE PROJECTION REMISE A JOUR DISCONTI'')') ENDIF GO TO 115 114 CONTINUE IF(IIMPI.GT.1)WRITE(IOIMP,FMT=' *('' ETAPE14 : REMISE A JOUR DE LA MATRICE DE PROJECTION '')') IF(IIMPI.GT.1)THEN WRITE(IOIMP,'('' MATRICE DE PROJECTION REMISE A JOUR BASE'')') ENDIF * ON CONTINUE OBLIGATOIREMENT EN 115 115 CONTINUE MXMAT=MP IF(IIMPI.GT.1)WRITE(IOIMP,FMT=' *('' ETAPE15 : PROJECTION DU GRADIENT DE LA FONCTION DUALE'')') MLREEL=IVGE SEGINI MLREE1 MXMAT=MP IF( IVGP.NE.0) THEN MLREE2=IVGP SEGSUP MLREE2 ENDIF IVGP=MLREE1 IT=IT+1 IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT=' *('' VALEUR DU GRADIENT PROJETE : '',/,(1X,5E12.5))') IVDR=IVGP GO TO 103 116 CONTINUE IF(IIMPI.GT.1) WRITE(IOIMP,FMT='('' ETAPE 16 : TEST ... '')') IF(IIMPI.GT.1)WRITE(IOIMP,FMT=' *('' REDEMARRAGE '')') IF(RSPB) THEN IF(IIMPI.GT.1)WRITE(IOIMP,FMT=' *('' PLAN DE BASE RENCONTRE '')') IF(IPBASP.NE.0) THEN MLENT1=IPBASP SEGACT MLENT1*MOD MLENTI=IPBASE SEGACT MLENTI*MOD IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT=' *('' VALEUR DE IPBASE : '',/,(1X,5I2))') *( LECT(I),I=1,M) IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT=' *('' VALEUR DE IPBASP : '',/,(1X,5I2))') *( MLENT1.LECT(I),I=1,M) DO 1160 IU=1,M IF( MLENT1.LECT(IU).NE. 0 )GO TO 1161 1160 CONTINUE GO TO 1162 1161 SEGSUP MLENT1 ENDIF IPBASP=IPBASE JG = M SEGINI MLENTI IPBASE=MLENTI *IVMINU,IVMINL,IVMAXU,IVMAXL,IVU,IVN,IVD,IVUL,IVLL,IVXU,IVXL) C avant NTAPE2, IVDR=IVGM or IVGM est "recree", on met le nouveau IVGM dans IVDR IVDR=IVGM GO TO 103 1162 CONTINUE * ON CONTINUE EN 117 ENDIF IF(RSPD) THEN IF(IIMPI.GT.1) WRITE(IOIMP,FMT=' *('' PLAN DE DISCONTINUITE RENCONTRE'')') ENDIF IF(.NOT.PDR) GO TO 122 * ON CONTINUE EN 117 117 CONTINUE IF(IIMPI.GT.1) WRITE(IOIMP,FMT=' * ('' ETAPE 17 : TEST DE REDEMARRAGE '')') IF(NDR.EQ.5) GO TO 121 MLREE2=IBU MLREE3=IBL SEGACT MLREE2*MOD,MLREE3*MOD IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT='('' VALEURS DE X APRES ETAP17 IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT='('' VALEURS DE X APRES ETAP17 MLENT1=ITI MLENT2=ITK JG=MLENT1.LECT(/1) IF(ITISAV.NE.0) THEN MLENTI= ITISAV SEGSUP MLENTI ENDIF IF(ITKSAV.NE.0) THEN MLENTI= ITKSAV SEGSUP MLENTI ENDIF SEGINI MLENTI SEGINI MLENT3 ITISAV=MLENTI ITKSAV=MLENT3 NPDRSV=NPDR DO 140 I=1,JG LECT(I)=MLENT1.LECT(I) MLENT3.LECT(I)=MLENT2.LECT(I) 140 CONTINUE PDR=.FALSE. MXMAT=MP SEGSUP MXMAT IF(RSPD) THEN MLENT1=ITI MLENT2=ITK MLENT1.LECT(1)=MLENT1.LECT(NPDR) MLENT2.LECT(1)=MLENT2.LECT(NPDR) NPDR=1 RSPD=.FALSE. GO TO 112 ENDIF 119 CONTINUE IF(IIMPI.GT.1) WRITE(IOIMP,FMT='('' ETAPE19 : TEST ..'')') IF(RSPB)THEN RSPB=.FALSE. IF(IIMPI.GT.1) WRITE(IOIMP,FMT='('' ETAPE19 PRISE EN COMPTE DU *PLAN DE BASE NO :'',I4)')II MLENTI=MDR LECT(II)=1 ENDIF NPDR=0 GO TO 101 ENDIF 121 CONTINUE IF(IIMPI.GT.1) WRITE(IOIMP,FMT='('' FIN DES RECHERCHES'')') IF(IIMPI.GT.1)WRITE(IOIMP,FMT='('' ETAPE21 : SELECTION DES VARIA *BLES DISCRETES OPTIMALES '')') * NPDR,N,MCP,MCQ,M,MVDU,MVDL,ITI,ITK) MLREE1=IBU MLREE2=IBL SEGACT MLREE1*MOD,MLREE2*MOD IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT='('' VALEURS DE X APRES SELECT IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT='('' VALEURS DE X APRES SELECT MLREE3=IVXU MLREE4=IVXL SEGACT MLREE3*MOD,MLREE4*MOD DO 1220 I=1,JG 1220 CONTINUE * ON CONTINUE EN 122 122 CONTINUE IF(IIMPI.GT.1) WRITE(IOIMP,FMT='('' ETAPE 22 : FIN DE L ALGORITHME * '')') * CALL ETAP22(IVX,IVX0,N,IVF,IVLL,IVUL) INTERR(1)=ITTER MLREE1=IVXU MLREE2=IVXL MLREE3=IVUL MLREE4=IVLL SEGACT MLREE1*MOD SEGACT MLREE2*MOD SEGACT MLREE3*MOD SEGACT MLREE4*MOD JG=N SEGINI MLREEL IVX=MLREEL DO 1221 I=1,JG IF(IIMPI.EQ.17) 1221 CONTINUE IF(IIMPI.GT.1) WRITE(IOIMP,FMT='('' VALEUR DE X EN SORTIE :'',/, * * SAUVEGARDE DE VX DANS VX0 MLREEL=IVX0 MLREE1=IVX SEGACT MLREEL*MOD,MLREE1*MOD DO 65 I=1,N 65 CONTINUE if(nsup.ne.0) then n=jg segini mlree5 ia=0 do iou=1,jg if(ibon(iou).eq.1) then ia=ia+1 else endif enddo ivx0=mlree5 segsup mlreel mlreel=mlree5 segsup ibo endif * * 'TABLE',IVALRE,XVALRE,CHARRE,LOGRE,IRET) * 'TABLE',IVALRE,XVALRE,CHARRE,LOGRE,IRET) * 'TABLE',IVALRE,XVALRE,CHARRE,LOGRE,IRET) * 'TABLE',IVALRE,XVALRE,CHARRE,LOGRE,IRET) * 'TABLE',IVALRE,XVALRE,CHARRE,LOGRE,IRET) * * MTABLE=ITAB SEGDES MTABLE MLREEL=IVX MLREE1=IVN MLREE2=IVD MLENTI=IVU SEGSUP MLREEL,MLREE1,MLREE2,MLENTI MLREEL = IVF MXMAT=MC MLREE1=IMC0 SEGSUP MLREEL,MXMAT,MLREE1 MLREEL=IVXMIN MLREE1=IVXMAX MLREE2=IVCMAX SEGSUP MLREEL,MLREE1,MLREE2 MLREEL=IWD MLREE1=IVFP MLREE2=IVFQ SEGSUP MLREEL,MLREE1,MLREE2 MXMAT=MCP MXMA1=MCQ SEGSUP MXMAT,MXMA1 MLREEL=IVLAMB SEGSUP MLREEL MLENTI=ITI MLENT1=ITK SEGSUP MLENTI,MLENT1 IF(NVD.NE.0) THEN MLENTI=IDVD MXMAT=MVD MXMA1=MVDU MXMA2=MVDL SEGSUP MLENTI,MXMAT,MXMA1,MXMA2 ENDIF MXMAT=MP SEGSUP MXMAT MLREEL=IVXPR1 MLREE1=IVXPR2 SEGSUP MLREEL,MLREE1 MLREEL=IVMIN MLREE1=IVMAX SEGSUP MLREEL,MLREE1 MLREEL=IVXU MLREE1=IVXL MLREE2=IVMINU MLREE3=IVMINL SEGSUP MLREEL,MLREE1,MLREE2,MLREE3 MLREEL=IVMAXU MLREE1=IVMAXL MLREE2=IVB SEGSUP MLREEL,MLREE1,MLREE2 MLREEL=IVUL MLREE1=IVLL MLREE2=IVX0U MLREE3=IVX0L SEGSUP MLREEL,MLREE1,MLREE2,MLREE3 MLREEL=MLAM1 MLREE1=IVGE MLREE2=IVGM MLREE3=IVGP SEGSUP MLREEL,MLREE1,MLREE2,MLREE3 IF( IT0.NE.0) THEN MLREEL=IT0 SEGSUP MLREEL ENDIF IF( IS0.NE.0) THEN MLREEL=IS0 SEGSUP MLREEL ENDIF RETURN 1000 CONTINUE RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales