coupe
C COUPE SOURCE FD218221 23/08/04 21:15:05 11719 SUBROUTINE COUPE IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC SMELEME -INC CCGEOME -INC SMCOORD -INC SMLENTI -INC SMLREEL C DIMENSION XYZT(3),XYZ2(3),XYZ3(3),XYZN(3) DIMENSION XYZ(4,4),DIS(4) C EQUIVALENCE(XYZT(1),XCT),(XYZT(2),YCT),(XYZT(3),ZCT) EQUIVALENCE(XYZ2(1),XC2),(XYZ2(2),YC2),(XYZ2(3),ZC2) EQUIVALENCE(XYZ3(1),XC3),(XYZ3(2),YC3),(XYZ3(3),ZC3) EQUIVALENCE(XYZN(1),XN) ,(XYZN(2),YN) ,(XYZN(3),ZN) C EQUIVALENCE(XYZ(1,1),XCA),(XYZ(2,1),YCA),(XYZ(3,1),ZCA) EQUIVALENCE(XYZ(1,2),XCB),(XYZ(2,2),YCB),(XYZ(3,2),ZCB) EQUIVALENCE(XYZ(1,3),XCC),(XYZ(2,3),YCC),(XYZ(3,3),ZCC) EQUIVALENCE(XYZ(1,4),XCD),(XYZ(2,4),YCD),(XYZ(3,4),ZCD) C C C LECTURE DES DONNEES C IF (IDIM.NE.3) THEN WRITE(IOIMP,*)'COUPE: You must be in 3D' RETURN ENDIF C IF (IRETOU.EQ.0) RETURN IF (IRETOU.EQ.0) RETURN IF (IRETOU.EQ.0) RETURN IF (IRETOU.EQ.0) RETURN C C CARACTERISTIQUE DU PLAN DE COUPE C SEGACT,MCOORD IREF=(ICOUP1-1)*4 XCT=XCOOR(IREF+1) YCT=XCOOR(IREF+2) ZCT=XCOOR(IREF+3) C IREF=(ICOUP2-1)*4 XC2=XCOOR(IREF+1) YC2=XCOOR(IREF+2) ZC2=XCOOR(IREF+3) C IREF=(ICOUP3-1)*4 XC3=XCOOR(IREF+1) YC3=XCOOR(IREF+2) ZC3=XCOOR(IREF+3) C TOL1=MIN(SQRT((XC2-XCT)**2+(YC2-YCT)**2+(ZC2-ZCT)**2), > SQRT((XC3-XCT)**2+(YC3-YCT)**2+(ZC3-ZCT)**2))/10 TOL4=TOL1/1000 C : XV=XC2-XCT YV=YC2-YCT ZV=ZC2-ZCT XW=XC3-XCT YW=YC3-YCT ZW=ZC3-ZCT XN=YV*ZW-ZV*YW YN=ZV*XW-XV*ZW ZN=XV*YW-YV*XW RN=XN**2+YN**2+ZN**2 IF (IERR.NE.0) RETURN RN=SQRT(RN) XN=XN/RN YN=YN/RN ZN=ZN/RN C C PREPARATION DU MAILLAGE C SEGACT,IPT1 MBSOUS=IPT1.LISOUS(/1) IF(MBSOUS.EQ.0)THEN NBSOUS=1 NBREF=0 NBNN=0 NBELEM=0 SEGINI,IPT2 IPT2.LISOUS(1)=IPT1 ELSE SEGINI,IPT2=IPT1 ENDIF SEGDES,IPT1 C C BOUCLE SUR LES ZONES DU MAILLAGE C MBSOUS=IPT2.LISOUS(/1) DO IE1=1,MBSOUS C C -> REDUCTION DES MAILLAGES A 3 TYPES D'ELEMENTS (SEG2/TRI3/TET4) C IPT1=IPT2.LISOUS(IE1) SEGACT,IPT1 ITYP=IPT1.ITYPEL ITYQ=0 C CAS DES SEG3 QUE L'ON TRANFORME EN SEG2 IF(ITYP.EQ.3)THEN ITYQ=2 C CAS DES TRI6, QUA4 ET QUA8 QUE L'ON TRANFORME EN TRI3 ELSEIF(ITYP.EQ.6.OR.ITYP.EQ.8.OR.ITYP.EQ.10)THEN ITYQ=4 C CAS DES CUB8, CU20, PRI6, PR15, TE10, PYR5, PY13 QUE L'ON TRANFORME EN TET4 ELSEIF(ITYP.EQ.14.OR.ITYP.EQ.15.OR.ITYP.EQ.16.OR.ITYP.EQ.17 & .OR.ITYP.EQ.24.OR.ITYP.EQ.25.OR.ITYP.EQ.26)THEN ITYQ=23 ENDIF ITYP=IPT1.ITYPEL NBELEM=IPT1.NUM(/2) MBELEM=NBELEM NBREF=0 NBSOUS=0 C C -> AIGUILLAGE SUR LES TYPES D'ELEMENTS C IF(ITYP.EQ.2)THEN C C --> TRAVAIL SUR LES SEG2 (--> SEG2 OR POI1) C NBNN=1 SEGINI,MELEME ITYPEL=1 C NBNN=2 SEGINI,IPT3 IPT3.ITYPEL=2 C NBELEM=0 NBELE3=0 C DO IE2=1,MBELEM JCOLOR=IPT1.ICOLOR(IE2) DO IE3=1,2 IREF=(IPT1.NUM(IE3,IE2)-1)*4 DO IE4=1,3+1 XYZ(IE4,IE3)=XCOOR(IREF+IE4) ENDDO ENDDO C COTE DANS LE PLAN DE COUPE NBELE3=NBELE3+1 IPT3.NUM(1,NBELE3)=IPT1.NUM(1,IE2) IPT3.NUM(2,NBELE3)=IPT1.NUM(2,IE2) IPT3.ICOLOR(NBELE3)=JCOLOR C C INTERSECTION OU POINT DANS LE PLAN DE COUPE segact mcoord*mod NBPTI=NBPTS NBPTS=NBPTI+1 SEGADJ,MCOORD C NBPTI=NBPTI+1 IREF=(NBPTI-1)*4 DO IE3=1,4 XCOOR(IREF+IE3)=XYZ(1,IE3)+COEFF*(XYZ(2,IE3)-XYZ(1,IE3)) ENDDO C NBELEM=NBELEM+1 NUM(1,NBELEM)=NBPTI ICOLOR(NBELEM)=JCOLOR ENDIF ENDDO C STOCKAGE EVENTUEL DU MAILLAGE SUPLEMENTAIRE IF(NBELEM.EQ.0)THEN SEGSUP,MELEME NBELEM=NBELE3 MELEME=IPT3 SEGADJ,MELEME ELSE NBNN=1 SEGADJ,MELEME NBELEM=NBELE3 NBNN=2 SEGADJ,IPT3 C NBELEM=0 NBNN=0 NBSOUS=IPT2.LISOUS(/1)+1 SEGADJ,IPT2 IPT2.LISOUS(NBSOUS)=IPT3 ENDIF ELSE IF(ITYP.EQ.4)THEN C C --> TRAVAIL SUR LES TRI3 (--> TRI3 OR SEG2) C NBNN=2 SEGINI,MELEME ITYPEL=2 NBELEM=0 DO IE2=1,MBELEM C A FAIRE...... ENDDO SEGADJ,MELEME ELSE IF(ITYP.EQ.23)THEN C C --> TRAVAIL SUR LES TET4 (--> TRI3) C NBELEM=NBELEM*2 NBNN=3 SEGINI,MELEME ITYPEL=4 NBELEM=0 C DO IE2=1,MBELEM JCOLOR=IPT1.ICOLOR(IE2) DO IE3=1,4 IREF=(IPT1.NUM(IE3,IE2)-1)*4 DO IE4=1,3+1 XYZ(IE4,IE3)=XCOOR(IREF+IE4) ENDDO ENDDO C IF (ABS(DIS(1))+ABS(DIS(2))+ABS(DIS(3)).LT.TOL4)THEN C FACE 1 DS LE PLAN DE COUPE NBELEM=NBELEM+1 NUM(1,NBELEM)=IPT1.NUM(1,IE2) NUM(2,NBELEM)=IPT1.NUM(2,IE2) NUM(3,NBELEM)=IPT1.NUM(3,IE2) ICOLOR(NBELEM)=JCOLOR ELSEIF(ABS(DIS(1))+ABS(DIS(2))+ABS(DIS(4)).LT.TOL4)THEN C FACE 2 DS LE PLAN DE COUPE NBELEM=NBELEM+1 NUM(1,NBELEM)=IPT1.NUM(1,IE2) NUM(2,NBELEM)=IPT1.NUM(2,IE2) NUM(3,NBELEM)=IPT1.NUM(4,IE2) ICOLOR(NBELEM)=JCOLOR ELSEIF(ABS(DIS(1))+ABS(DIS(3))+ABS(DIS(4)).LT.TOL4)THEN C FACE 3 DS LE PLAN DE COUPE NBELEM=NBELEM+1 NUM(1,NBELEM)=IPT1.NUM(1,IE2) NUM(2,NBELEM)=IPT1.NUM(3,IE2) NUM(3,NBELEM)=IPT1.NUM(4,IE2) ICOLOR(NBELEM)=JCOLOR ELSEIF(ABS(DIS(2))+ABS(DIS(3))+ABS(DIS(4)).LT.TOL4)THEN C FACE 4 DS LE PLAN DE COUPE NBELEM=NBELEM+1 NUM(1,NBELEM)=IPT1.NUM(2,IE2) NUM(2,NBELEM)=IPT1.NUM(3,IE2) NUM(3,NBELEM)=IPT1.NUM(4,IE2) ICOLOR(NBELEM)=JCOLOR C COTE 12 DS LE PLAN DE COUPE DINDEX=SIGN(UN,DI3)+SIGN(UN,DI4) IF(DINDEX.EQ.0)THEN NUMA=IPT1.NUM(1,IE2) NUMB=IPT1.NUM(2,IE2) > NUMA,NUMB,MELEME,NBELEM,JCOLOR) ENDIF ELSEIF(ABS(DI1)+ABS(DI3).LT.TOL4)THEN C COTE 13 DS LE PLAN DE COUPE IF(DINDEX.EQ.0)THEN NUMA=IPT1.NUM(1,IE2) NUMB=IPT1.NUM(3,IE2) > NUMA,NUMB,MELEME,NBELEM,JCOLOR) ENDIF ELSEIF(ABS(DI1)+ABS(DI4).LT.TOL4)THEN C COTE 14 DS LE PLAN DE COUPE IF(DINDEX.EQ.0)THEN NUMA=IPT1.NUM(1,IE2) NUMB=IPT1.NUM(4,IE2) > NUMA,NUMB,MELEME,NBELEM,JCOLOR) ENDIF C COTE 23 DS LE PLAN DE COUPE DINDEX=SIGN(UN,DI1)+SIGN(UN,DI4) IF(DINDEX.EQ.0)THEN NUMA=IPT1.NUM(2,IE2) NUMB=IPT1.NUM(3,IE2) > NUMA,NUMB,MELEME,NBELEM,JCOLOR) ENDIF C COTE 24 DS LE PLAN DE COUPE DINDEX=SIGN(UN,DI1)+SIGN(UN,DI3) IF(DINDEX.EQ.0)THEN NUMA=IPT1.NUM(2,IE2) NUMB=IPT1.NUM(4,IE2) > NUMA,NUMB,MELEME,NBELEM,JCOLOR) ENDIF ELSEIF(ABS(DI3)+ABS(DI4).LT.TOL4)THEN C COTE 34 DS LE PLAN DE COUPE IF(DINDEX.EQ.0)THEN NUMA=IPT1.NUM(3,IE2) NUMB=IPT1.NUM(4,IE2) > NUMA,NUMB,MELEME,NBELEM,JCOLOR) ENDIF ELSEIF(ABS(DI1).LT.TOL4)THEN C POINT 1 DANS LE PLAN DE COUPE IF(ABS(DINDEX).EQ.UN)THEN NUM0=IPT1.NUM(1,IE2) > DI2 , DI3 , DI4, > NUM0,MELEME,NBELEM,JCOLOR) ENDIF C POINT 2 DANS LE PLAN DE COUPE DINDEX=SIGN(UN,DI3)+SIGN(UN,DI4)+SIGN(UN,DI1) IF(ABS(DINDEX).EQ.UN)THEN NUM0=IPT1.NUM(2,IE2) > DI3 , DI4 , DI1, > NUM0,MELEME,NBELEM,JCOLOR) ENDIF ELSE IF(ABS(DI3).LT.TOL4)THEN C POINT 3 DANS LE PLAN DE COUPE IF(ABS(DINDEX).EQ.UN)THEN NUM0=IPT1.NUM(3,IE2) > DI4 , DI1 , DI2, > NUM0,MELEME,NBELEM,JCOLOR) ENDIF ELSE IF(ABS(DI4).LT.TOL4)THEN C POINT 4 DANS LE PLAN DE COUPE IF(ABS(DINDEX).EQ.UN)THEN NUM0=IPT1.NUM(4,IE2) > DI1 , DI2 , DI3, > NUM0,MELEME,NBELEM,JCOLOR) ENDIF ELSE IF(ABS(DINDEX).EQ.DEUX)THEN C INTERSECTION PAR UNE POINTE IF(SIGN(UN,DI1).NE.SIGN(UN,DINDEX))THEN C POINTE N.1 > DI1 , DI2 , DI3 , DI4, > MELEME,NBELEM,JCOLOR) C POINTE N.2 > DI2 , DI3 , DI4 , DI1, > MELEME,NBELEM,JCOLOR) ELSE IF(SIGN(UN,DI3).NE.SIGN(UN,DINDEX))THEN C POINTE N.3 > DI3 , DI4 , DI1 , DI2, > MELEME,NBELEM,JCOLOR) ELSE IF(SIGN(UN,DI4).NE.SIGN(UN,DINDEX))THEN C POINTE N.4 > DI4 , DI1 , DI2 , DI3, > MELEME,NBELEM,JCOLOR) C ERREUR ELSE C A FAIRE...... ENDIF C INTERSECTION PAR UN COTE C COTE 12 > DI1 , DI2 , DI3 , DI4, > MELEME,NBELEM,JCOLOR) ELSE IF(SIGN(UN,DI1).EQ.SIGN(UN,DI3))THEN C COTE 13 > DI1 , DI3 , DI2 , DI4, > MELEME,NBELEM,JCOLOR) ELSE IF(SIGN(UN,DI1).EQ.SIGN(UN,DI4))THEN C COTE 14 > DI1 , DI4 , DI2 , DI3, > MELEME,NBELEM,JCOLOR) C COTE 23 > DI2 , DI3 , DI1 , DI4, > MELEME,NBELEM,JCOLOR) C COTE 24 > DI2 , DI4 , DI1 , DI3, > MELEME,NBELEM,JCOLOR) ELSE IF(SIGN(UN,DI3).EQ.SIGN(UN,DI4))THEN C COTE 34 > DI3 , DI4 , DI1 , DI2, > MELEME,NBELEM,JCOLOR) C ERREUR ELSE C A FAIRE...... ENDIF ENDIF ENDIF ENDDO SEGADJ,MELEME C ELIMINATION DES DOUBLONS (FACE DANS LE PLAN) C (on fait un tri prealable) JG=NBELEM SEGINI,MLENT1,MLENTI DO IE2=1,NBELEM LECT(IE2)=IE2 MLENT1.LECT(IE2)=0 DO IE3=1,NBNN MLENT1.LECT(IE2)=MLENT1.LECT(IE2)+NUM(IE3,IE2) ENDDO ENDDO SEGINI,MLENT2=MLENTI C C IDIMP1=IDIM+1 segact mcoord*mod > MLENT1.LECT,MLENT2.LECT,LECT) C MBELEM=0 DO IE2=1,NBELEM IF(LECT(IE2).NE.0)THEN IF(LECT(IE2).NE.IE2)THEN LECT(LECT(IE2))=0 ENDIF MBELEM=MBELEM+1 DO IE3=1,NBNN NUM(IE3,MBELEM)=NUM(IE3,IE2) ENDDO ICOLOR(MBELEM) =ICOLOR(IE2) ENDIF ENDDO C SEGSUP,MLENTI,MLENT1,MLENT2 NBELEM=MBELEM SEGADJ,MELEME C ELSE C C --> ERREUR C WRITE(IOIMP,*)'COUPE: Incorrect type of element',ITYP C SEGSUP,MELEME IF(IE1.GT.1)THEN DO IE2=1,IE1-1 MELEME=IPT2.LISOUS(IE2) SEGSUP,MELEME ENDDO ENDIF SEGSUP,IPT2 RETURN ENDIF C C FIN BOUCLE SUR LES ZONES DU MAILLAGE C C SEGDES,MELEME IPT2.LISOUS(IE1)=MELEME IF(ITYQ.NE.0)SEGSUP,IPT1 ENDDO C C ON TASSE LE MAILLAGE POUR ELIMINER LES ZONES VIDES C MELEME=IPT2 NBSOUS=0 DO IE1=1,LISOUS(/1) IPT1=LISOUS(IE1) NBELEM=IPT1.NUM(/2) IF(NBELEM.EQ.0)THEN SEGSUP,IPT1 ELSE NBSOUS=NBSOUS+1 LISOUS(NBSOUS)=IPT1 SEGDES,IPT1 ENDIF ENDDO NBNN=0 NBELEM=0 NBREF=0 SEGADJ,MELEME C C SI LE MAILLAGE NE CONTIENT QU'UNE SEULE ZONE... C IF(NBSOUS.EQ.1)THEN IPT1=LISOUS(1) SEGSUP,MELEME MELEME=IPT1 ELSE SEGDES,MELEME ENDIF C RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales