diff options
Diffstat (limited to 'Dragon/src/SYB7T0.f')
| -rw-r--r-- | Dragon/src/SYB7T0.f | 387 |
1 files changed, 387 insertions, 0 deletions
diff --git a/Dragon/src/SYB7T0.f b/Dragon/src/SYB7T0.f new file mode 100644 index 0000000..007c983 --- /dev/null +++ b/Dragon/src/SYB7T0.f @@ -0,0 +1,387 @@ +*DECK SYB7T0 + SUBROUTINE SYB7T0(MNA,NRD,COTE,RAYONS,JMINR,XCOTE,LFAIRE,DELR, + 1 IQW,PWA2,ZWA2,NXMIN,NXMAX,NZR,ZZR,NZI,ZZI) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Compute the tracking information related to an hexagonal sectorized +* heterogeneous cell. +* +*Copyright: +* Copyright (C) 2002 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): A. Hebert +* +*Parameters: input +* MNA number of angles in (0,$\\pi$/6). +* NRD one plus the number of tubes in the cell. +* COTE length of the hexagon side. +* RAYONS radius of each cylinder. +* JMINR first interception with side. +* XCOTE interceptions with side. +* LFAIRE tracking calculation flag (=.FALSE. only compute the number +* of real and integer tracking elements). +* DELR half distance between the tracks. +* IQW equal weight quadrature flag (=1 to use equal weight +* quadratures in angle and space). +* PWA2 weights of the angular quadrature set. +* ZWA2 base points of the angular quadrature set. +* +*Parameters: output +* NXMIN minimum number of tracks per region. +* NXMAX maximum number of tracks per region. +* NZR number of real tracking elements. +* ZZR real tracking information. +* NZI number of integer tracking elements. +* ZZI integer tracking information. +* +*----------------------------------------------------------------------- +* +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER MNA,NRD,JMINR,IQW,NXMIN,NXMAX,NZR,NZI,ZZI(*) + REAL COTE,RAYONS(NRD-1),XCOTE(NRD),DELR,PWA2(64), + & ZWA2(64),ZZR(*) + LOGICAL LFAIRE +*---- +* LOCAL VARIABLES +*---- + PARAMETER (PI314 = 3.141592653589793) + PARAMETER (PI6 = PI314 / 6) + PARAMETER (PI12 = PI314 / 12) + PARAMETER (SQRT3 = 1.732050807568877) + PARAMETER (SQRT32 = SQRT3 / 2) + REAL ANGLES(5) + REAL COSECT(3) + LOGICAL LGTRAE + LOGICAL LGTRAW + LOGICAL LVERIF + LOGICAL NTRIOR + REAL ORIGIN(4) + REAL PENTES(4) + CHARACTER * 4 TYSUIT + REAL WX(64) + REAL ZX(64) + INTEGER, ALLOCATABLE, DIMENSION(:) :: IXRAYO + REAL, ALLOCATABLE, DIMENSION(:) :: HXRAYO +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(IXRAYO(NRD*2+3),HXRAYO(NRD*2+3)) +*---- +* Interpolation des Trajectoires +*---- + IZI = 0 + IZR = 0 + LVERIF = .FALSE. + DELR2 = DELR * 2. + HAUTEU = COTE * SQRT32 +*---- +* /Debut/ Boucle sur les Angles +*---- + DO 350 IA = 1, MNA + MNT = 0 + IZI = IZI + 1 + IZIT = IZI +* + WANGIA = PWA2(IA) + ZAIA = ZWA2(IA) + 1. + YAIA = 1. - ZWA2(IA) + WANGIA = WANGIA / 6. +* + PHI = PI12 * ZAIA + PHI6 = PI12 * YAIA + PHI3 = PHI + PI6 + COSPHI = COS(PHI) + SINPHI = SIN(PHI) + COSPH3 = COS(PHI3) + SINPH3 = SIN(PHI3) + COSPH6 = COS(PHI6) + SINPH6 = SIN(PHI6) + TANPH6 = TAN(PHI6) + IF(LFAIRE) THEN + ZZR(IZR+1) = COSPH6 + ZZR(IZR+2) = SINPH6 + ZZR(IZR+3) = SINPHI + ZZR(IZR+4) = COSPHI + ZZR(IZR+5) = COSPH3 + ZZR(IZR+6) = -SINPH3 + ZZR(IZR+7) = WANGIA + ENDIF + IZR = IZR + 7 + ANGLES(1) = COSPHI + ANGLES(2) = SINPHI + ANGLES(3) = - TAN(PHI3) + ANGLES(4) = TANPH6 + ANGLES(5) = COSPHI / SINPHI +* + PENTES(1) = TANPH6 + PENTES(2) = ANGLES(5) + PENTES(3) = - TAN(PHI3) + PENTES(4) = PENTES(1) + ORIGIN(1) = - HAUTEU / COS(PHI6) + ORIGIN(2) = - HAUTEU / SINPHI + ORIGIN(3) = HAUTEU / COS(PHI3) + ORIGIN(4) = - ORIGIN(1) +* + COSECT(1) = COS(PHI3) + COSECT(2) = COS(PHI6) + COSECT(3) = SINPHI +*---- +* Rayon Max Pour cet angle(Rext) +*---- + XIZERO = HAUTEU * TANPH6 + DO MRA = JMINR, NRD-1 + IF(XCOTE(MRA) .GE. XIZERO) GOTO 140 + ENDDO + MRA = NRD + 140 MRAE = MRA + MRAW = MRA +*---- +* Les Lignes d'integrations sont limites +* et par les secteurs +* et par les couronnes +* +* Demarrage au centre de l'hexagone +*---- + IHMAX = NRD - MRA + IHMIN = IHMAX + 1 + HXRAYO(IHMIN) = ORIGIN(1) + DO IR = MRAW, 2, -1 + IHMAX = IHMAX + 1 + IXRAYO(IHMAX) = IR + HXRAYO(IHMAX+1) = - RAYONS(IR-1) + ENDDO + DO IS = 1, 3 + IXRAYO(IHMAX+IS) = 1 + HXRAYO(IHMAX+IS+1) = 0. + ENDDO + IHMAX = IHMAX + 3 + HXRAYO(IHMAX+1) = 0. + DO IR = 1, MRAE-1 + IHMAX = IHMAX + 1 + IXRAYO(IHMAX) = IR + HXRAYO(IHMAX+1) = RAYONS(IR) + ENDDO + IHMAX = IHMAX + 1 + IXRAYO(IHMAX) = MRAE + HXRAYO(IHMAX+1) = ORIGIN(4) +* + DELTCW = COTE * COSECT(1) + DELTAS = COTE * COSECT(2) + DELTCE = COTE * COSECT(3) + ORIPHI = HAUTEU * COSPHI + ORIPH6 = HAUTEU * SINPH6 + ORIPH3 = HAUTEU * SINPH3 +* + ISW2 = 2 + CALL SYB7TW(NRD, JMINR, XCOTE, IXRAYO(IHMIN), + & DELTCW, DELTAS, ORIPH6, ORIPHI, + & COSPH6, SINPHI, + & ISW2, LGTRAW, DELTAW) + ISW = ISW2 / 2 +* + ISE2 = 8 + CALL SYB7TE(NRD, JMINR, XCOTE, IXRAYO(IHMAX), + & DELTCE, DELTAS, ORIPH6, ORIPH3, + & COSPH6, COSPH3, + & ISE2, LGTRAE, DELTAE) +* + DELTAC = 0. + NTRIOR = .TRUE. + IRSUIT = 0 +*---- +* /Debut/ Boucle sur les Trajectoires +*---- + DO WHILE(NTRIOR) + NHMAX = IHMAX + 1 - IHMIN + DELTAP = DELTAC +* + TYSUIT = 'Sud' + IHSUIT = IHMIN + DELTAC = DELTAS + IF(DELTAW .LT. DELTAC) THEN + TYSUIT = 'West' + IHSUIT = IHMIN + DELTAC = DELTAW + ENDIF + IF(DELTAE .LT. DELTAC) THEN + TYSUIT = 'Est' + IHSUIT = IHMAX + DELTAC = DELTAE + ENDIF + CALL SYB7TN(IHMIN, IHMAX, IXRAYO, ISW, + & COSECT, NRD-1, RAYONS, + & TYSUIT, IHSUIT, DELTAC, IRSUIT) +* + DELTAX = DELTAC - DELTAP + IF(DELTAX .LE. DELR2) THEN + NX = 1 + ZX(1) = 0.0 + WX(1) = 2.0 + ELSE + NX = INT(DELTAX / DELR2 + 1) + IF(IQW.EQ.0) THEN +* GAUSS-LEGENDRE INTEGRATION POINTS. ZX(I) IS NOT USED. + IF(NX.GT.20) THEN + IF(NX.LT.24) THEN + NX=24 + ELSE IF(NX.LT.28) THEN + NX=28 + ELSE IF(NX.LT.32) THEN + NX=32 + ELSE IF(NX.LT.64) THEN + NX=64 + ELSE IF(NX.GT.64) THEN + CALL XABORT('SYB7T0: GAUSS OVERFLOW.') + ENDIF + ENDIF + CALL ALGPT(NX,-1.0,1.0,ZX,WX) + ELSE +* EQUAL WEIGHT INTEGRATION POINTS. + DO 30 I=1,NX + ZX(I)=(2.0*REAL(I)-1.0)/REAL(NX)-1.0 + WX(I)=2.0/REAL(NX) + 30 CONTINUE + ENDIF + ENDIF + NXMIN = MIN(NX, NXMIN) + NXMAX = MAX(NX, NXMAX) +* + MNT = MNT + 1 + IF(LFAIRE) THEN + ZZI(IZI+1) = NHMAX + ZZI(IZI+2) = NX + DO I=0,NHMAX-1 + ZZI(IZI+3+I)=IXRAYO(IHMIN+I) + ENDDO +* + DELTAR = DELTAP + DO 250 IX = 1, NX +* + WW = 0.5 * WX(IX) +* + IZR = IZR + 1 + ZZR(IZR) = WW * WANGIA * DELTAX + DDELTA = DELTAX * WW + DELTAR = DELTAR + DDELTA +* +* Position de L'intersection Gauche(West) + ZZW = DELTAR * PENTES(ISW) + ORIGIN(ISW) +* +* Position de L'intersection Droite(Est) + ISE = ISE2 / 2 + ZZE = DELTAR * PENTES(ISE) + ORIGIN(ISE) +*---- +* Longueur des intersections +*---- + CALL SYB7TC(DELTAR, DDELTA, ANGLES(ISW+2), NHMAX, ZZI(IZI+3), + & NRD-1, RAYONS, ZZW, ZZE, + & ZZR(IZR+1), HXRAYO(IHMIN)) + IZR = IZR + NHMAX +* + 250 CONTINUE + ELSE +*---- +* Pour le comptage il faudra compter +* pour plus tard (les douzes symetries) +* deux indices de plus pour les surfaces Entrante et Sortante +*---- + IZR = IZR +(NHMAX + 1) * NX + IZI = IZI + 2 + ENDIF +* + IZI = IZI + NHMAX + 2 +* + IF(TYSUIT .EQ. 'Est') THEN + IRC = IXRAYO(IHMAX) + IF(LGTRAE) THEN + IHMAX = IHMAX - 1 + IF(IRC .EQ. IXRAYO(IHMAX)) ISE2 = ISE2 - 1 + ELSEIF(IRC .GE. NRD) THEN + NTRIOR = .FALSE. + ELSE + IHMAX = IHMAX + 1 + IXRAYO(IHMAX) = IRC + 1 + HXRAYO(IHMAX+1) = HXRAYO(IHMAX) + ENDIF + IF(NTRIOR) THEN + CALL SYB7TE(NRD, JMINR, XCOTE, IXRAYO(IHMAX), + & DELTCE, DELTAS, ORIPH6, ORIPH3, + & COSPH6, COSPH3, + & ISE2, LGTRAE, DELTAE) + ENDIF + ELSEIF(TYSUIT .EQ. 'West') THEN + IRC = IXRAYO(IHMIN) + IF(LGTRAW) THEN + IHMIN = IHMIN + 1 + IF(IRC .EQ. IXRAYO(IHMIN)) ISW2 = ISW2 + 1 + ELSEIF(IRC .GE. NRD) THEN + NTRIOR = .FALSE. + ELSE + IHMIN = IHMIN - 1 + IXRAYO(IHMIN) = IRC + 1 + HXRAYO(IHMIN) = HXRAYO(IHMIN+1) + ENDIF + NTRIOR = ISW .LE. 2 + IF(NTRIOR) THEN + CALL SYB7TW(NRD, JMINR, XCOTE, IXRAYO(IHMIN), + & DELTCW, DELTAS, ORIPH6, ORIPHI, + & COSPH6, SINPHI, + & ISW2, LGTRAW, DELTAW) + IF((ISW2 / 2) .NE. ISW) THEN + IF(LFAIRE) THEN + ZZI(IZI+1) = 0 + ZZI(IZI+2) = 0 + MNT = MNT + 1 + ENDIF + IZI = IZI+2 + ENDIF + ISW = ISW2 / 2 + IF(ISW2 .EQ. 5) THEN + IF(LGTRAW) THEN + HC = DELTAW * PENTES(ISW) + ORIGIN(ISW) + LGTRAW = HC .GE. 0. + ENDIF + ENDIF + ENDIF + ELSEIF(TYSUIT .EQ. 'Coin') THEN + IXRAYO(IHSUIT) = IRSUIT + ELSEIF(TYSUIT .EQ. 'Tang') THEN +* +** Decalage du tableau entier de 2 Cases + DO I = 2, IHMAX - IHSUIT + IXRAYO(IHSUIT+I-2) = IXRAYO(IHSUIT+I) + ENDDO +* +** Decalage du tableau reel de 2 Cases + DO I = 2, IHMAX + 1 - IHSUIT + HXRAYO(IHSUIT+I-2) = HXRAYO(IHSUIT+I) + ENDDO +* + IHMAX = IHMAX - 2 + ELSE + NTRIOR = .FALSE. + ENDIF +* +* /Fin/ Boucle sur les Trajectoires + ENDDO +* +* /Fin/ Boucle sur les Angles + IF(LFAIRE) ZZI(IZIT) = MNT + 350 CONTINUE + NZI = IZI + NZR = IZR +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(HXRAYO,IXRAYO) +* + RETURN + END |
