inters
C INTERS SOURCE PASCAL 21/07/15 21:15:01 11076 SUBROUTINE INTERS C----------------------------------------------------------------------- C C INTERSECTIONS DE SURFACES (PLAN,SPHERE,CYLINDRE,CONE,TORE) C C----------------------------------------------------------------------- C C IOB1 EVENTUELLEMENT OBJET QUE L'ON PROLONGE C IOB2 EVENTUELLEMENT OBJET QUE L'ON AVANCE C IPOIN1 POINT INITIAL C IPOIN2 POINT FINAL C ICLE TYPE DE LA PREMIERE SURFACE C JCLE TYPE DE LA DEUXIEME SURFACE C XPAUX TABLEAU DE POINTS AUXILIAIRES SERVANT A RECTIFIER L'INTERSE C LA QUATRIEME COMPOSANTE EST L'ABCISSE CURVILIGNE C C----------------------------------------------------------------------- C C 17/09/93 : intersection de deux MELEMEs (sens ensembliste) C C PM 30/08/05 : Erreur si intersection vide, sauf si mot-clef 'NOVERIF' C C BP 28/08/2012 : Ajout de l'intersection geometrique de 2 maillages C C----------------------------------------------------------------------- c IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC CCGEOME -INC SMCOORD -INC SMELEME SEGMENT TABPAR(NPOIN) LOGICAL VERIF,ltelq CHARACTER*4 MCLE(8),MCLE2(1),MCLE3(1) C INITIALISATION A L'USAGE DE L'OPTIMISEUR PARAMETER ( NBT = 22 ) DIMENSION XPAUX(4,NBT) DATA RAYI/1./ DATA MCLE/'PLAN','SPHE','CYLI','CONI','TORI','DINI','DFIN','LONG'/ DATA MCLE2/'NOVE'/ DATA MCLE3/'GEOM'/ C C----------------------------------------------------------------------- C INTERSECTION DE DEUX LISTREELS C Dans ce cas, le resultat est directment ecrit dans la pile. IF (IERR.NE.0) RETURN IF (IRETOU.EQ.1) THEN IF (IERR.NE.0) RETURN RETURN ENDIF C C----------------------------------------------------------------------- C INTERSECTION DE DEUX RIGIDITES C Dans ce cas, le resultat est directment ecrit dans la pile. IF (IERR.NE.0) RETURN IF (IRETOU.EQ.1) THEN IF (IERR.NE.0) RETURN RETURN ENDIF C C----------------------------------------------------------------------- C INTERSECTION DE DEUX MODELES C Dans ce cas, le resultat est directment ecrit dans la pile. IF (IERR.NE.0) RETURN IF (IRETOU.EQ.1) THEN IF (IERR.NE.0) RETURN RETURN ENDIF C C----------------------------------------------------------------------- C INTERSECTION DE DEUX MAILLAGES C C sens ensembliste ou geometrique? c write(ioimp,*) 'option GEOM ? ',IGEO3 C c lecture des maillages IF (IRETOU.EQ.1) THEN C On laisse la syntaxe NOVERIF pour l'intersection Géométrique C------ Intersection ensembliste ------------------ if(IGEO3.eq.0) then IF (IRETOV.EQ.1) THEN C Intersection de deux maillages IF (IRETIB.EQ.1) THEN C On fournit un maillage vide NBNN=0 NBELEM=0 NBSOUS=0 NBREF=0 SEGINI,IPT3 IPT3.ITYPEL=0 SEGDES,IPT3 ENDIF RETURN ELSE CALL REFUS ENDIF C------ Intersection geometrique ------------------ else IOB3=0 IOB4=0 C Cas ou n'a pas pu calculer l'intersection if(IOB3.eq.0) then C On fournit 2 maillage vide + les 2 initiaux NBNN=0 NBELEM=0 NBSOUS=0 NBREF=0 SEGINI,IPT3 IPT3.ITYPEL=0 IOB3=IPT3 SEGDES,IPT3 IF(IRETOV.EQ.1)THEN SEGINI,IPT3,IPT4 IPT4.ITYPEL=0 IOB4=IPT4 SEGDES,IPT4 ENDIF endif RETURN endif ENDIF C----------------------------------------------------------------------- C CREATION D'UNE LIGNE RESULTAT D'UNE INTERSECTION DE SURFACES C DEFINIES ANALYTIQUEMENT (PLAN, SPHERE, ...) C IF (IERR.NE.0) RETURN C Y A T'IL UN FACTEUR DE DECOUPAGE INBR=0 IMPOI=0 IMPOF=0 IMPLON=0 SEGACT MCOORD*mod C LECTURE DU PREMIER POINT . SI C'EST UN ELEMENT ON EN EXTRAIT LE C DERNIER POINT . IOB1=0 IF (IRETOU.EQ.0) GOTO 1 IPT6=IOB1 SEGACT IPT6 IF(IERR .NE. 0)RETURN GOTO 2 2 IF (IERR.NE.0) RETURN C PREMIERE SURFACE IF (IERR.NE.0) RETURN C Y A T-IL DES DENSITES IMPOSEES 82 IF (IMPOI.EQ.1.OR.ICLE.NE.6) GOTO 80 IMPOI=1 IF (IERR.NE.0) RETURN 80 IF (IMPOF.EQ.1.OR.ICLE.NE.7) GOTO 81 IMPOF=1 IF (IERR.NE.0) RETURN IF (IMPOI.EQ.0) GOTO 82 81 IF (IMPLON.EQ.1.OR.ICLE.NE.8) GOTO 800 IMPLON=1 IF (IERR.NE.0) RETURN goto 82 800 continue C ACQUISITION DES DONNEES DE LA PREMIERE SURFACE GOTO (20,21,22,23,24),ICLE IF (IERR.NE.0) RETURN IREF=4*(IPL-1) XIPL=XCOOR(IREF+1) YIPL=XCOOR(IREF+2) ZIPL=XCOOR(IREF+3) GOTO 25 IF (IERR.NE.0) RETURN IREF=4*(IPL-1) XIPL=XCOOR(IREF+1) YIPL=XCOOR(IREF+2) ZIPL=XCOOR(IREF+3) GOTO 25 IF (IERR.NE.0) RETURN IREF=4*(IPL-1) XIPL=XCOOR(IREF+1) YIPL=XCOOR(IREF+2) ZIPL=XCOOR(IREF+3) IF (IERR.NE.0) RETURN IREF=4*(IPL2-1) XIV=XCOOR(IREF+1)-XIPL YIV=XCOOR(IREF+2)-YIPL ZIV=XCOOR(IREF+3)-ZIPL S=SQRT(XIV*XIV+YIV*YIV+ZIV*ZIV) IF (S.EQ.0.) THEN RETURN ENDIF XIV=XIV/S YIV=YIV/S ZIV=ZIV/S GOTO 25 IF (IERR.NE.0) RETURN IREF=4*(IPL-1) XIPL=XCOOR(IREF+1) YIPL=XCOOR(IREF+2) ZIPL=XCOOR(IREF+3) IF (IERR.NE.0) RETURN IREF=4*(IPL2-1) XIV=XCOOR(IREF+1)-XIPL YIV=XCOOR(IREF+2)-YIPL ZIV=XCOOR(IREF+3)-ZIPL S=SQRT(XIV**2+YIV**2+ZIV**2) IF (S.EQ.0.) THEN RETURN ENDIF XIV=XIV/S YIV=YIV/S ZIV=ZIV/S GOTO 25 IF (IERR.NE.0) RETURN IREF=4*(IPL-1) XIPL=XCOOR(IREF+1) YIPL=XCOOR(IREF+2) ZIPL=XCOOR(IREF+3) IF (IERR.NE.0) RETURN IREF=4*(IAXE-1) XIAXE=XCOOR(IREF+1)-XIPL YIAXE=XCOOR(IREF+2)-YIPL ZIAXE=XCOOR(IREF+3)-ZIPL SIAXE=SQRT(XIAXE**2+YIAXE**2+ZIAXE**2) IF (SIAXE.EQ.0.) THEN RETURN ENDIF XIAXE=XIAXE/SIAXE YIAXE=YIAXE/SIAXE ZIAXE=ZIAXE/SIAXE IF (IERR.NE.0) RETURN IREF=4*(IP1-1) XIP1=XCOOR(IREF+1) YIP1=XCOOR(IREF+2) ZIP1=XCOOR(IREF+3) GRAYI=SQRT((XIPL-XIP1)**2+(YIPL-YIP1)**2+(ZIPL-ZIP1)**2) IF (GRAYI.EQ.0.) THEN RETURN ENDIF 25 CONTINUE C DEUXIEME SURFACE IF (IERR.NE.0) RETURN C Y A T-IL DES DENSITES IMPOSEES 85 IF (IMPOI.EQ.1.OR.JCLE.NE.6) GOTO 83 IMPOI=1 IF (IERR.NE.0) RETURN 83 IF (IMPOF.EQ.1.OR.JCLE.NE.7) GOTO 84 IMPOF=1 IF (IERR.NE.0) RETURN IF (IMPOI.EQ.0) GOTO 85 84 IF (IMPLON.EQ.1.OR.ICLE.NE.8) GOTO 801 IMPLON=1 IF (IERR.NE.0) RETURN goto 85 801 continue C AQUISITION DES DONNEES DE LA DEUXIEME SURFACE GOTO (40,41,42,43,44),JCLE IF (IERR.NE.0) RETURN IREF=4*(JPL-1) XJPL=XCOOR(IREF+1) YJPL=XCOOR(IREF+2) ZJPL=XCOOR(IREF+3) GOTO 45 IF (IERR.NE.0) RETURN IREF=4*(JPL-1) XJPL=XCOOR(IREF+1) YJPL=XCOOR(IREF+2) ZJPL=XCOOR(IREF+3) GOTO 45 IF (IERR.NE.0) RETURN IREF=4*(JPL-1) XJPL=XCOOR(IREF+1) YJPL=XCOOR(IREF+2) ZJPL=XCOOR(IREF+3) IF (IERR.NE.0) RETURN IREF=4*(JPL2-1) XJV=XCOOR(IREF+1)-XJPL YJV=XCOOR(IREF+2)-YJPL ZJV=XCOOR(IREF+3)-ZJPL S=SQRT(XJV**2+YJV**2+ZJV**2) IF(S.EQ.0.) THEN RETURN ENDIF XJV=XJV/S YJV=YJV/S ZJV=ZJV/S GOTO 45 IF (IERR.NE.0) RETURN IREF=4*(JPL-1) XJPL=XCOOR(IREF+1) YJPL=XCOOR(IREF+2) ZJPL=XCOOR(IREF+3) IF (IERR.NE.0) RETURN IREF=4*(JPL2-1) XJV=XCOOR(IREF+1)-XJPL YJV=XCOOR(IREF+2)-YJPL ZJV=XCOOR(IREF+3)-ZJPL S=SQRT(XJV**2+YJV**2+ZJV**2) IF (S.EQ.0.) THEN RETURN ENDIF XJV=XJV/S YJV=YJV/S ZJV=ZJV/S GOTO 45 IF (IERR.NE.0) RETURN IREF=4*(JPL-1) XJPL=XCOOR(IREF+1) YJPL=XCOOR(IREF+2) ZJPL=XCOOR(IREF+3) IF (IERR.NE.0) RETURN IREF=4*(JAXE-1) XJAXE=XCOOR(IREF+1)-XJPL YJAXE=XCOOR(IREF+2)-YJPL ZJAXE=XCOOR(IREF+3)-ZJPL SJAXE=SQRT(XJAXE**2+YJAXE**2+ZJAXE**2) IF (SJAXE.EQ.0.) THEN RETURN ENDIF XJAXE=XJAXE/SJAXE YJAXE=YJAXE/SJAXE ZJAXE=ZJAXE/SJAXE IF (IERR.NE.0) RETURN IREF=4*(JP1-1) XJP1=XCOOR(IREF+1) YJP1=XCOOR(IREF+2) ZJP1=XCOOR(IREF+3) GRAYJ=SQRT((XJPL-XJP1)**2+(YJPL-YJP1)**2+(ZJPL-ZJP1)**2) IF (GRAYJ.EQ.0.) THEN RETURN ENDIF 45 CONTINUE C Y A T-IL DES DENSITES IMPOSEES IRETOU=0 IF (MDPOS.EQ.0) GOTO 89 IF (IMPOI.EQ.1.OR.MDPOS.NE.1) GOTO 86 IMPOI=1 goto 88 86 IF (IMPOF.EQ.1.OR.MDPOS.NE.2) GOTO 87 IMPOF=1 GOTO 88 87 if (implon.EQ.1.OR.MDPOS.NE.3) GOTO 802 implon=1 goto 88 89 CONTINUE if (ierr.ne.0) return C LECTURE DU DEUXIEME POINT . SI C'EST UN ELEMENT ON EN EXTRAIT LE C PREMIER POINT . IOB2=0 iretou=0 IF (IRETOU.EQ.0) GOTO 50 IPT6=IOB2 SEGACT IPT6 IF(IERR .NE. 0)RETURN GOTO 51 51 IF (IERR.NE.0) RETURN NBP=NBT-2 IREF1=(IPOIN1-1)*4 IREF2=(IPOIN2-1)*4 XPOIN1=XCOOR(IREF1+1) YPOIN1=XCOOR(IREF1+2) ZPOIN1=XCOOR(IREF1+3) IF (IMPOI.EQ.0) TPOIN1=XCOOR(IREF1+4) XPOIN2=XCOOR(IREF2+1) YPOIN2=XCOOR(IREF2+2) ZPOIN2=XCOOR(IREF2+3) IF (IMPOF.EQ.0) TPOIN2=XCOOR(IREF2+4) XVEC=XPOIN2-XPOIN1 YVEC=YPOIN2-YPOIN1 ZVEC=ZPOIN2-ZPOIN1 SVEC=SQRT(XVEC**2+YVEC**2+ZVEC**2) IF (SVEC.EQ.0.) THEN RETURN ENDIF EPS2=1E-10*SVEC**2 C IL FAUT VERIFIER LA COMPATIBILITE DES DONNEES GOTO (60,61,62,63,64),ICLE 60 CONTINUE XPV1=XPOIN1-XIPL YPV1=YPOIN1-YIPL ZPV1=ZPOIN1-ZIPL XPV2=XPOIN2-XIPL YPV2=YPOIN2-YIPL ZPV2=ZPOIN2-ZIPL XIPN=YPV1*ZPV2-ZPV1*YPV2 YIPN=ZPV1*XPV2-XPV1*ZPV2 ZIPN=XPV1*YPV2-YPV1*XPV2 SIPN=SQRT(XIPN**2+YIPN**2+ZIPN**2) IF (IERR.NE.0) RETURN XIPN=XIPN/SIPN YIPN=YIPN/SIPN ZIPN=ZIPN/SIPN GOTO 65 61 CONTINUE RAYI=SQRT((XPOIN1-XIPL)**2+(YPOIN1-YIPL)**2+(ZPOIN1-ZIPL)**2) RAYB=SQRT((XPOIN2-XIPL)**2+(YPOIN2-YIPL)**2+(ZPOIN2-ZIPL)**2) if (implon.eq.0) then IF (ABS((RAYI-RAYB)/RAYI).GE.1E-2) THEN RETURN ENDIF RAYI=SQRT(RAYI*RAYB) endif GOTO 65 62 CONTINUE U=XPOIN1-XIPL V=YPOIN1-YIPL W=ZPOIN1-ZIPL SCA=U*XIV+V*YIV+W*ZIV U=U-SCA*XIV V=V-SCA*YIV W=W-SCA*ZIV RAYI=SQRT(U**2+V**2+W**2) U=XPOIN2-XIPL V=YPOIN2-YIPL W=ZPOIN2-ZIPL SCA=U*XIV+V*YIV+W*ZIV U=U-SCA*XIV V=V-SCA*YIV W=W-SCA*ZIV RAYB=SQRT(U**2+V**2+W**2) if (implon.eq.0) then RAYI=SQRT(RAYI*RAYB) endif GOTO 65 63 CONTINUE U=XPOIN1-XIPL V=YPOIN1-YIPL W=ZPOIN1-ZIPL SCA=ABS(U*XIV+V*YIV+W*ZIV) U1=V*ZIV-W*YIV V1=W*XIV-U*ZIV W1=U*YIV-V*XIV VEC=SQRT(U1**2+V1**2+W1**2) IF (IERR.NE.0) RETURN TANGI=VEC/SCA U=XPOIN2-XIPL V=YPOIN2-YIPL W=ZPOIN2-ZIPL SCA=ABS(U*XIV+V*YIV+W*ZIV) U1=V*ZIV-W*YIV V1=W*XIV-U*ZIV W1=U*YIV-V*XIV VEC=SQRT(U1**2+V1**2+W1**2) IF (IERR.NE.0) RETURN TANGB=VEC/SCA if (implon.eq.0) then TANGI=SQRT(TANGI*TANGB) endif GOTO 65 64 CONTINUE U=XPOIN1-XIPL V=YPOIN1-YIPL W=ZPOIN1-ZIPL SCA=U*XIAXE+V*YIAXE+W*ZIAXE U=U-SCA*XIAXE V=V-SCA*YIAXE W=W-SCA*ZIAXE S=SQRT(U**2+V**2+W**2) IF (IERR.NE.0) RETURN XC=XIPL+U*GRAYI/S YC=YIPL+V*GRAYI/S ZC=ZIPL+W*GRAYI/S PRAYI=SQRT((XPOIN1-XC)**2+(YPOIN1-YC)**2+(ZPOIN1-ZC)**2) U=XPOIN2-XIPL V=YPOIN2-YIPL W=ZPOIN2-ZIPL SCA=U*XIAXE+V*YIAXE+W*ZIAXE U=U-SCA*XIAXE V=V-SCA*YIAXE W=W-SCA*ZIAXE S=SQRT(U**2+V**2+W**2) IF (IERR.NE.0) RETURN XC=XIPL+U*GRAYI/S YC=YIPL+V*GRAYI/S ZC=ZIPL+W*GRAYI/S PRAYB=SQRT((XPOIN2-XC)**2+(YPOIN2-YC)**2+(ZPOIN2-ZC)**2) if (implon.eq.0) then PRAYI=SQRT(PRAYI*PRAYB) endif 65 IF (IERR.NE.0) RETURN GOTO (70,71,72,73,74),JCLE 70 CONTINUE XPV1=XPOIN1-XJPL YPV1=YPOIN1-YJPL ZPV1=ZPOIN1-ZJPL XPV2=XPOIN2-XJPL YPV2=YPOIN2-YJPL ZPV2=ZPOIN2-ZJPL XJPN=YPV1*ZPV2-ZPV1*YPV2 YJPN=ZPV1*XPV2-XPV1*ZPV2 ZJPN=XPV1*YPV2-YPV1*XPV2 SJPN=SQRT(XJPN**2+YJPN**2+ZJPN**2) IF (IERR.NE.0) RETURN XJPN=XJPN/SJPN YJPN=YJPN/SJPN ZJPN=ZJPN/SJPN GOTO 75 71 CONTINUE RAYJ=SQRT((XPOIN1-XJPL)**2+(YPOIN1-YJPL)**2+(ZPOIN1-ZJPL)**2) RAYB=SQRT((XPOIN2-XJPL)**2+(YPOIN2-YJPL)**2+(ZPOIN2-ZJPL)**2) if (implon.eq.0) then RAYJ=SQRT(RAYJ*RAYB) endif GOTO 75 72 CONTINUE U=XPOIN1-XJPL V=YPOIN1-YJPL W=ZPOIN1-ZJPL SCA=U*XJV+V*YJV+W*ZJV U=U-SCA*XJV V=V-SCA*YJV W=W-SCA*ZJV RAYJ=SQRT(U**2+V**2+W**2) U=XPOIN2-XJPL V=YPOIN2-YJPL W=ZPOIN2-ZJPL SCA=U*XJV+V*YJV+W*ZJV U=U-SCA*XJV V=V-SCA*YJV W=W-SCA*ZJV RAYB=SQRT(U**2+V**2+W**2) if (implon.eq.0) then RAYJ=SQRT(RAYJ*RAYB) endif GOTO 75 73 CONTINUE U=XPOIN1-XJPL V=YPOIN1-YJPL W=ZPOIN1-ZJPL SCA=ABS(U*XJV+V*YJV+W*ZJV) U1=V*ZJV-W*YJV V1=W*XJV-U*ZJV W1=U*YJV-V*XJV VEC=SQRT(U1**2+V1**2+W1**2) IF (IERR.NE.0) RETURN TANGJ=VEC/SCA U=XPOIN2-XJPL V=YPOIN2-YJPL W=ZPOIN2-ZJPL SCA=ABS(U*XJV+V*YJV+W*ZJV) U1=V*ZJV-W*YJV V1=W*XJV-U*ZJV W1=U*YJV-V*XJV VEC=SQRT(U1**2+V1**2+W1**2) IF (IERR.NE.0) RETURN TANGB=VEC/SCA if (implon.eq.0) then TANGJ=SQRT(TANGJ*TANGB) endif GOTO 75 74 CONTINUE U=XPOIN1-XJPL V=YPOIN1-YJPL W=ZPOIN1-ZJPL SCA=U*XJAXE+V*YJAXE+W*ZJAXE U=U-SCA*XJAXE V=V-SCA*YJAXE W=W-SCA*ZJAXE S=SQRT(U**2+V**2+W**2) IF (IERR.NE.0) RETURN XC=XJPL+U*GRAYJ/S YC=YJPL+V*GRAYJ/S ZC=ZJPL+W*GRAYJ/S PRAYJ=SQRT((XPOIN1-XC)**2+(YPOIN1-YC)**2+(ZPOIN1-ZC)**2) U=XPOIN2-XJPL V=YPOIN2-YJPL W=ZPOIN2-ZJPL SCA=U*XJAXE+V*YJAXE+W*ZJAXE U=U-SCA*XJAXE V=V-SCA*YJAXE W=W-SCA*ZJAXE S=SQRT(U**2+V**2+W**2) IF (IERR.NE.0) RETURN XC=XJPL+U*GRAYJ/S YC=YJPL+V*GRAYJ/S ZC=ZJPL+W*GRAYJ/S PRAYB=SQRT((XPOIN2-XC)**2+(YPOIN2-YC)**2+(ZPOIN2-ZC)**2) if (implon.eq.0) then PRAYJ=SQRT(PRAYJ*PRAYB) endif 75 IF (IERR.NE.0) RETURN C ON PLACE NBP POINTS SUR L'INTERSECTION POUR CALCULER DES ABCISSES C CURVILIGNES XVECR=XVEC/(NBP+1) YVECR=YVEC/(NBP+1) ZVECR=ZVEC/(NBP+1) XVEC=XVEC/SVEC YVEC=YVEC/SVEC ZVEC=ZVEC/SVEC XPAUX(1,1)=XPOIN1 XPAUX(2,1)=YPOIN1 XPAUX(3,1)=ZPOIN1 XPAUX(4,1)=0. IBP=0 102 IBP=IBP+1 IF (IBP.GT.NBP) GOTO 100 XP=XPAUX(1,IBP)+XVECR YP=XPAUX(2,IBP)+YVECR ZP=XPAUX(3,IBP)+ZVECR XPA=XP YPA=YP ZPA=ZP IRET = 101 GOTO 400 101 CONTINUE IF (IIMPI.EQ.1) WRITE (IOIMP,8880) IBP,XPA,YPA,ZPA,XP1,YP1,ZP1 8880 FORMAT(I4,' POINT A PROJETER ',3G13.5,' POINT PROJETE ',3G13.5) C ON RANGE LE POINT D'INTERSECTION XPAUX(1,IBP+1)=XP1 XPAUX(2,IBP+1)=YP1 XPAUX(3,IBP+1)=ZP1 XPAUX(4,IBP+1)=XPAUX(4,IBP)+SQRT((XP1-XPAUX(1,IBP))**2+ # (YP1-XPAUX(2,IBP))**2+(ZP1-XPAUX(3,IBP))**2) GOTO 102 100 CONTINUE XPAUX(1,NBT)=XPOIN2 XPAUX(2,NBT)=YPOIN2 XPAUX(3,NBT)=ZPOIN2 XPAUX(4,NBT)=XPAUX(4,NBT-1)+SQRT((XP1-XPOIN2)**2+(YP1-YPOIN2)**2+ # (ZP1-ZPOIN2)**2) DLONG=XPAUX(4,NBT) if (implon.eq.1) then if ( iimpi.eq.1) write(ioimp,8888) dlong1 ,dlong 8888 format ( ' longueur demandee et longueur donnee',2g13.5) if (ierr.ne.0) return dlong=dlong1 endif DEN1=TPOIN1/DLONG DEN2=TPOIN2/DLONG NX=NBELEM-1 DEN1=DEN1*DLONG IF (IIMPI.EQ.1) WRITE (IOIMP,9900) DLONG,NBELEM,APROG 9900 FORMAT (' LONGUEUR ',G12.5,' ELEMENT ',I5,' RAISON ',G12.5) C CREATION DU SEGMENT NBNN=NBNNE(KDEGRE(ILCOUR)) IF (IERR.NE.0) RETURN NBSOUS=0 NBREF=0 SEGINI MELEME ITYPEL=KDEGRE(ILCOUR) NPOIN=(ITYPEL-1)*NBELEM-1 if (implon.eq.1) npoin=npoin+1 SEGINI TABPAR C DEFINITION DE LA TOPOLOGIE IPOO=nbpts IADR=IPOO DIN=DEN1 DL=0. NUM(1,1)=IPOIN1 IF (NX.EQ.0) GOTO 510 DO 512 I=1,NX DIN=DIN*APROG IF (ITYPEL.EQ.2) GOTO 513 IPOO=IPOO+1 NUM(2,I)=IPOO TABPAR(IPOO-IADR)=DIN/2.+DL 513 IPOO=IPOO+1 NUM(ITYPEL,I)=IPOO NUM(1,I+1)=IPOO DL=DL+DIN TABPAR(IPOO-IADR)=DL 512 CONTINUE 510 CONTINUE IF (ITYPEL.NE.3) GOTO 514 DIN=DIN*APROG IPOO=IPOO+1 TABPAR(IPOO-IADR)=DL+DIN/2 NUM(2,NBELEM)=IPOO 514 NUM(ITYPEL,NBELEM)=IPOIN2 if (implon.eq.1) then NUM(ITYPEL,NBELEM)=ipoo+1 TABPAR(IPOO+1-IADR)=DLong endif C CREATION DES POINTS LA LONGUEUR A RESPECTER EST DANS TABPAR C LA LONGUEUR DES POINTS CONNUS EST DANS XPAUX IP=1 T=0. DLR=0. NBPTA=nbpts NBPTS=NBPTA+NPOIN SEGADJ MCOORD I=0 523 I=I+1 IF (I.GT.NPOIN) GOTO 520 DLV=TABPAR(I) 522 IF (DLV.LE.DLR) GOTO 521 IP=IP+1 DLR=XPAUX(4,IP) GOTO 522 521 CONTINUE DLA=XPAUX(4,IP-1) COF=(DLV-DLA)/(DLR-DLA) XP=XPAUX(1,IP-1)+COF*(XPAUX(1,IP)-XPAUX(1,IP-1)) YP=XPAUX(2,IP-1)+COF*(XPAUX(2,IP)-XPAUX(2,IP-1)) ZP=XPAUX(3,IP-1)+COF*(XPAUX(3,IP)-XPAUX(3,IP-1)) IF (IIMPI.NE.0) WRITE (IOIMP,8878) I,IP,XP,YP,ZP 8878 FORMAT(' AVANT ',I4,' INTERPOLE ',I4,3G13.5) IRET = 525 GOTO 400 525 CONTINUE IF (IIMPI.NE.0) WRITE (IOIMP,8876) I,IP,XP1,YP1,ZP1 8876 FORMAT(' APRES ',I4,' INTERPOLE ',I4,3G13.5) XCOOR(NBPTA*4+1)=XP1 XCOOR(NBPTA*4+2)=YP1 XCOOR(NBPTA*4+3)=ZP1 XCOOR(NBPTA*4+4)=TABPAR(I)-T NBPTA=NBPTA+1 T=TABPAR(I) IADR=IADR+1 GOTO 523 520 CONTINUE SEGSUP TABPAR IPT2=MELEME DO 527 I=1,NUM(/2) ICOLOR(I)=IDCOUL 527 CONTINUE IF (IOB1.NE.0) THEN ltelq=.false. IPT6=IOB1 SEGDES IPT6 ENDIF MELEME=IPT2 IF (IOB2.NE.0) THEN ltelq=.false. IPT6=IOB2 SEGDES IPT6 ENDIF MELEME=IPT2 SEGDES MELEME RETURN C SOUS-PROGRAMME DE CALCUL ITERATIF D'INTERSECTION 400 CONTINUE ICYCL=0 402 CONTINUE C IL FAUT TROUVER L'INTERSECTION DU PLAN PERPENDICULAIRE A XVEC YVEC C ZVEC EN XPOIN YPOIN ZPOIN ET DES DEUX SURFACES C ON UTILISE UNE METHODE ITERATIVE C ON VA CHERCHER LE POINT DE PROJECTION DE XP SUR CHAQUE SURFACE DANS C LE PLAN ET UN VECTEUR NORMAL C XP YP ZP POINT A PROJETER C XP1 YP1 ZP1 INTERSECTION EN RETOUR GOTO (200,210,220,230,240),ICLE 250 CONTINUE GOTO (300,310,320,330,340),JCLE 350 CONTINUE C LES PTS ET LES VECTS SONT XPI... XPJ... XNI... XNJ... C ON CALCULE L'INTERSECTION DES DEUX VECTEURS (AFFINES) XDIF=XPJ-XPI YDIF=YPJ-YPI ZDIF=ZPJ-ZPI C COMPOSANTES SUR CHAQUE VECTEUR # +(ZNI*XNJ-XNI*ZNJ)*YVEC # +(XNI*YNJ-YNI*XNJ)*ZVEC A=((YDIF*ZNJ-ZDIF*YNJ)*XVEC # +(ZDIF*XNJ-XDIF*ZNJ)*YVEC XP1=XPI+A*XNI YP1=YPI+A*YNI ZP1=ZPI+A*ZNI C TEST CONVERGENCE ECART=(XP-XP1)**2+(YP-YP1)**2+(ZP-ZP1)**2 IF (ECART.LE.EPS2) THEN IF (IRET.EQ.101) GOTO 101 IF (IRET.EQ.525) GOTO 525 ENDIF XP=XP1 YP=YP1 ZP=ZP1 ICYCL=ICYCL+1 IF (IIMPI.EQ.1) WRITE (IOIMP,4478) ICYCL,ECART,EPS2,XPI,YPI,ZPI, # XNI,YNI,ZNI,XPJ,YPJ,ZPJ,XNJ,YNJ,ZNJ,XP,YP,ZP 4478 FORMAT(' ICYCL ',I4,' ECART ',G12.5,' EPS2 ',G12.5,/,' PI ', # 3G13.5,' NI ',3G13.5,/,' PJ ',3G13.5,' NJ ',3G13.5,' P ',3G13.5) IF (ICYCL.LE.25) GOTO 402 RETURN C PROJECTION SUR UN PLAN XIPL XIPN EN RESTANT DANS XVEC 200 CONTINUE C VECT PERPENDICULAIRE A XVEC ET XIPN U=YVEC*ZIPN-ZVEC*YIPN V=ZVEC*XIPN-XVEC*ZIPN W=XVEC*YIPN-YVEC*XIPN S=SQRT(U**2+V**2+W**2) U1=U/S V1=V/S W1=W/S U=V1*ZVEC-W1*YVEC V=W1*XVEC-U1*ZVEC W=U1*YVEC-V1*XVEC C VECT SUIVANT LEQUEL ON DEPLACE LE POINT PAR=-((XP-XIPL)*XIPN+(YP-YIPL)*YIPN+(ZP-ZIPL)*ZIPN)/ # (U*XIPN+V*YIPN+W*ZIPN) XPI=XP+PAR*U YPI=YP+PAR*V ZPI=ZP+PAR*W XNI=U1 YNI=V1 ZNI=W1 GOTO 250 300 CONTINUE U=YVEC*ZJPN-ZVEC*YJPN V=ZVEC*XJPN-XVEC*ZJPN W=XVEC*YJPN-YVEC*XJPN S=SQRT(U**2+V**2+W**2) U1=U/S V1=V/S W1=W/S U=V1*ZVEC-W1*YVEC V=W1*XVEC-U1*ZVEC W=U1*YVEC-V1*XVEC PAR=-((XP-XJPL)*XJPN+(YP-YJPL)*YJPN+(ZP-ZJPL)*ZJPN)/ # (U*XJPN+V*YJPN+W*ZJPN) XPJ=XP+PAR*U YPJ=YP+PAR*V ZPJ=ZP+PAR*W XNJ=U1 YNJ=V1 ZNJ=W1 GOTO 350 C PROJECTION SUR SPHERE CENTRE XIPL RAYON RAYI EN RESTANT SUR LE PLAN X 210 CONTINUE U1=XIPL-XP V1=YIPL-YP W1=ZIPL-ZP SCA=U1*XVEC+V1*YVEC+W1*ZVEC XC=XIPL-SCA*XVEC YC=YIPL-SCA*YVEC ZC=ZIPL-SCA*ZVEC IF (IERR.NE.0) RETURN RAYC=SQRT(RAYI**2-SCA**2) U=XC-XP V=YC-YP W=ZC-ZP S=SQRT(U**2+V**2+W**2) IF (IERR.NE.0) RETURN U=U/S V=V/S W=W/S XPI=XC-RAYC*U YPI=YC-RAYC*V ZPI=ZC-RAYC*W XNI=YVEC*W-ZVEC*V YNI=ZVEC*U-XVEC*W ZNI=XVEC*V-YVEC*U GOTO 250 310 CONTINUE U1=XJPL-XP V1=YJPL-YP W1=ZJPL-ZP SCA=U1*XVEC+V1*YVEC+W1*ZVEC XC=XJPL-SCA*XVEC YC=YJPL-SCA*YVEC ZC=ZJPL-SCA*ZVEC IF (IERR.NE.0) RETURN RAYC=SQRT(RAYJ**2-SCA**2) U=XC-XP V=YC-YP W=ZC-ZP S=SQRT(U**2+V**2+W**2) IF (IERR.NE.0) RETURN U=U/S V=V/S W=W/S XPJ=XC-RAYC*U YPJ=YC-RAYC*V ZPJ=ZC-RAYC*W XNJ=YVEC*W-ZVEC*V YNJ=ZVEC*U-XVEC*W ZNJ=XVEC*V-YVEC*U GOTO 350 C PROJECTION SUR CYLINDRE AXE XIPL DIR XIV EN RESTANT DANS XVEC 220 CONTINUE U=XIPL-XP V=YIPL-YP W=ZIPL-ZP SCA=U*XIV+V*YIV+W*ZIV U=U-SCA*XIV V=V-SCA*YIV W=W-SCA*ZIV S=SQRT(U**2+V**2+W**2) IF (IERR.NE.0) RETURN U1=U-U*RAYI/S V1=V-V*RAYI/S W1=W-W*RAYI/S DNUM=U1*XVEC+V1*YVEC+W1*ZVEC DNOM=XIV*XVEC+YIV*YVEC+ZIV*ZVEC IF (DNOM.EQ.0.) GOTO 221 IF (IERR.NE.0) RETURN DPAR=-DNUM/DNOM XPI=XP+U1+DPAR*XIV YPI=YP+V1+DPAR*YIV ZPI=ZP+W1+DPAR*ZIV XNI=(V*ZVEC-W*YVEC)/S YNI=(W*XVEC-U*ZVEC)/S ZNI=(U*YVEC-V*XVEC)/S GOTO 250 C L'AXE DU CYLINDRE EST PARALLELE AU PLAN XVEC 221 SCA=U*XVEC+V*YVEC+W*ZVEC IF (IERR.NE.0) RETURN RAYC=SQRT(RAYI**2-SCA**2) U=U-SCA*XVEC V=V-SCA*YVEC W=W-SCA*ZVEC S=SQRT(U**2+V**2+W**2) IF (IERR.NE.0) RETURN XPI=XP+U-U*RAYC/S YPI=YP+V-V*RAYC/S ZPI=ZP+W-W*RAYC/S XNI=XIV YNI=YIV ZNI=ZIV GOTO 250 320 CONTINUE U=XJPL-XP V=YJPL-YP W=ZJPL-ZP SCA=U*XJV+V*YJV+W*ZJV U=U-SCA*XJV V=V-SCA*YJV W=W-SCA*ZJV S=SQRT(U**2+V**2+W**2) IF (IERR.NE.0) RETURN U1=U-U*RAYJ/S V1=V-V*RAYJ/S W1=W-W*RAYJ/S DNUM=U1*XVEC+V1*YVEC+W1*ZVEC DNOM=XJV*XVEC+YJV*YVEC+ZJV*ZVEC IF (DNOM.EQ.0.) GOTO 321 IF (IERR.NE.0) RETURN DPAR=-DNUM/DNOM XPJ=XP+U1+DPAR*XJV YPJ=YP+V1+DPAR*YJV ZPJ=ZP+W1+DPAR*ZJV XNJ=(V*ZVEC-W*YVEC)/S YNJ=(W*XVEC-U*ZVEC)/S ZNJ=(U*YVEC-V*XVEC)/S GOTO 350 C L'AXE DU CYLINDRE EST PARALLELE AU PLAN XVEC 321 SCA=U*XVEC+V*YVEC+W*ZVEC IF (IERR.NE.0) RETURN RAYC=SQRT(RAYJ**2-SCA**2) U=U-SCA*XVEC V=V-SCA*YVEC W=W-SCA*ZVEC S=SQRT(U**2+V**2+W**2) IF (IERR.NE.0) RETURN XPJ=XP+U-U*RAYC/S YPJ=YP+V-V*RAYC/S ZPJ=ZP+W-W*RAYC/S XNJ=XJV YNJ=YJV ZNJ=ZJV GOTO 350 C PROJECTION SUR CONE SOMMET XIPL DIR XIV TANG ANGLE SOMM TANGI EN C RESTANT DANS XVEC 230 CONTINUE U=XIPL-XP V=YIPL-YP W=ZIPL-ZP SCA=U*XIV+V*YIV+W*ZIV U=U-SCA*XIV V=V-SCA*YIV W=W-SCA*ZIV XC=XP+U YC=YP+U ZC=ZP+U RL2=(SCA*TANGI)**2 SCA=U*XVEC+V*YVEC+W*ZVEC DL2=SCA**2 IF(IERR.NE.0) RETURN U=U-SCA*XVEC V=V-SCA*YVEC W=W-SCA*ZVEC S=SQRT(U**2+V**2+W**2) IF (IERR.NE.0) RETURN U1=U/S V1=V/S W1=W/S VEC=SQRT(RL2-DL2) U=U-VEC*U1 V=V-VEC*V1 W=W-VEC*W1 XPI=XP+U YPI=YP+V ZPI=ZP+W U=XIPL-XPI V=YIPL-YPI W=ZIPL-ZPI U1=V*ZIV-W*YIV V1=W*XIV-U*ZIV W1=U*YIV-V*XIV U2=V*W1-W*V1 V2=W*U1-U*W1 W2=U*V1-V*U1 XNI=YVEC*W2-ZVEC*V2 YNI=ZVEC*U2-XVEC*W2 ZNI=XVEC*V2-YVEC*U2 S=SQRT(XNI**2+YNI**2+ZNI**2) IF (IERR.NE.0) RETURN XNI=XNI/S YNI=YNI/S ZNI=ZNI/S GOTO 250 330 CONTINUE U=XJPL-XP V=YJPL-YP W=ZJPL-ZP SCA=U*XJV+V*YJV+W*ZJV U=U-SCA*XJV V=V-SCA*YJV W=W-SCA*ZJV XC=XP+U YC=YP+U ZC=ZP+U RL2=(SCA*TANGJ)**2 SCA=U*XVEC+V*YVEC+W*ZVEC DL2=SCA**2 IF(IERR.NE.0) RETURN U=U-SCA*XVEC V=V-SCA*YVEC W=W-SCA*ZVEC S=SQRT(U**2+V**2+W**2) IF (IERR.NE.0) RETURN U1=U/S V1=V/S W1=W/S VEC=SQRT(RL2-DL2) U=U-VEC*U1 V=V-VEC*V1 W=W-VEC*W1 XPJ=XP+U YPJ=YP+V ZPJ=ZP+W U=XJPL-XPJ V=YJPL-YPJ W=ZJPL-ZPJ U1=V*ZJV-W*YJV V1=W*XJV-U*ZJV W1=U*YJV-V*XJV U2=V*W1-W*V1 V2=W*U1-U*W1 W2=U*V1-V*U1 XNJ=YVEC*W2-ZVEC*V2 YNJ=ZVEC*U2-XVEC*W2 ZNJ=XVEC*V2-YVEC*U2 S=SQRT(XNJ**2+YNJ**2+ZNJ**2) IF (IERR.NE.0) RETURN XNJ=XNJ/S YNJ=YNJ/S ZNJ=ZNJ/S GOTO 350 C PROJECTION SUR UN TORE CENTRE XIPL AXE XIAXE CENTRE SECONDAIRE XIP1 C GRAND RAYON GRAYI PETIT RAYON PRAYI EN RESTANT DANS XVEC 240 CONTINUE U=XP-XIPL V=YP-YIPL W=ZP-ZIPL SCA=U*XIAXE+V*YIAXE+W*ZIAXE U=U-SCA*XIAXE V=V-SCA*YIAXE W=W-SCA*ZIAXE S=SQRT(U**2+V**2+W**2) IF (IERR.NE.0) RETURN C CENTRE DU CERCLE INTERS XC=XIPL+U*GRAYI/S YC=YIPL+V*GRAYI/S ZC=ZIPL+W*GRAYI/S U=XP-XC V=YP-YC W=ZP-ZC S=SQRT(U**2+V**2+W**2) IF (IERR.NE.0) RETURN C PROJECTION SUR LE CERCLE X1=XC+U*PRAYI/S Y1=YC+V*PRAYI/S Z1=ZC+W*PRAYI/S C IL FAUT TOURNER SUR LE TORE JUSQU'AU PLAN XP XVEC C CENTRE DE ROTATION U=X1-XIPL V=Y1-YIPL W=Z1-ZIPL SCA=U*XIAXE+V*YIAXE+W*ZIAXE U=SCA*XIAXE V=SCA*YIAXE W=SCA*ZIAXE XC1=XIPL+U YC1=YIPL+V ZC1=ZIPL+W C RAYON DE CE CERCLE RAY=SQRT((X1-XC1)**2+(Y1-YC1)**2+(Z1-ZC1)**2) C DIRECTION DE L'INTERSECTION DU PLAN DU CERCLE ET DE XP XVEC U=YIAXE*ZVEC-ZIAXE*YVEC V=ZIAXE*XVEC-XIAXE*ZVEC W=XIAXE*YVEC-YIAXE*XVEC S=SQRT(U**2+V**2+W**2) IF (IERR.NE.0) RETURN U=U/S V=V/S W=W/S U1=V*ZIAXE-W*YIAXE V1=W*XIAXE-U*ZIAXE W1=U*YIAXE-V*XIAXE U2=XC1-XP V2=YC1-YP W2=ZC1-ZP DNUM=U2*XVEC+V2*YVEC+W2*ZVEC DNOM=U1*XVEC+V1*YVEC+W1*ZVEC IF (IERR.NE.0.) RETURN PAR=-DNUM/DNOM XC2=XC1+PAR*U1 YC2=YC1+PAR*V1 ZC2=ZC1+PAR*W1 S=SQRT((XC2-XC1)**2+(YC2-YC1)**2+(ZC2-ZC1)**2) IF (IERR.NE.0) RETURN D=SQRT(RAY**2-S**2) IF ((X1-XC2)*U+(Y1-YC2)*V+(Z1-ZC2)*W.LE.0.) D=-D XPI=XC2+D*U YPI=YC2+D*V ZPI=ZC2+D*W C CENTRE DU PETIT CERCLE U=XPI-XIPL V=YPI-YIPL W=ZPI-ZIPL SCA=U*XIAXE+V*YIAXE+W*ZIAXE U=U-SCA*XIAXE V=V-SCA*YIAXE W=W-SCA*ZIAXE S=SQRT(U**2+V**2+W**2) XC1=XIPL+U*GRAYI/S YC1=YIPL+V*GRAYI/S ZC1=ZIPL+W*GRAYI/S U=XPI-XC1 V=YPI-YC1 W=ZPI-ZC1 XNI=V*ZVEC-W*YVEC YNI=W*XVEC-U*ZVEC ZNI=U*YVEC-V*XVEC S=SQRT(XNI**2+YNI**2+ZNI**2) IF (S.EQ.0.) GOTO 250 XNI=XNI/S YNI=YNI/S ZNI=ZNI/S GOTO 250 340 CONTINUE U=XP-XJPL V=YP-YJPL W=ZP-ZJPL SCA=U*XJAXE+V*YJAXE+W*ZJAXE U=U-SCA*XJAXE V=V-SCA*YJAXE W=W-SCA*ZJAXE S=SQRT(U**2+V**2+W**2) IF (IERR.NE.0) RETURN C CENTRE DU CERCLE INTERS XC=XJPL+U*GRAYJ/S YC=YJPL+V*GRAYJ/S ZC=ZJPL+W*GRAYJ/S U=XP-XC V=YP-YC W=ZP-ZC S=SQRT(U**2+V**2+W**2) IF (IERR.NE.0) RETURN C PROJECTION SUR LE CERCLE X1=XC+U*PRAYJ/S Y1=YC+V*PRAYJ/S Z1=ZC+W*PRAYJ/S C IL FAUT TOURNER SUR LE TORE JUSQU'AU PLAN XP XVEC C CENTRE DE ROTATION U=X1-XJPL V=Y1-YJPL W=Z1-ZJPL SCA=U*XJAXE+V*YJAXE+W*ZJAXE U=SCA*XJAXE V=SCA*YJAXE W=SCA*ZJAXE XC1=XJPL+U YC1=YJPL+V ZC1=ZJPL+W C RAYON DE CE CERCLE RAY=SQRT((X1-XC1)**2+(Y1-YC1)**2+(Z1-ZC1)**2) C DIRECTION DE L'INTERSECTION DU PLAN DU CERCLE ET DE XP XVEC U=YJAXE*ZVEC-ZJAXE*YVEC V=ZJAXE*XVEC-XJAXE*ZVEC W=XJAXE*YVEC-YJAXE*XVEC S=SQRT(U**2+V**2+W**2) IF (IERR.NE.0) RETURN U=U/S V=V/S W=W/S U1=V*ZJAXE-W*YJAXE V1=W*XJAXE-U*ZJAXE W1=U*YJAXE-V*XJAXE U2=XC1-XP V2=YC1-YP W2=ZC1-ZP DNUM=U2*XVEC+V2*YVEC+W2*ZVEC DNOM=U1*XVEC+V1*YVEC+W1*ZVEC IF (IERR.NE.0.) RETURN PAR=-DNUM/DNOM XC2=XC1+PAR*U1 YC2=YC1+PAR*V1 ZC2=ZC1+PAR*W1 S=SQRT((XC2-XC1)**2+(YC2-YC1)**2+(ZC2-ZC1)**2) IF (IERR.NE.0) RETURN D=SQRT(RAY**2-S**2) IF ((X1-XC2)*U+(Y1-YC2)*V+(Z1-ZC2)*W.LE.0.) D=-D XPJ=XC2+D*U YPJ=YC2+D*V ZPJ=ZC2+D*W C CENTRE DU PETIT CERCLE U=XPJ-XJPL V=YPJ-YJPL W=ZPJ-ZJPL SCA=U*XJAXE+V*YJAXE+W*ZJAXE U=U-SCA*XJAXE V=V-SCA*YJAXE W=W-SCA*ZJAXE S=SQRT(U**2+V**2+W**2) XC1=XJPL+U*GRAYJ/S YC1=YJPL+V*GRAYJ/S ZC1=ZJPL+W*GRAYJ/S U=XPJ-XC1 V=YPJ-YC1 W=ZPJ-ZC1 XNJ=V*ZVEC-W*YVEC YNJ=W*XVEC-U*ZVEC ZNJ=U*YVEC-V*XVEC S=SQRT(XNJ**2+YNJ**2+ZNJ**2) IF (S.EQ.0.) GOTO 250 XNJ=XNJ/S YNJ=YNJ/S ZNJ=ZNJ/S GOTO 350 END
© Cast3M 2003 - Tous droits réservés.
Mentions légales