C DUAL01    SOURCE    PV090527  26/04/30    21:15:29     12529          
      SUBROUTINE dual01(mrigid,ri1)
C a appeler dual  ulterieurement
c====================================================================
c
c     entrees
c           mrigid  rigidité   [C]  de dependance  rela depend
c     sorties
C           ri1   [C] Transpose non symétrique
C     La différence par rapport à dual00, c'est que la matrice à
C     transposer n'est pas nécessairement symétrique.
c
c====================================================================
      IMPLICIT INTEGER(I-N)
      IMPLICIT REAL*8(A-H,O-Z)
-INC PPARAM
-INC CCHAMP

-INC SMRIGID
-INC SMCOORD
-INC SMELEME

      CHARACTER*4 CMOT
      character*(LOCHPO) NOMM,NODUA

      segment snomip
        character*(LOCHPO) nomip(0)
      endsegment
      segment snomda
        character*(LOCHPO) nomda(0)
      endsegment

      segment snomm
        character*(LOCHPO) nompi(nomip(/2)),nompa(nomda(/2))
      endsegment

      segact mrigid

C on en profite  pour recenser les inconnues en question (primales)
C  a voir
      segini snomip,snomda

      DO 1501 I=1,IRIGEL(/2)
*         MELEME=IRIGEL(1,I)
*         SEGACT MELEME
         DESCR=IRIGEL(3,I)
         SEGACT DESCR
C   attention ces matrices ne sont pas carrees  il faut 2 boucles
C          pour identifier les inconnues

         DO 1402 J=1,LISINC(/2)
            IF(nomip(/2).EQ.0) THEN
               nomip(**)=LISINC(J)
            ELSE
               DO 1406 K=1,nomip(/2)
                  IF(LISINC(J).EQ.nomip(K)) GO TO 1405
 1406          CONTINUE
               nomip(**)=LISINC(J)
 1405          CONTINUE
            ENDIF
 1402    CONTINUE
C
         DO 1502 J=1,LISDUA(/2)
            IF(nomda(/2).EQ.0) THEN
               nomda(**)=LISDUA(J)
            ELSE
               DO 1506 K=1,nomda(/2)
                  IF(LISDUA(J).EQ.nomda(K)) GO TO 1505
 1506          CONTINUE
               nomda(**)=LISDUA(J)
 1505          CONTINUE
            ENDIF
 1502    CONTINUE

 1501 CONTINUE

C      tableau des correspondances

      segini snomm

      do 325 il=1,nomip(/2)
         NOMM =nomip(IL)
         do 326 in = 1,lnomdd
            if (NOMM.EQ.NOMDD(in)) then
               NOMPI(il) =NOMDU(in)
               goto 327
            endif
 326     continue
         NOMPI(il)=NOMM
 327     continue
 325  continue

      do 425 il=1,nomda(/2)
         NOMM =nomda(IL)
         do 426 in = 1,lnomdd
            if (NOMM.EQ.NOMDU(in)) then
               NOMPA(il) =NOMDD(in)
               goto 427
            endif
 426     continue
         NOMPA(il)=NOMM
 427     continue
 425  continue


*      write(6,*) 'primales',(nomip(j),j=1,nomip(/2)),'sortie ' ,
*     &     ( nompi(j),j=1,nompi(/2))
*
*
*      write(6,*) 'duales  ',(nomda(j),j=1,nomda(/2)),'sortie ' ,
*     &     ( nompa(j),j=1,nompa(/2))

C on stoke le ddel en question en position ad-hoc

      nrigel=coerig(/1)
      segini , ri1
      ri1.mtymat=mtymat
      ri1.iforig=iforig

      do 1700 ima=1,IRIGEL(/2)
         ri1.coerig(ima)=coerig(ima)
         do 1750 iri =1,irigel(/1)
            if(iri.eq.3.or.iri.eq.4) goto 1750
            ri1.irigel(iri,ima)= IRIGEL(iri,ima)
 1750    continue

         descr = irigel(3,ima)

         nligrp = lisdua(/2)
         nligrd = lisinc(/2)
         segini des1
         ri1.irigel(3,ima) = des1
C
         do 1634 ik=1,lisinc(/2)
            nomm = lisinc(ik)
            do 1635 ij=1,nomip(/2)
               if(NOMM.eq.NOMIP(ij)) des1.lisdua(ik) = nompi(ij)
 1635       continue
            des1.noeled(ik)=noelep(ik)
 1634    continue

         do 1644 ik=1,lisdua(/2)
            nomm = lisdua(ik)
            do 1645 ij=1,nomda(/2)
               if(NOMM.eq.NOMDA(ij)) des1.lisinc(ik) = nompa(ij)
 1645       continue
            des1.noelep(ik)=noeled(ik)
 1644    continue
         segdes des1,descr

         if (irigel(7,ima).ne.0.or.nligrp.ne.nligrd) then
            XMATRI = IRIGEL(4,ima)
            segact XMATRI
            NELRIG=XMATRI.RE(/3)
            rigrel=0
            SEGINI xmatr1
            xmatr1.symre=symre
            do i=1,nelrig
               do j=1,nligrp
                  do k=1,nligrd
                     xmatr1.re(k,j,i)=re(j,k,i)
                  enddo
               enddo
            enddo
            segdes xmatr1,xmatri
            ri1.irigel(4,ima)=xmatr1
         else
            ri1.irigel(4,ima)=irigel(4,ima)
         endif
 1700 continue

      segdes ri1,mrigid

      segsup ,snomm,snomip,snomda

c      RETURN
      END

 
 
 
 
