C MIDCDB    SOURCE    CHAT      05/01/13    01:45:12     5004
      SUBROUTINE MIDCDB(ICPCDB,JCDUAB,LINBNC,JCDUAC,NIUNIQ,
     $     ICDCDB,
     $     IMPR,IRET)
      IMPLICIT INTEGER(I-N)
      IMPLICIT REAL*8 (A-H,O-Z)
C***********************************************************************
C NOM         : MIDCDB
C DESCRIPTION : On construit la liste indexée à la précédente des
C               inconnues duales de CD-1Bt.
C
C
C LANGAGE     : ESOPE
C AUTEUR      : Stéphane GOUNAND (CEA/DRN/DMT/SEMT/LTMF)
C               mél : gounand@semt2.smts.cea.fr
C***********************************************************************
C APPELES          : RSETEE, RPENLE
C APPELE PAR       : PROMAT
C***********************************************************************
C ENTREES            : ICPCDB, JCDUAB, LINBNC, JCDUAC, NIUNIQ
C SORTIES            : ICDCDB
C CODE RETOUR (IRET) : = 0 si tout s'est bien passé
C***********************************************************************
C VERSION    : v1, 07/02/2000, version initiale
C HISTORIQUE : v1, 07/02/2000, création
C HISTORIQUE :
C HISTORIQUE :
C***********************************************************************
C Prière de PRENDRE LE TEMPS de compléter les commentaires
C en cas de modification de ce sous-programme afin de faciliter
C la maintenance !
C***********************************************************************

-INC PPARAM
-INC CCOPTIO
-INC SMLENTI
      POINTEUR ICPCDB.MLENTI
      POINTEUR JCDUAB.MLENTI
      POINTEUR JCDUAC.MLENTI
      INTEGER JG
      POINTEUR KRPCDB.MLENTI
      POINTEUR KRDCDB.MLENTI
* Includes persos
*     Segment LSTIND (liste séquentielle indexée)
      INTEGER NBM,NBTVAL
      SEGMENT LSTIND
      INTEGER IDX(NBM+1)
      INTEGER IVAL(NBTVAL)
      ENDSEGMENT
*-INC SLSTIND
      POINTEUR LINBNC.LSTIND
      POINTEUR LIPDNB.LSTIND
      POINTEUR ICDCDB.LSTIND
*
      INTEGER IMPR,IRET
*
      INTEGER LDG,NCPCDB,NIUNIQ
      INTEGER IDG,JCPCDB
      INTEGER IVDCDB
      INTEGER JVPDNB,JVSTRT,JVSTOP,KVNBNC,KVSTRT,KVSTOP
      INTEGER INBMEB,INBMEC,NUDUAC
      INTEGER LAST,PREC
*
* Executable statements
*
      IF (IMPR.GT.1) WRITE(IOIMP,*) 'Entrée dans midcdb.eso'
* On construit la liste de correspondance :
* une inconnue de ICPCDB -> n°s(IBMEs) matrice B tels que
*                        JCDUAB(IBME)=ICPCDB
      SEGACT ICPCDB
      NCPCDB=ICPCDB.LECT(/1)
      JG=NIUNIQ
      SEGINI KRPCDB
      CALL RSETEE(ICPCDB.LECT,NCPCDB,
     $     KRPCDB.LECT,NIUNIQ,
     $     IMPR,IRET)
      IF (IRET.NE.0) GOTO 9999
*      SEGPRT,KRPCDB
      SEGDES ICPCDB
      CALL RPENLE(JCDUAB,KRPCDB,NCPCDB,
     $     LIPDNB,
     $     IMPR,IRET)
*      SEGPRT,LIPDNB
      SEGSUP KRPCDB
* Dimensionnement de ICDCDB
* Pour l'instant ICDCDB.IDX(JCPCDB+1)=nombre d'inconnues
* distinctes reliées à l'inconnue ICPCDB.LECT(JCPCDB)
      NBM=NCPCDB
      NBTVAL=0
      SEGINI ICDCDB
      JG=NIUNIQ
      SEGINI KRDCDB
      SEGACT LIPDNB
      SEGACT LINBNC
      SEGACT JCDUAC
      DO 1 JCPCDB=1,NCPCDB
* Degré et fin de la liste chaînée
         LDG=0
         LAST=-1
         JVSTRT=LIPDNB.IDX(JCPCDB)
         JVSTOP=LIPDNB.IDX(JCPCDB+1)-1
         DO 12 JVPDNB=JVSTRT,JVSTOP
            INBMEB=LIPDNB.IVAL(JVPDNB)
            KVSTRT=LINBNC.IDX(INBMEB)
            KVSTOP=LINBNC.IDX(INBMEB+1)-1
            DO 122 KVNBNC=KVSTRT,KVSTOP
               INBMEC=LINBNC.IVAL(KVNBNC)
               NUDUAC=JCDUAC.LECT(INBMEC)
               IF (KRDCDB.LECT(NUDUAC).EQ.0) THEN
                  LDG=LDG+1
                  KRDCDB.LECT(NUDUAC)=LAST
                  LAST=NUDUAC
               ENDIF
 122        CONTINUE
 12      CONTINUE
         ICDCDB.IDX(JCPCDB+1)=LDG
* Remise à zéro de la liste chaînée
         DO 14 IDG=1,LDG
            PREC=KRDCDB.LECT(LAST)
            KRDCDB.LECT(LAST)=0
            LAST=PREC
 14      CONTINUE
 1    CONTINUE
* ICDCDB.IDX est transformé en la liste d'indexation sur
* ICDCDB.IVAL
      ICDCDB.IDX(1)=1
      DO 3 JCPCDB=1,NCPCDB
         ICDCDB.IDX(JCPCDB+1)=ICDCDB.IDX(JCPCDB+1)+ICDCDB.IDX(JCPCDB)
 3    CONTINUE
      NBM=NCPCDB
      NBTVAL=ICDCDB.IDX(NCPCDB+1)-1
      SEGADJ,ICDCDB
* Remplissage de ICDCDB
      IVDCDB=0
      DO 5 JCPCDB=1,NCPCDB
* Degré et fin de la liste chaînée
         LDG=0
         LAST=-1
         JVSTRT=LIPDNB.IDX(JCPCDB)
         JVSTOP=LIPDNB.IDX(JCPCDB+1)-1
         DO 52 JVPDNB=JVSTRT,JVSTOP
            INBMEB=LIPDNB.IVAL(JVPDNB)
            KVSTRT=LINBNC.IDX(INBMEB)
            KVSTOP=LINBNC.IDX(INBMEB+1)-1
            DO 522 KVNBNC=KVSTRT,KVSTOP
               INBMEC=LINBNC.IVAL(KVNBNC)
               NUDUAC=JCDUAC.LECT(INBMEC)
               IF (KRDCDB.LECT(NUDUAC).EQ.0) THEN
                  LDG=LDG+1
                  KRDCDB.LECT(NUDUAC)=LAST
                  LAST=NUDUAC
               ENDIF
 522        CONTINUE
 52      CONTINUE
* Remise à zéro de la liste chaînée et vidage dans ICDCDB
         DO 54 IDG=1,LDG
            PREC=KRDCDB.LECT(LAST)
            IVDCDB=IVDCDB+1
            ICDCDB.IVAL(IVDCDB)=LAST
            KRDCDB.LECT(LAST)=0
            LAST=PREC
 54      CONTINUE
 5    CONTINUE
      SEGDES JCDUAC
      SEGDES LINBNC
      SEGSUP LIPDNB
      SEGSUP KRDCDB
      SEGDES ICDCDB
*
* Normal termination
*
      IRET=0
      RETURN
*
* Format handling
*
*
* Error handling
*
 9999 CONTINUE
      IRET=1
      WRITE(IOIMP,*) 'An error was detected in subroutine midcdb'
      RETURN
*
* End of subroutine MIDCDB
*
      END



