rdepla
C RDEPLA SOURCE CB215821 20/11/25 13:38:39 10792 C===================================================================== C OPERATEUR POUR CHANGER DE REPERE SUR UN CHAMP DE DEPLACEMENTS C (OU TOUT CHAMP PAR POINTS) C C MCHPO1 = RDEP MCHPOI IVEC1 (IVEC2) C Entrées : MCHPOI : MCHPOI Champ de déplacements C VEC1 : POINT Premier vecteur du repère C VEC2 : POINT Deuxième vecteur du repère C Sortie : MCHPO1 : MCHPOI Champ de déplacements C C===================================================================== C IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC CCHAMP -INC SMCHPOI -INC SMCOORD C C Déclarations C *** Vecteurs du repère REAL*8 XU(3), XV(3), XW(3) *** Tableau de pointeurs sur des segments INTEGER IDEP(6,2) *** Tableau des déplacements d'un noeud REAL*8 XDEP(3), XROT(3) *** Matrice de changement de repère REAL*8 XMATC(3,3) C C Corps C IRET=0 C C Lecture du champ de déplacements C * CALL LIROBJ('CHPOINT', MCHPOI, 1, IRET) * IF (IERR.NE.0) RETURN C C Lecture du ou des vecteurs du repère C IF (IERR.NE.0) RETURN IREU = (IDIM + 1)*(IVEC1 - 1) XNORU = 0. DO 1 IC = 1, IDIM XU(IC) = XCOOR(IREU + IC) XNORU = XNORU + XU(IC)*XU(IC) 1 CONTINUE XNORU = SQRT(XNORU) DO 10 IC = 1, IDIM 10 XU(IC) = XU(IC)/XNORU IF (IDIM .EQ. 3) THEN IF (IERR.NE.0) RETURN IREV = (IDIM + 1)*(IVEC2 - 1) XNORV = 0. DO 2 IC = 1, IDIM XV(IC) = XCOOR(IREV + IC) XNORV = XNORV + XV(IC)*XV(IC) 2 CONTINUE XNORV = SQRT(XNORV) DO 11 IC = 1, IDIM 11 XV(IC) = XV(IC)/XNORV XW(1) = XU(2)*XV(3) - XU(3)*XV(2) XW(2) = XU(3)*XV(1) - XU(1)*XV(3) XW(3) = XU(1)*XV(2) - XU(2)*XV(1) XNORW = 0. DO 8 IC = 1, IDIM XNORW = XNORW + XW(IC)*XW(IC) 8 CONTINUE XNORW = SQRT(XNORW) DO 15 IC = 1, IDIM 15 XW(IC) = XW(IC)/XNORW XV(1) = XW(2)*XU(3) - XW(3)*XU(2) XV(2) = XW(3)*XU(1) - XW(1)*XU(3) XV(3) = XW(1)*XU(2) - XW(2)*XU(1) DO 12 IC = 1, IDIM XMATC(1, IC) = XU(IC) XMATC(2, IC) = XV(IC) XMATC(3, IC) = XW(IC) 12 CONTINUE ELSE XV(1) = -XU(2) XV(2) = XU(1) DO 13 IC = 1, IDIM XMATC(1, IC) = XU(IC) XMATC(2, IC) = XV(IC) 13 CONTINUE ENDIF * WRITE (*,*) 'Matrice de changement de repère :' * DO 14 IL = 1, IDIM * IF (IDIM .EQ. 3) THEN * WRITE (*,*) ' ',XMATC(IL,1),' ',XMATC(IL,2), * # ' ',XMATC(IL,3) * ELSE * WRITE (*,*) ' ',XMATC(IL,1),' ',XMATC(IL,2) * ENDIF * 14 CONTINUE DO 30 II = 1, 6 DO 30 IJ = 1, 2 30 IDEP(II, IJ) = 0 SEGINI, MCHPO1 = MCHPOI SEGACT, MCHPOI DO 80 IMS = 1, MCHPOI.IPCHP(/1) MSOUPO = MCHPOI.IPCHP(IMS) SEGACT, MSOUPO SEGINI, MSOUP1 = MSOUPO MPOVAL = MSOUPO.IPOVAL SEGINI, MPOVA1 = MPOVAL MSOUP1.IPOVAL = MPOVA1 MCHPO1.IPCHP(IMS) = MSOUP1 SEGDES, MSOUPO SEGDES, MSOUP1 SEGDES, MPOVA1 80 CONTINUE IF (IFOMOD .EQ. 0 .OR. IFOMOD .EQ. 1) GOTO 100 SEGACT, MCHPOI * WRITE (*,*) 'Nombre de pointeurs sur MSOUPO',MCHPO1.IPCHP(/1) DO 3 IMS = 1, MCHPO1.IPCHP(/1) * WRITE (*,*) ' MSOUPO # ', IMS MSOUPO = MCHPOI.IPCHP(IMS) SEGACT, MSOUPO * WRITE(*,*) ' ', MSOUPO.NOHARM(/1), ' composantes' DO 70 II = 1, 6 DO 70 IJ = 1, 2 70 IDEP(II, IJ) = 0 DO 4 IC = 1, MSOUPO.NOHARM(/1) * WRITE (*,*) ' :',MSOUPO.NOCOMP(IC) ***-----------Pour UX IF (MSOUPO.NOCOMP(IC) .EQ. NOMDD(1)) THEN IDEP(1,1) = IMS IDEP(1,2) = IC IRET = 0 * WRITE (*,*) NOMDD(1),'détecté en ',IDEP(1,2),' de ',IDEP(1,1) ELSE ***-----------Pour UY IF (MSOUPO.NOCOMP(IC) .EQ. NOMDD(2)) THEN IDEP(2,1) = IMS IDEP(2,2) = IC IRET = 0 * WRITE (*,*) NOMDD(2),'détecté en ',IDEP(2,2),' de ',IDEP(2,1) ELSE ***-----------Pour UZ IF (MSOUPO.NOCOMP(IC) .EQ. NOMDD(3)) THEN IDEP(3,1) = IMS IDEP(3,2) = IC IRET = 0 * WRITE (*,*) NOMDD(3),'détecté en ',IDEP(3,2),' de ',IDEP(3,1) ELSE ***-----------Pour RX IF (MSOUPO.NOCOMP(IC) .EQ. NOMDD(4)) THEN IDEP(4,1) = IMS IDEP(4,2) = IC IRET = 0 * WRITE (*,*) NOMDD(4),'détecté en ',IDEP(4,2),' de ',IDEP(4,1) ELSE ***-----------Pour RY IF (MSOUPO.NOCOMP(IC) .EQ. NOMDD(5)) THEN IDEP(5,1) = IMS IDEP(5,2) = IC IRET = 0 * WRITE (*,*) NOMDD(5),'détecté en ',IDEP(5,2),' de ',IDEP(5,1) ELSE ***-----------Pour RZ IF (MSOUPO.NOCOMP(IC) .EQ. NOMDD(6)) THEN IDEP(6,1) = IMS IDEP(6,2) = IC IRET = 0 * WRITE (*,*) NOMDD(6),'détecté en ',IDEP(6,2),' de ',IDEP(6,1) ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF 4 CONTINUE MPOVAL = MSOUPO.IPOVAL SEGACT, MPOVAL INP = MPOVAL.VPOCHA(/1) ***----Pour chaque composante à transformer MSOUP1 = MCHPO1.IPCHP(IMS) SEGACT, MSOUP1 MPOVA1 = MSOUP1.IPOVAL SEGACT, MPOVA1*MOD * DO 400 IC = 1, 6 * WRITE (*,*) ' ' * WRITE (*,*) ' IDEP(',IC,',1) = ', IDEP(IC,1) * WRITE (*,*) ' IDEP(',IC,',2) = ', IDEP(IC,2) * 400 CONTINUE DO 50 IN = 1, INP DO 40 IC = 1, 3 IF (IDEP(IC,1) .NE. 0) THEN XDEP(IC) = MPOVAL.VPOCHA(IN,IDEP(IC,2)) * WRITE (*,*) 'XDEP(',IC,') = ', XDEP(IC) ENDIF ICL = IC + 3 IF (IDEP(ICL,1) .NE. 0) THEN XROT(IC) = MPOVAL.VPOCHA(IN,IDEP(ICL,2)) * WRITE (*,*) 'XROT(',IC,') = ', XROT(IC) ENDIF 40 CONTINUE DO 41 IC = 1, 3 IF (IDEP(IC,1) .NE. 0) THEN MPOVA1.VPOCHA(IN,IDEP(IC,2)) = 0. DO 42 IJ = 1, 3 MPOVA1.VPOCHA(IN,IDEP(IC,2)) = # MPOVA1.VPOCHA(IN,IDEP(IC,2)) + XMATC(IC,IJ)*XDEP(IJ) 42 CONTINUE ENDIF ICL = IC + 3 IF (IDEP(ICL,1) .NE. 0) THEN MPOVA1.VPOCHA(IN,IDEP(ICL,2)) = 0. DO 43 IJ = 1, 3 MPOVA1.VPOCHA(IN,IDEP(ICL,2)) = # MPOVA1.VPOCHA(IN,IDEP(ICL,2)) + XMATC(IC,IJ)*XROT(IJ) 43 CONTINUE ENDIF 41 CONTINUE 50 CONTINUE SEGDES, MPOVA1 SEGDES, MSOUP1 SEGDES, MPOVAL SEGDES, MSOUPO 3 CONTINUE SEGDES, MCHPOI SEGDES, MCHPO1 C C Ecriture du champ de déplacements C 100 CONTINUE RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales