C DLAMD     SOURCE    CHAT      05/01/12    22:52:44     5004
      SUBROUTINE DLAMD(TENS,DTENS,XLAM31,XLAM32,RDP,ADP,HDP,ITEST)
      IMPLICIT INTEGER(I-N)
      IMPLICIT REAL*8(A-H,O-Z)
      DIMENSION TENS(3),DTENS(3)
      ITEST=0
      XLAM3=0.D0
C
C--------------------------------------------------------
C     CETTE ROUTINE PERMET DE CALCULER LA VALEUR
C     DU DLAMDA ASSOCIE AU DRUCKER-PRAGER
C--------------------------------------------------------
C
      A=ADP*(DTENS(1)+DTENS(2))+HDP
      A=-A*A
      A=A+DTENS(1)*DTENS(1)+DTENS(2)*DTENS(2)+3.D0*DTENS(3)*DTENS(3)
     1 -DTENS(1)*DTENS(2)
      B=2.D0*(ADP*(DTENS(1)+DTENS(2))+HDP)*(RDP-ADP*(TENS(1)+TENS(2)))
     1 +2.D0*DTENS(1)*TENS(1)+2.D0*DTENS(2)*TENS(2)+
     1 6.D0*DTENS(3)*TENS(3)-DTENS(1)*TENS(2)-DTENS(2)*TENS(1)
      C=RDP-ADP*(TENS(1)+TENS(2))
      C=C*C
      C=-C+TENS(1)*TENS(1)+TENS(2)*TENS(2)+3.D0*TENS(3)*TENS(3)
     1 -TENS(2)*TENS(1)
      X1=0.D0
      X2=0.D0
      IF(A.EQ.0.D0) GOTO 1000
      B=B/A
      C=C/A
      A=1.D0
      DIS=B*B-4.D0*A*C
      ADIS=ABS(DIS)
      IF(DIS.GE.0.D0) THEN
      DIS=SQRT(ADIS)
      X2=(-B+DIS)/2.D0
      X1=(-B-DIS)/2.D0
      GOTO 2000
      ENDIF
      ITEST=1
      RETURN
 1000 IF(B.EQ.0.D0) THEN
      X1=0.D0
      X2=0.D0
      GOTO 2000
      ENDIF
      X1=-C/B
      X2=X1
 2000 CONTINUE
      S1=RDP-ADP*(TENS(1)+TENS(2)+X1*(DTENS(1)+DTENS(2)))-HDP*X1
      S2=RDP-ADP*(TENS(1)+TENS(2)+X2*(DTENS(1)+DTENS(2)))-HDP*X2
      IF(RDP.NE.0.D0) THEN
      S1=S1/RDP
      S2=S2/RDP
      ENDIF
      IF(S1.GE.-1.E-10.AND.S2.GE.-1.E-10) THEN
      XLAM31=MIN(X1,X2)
      XLAM32=MAX(X1,X2)
      IF(XLAM31.LT.-1.D-10) XLAM31=XLAM32
      RETURN
      ENDIF
      IF(S1.GE.-1.E-10.AND.S2.LT.-1.E-10) THEN
      XLAM31=X1
      XLAM32=X1
      RETURN
      ENDIF
      IF(S1.LT.-1.E-10.AND.S2.GE.-1.E-10) THEN
      XLAM31=X2
      XLAM32=X2
      RETURN
      ENDIF
      IF(S1.LT.-1.E-10.AND.S2.LT.-1.E-10) THEN
      XLAM31=0.D0
      XLAM32=0.D0
      RETURN
      ENDIF
      END

