proobj
C PROOBJ SOURCE SP204843 24/08/05 21:15:03 11978 C CE SOUS-PROGRAMME PREPARE LA PROJECTION D'UN OBJET SUR UNE C SURFACE : C PLAN P1 P2 P3 C SPHE C P C CYLI C1 C2 P C CONI C C1 P C TORI C A Cs P C NOUVELLE POSSIBILITE EN 2D NOVEMBRE 1986 C DROI P1 P2 C CERCLE P1 C C JANVIER 1987 INTRODUCTION DE LA PROJECTION CONIQUE C C SEPTEMBRE 1996 PROJECTION D'UN OBJET MAILLAGE SUR UN OBJET C MAILLAGE. SUBROUTINE PROOBJ IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) -INC PPARAM -INC CCREEL -INC CCOPTIO -INC SMCOORD -INC SMELEME COMMON /CTOURN/XPT1,YPT1,ZPT1,XV1,YV1,ZV1,XV2,YV2,ZV2,XVEC,YVEC, # ZVEC,ANGLE,ICLE,XP1,YP1,ZP1 CHARACTER*4 MCLE(7),MTYPP(3) DATA MTYPP/'DIRE','CONI','CYLI'/ DATA MCLE/'PLAN','SPHE','CYLI','CONI','TORI','DROI','CERC'/ SEGACT MCOORD MELEME=0 IF (IRETOU.EQ.1) GOTO 1 C C'EST UN POINT QU'ON PROJETTE IF (IERR.NE.0) RETURN 1 CONTINUE * CONIQUE OU CYLINDRIQUE IF (IERR.NE.0) RETURN IF (IYYT.EQ.3) THEN IP2 = 0 IF (IERR.NE.0) RETURN ENDIF IF (IYYT.EQ.1) THEN IF(IRETO.NE.0) THEN if (meleme.ne.0) then else return endif RETURN ENDIF ENDIF IF (IYYT.EQ.2) THEN IF(IRETO.NE.0) THEN RETURN ENDIF ENDIF SEGACT MCOORD IREF=(IDIM+1)*(IP1-1) XVEC=XCOOR(IREF+1) YVEC=XCOOR(IREF+2) ZVEC=XCOOR(IREF+3) IF (IDIM.EQ.2) ZVEC=0. IF (IYYT.EQ.3) THEN IF (IDIM.EQ.2) THEN INTERR(1)=2 RETURN ENDIF C write(6,*) 'Option CYL2' XP1 = XVEC YP1 = YVEC ZP1 = ZVEC IREF=(IDIM+1)*(IP2-1) XP2=XCOOR(IREF+1) YP2=XCOOR(IREF+2) ZP2=XCOOR(IREF+3) IF (IDIM.EQ.2) ZP2=0. XVEC=XP2-XP1 YVEC=YP2-YP1 ZVEC=ZP2-ZP1 SVEC=XVEC**2+YVEC**2+ZVEC**2 UMAX=max(ABS(XP1),ABS(XP2)) VMAX=max(ABS(YP1),ABS(YP2)) WMAX=max(ABS(ZP1),ABS(ZP2)) IF(VMAX.GT.UMAX) UMAX=VMAX IF(WMAX.GT.UMAX) UMAX=WMAX IF (SVEC.LT.(UMAX*XZPREC)) THEN RETURN ENDIF SVEC=SQRT(SVEC) XVEC=XVEC/SVEC YVEC=YVEC/SVEC ZVEC=ZVEC/SVEC C write(6,*) 'XP1,YP1,ZP1',XP1,YP1,ZP1 C write(6,*) 'XP2,YP2,ZP2',XP2,YP2,ZP2 C write(6,*) 'XVEC,YVEC,ZVEC,SVEC',XVEC,YVEC,ZVEC,SVEC ENDIF IALIR=0 IF (IYYT.EQ.0) IALIR=1 IF (IVAL.EQ.0) THEN IVAL=IYYT+2 IYYT=0 ENDIF IF (IERR.NE.0) RETURN IF (IERR.NE.0) RETURN ICLE=IVAL+7 GOTO (10,20,30,40,50,60,70),IVAL 10 CONTINUE C PLAN ON LIT TROIS POINTS IF (IERR.NE.0) RETURN IREF=(IDIM+1)*(IP1-1) XPT1=XCOOR(IREF+1) YPT1=XCOOR(IREF+2) ZPT1=XCOOR(IREF+3) IREF=(IDIM+1)*(IP2-1) XV2=XCOOR(IREF+1)-XPT1 YV2=XCOOR(IREF+2)-YPT1 ZV2=XCOOR(IREF+3)-ZPT1 IREF=(IDIM+1)*(IP3-1) XV3=XCOOR(IREF+1)-XPT1 YV3=XCOOR(IREF+2)-YPT1 ZV3=XCOOR(IREF+3)-ZPT1 C ON GARDE LE VECTEUR NORMAL NORMALISE XV1=YV2*ZV3-ZV2*YV3 YV1=ZV2*XV3-XV2*ZV3 ZV1=XV2*YV3-YV2*XV3 SV1=SQRT(XV1**2+YV1**2+ZV1**2) IF (IERR.NE.0) RETURN XV1=XV1/SV1 YV1=YV1/SV1 ZV1=ZV1/SV1 GOTO 100 20 CONTINUE C SPHERE ON LIT LE CENTRE ET UN POINT IF (IERR.NE.0) RETURN IREF=(IPCEN-1)*(IDIM+1) XPT1=XCOOR(IREF+1) YPT1=XCOOR(IREF+2) ZPT1=XCOOR(IREF+3) IREF=(IP1-1)*(IDIM+1) XV=XCOOR(IREF+1)-XPT1 YV=XCOOR(IREF+2)-YPT1 ZV=XCOOR(IREF+3)-ZPT1 ANGLE=SQRT(XV**2+YV**2+ZV**2) IF (IERR.NE.0) RETURN GOTO 100 30 CONTINUE C CYLINDRE ON LIT DEUX POINTS DE L'AXE ET UN POINT DU CYLINDRE IF (IERR.NE.0) RETURN IREF=(IDIM+1)*(IPOIN1-1) XPT1=XCOOR(IREF+1) YPT1=XCOOR(IREF+2) ZPT1=XCOOR(IREF+3) IREF=(IDIM+1)*(IPOIN2-1) XV1=XCOOR(IREF+1)-XPT1 YV1=XCOOR(IREF+2)-YPT1 ZV1=XCOOR(IREF+3)-ZPT1 S=SQRT(XV1**2+YV1**2+ZV1**2) IF (IERR.NE.0) RETURN XV1=XV1/S YV1=YV1/S ZV1=ZV1/S IREF=(IDIM+1)*(IP1-1) XV2=XCOOR(IREF+1)-XPT1 YV2=XCOOR(IREF+2)-YPT1 ZV2=XCOOR(IREF+3)-ZPT1 XV3=YV1*ZV2-ZV1*YV2 YV3=ZV1*XV2-XV1*ZV2 ZV3=XV1*YV2-YV1*XV2 ANGLE=SQRT(XV3**2+YV3**2+ZV3**2) C RAYON DU CYLINDRE IF (IERR.NE.0) RETURN GOTO 100 40 CONTINUE C CONE ON LIT LE SOMMET UN POINT DE L'AXE ET UN POINT DU CONE IF (IERR.NE.0) RETURN IREF=(IDIM+1)*(IPT1-1) XPT1=XCOOR(IREF+1) YPT1=XCOOR(IREF+2) ZPT1=XCOOR(IREF+3) IREF=(IDIM+1)*(IP1-1) XV1=XCOOR(IREF+1)-XPT1 YV1=XCOOR(IREF+2)-YPT1 ZV1=XCOOR(IREF+3)-ZPT1 SV1=SQRT(XV1**2+YV1**2+ZV1**2) IF (IERR.NE.0) RETURN XV1=XV1/SV1 YV1=YV1/SV1 ZV1=ZV1/SV1 IREF=(IDIM+1)*(IP2-1) XV2=XCOOR(IREF+1)-XPT1 YV2=XCOOR(IREF+2)-YPT1 ZV2=XCOOR(IREF+3)-ZPT1 SV2=SQRT(XV2**2+YV2**2+ZV2**2) IF (IERR.NE.0) RETURN XV2=XV2/SV2 YV2=YV2/SV2 ZV2=ZV2/SV2 ANGLE=(XV1*XV2+YV1*YV2+ZV1*ZV2)**2 IF (IIMPI.NE.0) WRITE (IOIMP,1012) ANGLE 1012 FORMAT(' COS **2 DE ANGLE AU SOMMET ',G12.5) GOTO 100 50 CONTINUE C TORE ON LIT LE CENTRE UN POINT DE L'AXE UN CENTRE SECONDAIRE ET C UN POINT IF (IERR.NE.0) RETURN IREF=(IDIM+1)*(IPT1-1) XPT1=XCOOR(IREF+1) YPT1=XCOOR(IREF+2) ZPT1=XCOOR(IREF+3) IREF=(IDIM+1)*(IPAX-1) XV1=XCOOR(IREF+1)-XPT1 YV1=XCOOR(IREF+2)-YPT1 ZV1=XCOOR(IREF+3)-ZPT1 SV1=XV1**2+YV1**2+ZV1**2 IF (IERR.NE.0) RETURN SV1=SQRT(SV1) XV1=XV1/SV1 YV1=YV1/SV1 ZV1=ZV1/SV1 IREF=(IDIM+1)*(IPCS-1) XV2=XCOOR(IREF+1)-XPT1 YV2=XCOOR(IREF+2)-YPT1 ZV2=XCOOR(IREF+3)-ZPT1 SCA=XV2*XV1+YV2*YV1+ZV2*ZV1 XPT1=XPT1+SCA*XV1 YPT1=YPT1+SCA*YV1 ZPT1=ZPT1+SCA*ZV1 XV2=XV2-SCA*XV1 YV2=YV2-SCA*YV1 ZV2=ZV2-SCA*ZV1 GR2=XV2**2+YV2**2+ZV2**2 IF (IERR.NE.0) RETURN IREF=(IDIM+1)*(IP1-1) XV2=XCOOR(IREF+1)-XPT1 YV2=XCOOR(IREF+2)-YPT1 ZV2=XCOOR(IREF+3)-ZPT1 SCA=XV2*XV1+YV2*YV1+ZV2*ZV1 XC=XV2-SCA*XV1 YC=YV2-SCA*YV1 ZC=ZV2-SCA*ZV1 SC=XC**2+YC**2+ZC**2 IF (IERR.NE.0) RETURN RAP=SQRT(GR2/SC) XC=XC*RAP YC=YC*RAP ZC=ZC*RAP PR2=(XV2-XC)**2+(YV2-YC)**2+(ZV2-ZC)**2 IF (IERR.NE.0) RETURN XV2=PR2 YV2=GR2 IF (IIMPI.NE.0) WRITE (IOIMP,1015) XV2,YV2,XPT1,YPT1,ZPT1, # XV1,YV1,ZV1 1015 FORMAT(' CARRE PETIT RAYON ',G12.5, # ' CARRE GRAND RAYON ',G12.5,/,' CENTRE ',3G13.5,' AXE ', # 3G12.5) GOTO 100 60 CONTINUE C DROITE ON LIT DEUX POINTS IF (IERR.NE.0) RETURN IREF=(IDIM+1)*(IP1-1) XPT1=XCOOR(IREF+1) YPT1=XCOOR(IREF+2) ZPT1=0. IREF=(IDIM+1)*(IP2-1) XV2=XCOOR(IREF+1)-XPT1 YV2=XCOOR(IREF+2)-YPT1 ZV2=0. XV3=0. YV3=0. ZV3=1. C ON GARDE LE VECTEUR NORMAL NORMALISE XV1=YV2*ZV3-ZV2*YV3 YV1=ZV2*XV3-XV2*ZV3 ZV1=XV2*YV3-YV2*XV3 SV1=SQRT(XV1**2+YV1**2+ZV1**2) IF (IERR.NE.0) RETURN XV1=XV1/SV1 YV1=YV1/SV1 ZV1=ZV1/SV1 GOTO 100 70 CONTINUE C CERCLE ON LIT LE CENTRE ET UN POINT IF (IERR.NE.0) RETURN IREF=(IPCEN-1)*(IDIM+1) XPT1=XCOOR(IREF+1) YPT1=XCOOR(IREF+2) ZPT1=0. IREF=(IP1-1)*(IDIM+1) XV=XCOOR(IREF+1)-XPT1 YV=XCOOR(IREF+2)-YPT1 ZV=0. ANGLE=SQRT(XV**2+YV**2+ZV**2) IF (IERR.NE.0) RETURN GOTO 100 100 CONTINUE IF (MELEME.EQ.0) GOTO 101 IF (IYYT.EQ.2) THEN IVAL=IVAL+10000 ICLE=ICLE+10000 ENDIF IF (IYYT.EQ.3) THEN IVAL=IVAL-10000 ICLE=ICLE-10000 ENDIF RETURN 101 CONTINUE IREF=(IDIM+1)*(IPOIN-1) XPOIN=XCOOR(IREF+1) YPOIN=XCOOR(IREF+2) ZPOIN=XCOOR(IREF+3) TPOIN=XCOOR(IREF+4) IF (IDIM.EQ.2) ZPOIN=0 IF (IDIM.EQ.2) TPOIN=XCOOR(IREF+3) IF (IYYT.EQ.2) THEN XVEC=XVEC-XPOIN YVEC=YVEC-YPOIN ZVEC=ZVEC-ZPOIN IF (IDIM.EQ.2) ZVEC=0. ENDIF IF (IYYT.EQ.3) THEN RETURN ENDIF SVEC=SQRT(XVEC**2+YVEC**2+ZVEC**2) IF (IERR.NE.0) RETURN XVEC=XVEC/SVEC YVEC=YVEC/SVEC ZVEC=ZVEC/SVEC GOTO (110,120,130,140,150,160,170),IVAL 110 CONTINUE XV=XPOIN-XPT1 YV=YPOIN-YPT1 ZV=ZPOIN-ZPT1 DENUM=XV*XV1+YV*YV1+ZV*ZV1 DENOM=XVEC*XV1+YVEC*YV1+ZVEC*ZV1 IF (IERR.NE.0) RETURN RAP=-DENUM/DENOM XPOIN=XPOIN+RAP*XVEC YPOIN=YPOIN+RAP*YVEC ZPOIN=ZPOIN+RAP*ZVEC GOTO 200 120 CONTINUE XV=XPT1-XPOIN YV=YPT1-YPOIN ZV=ZPT1-ZPOIN SCA=XVEC*XV+YVEC*YV+ZVEC*ZV XV=XVEC*SCA YV=YVEC*SCA ZV=ZVEC*SCA S2=(XPOIN+XV-XPT1)**2+(YPOIN+YV-YPT1)**2+(ZPOIN+ZV-ZPT1)**2 IF (IERR.NE.0) RETURN C=SQRT(ANGLE**2-S2) IF (SCA.LT.0.) C=-C XPOIN=XPOIN+XV-C*XVEC YPOIN=YPOIN+YV-C*YVEC ZPOIN=ZPOIN+ZV-C*ZVEC GOTO 200 130 CONTINUE C V2 = VEC VECT V1 XV2=YVEC*ZV1-ZVEC*YV1 YV2=ZVEC*XV1-XVEC*ZV1 ZV2=XVEC*YV1-YVEC*XV1 S2V2=XV2**2+YV2**2+ZV2**2 IF (IERR.NE.0) RETURN IF (IERR.NE.0) RETURN C V3= POIN PT1 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*XVEC+YV4*YVEC+ZV4*ZVEC)**2 DIS2=DNUM/S2V2 IF (IIMPI.NE.0) 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) XPOIN=XPOIN+XVEC*(DLA-DMU) YPOIN=YPOIN+YVEC*(DLA-DMU) ZPOIN=ZPOIN+ZVEC*(DLA-DMU) GOTO 200 140 CONTINUE XV2=XPOIN-XPT1 YV2=YPOIN-YPT1 ZV2=ZPOIN-ZPT1 VECV1=XVEC*XV1+YVEC*YV1+ZVEC*ZV1 VEC2=XVEC**2+YVEC**2+ZVEC**2 V2V1=XV2*XV1+YV2*YV1+ZV2*ZV1 VECV2=XVEC*XV2+YVEC*YV2+ZVEC*ZV2 V22=XV2**2+YV2**2+ZV2**2 A=VECV1**2-ANGLE*VEC2 B=2*(V2V1*VECV1-ANGLE*VECV2) C=V2V1**2-ANGLE*V22 DELTA=B**2-4*A*C IF (IERR.NE.0) RETURN DEL=SQRT(DELTA) X1=(-B+DEL)/(2*A) X2=(-B-DEL)/(2*A) X=X2 IF (ABS(X1).LT.ABS(X2)) X=X1 XPOIN=XPOIN+X*XVEC YPOIN=YPOIN+X*YVEC ZPOIN=ZPOIN+X*ZVEC GOTO 200 150 CONTINUE PR2=XV2 GR2=YV2 XOP=XPOIN-XPT1 YOP=YPOIN-YPT1 ZOP=ZPOIN-ZPT1 OPV=XOP*XVEC+YOP*YVEC+ZOP*ZVEC R2=XOP**2+YOP**2+ZOP**2-GR2-PR2 VA=XVEC*XV1+YVEC*YV1+ZVEC*ZV1 QR2VA2=4*GR2*VA**2 OPA=XOP*XV1+YOP*YV1+ZOP*ZV1 HR2PV=8*GR2*OPA*VA R=4*GR2*OPA**2-4*PR2*GR2 RLMD=0 C RESOLUTION DE L'EQUATION DU 4EME DEGRE PAR ITERATION DO 151 ITER=1,25 EXP1=RLMD*(RLMD+2*OPV)+R2 FDLM=EXP1**2+QR2VA2*RLMD**2+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.EQ.0.) GOTO 151 IF (ABS(CORR/RLMD).LT.1E-5) GOTO 152 151 CONTINUE RETURN 152 CONTINUE XPOIN=XPOIN+RLMD*XVEC YPOIN=YPOIN+RLMD*YVEC ZPOIN=ZPOIN+RLMD*ZVEC GOTO 200 160 CONTINUE XV=XPOIN-XPT1 YV=YPOIN-YPT1 ZV=ZPOIN-ZPT1 DENUM=XV*XV1+YV*YV1+ZV*ZV1 DENOM=XVEC*XV1+YVEC*YV1+ZVEC*ZV1 IF (IERR.NE.0) RETURN RAP=-DENUM/DENOM XPOIN=XPOIN+RAP*XVEC YPOIN=YPOIN+RAP*YVEC ZPOIN=ZPOIN+RAP*ZVEC GOTO 200 170 CONTINUE XV=XPT1-XPOIN YV=YPT1-YPOIN ZV=ZPT1-ZPOIN SCA=XVEC*XV+YVEC*YV+ZVEC*ZV XV=XVEC*SCA YV=YVEC*SCA ZV=ZVEC*SCA S2=(XPOIN+XV-XPT1)**2+(YPOIN+YV-YPT1)**2+(ZPOIN+ZV-ZPT1)**2 IF (IERR.NE.0) RETURN C=SQRT(ANGLE**2-S2) IF (SCA.LT.0.) C=-C XPOIN=XPOIN+XV-C*XVEC YPOIN=YPOIN+YV-C*YVEC ZPOIN=ZPOIN+ZV-C*ZVEC GOTO 200 200 CONTINUE SEGACT MCOORD*mod NBPTS=nbpts+1 SEGADJ MCOORD XCOOR((NBPTS-1)*(IDIM+1)+1)=XPOIN XCOOR((NBPTS-1)*(IDIM+1)+2)=YPOIN IF (IDIM.EQ.3) XCOOR((NBPTS-1)*(IDIM+1)+3)=ZPOIN XCOOR(NBPTS*(IDIM+1))=TPOIN RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales