transf
C TRANSF SOURCE PV 21/07/29 21:15:05 11080 C CE SOUS PROGRAMME MAILLE A L'INTERIEUR D'UN CONTOUR FERME C IL EST TIRE DE COCO MAIS UN PEU SIMPLIFIE L'ARCHITECTURE C S'Y PRETANT MIEUX C DECEMBRE 1982 : PRISE EN COMPTE DE LA NATURE DES CONTOURS C (INTERNE OU EXTERNE) C TEST SI CERTAINS SEGMENTS CREES COUPENT UN CONTOUR C FEVRIER 1983 ==> QUADRANGLES C # NBNN,NBELEM,NUMELG,NUMNP,XAUX,NUMINI,ICLE,QUAL,INAT,IREGU,IMOYE, # XMOY,NBMN,IRECHA,ichp) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) INTEGER NUANC DIMENSION NFI(*),MAI(*),X(3,*),XAUX(2,*),NUM(NBNN,*),INAT(*) -INC PPARAM -INC CCOPTIO -INC CCREEL NUANC=0 MAXELE=NBELEM NUMELG=0 NUMNP=MAI(ITOUR+1) NUMINI=NUMNP+1 IZERO=0 IN=MAI(1)+1 LEMIN=NUMELG+1 KT36=ITOUR C ON FORCE LA DENSITE DE CHAQUE POINT A SA VALEUR REELLE CONNUE xcmp=0.d0 DO 300 IT=1,ITOUR IT1=MAI(IT-1+1)+1 IT2=MAI(IT+1) DO 301 I=IT1,IT2 ISUIV=I+1 IF (ISUIV.GT.IT2) ISUIV=IT1 IALTE=0 IPREC=I-1 IF (IPREC.LT.IT1) IPREC=IT2 SUIV=SQRT((X(1,NFI(ISUIV))-X(1,NFI(I)))**2+ # (X(2,NFI(ISUIV))-X(2,NFI(I)))**2) SPRE=SQRT((X(1,NFI(IPREC))-X(1,NFI(I)))**2+ # (X(2,NFI(IPREC))-X(2,NFI(I)))**2) X(3,NFI(I))=SQRT(SUIV*SPRE) XCMP = max(XCMP,suiv,spre) 301 CONTINUE 300 CONTINUE xcmp=xcmp*xzprec IPARC=0 200 IPARC=IPARC+1 C VERIFICATION QUE TOUT EST CORRECT : LA SURFACE EST POSITIVE SURF=0.D0 DO 3500 IT=1,ITOUR IT1=MAI(IT-1+1)+1 IT2=MAI(IT+1) SURF1=0.D0 DO 3501 I=IT1,IT2 ISUIV=I+1 IF (ISUIV.GT.IT2) ISUIV=IT1 SURF1=SURF1+X(1,NFI(I))*X(2,NFI(ISUIV))-X(2,NFI(I))*X(1,NFI(ISUIV # )) 3501 CONTINUE INAT(IT)=1 IF (SURF1.LT.0.D0) INAT(IT)=-1 IF (SURF1.EQ.0.D0) GOTO 1500 SURF=SURF+SURF1 3500 CONTINUE IF (SURF.LT.0.D0) GOTO 1500 C FABRICATION DES NOEUDS DECALES IF=MAI(ITOUR+1) IF (IMOYE.NE.0) GOTO 935 XMOY=0 DO I=IN,IF XMOY=XMOY+LOG(X(3,NFI(I))) enddo XMOY=EXP(XMOY/(IF-IN+1)) IF (IIMPI.ne.0) WRITE (IOIMP,8877) XMOY 8877 FORMAT(' LA VALEUR MOYENNE DE LA MAILLE RETENUE EST: ',G12.5) 935 CONTINUE XMOMA=0 XMOMI=XGRAND DO 3001 I=IN,IF XMOMI=MIN(XMOMI,X(3,NFI(I))) XMOMA=MAX(XMOMA,X(3,NFI(I))) 3001 CONTINUE COS=1.d0/REAL(IREGU) DO 311 I=IN,IF * modif pour prendre en compte un chpt de densite XSU=XMOY+XMOY*COS XIN=XMOY-MIN(XMOMI,XMOY*COS) IF (X(3,NFI(I)).GT.XIN) GOTO 920 X(3,NFI(I))=X(3,NFI(I))+MIN(COS*X(3,NFI(I)),XMOMI) GOTO 311 920 IF (X(3,NFI(I)).LT.XSU) GOTO 921 X(3,NFI(I))=X(3,NFI(I))*(1.d0-COS) GOTO 311 921 X(3,NFI(I))=XMOY 311 CONTINUE C ON METS UN ELEMENT DANT TOUS LES COINS (JUSQU'A 100 DEG) 360 CONTINUE IT=0 251 IT=IT+1 IF (IT.GT.ITOUR) GOTO 253 IDI=MAI(IT-1+1)+1 IFI=MAI(IT+1) I=IDI-1 IAUX=0 VECTOR=-XGRAND 250 I=I+1 IAUX=IAUX+1 IF (IAUX.GT.IFI-IDI+1) GOTO 1200 IF (I.GT.IFI) I=IDI IF (I.EQ.IDI.AND.IIMPI.ne.0) WRITE (IOIMP,9878) IT,IDI,IFI,IAUX 9878 FORMAT (' IT,IDI,IFI,IAUX ',4I5) IPRES=I-1 IF (IPRES.LT.IDI) IPRES=IFI ISUIV=I+1 IF (ISUIV.GT.IFI) ISUIV=IDI IF (NFI(IPRES).EQ.NFI(ISUIV)) GOTO 250 # (X(2,NFI(IPRES))-X(2,NFI(I)))*(X(2,NFI(ISUIV))-X(2,NFI(I))) # (X(2,NFI(IPRES))-X(2,NFI(I)))*(X(1,NFI(ISUIV))-X(1,NFI(I))) * write(6,*) 'vect scal 4:',vect,scal * write (6,*) 'atan2 - 4 ',ang,vect,vector,iaux,ifi,idi IF (ANG.LT.-2.34D0.OR.ANG.GE.1.D-5) GOTO 250 IF (ANG.LT.-1.6D0.AND.NBNN.EQ.3) GOTO 250 > GOTO 250 * write (6,*) ' apres atan2 -4 ' LL1=NFI(IPRES) LL2=NFI(ISUIV) C ON VA TESTER SI LE SEGMENT EN COUPE UN AUTRE IF (IRECL.NE.0.AND.IFI-IDI.GT.2) GOTO 250 VECTSA=VECT IF (IAUX.EQ.IFI-IDI+1.OR.NBNN.EQ.4) GOTO 390 VECTOR=VECT IAUX=0 GOTO 250 390 CONTINUE C POUR LES QUA4 ON ESSAYE DE COMPLETER LE TRIANGLE EN UN QUADRANGLE IF (NBNN.EQ.3) GOTO 6100 IF (IFI-IDI.LE.2) GOTO 6100 IF (ANG.GT.-0.8D0) GOTO 6100 IAV=IPRES-1 IF (IAV.LT.IDI) IAV=IFI C CALCUL DE L'ANGLE # +(X(2,NFI(IAV))-X(2,NFI(IPRES)))*(X(2,NFI(I))-X(2,NFI(IPRES))) # -(X(2,NFI(IAV))-X(2,NFI(IPRES)))*(X(1,NFI(I))-X(1,NFI(IPRES))) * write (6,*) 'atan2 - 5 ',anga IF (ANGA.GT.0.8D0.OR.ANGA.LE.1.d-5) GOTO 6006 I=IAV GOTO 250 6006 IF (ANGA.GT.2.34D0.OR.ANGA.LE.1.D-5) GOTO 6010 LL1=NFI(IAV) LL2=NFI(ISUIV) IF (IRECL.NE.0) GOTO 6010 XLA=(X(1,NFI(IAV))-X(1,NFI(ISUIV)))**2 # +(X(2,NFI(IAV))-X(2,NFI(ISUIV)))**2 XCOMP=X(3,NFI(I))*X(3,NFI(IPRES)) IF (XLA.LT.0.333D0*XCOMP.OR.XLA.GT.3.D0*XCOMP) GOTO 6010 C SI 5 NOEUDS SUR LE CONTOUR TEST SUPPLEMENTAIRE IF (IFI-IDI.NE.4) GOTO 6008 ICINQ=IAV-1 IF (ICINQ.LT.IDI) ICINQ=IFI SUC=(X(1,NFI(IAV))-X(1,NFI(ICINQ)))*(X(2,NFI(ISUIV))-X(2,NFI(ICINQ #)))-(X(2,NFI(IAV))-X(2,NFI(ICINQ)))*(X(1,NFI(ISUIV))-X(1,NFI(ICINQ #))) IF (SUC.GT.XLA*XLA/3.D0) GOTO 6008 GOTO 6010 6008 NUMELG=NUMELG+1 IF (NUMELG.GE.MAXELE) GOTO 1500 NUM(1,NUMELG)=NFI(IAV) NUM(2,NUMELG)=NFI(IPRES) NUM(3,NUMELG)=NFI(I) NUM(4,NUMELG)=NFI(ISUIV) IF=IF-1 IFI=IFI-2 X(3,NFI(IAV))=SQRT(X(3,NFI(IAV))*X(3,NFI(IPRES))) X(3,NFI(ISUIV))=SQRT(X(3,NFI(I))*X(3,NFI(ISUIV))) DO 6002 J=I,IF NFI(J)=NFI(J+1) 6002 CONTINUE IF=IF-1 IF (IPRES.GT.I) IPRES=IPRES-1 DO J=IPRES,IF NFI(J)=NFI(J+1) enddo DO J=IT,ITOUR MAI(J+1)=MAI(J+1)-2 enddo I=IAV-1 IDI=MAI(IT-1+1)+1 IFI=MAI(IT+1) VECTOR=-XGRAND IAUX=0 IF (IFI-IDI.NE.1) GOTO 250 ITOUR=ITOUR-1 IF (ITOUR.EQ.0) GOTO 1600 DO I=IT,ITOUR INAT(I)=INAT(I+1) MAI(I+1)=MAI(I+1+1)-2 enddo IF=MAI(ITOUR+1) ID=MAI(IT-1+1)+1 DO I=ID,IF NFI(I)=NFI(I+2) enddo IT=IT-1 GOTO 251 C CALCUL DE L'ANGLE 6010 IAP=ISUIV+1 IF (IAP.GT.IFI) IAP=IDI # +(X(2,NFI(I))-X(2,NFI(ISUIV)))*(X(2,NFI(IAP))-X(2,NFI(ISUIV))) # -(X(2,NFI(I))-X(2,NFI(ISUIV)))*(X(1,NFI(IAP))-X(1,NFI(ISUIV))) * write (6,*) ' atan2 - 1 ',anga IF (ANGA.GE.0.D0.AND.ANGA.LT.0.8D0) GOTO 250 IF (ANGA.GT.2.34D0.OR.ANGA.LT.1.D-5) GOTO 6020 LL1=NFI(IAP) LL2=NFI(IPRES) IF (IRECL.NE.0) GOTO 6020 XLA=(X(1,NFI(IAP))-X(1,NFI(IPRES)))**2 # +(X(2,NFI(IAP))-X(2,NFI(IPRES)))**2 XCOMP=X(3,NFI(I))*X(3,NFI(ISUIV)) IF (XLA.LT.0.333D0*XCOMP.OR.XLA.GT.3.D0*XCOMP) GOTO 6020 C SI 5 NOEUDS SUR LE CONTOUR TEST SUPPLEMENTAIRE IF (IFI-IDI.NE.4) GOTO 6018 ICINQ=IPRES-1 IF (ICINQ.LT.IDI) ICINQ=IFI SUC=(X(1,NFI(IPRES))-X(1,NFI(ICINQ)))*(X(2,NFI(IAP))-X(2,NFI(ICINQ #)))-(X(2,NFI(IPRES))-X(2,NFI(ICINQ)))*(X(1,NFI(IAP))-X(1,NFI(ICINQ #))) IF (SUC.GT.XLA*XLA/3.D0) GOTO 6018 GOTO 6020 6018 NUMELG=NUMELG+1 IF (NUMELG.GE.MAXELE) GOTO 1500 NUM(1,NUMELG)=NFI(IPRES) NUM(2,NUMELG)=NFI(I) NUM(3,NUMELG)=NFI(ISUIV) NUM(4,NUMELG)=NFI(IAP) IFI=IFI-2 IF=IF-1 X(3,NFI(IAP))=SQRT(X(3,NFI(IAP))*X(3,NFI(ISUIV))) X(3,NFI(IPRES))=SQRT(X(3,NFI(IPRES))*X(3,NFI(I))) DO J=I,IF NFI(J)=NFI(J+1) enddo IF=IF-1 IF (ISUIV.GT.I) ISUIV=ISUIV-1 DO J=ISUIV,IF NFI(J)=NFI(J+1) enddo DO J=IT,ITOUR MAI(J+1)=MAI(J+1)-2 enddo I=IAV IDI=MAI(IT-1+1)+1 IFI=MAI(IT+1) VECTOR=-XGRAND IAUX=0 IF (IFI-IDI.NE.1) GOTO 250 ITOUR=ITOUR-1 IF (ITOUR.EQ.0) GOTO 1600 DO I=IT,ITOUR INAT(I)=INAT(I+1) MAI(I+1)=MAI(I+1+1)-2 enddo IF=MAI(ITOUR+1) ID=MAI(IT-1+1)+1 DO I=ID,IF NFI(I)=NFI(I+2) enddo IT=IT-1 GOTO 251 6020 CONTINUE C ON TENTE DE FAIRE UN LOSANGE NTENT=NUMNP+1 IF (NTENT.GT.MAXPTS) GOTO 1500 X(1,NTENT)=X(1,NFI(IPRES))+X(1,NFI(ISUIV))-X(1,NFI(I)) X(2,NTENT)=X(2,NFI(IPRES))+X(2,NFI(ISUIV))-X(2,NFI(I)) LL1=NFI(I) LL2=NTENT * write (6,*) ' transa - irecl 1 ',irecl IF (IRECL.NE.0) GOTO 6100 LL1=NFI(ISUIV) 1040 IF (IRECL.NE.0) GOTO 6100 C VERIFICATION DES DISTANCES XLA=(X(1,NTENT)-X(1,NFI(IPRES)))**2 # +(X(2,NTENT)-X(2,NFI(IPRES)))**2 XCOMP=X(3,NFI(IPRES))*X(3,NFI(I)) IF (XLA.LT.0.333D0*XCOMP.OR.XLA.GT.3.D0*XCOMP) GOTO 6100 XLB=(X(1,NTENT)-X(1,NFI(ISUIV)))**2 # +(X(2,NTENT)-X(2,NFI(ISUIV)))**2 XCOMP=X(3,NFI(ISUIV))*X(3,NFI(I)) IF (XLB.LT.0.333D0*XCOMP.OR.XLB.GT.3.D0*XCOMP) GOTO 6100 C VERIFICATION : RECHERCHE DU POINT LE PLUS PRES INATIT=INAT(IT) XL=XGRAND IP=0 ITP=0 DO 6030 ITT=1,ITOUR IF (INATIT.EQ.1.AND.INAT(ITT).EQ.1.AND.IT.NE.ITT) GOTO 6030 IDIA=MAI(ITT-1+1)+1 IFIA=MAI(ITT+1) DO 6031 IA=IDIA,IFIA IF (NFI(IA).EQ.NFI(I)) GOTO 6031 IF (NFI(IA).EQ.NFI(IPRES)) GOTO 6031 IF (NFI(IA).EQ.NFI(ISUIV)) GOTO 6031 DIS=(X(1,NTENT)-X(1,NFI(IA)))**2+(X(2,NTENT)-X(2,NFI(IA)))**2 IF (DIS.GT.XL) GOTO 6031 XL=DIS IP=IA ITP=ITT 6031 CONTINUE 6030 CONTINUE * write (6,*) ' ip le plus proche ',ip C ITP IP EST LE POINT LE PLUS PROCHE IF (XL.LT.0.3333D0*(XLA*XLB)**0.25D0*X(3,NFI(IP))) GOTO 6100 IF (XL.EQ.0.D0) GOTO 6100 IDIP=MAI(ITP+1-1)+1 IFIP=MAI(ITP+1) IPA=IP-1 IF (IPA.LT.IDIP) IPA=IFIP IPS=IP+1 IF (IPS.GT.IFIP) IPS=IDIP SCALA=(X(1,NFI(IP))-X(1,NTENT))*(X(1,NFI(IPA))-X(1,NTENT)) # +(X(2,NFI(IP))-X(2,NTENT))*(X(2,NFI(IPA))-X(2,NTENT)) VECTA=(X(1,NFI(IP ))-X(1,NTENT))*(X(2,NFI(IPA))-X(2,NTENT)) # -(X(2,NFI(IP ))-X(2,NTENT))*(X(1,NFI(IPA))-X(1,NTENT)) IF (abs(vecta).lt.xcmp.and.abs(scala).lt.xcmp) GOTO 1500 ANGA=ATAN2(-VECTA,SCALA) * write (6,*) 'atan2 - 2 ',anga IF (ANGA.GT.2.34D0.OR.ANGA.LT.1.D-5) GOTO 6100 SCALS=(X(1,NFI(IPS))-X(1,NTENT))*(X(1,NFI(IP ))-X(1,NTENT)) # +(X(2,NFI(IPS))-X(2,NTENT))*(X(2,NFI(IP ))-X(2,NTENT)) VECTS=(X(1,NFI(IPS))-X(1,NTENT))*(X(2,NFI(IP ))-X(2,NTENT)) # -(X(2,NFI(IPS))-X(2,NTENT))*(X(1,NFI(IP ))-X(1,NTENT)) IF (abs(vects).lt.xcmp.and.abs(scals).lt.xcmp) GOTO 1500 ANGS=ATAN2(-VECTS,SCALS) * write (6,*) 'atan2 - 3 ',angs IF (ANGS.GT.2.34D0.OR.ANGS.LE.1.d-5) GOTO 6100 C OK ON Y VA NUMELG=NUMELG+1 NUM(1,NUMELG)=NFI(IPRES) NUM(2,NUMELG)=NFI(I) NUM(3,NUMELG)=NFI(ISUIV) NUM(4,NUMELG)=NTENT NUMNP=NUMNP+1 IF (X(3,NFI(I)).GT.XIN) GOTO 6060 X(3,NTENT)=X(3,NFI(I))+MIN(COS*X(3,NFI(I)),XMOMI) GOTO 6062 6060 IF (X(3,NFI(I)).LT.XSU) GOTO 6061 X(3,NTENT)=X(3,NFI(I))*(1.D0-COS) GOTO 6062 6061 X(3,NTENT)=XMOY 6062 CONTINUE NFI(I)=NUMNP VECTOR=-XGRAND IAUX=0 I=IPRES GOTO 250 6100 CONTINUE IF(ANG.LT.-1.9D0) GOTO 250 C SI 4 NOEUDS SUR LE CONTOUR TEST SUPPLEMENTAIRE IF (IFI-IDI.NE.3) GOTO 6101 IQUAT=IPRES-1 IF (IQUAT.LT.IDI) IQUAT=IFI SUC=(X(1,NFI(IPRES))-X(1,NFI(IQUAT)))*(X(2,NFI(ISUIV))- # X(2,NFI(IQUAT)))-(X(2,NFI(IPRES))-X(2,NFI(IQUAT)))* #(X(1,NFI(ISUIV))-X(1,NFI(IQUAT))) IF (SUC.GT.-VECTSA/5.D0) GOTO 6101 IAA=I I=ISUIV ISUIV=IQUAT IQUAT=IPRES IPRES=IAA GOTO 6101 6101 IAX=IAUX IAUX=0 VECTOR=-XGRAND C3=(X(1,NFI(ISUIV))-X(1,NFI(IPRES)))**2+(X(2,NFI(ISUIV))- # X(2,NFI(IPRES)))**2 C3=SQRT(C3) IF(C3.GT.1.5d0*X(3,NFI(I)).AND.MAI(IT+1)-MAI(IT-1+1).NE.3) > GOTO 261 NUMELG=NUMELG+1 IF (NUMELG.GT.MAXELE) GOTO 1500 NUM(1,NUMELG)=NFI(IPRES) NUM(2,NUMELG)=NFI(I) NUM(3,NUMELG)=NFI(ISUIV) IF (NBNN.EQ.4) NUM(4,NUMELG)=0 IFI=IFI-1 IF=IF-1 X(3,NFI(IPRES))=SQRT(X(3,NFI(IPRES))*X(3,NFI(I))) X(3,NFI(ISUIV))=SQRT(X(3,NFI(ISUIV))*X(3,NFI(I))) DO 255 J=I,IF NFI(J)=NFI(J+1) 255 CONTINUE DO J=IT,ITOUR MAI(J+1)=MAI(J+1)-1 enddo I=IPRES-1 IDI=MAI(IT-1+1)+1 IFI=MAI(IT+1) IF (MAI(IT+1)-MAI(IT-1+1).NE.2) GOTO 250 ID=MAI(IT-1+1)+1 DO 257 J=ID,IF NFI(J)=NFI(J+2) 257 CONTINUE 244 CONTINUE ITOUR=ITOUR-1 IF (ITOUR.EQ.0) GOTO 1600 DO I=IT,ITOUR INAT(I)=INAT(I+1) MAI(I+1)=MAI(I+1+1)-2 enddo IF=MAI(ITOUR+1) IT=IT-1 GOTO 251 261 NUMNP=NUMNP+1 IF (NUMNP.GE.MAXPTS) GOTO 1500 A=X(3,NFI(IPRES))+X(3,NFI(ISUIV)) B=X(3,NFI(ISUIV))/A C=X(3,NFI(IPRES))/A X(1,NUMNP)=C*X(1,NFI(ISUIV))+B*X(1,NFI(IPRES)) X(2,NUMNP)=C*X(2,NFI(ISUIV))+B*X(2,NFI(IPRES)) IF (X(3,NFI(I)).GT.XIN) GOTO 6070 X(3,NUMNP)=X(3,NFI(I))+MIN(COS*X(3,NFI(I)),XMOMI) GOTO 6072 6070 IF (X(3,NFI(I)).LT.XSU) GOTO 6071 X(3,NUMNP)=X(3,NFI(I))*(1.d0-COS) GOTO 6072 6071 X(3,NUMNP)=XMOY 6072 CONTINUE NUANC=NUANC+1 NUMELG=NUMELG+1 IF (NUMELG+1.GE.MAXELE) GOTO 1500 NUM(1,NUMELG)=NFI(IPRES) NUM(2,NUMELG)=NFI(I) NUM(3,NUMELG)=NUMNP IF (NBNN.EQ.4) NUM(4,NUMELG)=0 NUMELG=NUMELG+1 NUM(1,NUMELG)=NFI(I) NUM(2,NUMELG)=NFI(ISUIV) NUM(3,NUMELG)=NUMNP IF (NBNN.EQ.4) NUM(4,NUMELG)=0 NFI(I)=NUMNP I=IPRES-1 GOTO 250 1200 CONTINUE IDI=MAI(IT-1+1)+1 IFI=MAI(IT+1) DO 1 I=IDI,IFI IPRES=I-1 IF (IPRES.LT.IDI) IPRES=IFI ISUIV=I+1 IF (ISUIV.GT.IFI) ISUIV=IDI XL1=SQRT((X(1,NFI(IPRES))-X(1,NFI(I)))**2+ # (X(2,NFI(IPRES))-X(2,NFI(I)))**2) XL2=SQRT((X(1,NFI(ISUIV))-X(1,NFI(I)))**2+ # (X(2,NFI(ISUIV))-X(2,NFI(I)))**2) XDIR=XL2*(X(2,NFI(IPRES))-X(2,NFI(I)))+XL1*(X(2,NFI(I))-X(2, # NFI(ISUIV))) YDIR=XL1*(X(1,NFI(ISUIV))-X(1,NFI(I)))+XL2*(X(1,NFI(I))-X(1, # NFI(IPRES))) SDIR=SQRT(XDIR**2+YDIR**2) IF (SDIR.LT.xcmp) XDIR=XL2*(X(2,NFI(IPRES))-X(2,NFI(I))) IF (SDIR.LT.xcmp) YDIR=-(XL2*(X(1,NFI(IPRES))-X(1,NFI(I)))) IF (SDIR.LT.xcmp) SDIR=SQRT(XDIR**2+YDIR**2) RAP=X(3,NFI(I))/SDIR IF (NBNN.EQ.3) RAP=RAP*0.85D0 XAUX(1,I)=X(1,NFI(I))+RAP*XDIR XAUX(2,I)=X(2,NFI(I))+RAP*YDIR 1 CONTINUE C TESTS POUR LA SEPARATION OU LA FUSION DES CONTOURS ITO=0 IP1=0 IP2=0 RAP=10 IDI=MAI(IT-1+1)+1 IFI=MAI(IT+1) IF (IFI-IDI.LE.3) GOTO 373 IFIP=IFI-3 IDIP=IDI DO 351 I=IDIP,IFIP IG=I+3 IPRES=I-1 IF (IPRES.LT.IDI) IPRES=IFI ISUIV=I+1 IF (ISUIV.GT.IFI) ISUIV=IDI IFTA=IFI-MAX(0,IDIP+2-I) IF (IG.GT.IFTA) GOTO 351 DO 352 J=IG,IFTA JSUIV=J+1 JPRES=J-1 IF (JPRES.LT.IDI) JPRES=IFI IF (JSUIV.GT.IFI) JSUIV=IDI IF (NFI(I).EQ.NFI(J)) GOTO 352 IF (NFI(IPRES).EQ.NFI(J)) GOTO 352 IF (NFI(I+1).EQ.NFI(J)) GOTO 352 IF (NFI(I).EQ.NFI(JSUIV)) GOTO 352 IF (NFI(I).EQ.NFI(JPRES)) GOTO 352 DI=SQRT((X(1,NFI(I))-X(1,NFI(J)))**2+(X(2,NFI(I))-X(2,NFI(J)))**2) XRAP=DI/MAX(X(3,NFI(I)),X(3,NFI(J))) IF (XRAP.LT.xcmp) GOTO 1500 C REGLAGE POSSIBLE: A PARTIR DE QUAND COUPER EN 2 LE SEGMENT GENERE IF (XRAP.GT.1.415D0) GOTO 352 IF (XRAP.GT.RAP*0.99999D0) GOTO 352 C VERIFICATION QUE LES POINTS SE FONT FACE # +(XAUX(2,I)-X(2,NFI(I)))*(XAUX(2,J)-X(2,NFI(J))) C REGLAGE POUR DETECTER SI LES POINTS SE FONT FACE LA FUSION MARCHE C DE LA MEME FACON # +(XAUX(2,I)-X(2,NFI(I)))*(X(2,NFI(J))-X(2,NFI(I))) # +(XAUX(2,J)-X(2,NFI(J)))*(X(2,NFI(I))-X(2,NFI(J))) C ON INTERDIT DE COUPER UN COUTOUR EXTERIEUR EN UN EXTERIEUR + C UN INTERIEUR OU UN INTERIEUR EN DEUX INTERIEUR NATINI=INAT(IT) SURF1=0.D0 SURF2=0.D0 LPRES=IFI DO 1001 L=IDI,IFI LPRES=L 1001 CONTINUE IF (NATINI.GE.0.AND.SURF1*SURF2.LT.0.D0) GOTO 352 IF (NATINI.LT.0.AND.SURF1.LT.0.D0.AND.SURF2.LT.0.D0) GOTO 352 C TEST SI LE SEGMENT CANDIDAT EN COUPE UN AUTRE LL1=NFI(I) LL2=NFI(J) IF (IRECL.NE.0) GOTO 352 LL3=NFI(IPRES) LL4=NFI(ISUIV) IF (IRECL.NE.0) GOTO 352 LL1=NFI(J) LL2=NFI(I) LL3=NFI(JPRES) LL4=NFI(JSUIV) IF (IRECL.NE.0) GOTO 352 380 CONTINUE C OK RAP=XRAP ITO=IT IP1=I IP2=J SUK1=SURF1 SUK2=SURF2 352 CONTINUE 351 CONTINUE IF (ITO.EQ.0) GOTO 353 IF (IIMPI.EQ.0) WRITE (IOIMP,5566) NFI(IP1),NFI(IP2) 5566 FORMAT (' SEPARATION DES CONTOURS ',2I6) IDI=MAI(ITO-1+1)+1 IFI=MAI(ITO+1) IDEB=MAI(ITOUR+1)+1 ITOUR=ITOUR+1 IF (ITOUR.GE.MAIMAX) GOTO 1500 IF (IDEB.GE.NFMAX) GOTO 1500 NFI(IDEB)=NFI(IP1) IDEB=IDEB+1 IF (IDEB.GE.NFMAX) GOTO 1500 IP=IP2 355 IF (IP.GT.IFI) IP=IDI IF (IP.EQ.IP1) GOTO 354 NFI(IDEB)=NFI(IP) IDEB=IDEB+1 IF (IDEB.GE.NFMAX) GOTO 1500 IP=IP+1 GOTO 355 354 IDEB=IDEB-1 MAI(ITOUR+1)=IDEB INAT(ITOUR)=1 IF (SUK1.LT.0.D0) INAT(ITOUR)=-1 ITOUR=ITOUR+1 IF (ITOUR.GE.MAIMAX) GOTO 1500 IDEB=IDEB+1 IF (IDEB.GE.NFMAX) GOTO 1500 IP=IP1 357 IF (IP.GT.IP2) GOTO 356 NFI(IDEB)=NFI(IP) IP=IP+1 IDEB=IDEB+1 IF (IDEB.GE.NFMAX) GOTO 1500 GOTO 357 356 CONTINUE IDEB=IDEB-1 MAI(ITOUR+1)=IDEB INAT(ITOUR)=1 IF (SUK2.LT.0.D0) INAT(ITOUR)=-1 C SUPPRESSION DE ITO IDEC=MAI(ITO+1)-MAI(ITO-1+1) ID=MAI(ITO-1+1)+1 ITOUR=ITOUR-1 DO I=ITO,ITOUR INAT(I)=INAT(I+1) MAI(I+1)=MAI(I+1+1)-IDEC enddo IF=MAI(ITOUR+1) DO I=ID,IF NFI(I)=NFI(I+IDEC) enddo IT=IT-1 GOTO 251 353 CONTINUE C DEUXIEME TEST PORTANT SUR LES XAUX PARCOUR DECALE TRAITEMENT SIMILAIR * write(6,*) ' apres 353 ' ITO=0 IP1=0 IP2=0 RAP=10 IDI=MAI(IT-1+1)+1 IFI=MAI(IT+1) IFIP=IFI-2 IDIP=IDI DO 371 I=IDIP,IFIP IG=I+2 IFTA=IFI-MAX(0,IDIP+1-I) IF (IG.GT.IFTA) GOTO 371 DO 372 J=IG,IFTA IF (I.EQ.IDI.AND.J.EQ.IFI) GOTO 372 DI=SQRT((XAUX(1,I)-XAUX(1,J))**2+(XAUX(2,I)-XAUX(2,J))**2) XRAP=DI/MAX(X(3,NFI(I)),X(3,NFI(J))) IF (XRAP.GT.0.707D0) GOTO 372 C ON VERIFIE QUE LES POINTS SONT EN FACE # +(XAUX(2,I)-X(2,NFI(I)))*(XAUX(2,J)-X(2,NFI(J))) * write(6,*) 'scal en 643 ',scal * write(6,*) 'xrap en 646 ',xrap IF (XRAP.GT.RAP*0.99999D0) GOTO 372 NATINI=INAT(IT) SURF1=0.D0 SURF2=0.D0 LPRES=IFI DO 1002 L=IDI,IFI LPRES=L 1002 CONTINUE * write (6,*) 'natini surf1 surf2 ',natini,surf1,surf2 IF (NATINI.GE.0.AND.SURF1*SURF2.LT.0.D0) GOTO 372 IF (NATINI.LT.0.AND.SURF1.LT.0.D0.AND.SURF2.LT.0.D0) GOTO 372 C TEST SI LES DEUX SEGMENTS CANDITATS EN COUPENT UN AUTRE IF (NUMNP+1.GE.MAXPTS) GOTO 1500 X(1,NUMNP+1)=(X(3,NFI(J))*XAUX(1,I)+X(3,NFI(I))*XAUX(1,J))/ # (X(3,NFI(I))+X(3,NFI(J))) X(2,NUMNP+1)=(X(3,NFI(J))*XAUX(2,I)+X(3,NFI(I))*XAUX(2,J))/ # (X(3,NFI(I))+X(3,NFI(J))) LL1=NFI(I) LL2=NUMNP+1 IF (IRECL.NE.0) GOTO 372 IPRES=I-1 IF (IPRES.LT.IDI) IPRES=IFI ISUIV=I+1 IF (ISUIV.GT.IFI) ISUIV=IDI LL3=NFI(IPRES) LL4=NFI(ISUIV) IF (IRECL.NE.0) GOTO 372 LL1=NUMNP+1 LL2=NFI(J) IF (IRECL.NE.0) GOTO 372 JPRES=J-1 IF (JPRES.LT.IDI) JPRES=IFI JSUIV=J+1 IF (JSUIV.GT.IFI) JSUIV=IDI LL1=NFI(J) LL2=NUMNP+1 LL3=NFI(JPRES) LL4=NFI(JSUIV) IF (IRECL.NE.0) GOTO 372 RAP=XRAP ITO=IT IP1=I IP2=J SUK1=SURF1 SUK2=SURF2 * write(6,*) ' avant 372 ' 372 CONTINUE 371 CONTINUE IF (ITO.EQ.0) GOTO 373 IF (IIMPI.ne.0) WRITE (IOIMP,7788) NFI(IP1),NFI(IP2) 7788 FORMAT (' SEPARATION 2EME TYPE ',2I6) C ON RAJOUTE UN POINT NUMNP=NUMNP+1 X(1,NUMNP)=(X(3,NFI(IP2))*XAUX(1,IP1)+X(3,NFI(IP1))*XAUX(1,IP2))/ # (X(3,NFI(IP1))+X(3,NFI(IP2))) X(2,NUMNP)=(X(3,NFI(IP2))*XAUX(2,IP1)+X(3,NFI(IP1))*XAUX(2,IP2))/ # (X(3,NFI(IP1))+X(3,NFI(IP2))) IDI=MAI(ITO-1+1)+1 IFI=MAI(ITO+1) IDEB=MAI(ITOUR+1)+1 ITOUR=ITOUR+1 IF (ITOUR.GE.MAIMAX) GOTO 1500 IF (IDEB.GE.NFMAX) GOTO 1500 NFI(IDEB)=NFI(IP1) IDEB=IDEB+1 IF (IDEB.GE.NFMAX) GOTO 1500 NFI(IDEB)=NUMNP X(3,NFI(IDEB))=SQRT(X(3,NFI(IP1))*X(3,NFI(IP2))) IDEB=IDEB+1 IP=IP2 375 IF (IP.GT.IFI) IP=IDI IF (IP.EQ.IP1) GOTO 374 IF (IDEB.GE.NFMAX) GOTO 1500 NFI(IDEB)=NFI(IP) IDEB=IDEB+1 IP=IP+1 GOTO 375 374 IDEB=IDEB-1 MAI(ITOUR+1)=IDEB INAT(ITOUR)=1 IF (SUK1.LT.0.D0) INAT(ITOUR)=-1 ITOUR=ITOUR+1 IDEB=IDEB+1 IF (ITOUR.GE.MAIMAX.OR.IDEB.GE.NFMAX) GOTO 1500 IP=IP1 377 IF (IP.GT.IP2) GOTO 376 NFI(IDEB)=NFI(IP) IP=IP+1 IDEB=IDEB+1 IF (IDEB.GE.NFMAX) GOTO 1500 GOTO 377 376 CONTINUE NFI(IDEB)=NUMNP X(3,NFI(IDEB))=SQRT(X(3,NFI(IP1))*X(3,NFI(IP2))) MAI(ITOUR+1)=IDEB INAT(ITOUR)=1 IF (SUK2.LT.0.D0) INAT(ITOUR)=-1 C SUPPRESSION DE ITO IDEC=MAI(ITO+1)-MAI(ITO-1+1) ID=MAI(ITO-1+1)+1 ITOUR=ITOUR-1 DO I=ITO,ITOUR INAT(I)=INAT(I+1) MAI(I+1)=MAI(I+1+1)-IDEC enddo IF=MAI(ITOUR+1) DO I=ID,IF NFI(I)=NFI(I+IDEC) enddo IT=IT-1 GOTO 251 373 CONTINUE GOTO 251 253 CONTINUE C POUR LE CAS DES MAILLAGES AVEC TROUS RECOLLEMENT EVENTUEL DES CONTOUR IOPT=0 ITO1=0 ITO2=0 IP1=0 IP2=0 RAP=10 ITOUI=ITOUR-1 IF (ITOUI.EQ.0) GOTO 520 DO 500 IT1=1,ITOUI IDI1=MAI(IT1-1+1)+1 IFI1=MAI(IT1+1) ITD=IT1+1 DO 502 IT2=ITD,ITOUR IF (IT2.EQ.IT1) GOTO 502 C IMPOSSIBLE DE FUSIONNER DEUX CONTOURS EXTERIEURS IF (INAT(IT1).EQ.1.AND.INAT(IT2).EQ.1) GOTO 502 IDI2=MAI(IT2-1+1)+1 IFI2=MAI(IT2+1) IPRES2=I2-1 IF (IPRES2.LT.IDI2) IPRES2=IFI2 IF (ISUIV2.GT.IFI2) ISUIV2=IDI2 DO 501 I1=IDI1,IFI1 IPRES1=I1-1 IF (IPRES1.LT.IDI1) IPRES1=IFI1 ISUIV1=I1+1 IF (ISUIV1.GT.IFI1) ISUIV1=IDI1 IF (NFI(I1).EQ.NFI(IPRES2)) GOTO 501 IF (NFI(I1).EQ.NFI(ISUIV2)) GOTO 501 IF (XRAP.EQ.0.D0) GOTO 1500 IF (XRAP.GT.1.415D0) GOTO 530 IF (XRAP.GT.RAP*0.99999D0) GOTO 530 C VERIFICATION QUE LES POINTS SE FONT FACE LL1=NFI(I1) IF (IRECL.NE.0) GOTO 501 381 CONTINUE RAP=XRAP ITO1=IT1 ITO2=IT2 IP1=I1 IP2=I2 IOPT=1 GOTO 501 530 CONTINUE C DEUXIEME POSSIBILITE IF (XRAP.GT.0.8D0) GOTO 501 IF (XRAP.GT.RAP*0.99999D0) GOTO 501 C ON VERIFIE QUE LES POINTS SONT EN FACE LL1=NFI(I1) IF (IRECL.NE.0) GOTO 501 LL3=NFI(IPRES1) LL4=NFI(ISUIV1) IF (IRECL.NE.0) GOTO 501 LL2=NFI(I1) LL3=NFI(IPRES2) LL4=NFI(ISUIV2) IF (IRECL.NE.0) GOTO 501 RAP=XRAP ITO1=IT1 ITO2=IT2 IP1=I1 IP2=I2 IOPT=2 501 CONTINUE 503 CONTINUE 502 CONTINUE 500 CONTINUE IF (IOPT.EQ.0) GOTO 520 IF (IOPT.EQ.1) GOTO 531 NUMNP=NUMNP+1 IF (NUMNP.GE.MAXPTS) GOTO 1500 X(1,NUMNP)=(X(3,NFI(IP2))*X(1,NFI(IP1))+X(3,NFI(IP1))* # X(1,NFI(IP2)))/(X(3,NFI(IP1))+X(3,NFI(IP2))) X(2,NUMNP)=(X(3,NFI(IP2))*X(2,NFI(IP1))+X(3,NFI(IP1))* # X(2,NFI(IP2)))/(X(3,NFI(IP1))+X(3,NFI(IP2))) 531 CONTINUE IF (IIMPI.ne.0) WRITE (IOIMP,6655) ITO1,ITO2,NFI(IP1),NFI(IP2) 6655 FORMAT(' FUSION DES CONTOURS ',4I6) IDI1=MAI(ITO1-1+1)+1 IFI1=MAI(ITO1+1) IDI2=MAI(ITO2-1+1)+1 IFI2=MAI(ITO2+1) IDEB=MAI(ITOUR+1)+1 ITOUR=ITOUR+1 IF (ITOUR.GE.MAIMAX.OR.IDEB.GE.NFMAX) GOTO 1500 IF (IOPT.EQ.1) GOTO 532 NFI(IDEB)=NUMNP X(3,NFI(IDEB))=SQRT(X(3,NFI(IP1))*X(3,NFI(IP2))) IDEB=IDEB+1 IF (IDEB.GE.NFMAX) GOTO1500 532 NFI(IDEB)=NFI(IP1) IP=IP1 505 IP=IP+1 IF (IP.GT.IFI1) IP=IDI1 IF (IP.EQ.IP1) GOTO 506 IDEB=IDEB+1 IF (IDEB.GE.NFMAX) GOTO 1500 NFI(IDEB)=NFI(IP) GOTO 505 506 IDEB=IDEB+1 IF (IDEB.GE.NFMAX) GOTO 1500 NFI(IDEB)=NFI(IP1) IDEB=IDEB+1 IF (IDEB.GE.NFMAX) GOTO 1500 IF (IOPT.EQ.1) GOTO 534 NFI(IDEB)=NUMNP X(3,NFI(IDEB))=SQRT(X(3,NFI(IP1))*X(3,NFI(IP2))) IDEB=IDEB+1 IF (IDEB.GE.NFMAX) GOTO 1500 534 CONTINUE NFI(IDEB)=NFI(IP2) IP=IP2 507 IP=IP+1 IF (IP.GT.IFI2) IP=IDI2 IDEB=IDEB+1 IF (IDEB.GE.NFMAX) GOTO 1500 NFI(IDEB)=NFI(IP) IF (IP.NE.IP2) GOTO 507 MAI(ITOUR+1)=IDEB INAT(ITOUR)=1 IF (INAT(ITO1).EQ.-1.AND.INAT(ITO2).EQ.-1) INAT(ITOUR)=-1 C SUPPRESSION DE ITO1 ITO2 IDEC=MAI(ITO1+1)-MAI(ITO1-1+1) ID=MAI(ITO1-1+1)+1 ITOUR=ITOUR-1 DO I=ITO1,ITOUR INAT(I)=INAT(I+1) MAI(I+1)=MAI(I+1+1)-IDEC enddo IF=MAI(ITOUR+1) DO I=ID,IF NFI(I)=NFI(I+IDEC) enddo ITO2=ITO2-1 IDEC=MAI(ITO2+1)-MAI(ITO2-1+1) ID=MAI(ITO2-1+1)+1 ITOUR=ITOUR-1 DO I=ITO2,ITOUR INAT(I)=INAT(I+1) MAI(I+1)=MAI(I+1+1)-IDEC enddo IF=MAI(ITOUR+1) DO I=ID,IF NFI(I)=NFI(I+IDEC) enddo GOTO 360 520 CONTINUE C REPARTITION DES POINTS SUR LE CONTOUR DECALE C FABRICATION DES TRIANGLES JOIGNANT LES DEUX CONTOURS IAJOU=ITOUR IT=0 320 IT=IT+1 IAJOU=IAJOU+1 IF (IAJOU.GE.MAIMAX) GOTO 1500 IF (IT.GT.ITOUR) GOTO 321 INAT(IAJOU)=INAT(IT) IDI=MAI(IT-1+1)+1 IFI=MAI(IT+1) IAJDI=MAI(IAJOU-1+1)+1 IF (NBNN.EQ.3) GOTO 6300 C POUR LES QUADRANGLES ON UTILISE UN AUTRE PROCEDE DE GENERATION NUMNP=NUMNP+1 IF (NUMNP.GE.MAXPTS) GOTO 1500 IPREM=NUMNP X(1,NUMNP)=XAUX(1,IDI) X(2,NUMNP)=XAUX(2,IDI) X(3,NUMNP)=X(3,NFI(IDI)) IF (IAJDI.GE.NFMAX) GOTO 1500 NFI(IAJDI)=NUMNP DO 6301 I=IDI,IFI ISUIV=I+1 IF (ISUIV.GT.IFI) ISUIV=IDI XCOMP=X(3,NUMNP)*X(3,NFI(ISUIV)) XLONG=(XAUX(1,ISUIV)-X(1,NUMNP))**2+(XAUX(2,ISUIV)-X(2,NUMNP))**2 IF (XLONG.LT.0.5D0*XCOMP) GOTO 6302 IF (XLONG.GT.2.D0*XCOMP) GOTO 6303 C ON FAIT UN QUADRILATERE 6320 CONTINUE NUMELG=NUMELG+1 IF (NUMNP+1.GE.MAXPTS.OR.NUMELG.GE.MAXELE) GOTO 1500 NUM(1,NUMELG)=NFI(I) NUM(2,NUMELG)=NFI(ISUIV) NUM(3,NUMELG)=NUMNP+1 NUM(4,NUMELG)=NUMNP IF (ISUIV.EQ.IDI) GOTO 6312 NUMNP=NUMNP+1 X(1,NUMNP)=XAUX(1,ISUIV) X(2,NUMNP)=XAUX(2,ISUIV) X(3,NUMNP)=X(3,NFI(ISUIV)) IAJDI=IAJDI+1 IF (IAJDI.GE.NFMAX) GOTO 1500 NFI(IAJDI)=NUMNP GOTO 6301 6312 NUM(3,NUMELG)=IPREM IF (IPREM.NE.NUMNP) GOTO 6301 NUMELG=NUMELG-1 C LE SEGMENT EST TROP PETIT ==> ON FAIT UN TRIANGLE 6302 X(1,NUMNP)=0.5D0*(X(1,NUMNP)+XAUX(1,ISUIV)) X(2,NUMNP)=0.5D0*(X(2,NUMNP)+XAUX(2,ISUIV)) X(3,NUMNP)=SQRT(X(3,NUMNP)*X(3,NFI(ISUIV))) XAUX(1,I)=X(1,NUMNP) XAUX(2,I)=X(2,NUMNP) NUMELG=NUMELG+1 IF (NUMELG.GE.MAXELE) GOTO 1500 NUM(1,NUMELG)=NFI(I) NUM(2,NUMELG)=NFI(ISUIV) NUM(3,NUMELG)=NUMNP NUM(4,NUMELG)=0 IF (ISUIV.NE.IDI) GOTO 6301 IF (NUMNP.EQ.IPREM) GOTO 6301 NUMU=NUMELG+1 6321 NUMU=NUMU-1 IF (NUM(3,NUMU).NE.NUMNP) GOTO 6322 NUM(3,NUMU)=IPREM C CORRECTION PROBLEME YALA SYST SUR CRAY 06/18/86 IF (NUM(4,NUMU).NE.IPREM+1) GOTO 6321 C ALORS COUPER NUMU EN 2 TRIANGLES POUR NE PAS AVOIR 2 QUAD SE TOUCHAN C PAR TROIS POINTS NUMELG=NUMELG+1 IF (NUMELG.GE.MAXELE) GOTO 1500 NUM(1,NUMELG)=NUM(4,NUMU) NUM(2,NUMELG)=NUM(2,NUMU) NUM(3,NUMELG)=NUM(3,NUMU) NUM(4,NUMELG)=0 NUM(3,NUMU)=NUM(4,NUMU) NUM(4,NUMU)=0 6322 CONTINUE X(1,IPREM)=X(1,NUMNP) X(2,IPREM)=X(2,NUMNP) NUMNP=NUMNP-1 IAJDI=IAJDI-1 GOTO 6301 C LE SEGMENT EST TROP GRAND ==> ON FAIT UN TRIANGLE ET UN QUADRANGLE 6303 IALTE=1-IALTE IF (NUMNP+2.GE.MAXPTS.OR.NUMELG+2.GE.MAXELE) GOTO 1500 X(1,NUMNP+1)=0.5D0*(X(1,NUMNP)+XAUX(1,ISUIV)) X(2,NUMNP+1)=0.5D0*(X(2,NUMNP)+XAUX(2,ISUIV)) X(3,NUMNP+1)=SQRT(X(3,NUMNP)*X(3,NFI(ISUIV))) IAJDI=IAJDI+1 IF (IAJDI+1.GE.NFMAX) GOTO 1500 NFI(IAJDI)=NUMNP+1 X(1,NUMNP+2)=XAUX(1,ISUIV) X(2,NUMNP+2)=XAUX(2,ISUIV) X(3,NUMNP+2)=X(3,NFI(ISUIV)) IAJDI=IAJDI+1 NFI(IAJDI)=NUMNP+2 NUMELG=NUMELG+1 NUM(1,NUMELG)=NUMNP+1 NUM(2,NUMELG)=NUMNP NUM(3,NUMELG)=NFI(I) NUM(4,NUMELG)=0 IF (IALTE.EQ.1) NUM(4,NUMELG)=NFI(ISUIV) NUMELG=NUMELG+1 IF (IALTE.NE.1) GOTO 6330 NUM(1,NUMELG)=NUMNP+1 NUM(2,NUMELG)=NFI(ISUIV) NUM(3,NUMELG)=NUMNP+2 NUM(4,NUMELG)=0 GOTO 6331 6330 NUM(1,NUMELG)=NFI(I) NUM(2,NUMELG)=NFI(ISUIV) NUM(3,NUMELG)=NUMNP+2 NUM(4,NUMELG)=NUMNP+1 6331 CONTINUE NUMNP=NUMNP+2 IF (ISUIV.NE.IDI) GOTO 6301 NUM(3,NUMELG)=IPREM NUMNP=NUMNP-1 IAJDI=IAJDI-1 GOTO 6301 6301 CONTINUE GOTO 14 6300 CONTINUE ICA=IDI ICN=ICA NUANC=NUMNP NUMNP=NUMNP+1 IF (NUMNP.GE.MAXPTS) GOTO 1500 X(1,NUMNP)=XAUX(1,ICA) X(2,NUMNP)=XAUX(2,ICA) NUSAUV=NUMNP X(3,NUMNP)=X(3,NFI(ICA)) IF (IAJDI.GE.NFMAX) GOTO 1500 NFI(IAJDI)=NUMNP DISTR=0.D0 2 ICAS=ICA+1 DISTA=1.D0 ISAUT=0 IF (ICAS.GT.IFI) ICAS=IDI 21 ICNS=ICN+1 ISAUT=ISAUT+1 IF (ICNS.GT.IFI) ICNS=IDI IF (ICN.GT.IFI) GOTO 10 DISCO=X(3,NFI(ICNS)) DISTT=SQRT((XAUX(1,ICNS)-X(1,NUMNP))**2+(XAUX(2,ICNS)-X(2,NUMNP)) # **2) DISTA=EXP((REAL(ISAUT-1)*LOG(DISTA)+LOG(DISCO))/REAL(ISAUT)) IF (DISTT.GE.DISTA) GOTO 20 NUMELG=NUMELG+1 IF (NUMELG.GT.MAXELE) GOTO 1500 NUM(1,NUMELG)=NUSAUV NUM(2,NUMELG)=NFI(ICN) NUM(3,NUMELG)=NFI(ICNS) ICN=ICN+1 GOTO 21 20 CONTINUE DISTSU=DISTT-DISTA DINCR=SQRT((XAUX(1,ICNS)-XAUX(1,ICN))**2+(XAUX(2,ICNS)-XAUX(2,ICN) # )**2) RAP=MIN(1.D0,DISTSU/DINCR) NUPREC=NUSAUV NUMNP=NUMNP+1 IF (NUMNP.GE.MAXPTS) GOTO 1500 NUSAUV=NUMNP IAJDI=IAJDI+1 IF (IAJDI.GE.NFMAX) GOTO 1500 X(3,NUMNP)=DISTA NFI(IAJDI)=NUMNP X(1,NUMNP)=XAUX(1,ICN)*RAP+(1.D0-RAP)*XAUX(1,ICNS) X(2,NUMNP)=XAUX(2,ICN)*RAP+(1.D0-RAP)*XAUX(2,ICNS) C VERIFICATION QU'ON NE PASSE PAS TROP PRES DES PTS C NFI(ICN) ET NFI(ICNS) ZRA=((X(1,NUMNP)-X(1,NFI(ICN)))*(X(2,NUMNP-1)-X(2,NFI(ICN)))-(X(2 # ,NUMNP)-X(2,NFI(ICN)))*(X(1,NUMNP-1)-X(1,NFI(ICN))))/(DISTA**2) IF (ZRA.GT.0.4D0) GOTO 2003 XQ=X(1,NUMNP) YQ=X(2,NUMNP) X(1,NUMNP)=XQ+(1-ZRA)*(X(2,NUMNP-1)-YQ) X(2,NUMNP)=YQ+(1-ZRA)*(XQ-X(1,NUMNP-1)) 2003 CONTINUE IF (ISAUT.EQ.1) GOTO 240 ICNP=ICN-1 IF (ICNP.LT.IDI) GOTO 240 # (X(2,NUPREC)-X(2,NFI(ICN)))**2 # (X(2,NUSAUV)-X(2,NFI(ICNP)))**2 NUM(1,NUMELG)=NUSAUV NUM(2,NUMELG)=NUPREC NUM(3,NUMELG)=NFI(ICNP) NUMELG=NUMELG+1 IF (NUMELG.GE.MAXELE) GOTO 1500 NUM(1,NUMELG)=NUSAUV NUM(2,NUMELG)=NFI(ICNP) NUM(3,NUMELG)=NFI(ICN) ICA=ICN GOTO 2 240 CONTINUE NUMELG=NUMELG+1 IF (NUMELG.GE.MAXELE) GOTO 1500 NUM(1,NUMELG)=NUSAUV NUM(2,NUMELG)=NUPREC NUM(3,NUMELG)=NFI(ICN) ICA=ICN GOTO 2 10 CONTINUE * CORRECTION PROBLEME VAGHI 5/2/87 1 SEUL POINT INTERNE IF (NUSAUV.EQ.NUANC+1) GOTO 14 C=SQRT((X(1,NUSAUV)-X(1,NUANC+1))**2+(X(2,NUSAUV)-X(2,NUANC+1)) # **2) IF (C.GT.X(3,NFI(IFI))) GOTO 11 X(1,NUANC+1)=0.5D0*(X(1,NUANC+1)+X(1,NUSAUV)) X(2,NUANC+1)=0.5D0*(X(2,NUANC+1)+X(2,NUSAUV)) NUMU=NUMELG+1 12 NUMU=NUMU-1 IF (NUM(1,NUMU).NE.NUSAUV) GOTO 15 NUM(1,NUMU)=NUANC+1 GOTO 12 15 CONTINUE NUMNP=NUMNP-1 IAJDI=IAJDI-1 GOTO 14 11 NUMELG=NUMELG+1 IF (NUMELG.GE.MAXELE) GOTO 1500 NUM(1,NUMELG)=NUANC+1 NUM(2,NUMELG)=NUMNP NUM(3,NUMELG)=NFI(IDI) 14 MAI(IAJOU+1)=IAJDI IF (MAI(IAJOU+1)-MAI(IAJOU-1+1).LT.3) IAJOU=IAJOU-1 IF (NUMELG.GE.MAXELE.OR.NUMNP.GE.MAXPTS) GOTO 1500 GOTO 320 321 CONTINUE IAJOU=IAJOU-1 IDEC=MAI(ITOUR+1)-IN+1 IF=MAI(IAJOU+1)-IDEC DO 204 I=IN,IF NFI(I)=NFI(I+IDEC) 204 CONTINUE ITDEC=IAJOU-ITOUR DO 202 IT=1,ITDEC INAT(IT)=INAT(IT+ITOUR) MAI(IT+1)=MAI(IT+ITOUR+1)-IDEC 202 CONTINUE ITOUR=ITDEC IF (ITOUR.EQ.0) GOTO 1600 IF (NUMNP.GE.MAXPTS.OR.NUMELG.GE.MAXELE) GOTO 1500 GOTO 200 1500 IRECHA=27 ICLE=0 RETURN 1600 CONTINUE LEMAX=NUMELG ICLE=2 NINF=NUMNP RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales