symetr
C SYMETR SOURCE SP204843 25/03/14 21:15:10 12201
C Sousprogramme relaisant la symetrie d'un ou plusieurs objets
C 10/2003 : modifications traitant du cas IDIM=1
SUBROUTINE SYMETR
IMPLICIT INTEGER(I-N)
IMPLICIT REAL*8 (A-H,O-Z)
-INC PPARAM
-INC CCOPTIO
-INC SMCOORD
-INC SMELEME
-INC CCGEOME
-INC CCTOURN
CHARACTER*4 MCLE(3)
DATA MCLE / 'POIN','DROI','PLAN' /
SEGMENT ICPR(nbpts)
idimp1=IDIM+1
C Lecture du mot-cle
IF (IERR.NE.0) RETURN
IF (((IDIM.EQ.1).AND.(ICLE.NE.1)).OR.
. ((IDIM.EQ.2).AND.(ICLE.EQ.3))) THEN
MOTERR(1:4)=MCLE(ICLE)
INTERR(1)=IDIM
ENDIF
ICLE=ICLE+4
C Lecture des objets a transformer
IF (IROT.EQ.0) THEN
IF (IERR.NE.0) RETURN
ELSE
ENDIF
C Lecture des points definissant la symetrie
MOTERR(1:4)=MCLE(ICLE-4)
IF (ICLE.GT.5) THEN
MOTERR(1:4)=MCLE(ICLE-4)
IF (IERR.NE.0) RETURN
IF (ICLE.GT.6) THEN
MOTERR(1:4)=MCLE(ICLE-4)
IF (IERR.NE.0) RETURN
ENDIF
ENDIF
C Recuperation des coordonnees des points definissant la symetrie
C Coordonnees stockees dans le COMMON CTOURN
SEGACT MCOORD
IREF=(IPT1-1)*idimp1
XPT1=XCOOR(IREF+1)
YPT1=0.
IF (IDIM.GE.2) YPT1=XCOOR(IREF+2)
ZPT1=0.
IF (IDIM.GE.3) ZPT1=XCOOR(IREF+3)
C Rappel : ICLE=6 valide pour IDIM=2 ou 3 - ICLE=7 pour IDIM=3
IF (ICLE.GT.5) THEN
IREF=(IPT2-1)*idimp1
XPT2=XCOOR(IREF+1)
YPT2=XCOOR(IREF+2)
ZPT2=0.
IF (IDIM.GE.3) ZPT2=XCOOR(IREF+3)
XVEC=XPT2-XPT1
YVEC=YPT2-YPT1
ZVEC=ZPT2-ZPT1
DVEC=SQRT(XVEC*XVEC+YVEC*YVEC+ZVEC*ZVEC)
IF (DVEC.EQ.0.) THEN
RETURN
ENDIF
C Cas ICLE=6 : (XYZ)VEC vecteur directeur de la droite POIN1 POIN2
XVEC=XVEC/DVEC
YVEC=YVEC/DVEC
ZVEC=ZVEC/DVEC
IF (ICLE.GT.6) THEN
IREF=(IPT3-1)*idimp1
XPT3=XCOOR(IREF+1)
YPT3=XCOOR(IREF+2)
ZPT3=0.
IF (IDIM.GE.3) ZPT3=XCOOR(IREF+3)
XV1=XVEC
YV1=YVEC
ZV1=ZVEC
XV2=XPT3-XPT1
YV2=YPT3-YPT1
ZV2=ZPT3-ZPT1
XVEC=YV1*ZV2-ZV1*YV2
YVEC=ZV1*XV2-XV1*ZV2
ZVEC=XV1*YV2-YV1*XV2
DVEC=SQRT(XVEC*XVEC+YVEC*YVEC+ZVEC*ZVEC)
IF (DVEC.EQ.0.) THEN
RETURN
ENDIF
C Cas ICLE=7 : (XYZ)VEC normale (unitaire) au plan POIN1 POIN2 POIN3
XVEC=XVEC/DVEC
YVEC=YVEC/DVEC
ZVEC=ZVEC/DVEC
ENDIF
ENDIF
C Transformation d'un MAILLAGE
IF (IROT.EQ.1) THEN
C Transformation d'un MAILLAGE et d'un CHPOINT
IF (IROT1.EQ.1) THEN
ELSE
C Transformation d'un MAILLAGE seul
ENDIF
RETURN
ENDIF
C Transformation du point IP1 (LIROBJ)
IREF=(IP1-1)*idimp1
XD=XCOOR(IREF+1)-XPT1
YD=0.
IF (IDIM.GE.2) YD=XCOOR(IREF+2)-YPT1
ZD=0.
IF (IDIM.GE.3) ZD=XCOOR(IREF+3)-ZPT1
XDENS=XCOOR(IREF+idimp1)
segact mcoord*mod
nbpts=nbpts+1
SEGADJ MCOORD
IREF=(NBPTS-1)*idimp1
ICAS=ICLE-4
GOTO (11,12,13),ICAS
C Option 'POINT' (1D/2D/3D) :
C ----------------------------
11 XCOOR(IREF+1)=XPT1-XD
IF (IDIM.GE.2) XCOOR(IREF+2)=YPT1-YD
IF (IDIM.GE.3) XCOOR(IREF+3)=ZPT1-ZD
GOTO 15
C Option 'DROIT' (2D/3D) :
C --------------------------
12 PVEC=2*(XD*XVEC+YD*YVEC+ZD*ZVEC)
XCOOR(IREF+1)=XPT1+PVEC*XVEC-XD
XCOOR(IREF+2)=YPT1+PVEC*YVEC-YD
IF (IDIM.GE.3) XCOOR(IREF+3)=ZPT1+PVEC*ZVEC-ZD
GOTO 15
C Option 'PLAN' (3D) :
C ----------------------
13 PVEC=2*(XD*XVEC+YD*YVEC+ZD*ZVEC)
XCOOR(IREF+1)=XPT1+XD-PVEC*XVEC
XCOOR(IREF+2)=YPT1+YD-PVEC*YVEC
XCOOR(IREF+3)=ZPT1+ZD-PVEC*ZVEC
C Ecriture du point transforme :
15 XCOOR(IREF+idimp1)=XDENS
RETURN
END
					© Cast3M 2003 - Tous droits réservés.
					Mentions légales