addite
C ADDITE SOURCE SP204843 24/03/15 21:15:02 11871 C Sous-programme elementaire pour effectuer la translation, la rotation C ou l'affinite d'un objet C 10/2003 : Prise en compte cas IDIM=1. IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC SMELEME -INC SMCOORD DIMENSION X(*) SEGMENT ICPR(nbpts) COMMON / CTOURN / XPT1,YPT1,ZPT1,XV1,YV1,ZV1,XV2,YV2,ZV2, . XVEC,YVEC,ZVEC,ANGLE,ICLE,XP1,YP1,ZP1 idimp1=IDIM+1 XVECS=XVEC YVECS=YVEC ZVECS=ZVEC COSA=COS(ANGLE) SINA=SIN(ANGLE) ANG2=ANGLE*ANGLE C Initialisation du maillage IPT2 transforme de IPT1 NBSOUS=0 IF (IARG.EQ.0) THEN NBREF=0 ELSE NBREF=IPT1.LISREF(/1) ENDIF NBNN=IPT1.NUM(/1) NBELEM=IPT1.NUM(/2) SEGINI IPT2 IPT2.ITYPEL=IPT1.ITYPEL DO i=1,NBELEM IPT2.ICOLOR(i)=IPT1.ICOLOR(i) ENDDO C ICLE / KCLE : indique la transformation a realiser C KCLE = 1 : translation (operateurs PLUS,MOIN,DEDU 'TRAN') C KCLE = 2 : rotation (operateurs TOUR,DEDU 'ROTA') C KCLE = 3 : homothetie (operateur HOMO) C KCLE = 4 : affinite (operateur AFFI) C KCLE = 5 : symetrie point (operateur SYME 'POINT') C KCLE = 6 : symetrie droite (operateur SYME 'DROIT') C KCLE = 7 : symetrie plan (operateur SYME 'PLAN') C KCLE = 8 : projection plan (operateur PROJ 'PLAN') C KCLE = 9 : projection sphere (operateur PROJ 'SPHE') C KCLE = 10 : projection cylindre (operateur PROJ 'CYLI') C KCLE = 11 : projection conique (operateur PROJ 'CONI') C KCLE = 12 : projection torique (operateur PROJ 'TORI') C KCLE = 13 : projection droite (operateur PROJ 'DROI') C KCLE = 14 : projection cercle (operateur PROJ 'CERC') KCLE=ICLE IF (ICLE.GE.10000) KCLE=ICLE-10000 IF (ICLE.LT.0) KCLE=ICLE+10000 C Reservation de la place dans XCOOR segdes mcoord SEGACT MCOORD*mod NPACT=NBPTS NXCOUR=NPACT*idimp1 NBPTS=NPACT+NBELEM*NBNN SEGADJ MCOORD C Boucle sur les noeuds du maillage C Creation du noeud de IPT2 image de IPT1.NUM(i,j) et stocke dans ICPR DO 10 j=1,NBELEM DO 11 i=1,NBNN C L'image de IPT1.NUM(i,j) a-t-elle deja ete creee ? IF (ICPR(IPT1.NUM(i,j)).EQ.0) THEN IREF=(IPT1.NUM(i,j)-1)*idimp1 GOTO (51,52,53,54,55,56,57,58,59,60,61,62,63,64),KCLE C Translation de vecteur X : 51 DO k=1,IDIM XCOOR(NXCOUR+k)=X(k)+XCOOR(IREF+k) ENDDO XCOOR(NXCOUR+idimp1)=XCOOR(IREF+idimp1) GOTO 70 C Rotation (2D/3D) : 52 XD=XCOOR(IREF+1)-XPT1 YD=XCOOR(IREF+2)-YPT1 ZD=0. IF (IDIM.GE.3) ZD=XCOOR(IREF+3)-ZPT1 XE=XD*XV1+YD*YV1+ZD*ZV1 YE=XD*XV2+YD*YV2+ZD*ZV2 ZE=XD*XVEC+YD*YVEC+ZD*ZVEC XD=XE*COSA-YE*SINA YD=XE*SINA+YE*COSA ZD=ZE XCOOR(NXCOUR+1)=XD*XV1+YD*XV2+ZD*XVEC+XPT1 XCOOR(NXCOUR+2)=XD*YV1+YD*YV2+ZD*YVEC+YPT1 IF (IDIM.GE.3) XCOOR(NXCOUR+3)=XD*ZV1+YD*ZV2+ZD*ZVEC+ZPT1 XCOOR(NXCOUR+idimp1)=XCOOR(IREF+idimp1) GOTO 70 C Homothetie : 53 XCOOR(NXCOUR+1)=(XCOOR(IREF+1)-XPT1)*ANGLE+XPT1 IF (IDIM.GE.2) XCOOR(NXCOUR+2)=(XCOOR(IREF+2)-YPT1)*ANGLE+YPT1 IF (IDIM.GE.3) XCOOR(NXCOUR+3)=(XCOOR(IREF+3)-ZPT1)*ANGLE+ZPT1 XCOOR(NXCOUR+idimp1)=XCOOR(IREF+idimp1)*ANGLE GOTO 70 C Affinite (2D/3D) : 54 XD=XCOOR(IREF+1)-XPT1 YD=XCOOR(IREF+2)-YPT1 ZD=0. IF (IDIM.GE.3) ZD=XCOOR(IREF+3)-ZPT1 XE=XD*XV1+YD*YV1+ZD*ZV1 YE=XD*XV2+YD*YV2+ZD*ZV2 ZE=(XD*XVEC+YD*YVEC+ZD*ZVEC)*ANGLE XCOOR(NXCOUR+1)=XE*XV1+YE*XV2+ZE*XVEC+XPT1 XCOOR(NXCOUR+2)=XE*YV1+YE*YV2+ZE*YVEC+YPT1 IF (IDIM.GE.3) XCOOR(NXCOUR+3)=XE*ZV1+YE*ZV2+ZE*ZVEC+ZPT1 XCOOR(NXCOUR+idimp1)=XCOOR(IREF+idimp1) GOTO 70 C Symetrie par rapport a un point : 55 XCOOR(NXCOUR+1)=2*XPT1-XCOOR(IREF+1) IF (IDIM.GE.2) XCOOR(NXCOUR+2)=2*YPT1-XCOOR(IREF+2) IF (IDIM.GE.3) XCOOR(NXCOUR+3)=2*ZPT1-XCOOR(IREF+3) XCOOR(NXCOUR+idimp1)=XCOOR(IREF+idimp1) GOTO 70 C Symetrie par rapport a une droite (2D/3D) : 56 XD=XCOOR(IREF+1)-XPT1 YD=XCOOR(IREF+2)-YPT1 ZD=0. IF (IDIM.GE.3) ZD=XCOOR(IREF+3)-ZPT1 PVEC=2*(XD*XVEC+YD*YVEC+ZD*ZVEC) XCOOR(NXCOUR+1)=XPT1+XVEC*PVEC-XD XCOOR(NXCOUR+2)=YPT1+YVEC*PVEC-YD IF (IDIM.GE.3) XCOOR(NXCOUR+3)=ZPT1+ZVEC*PVEC-ZD XCOOR(NXCOUR+idimp1)=XCOOR(IREF+idimp1) GOTO 70 C Symetrie par rapport a un plan (3D) : 57 XD=XCOOR(IREF+1)-XPT1 YD=XCOOR(IREF+2)-YPT1 ZD=XCOOR(IREF+3)-ZPT1 PVEC=2*(XD*XVEC+YD*YVEC+ZD*ZVEC) XCOOR(NXCOUR+1)=XPT1+XD-XVEC*PVEC XCOOR(NXCOUR+2)=YPT1+YD-YVEC*PVEC XCOOR(NXCOUR+3)=ZPT1+ZD-ZVEC*PVEC XCOOR(NXCOUR+idimp1)=XCOOR(IREF+idimp1) GOTO 70 C Projection sur un plan : 58 XPOIN=XCOOR(IREF+1) YPOIN=XCOOR(IREF+2) ZPOIN=XCOOR(IREF+3) IF (ICLE.GE.10000) THEN XVECS=XVEC-XPOIN YVECS=YVEC-YPOIN ZVECS=ZVEC-ZPOIN ENDIF IF (ICLE.LE.0) THEN XPX=XP1-XPOIN YPX=YP1-YPOIN ZPX=ZP1-ZPOIN SPS=XPX*XVEC+YPX*YVEC+ZPX*ZVEC XPX=XP1-SPS*XVEC YPX=YP1-SPS*YVEC ZPX=ZP1-SPS*ZVEC XVECS=XPX-XPOIN YVECS=YPX-YPOIN ZVECS=ZPX-ZPOIN ENDIF SVECS=XVECS*XVECS+YVECS*YVECS+ZVECS*ZVECS IF (IERR.NE.0) RETURN SVECS=SQRT(SVECS) XVECS=XVECS/SVECS YVECS=YVECS/SVECS ZVECS=ZVECS/SVECS DENUM=(XPOIN-XPT1)*XV1+(YPOIN-YPT1)*YV1+(ZPOIN-ZPT1)*ZV1 DENOM=XVECS*XV1+YVECS*YV1+ZVECS*ZV1 IF (IERR.NE.0) RETURN RAP=-DENUM/DENOM XCOOR(NXCOUR+1)=XPOIN+RAP*XVECS XCOOR(NXCOUR+2)=YPOIN+RAP*YVECS IF (IDIM.GE.3) XCOOR(NXCOUR+3)=ZPOIN+RAP*ZVECS XCOOR(NXCOUR+idimp1)=XCOOR(IREF+idimp1) GOTO 70 C Projection sur une sphere (3D) : 59 XPOIN=XCOOR(IREF+1) YPOIN=XCOOR(IREF+2) ZPOIN=XCOOR(IREF+3) IF (ICLE.GE.10000) THEN XVECS=XVEC-XPOIN YVECS=YVEC-YPOIN ZVECS=ZVEC-ZPOIN ENDIF IF (ICLE.LE.0) THEN XPX=XP1-XPOIN YPX=YP1-YPOIN ZPX=ZP1-ZPOIN SPS=XPX*XVEC+YPX*YVEC+ZPX*ZVEC XPX=XP1-SPS*XVEC YPX=YP1-SPS*YVEC ZPX=ZP1-SPS*ZVEC XVECS=XPX-XPOIN YVECS=YPX-YPOIN ZVECS=ZPX-ZPOIN ENDIF SVECS=XVECS*XVECS+YVECS*YVECS+ZVECS*ZVECS IF (IERR.NE.0) RETURN SVECS=SQRT(SVECS) XVECS=XVECS/SVECS YVECS=YVECS/SVECS ZVECS=ZVECS/SVECS SCA=XVECS*(XPT1-XPOIN)+YVECS*(YPT1-YPOIN)+ZVECS*(ZPT1-ZPOIN) XV=XVECS*SCA YV=YVECS*SCA ZV=ZVECS*SCA S2=(XPOIN+XV-XPT1)**2+(YPOIN+YV-YPT1)**2+(ZPOIN+ZV-ZPT1)**2 IF (IERR.NE.0) RETURN C=SQRT(ANG2-S2) IF (SCA.LT.0.) C=-C XCOOR(NXCOUR+1)=XPOIN+XV-C*XVECS XCOOR(NXCOUR+2)=YPOIN+YV-C*YVECS IF (IDIM.GE.3) XCOOR(NXCOUR+3)=ZPOIN+ZV-C*ZVECS XCOOR(NXCOUR+idimp1)=XCOOR(IREF+idimp1) GOTO 70 C Projection sur un cylindre (3D) : 60 XPOIN=XCOOR(IREF+1) YPOIN=XCOOR(IREF+2) ZPOIN=XCOOR(IREF+3) IF (ICLE.GE.10000) THEN XVECS=XVEC-XPOIN YVECS=YVEC-YPOIN ZVECS=ZVEC-ZPOIN ENDIF IF (ICLE.LE.0) THEN XPX=XP1-XPOIN YPX=YP1-YPOIN ZPX=ZP1-ZPOIN SPS=XPX*XVEC+YPX*YVEC+ZPX*ZVEC XPX=XP1-SPS*XVEC YPX=YP1-SPS*YVEC ZPX=ZP1-SPS*ZVEC XVECS=XPX-XPOIN YVECS=YPX-YPOIN ZVECS=ZPX-ZPOIN ENDIF SVECS=XVECS*XVECS+YVECS*YVECS+ZVECS*ZVECS IF (IERR.NE.0) RETURN SVECS=SQRT(SVECS) XVECS=XVECS/SVECS YVECS=YVECS/SVECS ZVECS=ZVECS/SVECS XV2=YVECS*ZV1-ZVECS*YV1 YV2=ZVECS*XV1-XVECS*ZV1 ZV2=XVECS*YV1-YVECS*XV1 S2V2=XV2*XV2+YV2*YV2+ZV2*ZV2 IF (IERR.NE.0) RETURN IF (IERR.NE.0) RETURN XV3=XPT1-XPOIN YV3=YPT1-YPOIN ZV3=ZPT1-ZPOIN XV4=YV3*ZV1-ZV3*YV1 YV4=ZV3*XV1-XV3*ZV1 ZV4=XV3*YV1-YV3*XV1 DNUM=(XV4*XVECS+YV4*YVECS+ZV4*ZVECS)**2 DIS2=DNUM/S2V2 IF (IIMPI.EQ.1) WRITE (IOIMP,1000) DIS2,ANGLE 1000 FORMAT (' DISTANCE AU CARRE DES AXES ',G12.5, . 'RAYON DU CYLINDRE ',G12.5) IF (IERR.NE.0) RETURN DNUM=XV2*XV4+YV2*YV4+ZV2*ZV4 DLA=DNUM/S2V2 DMU=SIGN(DMU,DLA) IF (IIMPI.NE.0) WRITE (IOIMP,1001) DLA,DMU 1001 FORMAT(' LAMBDA,MU ',2G13.5) XCOOR(NXCOUR+1)=XPOIN+XVECS*(DLA-DMU) XCOOR(NXCOUR+2)=YPOIN+YVECS*(DLA-DMU) IF (IDIM.GE.3) XCOOR(NXCOUR+3)=ZPOIN+ZVECS*(DLA-DMU) XCOOR(NXCOUR+idimp1)=XCOOR(IREF+idimp1) GOTO 70 C Projection sur un cone (3D) : 61 XPOIN=XCOOR(IREF+1) YPOIN=XCOOR(IREF+2) ZPOIN=XCOOR(IREF+3) IF (ICLE.GE.10000) THEN XVECS=XVEC-XPOIN YVECS=YVEC-YPOIN ZVECS=ZVEC-ZPOIN ENDIF IF (ICLE.LE.0) THEN XPX=XP1-XPOIN YPX=YP1-YPOIN ZPX=ZP1-ZPOIN SPS=XPX*XVEC+YPX*YVEC+ZPX*ZVEC XPX=XP1-SPS*XVEC YPX=YP1-SPS*YVEC ZPX=ZP1-SPS*ZVEC XVECS=XPX-XPOIN YVECS=YPX-YPOIN ZVECS=ZPX-ZPOIN ENDIF SVECS=XVECS*XVECS+YVECS*YVECS+ZVECS*ZVECS IF (IERR.NE.0) RETURN SVECS=SQRT(SVECS) XVECS=XVECS/SVECS YVECS=YVECS/SVECS ZVECS=ZVECS/SVECS XV2=XPOIN-XPT1 YV2=YPOIN-YPT1 ZV2=ZPOIN-ZPT1 VECV1=XVECS*XV1+YVECS*YV1+ZVECS*ZV1 VEC2=XVECS*XVECS+YVECS*YVECS+ZVECS*ZVECS V2V1=XV2*XV1+YV2*YV1+ZV2*ZV1 VECV2=XVECS*XV2+YVECS*YV2+ZVECS*ZV2 V22=XV2*XV2+YV2*YV2+ZV2*ZV2 A=VECV1*VECV1-ANGLE*VEC2 B=2*(V2V1*VECV1-ANGLE*VECV2) C=V2V1*V2V1-ANGLE*V22 DELTA=B*B-4*A*C IF (IERR.NE.0) RETURN DEL=SQRT(DELTA) X1=(-B+DEL)/(2*A) XX=(-B-DEL)/(2*A) IF (ABS(X1).LT.ABS(XX)) XX=X1 XCOOR(NXCOUR+1)=XPOIN+XX*XVECS XCOOR(NXCOUR+2)=YPOIN+XX*YVECS XCOOR(NXCOUR+3)=ZPOIN+XX*ZVECS XCOOR(NXCOUR+idimp1)=XCOOR(IREF+idimp1) GOTO 70 C Projection sur un tore (3D) : 62 XPOIN=XCOOR(IREF+1) YPOIN=XCOOR(IREF+2) ZPOIN=XCOOR(IREF+3) IF (ICLE.GE.10000) THEN XVECS=XVEC-XPOIN YVECS=YVEC-YPOIN ZVECS=ZVEC-ZPOIN ENDIF IF (ICLE.LE.0) THEN XPX=XP1-XPOIN YPX=YP1-YPOIN ZPX=ZP1-ZPOIN SPS=XPX*XVEC+YPX*YVEC+ZPX*ZVEC XPX=XP1-SPS*XVEC YPX=YP1-SPS*YVEC ZPX=ZP1-SPS*ZVEC XVECS=XPX-XPOIN YVECS=YPX-YPOIN ZVECS=ZPX-ZPOIN ENDIF SVECS=XVECS*XVECS+YVECS*YVECS+ZVECS*ZVECS IF (IERR.NE.0) RETURN SVECS=SQRT(SVECS) XVECS=XVECS/SVECS YVECS=YVECS/SVECS ZVECS=ZVECS/SVECS PR2=XV2 GR2=YV2 XOP=XPOIN-XPT1 YOP=YPOIN-YPT1 ZOP=ZPOIN-ZPT1 OPV=XOP*XVECS+YOP*YVECS+ZOP*ZVECS R2=XOP*XOP+YOP*YOP+ZOP*ZOP-GR2-PR2 VA=XVECS*XV1+YVECS*YV1+ZVECS*ZV1 QR2VA2=4*GR2*VA*VA OPA=XOP*XV1+YOP*YV1+ZOP*ZV1 HR2PV=8*GR2*OPA*VA R=4*GR2*OPA*OPA-4*PR2*GR2 RLMD=0 C Resolution iterative de l'equation du 4eme degre DO ITER=1,25 EXP1=RLMD*(RLMD+2*OPV)+R2 FDLM=EXP1*EXP1+QR2VA2*RLMD*RLMD+HR2PV*RLMD+R FPDLM=4*EXP1*(RLMD+OPV)+QR2VA2*2*RLMD+HR2PV IF (IERR.NE.0) RETURN CORR=FDLM/FPDLM IF (IIMPI.NE.0) WRITE(IOIMP,1016) ITER,RLMD,CORR 1016 FORMAT(' ITER ',I6,' LAMBDA ',G12.5,' CORR ',G12.5) RLMD=RLMD-CORR IF (RLMD.NE.0.) THEN IF (ABS(CORR/RLMD).LT.1E-5) GOTO 66 ENDIF ENDDO RETURN 66 XCOOR(NXCOUR+1)=XPOIN+RLMD*XVECS XCOOR(NXCOUR+2)=YPOIN+RLMD*YVECS XCOOR(NXCOUR+3)=ZPOIN+RLMD*ZVECS XCOOR(NXCOUR+idimp1)=XCOOR(IREF+idimp1) GOTO 70 C Projection sur une droite (2D/3D) : 63 XPOIN=XCOOR(IREF+1) YPOIN=XCOOR(IREF+2) ZPOIN=0. IF (ICLE.GE.10000) THEN XVECS=XVEC-XPOIN YVECS=YVEC-YPOIN ZVECS=0. ENDIF IF (ICLE.LE.0) THEN XPX=XP1-XPOIN YPX=YP1-YPOIN ZPX=ZP1-ZPOIN SPS=XPX*XVEC+YPX*YVEC+ZPX*ZVEC XPX=XP1-SPS*XVEC YPX=YP1-SPS*YVEC ZPX=ZP1-SPS*ZVEC XVECS=XPX-XPOIN YVECS=YPX-YPOIN ZVECS=0. ENDIF SVECS=XVECS*XVECS+YVECS*YVECS+ZVECS*ZVECS IF (IERR.NE.0) RETURN SVECS=SQRT(SVECS) XVECS=XVECS/SVECS YVECS=YVECS/SVECS ZVECS=ZVECS/SVECS DENUM=(XPOIN-XPT1)*XV1+(YPOIN-YPT1)*YV1 DENOM=XVECS*XV1+YVECS*YV1+ZVECS*ZV1 IF (IERR.NE.0) RETURN RAP=-DENUM/DENOM XCOOR(NXCOUR+1)=XPOIN+RAP*XVECS XCOOR(NXCOUR+2)=YPOIN+RAP*YVECS IF (IDIM.GE.3) XCOOR(NXCOUR+3)=ZPOIN+RAP*ZVECS XCOOR(NXCOUR+idimp1)=XCOOR(IREF+idimp1) GOTO 70 C Projection sur un cercle (2D/3D) : 64 XPOIN=XCOOR(IREF+1) YPOIN=XCOOR(IREF+2) ZPOIN=0. IF (ICLE.GE.10000) THEN XVECS=XVEC-XPOIN YVECS=YVEC-YPOIN ZVECS=0. ENDIF IF (ICLE.LE.0) THEN XPX=XP1-XPOIN YPX=YP1-YPOIN ZPX=ZP1-ZPOIN SPS=XPX*XVEC+YPX*YVEC+ZPX*ZVEC XPX=XP1-SPS*XVEC YPX=YP1-SPS*YVEC ZPX=ZP1-SPS*ZVEC XVECS=XPX-XPOIN YVECS=YPX-YPOIN ZVECS=0. ENDIF SVECS=XVECS*XVECS+YVECS*YVECS+ZVECS*ZVECS IF (IERR.NE.0) RETURN SVECS=SQRT(SVECS) XVECS=XVECS/SVECS YVECS=YVECS/SVECS ZVECS=ZVECS/SVECS SCA=XVECS*(XPT1-XPOIN)+YVECS*(YPT1-YPOIN) XV=XVECS*SCA YV=YVECS*SCA ZV=ZVECS*SCA S2=(XPOIN+XV-XPT1)**2+(YPOIN+YV-YPT1)**2+(ZPOIN+ZV-ZPT1)**2 IF (IERR.NE.0) RETURN C=SQRT(ANG2-S2) IF (SCA.LT.0.) C=-C XCOOR(NXCOUR+1)=XPOIN+XV-C*XVECS XCOOR(NXCOUR+2)=YPOIN+YV-C*YVECS IF (IDIM.GE.3) XCOOR(NXCOUR+3)=ZPOIN+ZV-C*ZVECS XCOOR(NXCOUR+idimp1)=XCOOR(IREF+idimp1) GOTO 70 C Stockage du point image cree dans XCOOR et dans ICPR C On remplit le maillage IPT2 70 NXCOUR=NXCOUR+idimp1 IPT2.NUM(i,j)=NXCOUR/idimp1 ICPR(IPT1.NUM(i,j))=IPT2.NUM(i,j) ELSE C On recupere le noeud image dans ICPR et on remplit IPT2 IPT2.NUM(i,j)=ICPR(IPT1.NUM(i,j)) ENDIF 11 CONTINUE 10 CONTINUE C Fin de la boucle sur les noeuds de IPT1 C On a cree IPT2 maillage transforme de IPT2 (elements,noeuds) NBPTS=NXCOUR/idimp1 SEGADJ MCOORD RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales