C POSNEG    SOURCE    BR232186  12/08/01    22:29:18     7456
C JACOBA    SOURCE    BR      06/01/10    21:15:29     5284
      SUBROUTINE POSNEG(A,PPOS,PNEG)
C======================================================================
C Routine permettant de calculer les parties positives et négatives
C au sens de Ladevèze d'une matrice symétrique 3x3
C     OBJET
C     -----
C     CALCUL DES PARTIES POS ET NEG D UNE MATRICE 3*3 SYMETRIQUE
C
C     ENTREES
C     -------
C     A(3,3) = MATRICE SYMETRIQUE
C
C     SORTIES
C     -------
C     PPOS(3,3)   = PARTIE POSITIVE DAS LE REPERE INITIAL
C
C     PNEG(3,3)   = PARTIE NEGATIVE DAS LE REPERE INITIAL
C
C===============================================================
      IMPLICIT INTEGER(I-N)
      IMPLICIT REAL*8 (A-H,O-Z)

      REAL*8 MATE1(3,3),MATE1VP(3),MATE1PP(3,3),TRAV(3,3)
      REAL*8 MATE1VPOS(3,3),MATE1VNEG(3,3),MATE1PPT(3,3)
      REAL*8 PPOS(3,3),PNEG(3,3),A(3,3)

C     Calcul
      DO I=1,3
         DO J=1,3
            MATE1(I,J) = A(I,J)
         ENDDO
      ENDDO

C     Diagonalisation
      CALL JACOBA(MATE1,3,MATE1VP,MATE1PP)

C     Séparation des parties positives et négatives
      DO I=1,3
          DO J=1,3
              MATE1VPOS(I,J) = 0.0D0
              MATE1VNEG(I,J) = 0.0D0
          ENDDO
      ENDDO

      DO I=1,3
            IF (MATE1VP(I).GE.0.0D0) THEN
               MATE1VPOS(I,I) = MATE1VP(I)
            ELSE
               MATE1VNEG(I,I) = MATE1VP(I)
            ENDIF
      ENDDO

C     Retour dans le repère initial
      CALL TRSPOD (MATE1PP,3,3,MATE1PPT)

      CALL MATMAT (MATE1PP,MATE1VPOS,3,3,3,TRAV)
      CALL MATMAT (TRAV,MATE1PPT,3,3,3,PPOS)

      CALL MATMAT (MATE1PP,MATE1VNEG,3,3,3,TRAV)
      CALL MATMAT (TRAV,MATE1PPT,3,3,3,PNEG)

      RETURN
      END






