C RELR13    SOURCE    PV        20/03/30    21:23:57     10567          
      SUBROUTINE RELR13(MLIN,KJSPGP,KJSPGD,LINCP,LINCD,
     $     MINCP,MINCD,
     $     IMPR,IRET)
      IMPLICIT REAL*8 (A-H,O-Z)
      IMPLICIT INTEGER (I-N)
C***********************************************************************
C NOM         : RELR13
C DESCRIPTION :
*
* Construction des tableaux de correspondance ddl <-> (point, nom de
* variable) :
* - pour les inconnues primales : MINCP
* - pour les inconnues duales   : MINCD
*
C
C
C
C LANGAGE     : ESOPE
C AUTEUR      : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF)
C               mél : gounand@semt2.smts.cea.fr
C***********************************************************************
C APPELES          :
C APPELES (E/S)    :
C APPELES (BLAS)   :
C APPELES (CALCUL) :
C APPELE PAR       :
C***********************************************************************
C SYNTAXE GIBIANE    :
C ENTREES            :
C ENTREES/SORTIES    :
C SORTIES            :
C CODE RETOUR (IRET) : = 0 si tout s'est bien passé
C***********************************************************************
C VERSION    : v1, 27/06/2003, version initiale
C HISTORIQUE : v1, 27/06/2003, 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 SMCOORD
-INC SMRIGID
      POINTEUR MLIN.MRIGID
      POINTEUR DES.DESCR
-INC SMELEME
      POINTEUR MEL.MELEME
* Includes persos
CBEGININCLUDE SMMINC
      SEGMENT MINC
      INTEGER     NPOS(NPT+1)
      INTEGER     MPOS(NPT,NBI+1)
      ENDSEGMENT
      SEGMENT IMINC
      INTEGER LNUPO (NDDL)
      INTEGER LNUINC(NDDL)
      ENDSEGMENT
CENDINCLUDE SMMINC
      POINTEUR MINCP.MINC
      POINTEUR MINCD.MINC
*
-INC SMLENTI
      POINTEUR KJSPGP.MLENTI
      POINTEUR KJSPGD.MLENTI
      POINTEUR KRSPGP.MLENTI
      POINTEUR KRSPGD.MLENTI
      POINTEUR KRINCP.MLENTI
      POINTEUR KRINCD.MLENTI
-INC SMLMOTS
      POINTEUR LINCP.MLMOTS
      POINTEUR LINCD.MLMOTS
*
      INTEGER IMPR,IRET
*
      LOGICAL LEXIST
*
* Executable statements
*
      IF (IMPR.GT.2) WRITE(IOIMP,*) 'Entrée dans relr13.eso'
      SEGACT MLIN
      NRIG=MLIN.IRIGEL(/2)
*
* Primale
*
*  Construction du segment de repérage dans l'ensemble des points
      SEGACT KJSPGP
      NPOPRI=KJSPGP.LECT(/1)
      JG=nbpts
      SEGINI KRSPGP
      CALL RSETXI(KRSPGP.LECT,KJSPGP.LECT,NPOPRI)
      SEGDES KJSPGP
      SEGACT LINCP
      NINCP=LINCP.MOTS(/2)
*  Initialisation de MINCP
      NPT=NPOPRI
      NBI=NINCP
      SEGINI MINCP
      DO IRIG=1,NRIG
         MEL=MLIN.IRIGEL(1,IRIG)
         SEGACT MEL
         NEL=MEL.NUM(/2)
         DES=MLIN.IRIGEL(3,IRIG)
         SEGACT DES
         NDDL=DES.NOELEP(/1)
*   Construction du segment de repérage dans les inconnues primales
         JG=DES.LISINC(/2)
         SEGINI KRINCP
         CALL CREPER(DES.LISINC(/1),NDDL,NINCP,
     $        DES.LISINC,LINCP.MOTS,
     $        KRINCP.LECT,
     $        IMPR,IRET)
         IF (IRET.NE.0) GOTO 9999
         DO IEL=1,NEL
            DO IDDL=1,NDDL
               IPO=KRSPGP.LECT(MEL.NUM(DES.NOELEP(IDDL),IEL))
               IINC=KRINCP.LECT(IDDL)
*    On cherche si l'inconnue n'existe pas déjà dans MPOS
               LEXIST=(MINCP.MPOS(IPO,IINC).NE.0)
*    Sinon, on la rajoute...
               IF (.NOT.LEXIST) THEN
                  NPOINC=MINCP.MPOS(IPO,NINCP+1)+1
                  MINCP.MPOS(IPO,NINCP+1)=NPOINC
                  MINCP.MPOS(IPO,IINC)   =NPOINC
               ENDIF
            ENDDO
         ENDDO
         SEGSUP KRINCP
         SEGDES DES
         SEGDES MEL
      ENDDO
*   Remplisssage de NPOS
      MINCP.NPOS(1)=1
      DO IPOPRI=1,NPOPRI
         MINCP.NPOS(IPOPRI+1)=MINCP.NPOS(IPOPRI)
     $        + MINCP.MPOS(IPOPRI,NINCP+1)
      ENDDO
      SEGDES MINCP
      SEGDES LINCP
      SEGSUP KRSPGP
*
* Duale (copie conforme de ci-dessus)
*
*  Construction du segment de repérage dans l'ensemble des points
      SEGACT KJSPGD
      NPODUA=KJSPGD.LECT(/1)
      JG=nbpts
      SEGINI KRSPGD
      CALL RSETXI(KRSPGD.LECT,KJSPGD.LECT,NPODUA)
      SEGDES KJSPGD
      SEGACT LINCD
      NINCD=LINCD.MOTS(/2)
*  Initialisation de MINCP
      NPT=NPODUA
      NBI=NINCD
      SEGINI MINCD
      DO IRIG=1,NRIG
         MEL=MLIN.IRIGEL(1,IRIG)
         SEGACT MEL
         NEL=MEL.NUM(/2)
         DES=MLIN.IRIGEL(3,IRIG)
         SEGACT DES
         NDDL=DES.NOELED(/1)
*   Construction du segment de repérage dans les inconnues primales
         JG=DES.LISDUA(/2)
         SEGINI KRINCD
         CALL CREPER(DES.LISDUA(/1),NDDL,NINCD,
     $        DES.LISDUA,LINCD.MOTS,
     $        KRINCD.LECT,
     $        IMPR,IRET)
         IF (IRET.NE.0) GOTO 9999
         DO IEL=1,NEL
            DO IDDL=1,NDDL
               IPO=KRSPGD.LECT(MEL.NUM(DES.NOELED(IDDL),IEL))
               IINC=KRINCD.LECT(IDDL)
*    On cherche si l'inconnue n'existe pas déjà dans MPOS
               LEXIST=(MINCD.MPOS(IPO,IINC).NE.0)
*    Sinon, on la rajoute...
               IF (.NOT.LEXIST) THEN
                  NPOINC=MINCD.MPOS(IPO,NINCD+1)+1
                  MINCD.MPOS(IPO,NINCD+1)=NPOINC
                  MINCD.MPOS(IPO,IINC)   =NPOINC
               ENDIF
            ENDDO
         ENDDO
         SEGSUP KRINCD
         SEGDES DES
         SEGDES MEL
      ENDDO
*   Remplisssage de NPOS
      MINCD.NPOS(1)=1
      DO IPODUA=1,NPODUA
         MINCD.NPOS(IPODUA+1)=MINCD.NPOS(IPODUA)
     $        + MINCD.MPOS(IPODUA,NINCD+1)
      ENDDO
      SEGDES MINCD
      SEGDES LINCD
      SEGSUP KRSPGD
      SEGDES MLIN
*
* Normal termination
*
      IRET=0
      RETURN
*
* Format handling
*
*
* Error handling
*
 9999 CONTINUE
      IRET=1
      WRITE(IOIMP,*) 'An error was detected in subroutine relr13'
      RETURN
*
* End of subroutine RELR13
*
      END


 
