symtri
C SYMTRI SOURCE PV 20/04/01 21:16:39 10569 C Creation des (matrices de) RIGIDITE associees a des conditions de C SYMETRIE (operateur SYMT) et d'ANTISYMETRIE (operateur ANTI). C Syntaxe : SYMT ('DEPL')('ROTA') MELEME P1 (P2) (P3) (FLOT1) ; C ANTI ('DEPL')('ROTA') MELEME P1 (P2) (P3) (FLOT1) ; C 10/2003 : modifications pour integrer cas IDIM=1. C En dimension 1, ces operateurs ne sont pas disponibles. C L'utilisation de l'operateur BLOQUE est suffisante ! IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC SMCOORD C** DIMENSION XNORM(3) COMMON / CSYMTR / XNORM(3) DIMENSION U1(3),U2(3) CHARACTER*4 MOTBLO(2) DATA MOTBLO / 'DEPL','ROTA' / C Operateurs SYMT et ANTI indisponibles en dimension 1 IF (IDIM.EQ.1) THEN INTERR(1)=IDIM RETURN ENDIF idimp1=IDIM+1 C Signification de ITYP : C ITYP = 0 si operateur SYMT , ITYP = 1 si operateur ANTI C Lecture de DEPL ou ROTA pour permettre la lecture de la suite C Signification de IDEPL et IROTA : C IDEPL=1 (IROTA=1) si mot-cle 'DEPL' ('ROTA') active et =0 sinon IDEPL=0 IROTA=0 IF (IERR.NE.0) RETURN 10 IF (IMOT.EQ.1) IDEPL=1 IF (IMOT.EQ.2) IROTA=1 IF (IMOT.NE.0) GOTO 10 C Appel a POIEXT pour recuperer le bon ensemble de POINTS IF (IDIM.EQ.2) THEN ELSE ENDIF CALL POIEXT C En 2D et 3D, lecture de l'ensemble des points, ecrit dans la pile C suite a l'appel a POIEXT, soumis a la condition de (anti)symetrie. IF (IERR.NE.0) RETURN C On construit U1 et U2 perpendiculaires a XNORM (COMMON CSYMTR) C Attention en DIME 2 : XNORM est le vecteur directeur de la droite C Ces vecteurs U1 et U2 sont utilises dans le cas IROTA=1. IF (IDIM.EQ.2) THEN XTEMP=-XNORM(2) XNORM(2)=XNORM(1) XNORM(1)=XTEMP ENDIF U1(1)=-XNORM(2) U1(2)=XNORM(1) U1(3)=0.D0 SU1=SQRT(U1(1)**2+U1(2)**2) IF (SU1.GE.0.1) THEN U1(1)=U1(1)/SU1 U1(2)=U1(2)/SU1 ELSE U1(1)=0.D0 U1(2)=-XNORM(3) U1(3)=XNORM(2) SU1=SQRT(U1(2)**2+U1(3)**2) U1(2)=U1(2)/SU1 U1(3)=U1(3)/SU1 ENDIF U2(1)=XNORM(2)*U1(3)-XNORM(3)*U1(2) U2(2)=XNORM(3)*U1(1)-XNORM(1)*U1(3) U2(3)=XNORM(1)*U1(2)-XNORM(2)*U1(1) IF (ITYP.EQ.1) GOTO 500 C CONDITION DE SYMETRIE : C ------------------------- C Cas 'DEPL' : creation du point associe a la "direction" IF (IDEPL.EQ.1) THEN segact mcoord*mod NBPTS=nbpts+1 SEGADJ MCOORD IPoin=(NBPTS-1)*idimp1 XCOOR(IPoin+1)=XNORM(1) XCOOR(IPoin+2)=XNORM(2) IF (IDIM.EQ.3) XCOOR(IPoin+3)=XNORM(3) XCOOR(IPoin+idimp1)=0. C Appel a BLOQU 'DEPL' 'DIRE' Poin1 CALL BLOQUE SEGACT MCOORD*mod ENDIF C Cas 'ROTA' : creation des points associes a la "direction" C En 2D, on fait seulement BLOQUER 'ROTA' IF (IROTA.EQ.1) THEN IF (IDIM.EQ.2) THEN CALL BLOQUE SEGACT MCOORD*MOD ELSE NBPTA=nbpts NBPTS=NBPTA+2 SEGADJ MCOORD XCOOR(NBPTA*idimp1+1)=U1(1) XCOOR(NBPTA*idimp1+2)=U1(2) XCOOR(NBPTA*idimp1+3)=U1(3) XCOOR((NBPTA+1)*idimp1)=0.D0 NBPTA=NBPTA+1 C Appel a BLOQU 'ROTA' 'DIRE' Poin1 CALL BLOQUE SEGACT MCOORD*MOD XCOOR(NBPTA*idimp1+1)=U2(1) XCOOR(NBPTA*idimp1+2)=U2(2) XCOOR(NBPTA*idimp1+3)=U2(3) XCOOR((NBPTA+1)*idimp1)=0.D0 NBPTA=NBPTA+1 C Appel a BLOQU 'ROTA' 'DIRE' Poin1 CALL BLOQUE SEGACT MCOORD*MOD CALL PRFUSE ENDIF ENDIF RETURN C CONDITION D'ANTISYMETRIE : C ---------------------------- C Cas 'ROTA' : Creation du point associe a la direction 500 IF (IROTA.EQ.1) THEN segact mcoord*mod NBPTS=nbpts+1 SEGADJ MCOORD IPoin=(NBPTS-1)*idimp1 XCOOR(IPoin+1)=XNORM(1) XCOOR(IPoin+2)=XNORM(2) IF (IDIM.EQ.3) XCOOR(IPoin+3)=XNORM(3) XCOOR(IPoin+idimp1)=0. C Appel a BLOQU 'ROTA' 'DIRE' IF (IDIM.EQ.3) THEN ENDIF CALL BLOQUE SEGACT MCOORD*MOD ENDIF C Cas 'DEPL' : creation des points associes a la "direction" IF (IDEPL.EQ.1) THEN IF (IDIM.EQ.3) THEN NBPTA=nbpts NBPTS=NBPTA+2 SEGADJ MCOORD XCOOR(NBPTA*idimp1+1)=U1(1) XCOOR(NBPTA*idimp1+2)=U1(2) XCOOR(NBPTA*idimp1+3)=U1(3) XCOOR((NBPTA+1)*idimp1)=0.D0 NBPTA=NBPTA+1 C Appel a BLOQU 'DEPL' 'DIRE' Poin1 ; CALL BLOQUE SEGACT MCOORD*MOD XCOOR(NBPTA*idimp1+1)=U2(1) XCOOR(NBPTA*idimp1+2)=U2(2) XCOOR(NBPTA*idimp1+3)=U2(3) XCOOR((NBPTA+1)*idimp1)=0. NBPTA=NBPTA+1 C Appel a BLOQU 'DEPL' 'DIRE' Poin1 ; CALL BLOQUE SEGACT MCOORD*MOD CALL PRFUSE C En 2D, appel a BLOQU 'DEPL' 'DIRE' Poin1 ; ELSE SEGACT MCOORD*MOD NBPTA=nbpts NBPTS=NBPTA+1 SEGADJ MCOORD XCOOR(NBPTA*idimp1+1)=U1(1) XCOOR(NBPTA*idimp1+2)=U1(2) C** XCOOR(NBPTA*idimp1+3)=U1(3) XCOOR((NBPTA+1)*idimp1)=0.D0 C** NBPTA=NBPTA+1 CALL BLOQUE SEGACT MCOORD*MOD ENDIF ENDIF RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales