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 ;
*
*
      CALL LIROBJ('TABLE',ITAB,1,IRETOU)
      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'
      CALL ACCTAB(ITAB,'MOT     ',IVALIN,XVALIN,'VX0',LOGIN,IOBIN,
     *                   TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,ITABLE)
      IF(IERR.NE.0) GO TO 1000
      N=0
      CALL TABVEC(ITABLE,IVX0,N)
      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'
      CALL ACCTAB(ITAB,'MOT     ',IVALIN,XVALIN,'VF',LOGIN,IOBIN,
     *                  TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,ITABLE)
      IF(IERR.NE.0) GO TO 1000
      CALL TABVEC(ITABLE,IVF,N)
      IF(IERR.NE.0) RETURN
      TYPOBJ='FLOTTANT'
      I = 0
      CALL ACCTAB(ITABLE,'ENTIER  ',I,XVALIN,CHARIN,LOGIN,IOBIN,
     *                  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
        if( abs(mlree5.prog(iou)).gt.xgr) xgr = abs(mlree5.prog(iou))
       enddo
       epscri= xgr * 1.e-30
       do iou=1,n
       if( abs(mlree5.prog(iou)).gt.0.d0) then
        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
         mlree6.prog(iou)=mlree5.prog(iou)
         if( ibon(iou).eq.1) then
           ia = ia + 1
           prog(ia)=mlree5.prog(iou)
           mlree2.prog(ia)=mlree4.prog(iou)
         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'
      CALL ACCTAB(ITAB,'MOT     ',IVALIN,XVALIN,'MC',LOGIN,IOBIN,
     *                  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)'
      CALL 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=' '
         CALL ACCTAB(ITABLE,'ENTIER  ',J,XVALIN,CHARIN,LOGIN,IOBIN,
     *                      TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,IOBR)
         IF(TYPOBJ.NE.'TABLE   ') GO TO 1
         I= 0
         TYPOBJ='FLOTTANT'
         CALL ACCTAB(IOBR,'ENTIER  ',I,XVALIN,CHARIN,LOGIN,IOBIN,
     *                   TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,IOBRE)
         PROG(J)=XVALRE
   1  CONTINUE
      SEGDES MLREEL
* VALEURS MINIMALES DES VARIABLES X
      IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT='(''  VALEURS MINI DE X '')')
      TYPOBJ='TABLE'
      CALL ACCTAB(ITAB,'MOT     ',IVALIN,XVALIN,'VXMIN',LOGIN,IOBIN,
     *                     TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,ITABLE)
      IF(IERR.NE.0) GO TO 1000
      CALL TABVEC(ITABLE,IVXMIN,N)
      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
          mlree5.prog(ia)=mlree4.prog(iou)
         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'
      CALL ACCTAB(ITAB,'MOT     ',IVALIN,XVALIN,'VXMAX',LOGIN,IOBIN,
     *                     TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,ITABLE)
      IF(IERR.NE.0) GO TO 1000
      CALL TABVEC(ITABLE,IVXMAX,N)
      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
          mlree5.prog(ia)=mlree4.prog(iou)
         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'
      CALL ACCTAB(ITAB,'MOT     ',IVALIN,XVALIN,'VCMAX',LOGIN,IOBIN,
     *                     TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,ITABLE)
      IF(IERR.NE.0) GO TO 1000
      CALL TABVEC(ITABLE,IVCMAX,M)
      IF(IERR.NE.0) RETURN
* VALEURS DES VARIABLES DISCRETES
      IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT='(''  VALEURS DE MVD '')')
      TYPOBJ='        '
      CALL ACCTAB(ITAB,'MOT     ',IVALIN,XVALIN,'VDIS',LOGIN,IOBIN,
     *                    TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,ITABLE)
      NVD=0
      NNVD=0
      IF( ITABLE.NE.0) CALL TABMAT(ITABLE,MVD,NVD,NNVD)
      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='      '
      CALL ACCTAB(ITAB,'MOT     ',IVALIN,XVALIN,'IP',LOGIN,IOBIN,
     *                    TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,ITABLE)
      IF(TYPOBJ.EQ.'ENTIER  ') THEN
          IP=IVALRE
      ELSE
          IP=1
      ENDIF
* valeur de delta0
      TYPOBJ='      '
      CALL ACCTAB(ITAB,'MOT     ',IVALIN,XVALIN,'DELTA0',LOGIN,IOBIN,
     *                    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='      '
      CALL ACCTAB(ITAB,'MOT     ',IVALIN,XVALIN,'XSMAX',LOGIN,IOBIN,
     *                    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='      '
      CALL ACCTAB(ITAB,'MOT     ',IVALIN,XVALIN,'MAXITERATION',LOGIN,
     *  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='        '
      CALL ACCTAB(ITAB,'MOT     ',IVALIN,XVALIN,'METHODE',LOGIN,IOBIN,
     *                     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'
      CALL ACCTAB(ITAB,'MOT     ',IVALIN,XVALIN,'VXPRE1',LOGIN,IOBIN,
     *                  TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,ITABLE)
          IF(IERR.NE.0) GO TO 1000
          CALL TABVEC(ITABLE,IVXPR1,N)
          IF(IERR.NE.0) RETURN
          IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT='('' VARIABLES XP2'')')
          TYPOBJ='TABLE'
      CALL ACCTAB(ITAB,'MOT     ',IVALIN,XVALIN,'VXPRE2',LOGIN,IOBIN,
     *                   TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,ITABLE)
          IF(IERR.NE.0) GO TO 1000
          CALL TABVEC(ITABLE,IVXPR2,N)
          IF(IERR.NE.0) RETURN
          IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT='('' VARIABLES VUL '')')
          TYPOBJ='TABLE'
      CALL ACCTAB(ITAB,'MOT     ',IVALIN,XVALIN,'VUL',LOGIN,IOBIN,
     *                   TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,ITABLE)
          IF(IERR.NE.0) GO TO 1000
          CALL TABVEC(ITABLE,IVUL,N)
          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'
      CALL ACCTAB(ITAB,'MOT     ',IVALIN,XVALIN,'VLL',LOGIN,IOBIN,
     *                  TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,ITABLE)
          IF(IERR.NE.0) GO TO 1000
          CALL TABVEC(ITABLE,IVLL,N)
          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
      JG=PROG(/1)
      N=jg
      DO 64 I=1,JG
      PROD=(MLREE1.PROG(I)-PROG(I))*(MLREE2.PROG(I)-PROG(I))
      aux=1d0+abs(MLREE2.PROG(I))+abs(MLREE1.PROG(I))
      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
        Z=MLREE1.PROG(K)-PROG(K)
       IF(Z.GT.1.D-20) THEN
          MLREE2.PROG(K)=Z/(1.-1./DELTA0)
       IF(IIMPI.GT.0)
     * WRITE(IOIMP,FMT='('' contrainte '',i3,'' pas satisfaite'')')K
        ELSE
          MLREE2.PROG(K)=0.D0
        ENDIF
   17 CONTINUE
*
*   introduction de la variable  de relaxation
*
      N11 = N + 1
* dans X0
      MLREEL = IVX0
      SEGACT MLREEL*MOD
      JG=PROG(/1) + 1
      IF(JG.NE.N11) GO TO 1000
      SEGADJ MLREEL
      PROG(JG)=DELTA0
      SEGDES MLREEL
* dans Xmin
      MLREEL=IVXMIN
      SEGACT MLREEL*MOD
      JG=PROG(/1) + 1
      IF(JG.NE.N11) GO TO 1000
      SEGADJ MLREEL
      PROG(JG)=1.D0
      SEGDES MLREEL
* dans Xmax
      MLREEL=IVXMAX
      SEGACT MLREEL*MOD
      JG=PROG(/1) + 1
      IF(JG.NE.N11) GO TO 1000
      SEGADJ MLREEL
      PROG(JG)=XSMAX
      SEGDES MLREEL
* dans les derivees de F
      MLREEL=IVF
      SEGACT MLREEL*MOD
      JG=PROG(/1) + 1
      IF(JG.NE.N11) GO TO 1000
      SEGADJ MLREEL
      PROG(JG)=2. ** IP  * (ABS(VF0))
      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
      DELT=-1. / ( DELTA0 * DELTA0)
      DO 702 I=1,XMAT(/1)
      XMAT(I,LDIM2)=PROG(I)* DELT
  702 CONTINUE
      SEGDES MLREEL,MXMAT
* dans Cjmax
      MLREEL=IVCMAX
      MLREE1=IWD
      SEGACT MLREEL*MOD,MLREE1*MOD
      DO 703 I=1,PROG(/1)
      PROG(I)=PROG(I) + MLREE1.PROG(I)
  703 CONTINUE
      SEGDES MLREEL,MLREE1
*  dans cj0
      MLREEL=IMC0
      MLREE1=IWD
      SEGACT MLREEL*MOD,MLREE1*MOD
      DO 707 I=1,PROG(/1)
      PROG(I)=PROG(I) - MLREE1.PROG(I)/DELTA0
  707 CONTINUE
      SEGDES MLREEL,MLREE1
*
         TYPOBJ=' '
      CALL ACCTAB(ITAB,'MOT     ',IVALIN,XVALIN,'PREC',LOGIN,IOBIN,
     *                  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=' '
      CALL ACCTAB(ITAB,'MOT     ',IVALIN,XVALIN,'T0',LOGIN,IOBIN,
     *                  TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,ITABLE)
         IF(TYPOBJ.EQ.'TABLE   ') THEN
            CALL TABVEC(ITABLE,IT0,N11)
            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
             PROG(I)=XT0
  704       CONTINUE
         ENDIF
      ENDIF
      IF (IMETH.EQ.2) THEN
         TYPOBJ='        '
      CALL ACCTAB(ITAB,'MOT     ',IVALIN,XVALIN,'S0',LOGIN,IOBIN,
     *                  TYPOBJ,IVALRE,XVALRE,CHARRE,LOGRE,ITABLE)
         IF(TYPOBJ.EQ.'TABLE') THEN
            CALL TABVEC(ITABLE,IS0,N11)
            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
             PROG(I)=XS0
  705          CONTINUE
         ENDIF
       ENDIF

         CALL CHGLIM(IVX0,IVXMIN,IVXMAX,IVXPR1,IVXPR2,N11,IP,
     *             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
         MLREE2.PROG(I)=MLREE1.PROG(I)
         MLREE1.PROG(I)=PROG(I)
   51 CONTINUE
*
*  MODIFICATION DE LA VALEUR DE X
*
      MLREEL=IVX0
      MLREE1=IVUL
      MLREE2=IVLL
      SEGACT MLREEL*MOD,MLREE1*MOD,MLREE2*MOD
      JG=PROG(/1)
      SEGINI MLREE3,MLREE4
      IVX0U=MLREE3
      IVX0L=MLREE4
      DO 52 I=1,JG
         MLREE3.PROG(I)=MLREE1.PROG(I)-PROG(I)
         MLREE4.PROG(I)=PROG(I)-MLREE2.PROG(I)
   52 CONTINUE
      IF(IIMPI.EQ.1799) WRITE(IOIMP,57)(MLREE3.PROG(K),K=1,N11)
   57 FORMAT(' VALEUR DE DEPART EN VX0U : ',/,(1X,5E12.5))
      IF(IIMPI.EQ.1799) WRITE(IOIMP,58)(MLREE4.PROG(K),K=1,N11)
   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
      JG = PROG(/1)
      SEGINI,MLREE3
      IVFP=MLREE3
      SEGINI,MLREE4
      IVFQ=MLREE4
      DO 3 I=1,JG
      IF(PROG(I).GT.0.D0) THEN
           MLREE3.PROG(I)=PROG(I)*(MLREE1.PROG(I)**2)
      ELSE
           MLREE4.PROG(I)=ABS(PROG(I))*(MLREE2.PROG(I)**2)
      ENDIF
   3  CONTINUE
      IF(IIMPI.EQ.1799) WRITE(IOIMP,4)(MLREE3.PROG(K),K=1,N11)
   4  FORMAT('  SENSIBILITES TYPE + DE F LINEARISEE : ',/,(1X,5E12.5))
      IF(IIMPI.EQ.1799) WRITE(IOIMP,41)(MLREE4.PROG(K),K=1,N11)
  41  FORMAT('  SENSIBILITES TYPE - DE F LINEARISEE : ',/,(1X,5E12.5))
      DO 53 I=1,N11
         VF0=VF0-(MLREE3.PROG(I)/MLREE1.PROG(I))
         VF0=VF0-(MLREE4.PROG(I)/MLREE2.PROG(I))
  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
      MLREE4.PROG(I)=PROG(I)-MLREE2.PROG(I)
      TIN=0.
      DO 7 J=1,N11
      IF(XMAT(I,J).GT.0.D0) THEN
         MXMA1.XMAT(I,J)=XMAT(I,J)*(MLREE1.PROG(J)**2)
      ELSE
         MXMA2.XMAT(I,J)=ABS(XMAT(I,J))*(MLREE3.PROG(J)**2)
      ENDIF
      TIN=TIN+(MXMA1.XMAT(I,J)/MLREE1.PROG(J))
      TIN=TIN+(MXMA2.XMAT(I,J)/MLREE3.PROG(J))
   7  CONTINUE
      MLREE4.PROG(I)=MLREE4.PROG(I)+TIN
   5  CONTINUE
      IF(IIMPI.EQ.1799) WRITE(IOIMP,6)(MLREE4.PROG(I),I=1,M)
      MLREEL=IWD
      MLREE1=IVB
      SEGACT MLREEL*MOD,MLREE1*MOD
      JG=PROG(/1)
      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
      IF(IIMPI.EQ.1799) WRITE(IOIMP,6)(MLREE1.PROG(I),I=1,M)
  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
      JG=PROG(/1)
      SEGINI MLREE3,MLREE4
      IVMAXU=MLREE3
      IVMAXL=MLREE4
      DO 10 I=1,JG
        MLREE3.PROG(I)=PROG(I)-MLREE2.PROG(I)
        MLREE4.PROG(I)=MLREE2.PROG(I)-MLREE1.PROG(I)
   10 CONTINUE
      IF(IIMPI.EQ.1799) WRITE(IOIMP,11)(MLREE3.PROG(K),K=1,N11)
   11 FORMAT('  BORNES MAXIMA EN U ',/,(1X,5E12.5))
      IF(IIMPI.EQ.1799) WRITE(IOIMP,12)(MLREE4.PROG(K),K=1,N11)
   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
      JG=PROG(/1)
      SEGINI MLREE3,MLREE4
      IVMINU=MLREE3
      IVMINL=MLREE4
      DO 54 I=1,JG
        MLREE3.PROG(I)=PROG(I)-MLREE2.PROG(I)
        MLREE4.PROG(I)=MLREE2.PROG(I)-MLREE1.PROG(I)
   54 CONTINUE
      IF(IIMPI.EQ.1799) WRITE(IOIMP,14)(MLREE3.PROG(K),K=1,N11)
   14 FORMAT('  BORNES MINIMA EN U ',/,(1X,5E12.5))
      IF(IIMPI.EQ.1799) WRITE(IOIMP,15)(MLREE4.PROG(K),K=1,N11)
   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
             MXMA1.XMAT(I,J)=PROG(I)-XMAT(I,J)
             MXMA2.XMAT(I,J)=XMAT(I,J)-MLREE1.PROG(I)
             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
         PROG(I)=1.D0
  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 '')')
      CALL NTAPE1(MCP,MCQ,IVFP,IVFQ,IVLAMB,NVD,M,N,MVDU,MVDL,
     *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
      CALL NTAPE2(MCP,MCQ,IVXU,IVXL,IVB,N,M,IVGE,IVGM,IVLAMB,IPBASE)
      IVDR=IVGM
      IF(IT.EQ.0) THEN
       MLREEL=IVGM
       SEGACT MLREEL*MOD
      IF(IIMPI.EQ.1899) WRITE(IOIMP,10014) (PROG(I),I=1,M)
      IF(IIMPI.EQ.1799) WRITE(IOIMP,10014) (PROG(I),I=1,M)
10014  FORMAT(' VALEUR DE GRAD ',/ ,(1X,5(E12.5)))
      ENDIF
*       ON CONTINUE OBLIGATOIREMENT EN NDP=3
  103 CONTINUE
      IF(IIMPI.EQ.1899) WRITE(IOIMP,10014) (PROG(I),I=1,M)
      ITTER=ITTER+1
      MLREEL=IVDR
      MLENTI=MDR
      DO 1020 I=1,M
        IF(LECT(I).EQ.1) PROG(I)=0.D0
 1020 CONTINUE
      IF(ITTER.GT.MAXITE) THEN
        INTERR(1)=MAXITE
        CALL ERREUR(602)
        GO TO 116
      ENDIF
      IF(IIMPI.EQ.1799)
     *WRITE(IOIMP,FMT='('' ETAPE3:TEST NORME DIRECTION DE RECHERCHE'')')
      CALL ETAPE3(PROG,M,XNORZ)
      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
         CALL ETAPE4(MCP,MCQ,M,N,IVU,IVXU,IVN,MH)
         CALL TXAY(IVZZ,MH,IVZZ,M,M,XRES)
         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'' )')
      CALL ETAPE5(IVZ,IVZZ,MH,M)
* ON VA OBLIGATOIREMENT EN NDP=6
  106 CONTINUE
      IF(IIMPI.EQ.1799)  WRITE(IOIMP,FMT='(
     *'' ETAP6 RECHERCHE LINEAIRE SUIVANT LA DIRECTION DE RECHERCHE'')')
      CALL NTAPE6(MCP,MCQ,IVMINU,IVMINL,IVMAXU,IVMAXL,IVLAMB,
     * 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
      CALL NTAPE1(MCP,MCQ,IVFP,IVFQ,IVLAMB,NVD,M,N,MVDU,MVDL,
     *IVMINU,IVMINL,IVMAXU,IVMAXL,IVU,IVN,IVD,IVUL,IVLL,IVXU,IVXL)
      CALL NTAPE2(MCP,MCQ,IVXU,IVXL,IVB,N,M,IVGE,IVGM,IVLAMB,IPBASE)
      MLREEL=IVLAMB
      SEGACT MLREEL*MOD
      IF(IIMPI.GT.1) WRITE(IOIMP,FMT=
     *'(''  LAMBDA OPTIMAL '',/,(1X,5E12.5))')(PROG(I),I=1,M)
      MLREEL=IVGM
      SEGACT MLREEL*MOD
      IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT='
     *('' VALEUR DU GRADIENT MODIF SORTIE ETAPE6 : '',/,(1X,5E12.5))')
     *(PROG(I),I=1,M)
      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 : ''
     *,/,(1X,5E12.5))')(PROG(I),I=1,N11)
      MLREEL=IVXL
      SEGACT MLREEL*MOD
      IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT='('' VALEUR DE VXL : ''
     *,/,(1X,5E12.5))')(PROG(I),I=1,N11)
* 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
             CALL PARTAN (IVLAMB,MLAM1,IVGE,IVGM)
             IPART=1
             MLREEL=IVGM
             IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT='
     *       ('' VALEUR DU GRADIENT MODIF SORTIE PARTAN: '',
     *       /,(1X,5E12.5))')(PROG(I),I=1,M)
             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'')')
      CALL NTAP12(II,KK,MCP,MCQ,MVDU,MVDL,M,N,MP)
      MXMAT=MP
      JG=M
      SEGINI MLREE1
      MLREEL=IVGE
      CALL MATVE1(XMAT,PROG,M,M,MLREE1.PROG,2)
      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))')
     *(MLREE1.PROG(I),I=1,M)
      MLREE2=IVLAMB
      JG=0
      SEGINI MLENTI
      DO 130 I=1,M
         IF(MLREE2.PROG(I).EQ.0.D0)THEN
             IF(MLREE1.PROG(I).LT.0.D0)THEN
               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)
          CALL ETAP14(MP,IK,M)
  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 '')')
      CALL NTAP13(MP,MCP,MCQ,M,N,MVDU,MVDL,KK,II)
      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 '')')
      CALL ETAP14(MP,II,M)
      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
      JG=PROG(/1)
      SEGINI MLREE1
      MXMAT=MP
      CALL MATVE1(XMAT,PROG,M,M,MLREE1.PROG,2)
      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))')
     *(MLREE1.PROG(I),I=1,M)
      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
      CALL NTAPE1(MCP,MCQ,IVFP,IVFQ,IVLAMB,NVD,M,N,MVDU,MVDL,
     *IVMINU,IVMINL,IVMAXU,IVMAXL,IVU,IVN,IVD,IVUL,IVLL,IVXU,IVXL)
      CALL NTAPE2(MCP,MCQ,IVXU,IVXL,IVB,N,M,IVGE,IVGM,IVLAMB,IPBASE)
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
      CALL NTAP17(IVFP,IVFQ,IVXU,IVXL,IVLAMB,IVB,IBU,IBL,VF0,NDR,N,
     *MCP,MCQ,M,XL,XLL,TEST,NPDR,MVDU,MVDL,ITI,ITK,VFPMAX,IVN,IVD)
      MLREE2=IBU
      MLREE3=IBL
      SEGACT MLREE2*MOD,MLREE3*MOD
      IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT='('' VALEURS DE X APRES ETAP17
     * = IBU :'',/,(1X,5E12.5))')(MLREE2.PROG(I),I=1,N11)
      IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT='('' VALEURS DE X APRES ETAP17
     * = IBL :'',/,(1X,5E12.5))')(MLREE3.PROG(I),I=1,N11)
      IF(TEST) THEN
        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 '')')
      CALL NTAP21(IVFP,IVFQ,IVLAMB,IVB,IBU,IBL,
     * 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
     *ION = IBU :'',/,(1X,5E12.5))')(MLREE1.PROG(I),I=1,N11)
      IF(IIMPI.EQ.1799) WRITE(IOIMP,FMT='('' VALEURS DE X APRES SELECT
     *ION = IBL :'',/,(1X,5E12.5))')(MLREE2.PROG(I),I=1,N11)
      MLREE3=IVXU
      MLREE4=IVXL
      SEGACT MLREE3*MOD,MLREE4*MOD
      JG=MLREE1.PROG(/1)
      DO 1220 I=1,JG
         MLREE3.PROG(I)=MLREE1.PROG(I)
         MLREE4.PROG(I)=MLREE2.PROG(I)
 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
        PROG(I)=MLREE3.PROG(I)-MLREE1.PROG(I)
        CST=MLREE2.PROG(I)+MLREE4.PROG(I)
        IF(IIMPI.EQ.17)
     *  WRITE(IOIMP,'('' XU , XL '',(1X,I2,2E12.5))')I,PROG(I),CST
        IF(ABS(PROG(I)-CST).GT.1.D-4) GO TO 1000
 1221 CONTINUE
      AAZER=MLREE3.PROG(N11)-MLREE1.PROG(N11)
      IF(IIMPI.GT.1) WRITE(IOIMP,FMT='(''  VALEUR DE X EN SORTIE :'',/,
     *(1X,5E12.5))')(PROG(I),I=1,N),AAZER
*
*  SAUVEGARDE DE VX DANS VX0
      MLREEL=IVX0
      MLREE1=IVX
      SEGACT MLREEL*MOD,MLREE1*MOD
      DO 65 I=1,N
         PROG(I)=MLREE1.PROG(I)
   65 CONTINUE
      if(nsup.ne.0) then
      jg=mlree6.prog(/1)
      n=jg
      segini mlree5
      ia=0
      do iou=1,jg
      if(ibon(iou).eq.1) then
        ia=ia+1
        mlree5.prog(iou)=prog(ia)
       else
        mlree5.prog(iou)=mlree6.prog(iou)
       endif
       enddo
       ivx0=mlree5
       segsup mlreel
       mlreel=mlree5
       segsup ibo
       endif
*
      CALL VECTAB(IVX0,N,IRET)
      CALL ECCTAB(ITAB,'MOT     ',IVALIN,XVALIN,'VX0',LOGIN,IOBIN,
     *                    'TABLE',IVALRE,XVALRE,CHARRE,LOGRE,IRET)
      CALL VECTAB(IVXPR1,N-nsup,IRET)
      CALL ECCTAB(ITAB,'MOT     ',IVALIN,XVALIN,'VXPRE1',LOGIN,IOBIN,
     *                       'TABLE',IVALRE,XVALRE,CHARRE,LOGRE,IRET)
      CALL VECTAB(IVXPR2,N-nsup,IRET)
      CALL ECCTAB(ITAB,'MOT     ',IVALIN,XVALIN,'VXPRE2',LOGIN,IOBIN,
     *                       'TABLE',IVALRE,XVALRE,CHARRE,LOGRE,IRET)
      CALL VECTAB(IVUL,N-nsup,IRET)
      CALL ECCTAB(ITAB,'MOT     ',IVALIN,XVALIN,'VUL',LOGIN,IOBIN,
     *                       'TABLE',IVALRE,XVALRE,CHARRE,LOGRE,IRET)
      CALL VECTAB(IVLL,N-nsup,IRET)
      CALL ECCTAB(ITAB,'MOT     ',IVALIN,XVALIN,'VLL',LOGIN,IOBIN,
     *                       'TABLE',IVALRE,XVALRE,CHARRE,LOGRE,IRET)
*
*

      CALL ECROBJ('TABLE   ',ITAB)
      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
      CALL ERREUR(19)
      RETURN
      END








 
