j3coup
C J3COUP SOURCE CHAT 05/01/13 00:46:14 5004 C---------------------------------------------------- C COUPURE DES FACES A ET B C C CODE IST(1,I): 0 point non traite C 1 est sur le segment IST(2,I) C 2 est sur les segments IST(2,I) et IST(3,I) C -1 est a l'interieur C -2 est a l'exterieur C C CODE CRO(J,I): 1 cote sur le segment C -1 cote interieur C -2 cote exterieur C C IRED=0 EMPECHE LA REDISTRIBUTION DES TROUS C C PP 6/97,11/98 C Pierre Pegon/JRC Ispra C---------------------------------------------------- IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) -INC PPARAM -INC CCOPTIO C SEGMENT WORK REAL*8 XYC(2,NPTO) INTEGER IST(3,NPTO) REAL*8 DENS(NPTO) INTEGER JUN ENDSEGMENT C SEGMENT WWORK REAL*8 PORIG(3),VNORM(3),VI(3),VJ(3) INTEGER FWORK INTEGER TWORK(NTROU) ENDSEGMENT SEGMENT WWORK1.WWORK C SEGMENT VWORK INTEGER FWWORK(NFACE) ENDSEGMENT SEGMENT VWORK1.VWORK,VWORK2.VWORK C SEGMENT JUNC INTEGER CRO(2,NPTO) ENDSEGMENT SEGMENT JUNC1.JUNC,JUNC2.JUNC C LOGICAL LAINB,LAOUB,LAONB C IF (IIMPI.EQ.1789)THEN WRITE(IOIMP,*)'>>> On entre dans j3coup <<<' ENDIF C WORK1=WWORK1.FWORK C C ON CHERCHE LE NB D'INTERSECTION AVEC B C NPTO1=WORK1.XYC(/2) JUNC1=WORK1.JUN NPTO2=WORK2.XYC(/2) JUNC2=WORK2.JUN C NINTER=0 DO IE1=1,NPTO1 ISU=WORK1.IST(1,IE1) IF(ISU.GT.0)THEN IF((ICRO2.EQ.-1).OR.(ICRP2.EQ.-1))THEN NINTER=NINTER+1 IF(ICRO2+ICRP2.EQ.-2)THEN NINTER=NINTER+1 ENDIF ENDIF ENDIF ENDDO C C NINTER DOIT ETRE UN MULTIPLE DE 2 C NFAC1=NINTER/2 IF(NINTER-2*NFAC1.NE.0)THEN IRET=IRET+1 WRITE(IOIMP,*)'J3COUP: LE NOMBRE D"INTERSECTIONS DOIT ETRE PAIR' RETURN ENDIF NFAC1=NFAC1+1 C C ON PREPARE QUI VA RECEVOIR LES FACES C NFACE=NFAC1 SEGINI,VWORK1,VWORK2 IFAC1=0 IFAC2=0 C C ON LOOP SUR LES FACES C IPLA1=1 DO IE0=1,NFAC1 C C ON CHERCHE LE DEBUT D'UNE INTERSECTION AVEC B C DO IE1=IPLA1,NPTO1 ISU=WORK1.IST(1,IE1) IF(ISU.GT.0)THEN IF((ICRO2.EQ.-1).OR.(ICRP2.EQ.-1))THEN GOTO 1 ENDIF ENDIF ENDDO C >>>>>>>>>>>>> A VOIR SI IL NE FAUT PAS ALORS METTRE B! IF(IE0.EQ.NFAC1)GOTO 5 IRET=IRET+1 WRITE(IOIMP,*)'J3COUP: LE NOMBRE DE BLOCKS N"EST PAS ATTEINT' RETURN C >>>>>>>>>>>>> A VOIR SI IL NE FAUT PAS ALORS METTRE B! C C ON FORME UN NOUVEAU BLOCK EN CIRCULANT SUR B ET A TJS VERS C L'INTERIEUR, EN INVALIDANT LES INTERSECTION DE A AU FUR ET A C MESURE QUE ON LES RENCONTRE, ET JUSQU'A FERMETURE C C A) ON STOCKE LE PREMIER POINT DE LA NOUVELLE FACE ... C 1 CONTINUE IPLA1=IE1 I1=IPLA1 C NPTO=NPTO1+NPTO2 SEGINI,WORK JUN=0 IPTO=1 DO IE2=1,2 XYC(IE2,IPTO)=WORK1.XYC(IE2,IPLA1) ENDDO DENS(IPTO)=WORK1.DENS(IPLA1) C C B) ... PUIS ON L'INVALIDE C (PT DE BRANCHEMENT EN CAS DE PARCOURS MULTIPLE) C 2 CONTINUE WORK1.IST(1,I1)=0 C C C) ON INITIALISE ENSUITE LE PARCOURS SUR B C "SENS DE LA NUMEROTATION" +1 ou -1 ? C FACILE SAUF EN CAS D'INTER MULTIPLE C IF(ICRO2+ICRP2.EQ.-2)THEN IF(ABS(AG1).LT.ABS(AG2))THEN ISEN2=-1 ELSE ISEN2=+1 ENDIF ELSE IF(ICRO2.EQ.-1)THEN ISEN2=-1 ELSE ISEN2=+1 ENDIF ENDIF C C D) ON RESTE SUR B JUSQU'AU CONTACT AVEC A C ON REVIENT ALORS SUR A SAUF SI IL Y A 2 COTE INTERIEUR ET QUE C ON LE PARCOURT DANS LE SENS + (DEDANS!) C DO IE2=1,NPTO2 C IPTO=IPTO+1 DO IE3=1,2 ENDDO C IF(ISU.GT.0)THEN IF((ISEN2.EQ.-1).OR.(ICRO2.NE.-1).OR.(ICRP2.NE.-1))GOTO 3 ENDIF C ENDDO C IRET=IRET+1 WRITE(IOIMP,*)'J3COUP: ON NE PEUT PAS CIRCULER TJS SUR B!' RETURN C 3 CONTINUE C C E) ON INITIALISE LE PARCOURS SUR A (LE SENS DE PARCOURS EST TJ +1!) C DO IE2=1,NPTO1 C I1=I1+1 IF(I1.GT.NPTO1)I1=I1-NPTO1 IF(I1.EQ.IPLA1)GOTO 4 C IPTO=IPTO+1 DO IE3=1,2 XYC(IE3,IPTO)=WORK1.XYC(IE3,I1) ENDDO DENS(IPTO)=WORK1.DENS(I1) C ISU=WORK1.IST(1,I1) IF(ISU.GT.0)THEN IF((ICRO2.EQ.-1).OR.(ICRP2.EQ.-1))THEN GOTO 2 ENDIF ENDIF C ENDDO C IRET=IRET+1 WRITE(IOIMP,*)'J3COUP: ON NE PEUT PAS CIRCULER TJS SUR A!' RETURN C C F) LA FACE WORK EST FINIE, ON LA STOCKE SOIT DANS VWORK1 (FACES C INTERIEURES A B) SOIT DANS VWORK2 (FACES EXTERIEURES A B) C WARNING: SI LA FACE INTE A B EST EGALE A B, ON LA C REND IDENTIQUE A B C 4 CONTINUE C NPTO=IPTO SEGADJ,WORK C NTROU=0 SEGINI,WWORK IF (ISEN2.EQ.+1)THEN IFAC1=IFAC1+1 VWORK1.FWWORK(IFAC1)=WWORK ELSE IFAC2=IFAC2+1 VWORK2.FWWORK(IFAC2)=WWORK ENDIF FWORK=WORK IF(IFAC1+IFAC2.EQ.NFAC1)GOTO 6 C C FIN LOOP SUR LES FACES C ENDDO C C CAS OU B EST LA DERNIERE FACE (C'EST ALORS L'UNIQUE FACE INTE!) C 5 CONTINUE IF(IFAC1.NE.0)THEN IRET=IRET+1 WRITE(IOIMP,*)'J3COUP: B NE PEUT ETRE QUE L"UNIQUE FACE INTE' RETURN ENDIF JUN=0 NTROU=0 SEGINI,WWORK FWORK=WORK IFAC1=IFAC1+1 VWORK1.FWWORK(IFAC1)=WWORK C C ON AJUSTE VWORK1 ET VWORK2 C 6 CONTINUE NFACE=IFAC1 SEGADJ,VWORK1 NFACE=IFAC2 SEGADJ,VWORK2 C C ON VA MAINTENANT DISTRIBUER LES TROU DE A (DANS LES FACES EXTE C A B (INHIBE SI IRED=0) C IF(IRED.EQ.0)RETURN C C A) Y-A-T'IL DES TROUS DANS A C NTROU1=WWORK1.TWORK(/1) IF(NTROU1.EQ.0)RETURN C C B) ON LOOP SUR LES TROUS DE A QUE L'ON PLACE DANS WORK1 C DO 11 IE1=1,NTROU1 WORK1=WWORK1.TWORK(IE1) IF(WORK1.EQ.0)GOTO 11 C C C) ON LOOP SUR LES FACES DE VWORK2 QUE L'ON PLACE DANS WORK2 C DO IE2=1,NFACE WWORK=VWORK2.FWWORK(IE2) WORK2=FWORK C C D) LE TROU WORK1 EST-IL DANS LA FACE WORK2 (TEST MINIMUM)? C IF (IRET.GT.0)THEN RETURN ENDIF NPTO1=WORK1.XYC(/2) C C E) SI OUI, ON LE MET DANS LA FACE ET ON LE RETIRE DE A C C>>>>>>>>>>>> .NOT.LAINB EN PLUS ?????? IF(.NOT.LAOUB)THEN NTROU=TWORK(/1) NTROU=NTROU+1 SEGADJ,WWORK TWORK(NTROU)=WORK1 WWORK1.TWORK(IE1)=0 GOTO 10 C ENDIF ENDDO 10 CONTINUE 11 CONTINUE C C F) ON VERIFIE QUE TOUS LES TROUS DE A ONT ETE DISTRIBUES C DO IE1=1,NTROU1 IF(WWORK1.TWORK(IE1).NE.0)THEN IRET=IRET+1 WRITE(IOIMP,*)'J3COUP: TOUS LES TROUS DE A AURAIENT DUS ETRE' WRITE(IOIMP,*)' DIDTRIBUES' RETURN ENDIF ENDDO C RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales