C IDMAT6    SOURCE    CB215821  16/04/21    21:17:05     8920
      SUBROUTINE IDMAT6 (NUMP1,NUMP2,NUDIR1,NUDIR2,ANG,
     &                   MELEME,IPVAL,NPG2)
      IMPLICIT INTEGER(I-N)
      IMPLICIT REAL*8(A-H,O-Z)
*
************************************************************************
*
*                             I D M A T 6
*                             -----------
*
* FONCTION:
* ---------
*
*     RECUPERATION DES COORDONNEES DES AXES OTHOTROPIE (OU ANISOTROPIE)
*
*
*
*
* MODULES UTILISES:
* -----------------
*
-INC SMCOORD

-INC PPARAM
-INC CCOPTIO
-INC CCREEL
-INC SMELEME
*
* PARAMETRES:   (E)=ENTREE   (S)=SORTIE   (+ = CONTENU DANS UN COMMUN)
* -----------
*
*     NUMP1   (E)  NUMERO DU POINT P1 ASSOCIE A NUDIR1
*     NUMP2   (E)  NUMERO DU POINT P2 ASSOCIE A NUDIR1
*     NUDIR1  (E)  NUMERO DE DIRECTIVE UTILISEE DANS LA LISTE:
*                  "DIRECTION", "RADIAL"
*     NUDIR2  (E)  NUMERO DE DIRECTIVE UTILISEE DANS LA LISTE:
*                  "PARALLELE", "PERPENDIC.", "INCLINE",
*                  POUR LA DEFINITION DES DIRECTIONS D'ORTHOTROPIE.
*     ANG     (E)  ANGLE UTILISE DANS LA DEFINITION DES DIRECTIONS
*                  D ORTHOTROPIE (INCLINE)
*     MELEME  (E)  POINTEUR DE "MAILLAGE" A 1 SEUL TYPE D'ELEMENT.
*     XVAL    (S)  DIRECTIONS D'ORTHOTROPIE  PAR ELEMENT,
*                  ON FOURNIT LES COSINUS DIRECTEURS  DE L'AXE 1
*                  EN BIDIM ,ET LES COSINUS DIRECTEURS DES AXES 1 ET
*                  2 EN TRIDIM,PAR RAPPORT AU REPERE LOCAL DE L'ELEMENT
*
*
* VARIABLES:
*-----------
*  VGLOB1,VGLOB2,VGLOB3  = COS.DIRECTEURS DES AXES 1, 2 ET 3 D'ORTH. PAR
*   RAPPOT AU REPERE GLOBAL
*
*
* REMARQUES:
* ----------
*
*  LES DIRECTION P1 ET P2 DEFINISSENT LE PLAN QUI CONTIENT LES AXES 1,2
*  NUDIR2 =1 SIGNIFIE QUE L'AXE 1 EST PARALLELE A LA DIRECTION P1,
*  NUDIR2 =2 SIGNIFIE QUE L'AXE 1 EST PERPENDICULAIRE A LA DIRECTION P1,
*  NUDIR2 =3 SIGNIFIE QUE L'AXE 1 FAIT AN ANGLE DE (ANG) AVEC LA
*  DIRECTION P1
*
*
* AUTEUR, DATE DE CREATION:
* -------------------------
*
*     P. DOWLATYARI OCT. 1990
*
* LANGAGE:
* --------
*       FORTRAN 77 + ESOPE
*
*
************************************************************************
*
      DIMENSION VGLOB1(3),VGLOB2(3)
      DIMENSION VPT1(3),VPT2(3)
*
      SEGMENT YVAL
         REAL*8 VLOC1(IDIM,NPG2,NBELEM)
         REAL*8 VLOC2(IDIM,NPG2,NBELEM)
      ENDSEGMENT
*
      SEGACT MELEME
      NBELEM=NUM(/2)
*
*               DIRECTIONS FOURNIES
      IF (IDIM.EQ.2)THEN
*
*      COORDONNEES DU POINT P1
*
       CALL EXCOO1 (NUMP1,VPT1(1),VPT1(2),VPT1(3),REEL1)
*
       IF(NUDIR1.NE.2) THEN
*
*        NORMALISATION VECT1
*
         VNORM=SQRT(VPT1(1)*VPT1(1)+VPT1(2)*VPT1(2))
         IF (VNORM.EQ.0.) THEN
          CALL ERREUR (524)
          SEGDES,MELEME
          RETURN
         ENDIF
*
         VGLOB1(1)=VPT1(1)/VNORM
         VGLOB1(2)=VPT1(2)/VNORM
       ENDIF
*
       IF(NUDIR1.EQ.2) THEN
         VGLOB1(1)=VPT2(1)-VPT1(1)
         VGLOB1(2)=VPT2(2)-VPT1(2)
*
*        NORMALISATION  VECT1
*
         VNORM=SQRT(VGLOB1(1)*VGLOB1(1)+VGLOB1(2)*VGLOB1(2))
         VGLOB1(1)=VGLOB1(1)/VNORM
         VGLOB1(2)=VGLOB1(2)/VNORM
         GO TO 15
       ENDIF
*
*
       IF(NUDIR2.EQ.2)THEN
*
*     ON EFFECTUE UNE ROTATION DE 90 DEGRE AUTOUR  DE L'AXE 3
*
         REEL1=VGLOB1(1)
         VGLOB1(1)=VGLOB2(1)
         VGLOB2(1)=-REEL1
         REEL1=VGLOB1(2)
         VGLOB1(2)=VGLOB2(2)
         VGLOB2(2)=-REEL1
*
       ELSEIF(NUDIR2.EQ.3)THEN
*
*      ON EFFECTUE UNE ROTATION DE (ANG) DEGRE AUTOUR DE L'AXE 3
*
         COSA=COS(ANG)
         SINA=SIN(ANG)
         REEL1=VGLOB1(1)
         VGLOB1(1)=VGLOB1(1)*COSA+VGLOB2(1)*SINA
         VGLOB2(1)=-REEL1*SINA+VGLOB2(1)*COSA
         REEL1=VGLOB1(2)
         VGLOB1(2)=VGLOB1(2)*COSA+VGLOB2(2)*SINA
         VGLOB2(2)=-REEL1*SINA+VGLOB2(2)*COSA
       ENDIF
*
      ELSEIF(IDIM.EQ.3)THEN
*
*      COORDONNEES DU POINT P1
*
       CALL EXCOO1 (NUMP1,VPT1(1),VPT1(2),VPT1(3),REEL1)
*
*      COORDONNEES DU POINT P2
*
       CALL EXCOO1 (NUMP2,VPT2(1),VPT2(2),VPT2(3),REEL1)
*
* Verification de la normalité des deux vecteurs donnés
*
       PS = ABS(VPT1(1)*VPT2(1)+VPT1(2)*VPT2(2)+VPT1(3)*VPT2(3))
       V1N = SQRT(VPT1(1)*VPT1(1)+VPT1(2)*VPT1(2)+VPT1(3)*VPT1(3))
       V2N = SQRT(VPT2(1)*VPT2(1)+VPT2(2)*VPT2(2)+VPT2(3)*VPT2(3))
       PS = PS/(V1N*V2N)
       IF(PS.GT.1D-4) THEN
         CALL ERREUR (524)
          SEGDES,MELEME
         RETURN
       ENDIF
*
       IF(NUDIR1.NE.2) THEN
*
*        NORMALISATION VECT1
*
         VNORM=SQRT(VPT1(1)*VPT1(1)+VPT1(2)*VPT1(2)+
     .                VPT1(3)*VPT1(3))
         IF (VNORM.EQ.0.) THEN
          CALL ERREUR (524)
          SEGDES,MELEME
          RETURN
         ENDIF
         VGLOB1(1)=VPT1(1)/VNORM
         VGLOB1(2)=VPT1(2)/VNORM
         VGLOB1(3)=VPT1(3)/VNORM
       ENDIF
*
       IF(NUDIR1.EQ.2) THEN
         VGLOB1(1)=VPT2(1)-VPT1(1)
         VGLOB1(2)=VPT2(2)-VPT1(2)
         VGLOB1(3)=VPT2(3)-VPT1(3)
*
*        NORMALISATION  VECT1
*
         VNORM=SQRT(VGLOB1(1)*VGLOB1(1)+VGLOB1(2)*VGLOB1(2)+
     .                VGLOB1(3)*VGLOB1(3))
         VGLOB1(1)=VGLOB1(1)/VNORM
         VGLOB1(2)=VGLOB1(2)/VNORM
         VGLOB1(3)=VGLOB1(3)/VNORM
         GO TO 15
       ENDIF
*
*        NORMALISATION VECT2
*
         VNORM2=SQRT(VPT2(1)*VPT2(1)+VPT2(2)*VPT2(2)+
     .                VPT2(3)*VPT2(3))
         IF (VNORM2.EQ.0.) THEN
          CALL ERREUR (524)
          SEGDES,MELEME
          RETURN
         ENDIF
         VGLOB2(1)=VPT2(1)/VNORM2
         VGLOB2(2)=VPT2(2)/VNORM2
         VGLOB2(3)=VPT2(3)/VNORM2
*
       IF(NUDIR2.EQ.2)THEN
*
*     ON EFFECTUE UNE ROTATION DE 90 DEGRE AUTOUR  DE L'AXE 3
*
         REEL1=VGLOB1(1)
         VGLOB1(1)=VGLOB2(1)
         VGLOB2(1)=-REEL1
         REEL1=VGLOB1(2)
         VGLOB1(2)=VGLOB2(2)
         VGLOB2(2)=-REEL1
         REEL1=VGLOB1(3)
         VGLOB1(3)=VGLOB2(3)
         VGLOB2(3)=-REEL1
*
       ELSEIF(NUDIR2.EQ.3)THEN
*
*      ON EFFECTUE UNE ROTATION DE (ANG) DEGRE AUTOUR DE L'AXE 3
*
         COSA=COS(ANG)
         SINA=SIN(ANG)
         REEL1=VGLOB1(1)
         VGLOB1(1)=VGLOB1(1)*COSA+VGLOB2(1)*SINA
         VGLOB2(1)=-REEL1*SINA+VGLOB2(1)*COSA
         REEL1=VGLOB1(2)
         VGLOB1(2)=VGLOB1(2)*COSA+VGLOB2(2)*SINA
         VGLOB2(2)=-REEL1*SINA+VGLOB2(2)*COSA
         REEL1=VGLOB1(3)
         VGLOB1(3)=VGLOB1(3)*COSA+VGLOB2(3)*SINA
         VGLOB2(3)=-REEL1*SINA+VGLOB2(3)*COSA
        ENDIF
      ENDIF
*
*
15    CONTINUE
*
      SEGINI YVAL
      IPVAL=YVAL
*
*     BOUCLE SUR LES ELEMENTS
*
      DO 10  IEL=1,NBELEM
*
      DO 20  NC=1,IDIM
      DO 20  NV=1,NPG2
       VLOC1(NC,NV,IEL)=0.D0
       VLOC2(NC,NV,IEL)=0.D0
 20   CONTINUE
*
*   ON BOUCLE SUR LES POINTS DE GAUSS
*
      DO 80 IGAU=1,NPG2
       IF(IDIM.EQ.2)THEN
         VLOC1(1,IGAU,IEL)=VLOC1(1,IGAU,IEL)+VGLOB1(1)
         VLOC1(2,IGAU,IEL)=VLOC1(2,IGAU,IEL)+VGLOB1(2)
*
       ELSEIF(IDIM.EQ.3)THEN
         DO  40 J=1,3
           VLOC1(J,IGAU,IEL)=VLOC1(J,IGAU,IEL)+VGLOB1(J)
           VLOC2(J,IGAU,IEL)=VLOC2(J,IGAU,IEL)+VGLOB2(J)
 40      CONTINUE
       ENDIF
*
 80   CONTINUE
 10   CONTINUE
*
*     DESACTIVATION DES SEGMENTS
*
      SEGDES,YVAL,MELEME
*
      RETURN
      END




