C TUYPAS    SOURCE    CHAT      05/01/13    03:57:19     5004
      SUBROUTINE TUYPAS(XE,XL,WORK,P,KERRE)
C-----------------------------------------------------------------------
C  ROUTINE DE CALCUL DE LA MATRICE DE PASSAGE P DES AXES LOCAUX AUX AXES
C  GLOBAUX :       DEPLOC= P * DEPGLO
C
C  ENTREE
C         XE     COORDONNEES DES 2 NOEUDS
C         VECT   VECTEUR DEFINISSANT LE REPERE LOCAL DE LA POUTRE
C
C  SORTIE
C         P      MATRICE DE CHANGEMENT DE BASE
C         KERRE  = 0 SI PAS DE PB
C                = 1 SI POINTS CONFONDUS
C                = 2 SI LE VECTEUR LOCAL EST COLINEAIRE A L'ELEMENT
C
C-----------------------------------------------------------------------
      IMPLICIT INTEGER(I-N)
      IMPLICIT REAL*8(A-H,O-Z)
      DIMENSION XE(3,*),P(3,*),VECT(3),A(3),WORK(*)
C
      KERRE=0
      A(1)=XE(1,2)-XE(1,1)
      A(2)=XE(2,2)-XE(2,1)
      A(3)=XE(3,2)-XE(3,1)
      RL=1.D0/XL
C
C-----------------------------------------------------------------------
C   ON CHOISIT DE DETERMINER ICI LE VECTEUR DEFINISSANT LE
C   REPERE LOCAL DE LA POUTRE SI IL N A PAS ETE DONNE PAR L UTILISATEUR
C-----------------------------------------------------------------------
C
      IDEF=0
      VECT(1)=WORK(5)
      VECT(2)=WORK(6)
      VECT(3)=WORK(7)
      IF(VECT(1).NE.0..OR.VECT(2).NE.0..OR.VECT(3).NE.0.) GO TO 10
C
C  DEFINITION DU VECTEUR LOCAL PAR DEFAUT   ( NON NORME )
C
      VECT(1)=-A(2)*RL
      VECT(2)=A(1)*RL
      VECT(3)=0.D00
      IDEF=1
  10  CONTINUE
      DO 22 I=1,3
  22  P(1,I)=A(I)*RL
      RLP=0.
      DO 1 I=1,3
   1  RLP=RLP+VECT(I)**2
      RLP= SQRT(RLP)
C
C  TEST DE COLINEARITE
C
      PROD=0.D00
      DO 4 I=1,3
   4  PROD=PROD+VECT(I)*P(1,I)
      IF(ABS(PROD).LT.0.99D00*RLP) GO TO 5
      IF(IDEF.EQ.0) GOTO 41
      VECT(1)= 0.D0
      VECT(2)= -A(3)*RL
      VECT(3)=  A(2)*RL
      GOTO 5
  41  CONTINUE
      KERRE=2
      RETURN
C
C  ORTHOGONALISATION ET REMPLISSAGE DE LA MATRICE P
C
  5   CONTINUE
      RLP=0.D00
      DO 6 I=1,3
      VECT(I)=VECT(I)-PROD*P(1,I)
  6   RLP=RLP+VECT(I)**2
      RLP=1.D00/SQRT(RLP)
      DO 2 I=1,3
   2  P(2,I)=VECT(I)*RLP
      P(3,1)= P(1,2)*P(2,3)- P(2,2)*P(1,3)
      P(3,2)=P(1,3)*P(2,1)-P(1,1)*P(2,3)
      P(3,3)= P(1,1)*P(2,2)-P(1,2)*P(2,1)
      RETURN
      END

