C ELLP51    SOURCE    CHAT      05/01/12    23:35:43     5004
      SUBROUTINE ELLP51(ZA1,ZV,ZX,N,IPIVO,JPIVO,IAUX)
C
      IMPLICIT INTEGER(I-N)
      IMPLICIT REAL*8(A-H,O-Y)
      IMPLICIT COMPLEX*16(Z)
C
C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
C    OPERATEUR ELFE LAPLACE POUTRE
C
C    RESOLUTION D'UN SYSTEME LINEAIRE COMPLEXE   ZA1 * ZX = ZV
C
C    PAR LA METHODE DE GAUSS AVEC CALCUL DE LA TRIANGULARISATION
C
C    ET STOCKAGE DE CELLE CI DANS LES VECTEURS IPIVO, JPIVO ET IAUX
C
C
C    PARAMETRES :
C
C    ZA1(N*N) : MATRICE (N*N) REPRESENTANT LE SYSTEME LINEAIRE
C    ZV(N)    : SECOND MEMBRE
C    IAUX(N)  : TABLEAU DE TRAVAIL QUI DONNE L'ORDRE DES INCONNUES
C
C    SORTIE :
C
C    ZX       : SOLUTION
C
C    AUTEUR : DE LANGRE
C    DATE   : 08 DEC 1989
C
C  ====================================================================
C
      COMPLEX*16  ZA1(N,*),ZV(*),ZX(*)
      INTEGER      IAUX(*),IPIVO(*),JPIVO(*)
      EPS = 1.D-35
C
      DO 10 I=1,N
        IAUX(I) = I
  10  CONTINUE
C      1.  TRIANGULARISATION
C         BOUCLE SUR LES MATRICES EMBOITEES
C
      DO 100 ILIG =1,N
C
C      1.1  RECHERCHE DU PIVOT
C
      XPIV =0.D0
      IPIV =0
      JPIV =0
      DO 110 I = ILIG,N
        DO 111 J = ILIG,N
          IF(  ABS ( ZA1(I,J))  .GT.XPIV ) THEN
            IPIV= I
            JPIV= J
            XPIV =ABS ( ZA1(I,J))
          ENDIF
 111    CONTINUE
 110  CONTINUE
C
      IPIVO(ILIG) = IPIV
      JPIVO(ILIG) = JPIV
C
      IF(XPIV .LE.EPS) THEN
          WRITE(6,*)'RETURN DANS ELLP51',XPIV,ILIG
           RETURN
      ENDIF
C
C   1.2  ON MET LA LIGNE NUMERO IPIV EN ILIG
C        ET MEME CHOSE AU SECOND MEMBRE
C
      DO 120 J=ILIG,N
        ZAUX      = ZA1(IPIV,J)
        ZA1(IPIV,J)= ZA1(ILIG,J)
        ZA1(ILIG,J)= ZAUX
  120 CONTINUE
C
      ZAUX    = ZV(IPIV)
      ZV(IPIV)= ZV(ILIG)
      ZV(ILIG)= ZAUX
C
C   1.3  ON MET LA COLONNE NUMERO JPIV EN JLIG= ILIG
C        ET ON NOTE CELA DANS LE TABLEAU IAUX
C   *      ERREUR SUR BORNES 130 CORRIGEE
C
      JLIG=ILIG
      DO 130 I=1   ,N
        ZAUX      = ZA1(I,JPIV)
        ZA1(I,JPIV)= ZA1(I,JLIG)
        ZA1(I,JLIG)= ZAUX
  130 CONTINUE
        I0         = IAUX (JPIV)
        IAUX(JPIV) = IAUX (JLIG)
        IAUX(JLIG) = I0
C
C   1.4  REDUCTION PAR SOUSTRACTION DES LIGNES ENTRE-ELLES
C         ET MEME CHOSE AU SECOND MEMBRE
C
      DO 140 I= ILIG + 1 ,N
        ZAUX      = ZA1(I,ILIG) / ZA1(ILIG,ILIG)
        DO 141 J=ILIG  ,N
          ZA1(I,J)= ZA1(I,J)- ZAUX * ZA1 (ILIG,J)
  141   CONTINUE
        ZV(I)  = ZV(I)- ZAUX * ZV(ILIG)
  140 CONTINUE
C
C     FIN   BOUCLE SUR LES MATRICES EMBOITEES
100   CONTINUE
C
C   2. SUBSTITUTION EN REMONTANT
C
      ZV(N) = ZV(N) / ZA1 (N,N)
      DO 200 I= 2,N
        IN = N + 1 - I
        DO 210 K= 1,I-1
          KN = N + 1 - K
          ZV(IN) = ZV(IN) - ZA1 (IN,KN)* ZV(KN)
  210   CONTINUE
        ZV(IN) = ZV(IN) / ZA1 (IN,IN)
  200 CONTINUE
C
C   3. ON REMET LES INCONNUES A LA BONNE PLACE
C
      DO 300 I= 1,N
        ZX(IAUX(I)) = ZV(I)
  300 CONTINUE
C
      RETURN
      END

