diff options
Diffstat (limited to 'Dragon/src/TRKHEX.f')
| -rw-r--r-- | Dragon/src/TRKHEX.f | 2954 |
1 files changed, 2954 insertions, 0 deletions
diff --git a/Dragon/src/TRKHEX.f b/Dragon/src/TRKHEX.f new file mode 100644 index 0000000..84b546a --- /dev/null +++ b/Dragon/src/TRKHEX.f @@ -0,0 +1,2954 @@ +*DECK TRKHEX + SUBROUTINE TRKHEX(IPRT,NCEL,FVOL,REMESH,MESH,PAS1,A,COS1,COS2, + + COS3,POP,STAIRS,IPLANZ,FACST,NDIM,NCYL,MAT,IFILE, + + IANGL,POIDS,MAT2,NSECT,T0,TSEC,V0,VSEC,PAS2,RAYON, + + ZMIN,ZMAX,FACB,NVOL,SECTOR,NSMIN,SURB,RAUX,NSURF,CORN, + + ICOR,VOISIN,NCEL2,NSOUT) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute the tracking information related to a +* hexagonal heterogeneous assembly for a given +* angle in a 3D or 2D geometry. +* +*Copyright: +* Copyright (C) 1991 Ecole Polytechnique de Montreal +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version +* +*Author(s): +* M. Ouisloumen +* +*Parameters: input +* IPRT print option. +* NCEL number of cells of the assembly. +* FVOL first zone in the cell. +* NVOL first volume number in the cell. +* NCYL number of cylinder in the cell. +* REMESH contains the coordinates of the hexagon centers (height for +* Z), the location of the cylinders and their radius. +* The order is: +* XH(1),XH(2),...,YH(1),YH(2),...,ZH(1),ZH(2),...,XC(1),YC(1), +* ZC(1),RC(1),XC(2),YC(2),ZC(2),RC(2)... +* A lenght of one of the hexagone. +* COS1 X director cosine. +* COS2 Y director cosine. +* COS3 Z director cosine. +* PAS1 line spacing in Y. +* PAS2 line spacing in Z. +* STAIRS cell maximum number in plane. +* FACST surface maximum number in plane. +* NDIM number of dimensions of problem. +* IFILE file track unit number. +* NSECT number of sectors in volume. +* FACB first bottom or top surface number. +* SECTOR flag for sector. +* SURB initial surface numbering. +* VOISIN 6 neighbors of each cell in the X-Y plane. +* NSOUT Total number of surfaces in global geometry. +* +*Parameters: input/output +* IANGL angle number. +* +*Parameters: scratch +* POP undefined. +* MAT undefined. +* T0 undefined. +* TSEC undefined. +* V0 undefined. +* VSEC undefined. +* RAUX undefined. +* MESH undefined. +* IPLANZ undefined. +* POIDS undefined. +* MAT2 undefined. +* RAYON undefined. +* ZMIN undefined. +* ZMAX undefined. +* NSMIN undefined. +* NSURF undefined. +* CORN undefined. +* ICOR undefined. +* NCEL2 undefined. +* +*Comments: +* Assembly coordinate system +* .Z +* . +* . . Y +* ++++++++ . . +* + + . . +* + + . . +* + + .. +* I ++++++++ I O .............. X +* I I I I +* I I I I +* I I I I +* + I I + +* ++++++++ +* +*--------------------------- TRKHEX --------------------------------- +* + IMPLICIT NONE + INTEGER IOUT + DOUBLE PRECISION SQRT3,PI + CHARACTER*6 NAMSBR + PARAMETER (IOUT=6,SQRT3=1.732050807568877D0, + > PI=3.141592653589793D0,NAMSBR='TRKHEX') +*---- +* ROUTINE PARAMETERS +*---- + INTEGER IPRT,NCEL,MESH,IPLANZ,NDIM,ICOR,IFILE,NSMIN, + > NSURF,NCEL2,IANGL,NSOUT + REAL REMESH(MESH) + DOUBLE PRECISION POP(*),A,COS1,COS2,COS3,PAS1,PAS2,RAYON,POIDS, + > ZMIN,ZMAX + DOUBLE PRECISION T0(*),TSEC(*),RAUX(*) + INTEGER FVOL(NCEL),STAIRS(IPLANZ),FACST(IPLANZ), + > NCYL(NCEL),MAT(*),MAT2(*),NSECT(*),V0(*), + > VSEC(*),FACB(*),NVOL(*),SURB(NSMIN:*), + > CORN(ICOR),VOISIN(6,NCEL2) + LOGICAL SECTOR +*---- +* LOCAL VECTORS +*---- + INTEGER SURC(6),SURF1(8),SURF2(8),FACEM(5), + > FACES(5),FACEM1(5),FACEM2(5),FACEMD(5), + > SURFX(8),FACEMU(5),MAT3(10) + DOUBLE PRECISION T(9),XDR(8),YDR(8),ZDR(8) + LOGICAL START,DIRUP,LGSTOR,LGDIM,LGPG1,LGFAC, + > LGMAT3,LGDIR,LGPER,LGFAC8,LGFAC7, + > LTHROU,LGDEB,LGPASS,PASSU,PASSD,LGPAS0, + > LGPASU,LGPASD,LGOUT1,LGOUTU,LGOUTD,LGG,LGG1 +*---- +* ADDITIONNAL VARIABLES +*---- + INTEGER IFONC,IFCOUR,JSEC2,JSEC,JCC,J,IVS1,IVS0,JC, + > JCC0,KMAX,N,IZONE,ISECTR,L,LMIN,ILINE, + > IZZ,IZ0,LMAX,L0,LL,LSTEP,ISV,JSV, + > JVOUT2,JVOUT1,IFV,IVSEC1,IS,IVS,IVSEC2,JAUX, + > ISEC,IS1,IAUX,LPOP,IMAM,IFOUT2,KSECT,JMAX,JMIN, + > IXY,KFACE,ISURF2,ISURF1,NFACX,ISTAIR,IMAX,IW, + > IFACST,LFOUT2,ISXX,KS,IP,KOUT,KFXX,MSECT,LVOUT, + > IFOUT1,NSURF2,NSURF1,IVOUT1,IMAT2,IVOL,KPOP, + > IFDOWN,MFACD,IMATD,ICDOWN,I3,IVAUX,ISC,ISS, + > ISSX,I2,I1,JS,MFACU,IMAT0,KPC,IVOUT2,NFAC,ICXX, + > IYY,NFXX,ICELLD,IXX,KPLD,IFACEU,IVOUT,IFACE, + > ICELLX,IMAT,LSV,I,IX,NCOUR,LIM2,ICELL,LIM1, + > ITAB,ICELL0,KFACE2,KFACED,KFACE1,KPER, + > IPOP,NCELZ,LFACE,KAM,KMA,KCEL1,IPP,ICELL2, + > IVDOWN,IPOS,IVUP,KUP,KDOWN,KMAT2,LVOIS,KC, + > IFF1,IXF,IFF0,IAC,MM,KPER3,IFG,IC,LAUX,KVOL2, + > KVOL1,IV01,IV02,K,ICYL,ISTEP,IFACE2,IFACE1, + > ICC,KPL,MFAC2,MFAC,MFAC1,IFF,IPAR,ICEL0,IC8, + > IPPP,IPX,KCEL2,JFF,ISURM,IVOLC,IETAG,KCELD,ISURC + DOUBLE PRECISION ANG0,DIST,YAUX,XAUX,TTHYP0,TTHYP1,THYP,XT,YT, + > YRF,YRH,PENTE,XPT,ATAN0,ANG2,ANG1,YPT,DEL0, + > YPH2,TGA,TT1,TT0,TTHYP,YPF,DEL1,ATAN1,YPH, + > COSR,SINR,R2AZ,ZZ,COAZ, + > CY0MIN,CY0MAX,DIV2,COS1I,DIV1,Y0MIN,Y0MAX,SAZ, + > TERM3,COEF1,TERM2,ZLA,TERM1,Z0,Z00,Z0MAX,COEF2, + > Z0MIN,COS2I,XZTMIN,ZTMAX,XZTMAX,SSS,Y0COS,ZTMIN, + > Y00,SSQ,CZMAX,ZZ0,CZMIN,CZX1,CZX2,XY02,Y0,XY01, + > DELTA,SDELTA,ALP,Z2,PASY,Z1,Y,X,ACOS6,PASZ,EPS1, + > EPS2,EPS3,EPS4,EPS5,EPS6,EPSY,EPSZ,EPSX,EPSS, + > YDEN2,R2,YDEN1,YDDD,YDEN,RSCOS2,POID1,AY,SCOS3, + > AX,TGDIR,SCOS2,AZ,SCOS1,TTT,ZP,ZM,T0MIN,T0MAX, + > TM,R,YYC,YCYL,XCYL,SDEL,TP,DEL,BZ,DEE,YDROIT, + > XDROIT,XMA2,XMA,XPA2,Y6,Y1,Y3,ZDROIT,Y4,XPA, + > YY,Y2,Y5,ZZZ,YUP,ZDOWN,ZUP,FACY,FACX,YDOWN, + > FTX,FTY + DOUBLE PRECISION AUX1,WEIGHT + DOUBLE PRECISION YT1,YT2,YT3,YT4,YT5,YT6,XT1,XT2,XT3,XT4,EPST,DZ0 + CHARACTER HSMG*131 +* +* FONCTION NECESSAIRE POUR LA ROTATION ET LA RECHERCHE +* DES SURFACES EXTERNES +* + IFONC(N,L)= 2+(N-1)*(L+3*(N-2)) + IFCOUR(N)=NINT( (4.+SQRT(1.+4.*FLOAT(N-1)/3.) + + +SQRT(1.+4.*FLOAT(N-2)/3.))*.25) +* +* TRACKING PAR RAPPORT AU PLAN YOZ. LES DIMENSIONS DU PLAN +* A TRACKER SONT DETERMINEES EN FONCTION DES ANGLES +* + DO 767 ITAB=1,5 + SURF1(ITAB)=0 + SURF2(ITAB)=0 + FACEM(ITAB)=0 + 767 CONTINUE + T(9)=1.0D30 + EPS1=1.0D-6 + EPST=EPS1*EPS1 + DZ0=0.0D0 + EPS2=2.0D0*EPS1 + EPS3=5.0D0*EPS1 + EPS4=1.0D-2*EPS1 + EPS5=9.0D0*EPS1 + EPS6=10.0D0*EPS1 + EPSS=MAX(EPS1*ABS(COS1),EPS1*ABS(COS2)) + EPSS=MAX(EPSS,EPS1*ABS(COS3)) + EPSX=EPSS + EPSY=EPSS + EPSZ=EPSS + PASZ=PAS2 + PASY=PAS1 + Z1=0.0 + Z2=0.0 + NCOUR=1 + IF(STAIRS(1).GT.1)NCOUR=IFCOUR(STAIRS(1)) + LIM2=STAIRS(1) + LIM1=IFONC(NCOUR,0) + ACOS6=.5*SQRT3*A + X=0. + Y=0. + ICELL=1 + ICELL0=0 + KPER=0 + IPOP=0 + KFACE1=9 + KFACE2=9 + KFACED=9 + LGOUT1=.FALSE. + LGOUTD=.FALSE. + LGOUTU=.FALSE. + LGDEB=.TRUE. + LGPAS0=.FALSE. + LGMAT3=.FALSE. + START=.TRUE. + DIRUP=.TRUE. + NCELZ=2*NCEL + LGDIM=NDIM.EQ.3 + LFACE=6 + SCOS1=COS1*COS1 + SCOS2=COS2*COS2 + AZ=SCOS1+SCOS2 + LGPG1=.FALSE. + TGDIR=COS2/COS1 + YDDD=SQRT3*TGDIR + YDEN=1.+YDDD + YDEN1=-1.+YDDD + YDEN2=1.-YDDD + ICDOWN=0 + ICELLD=0 + ICELLX=0 + IETAG=0 + IFDOWN=0 + IMAT2=0 + IMATD=0 + ISURC=0 + ISURM=0 + IVOLC=0 + KCEL1=0 + KCEL2=0 + KCELD=0 + KMAX=0 + KPER3=0 + KPL=0 + KPOP=0 + KSECT=0 + LPOP=0 + MFACD=0 + NSURF1=0 + IF(LGDIM) THEN + R2=RAYON*RAYON + SCOS3=COS3*COS3 + AX=SCOS2+SCOS3 + AY=SCOS1+SCOS3 + RSCOS2=R2*SCOS2 + LGPG1=IPLANZ.GT.1 + LFACE=8 + POID1=POIDS +* +*--L'ASSEMBLAGE A TRAITER EST CONFINE DANS UN CYLINDRE DE RAYON=RAYON +* FERME PAR DEUX CALOTTES SPHERIQUES A CES EXTREMITES +* + ALP=SCOS1+SCOS3 + ZLA=SCOS1/R2 +* +*--EXTEMUMS DE Z0: LIMITES SELON L'AXE Z DU PLAN A TRACKER +* + TERM1=SCOS1+SCOS2*SCOS3 + TERM2=-SCOS1+SCOS2*SCOS3 + TERM3=RAYON/(COS1*SQRT((1.-SCOS3)*TERM1)) + COEF1=TERM3*TERM1 + COEF2=TERM3*TERM2 + Z0MIN=ZMIN+COEF1 + Z0MIN=MIN(Z0MIN,ZMIN-COEF1) + Z0MIN=MIN(Z0MIN,ZMIN+COEF2) + Z0MIN=MIN(Z0MIN,ZMIN-COEF2) + Z0MAX=ZMAX+COEF1 + Z0MAX=MAX(Z0MAX,ZMAX-COEF1) + Z0MAX=MAX(Z0MAX,ZMAX+COEF2) + Z0MAX=MAX(Z0MAX,ZMAX-COEF2) + PASZ=(Z0MAX-Z0MIN)*PAS2 + Z0=Z0MIN+PASZ*.5 + Z00=Z0 + SAZ=SQRT(AZ) + CY0MIN=-RAYON*SAZ/ABS(COS1) + CY0MAX=-CY0MIN + COAZ=COS3/AZ + R2AZ=R2*AZ + ZZ=RAYON*ABS(COS3*COS2/(COS1*SAZ)) + Y0MIN=999999.0 + Y0MAX=-Y0MIN + ELSE + R2=0.0D0 + POID1=0.0D0 + RSCOS2=0.0D0 + ALP=0.0D0 + ZLA=0.0D0 + CY0MIN=0.0D0 + CY0MAX=0.0D0 + COAZ=0.0D0 + R2AZ=0.0D0 + ZZ=0.0D0 + Z0=0.0D0 + Z00=0.0D0 + Y0MIN=-RAYON/ABS(COS1) + Y0MAX=-Y0MIN + PASY=(Y0MAX-Y0MIN)*PAS1 + POIDS=POIDS*PASY + Z0MIN=999999.0 + Z0MAX=-Z0MIN + ENDIF + DIV1=1./(COS2+COS1*SQRT3) + DIV2=1./(COS2-COS1*SQRT3) + COS1I=1./COS1 + COS2I=1./COS2 + 777 CONTINUE + ILINE=0 + IF(LGDIM) THEN +* +*--DOMAINE DE VARIATION DE Y0 POUR Z0 FIXE +* + CZX1=Z0-ZZ + CZX2=Z0+ZZ + CZMIN=MIN(CZX1,CZX2) + CZMAX=MAX(CZX1,CZX2) + IF(CZMAX.LT.ZMIN)THEN + ZZ0=Z0-ZMIN + DELTA=-ZLA*ZZ0*ZZ0+ALP + IF(DELTA.GE.0.) THEN + SDELTA=SQRT(DELTA) + XY01=ZZ0*COS2*COS3 + XY02=RAYON*SDELTA + Y0MIN=(XY01-XY02)/ALP + Y0MAX=(XY01+XY02)/ALP + ELSE + CALL XABORT('TRKHEX: ALGORITHME FAILURE -A') + ENDIF + ELSEIF(CZMIN.LT.ZMAX)THEN + Y0MIN=CY0MIN + Y0MAX=CY0MAX + ELSE + ZZ0=Z0-ZMAX + DELTA=-ZLA*ZZ0*ZZ0+ALP + IF(DELTA.GE.0.) THEN + SDELTA=SQRT(DELTA) + XY01=ZZ0*COS2*COS3 + XY02=RAYON*SDELTA + Y0MIN=(XY01-XY02)/ALP + Y0MAX=(XY01+XY02)/ALP + ELSE + CALL XABORT('TRKHEX: ALGORITHME FAILURE - B') + ENDIF + ENDIF + PASY=(Y0MAX-Y0MIN)*PAS1 + POIDS=POID1*PASZ*PASY + Y0=Y0MIN + ILINE=ILINE+1 + 611 SSQ=SCOS1*(R2-Y0*Y0)+RSCOS2 + IF(SSQ.GT.0.) THEN + SSS=SQRT(SSQ) + Y0COS=Y0*COS2 + XZTMAX=Z0+(SSS-Y0COS)*COAZ + XZTMIN=Z0+(-SSS-Y0COS)*COAZ + ZTMAX=MAX(XZTMAX,XZTMIN) + ZTMIN=MIN(XZTMAX,XZTMIN) + IF(ZTMAX.LT.ZMIN) THEN + Y0=Y0+PASY + IF(Y0.GT.Y0MAX) GOTO 53 + GOTO 611 + ELSEIF(ZTMIN.GT.ZMAX) THEN + Y0=Y0+PASY + IF(Y0.GT.Y0MAX) GOTO 53 + GOTO 611 + ENDIF + ENDIF + ELSE + Y0=Y0MIN+PASY*.5 + ILINE=ILINE+1 + ENDIF + Y00=Y0 + LGDEB=.TRUE. + IX=1 + I=CORN(1) + LGPER=.FALSE. + GOTO 42 +* +* INTERSECTION DES PLANS DE L'HEXAGONE AVEC LA DROITE +* + 10 YY=Y-Y0 + TERM1=SQRT3*(X+A) + TERM2=SQRT3*(X-A) + T(1)=(TERM1+YY)*DIV1 + T(2)=(YY+ACOS6)*COS2I + T(3)=(YY-TERM2)*DIV2 + T(4)=(YY+TERM2)*DIV1 + T(5)=(YY-ACOS6)*COS2I + T(6)=(YY-TERM1)*DIV2 + IF(LGDIM) THEN + Z2=REMESH(NCELZ+ICELL) + IF(LGPG1) THEN + IF(ICELL.GT.STAIRS(1))THEN + KPL=INT(AINT(REAL(ICELL)/REAL(STAIRS(1)))) + IF(MOD(ICELL,STAIRS(1)).NE.0)KPL=KPL+1 + ICC=ICELL-STAIRS(KPL-1) + IF(KPL.GT.2)ICC=ICC+STAIRS(KPL-2) + Z1=REMESH(NCELZ+ICC) + GOTO 14 + ENDIF + ENDIF + 14 T(7)=(Z1-Z0)/COS3 + T(8)=(Z2-Z0)/COS3 + ZDR(1)=COS3*T(1)+Z0 + ZDR(2)=COS3*T(2)+Z0 + ZDR(3)=COS3*T(3)+Z0 + ZDR(4)=COS3*T(4)+Z0 + ZDR(5)=COS3*T(5)+Z0 + ZDR(6)=COS3*T(6)+Z0 + ZDR(7)=Z1 + XDR(7)=COS1*T(7) + YDR(7)=COS2*T(7)+Y0 + XDR(8)=COS1*T(8) + YDR(8)=COS2*T(8)+Y0 + ZDR(8)=Z2 + ENDIF + XDR(1)=COS1*T(1) + YDR(1)=SQRT3*(X-XDR(1)+A)+Y + XDR(2)=COS1*T(2) + YDR(2)=Y+ACOS6 + XDR(3)=COS1*T(3) + YDR(3)=SQRT3*(-X+A+XDR(3))+Y + XDR(4)=COS1*T(4) + YDR(4)=SQRT3*(X-XDR(4)-A)+Y + XDR(5)=COS1*T(5) + YDR(5)=Y-ACOS6 + XDR(6)=COS1*T(6) + YDR(6)=SQRT3*(-X+XDR(6)-A)+Y +* +* RECHERCHE DES FACES DE SORTIE +* + 15 IFACE2=9 + IFACE1=9 + MFAC=0 + MFAC1=0 + MFAC2=0 + LGFAC=.FALSE. + LGPASU=.FALSE. + LGPASD=.FALSE. + Y2=Y+ACOS6 + Y5=Y-ACOS6 + XPA=X+A + XMA=X-A + XPA2=X+.5*A + XMA2=X-.5*A + DO 20 I=1,LFACE + YDROIT=YDR(I) + XDROIT=XDR(I) + IF(LGDIM) THEN + ZDROIT=ZDR(I) + IF((ZDROIT.LE.Z2.OR.ABS(ZDROIT-Z2).LE.EPSZ).AND. + + (ZDROIT.GE.Z1.OR.ABS(ZDROIT-Z1).LE.EPSZ)) GOTO 17 + GOTO 19 + ENDIF + 17 IF((YDROIT.GE.Y5.OR.ABS(YDROIT-Y5).LE.EPSY).AND. + + (YDROIT.LE.Y2.OR.ABS(YDROIT-Y2).LE.EPSY))THEN + IF((XDROIT.GE.XMA.OR.ABS(XDROIT-XMA).LE.EPSX).AND. + + (XDROIT.LE.XPA.OR.ABS(XDROIT-XPA).LE.EPSX))THEN + Y4=SQRT3*(X-XDROIT-A)+Y + Y3=SQRT3*(-X+A+XDROIT)+Y + Y6=SQRT3*(-X+XDROIT-A)+Y + Y1=SQRT3*(X-XDROIT+A)+Y + IF(ABS(YDROIT-Y2).LT.EPSY) THEN + IF(((XDROIT.GE.XMA2).OR.ABS(XDROIT-XMA2).LE.EPSX).AND. + + ((XDROIT.LE.XPA2).OR.ABS(XDROIT-XPA2).LE.EPSX))GOTO 18 + GOTO 19 + ELSEIF(ABS(YDROIT-Y5).LT.EPSY) THEN + IF(((XDROIT.GE.XMA2).OR.ABS(XDROIT-XMA2).LE.EPSX).AND. + + ((XDROIT.LE.XPA2).OR.ABS(XDROIT-XPA2).LE.EPSX))GOTO 18 + GOTO 19 + ELSEIF(ABS(YDROIT-Y1).LT.EPSY) THEN + GOTO 18 + ELSEIF(ABS(YDROIT-Y3).LT.EPSY) THEN + GOTO 18 + ELSEIF(ABS(YDROIT-Y4).LT.EPSY) THEN + GOTO 18 + ELSEIF(ABS(YDROIT-Y6).LT.EPSY) THEN + GOTO 18 + ELSEIF(I.EQ.7) THEN + IF(XDROIT.GE.XMA2.AND.XDROIT.LE.XPA2)THEN + GOTO 18 + ELSEIF(XDROIT.GE.XMA.AND.XDROIT.LE.XMA2)THEN + IF(((YDROIT.GE.Y4).OR.ABS(YDROIT-Y4).LE.EPSY).AND. + + ((YDROIT.LE.Y3).OR.ABS(YDROIT-Y3).LE.EPSY))GOTO 18 + GOTO 19 + ELSEIF(XDROIT.GE.XPA2.AND.XDROIT.LE.XPA)THEN + IF(((YDROIT.GE.Y6).OR.ABS(YDROIT-Y6).LE.EPSY).AND. + + ((YDROIT.LE.Y1).OR.ABS(YDROIT-Y1).LE.EPSY))GOTO 18 + GOTO 19 + ENDIF + ELSEIF(I.EQ.8) THEN + IF(XDROIT.GE.XMA2.AND.XDROIT.LE.XPA2)THEN + GOTO 18 + ELSEIF(XDROIT.GE.XMA.AND.XDROIT.LE.XMA2)THEN + IF(((YDROIT.GE.Y4).OR.ABS(YDROIT-Y4).LE.EPSY).AND. + + ((YDROIT.LE.Y3).OR.ABS(YDROIT-Y3).LE.EPSY))GOTO 18 + GOTO 19 + ELSEIF(XDROIT.GE.XPA2.AND.XDROIT.LE.XPA)THEN + IF(((YDROIT.GE.Y6).OR.ABS(YDROIT-Y6).LE.EPSY).AND. + + ((YDROIT.LE.Y1).OR.ABS(YDROIT-Y1).LE.EPSY))GOTO 18 + GOTO 19 + ENDIF + ELSE + CALL XABORT('TRKHEX: ALGORITHME FAILURE - C') + ENDIF + GOTO 19 + 18 IF(IFACE1.NE.9) THEN + MFAC=MFAC+1 + FACEM(MFAC)=IFACE1 + ENDIF + IFACE1=IFACE2 + IFACE2=I + ENDIF + ENDIF + 19 CONTINUE + 20 CONTINUE +* +* CAS OU LA FACE N'A PAS ETE COMPTE +* + DO 720 IFF=1,LFACE + IF(IFF.NE.IFACE1.AND.IFACE2.NE.IFF) THEN + FTX=ABS(T(IFACE1)-T(IFF)) + FTY=ABS(T(IFACE2)-T(IFF)) + IF(FTX.LE.EPS2) THEN + DO 715 JFF=1,MFAC + IF(FACEM(JFF).EQ.IFF) GOTO 718 + 715 CONTINUE + IF(IFACE2.EQ.9)THEN + IFACE2=IFF + ELSE + MFAC=MFAC+1 + FACEM(MFAC)=IFF + ENDIF + ELSEIF(FTY.LE.EPS2) THEN + DO 717 JFF=1,MFAC + IF(FACEM(JFF).EQ.IFF) GOTO 718 + 717 CONTINUE + IF(IFACE1.EQ.9)THEN + IFACE1=IFF + ELSE + MFAC=MFAC+1 + FACEM(MFAC)=IFF + ENDIF + ENDIF + ENDIF + 718 CONTINUE + 720 CONTINUE + IF(IFACE1.EQ.8) THEN + IPX=IFACE1 + IFACE1=IFACE2 + IFACE2=IPX + ELSEIF(IFACE2.EQ.7) THEN + IPX=IFACE1 + IFACE1=IFACE2 + IFACE2=IPX + ENDIF + LGFAC=MFAC.GT.0 + IF(IFACE1.GT.8.OR.IFACE2.GT.8) THEN +* +* CAS OU LA DROITE EST TANGENTE A UNE CELLULE PERIPHERIQUE +* + IF(LGDEB) THEN + I=ICELL+1 + IF(I.GT.NCEL) GOTO 58 + GOTO 42 + ENDIF + KPER=KPER+1 + MAT2(KPER)=ICELL + IF(DIRUP) THEN + IF(LGOUTU) THEN + ICELL=KCEL2 + IFACE2=KFACE2 + GOTO 739 + ENDIF + ELSE + IF(LGOUTD) THEN + ICELL=KCELD + IFACE1=KFACED + GOTO 739 + ENDIF + ENDIF + IF(LGPAS0) GOTO 56 + ISURC=1 + IETAG=0 + ISURM=6 + SURC(1)=1 + SURC(2)=2 + SURC(3)=3 + SURC(4)=4 + SURC(5)=5 + SURC(6)=6 + IF(LGDIM) THEN + IF(ICELL.LE.STAIRS(1)) THEN + IVOLC=ICELL + I=VOISIN(1,IVOLC) + ELSE + IVOLC=ICELL-STAIRS(KPL-1) + ISURC=0 + I=IVOLC + IF(DIRUP) THEN + IF(KPL.GT.2) IETAG=STAIRS(KPL-2) + ELSE + IF(KPL.EQ.IPLANZ) THEN + IETAG=STAIRS(KPL-1) + ELSE + IETAG=STAIRS(KPL) + ENDIF + ENDIF + ENDIF + ELSE + IVOLC=ICELL + I=VOISIN(1,IVOLC) + ENDIF + LGPAS0=.TRUE. + IF(I.GT.NCEL2) THEN + I=NCEL+10 + GOTO 56 + ENDIF + I=I+IETAG + LGPER=.TRUE. + GOTO 42 + ENDIF +* +*--RECHERCHE DU PLUS GRAND PARCOURS +* + IF(LGFAC) THEN + IF(T(IFACE1).GT.T(IFACE2))THEN + IPPP=IFACE2 + IFACE2=IFACE1 + IFACE1=IPPP + ENDIF + DO 730 IPAR=1,MFAC + IF(T(FACEM(IPAR)).GT.T(IFACE2))THEN + IPPP=IFACE2 + IFACE2=FACEM(IPAR) + FACEM(IPAR)=IPPP + ELSEIF(T(FACEM(IPAR)).LT.T(IFACE1))THEN + IPPP=IFACE1 + IFACE1=FACEM(IPAR) + FACEM(IPAR)=IPPP + ENDIF + 730 CONTINUE + ENDIF +* + IF(LGDIM) THEN + IF(ABS(COS3).GT.EPS1) THEN + ZUP=COS3*T(IFACE2)+Z0 + ZDOWN=COS3*T(IFACE1)+Z0 +* +* CAS OU IFACE1 ET IFACE2 FORMENT LE MEME COIN +* + IF(ZUP.LT.ZDOWN) THEN + IFF=IFACE1 + IFACE1=IFACE2 + IFACE2=IFF + ZZZ=ZUP + ZUP=ZDOWN + ZDOWN=ZUP + ENDIF + ELSE + YUP=COS2*T(IFACE2)+Y0 + YDOWN=COS2*T(IFACE1)+Y0 + IF(YUP.LT.YDOWN) THEN + IFF=IFACE1 + IFACE1=IFACE2 + IFACE2=IFF + ENDIF + ENDIF +* +* ON PREND LA FACE 7 OU 8 DANS LE CAS D'UN COIN +* + IF(LGFAC) THEN + DO 21 IC8=1,MFAC + IF(FACEM(IC8).EQ.8) THEN + FACEM(IC8)=IFACE2 + IFACE2=8 + ELSEIF(FACEM(IC8).EQ.7) THEN + FACEM(IC8)=IFACE1 + IFACE1=7 + ENDIF + 21 CONTINUE + ENDIF + IF(IFACE2.EQ.7)THEN + IFF=IFACE2 + IFACE2=IFACE1 + IFACE1=IFF + ENDIF + IF(IFACE1.EQ.8)THEN + IFF=IFACE2 + IFACE2=IFACE1 + IFACE1=IFF + ENDIF + ELSE + YUP=COS2*T(IFACE2)+Y0 + YDOWN=COS2*T(IFACE1)+Y0 + IF(YUP.LT.YDOWN) THEN + IFF=IFACE1 + IFACE1=IFACE2 + IFACE2=IFF + ENDIF + ENDIF + MFAC1=0 + MFAC2=0 +* +* STOCKAGE POUR LE TRAITEMENT DES FACES DU COIN +* + IF(LGFAC)THEN + DO 301 IFF=1,MFAC + FACX=ABS(T(FACEM(IFF))-T(IFACE2)) + FACY=ABS(T(FACEM(IFF))-T(IFACE1)) + IF(FACY.LE.EPS1) THEN + MFAC1=MFAC1+1 + FACEM1(MFAC1)=FACEM(IFF) + IF(FACX.LE.EPS1) THEN + MFAC2=MFAC2+1 + FACEM2(MFAC2)=FACEM(IFF) + ENDIF + ELSEIF(FACX.LE.EPS1) THEN + MFAC2=MFAC2+1 + FACEM2(MFAC2)=FACEM(IFF) + ELSE + IF(FACX.LT.FACY) THEN + MFAC2=MFAC2+1 + FACEM2(MFAC2)=FACEM(IFF) + ELSE + MFAC1=MFAC1+1 + FACEM1(MFAC1)=FACEM(IFF) + ENDIF + ENDIF + 301 CONTINUE + ENDIF +* +* DETERMINATION DES FACES D'ENTREE OU DE SORTIE +* + IF(.NOT.LGDEB) THEN + ICEL0=ICELL + ISTEP=0 + IF(ICELL.GT.STAIRS(1)) THEN + ISTEP=STAIRS(KPL-1) + ICEL0=ICELL-ISTEP + ENDIF + IXF=0 + LGG=.TRUE. + LGG1=.FALSE. + IF(DIRUP) THEN + IFF0=IFACE1 + IFF1=IFACE2 + IFF=IFACE1 + 554 CONTINUE + IF(IFF.LT.7) THEN + LVOIS=VOISIN(IFF,ICEL0)+ISTEP + ELSE + LVOIS=ICELL-STAIRS(1) + ENDIF + IF(LVOIS.EQ.ICELL0) THEN + IFACE1=IFF + IF(LGG1)FACEM1(IXF)=IFF0 + GOTO 556 + ENDIF + IXF=IXF+1 + LGG1=.FALSE. + IF(IXF.LE.MFAC1) THEN + IFF=FACEM1(IXF) + LGG1=.TRUE. + GOTO 554 + ENDIF + IF(LGG) THEN + LGG=.FALSE. + IF(ABS(T(IFF0)-T(IFACE2)).LE.EPS6) THEN + IFF=IFACE2 + IFACE2=IFACE1 + GOTO 554 + ENDIF + ENDIF + IFACE1=IFF0 + IFACE2=IFF1 + ELSE + IFF0=IFACE2 + IFF1=IFACE1 + IFF=IFACE2 + 557 CONTINUE + IF(IFF.LT.7) THEN + LVOIS=VOISIN(IFF,ICEL0)+ISTEP + ELSE + LVOIS=ICELL+STAIRS(1) + ENDIF + IF(LVOIS.EQ.ICELL0) THEN + IFACE2=IFF + IF(LGG1)FACEM2(IXF)=IFF0 + GOTO 556 + ENDIF + IXF=IXF+1 + LGG1=.FALSE. + IF(IXF.LE.MFAC2) THEN + LGG1=.TRUE. + IFF=FACEM2(IXF) + GOTO 557 + ENDIF + IF(LGG) THEN + LGG=.FALSE. + IF(ABS(T(IFF0)-T(IFACE1)).LE.EPS6) THEN + IFF=IFACE1 + IFACE1=IFACE2 + GOTO 557 + ENDIF + ENDIF + IFACE2=IFF0 + IFACE1=IFF1 + ENDIF + ENDIF + 556 CONTINUE + ICELL0=ICELL +* +* ELEMINATION DES PARCOURS NULS SAUF LE DERNIER. +* + IF(ABS(T(IFACE1)-T(IFACE2)).GT.EPS1) GO TO 930 +* + KPER=KPER+1 + MAT2(KPER)=ICELL + IF(LGDEB) THEN + I=ICELL+1 + IF(I.GT.NCEL) GOTO 58 + GOTO 42 + ENDIF + ISURC=1 + IETAG=0 + ISURM=6 + SURC(1)=1 + SURC(2)=2 + SURC(3)=3 + SURC(4)=4 + SURC(5)=5 + SURC(6)=6 + IF(LGDIM) THEN + IF(ICELL.LE.STAIRS(1)) THEN + IVOLC=ICELL + IF(.NOT.LGFAC) THEN + IF(DIRUP) THEN + IF(IFACE2.LT.8) THEN + I=VOISIN(IFACE2,ICELL) + IF(I.GT.NCEL2) THEN + KPER=KPER-1 + ISURC=0 + GOTO 931 + ELSEIF(IFACE1.LT.7) THEN + IF(VOISIN(IFACE1,ICELL).GT.NCEL2)THEN + IFF=IFACE1 + IFACE1=IFACE2 + IFACE2=IFF + KPER=KPER-1 + ISURC=0 + GOTO 931 + ENDIF + ENDIF + ISURM=1 + SURC(1)=IFACE2 + IF(IFACE1.LT.7) THEN + ISURM=2 + SURC(2)=IFACE1 + ENDIF + ELSE + IF(IPLANZ.EQ.1) THEN + KPER=KPER-1 + ISURC=0 + GOTO 930 + ENDIF + IF(IFACE1.LT.7) THEN + IF(VOISIN(IFACE1,ICELL).GT.NCEL2)THEN + IFF=IFACE1 + IFACE1=IFACE2 + IFACE2=IFF + KPER=KPER-1 + ISURC=0 + GOTO 931 + ENDIF + ENDIF + ISURM=1 + SURC(1)=IFACE1 + ENDIF + ELSE + IF(IFACE1.LT.7) THEN + I=VOISIN(IFACE1,ICELL) + IF(I.GT.NCEL2) THEN + KPER=KPER-1 + ISURC=0 + GOTO 931 + ENDIF + IF(IFACE2.LT.7) THEN + IF(VOISIN(IFACE2,ICELL).GT.NCEL2)THEN + IFF=IFACE1 + IFACE1=IFACE2 + IFACE2=IFF + KPER=KPER-1 + ISURC=0 + GOTO 931 + ENDIF + ENDIF + ISURM=1 + SURC(1)=IFACE1 + IF(IFACE2.LT.7) THEN + ISURM=2 + SURC(2)=IFACE2 + ENDIF + ELSE + KPER=KPER-1 + ISURC=0 + GOTO 930 + ENDIF + ENDIF + ELSE + ISURM=1 + IF(IFACE2.EQ.8) THEN + ISURM=ISURM-1 + ELSE + SURC(ISURM)=IFACE2 + ENDIF + ISURM=ISURM+1 + IF(IFACE1.EQ.7) THEN + ISURM=ISURM-1 + ELSE + SURC(ISURM)=IFACE1 + ENDIF + DO 111 KC=1,MFAC + IF(FACEM(KC).LT.7) THEN + ISURM=ISURM+1 + SURC(ISURM)=FACEM(KC) + ENDIF + 111 CONTINUE + I=VOISIN(SURC(1),IVOLC) + ENDIF + ELSE + IVOLC=ICELL-STAIRS(KPL-1) + IF(.NOT.LGFAC) THEN + IF(DIRUP) THEN + IF(IFACE2.LT.8) THEN + IF(IFACE2.EQ.7) THEN + IFG=IFACE1 + IFACE1=IFACE2 + IFACE2=IFG + ENDIF + IF(VOISIN(IFACE2,IVOLC).GT.NCEL2) THEN + KPER=KPER-1 + ISURC=0 + GOTO 931 + ELSEIF(IFACE1.LT.7) THEN + IF(VOISIN(IFACE1,IVOLC).GT.NCEL2) THEN + IFF=IFACE2 + IFACE2=IFACE1 + IFACE1=IFF + KPER=KPER-1 + ISURC=0 + GOTO 931 + ENDIF + ENDIF + ISURM=1 + SURC(1)=IFACE2 + IF(IFACE1.LT.7) THEN + ISURM=2 + SURC(2)=IFACE1 + ENDIF + ELSEIF(KPL.EQ.IPLANZ) THEN + KPER=KPER-1 + ISURC=0 + GOTO 930 + ELSE + ISURM=1 + SURC(1)=IFACE1 + ENDIF + ELSE + IF(IFACE1.LT.7) THEN + IF(VOISIN(IFACE1,IVOLC).GT.NCEL2) THEN + KPER=KPER-1 + ISURC=0 + GOTO 931 + ELSEIF(IFACE2.LT.7) THEN + IF(VOISIN(IFACE2,IVOLC).GT.NCEL2) THEN + IFF=IFACE2 + IFACE2=IFACE1 + IFACE1=IFF + KPER=KPER-1 + ISURC=0 + GOTO 931 + ENDIF + ENDIF + ISURM=1 + SURC(1)=IFACE1 + IF(IFACE2.LT.7) THEN + ISURM=2 + SURC(2)=IFACE2 + ENDIF + ELSEIF(KPL.EQ.1) THEN + KPER=KPER-1 + ISURC=0 + GOTO 930 + ELSE + ISURM=1 + SURC(1)=IFACE2 + ENDIF + ENDIF + ELSE + ISURM=1 + IF(IFACE2.EQ.8) THEN + ISURM=ISURM-1 + ELSE + SURC(ISURM)=IFACE2 + ENDIF + ISURM=ISURM+1 + IF(IFACE1.EQ.7) THEN + ISURM=ISURM-1 + ELSE + SURC(ISURM)=IFACE1 + ENDIF + DO 222 KC=1,MFAC + IF(FACEM(KC).LT.7) THEN + ISURM=ISURM+1 + SURC(ISURM)=FACEM(KC) + ENDIF + 222 CONTINUE + ENDIF + ISURC=0 + I=IVOLC + IF(DIRUP) THEN + IF(KPL.GT.2) THEN + IETAG=STAIRS(KPL-2) + ENDIF + ELSE + IF(KPL.EQ.IPLANZ) THEN + IETAG=STAIRS(KPL-1) + ELSE + IETAG=STAIRS(KPL) + ENDIF + ENDIF + ENDIF + ELSE + IF(.NOT.LGFAC) THEN + IF(DIRUP) THEN + IF(VOISIN(IFACE2,ICELL).GT.NCEL2) THEN + KPER=KPER-1 + ISURC=0 + GOTO 931 + ENDIF + ELSE + IF(VOISIN(IFACE1,ICELL).GT.NCEL2) THEN + KPER=KPER-1 + ISURC=0 + GOTO 931 + ENDIF + ENDIF + ISURM=2 + SURC(1)=IFACE2 + SURC(2)=IFACE1 + ELSE + DO 333 IC=1,MFAC + ISURM=ISURM+1 + SURC(ISURM)=FACEM(IC) + 333 CONTINUE + ENDIF + IVOLC=ICELL + I=VOISIN(SURC(1),IVOLC) + ENDIF + LGPAS0=.TRUE. + LGPER=.TRUE. + IF(I.GT.NCEL2) THEN + I=NCEL+10 + GOTO 56 + ENDIF + I=I+IETAG + ICELL0=IVOLC+IETAG + GOTO 42 + 931 CONTINUE + 930 LGDEB=.FALSE. +* +* STOKAGE DES ANCIENS VOLUMES PARCOURUS +* + IF(ABS(T(IFACE1)-T(IFACE2)).GE.EPS3) THEN + IF(LGMAT3) THEN + DO 555 IAC=1,KPER3 + KPER=KPER+1 + MAT2(KPER)=MAT3(IAC) + 555 CONTINUE + ENDIF + LGMAT3=.FALSE. + KPER3=0 + ENDIF +* +* CALCUL DES PARCOURS OPTIQUE. LA CELLULE PEUT CONTENIR DES +* CYLINDRES D'AXES DIFFERENTS +* + KPER=KPER+1 + IF(KPER.GT.NCEL+10) THEN + GOTO 384 + ENDIF + MAT2(KPER)=ICELL +* +* COMPTAGE DES CELLULES DU COIN EN PERIPHERIE DANS MAT2 +* + LGOUT1=.FALSE. + LGOUTU=.FALSE. + IF(LGFAC) THEN + DO 812 MM=1,MFAC1 + IF(FACEM1(MM).LT.7) THEN + IF(ICELL.LE.STAIRS(1)) THEN + KMAT2=VOISIN(FACEM1(MM),ICELL) + IF(KMAT2.LE.NCEL2) THEN + IF(IFACE1.LT.7) THEN + IF(VOISIN(IFACE1,ICELL).GT.NCEL2) THEN + IPP=IFACE1 + IFACE1=FACEM1(MM) + FACEM1(MM)=IPP + IF(IPP.LT.7) THEN + KMAT2=VOISIN(IPP,ICELL) + IF(KMAT2.LE.LIM2) THEN + IF(KMAT2.GE.LIM1)THEN + KPER=KPER+1 + MAT2(KPER)=KMAT2 + ELSEIF(LGDIM)THEN + KPER=KPER+1 + MAT2(KPER)=KMAT2 + ENDIF + ENDIF + ENDIF + ELSE + IF(KMAT2.LE.LIM2) THEN + IF(KMAT2.GE.LIM1)THEN + LGMAT3=.TRUE. + KPER3=KPER3+1 + MAT3(KPER3)=KMAT2 + ELSEIF(LGDIM)THEN + LGMAT3=.TRUE. + KPER3=KPER3+1 + MAT3(KPER3)=KMAT2 + ENDIF + ELSEIF(LGDIM) THEN + LGMAT3=.TRUE. + KPER3=KPER3+1 + MAT3(KPER3)=KMAT2 + ENDIF + ENDIF + ELSE + IF(KMAT2.LE.LIM2) THEN + IF(KMAT2.GE.LIM1)THEN + LGMAT3=.TRUE. + KPER3=KPER3+1 + MAT3(KPER3)=KMAT2 + ELSEIF(LGDIM)THEN + LGMAT3=.TRUE. + KPER3=KPER3+1 + MAT3(KPER3)=KMAT2 + ENDIF + ELSEIF(LGDIM) THEN + LGMAT3=.TRUE. + KPER3=KPER3+1 + MAT3(KPER3)=KMAT2 + ENDIF + ENDIF + ENDIF + ELSE + ICELL2=ICELL-STAIRS(KPL-1) + KMAT2=VOISIN(FACEM1(MM),ICELL2) + IF(KMAT2.LE.NCEL2) THEN + IF(IFACE1.LT.7) THEN + IF(VOISIN(IFACE1,ICELL2).GT.NCEL2) THEN + IPP=IFACE1 + IFACE1=FACEM1(MM) + FACEM1(MM)=IPP + IF(IPP.EQ.7) THEN + KPER=KPER+1 + MAT2(KPER)=ICELL-STAIRS(KPL-1) + IF(KPL.GT.2)MAT2(KPER)=MAT2(KPER)+STAIRS(KPL-2) + ELSE + KMAT2=VOISIN(IPP,ICELL2) + IF(KMAT2.LE.LIM2) THEN + IF(KMAT2.GE.LIM1)THEN + KPER=KPER+1 + MAT2(KPER)=KMAT2 + ELSEIF(KPL.EQ.1)THEN + KPER=KPER+1 + MAT2(KPER)=KMAT2 + ENDIF + ENDIF + ENDIF + ELSE + IF(KMAT2.LE.LIM2) THEN + IF(KMAT2.GE.LIM1)THEN + LGMAT3=.TRUE. + KPER3=KPER3+1 + MAT3(KPER3)=KMAT2 + ELSEIF(KPL.EQ.1)THEN + LGMAT3=.TRUE. + KPER3=KPER3+1 + MAT3(KPER3)=KMAT2 + ENDIF + ELSEIF(KPL.EQ.1) THEN + LGMAT3=.TRUE. + KPER3=KPER3+1 + MAT3(KPER3)=KMAT2 + ENDIF + ENDIF + ELSE + IF(KMAT2.LE.LIM2) THEN + IF(KMAT2.GE.LIM1)THEN + LGMAT3=.TRUE. + KPER3=KPER3+1 + MAT3(KPER3)=KMAT2 + ELSEIF(KPL.EQ.1)THEN + LGMAT3=.TRUE. + KPER3=KPER3+1 + MAT3(KPER3)=KMAT2 + ENDIF + ELSEIF(KPL.EQ.1) THEN + LGMAT3=.TRUE. + KPER3=KPER3+1 + MAT3(KPER3)=KMAT2 + ENDIF + ENDIF + ELSE + LGOUT1=.TRUE. + KCEL1=ICELL + KFACE1=FACEM1(MM) + ENDIF + ENDIF + ENDIF + 812 CONTINUE + DO 813 MM=1,MFAC2 + IF(FACEM2(MM).LT.7) THEN + IF(ICELL.LE.STAIRS(1)) THEN + KMAT2=VOISIN(FACEM2(MM),ICELL) + IF(KMAT2.LE.NCEL2) THEN + IF(IFACE2.LT.7) THEN + IF(VOISIN(IFACE2,ICELL).GT.NCEL2) THEN + IPP=IFACE2 + IFACE2=FACEM2(MM) + FACEM2(MM)=IPP + IF(IPP.EQ.8) THEN + KPER=KPER+1 + MAT2(KPER)=ICELL+STAIRS(1) + ELSE + KAM=VOISIN(IPP,ICELL) + IF(KAM.LE.LIM2) THEN + IF(KAM.GE.LIM1)THEN + KPER=KPER+1 + MAT2(KPER)=KAM + ELSEIF(LGDIM) THEN + KPER=KPER+1 + MAT2(KPER)=KAM + ENDIF + ENDIF + ENDIF + ELSE + IF(KMAT2.GE.LIM1)THEN + LGMAT3=.TRUE. + KPER3=KPER3+1 + MAT3(KPER3)=KMAT2 + ELSEIF(LGDIM) THEN + LGMAT3=.TRUE. + KPER3=KPER3+1 + MAT3(KPER3)=KMAT2 + ENDIF + ENDIF + ELSE + IF(KMAT2.GE.LIM1)THEN + LGMAT3=.TRUE. + KPER3=KPER3+1 + MAT3(KPER3)=KMAT2 + ELSEIF(LGDIM) THEN + LGMAT3=.TRUE. + KPER3=KPER3+1 + MAT3(KPER3)=KMAT2 + ENDIF + ENDIF + ELSE + KFACE2=FACEM2(MM) + KCEL2=ICELL + LGOUTU=.TRUE. + ENDIF + ELSE + ICELL2=ICELL-STAIRS(KPL-1) + KMAT2=VOISIN(FACEM2(MM),ICELL2) + IF(KMAT2.LE.NCEL2) THEN + IF(IFACE2.LT.7) THEN + IF(VOISIN(IFACE2,ICELL2).GT.NCEL2) THEN + IPP=IFACE2 + IFACE2=FACEM2(MM) + FACEM2(MM)=IPP + IF(IPP.EQ.8) THEN + IF(ICELL2.LE.LIM2) THEN + IF(ICELL2.GE.LIM1) THEN + LGMAT3=.TRUE. + KPER3=KPER3+1 + MAT3(KPER3)=ICELL2+STAIRS(KPL) + ELSEIF(KPL.EQ.IPLANZ-1) THEN + LGMAT3=.TRUE. + KPER3=KPER3+1 + MAT3(KPER3)=ICELL2+STAIRS(KPL) + ENDIF + ELSEIF(KPL.EQ.IPLANZ-1)THEN + LGMAT3=.TRUE. + KPER3=KPER3+1 + MAT3(KPER3)=ICELL2+STAIRS(KPL) + ENDIF + ELSE + KMA=VOISIN(IPP,ICELL2) + IF(KMA.LE.LIM2) THEN + IF(KMA.GE.LIM1) THEN + LGMAT3=.TRUE. + KPER3=KPER3+1 + MAT3(KPER3)=KMA+STAIRS(KPL-1) + ELSEIF(KPL.EQ.IPLANZ) THEN + LGMAT3=.TRUE. + KPER3=KPER3+1 + MAT3(KPER3)=KMA+STAIRS(KPL-1) + ENDIF + ELSEIF(KPL.EQ.IPLANZ)THEN + LGMAT3=.TRUE. + KPER3=KPER3+1 + MAT3(KPER3)=KMA+STAIRS(KPL-1) + ENDIF + ENDIF + ELSE + IF(KMAT2.LE.LIM2) THEN + IF(KMAT2.GE.LIM1) THEN + LGMAT3=.TRUE. + KPER3=KPER3+1 + MAT3(KPER3)=KMAT2+STAIRS(KPL-1) + ELSEIF(KPL.EQ.IPLANZ) THEN + LGMAT3=.TRUE. + KPER3=KPER3+1 + MAT3(KPER3)=KMAT2+STAIRS(KPL-1) + ENDIF + ELSEIF(KPL.EQ.IPLANZ)THEN + LGMAT3=.TRUE. + KPER3=KPER3+1 + MAT3(KPER3)=KMAT2+STAIRS(KPL-1) + ENDIF + ENDIF + ELSE + IF(KMAT2.LE.LIM2) THEN + IF(KMAT2.GE.LIM1) THEN + LGMAT3=.TRUE. + KPER3=KPER3+1 + MAT3(KPER3)=KMAT2+STAIRS(KPL-1) + ELSEIF(KPL.EQ.IPLANZ) THEN + LGMAT3=.TRUE. + KPER3=KPER3+1 + MAT3(KPER3)=KMAT2+STAIRS(KPL-1) + ENDIF + ELSEIF(KPL.EQ.IPLANZ)THEN + LGMAT3=.TRUE. + KPER3=KPER3+1 + MAT3(KPER3)=KMAT2+STAIRS(KPL-1) + ENDIF + ENDIF + ELSE + KFACE2=FACEM2(MM) + KCEL2=ICELL + LGOUTU=.TRUE. + ENDIF + ENDIF + ENDIF + 813 CONTINUE + IF(IPOP.LT.1)LGMAT3=.FALSE. + ENDIF +**** + IF(ICELL.GT.NCEL) THEN + WRITE(HSMG,'(29HTRKHEX: CELL OVERFLOW (ICELL=,I6,6H NCYL=,I6, + + 6H NCEL=,I6,1H))') ICELL,NCYL(ICELL),NCEL + CALL XABORT(HSMG) + ENDIF +**** + KUP=1 + KDOWN=2 + IVUP=0 + IVDOWN=0 + LTHROU=.FALSE. + IF(NCYL(ICELL).GT.0) THEN + IPOS=2*NCEL + IF(LGDIM) IPOS=3*NCEL + DO 22 I=1,ICELL-1 + IPOS=IPOS+NCYL(I) + 22 CONTINUE + KUP=NCYL(ICELL)+1 + KDOWN=KUP+1 + LGFAC8=.TRUE. + LGFAC7=.TRUE. + LAUX=0 + DO 25 ICYL=1,NCYL(ICELL) + IPOS=IPOS+1 + XCYL=REMESH(ICELL) + YCYL=REMESH(NCEL+ICELL) + R =REMESH(IPOS) + LAUX=LAUX+1 + RAUX(LAUX)=R*R +* +*--TOUS LES CYLINDRES SONT SUPPOSES D'AXES Z +* + YYC=Y0-YCYL + BZ=-COS1*XCYL+YYC*COS2 + DEE=YYC*COS1+XCYL*COS2 + DEL=RAUX(LAUX)*AZ-DEE*DEE + IF(DEL.GT.0.) THEN + SDEL=SQRT(DEL) + TP=(-BZ+SDEL)/AZ + TM=(-BZ-SDEL)/AZ + IF(LGDIM) THEN + ZP=COS3*TP+Z0 + ZM=COS3*TM+Z0 + IF(ZP.LT.ZM) THEN + ZZZ=ZP + ZP=ZM + ZM=ZZZ + TTT=TP + TP=TM + TM=TTT + ENDIF + IF(ZM.GT.Z2.OR.ZP.LT.Z1) GOTO 24 + LTHROU=.TRUE. + IF(ZP.GE.Z2.OR.ABS(ZP-Z2).LE.EPS1) THEN + IF(IFACE2.EQ.8)THEN + IF(LGFAC8)THEN + LGFAC8=.FALSE. + IVUP=ICYL + ENDIF + IF(ABS(TM-T(8)).LT.EPS6) THEN + LTHROU=.FALSE. + IF(.NOT.LGFAC8)IVUP=ICYL+1 + GO TO 24 + ENDIF + ENDIF + IF(ZM.LE.Z1) THEN + IF(IFACE1.EQ.7)THEN + IF(LGFAC7)THEN + LGFAC7=.FALSE. + IVDOWN=ICYL + ENDIF + ENDIF + GOTO 24 + ENDIF + IVDOWN=ICYL + IF(ABS(TM-T(7)).LT.EPS4) THEN + LGFAC7=.FALSE. + GO TO 24 + ENDIF + IVDOWN=ICYL+1 + KDOWN=KDOWN-1 + T0(KDOWN)=TM + V0(KDOWN)=ICYL+1 + GO TO 24 + ELSEIF(ZM.LE.Z1.OR.ABS(ZM-Z1).LE.EPS1) THEN + IF(IFACE1.EQ.7)THEN + IF(LGFAC7)THEN + LGFAC7=.FALSE. + IVDOWN=ICYL + ENDIF + IF(ABS(TP-T(7)).LT.EPS4) THEN + LTHROU=.FALSE. + IF(.NOT.LGFAC7) IVDOWN=ICYL+1 + GO TO 24 + ENDIF + ENDIF + IVUP=ICYL + IF(ABS(TP-T(8)).LT.EPS4) THEN + LGFAC8=.FALSE. + GO TO 24 + ENDIF + IVUP=ICYL+1 + KUP=KUP+1 + T0(KUP)=TP + V0(KUP)=ICYL + GO TO 24 + ENDIF + ENDIF + IF(LGFAC8)IVUP=ICYL+1 + IF(LGFAC7)IVDOWN=ICYL+1 + KUP=KUP+1 + KDOWN=KDOWN-1 + T0(KUP)=TP + T0(KDOWN)=TM + V0(KUP)=ICYL + V0(KDOWN)=ICYL+1 + ENDIF + 24 CONTINUE + 25 CONTINUE + ENDIF +* +* VOLUME A BORDURE HEXAGONALE +* + KVOL2=NCYL(ICELL)+1 + IF(IFACE2.EQ.8) THEN + IF(LTHROU) KVOL2=IVUP + ENDIF + KVOL1=NCYL(ICELL)+1 + IF(IFACE1.EQ.7) THEN + IF(LTHROU) KVOL1=IVDOWN + ENDIF + KUP=KUP+1 + KDOWN=KDOWN-1 + T0(KUP)=T(IFACE2) + T0(KDOWN)=T(IFACE1) + V0(KUP)=KVOL2 + V0(KDOWN)=KVOL1 + IF(COS3.LT.0.) THEN + T0MIN=T0(KUP) + T0MAX=T0(KDOWN) + ELSE + T0MAX=T0(KUP) + T0MIN=T0(KDOWN) + ENDIF +* +* STOCKAGE POUR SECTEURS +* + K=0 + IV01=V0(KDOWN) + IV02=V0(KDOWN) + LSV=FVOL(ICELL)+NCYL(ICELL) + IFV=FVOL(ICELL)-1 + JVOUT1=0 + JVOUT2=0 + IVSEC1=0 + IVSEC2=0 + DO 125 I=KDOWN,KUP + K=K+1 + TSEC(K)=T0(I) + IV01=MIN(IV01,V0(I)) + IV02=MAX(IV02,V0(I)) + IVS=0 + DO 233 IS=1,V0(I)-1 + IF(NSECT(IFV+IS).GT.1) THEN + IVS=IVS+6*(NSECT(IFV+IS)-1) + ELSE + IVS=IVS+1 + ENDIF + 233 CONTINUE + IF(NSECT(IFV+V0(I)).GT.1) THEN + YPT=COS2*T0(I)+Y0 + XPT=COS1*T0(I) + LGPASS=.TRUE. +* +* CAS OU LA TRACK ARRIVE SUR LE CENTRE DE LA CELLULE +* + IF(V0(I).EQ.1) THEN + IF(ABS(XPT-X).LE.EPS1.AND.ABS(YPT-Y).LE.EPS1) THEN + IF(K.EQ.1) THEN + YPT=COS2*T0(I+1)+Y0 + XPT=COS1*T0(I+1) + LGPASS=.FALSE. + ELSE + YPT=COS2*T0(I-1)+Y0 + XPT=COS1*T0(I-1) + LGPASS=.FALSE. + ENDIF + ENDIF + ENDIF +* + IF(XPT-X.EQ.0.) THEN + PENTE=.5*PI + ELSE + PENTE=ATAN((YPT-Y)/(XPT-X)) + ENDIF + IF(XPT.GT.X) THEN + IF(YPT.LT.Y)PENTE=2*PI-ABS(PENTE) + ELSE + IF(YPT.LT.Y) THEN + PENTE=PI+ABS(PENTE) + ELSE + PENTE=PI-ABS(PENTE) + ENDIF + ENDIF + ISV=6*(NSECT(IFV+V0(I))-1) + JSV=ISV/2 + ANG1=2.*PI/FLOAT(ISV) + ANG2=PI/FLOAT(JSV) + ATAN0=0. + DEL0=PENTE + ISEC=0 + DO 231 IS1=1,ISV + ATAN1=FLOAT(IS1)*ANG1 + DEL1=ABS(PENTE-ATAN1) +* +* 2.E-2 CORRESPAND A PEU PRES A 1 DEGRE +* + IF(DEL0.LE.2.E-2.OR.DEL1.LE.2.E-2) THEN + IAUX=IS1 + IF(DEL0.LE.2.E-2)IAUX=IS1-1 + IF(IAUX.EQ.0)IAUX=ISV + IF(IAUX.EQ.JSV) THEN + SINR=0. + COSR=-1. + ELSEIF(IAUX.EQ.ISV) THEN + SINR=0. + COSR=1. + ELSE + SINR=SIN(FLOAT(IAUX)*ANG1) + COSR=COS(FLOAT(IAUX)*ANG1) + ENDIF + YPH=-(XPT-X)*SINR+(YPT-Y)*COSR + YPF=0. + IF(K.EQ.1) THEN + YPH2=-(COS1*T0(KUP)-X)*SINR+(COS2*T0(KUP)+Y0-Y)*COSR + IF(YPH.GT.YPF) THEN + IF(YPH2.GT.YPF) THEN + ISEC=IAUX+1 + ELSE + IF(MOD(ISV,IAUX).EQ.0) THEN + IF(ISV/IAUX.NE.4) THEN + JAUX=IAUX + IF(IAUX.GT.JSV)JAUX=IAUX-JSV + TGA=TAN(FLOAT(JAUX)*ANG2) + TTHYP=(-X*TGA+Y-Y0)/(COS2-COS1*TGA) + ELSE + TTHYP=X*COS1I + ENDIF + ELSE + JAUX=IAUX + IF(IAUX.GT.JSV)JAUX=IAUX-JSV + TGA=TAN(FLOAT(JAUX)*ANG2) + TTHYP=(-X*TGA+Y-Y0)/(COS2-COS1*TGA) + ENDIF + ISEC=IAUX + IF(TTHYP.GT.T0MIN) THEN + TT0=ABS(TTHYP-T0(I)) + IF(TT0.LE.EPS1) THEN + ISEC=IAUX + TT1=ABS(TTHYP-T0(I+1)) + JVOUT1=IAUX+1 + IF(TT1.LE.EPS1) THEN + IF(TT1.LT.TT0) THEN + ISEC=IAUX+1 + JVOUT1=0 + JVOUT2=IAUX + IF(JVOUT2.GT.ISV) JVOUT2=JVOUT2-ISV + ENDIF + ENDIF + IF(JVOUT1.GT.ISV) JVOUT1=JVOUT1-ISV + ELSE + ISEC=IAUX+1 + ENDIF + ENDIF + ENDIF + ELSEIF(YPH.LT.YPF) THEN + IF(YPH2.LT.YPF) THEN + ISEC=IAUX + ELSE + IF(MOD(ISV,IAUX).EQ.0) THEN + IF(ISV/IAUX.NE.4) THEN + JAUX=IAUX + IF(IAUX.GT.JSV)JAUX=IAUX-JSV + TGA=TAN(FLOAT(JAUX)*ANG2) + TTHYP=(-X*TGA+Y-Y0)/(COS2-COS1*TGA) + ELSE + TTHYP=X*COS1I + ENDIF + ELSE + JAUX=IAUX + IF(IAUX.GT.JSV)JAUX=IAUX-JSV + TGA=TAN(FLOAT(JAUX)*ANG2) + TTHYP=(-X*TGA+Y-Y0)/(COS2-COS1*TGA) + ENDIF + ISEC=IAUX+1 + IF(TTHYP.GT.T0MIN)THEN + TT0=ABS(T0(I)-TTHYP) + IF(TT0.LE.EPS1) THEN + ISEC=IAUX+1 + TT1=ABS(T0(I+1)-TTHYP) + JVOUT1=IAUX + IF(TT1.LE.EPS1) THEN + IF(TT1.LE.TT0) THEN + ISEC=IAUX + JVOUT1=0 + JVOUT2=IAUX+1 + IF(JVOUT2.GT.ISV) JVOUT2=JVOUT2-ISV + ENDIF + ENDIF + IF(JVOUT1.GT.ISV) JVOUT1=JVOUT1-ISV + ELSE + ISEC=IAUX + ENDIF + ENDIF + ENDIF + ELSE + ISEC=IAUX + IF(YPH2.GT.YPF) ISEC=IAUX+1 + ENDIF + ELSE + YPH2=-(COS1*T0(KDOWN)-X)*SINR+(COS2*T0(KDOWN)+Y0-Y)*COSR + IF(YPH.GT.YPF) THEN + IF(YPH2.GT.YPF) THEN + ISEC=IAUX+1 + ELSE + IF(MOD(ISV,IAUX).EQ.0) THEN + IF(ISV/IAUX.NE.4) THEN + JAUX=IAUX + IF(IAUX.GT.JSV)JAUX=IAUX-JSV + TGA=TAN(FLOAT(JAUX)*ANG2) + TTHYP=(-X*TGA+Y-Y0)/(COS2-COS1*TGA) + ELSE + TTHYP=X*COS1I + ENDIF + ELSE + JAUX=IAUX + IF(IAUX.GT.JSV)JAUX=IAUX-JSV + TGA=TAN(FLOAT(JAUX)*ANG2) + TTHYP=(-X*TGA+Y-Y0)/(COS2-COS1*TGA) + ENDIF + ISEC=IAUX + IF(TTHYP.LE.T0MAX) THEN + IF(LGPASS) THEN + IF(NCYL(ICELL).GT.1) THEN + XAUX=X-COS1*TTHYP + YAUX=Y-COS2*TTHYP-Y0 + DIST=XAUX*XAUX+YAUX*YAUX + ISEC=IAUX + IF(V0(I).GT.NCYL(ICELL)) THEN + IF(DIST.LE.RAUX(NCYL(ICELL))) GOTO 331 + ELSEIF(V0(I).EQ.1) THEN + IF(DIST.GE.RAUX(1)) GOTO 331 + ELSE + IF(DIST.GE.RAUX(V0(I))) GOTO 331 + IF(DIST.LE.RAUX(V0(I)-1)) GOTO 331 + ENDIF + ENDIF + ENDIF + TT0=ABS(T0(I)-TTHYP) + IF(TT0.LE.EPS1) THEN + ISEC=IAUX + TT1=ABS(T0(I-1)-TTHYP) + JVOUT2=IAUX+1 + IF(TT1.LE.EPS1) THEN + IF(TT1.LT.TT0) THEN + ISEC=IAUX+1 + JVOUT2=0 + JVOUT1=IAUX + IF(JVOUT1.GT.ISV) JVOUT1=JVOUT1-ISV + ENDIF + ENDIF + IF(JVOUT2.GT.ISV) JVOUT2=JVOUT2-ISV + ELSE + ISEC=IAUX+1 + ENDIF + ENDIF + ENDIF + ELSEIF(YPH.LT.YPF) THEN + IF(YPH2.LT.YPF) THEN + ISEC=IAUX + ELSE + IF(MOD(ISV,IAUX).EQ.0) THEN + IF(ISV/IAUX.NE.4) THEN + JAUX=IAUX + IF(IAUX.GT.JSV)JAUX=IAUX-JSV + TGA=TAN(FLOAT(JAUX)*ANG2) + TTHYP=(-X*TGA+Y-Y0)/(COS2-COS1*TGA) + ELSE + TTHYP=X*COS1I + ENDIF + ELSE + JAUX=IAUX + IF(IAUX.GT.JSV)JAUX=IAUX-JSV + TGA=TAN(FLOAT(JAUX)*ANG2) + TTHYP=(-X*TGA+Y-Y0)/(COS2-COS1*TGA) + ENDIF + ISEC=IAUX+1 + IF(TTHYP.LT.T0MAX) THEN + IF(LGPASS) THEN + IF(NCYL(ICELL).GT.1) THEN + XAUX=X-COS1*TTHYP + YAUX=Y-COS2*TTHYP-Y0 + DIST=XAUX*XAUX+YAUX*YAUX + ISEC=IAUX+1 + IF(V0(I).GT.NCYL(ICELL)) THEN + IF(DIST.LE.RAUX(NCYL(ICELL))) GOTO 331 + ELSEIF(V0(I).EQ.1) THEN + IF(DIST.GE.RAUX(1)) GOTO 331 + ELSE + IF(DIST.GE.RAUX(V0(I))) GOTO 331 + IF(DIST.LE.RAUX(V0(I)-1)) GOTO 331 + ENDIF + ENDIF + ENDIF + TT0=ABS(T0(I)-TTHYP) + IF(TT0.LE.EPS1) THEN + ISEC=IAUX+1 + TT1=ABS(T0(I-1)-TTHYP) + JVOUT2=IAUX + IF(TT1.LE.EPS1) THEN + IF(TT1.LE.TT0) THEN + ISEC=IAUX + JVOUT2=0 + JVOUT1=IAUX+1 + IF(JVOUT1.GT.ISV) JVOUT1=JVOUT1-ISV + ENDIF + ENDIF + IF(JVOUT2.GT.ISV) JVOUT2=JVOUT2-ISV + ELSE + ISEC=IAUX + ENDIF + ENDIF + ENDIF + ELSE + ISEC=IAUX + IF(YPH2.GT.YPF) ISEC=IAUX+1 + ENDIF + ENDIF + 331 CONTINUE + IF(ISEC.GT.ISV)ISEC=ISEC-ISV + GOTO 232 + ELSEIF(PENTE.LT.ATAN1) THEN + ISEC=IS1 + IAUX=IS1-1 + IF(IAUX.EQ.0)IAUX=ISV + IF(MOD(ISV,IAUX).EQ.0) THEN + IF(ISV/IAUX.NE.4) THEN + JAUX=IAUX + IF(IAUX.GT.JSV)JAUX=IAUX-JSV + TGA=TAN(FLOAT(JAUX)*ANG2) + TTHYP0=(-X*TGA+Y-Y0)/(COS2-COS1*TGA) + ELSE + TTHYP0=X*COS1I + ENDIF + ELSE + JAUX=IAUX + IF(IAUX.GT.JSV)JAUX=IAUX-JSV + TGA=TAN(FLOAT(JAUX)*ANG2) + TTHYP0=(-X*TGA+Y-Y0)/(COS2-COS1*TGA) + ENDIF + IF(ABS(T0(I)-TTHYP0).LE.EPS1) THEN + IF(IAUX.EQ.JSV) THEN + SINR=0. + COSR=-1. + ELSEIF(IAUX.EQ.ISV) THEN + SINR=0. + COSR=1. + ELSE + SINR=SIN(FLOAT(IAUX)*ANG1) + COSR=COS(FLOAT(IAUX)*ANG1) + ENDIF + IF(K.EQ.1) THEN + YPH2=-(COS1*T0(KUP)-X)*SINR+(COS2*T0(KUP)+Y0-Y)*COSR + ELSE + YPH2=-(COS1*T0(KDOWN)-X)*SINR+(COS2*T0(KDOWN)+Y0-Y)*COSR + ENDIF + IF(YPH2.LE.0.)ISEC=IS1-1 + GOTO 232 + ENDIF + IAUX=IS1 + IF(MOD(ISV,IAUX).EQ.0) THEN + IF(ISV/IAUX.NE.4) THEN + JAUX=IAUX + IF(IAUX.GT.JSV)JAUX=IAUX-JSV + TGA=TAN(FLOAT(JAUX)*ANG2) + TTHYP1=(-X*TGA+Y-Y0)/(COS2-COS1*TGA) + ELSE + TTHYP1=X*COS1I + ENDIF + ELSE + JAUX=IAUX + IF(IAUX.GT.JSV)JAUX=IAUX-JSV + TGA=TAN(FLOAT(JAUX)*ANG2) + TTHYP1=(-X*TGA+Y-Y0)/(COS2-COS1*TGA) + ENDIF + IF(ABS(T0(I)-TTHYP1).LE.EPS1) THEN + IF(IAUX.EQ.JSV) THEN + SINR=0. + COSR=-1. + ELSEIF(IAUX.EQ.ISV) THEN + SINR=0. + COSR=1. + ELSE + SINR=SIN(FLOAT(IAUX)*ANG1) + COSR=COS(FLOAT(IAUX)*ANG1) + ENDIF + IF(K.EQ.1) THEN + YPH2=-(COS1*T0(KUP)-X)*SINR+(COS2*T0(KUP)+Y0-Y)*COSR + ELSE + YPH2=-(COS1*T0(KDOWN)-X)*SINR+(COS2*T0(KDOWN)+Y0-Y)*COSR + ENDIF + IF(YPH2.GT.0.)ISEC=IS1+1 + IF(ISEC.GT.ISV)ISEC=ISEC-ISV + GOTO 232 + ENDIF + GOTO 232 + ENDIF + ATAN0=ATAN1 + DEL0=DEL1 + 231 CONTINUE + CALL XABORT('TRKHEX: ALGORITHME FAILURE -D') + 232 CONTINUE + ELSE + ISEC=1 + ENDIF + VSEC(K)=IVS+ISEC + IF(JVOUT1.NE.0) THEN + IVSEC1=IVS+JVOUT1 + JVOUT1=0 + ENDIF + IF(JVOUT2.NE.0) THEN + IVSEC2=IVS+JVOUT2 + JVOUT2=0 + ENDIF + 125 CONTINUE + KMAX=K + JCC0=IFV +* +* CAS OU IL N'Y A PAS D'INTERSECTION AVEC LES SECTEURS +* + IF(KMAX.EQ.2) THEN + IF(VSEC(1).EQ.VSEC(KMAX)) GOTO 527 + ENDIF +* + DO 227 JC=IV01,IV02 + JCC=JCC0+JC + IF(NSECT(JCC).GT.1) THEN +* +* INTERSECTION DE LA DIRECTION AVEC LES SECTEURS +* + JSEC=3*(NSECT(JCC)-1) + JSEC2=JSEC+JSEC + ANG0=PI/FLOAT(JSEC) + IVS0=VSEC(1) + IVS1=VSEC(1)-1 + IF(IVS1.EQ.0)IVS1=JSEC + DO 225 J=1,JSEC + IF(MOD(JSEC,J).EQ.0) THEN + IF(JSEC/J.NE.2) THEN + TGA=TAN(FLOAT(J)*ANG0) + THYP=(-X*TGA+Y-Y0)/(COS2-COS1*TGA) + ELSE + THYP=X*COS1I + ENDIF + ELSE + TGA=TAN(FLOAT(J)*ANG0) + THYP=(-X*TGA+Y-Y0)/(COS2-COS1*TGA) + ENDIF + IF(THYP.LE.T0MIN.OR.THYP.GE.T0MAX) GOTO 223 +* +* LES PARCOURS NULS AU CENTRE DE LA CELLULE NE SONT PAS ELEMINES +* +* IF(LGDIM) THEN + IZ0=1 + IF(IFACE1.EQ.7) THEN + IF(ABS(THYP-T0MIN).LE.EPS1) GOTO 223 + IZ0=2 + ENDIF + IF(ABS(THYP-T0MAX).LE.EPS1) GOTO 223 + DO 171 IZZ=IZ0,KMAX-1 + IF(ABS(THYP-TSEC(IZZ)).LE.EPS1) THEN + IF(JC.EQ.1) THEN + IF(J.EQ.IVS0.OR.J.EQ.IVS1) THEN + IF(VSEC(1).NE.VSEC(2)) GOTO 114 + ENDIF + ENDIF + GOTO 223 + ENDIF + 171 CONTINUE + 114 CONTINUE +* +* CE TESTE EST NECESSAIRE SI TOUTES LES ZONES NE SONT PAS SECTORISEES +* ON SUPPOSE ICI QU'ON A AFFAIRE A DES CYLINDRES CONCENTRIQUES +* + IF(NCYL(ICELL).GT.1) THEN + XAUX=X-COS1*THYP + YAUX=Y-COS2*THYP-Y0 + DIST=XAUX*XAUX+YAUX*YAUX + IF(JC.GT.NCYL(ICELL)) THEN + IF(DIST.LE.RAUX(NCYL(ICELL))) THEN + IF(KMAX.EQ.2) THEN + IF(ABS(DIST-RAUX(NCYL(ICELL))).GT.EPS5) THEN + IF(VSEC(1).EQ.VSEC(2)) GOTO 223 + ENDIF + ELSE + GOTO 223 + ENDIF + ENDIF + ELSEIF(JC.EQ.1) THEN + IF(DIST.GE.RAUX(1)) GOTO 223 + ELSE + IF(DIST.GE.RAUX(JC)) GOTO 223 + IF(DIST.LE.RAUX(JC-1)) GOTO 223 + ENDIF + ENDIF + LMIN=2 + LMAX=KMAX + LSTEP=1 + LL=0 + L0=2 + IF(COS3.LT.0.) THEN + LMAX=1 + LMIN=KMAX-1 + LSTEP=-1 + LL=1 + L0=1 + ENDIF + DO 220 K=LMIN,LMAX,LSTEP + IF(THYP.LT.TSEC(K)) THEN + IF(K.EQ.L0)THEN + IF(VSEC(1).EQ.VSEC(2)) GOTO 223 + ENDIF + DO 241 L=KMAX,K+LL,-1 + TSEC(L+1)=TSEC(L) + VSEC(L+1)=VSEC(L) + 241 CONTINUE + TSEC(K+LL)=THYP + KMAX=KMAX+1 + IZONE=1 + DO 210 N=KDOWN,KUP + IF(THYP.LE.T0(N)) THEN + IZONE=V0(N) + GO TO 211 + ENDIF + 210 CONTINUE + CALL XABORT('TRKHEX: IMPOSSIBLE CASE ') + 211 XT=COS1*THYP + YT=COS2*THYP+Y0 +* +* TRAITEMENT DU PROBLEME DU CENTRE DE LA CELLULE SECTORISEE +* + IF(JC.EQ.1) THEN + IF(ABS(XT-X).LE.EPS1.AND.ABS(YT-Y).LE.EPS1) THEN + IF(K.EQ.2) THEN + VSEC(2)=VSEC(1) + GOTO 224 + ENDIF + XT=COS1*T0MIN + YT=COS2*T0MIN+Y0 + IF(ABS(XT-X).LE.EPS1.AND.ABS(YT-Y).LE.EPS1) THEN + CALL XABORT('TRKHEX: TRACK PARALLEL TO OZ 2') + ENDIF + ENDIF + ENDIF +* + IAUX=J + IF(J.EQ.JSEC) THEN + SINR=0. + COSR=-1. + IF(XT.GT.X) THEN + IAUX=JSEC2 + COSR=1. + ENDIF + ELSE + IF(YT.LT.Y) IAUX=J+JSEC + SINR=SIN(IAUX*ANG0) + COSR=COS(IAUX*ANG0) + ENDIF + YRH=0. + YRF=-(XDR(IFACE2)-X)*SINR+(YDR(IFACE2)-Y)*COSR + IF(YRF.GT.YRH)THEN + ISECTR=IAUX + ELSE + ISECTR=IAUX+1 + ENDIF + IF(ISECTR.GT.JSEC2)ISECTR=ISECTR-JSEC2 + ISS=0 + DO 240 ISC=1,IZONE-1 + IF(NSECT(IFV+ISC).GT.1) THEN + ISS=ISS+6*(NSECT(IFV+ISC)-1) + ELSE + ISS=ISS+1 + ENDIF + 240 CONTINUE + IVAUX=ISS+ISECTR + VSEC(K+LL)=IVAUX + GOTO 223 + ENDIF + 220 CONTINUE + 223 CONTINUE + 225 CONTINUE + ENDIF + 224 CONTINUE + 227 CONTINUE + 527 CONTINUE + IF(VSEC(1).NE.VSEC(2)) THEN + IF(ABS(TSEC(1)-TSEC(2)).LE.EPS1) THEN + IF(VSEC(1).EQ.VSEC(3))THEN + DO 528 ISSX=2,KMAX-1 + VSEC(ISSX)=VSEC(ISSX+1) + TSEC(ISSX)=TSEC(ISSX+1) + 528 CONTINUE + KMAX=KMAX-1 + GOTO 529 + ENDIF + ENDIF + ENDIF + 529 CONTINUE +* +* CALCUL DES VOLUMES DE SORTIES +* + LSV=NVOL(ICELL)-1 + DO 228 JS=1,NCYL(ICELL)+1 + IF(NSECT(IFV+JS).GT.1) THEN + LSV=LSV+6*(NSECT(IFV+JS)-1) + ELSE + LSV=LSV+1 + ENDIF + 228 CONTINUE + IFV=NVOL(ICELL)-1 +* +* PARCOURS OPTIQUES ET VOLUMES ASSOCIES +* + IF(DIRUP) THEN + I1=1 + I2=KMAX-1 + I3=1 + KPOP=IPOP+1 + ELSE + I2=1 + I1=KMAX-1 + I3=-1 + KPOP=IPOP+KMAX-1 + ENDIF + DO 230 I=I1,I2,I3 + IPOP=IPOP+1 + POP(IPOP)=ABS(TSEC(I+1)-TSEC(I)) + IVOL=VSEC(I+1)+IFV + IF(IVOL.GT.LSV) IVOL=IVOL-LSV+FVOL(ICELL)-1 + MAT(IPOP)=IVOL + 230 CONTINUE + IMAT2=MAT(IPOP) + 739 CONTINUE + IF(START) THEN + IFDOWN=IFACE1 + ICDOWN=ICELL + IMATD=MAT(KPOP) + KFACED=KFACE1 + KCELD=KCEL1 + LGOUTD=LGOUT1 + MFACD=MFAC1 + MFACU=MFAC2 + IFACEU=IFACE2 + KPLD=KPL + DO 229 IXX=1,MFACD + FACEMD(IXX)=FACEM1(IXX) + 229 CONTINUE + DO 329 IXX=1,MFACU + FACEMU(IXX)=FACEM2(IXX) + 329 CONTINUE + ENDIF +* +* RECHERCHE DES PROCHAINS VOLUMES A TRACKER +* + IF(DIRUP) THEN + START=.FALSE. + IVOUT=ICELL + IMAT=IMAT2 + IF(IFACE2.LE.6) THEN + ICELLX=ICELL + IF(ICELL.LE.STAIRS(1)) THEN + ICELL=VOISIN(IFACE2,ICELL) + IF(ICELL.GT.NCEL2) THEN + IFACE=IFACE2 + GOTO 35 + ENDIF + GOTO 31 + ENDIF + KPL=INT(AINT(REAL(ICELL)/REAL(STAIRS(1)))) + IF(MOD(ICELL,STAIRS(1)).NE.0)KPL=KPL+1 + ICELL2=ICELL-STAIRS(KPL-1) + ICELLX=ICELL2 + ICELL2=VOISIN(IFACE2,ICELL2) + IF(ICELL2.GT.NCEL2) THEN + IFACE=IFACE2 + GOTO 35 + ENDIF + ICELL=STAIRS(KPL-1)+ICELL2 + ELSE + ICELLX=ICELL + IF(.NOT.LGPG1) THEN + IFACE=IFACE2 + GOTO 35 + ENDIF + IF(ICELL.LE.STAIRS(1)) THEN + ICELL=ICELL+STAIRS(1) + GOTO 31 + ENDIF + KPL=INT(AINT(REAL(ICELL)/REAL(STAIRS(1)))) + IF(MOD(ICELL,STAIRS(1)).NE.0)KPL=KPL+1 + ICELLX=ICELL-STAIRS(KPL-1) + ICELL=ICELLX+STAIRS(KPL) + ENDIF + 31 IF(ICELL.GT.NCEL) THEN + IFACE=IFACE2 + GOTO 35 + ENDIF + KPER=KPER+1 + MAT2(KPER)=ICELL + IF(KPER-1.GE.3) THEN + IF(MAT2(KPER-1).EQ.ICELL) THEN + GOTO 631 + ELSEIF(MAT2(KPER-2).EQ.ICELL) THEN + GOTO 631 + ELSEIF(MAT2(KPER-3).EQ.ICELL) THEN + GOTO 631 + ENDIF + GOTO 632 + 631 CONTINUE + IF(LGPAS0) GOTO 56 + ISURC=1 + IETAG=0 + ISURM=6 + SURC(1)=1 + SURC(2)=2 + SURC(3)=3 + SURC(4)=4 + SURC(5)=5 + SURC(6)=6 + IF(LGDIM) THEN + IF(ICELL.LT.STAIRS(1)) THEN + IVOLC=ICELL + I=VOISIN(1,IVOLC) + ELSE + KPL=INT(AINT(REAL(ICELL)/REAL(STAIRS(1)))) + IF(MOD(ICELL,STAIRS(1)).NE.0)KPL=KPL+1 + IVOLC=ICELL-STAIRS(KPL-1) + IF(KPL.GT.2) THEN + IETAG=STAIRS(KPL-2) + ENDIF + I=VOISIN(1,IVOLC) + ENDIF + ELSE + IVOLC=ICELL + I=VOISIN(1,IVOLC) + ENDIF + LGPAS0=.TRUE. + IF(I.GT.NCEL2) THEN + I=NCEL+10 + GOTO 56 + ENDIF + I=I+IETAG + LGPER=.TRUE. + GOTO 42 + ENDIF + 632 CONTINUE + X=REMESH(ICELL) + Y=REMESH(NCEL+ICELL) + LGPAS0=.FALSE. + GOTO 10 + ENDIF +* + 30 IVOUT=ICELL + IMAT=IMATD + START=.TRUE. + IF(IFDOWN.LE.6) THEN + IF(ICELL.LE.STAIRS(1)) THEN + ICELLD=ICELL + ICELL=VOISIN(IFDOWN,ICELL) + IF(ICELL.GT.NCEL2) THEN + IFACE=IFDOWN + IVOUT2=IVOUT + LGSTOR=.TRUE. + GOTO 34 + ENDIF + GOTO 33 + ENDIF + KPL=INT(AINT(REAL(ICELL)/REAL(STAIRS(1)))) + IF(MOD(ICELL,STAIRS(1)).NE.0) KPL=KPL+1 + ICELL2=ICELL-STAIRS(KPL-1) + ICELLD=ICELL2 + ICELL2=VOISIN(IFDOWN,ICELL2) + IF(ICELL2.GT.NCEL2) THEN + IFACE=IFDOWN + IVOUT2=IVOUT + LGSTOR=.TRUE. + GOTO 34 + ENDIF + ICELL=STAIRS(KPL-1)+ICELL2 + GOTO 33 + ELSE + ICELLD=ICELL + IF(ICELL.LE.STAIRS(1)) THEN + IFACE=IFDOWN + IVOUT2=IVOUT + LGSTOR=.TRUE. + GOTO 34 + ENDIF + KPL=INT(AINT(REAL(ICELL)/REAL(STAIRS(1)))) + IF(MOD(ICELL,STAIRS(1)).NE.0) KPL=KPL+1 + ICELL=ICELL-STAIRS(KPL-1) + ICELLD=ICELL + IF(KPL.GT.2)ICELL=ICELL+STAIRS(KPL-2) + ENDIF + 33 IF(ICELL.GT.NCEL) THEN + IFACE=IFDOWN + IVOUT2=IVOUT + LGSTOR=.TRUE. + GOTO 35 + ENDIF + KPER=KPER+1 + MAT2(KPER)=ICELL + IF(KPER-1.GE.3) THEN + IF(MAT2(KPER-1).EQ.ICELL) THEN + GOTO 635 + ELSEIF(MAT2(KPER-2).EQ.ICELL) THEN + GOTO 635 + ELSEIF(MAT2(KPER-3).EQ.ICELL) THEN + GOTO 635 + ENDIF + GOTO 637 + 635 CONTINUE + IF(LGPAS0) GOTO 56 + ISURC=1 + IETAG=0 + ISURM=6 + SURC(1)=1 + SURC(2)=2 + SURC(3)=3 + SURC(4)=4 + SURC(5)=5 + SURC(6)=6 + IF(LGDIM) THEN + IF(ICELL.LT.STAIRS(1)) THEN + IVOLC=ICELL + I=VOISIN(1,IVOLC) + ELSE + KPC=INT(AINT(REAL(ICELL)/REAL(STAIRS(1)))) + IF(MOD(ICELL,STAIRS(1)).NE.0)KPC=KPC+1 + IVOLC=ICELL-STAIRS(KPC-1) + IF(KPC.EQ.IPLANZ) THEN + IETAG=STAIRS(KPC-1) + ELSE + IETAG=STAIRS(KPC) + ENDIF + I=VOISIN(1,IVOLC) + ENDIF + ELSE + IVOLC=ICELL + I=VOISIN(1,IVOLC) + ENDIF + LGPAS0=.TRUE. + IF(I.GT.NCEL2) THEN + I=NCEL+10 + GOTO 56 + ENDIF + I=I+IETAG + LGPER=.TRUE. + GOTO 42 + ENDIF + 637 IF(ICELL+NCEL.GT.MESH) + > CALL XABORT('TRKHEX: ALGORITHME FAILURE -E') + X=REMESH(ICELL) + Y=REMESH(NCEL+ICELL) + LGDIR=.FALSE. + LGPAS0=.FALSE. + GOTO 10 +* + 34 CONTINUE +* +* RECHERCHE DE LA FACE DE SORTIE +* + 35 CONTINUE + IMAT0=IMAT + NFAC=1 + NFXX=1 +* + IF(LGMAT3) THEN + DO 666 IAC=1,KPER3 + KPER=KPER+1 + MAT2(KPER)=MAT3(IAC) + 666 CONTINUE + ENDIF + LGMAT3=.FALSE. + KPER3=0 + PASSD=.FALSE. + PASSU=.FALSE. + IF(DIRUP) THEN + IYY=0 + IF(LGFAC) THEN + DO 335 IXX=1,MFAC2 + IF(FACEM2(IXX).LE.6) THEN + ICXX=VOISIN(FACEM2(IXX),ICELLX) + IF(ICXX.GT.NCEL2) THEN + IYY=IYY+1 + FACES(IYY)=FACEM2(IXX) + ENDIF + ELSE + IF(LGPG1) THEN + IF(IVOUT.LE.STAIRS(IPLANZ-1)) THEN + PASSU=.TRUE. + GOTO 435 + ENDIF + ENDIF + IYY=IYY+1 + FACES(IYY)=FACEM2(IXX) + ENDIF + 435 CONTINUE + 335 CONTINUE + ENDIF + NFACX=IYY+1 + ELSE + IYY=0 + DO 336 IXX=1,MFACD + IF(FACEMD(IXX).LE.6) THEN + ICXX=VOISIN(FACEMD(IXX),ICELLD) + IF(ICXX.GT.NCEL2) THEN + IYY=IYY+1 + FACES(IYY)=FACEMD(IXX) + ENDIF + ELSE + IF(IVOUT.LE.STAIRS(1))THEN + IYY=IYY+1 + FACES(IYY)=FACEMD(IXX) + PASSD=.TRUE. + ENDIF + ENDIF + 336 CONTINUE + NFACX=IYY+1 +* + ENDIF + ISURF1=0 + ISURF2=0 + IF(IVOUT.LE.STAIRS(1)) THEN + ISTAIR=0 + IFACST=-1 + IF(LGDIM) THEN + ISS=0 + DO 300 IW=0,NCYL(NCEL2) + IF(NSECT(FVOL(NCEL2)+IW).GT.1)THEN + ISS=6*(NSECT(FVOL(NCEL2)+IW)-1)+ISS + ELSE + ISS=1+ISS + ENDIF + 300 CONTINUE + IFACST=FACB(NCEL2)+ISS-1 + ENDIF + IMAX=1 + GOTO 37 + ENDIF + I=INT(AINT(REAL(IVOUT)/REAL(STAIRS(1)))) + IF(MOD(IVOUT,STAIRS(1)).NE.0)I=I+1 + ISTAIR=STAIRS(I-1) + IFACST=FACST(I-1)-1 + IMAX=I + 37 KFACE=IVOUT-IFONC(NCOUR,0)-ISTAIR + IMAT=IMAT0 + IFOUT2=2*KFACE+2+IFACST + IF(IFACE.EQ.7) THEN + IMAM=1 + IF(LPOP.NE.IPOP)IMAM=IPOP + IFOUT2=MAT(IMAM) + ELSEIF(IFACE.EQ.8) THEN + IPP=IVOUT + IF(LGPG1)IPP=IVOUT-STAIRS(IPLANZ-1) + IFOUT2=FACB(NCEL2+IPP)+VSEC(KMAX) + ELSE + IF(NCOUR.EQ.1) THEN + IFOUT2=IFACE + IF(LGDIM)IFOUT2=IFOUT2+IFACST+1 + ELSEIF(IVOUT.LE.(IFONC(NCOUR,1)+ISTAIR)) THEN + IF(IFACE.EQ.2) THEN + IFOUT2=IFOUT2+1 + ELSEIF(IFACE.EQ.6) THEN + IFOUT2=FACST(IMAX) + ELSEIF(IFACE.EQ.3) THEN + IFOUT2=IFOUT2+2 + ENDIF + ELSEIF(IVOUT.LE.(IFONC(NCOUR,2)+ISTAIR)) THEN + IFOUT2=2*KFACE+3+IFACST + IF(IFACE.EQ.3) THEN + IFOUT2=IFOUT2+1 + ELSEIF(IFACE.EQ.4) THEN + IFOUT2=IFOUT2+2 + ENDIF + ELSEIF(IVOUT.LE.(IFONC(NCOUR,3)+ISTAIR)) THEN + IFOUT2=2*KFACE+4+IFACST + IF(IFACE.EQ.4) THEN + IFOUT2=IFOUT2+1 + ELSEIF(IFACE.EQ.5) THEN + IFOUT2=IFOUT2+2 + ENDIF + ELSEIF(IVOUT.LE.(IFONC(NCOUR,4)+ISTAIR)) THEN + IFOUT2=2*KFACE+5+IFACST + IF(IFACE.EQ.5) THEN + IFOUT2=IFOUT2+1 + ELSEIF(IFACE.EQ.6) THEN + IFOUT2=IFOUT2+2 + ENDIF + ELSEIF(IVOUT.LE.(IFONC(NCOUR,5)+ISTAIR)) THEN + IFOUT2=2*KFACE+6+IFACST + IF(IFACE.EQ.6) THEN + IFOUT2=IFOUT2+1 + ELSEIF(IFACE.EQ.1) THEN + IFOUT2=IFOUT2+2 + ENDIF + ELSEIF(IVOUT.LE.STAIRS(IMAX)) THEN + IFOUT2=2*KFACE+7+IFACST + IF(IFACE.EQ.1)IFOUT2=IFOUT2+1 + ELSE + CALL XABORT('TRKHEX: ALGORITHME FAILURE -F') + ENDIF +* +* PRISE EN COMPTE DES SECTEURS +* + KSECT=NSECT(FVOL(IVOUT)+NCYL(IVOUT)) + IF(KSECT.GT.2) THEN + IXY=0 + DO 371 IXX=0,NCYL(IVOUT)-1 + IF(NSECT(FVOL(IVOUT)+IXX).GT.1) THEN + IXY=IXY+6*(NSECT(FVOL(IVOUT)+IXX)-1) + ELSE + IXY=IXY+1 + ENDIF + 371 CONTINUE + JMIN=(IFACE-1)*(KSECT-1)+IXY+NVOL(IVOUT)-1 + JMAX=KSECT-1+JMIN + IF(IMAT.GT.JMAX) THEN + IF(IFACE.EQ.1) THEN + IMAT=NVOL(IVOUT)+IXY + ELSE + IMAT=IMAT-1 + ENDIF + ELSEIF(IMAT.LE.JMIN) THEN + IF(IFACE.EQ.6) THEN + IMAT=NVOL(IVOUT)+IXY-1+6*(KSECT-1) + ELSE + IMAT=IMAT+1 + ENDIF + ENDIF + IMAT=IMAT-(IFACE-1)*(KSECT-1)-IXY-NVOL(IVOUT)+1 + IFOUT2=SURB(IFOUT2)+IMAT + ELSEIF(SECTOR) THEN + IFOUT2=SURB(IFOUT2)+1 + ENDIF + ENDIF +*------ DISTRIBUTION DES NEUTRONS SUR DES FACES DES PLANS SUPERIEURS +* OU INFERIEURS AUTRE QUE LE PLAN CONSIDERE + IF(LGPG1) THEN + IF(DIRUP) THEN + IF(PASSU) THEN + IF(IVOUT.LE.STAIRS(1)) THEN + LFOUT2=FACST(1)+IFOUT2-STAIRS(1) + LVOUT=STAIRS(1)+IVOUT + GOTO 477 + ELSEIF(IVOUT.LE.STAIRS(IPLANZ-1)) THEN + LFOUT2=FACST(IMAX)+IFOUT2-FACST(IMAX-1) + LVOUT=STAIRS(IMAX)+IVOUT-STAIRS(IMAX-1) + GOTO 477 + ENDIF + ENDIF + GOTO 478 + ELSE + IF(PASSD) THEN + IF(IVOUT.GT.STAIRS(1)) THEN + IF(IVOUT.GT.STAIRS(2)) THEN + LFOUT2=IFOUT2-FACST(IMAX-1)+FACST(IMAX-2) + LVOUT=IVOUT-STAIRS(IMAX-1)+STAIRS(IMAX-2) + GOTO 477 + ELSE + LFOUT2=IFOUT2-FACST(1)+STAIRS(1) + LVOUT=IVOUT-STAIRS(1) + GOTO 477 + ENDIF + ENDIF + ENDIF + GOTO 478 + ENDIF + 477 IF(SECTOR) THEN + MSECT=NSECT(FVOL(LVOUT)+NCYL(LVOUT)) + IF(MSECT.EQ.KSECT) THEN + LFOUT2=SURB(LFOUT2)+IMAT + ELSEIF(MSECT.LT.KSECT) THEN + LFOUT2=SURB(LFOUT2)+NINT(REAL(MSECT*IMAT)/REAL(KSECT)) + ELSE + KFXX=NINT(REAL(MSECT*IMAT)/REAL(KSECT)) + IF(KFXX.EQ.1) THEN + LFOUT2=SURB(LFOUT2)+1 + SURFX(NFXX)=LFOUT2+1 + NFXX=NFXX+1 + ELSEIF(KFXX.EQ.MSECT)THEN + LFOUT2=SURB(LFOUT2)+KFXX + SURFX(NFXX)=LFOUT2-1 + NFXX=NFXX+1 + ELSE + LFOUT2=SURB(LFOUT2)+KFXX + SURFX(NFXX)=LFOUT2-1 + SURFX(NFXX+1)=LFOUT2+1 + NFXX=NFXX+2 + ENDIF + ENDIF + SURFX(NFXX)=LFOUT2 + NFXX=NFXX+1 + ENDIF + ENDIF +* + 478 SURFX(NFXX)=IFOUT2 + NFXX=NFXX+1 + NFAC=NFAC+1 + IF(NFAC.LE.NFACX) THEN + IFACE=FACES(NFAC-1) + GOTO 37 + ENDIF +* + IF(DIRUP) THEN + IFOUT1=IFOUT2 + IVOUT1=IVOUT + DIRUP=.FALSE. + ICELL=ICDOWN + ICELL0=ICELL + KPL=INT(AINT(REAL(ICELL)/REAL(STAIRS(1)))) + IF(MOD(ICELL,STAIRS(1)).NE.0) KPL=KPL+1 + LGDIR=.TRUE. + LPOP=IPOP + NSURF1=NFXX-1 + DO 377 IXX=1,NSURF1 + SURF1(IXX)=SURFX(IXX) + IF(SURF1(IXX).GT.NSOUT) CALL XABORT('TRKHEX: SURF1 OVERFLOW.') + 377 CONTINUE + GOTO 30 + ELSE + NSURF2=NFAC-1 + DO 378 IXX=1,NSURF2 + SURF2(IXX)=SURFX(IXX) + IF(SURF2(IXX).GT.NSOUT) CALL XABORT('TRKHEX: SURF2 OVERFLOW.') + 378 CONTINUE + ENDIF +* + IF(LGSTOR) THEN + IF(LGDIR) THEN + KOUT=IVOUT1 + IVOUT1=IVOUT + IVOUT=KOUT + LGDIR=.FALSE. + ENDIF + GOTO 38 + ENDIF +* +* STOCKAGE DES PARCOURS OPTIQUES +* + 38 CONTINUE + WEIGHT=ABS(COS1)*POIDS + AUX1=1./DBLE(NSURF) + ISXX=0 + DO 439 ISS=NSURF1+1,NSURF + ISXX=ISXX+1 + IF(ISXX.GT.NSURF1)ISXX=1 + SURF1(ISS)=SURF1(ISXX) + 439 CONTINUE + ISXX=0 + DO 442 ISS=NSURF2+1,NSURF + ISXX=ISXX+1 + IF(ISXX.GT.NSURF2)ISXX=1 + SURF2(ISS)=SURF2(ISXX) + 442 CONTINUE + IF(IPRT .GE. 500) THEN + WRITE(IOUT,6000) ILINE,WEIGHT,IPOP,Y0,Z0,-SURF1(NSURF), + > -SURF2(NSURF) + WRITE(IOUT,6001) (MAT(K),POP(K),K=LPOP,1,-1), + > (MAT(K),POP(K),K=LPOP+1,IPOP) + ENDIF + WRITE(IFILE) 1,IPOP+NSURF+NSURF,WEIGHT,IANGL, + + (-SURF1(KS),KS=1,NSURF),(MAT(K),K=LPOP,1,-1), + + (MAT(K),K=LPOP+1,IPOP),(-SURF2(KS),KS=1,NSURF), + + (AUX1,KS=1,NSURF),(POP(K),K=LPOP,1,-1), + + (POP(K),K=LPOP+1,IPOP),(AUX1,KS=1,NSURF) +* +* INITIALIZATION +* + DO 383 IS=1,5 + FACEM(IS)=0 + SURF1(IS)=0 + SURF2(IS)=0 + 383 CONTINUE +* + 384 CONTINUE + Y0=Y00 + Z0=Z00 +* +* POSSIBILITE DE LA CONTINUITE DE LA TRACK SUR D'AUTRES VOLUMES +* APRES AVOIR INTERSECTEE UN VOLUME PERIPHERIQUE +* + LGPER=.FALSE. + IF(NCEL.GT.1) THEN + LGPER=.TRUE. +* +*-- RECHERCHE DES CELLULES DANS CORN OU LA TRACK PEUT ABOUTIR +* + IX=1 + I=CORN(IX) + LGDEB=.TRUE. + GO TO 401 + ENDIF +* +* DEPLACEMENT HORIZENTAL PUIS VERTICAL DANS LE PLAN YOZ +* + 40 Y0=Y0+PASY + + ILINE=ILINE+1 + LGOUT1=.FALSE. + LGOUTD=.FALSE. + LGOUTU=.FALSE. + LGDEB=.TRUE. + LGPAS0=.FALSE. + IF(Y0.GT.Y0MAX) GOTO 53 + IF(LGDIM) THEN + 711 SSQ=R2AZ-SCOS1*Y0*Y0 + IF(SSQ.GT.0.) THEN + SSS=SQRT(SSQ) + Y0COS=Y0*COS2 + XZTMAX=Z0+(SSS-Y0COS)*COAZ + XZTMIN=Z0+(-SSS-Y0COS)*COAZ + ZTMIN=MIN(XZTMAX,XZTMIN) + ZTMAX=MAX(XZTMAX,XZTMIN) + IF(ZTMAX.LT.ZMIN) THEN + Y0=Y0+PASY + ILINE=ILINE+1 + IF(Y0.GT.Y0MAX) GOTO 53 + GOTO 711 + ELSEIF(ZTMIN.GT.ZMAX) THEN + Y0=Y0+PASY + ILINE=ILINE+1 + IF(Y0.GT.Y0MAX) GOTO 53 + GOTO 711 + ENDIF + ENDIF + ENDIF +*CC I=1 + IX=1 + I=CORN(1) + KPER=0 + 401 Y00=Y0 + IPOP=0 + START=.TRUE. + DIRUP= .TRUE. + LGPAS0=.FALSE. +* +* RECHERCHE DE LA PREMIERE CELLULE INTERSECTEE +* + 42 CONTINUE + 50 CONTINUE + IF(LGPER) THEN + DO 421 IP=1,KPER + IF(I.EQ.MAT2(IP))GOTO 56 + 421 CONTINUE + ENDIF + X=REMESH(I) + Y=REMESH(NCEL+I) + IF(LGDIM) THEN + Z2=REMESH(NCELZ+I) + Z1=0. + IF(LGPG1) THEN + IF(I.GT.STAIRS(1))THEN + KPL=INT(AINT(REAL(I)/REAL(STAIRS(1)))) + IF(MOD(I,STAIRS(1)).NE.0) KPL=KPL+1 + ICC=I-STAIRS(KPL-1) + IF(KPL.GT.2)ICC=ICC+STAIRS(KPL-2) + Z1=REMESH(NCELZ+ICC) + ENDIF + ENDIF + ENDIF + YY=Y-Y0 + TERM1=SQRT3*(X+A) + TERM2=SQRT3*(X-A) + T(1)=(TERM1+YY)*DIV1 + T(2)=(YY+ACOS6)*COS2I + T(3)=(YY-TERM2)*DIV2 + T(4)=(YY+TERM2)*DIV1 + T(5)=(YY-ACOS6)*COS2I + T(6)=(YY-TERM1)*DIV2 + XDR(1)=COS1*T(1) + YDR(1)=SQRT3*(X-XDR(1)+A)+Y + XDR(2)=COS1*T(2) + YDR(2)=Y+ACOS6 + XDR(3)=COS1*T(3) + YDR(3)=SQRT3*(-X+A+XDR(3))+Y + XDR(4)=COS1*T(4) + YDR(4)=SQRT3*(X-XDR(4)-A)+Y + XDR(5)=COS1*T(5) + YDR(5)=Y-ACOS6 + XDR(6)=COS1*T(6) + YDR(6)=SQRT3*(-X+XDR(6)-A)+Y + IF(LGDIM) THEN + T(7)=(Z1-Z0)/COS3 + T(8)=(Z2-Z0)/COS3 + ZDR(1)=COS3*T(1)+Z0 + ZDR(2)=COS3*T(2)+Z0 + ZDR(3)=COS3*T(3)+Z0 + ZDR(4)=COS3*T(4)+Z0 + ZDR(5)=COS3*T(5)+Z0 + ZDR(6)=COS3*T(6)+Z0 + XDR(7)=COS1*T(7) + YDR(7)=COS2*T(7)+Y0 + ZDR(7)=Z1 + XDR(8)=COS1*T(8) + YDR(8)=COS2*T(8)+Y0 + ZDR(8)=Z2 + ENDIF + DO 45 J=1,LFACE + YDROIT=YDR(J) + XDROIT=XDR(J) + IF(LGDIM) THEN + ZDROIT=ZDR(J) + IF(ZDROIT.LE.Z2.AND.ZDROIT.GE.Z1) GOTO 64 + GOTO 45 + ENDIF + 64 CONTINUE +*---- +* MODIFIED FOR PRECISION ON LINUX +*---- + YT1=YDROIT-YDR(5) + IF(ABS(YT1) .LT. EPST) YT1=0.0D0 + YT2=YDR(2)-YDROIT + IF(ABS(YT2) .LT. EPST) YT2=0.0D0 + YT3=YDROIT-SQRT3*(X-XDROIT-A)-Y + IF(ABS(YT3) .LT. EPST) YT3=0.0D0 + YT4=SQRT3*(-X+XDROIT+A)+Y-YDROIT + IF(ABS(YT4) .LT. EPST) YT4=0.0D0 + YT5=YDROIT+SQRT3*(X-XDROIT+A)-Y + IF(ABS(YT5) .LT. EPST) YT5=0.0D0 + YT6=SQRT3*(X-XDROIT+A)+Y-YDROIT + IF(ABS(YT6) .LT. EPST) YT6=0.0D0 + XT1=XDROIT-X+A + IF(ABS(XT1) .LT. EPST) XT1=0.0D0 + XT2=X+A-XDROIT + IF(ABS(XT2) .LT. EPST) XT2=0.0D0 + XT3=X-A*0.5D0-XDROIT + IF(ABS(XT3) .LT. EPST) XT3=0.0D0 + XT4=XDROIT-X-A*0.5D0 + IF(ABS(XT4) .LT. EPST) XT4=0.0D0 + IF(YT1 .GE. DZ0 .AND. YT2 .GE. DZ0) THEN + IF(XT1 .GE. DZ0 .AND. XT2 .GE. DZ0) THEN + IF(XT3 .GT. DZ0)THEN + IF(YT4 .GE. DZ0 .AND. YT3 .GE. DZ0)THEN + ICELL=I + GOTO 15 + ENDIF + GOTO 45 + ENDIF + IF(XT4 .GT. DZ0)THEN + IF(YT6 .GE. DZ0 .AND. YT5 .GE. DZ0)THEN + ICELL=I + GOTO 15 + ENDIF + GOTO 45 + ENDIF + ICELL=I + GOTO 15 + ENDIF + ENDIF + 45 CONTINUE + 56 CONTINUE + IF(.NOT.LGPAS0) THEN + IX=IX+1 + IF(IX.LE.ICOR) THEN + I=CORN(IX) + GOTO 50 + ENDIF + ELSE + 57 ISURC=ISURC+1 + IF(ISURC.LE.ISURM) THEN + I=VOISIN(SURC(ISURC),IVOLC) + IF(I.GT.NCEL2) GOTO 57 + I=I+IETAG + ICELL0=IVOLC+IETAG + GOTO 50 + ENDIF + IF(LGDIM) THEN + IF(DIRUP) THEN + LGPASU=.TRUE. + IF(IETAG.LT.STAIRS(IPLANZ)) THEN + IETAG=IETAG+STAIRS(1) + ISURC=0 + IF(LGPG1) THEN + I=IVOLC+IETAG + IF(I.LE.NCEL)GOTO 50 + ENDIF + GOTO 57 + ENDIF + IF(LGPASU) THEN + GOTO 384 + ENDIF + ELSE + LGPASD=.TRUE. + IF(IETAG.GT.STAIRS(1)) THEN + IETAG=IETAG-STAIRS(1) + ISURC=0 + IF(LGPG1) THEN + I=IVOLC+IETAG + IF(I.LE.NCEL)GOTO 50 + ENDIF + GOTO 57 + ENDIF + IF(LGPASD) THEN + GOTO 384 + ENDIF + ENDIF + ENDIF + ENDIF + IF(LGPER) THEN + LGPER=.FALSE. + GOTO 40 + ENDIF +* + 58 LGPAS0=.FALSE. + Y0=Y0+PASY + ILINE=ILINE+1 + IF(Y0.GT.Y0MAX) GOTO 53 + IF(LGDIM) THEN + 811 SSQ=R2AZ-SCOS1*Y0*Y0 + IF(SSQ.GT.0.) THEN + SSS=SQRT(SSQ) + Y0COS=Y0*COS2 + XZTMAX=Z0+(SSS-Y0COS)*COAZ + XZTMIN=Z0+(-SSS-Y0COS)*COAZ + ZTMAX=MAX(XZTMAX,XZTMIN) + ZTMIN=MIN(XZTMAX,XZTMIN) + IF(ZTMAX.LT.ZMIN) THEN + Y0=Y0+PASY + ILINE=ILINE+1 + IF(Y0.GT.Y0MAX) GOTO 53 + GOTO 811 + ELSEIF(ZTMIN.GT.ZMAX) THEN + Y0=Y0+PASY + ILINE=ILINE+1 + IF(Y0.GT.Y0MAX) GOTO 53 + GOTO 811 + ENDIF + ENDIF + ENDIF + Y00=Y0 + IX=1 + I=CORN(1) + KPER=0 + LGDEB=.TRUE. + GOTO 42 + 53 IF(LGDIM) THEN + KPER=0 + IPOP=0 + START=.TRUE. + DIRUP= .TRUE. + LGDEB=.TRUE. + LGPAS0=.FALSE. + Z0=Z0+PASZ + Z00=Z0 + IF(Z0.LT.Z0MAX) GOTO 777 + ENDIF + RETURN +*---- +* FORMATS +*---- + 6000 FORMAT(' INTEGRATION LINE ',I10,5X,'WEIGHT =',1P,E15.6,5X, + > 'NUMBER OF SEGMENTS =',I10/ + > ' Y0 = ',E15.6,10X,'Z0 = ',E15.6,5X, + > ' SURFI=',I10,5X,'SURFF=',I10) + 6001 FORMAT(1P,(I6,E15.6)) + END |
