diff options
| author | stainer_t <thomas.stainer@oecd-nea.org> | 2025-09-08 13:48:49 +0200 |
|---|---|---|
| committer | stainer_t <thomas.stainer@oecd-nea.org> | 2025-09-08 13:48:49 +0200 |
| commit | 7dfcc480ba1e19bd3232349fc733caef94034292 (patch) | |
| tree | 03ee104eb8846d5cc1a981d267687a729185d3f3 /Dragon/src/MCGASM.f | |
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/MCGASM.f')
| -rw-r--r-- | Dragon/src/MCGASM.f | 675 |
1 files changed, 675 insertions, 0 deletions
diff --git a/Dragon/src/MCGASM.f b/Dragon/src/MCGASM.f new file mode 100644 index 0000000..d58660d --- /dev/null +++ b/Dragon/src/MCGASM.f @@ -0,0 +1,675 @@ +*DECK MCGASM + SUBROUTINE MCGASM(SUBPJJ,SUBDS2,SUBDSP,SUBDSC,IPTRK,KPSYS,IPRINT, + 1 IFTRAK,NANI,NGEFF,NFI,NREG,NLONG,M,NMU,NANGL, + 2 N2MAX,LC,NDIM,NGIND,CYCLIC,ISCR,CAZ0,CAZ1,CAZ2, + 3 CPO,LC0,PACA,LPS,LTMT,NPJJM,LACA,LPJJ,LPJJAN, + 4 SIGAL,LPRISM,N2REG,N2SOU,NZP,DELU,FACSYM,ISTRM) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Preconditioning matrices calculation based on the Algebraic Collapsing +* Acceleration developed by I. R. Suslov and R. Le Tellier +* or Self-Collision Probabilities acceleration developed by G.J. Wu +* and R. Roy. +* +*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): I. Suslov and R. Le Tellier +* +*Parameters: input/output +* SUBPJJ PJJ calculation subroutine. +* SUBDS2 ACA coefficients summation subroutine. +* SUBDSP ACA coefficients position subroutine. +* SUBDSC ACA coefficients calculation subroutine. +* IPTRK pointer to the tracking (L_TRACK signature). +* KPSYS pointer array for each group properties. +* IPRINT print parameter (equal to zero for no print). +* IFTRAK tracking file unit number if IOFSET=0. +* NANI number of Legendre orders. +* NGEFF number of groups to process. +* NFI total number of volumes and surfaces for which specific values +* of the neutron flux and reactions rates are required. +* NREG number of volumes for which specific values +* of the neutron flux and reactions rates are required. +* NLONG order of the corrective system. +* M number of material mixtures. +* NMU order of the polar quadrature in 2D / 1 in 3D. +* NANGL number of tracking angles in the plane. +* N2MAX maximum number of elements in a track. +* LC dimension of vector MCU. +* NDIM number of dimensions for the geometry. +* NGIND index of the groups to process. +* CYCLIC flag set to .true. for cyclic tracking. +* ISCR SCR preconditionning flag. +* CAZ0 cosines of the tracking polar angles in 3D. +* CAZ1 first cosines of the different tracking azimuthal angles. +* CAZ2 second cosines of the different tracking azimuthal angles. +* CPO cosines of the different tracking polar angles in 2D. +* PACA type of preconditioner to solve the ACA corrective system. +* LC0 used in ILU0-ACA acceleration. +* LPS dimension of JS. +* LTMT tracking merging flag. +* NPJJM number of pjj modes to store for STIS option. +* LACA ACA flag. +* LPJJ PJJ flag. +* LPJJAN anisotropic PJJ flag. +* SIGAL albedos and total cross sections array. +* LPRISM 3D prismatic extended tracking flag. +* N2REG number of regions in the 2D tracking if LPRISM. +* N2SOU number of external surfaces in the 2D tracking if LPRISM. +* NZP number of z-plans if LPRISM. +* DELU input track spacing for 3D track reconstruction if LPRISM. +* FACSYM tracking symmetry factor for maximum track length if LPRISM. +* ISTRM type of streaming effect: +* =1 no streaming effect; +* =2 isotropic streaming effect; +* =3 anisotropic streaming effect. +* +*Reference: +* Igor R. Suslov, "An Algebraic Collapsing Acceleration in Long +* Characteristics Transport Theory" Proc. of 11-th Symposium of +* AER, 178/9-188, Csopak, September 2001. +* \\\\ +* Igor R. Suslov, "Solution of Transport Equation in 2- and 3- +* dimensional Irregular Geometry by the Method of Characteristics" +* Int. Conf. Mathematical. Methods and Supercomputing in Nuclear +* Applications, Karlsruhe, 1994. +* \\\\ +* G.J. Wu and R. Roy, "Acceleration Techniques for Trajectory-based +* Deterministic 3D Transport Solvers", +* Ann. Nucl. Energy, 30, 567-583 (2003). +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPTRK,KPSYS(NGEFF) + INTEGER IPRINT,IFTRAK,NGEFF,NFI,NREG,NLONG,M,NMU,NANGL,N2MAX,LC, + 1 NDIM,NGIND(NGEFF),LC0,PACA,LPS,NPJJM,N2REG,N2SOU,NZP,ISTRM + REAL CPO(NMU),SIGAL(-6:M,NGEFF),DELU,FACSYM + DOUBLE PRECISION CAZ0(NANGL),CAZ1(NANGL),CAZ2(NANGL) + LOGICAL LTMT,LACA,LPJJ,LPJJAN,LPRISM,LFORC,CYCLIC + EXTERNAL SUBPJJ,SUBDS2,SUBDSP,SUBDSC +*---- +* LOCAL VARIABLES +*---- + TYPE(C_PTR) JPSYS + INTEGER NCODE(6),SSYM + REAL T1,T2,T3,XMUANG(1) + DOUBLE PRECISION WEIGHT,WEIGHT0 + CHARACTER TEXT4*4 + INTEGER, TARGET, SAVE, DIMENSION(1) :: IDUMMY + INTEGER, TARGET, SAVE, DIMENSION(1,1) :: I2DUMMY + REAL, TARGET, SAVE, DIMENSION(1) :: DUMMY +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, POINTER, DIMENSION(:) :: NZON,KM,IM,MCU,NZONA,IPERM, + 1 JU,IM0,MCU0,IS,JS + INTEGER, POINTER, DIMENSION(:,:) :: PJJIND + REAL, POINTER, DIMENSION(:) :: ZMU,WZMU,V,VA + TYPE(C_PTR) :: ZMU_PTR,WZMU_PTR,NZON_PTR,V_PTR,KM_PTR,IM_PTR, + 1 MCU_PTR,NZONA_PTR,VA_PTR,IPERM_PTR,JU_PTR,IM0_PTR,MCU0_PTR, + 2 PJJIND_PTR,IS_PTR,JS_PTR + INTEGER, ALLOCATABLE, DIMENSION(:) :: NOM,NOM0,PREV,NEXT,NOM3D, + 1 NOM3D0,KANGL,KEYANI + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: ISGNR + REAL, ALLOCATABLE, DIMENSION(:) :: ZMUA,WZMUA,PJJ,PSJ,XSW,CQ, + 1 DIAGQ,DIAGFR,CFR,WORK,LUDF,LUCF,PJJX,PJJY,PJJZ,PJJXI,PJJYI, + 2 PJJZI,PSJX,PSJY,PSJZ + REAL, ALLOCATABLE, DIMENSION(:,:) :: RHARM + REAL, ALLOCATABLE, DIMENSION(:,:,:) :: TRHAR + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: H,H0,HH,H3D,H3D0, + 1 PJJD,PJJDX,PJJDY,PJJDZ,PJJDXI,PJJDYI,PJJDZI + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: DIAGF,CF + INTEGER, POINTER, DIMENSION(:) :: INDREG + REAL, POINTER, DIMENSION(:) :: ZZZ + DOUBLE PRECISION, POINTER, DIMENSION(:) :: VNORF,CMU,CMUI,SMU, + 1 SMUI,TMU,TMUI + TYPE(C_PTR) :: INDREG_PTR,ZZZ_PTR,VNORF_PTR,CMU_PTR,CMUI_PTR, + 1 SMU_PTR,SMUI_PTR,TMU_PTR,TMUI_PTR +*---- +* INITIALIZE POINTERS +*---- + KM=>IDUMMY + IM=>IDUMMY + MCU=>IDUMMY + NZONA=>IDUMMY + VA=>DUMMY + IPERM=>IDUMMY + JU=>IDUMMY + IM0=>IDUMMY + MCU0=>IDUMMY + IS=>IDUMMY + JS=>IDUMMY + PJJIND=>I2DUMMY +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(DIAGF(NLONG,NGEFF),CF(LC,NGEFF)) +*---- +* TRACKING INFORMATION PINNING AND MEMORY ALLOCATION +* NZON index-number of the mixture type assigned to each volume. +* NZONA index-number of the mixture type assigned to each volume for +* ACA. +* ISGNR array of the spherical harmonics signs for the different +* reflections. +* V volumes and surfaces. +* VA volumes and surfaces reordered for ACA. +* ZMU polar quadrature set in 2D. +* WZMU polar quadrature set in 2D. +* KM used in ACA acceleration. +* MCU used in ACA acceleration. +* IM used in ACA acceleration. +* JU used in ACA acceleration for ilu0. +* IPERM permutation array for the unknowns of the corrective system +* for ilu0. +* LC0 used in ILU0-ACA acceleration. +* IM0 used in ILU0-ACA acceleration. +* MCU0 used in ILU0-ACA acceleration. +* IS arrays for surfaces neighbors +* JS JS(IS(ISOUT)+1:IS(ISOUT+1)) give the neighboring regions to +* surface ISOUT. +* PJJIND index of the modes for STIS option. +*---- +*--- +* GENERATE ALL SIGNS FOR SPHERICAL HARMONICS +*--- + IF(NDIM.EQ.1) THEN + NFUNL=NANI + NMOD=2 + ELSE IF((.NOT.LPRISM).AND.(NDIM.EQ.2)) THEN + NFUNL=NANI*(NANI+1)/2 + NMOD=4 + ELSE ! NDIM.EQ.3 + NFUNL=NANI*NANI + NMOD=8 + ENDIF + ALLOCATE(ISGNR(NMOD,NFUNL),KEYANI(NFUNL)) + CALL MOCIK3(NANI-1,NFUNL,NMOD,ISGNR,KEYANI) + DEALLOCATE(KEYANI) +*--- +* ASSEMBLY OF SCR AND ACA MATRICES +*--- +* recover polar quadrature + CALL LCMGPD(IPTRK,'ZMU$MCCG',ZMU_PTR) + CALL LCMGPD(IPTRK,'WZMU$MCCG',WZMU_PTR) + CALL C_F_POINTER(ZMU_PTR,ZMU,(/ NMU /)) + CALL C_F_POINTER(WZMU_PTR,WZMU,(/ NMU /)) +* recover MATALB and VOLSUR + CALL LCMGPD(IPTRK,'NZON$MCCG',NZON_PTR) + CALL LCMGPD(IPTRK,'V$MCCG',V_PTR) + CALL C_F_POINTER(NZON_PTR,NZON,(/ NFI /)) + CALL C_F_POINTER(V_PTR,V,(/ NFI /)) + IF(LACA) THEN +* recover connection matrices + CALL LCMGPD(IPTRK,'KM$MCCG',KM_PTR) + CALL LCMGPD(IPTRK,'IM$MCCG',IM_PTR) + CALL LCMGPD(IPTRK,'MCU$MCCG',MCU_PTR) + CALL C_F_POINTER(KM_PTR,KM,(/ NFI /)) + CALL C_F_POINTER(IM_PTR,IM,(/ NLONG+1 /)) + CALL C_F_POINTER(MCU_PTR,MCU,(/ LC /)) +* recover modified MATALB and VOLSUR + CALL LCMGPD(IPTRK,'NZONA$MCCG',NZONA_PTR) + CALL LCMGPD(IPTRK,'VA$MCCG',VA_PTR) + CALL C_F_POINTER(NZONA_PTR,NZONA,(/ NFI /)) + CALL C_F_POINTER(VA_PTR,VA,(/ NFI /)) +* recover permutation array + CALL LCMGPD(IPTRK,'INVPI$MCCG',IPERM_PTR) + CALL C_F_POINTER(IPERM_PTR,IPERM,(/ NFI /)) + IF(PACA.GE.2) THEN + CALL LCMGPD(IPTRK,'JU$MCCG',JU_PTR) + CALL C_F_POINTER(JU_PTR,JU,(/ NLONG /)) + IF(PACA.EQ.3) THEN + CALL LCMLEN(IPTRK,'IM0$MCCG',ILONG1,ITYLCM) + CALL LCMLEN(IPTRK,'MCU0$MCCG',ILONG2,ITYLCM) + CALL LCMGPD(IPTRK,'IM0$MCCG',IM0_PTR) + CALL LCMGPD(IPTRK,'MCU0$MCCG',MCU0_PTR) + CALL C_F_POINTER(IM0_PTR,IM0,(/ ILONG1 /)) + CALL C_F_POINTER(MCU0_PTR,MCU0,(/ ILONG2 /)) + ENDIF + ENDIF + ENDIF + IF((.NOT.CYCLIC).AND.(ISCR.GT.0)) THEN +* recover (IS,JS) array for surfaces neighbors identification + CALL LCMGPD(IPTRK,'IS$MCCG',IS_PTR) + CALL LCMGPD(IPTRK,'JS$MCCG',JS_PTR) + CALL C_F_POINTER(IS_PTR,IS,(/ NFI-NREG+1 /)) + CALL C_F_POINTER(JS_PTR,JS,(/ LPS /)) + ENDIF + IF(LPJJAN) THEN + CALL LCMGPD(IPTRK,'PJJIND$MCCG',PJJIND_PTR) + CALL C_F_POINTER(PJJIND_PTR,PJJIND,(/ NPJJM,2 /)) + ENDIF + IF(LPRISM) THEN + CALL LCMGET(IPTRK,'NCODE',NCODE) + IF(NCODE(6).EQ.30) THEN + IF(NCODE(5).EQ.30) THEN +* Z- and Z+ surfaces symmetry + SSYM=2 + ELSE +* Z+ symmetry + SSYM=1 + ENDIF + ELSE + SSYM=0 + ENDIF + NMAX=(INT(FACSYM)+1)*N2MAX*(NZP+2) + ELSE + NMAX=N2MAX + ENDIF + ALLOCATE(NOM(N2MAX)) + ALLOCATE(H(N2MAX),HH(N2MAX),ZMUA(NMU),WZMUA(NMU)) + IF(LPJJ) THEN +* Self-Collision Probabilities + ALLOCATE(PJJ(NREG*NPJJM*NGEFF),PJJX(NREG*NPJJM*NGEFF), + > PJJXI(NREG*NPJJM*NGEFF),PJJY(NREG*NPJJM*NGEFF), + > PJJYI(NREG*NPJJM*NGEFF),PJJZ(NREG*NPJJM*NGEFF), + > PJJZI(NREG*NPJJM*NGEFF)) + IF(LPS.GT.0) THEN + ALLOCATE(PSJ(LPS*NGEFF),PSJX(LPS*NGEFF),PSJY(LPS*NGEFF), + > PSJZ(LPS*NGEFF)) + PSJ(:LPS*NGEFF)=0.0 + PSJX(:LPS*NGEFF)=0.0 + PSJY(:LPS*NGEFF)=0.0 + PSJZ(:LPS*NGEFF)=0.0 + ENDIF + ALLOCATE(PJJD(NREG*NPJJM*NGEFF),PJJDX(NREG*NPJJM*NGEFF), + > PJJDXI(NREG*NPJJM*NGEFF),PJJDY(NREG*NPJJM*NGEFF), + > PJJDYI(NREG*NPJJM*NGEFF),PJJDZ(NREG*NPJJM*NGEFF), + > PJJDZI(NREG*NPJJM*NGEFF)) + PJJD(:NREG*NPJJM*NGEFF)=0.0D0 + PJJDX(:NREG*NPJJM*NGEFF)=0.0D0 + PJJDXI(:NREG*NPJJM*NGEFF)=0.0D0 + PJJDY(:NREG*NPJJM*NGEFF)=0.0D0 + PJJDYI(:NREG*NPJJM*NGEFF)=0.0D0 + PJJDZ(:NREG*NPJJM*NGEFF)=0.0D0 + PJJDZI(:NREG*NPJJM*NGEFF)=0.0D0 + ENDIF + IF(LACA) THEN +* Algebraic Collapsing Acceleration + ALLOCATE(XSW((M+1)*NANI*NGEFF)) + IF(LTMT) ALLOCATE(NOM0(N2MAX),H0(N2MAX)) + ALLOCATE(PREV(NMAX),NEXT(NMAX)) + ALLOCATE(CQ(LC*NGEFF),DIAGQ(NLONG*NGEFF),DIAGFR(NLONG),CFR(LC), + 1 WORK(6*NMAX)) + IF(PACA.GE.2) THEN + ALLOCATE(LUDF(NLONG)) + IF(LC0.GT.0) ALLOCATE(LUCF(LC0)) + ENDIF + DO II=1,NGEFF + JPSYS=KPSYS(II) + CALL LCMGET(JPSYS,'DRAGON-S0XSC',XSW((II-1)*(M+1)+1)) + ENDDO + CQ(:LC*NGEFF)=0.0 + DIAGQ(:NLONG*NGEFF)=0.0 + DIAGF(:NLONG,:NGEFF)=0.0D0 + CF(:LC,:NGEFF)=0.0D0 + ENDIF +* + NMUA=NMU + DO IE=1,NMUA + ZMUA(IE)=ZMU(IE) + WZMUA(IE)=WZMU(IE) + ENDDO + IF((.NOT.LPRISM).AND.(NDIM.EQ.2).AND.LTMT) THEN + NMUA=1 + ZMUI=ZMUA(1) + W=WZMUA(1) + TEMP=ZMUI*W + DO IE=2,NMU + ZMUI=ZMUA(IE) + WZMUI=WZMUA(IE) + W=W+WZMUI + TEMP=TEMP+ZMUI*WZMUI + ENDDO + ZMUA=TEMP/W + WZMUA=W + ENDIF +*--- +* SUMMATION UPON THE TRACKING +*--- + REWIND IFTRAK + READ(IFTRAK) TEXT4,NCOMNT,NBTR,IFMT + DO ICOM=1,NCOMNT + READ(IFTRAK) + ENDDO + READ(IFTRAK) (NITMA,II=1,7),MXSUB,NITMA + DO ICOM=1,6 + READ(IFTRAK) + ENDDO + CALL KDRCPU(T1) + IANGL0=0 + IPANG=1 + NMERG=0 + NTR=0 + NTRTMT=0 + NSE=0 + NSETMT=0 + LFORC=.FALSE. + NTPROC=1 +* + ALLOCATE(KANGL(MXSUB)) + IF(LPRISM) THEN +* 3D PRISMATIC GEOMETRY CONSTRUCTED FROM A 2D TRACKING + N3TR=0 + N3TRTMT=0 + N3SE=0 + N3SETMT=0 + ALLOCATE(NOM3D(NMAX),H3D(NMAX)) + IF(LTMT) ALLOCATE(NOM3D0(2*NMAX),H3D0(2*NMAX)) + CALL LCMSIX(IPTRK,'PROJECTION',1) + CALL LCMGPD(IPTRK,'IND2T3',INDREG_PTR) + CALL LCMGPD(IPTRK,'ZCOORD',ZZZ_PTR) + CALL LCMGPD(IPTRK,'VNORF',VNORF_PTR) + CALL LCMGPD(IPTRK,'CMU',CMU_PTR) + CALL LCMGPD(IPTRK,'CMUI',CMUI_PTR) + CALL LCMGPD(IPTRK,'SMU',SMU_PTR) + CALL LCMGPD(IPTRK,'SMUI',SMUI_PTR) + CALL LCMGPD(IPTRK,'TMU',TMU_PTR) + CALL LCMGPD(IPTRK,'TMUI',TMUI_PTR) + CALL C_F_POINTER(INDREG_PTR,INDREG,(/ (N2SOU+N2REG+1)*(NZP+1) /)) + CALL C_F_POINTER(ZZZ_PTR,ZZZ,(/ NZP+1 /)) + CALL C_F_POINTER(VNORF_PTR,VNORF,(/ NREG*NANGL*NMU*2 /)) + CALL C_F_POINTER(CMU_PTR,CMU,(/ NMU /)) + CALL C_F_POINTER(CMUI_PTR,CMUI,(/ NMU /)) + CALL C_F_POINTER(SMU_PTR,SMU,(/ NMU /)) + CALL C_F_POINTER(SMUI_PTR,SMUI,(/ NMU /)) + CALL C_F_POINTER(TMU_PTR,TMU,(/ NMU /)) + CALL C_F_POINTER(TMUI_PTR,TMUI,(/ NMU /)) + CALL LCMSIX(IPTRK,'PROJECTION',2) + DO 10 ILINE=1,NBTR + READ(IFTRAK) NSUB,NSEG,WEIGHT,(KANGL(II),II=1,NSUB), + 1 (NOM(II),II=1,NSEG),(H(II),II=1,NSEG) + IF(NSUB.GT.MXSUB) CALL XABORT('MCGASM: MXSUB OVERFLOW.') + IANGL=KANGL(1) + IF(LPJJ) THEN +* ---------------------------- +* Self-Collision Probabilities +* ---------------------------- + NR2SE=NSEG-2 + HH=0.0 + DO II=0,NR2SE + HH(II+2)=HH(II+1)+H(II+2) + ENDDO + CALL MCGPTS(SUBPJJ,NFI,NREG,M,NANI,NFUNL,NANGL,NMU,NMOD, + 1 LPS,NPJJM,NGEFF,IANGL,NSEG,ISGNR,NZON,NOM,IS,JS, + 2 PJJIND,WEIGHT,CPO,CAZ1,CAZ2,ZMU,WZMU,SIGAL,HH,PSJ, + 3 PJJD,LPJJAN,NR2SE,NMAX,NZP,N2REG,N2SOU,DELU,INDREG, + 4 ZZZ,VNORF,CMU,CMUI,SMU,SMUI,TMU,TMUI,SSYM) + ENDIF + IF(LTMT) THEN +* ---------------- +* Tracking Merging (angle by angle) for ACA +* ---------------- + NTR=NTR+1 + NSE=NSE+NSEG + LFORC=(IPANG.NE.IANGL) + IF(LFORC) THEN + ITEMP=IANGL + IANGL=IPANG + IPANG=ITEMP + ENDIF + IF(ILINE.EQ.NBTR) LFORC=.TRUE. + CALL MCGTMT(NMERG,NTRTMT,NSETMT,NSEG,NSEG0,NOM,NOM0,WEIGHT, + 1 WEIGHT0,H,H0,LFORC,NTPROC) + IF(NTPROC.EQ.0) GOTO 10 + ENDIF + IF(LACA) THEN +* --------------------------------- +* Algebraic Collapsing Acceleration +* --------------------------------- + NR2SE=NSEG-2 + HH=0.0 + DO II=0,NR2SE + HH(II+2)=HH(II+1)+H(II+2) + ENDDO + CALL MCGPTA(NFI,NREG,NLONG,M,NANGL,NMU,LC,NGEFF, + 1 IANGL,NSEG,NOM,NZONA,IPERM,KM,IM,MCU,PREV,NEXT, + 2 WEIGHT,ZMU,WZMU,SIGAL,XSW,HH,DIAGQ,CQ,DIAGF, + 3 CF,WORK,LTMT,SUBDS2,SUBDSP,SUBDSC,NR2SE,NMAX, + 4 NZP,N2REG,N2SOU,DELU,INDREG,NOM3D,NOM3D0,H3D, + 5 H3D0,ZZZ,VNORF,CMU,CMUI,SMU,SMUI,TMU,TMUI,N3TR, + 6 N3TRTMT,N3SE,N3SETMT,NTPROC,SSYM) + ENDIF + 10 CONTINUE + IF(LTMT) THEN +* process last integration line for ACA TMT + CALL MCGTMT(NMERG,NTRTMT,NSETMT,NSEG,NSEG0,NOM,NOM0,WEIGHT, + 1 WEIGHT0,H,H0,LFORC,NTPROC) + NR2SE=NSEG-2 + HH=0.0 + DO II=0,NR2SE + HH(II+2)=HH(II+1)+H(II+2) + ENDDO + CALL MCGPTA(NFI,NREG,NLONG,M,NANGL,NMU,LC,NGEFF,IANGL,NSEG, + 1 NOM,NZONA,IPERM,KM,IM,MCU,PREV,NEXT,WEIGHT,ZMU,WZMU, + 2 SIGAL,XSW,HH,DIAGQ,CQ,DIAGF,CF,WORK,LTMT,SUBDS2,SUBDSP, + 3 SUBDSC,NR2SE,NMAX,NZP,N2REG,N2SOU,DELU,INDREG,NOM3D, + 4 NOM3D0,H3D,H3D0,ZZZ,VNORF,CMU,CMUI,SMU,SMUI,TMU,TMUI, + 5 N3TR,N3TRTMT,N3SE,N3SETMT,NTPROC,SSYM) + DEALLOCATE(H3D0,NOM3D0) + ENDIF + DEALLOCATE(H3D,NOM3D) + ELSE +* REGULAR 2D OR 3D GEOMETRY + ALLOCATE(TRHAR(NMU,NFUNL,NANGL),RHARM(NMU,NFUNL)) + DO IANGL=1,NANGL + IF(NDIM.EQ.2) THEN + CALL MOCCHR(NDIM,NANI-1,NFUNL,NMU,CPO(1),CAZ1(IANGL), + 1 CAZ2(IANGL),RHARM) + ELSE + XMUANG(1)=REAL(CAZ0(IANGL)) + CALL MOCCHR(NDIM,NANI-1,NFUNL,1,XMUANG(1),CAZ1(IANGL), + 1 CAZ2(IANGL),RHARM) + ENDIF + DO JF=1,NFUNL + DO IE=1,NMU + TRHAR(IE,JF,IANGL)=ISGNR(1,JF)*RHARM(IE,JF) + ENDDO + ENDDO + ENDDO + DEALLOCATE(RHARM) + DO 20 ILINE=1,NBTR + READ(IFTRAK) NSUB,NSEG,WEIGHT,(KANGL(II),II=1,NSUB), + 1 (NOM(II),II=1,NSEG),(H(II),II=1,NSEG) + IF(NSUB.GT.MXSUB) CALL XABORT('MCGASM: MXSUB OVERFLOW.') + IANGL=KANGL(1) + DO II=1,NSEG + IF(NOM(II).LT.0) THEN + NOM(II)=NREG-NOM(II) + ELSE IF(NOM(II).EQ.0) THEN + NOM(II)=NREG+1 + ENDIF + ENDDO + IF(LPJJ) THEN +* ---------------------------- +* Self-Collision Probabilities +* ---------------------------- + IF(ISTRM.LE.2) THEN + CALL MCGDS4(SUBPJJ,NSEG,NSUB,NMU,LPS,NFUNL,NANGL,NGEFF, + 1 WEIGHT,KANGL,TRHAR,H,ZMU,WZMU,NOM,NZON,NFI,NREG,NDIM, + 2 M,IS,JS,PJJD,PSJ,LPJJAN,NPJJM,PJJIND,SIGAL,1) + ELSE IF(ISTRM.EQ.3) THEN +* TIBERE model + CALL MCGDSD(NSEG,NSUB,NMU,LPS,NFUNL,NANGL,NGEFF,WEIGHT, + 1 TRHAR,H,ZMU,WZMU,KANGL,NOM,NZON,NFI,NREG,NDIM,M,IS, + 2 JS,PJJD,PSJ,LPJJAN,NPJJM,PJJIND,SIGAL,1,CAZ1(IANGL), + 3 CAZ2(IANGL),PJJDX,PJJDY,PJJDZ,PJJDXI,PJJDYI,PJJDZI, + 4 CAZ0(IANGL),PSJX,PSJY,PSJZ) + ENDIF + ENDIF + IF(LTMT) THEN +* ---------------- +* Tracking Merging (angle by angle) for ACA +* ---------------- + NTR=NTR+1 + NSE=NSE+NSEG + IF(ILINE.EQ.NBTR) LFORC=.TRUE. + CALL MCGTMT(NMERG,NTRTMT,NSETMT,NSEG,NSEG0,NOM,NOM0,WEIGHT, + 1 WEIGHT0,H,H0,LFORC,NTPROC) + IF(NTPROC.EQ.0) GOTO 20 + ENDIF + IF(LACA) THEN +* --------------------------------- +* Algebraic Collapsing Acceleration +* --------------------------------- + DO II=1,NSEG + NOM(II)=IPERM(NOM(II)) + ENDDO + CALL MCGDS1(SUBDS2,SUBDSP,SUBDSC,NSEG,NMUA,NGEFF,WEIGHT,H, + 1 ZMUA,WZMUA,NOM,NZONA,NLONG,NFI,NDIM,LC,M,KM,IM,MCU, + 2 DIAGF,DIAGQ,CF,CQ,PREV,NEXT,SIGAL,XSW,WORK) + ENDIF + 20 CONTINUE + DEALLOCATE(TRHAR) + IF(LTMT) THEN +* process last integration line + CALL MCGTMT(NMERG,NTRTMT,NSETMT,NSEG,NSEG0,NOM,NOM0,WEIGHT, + 1 WEIGHT0,H,H0,LFORC,NTPROC) + DO II=1,NSEG + NOM(II)=IPERM(NOM(II)) + ENDDO + CALL MCGDS1(SUBDS2,SUBDSP,SUBDSC,NSEG,NMUA,NGEFF,WEIGHT,H, + 1 ZMUA,WZMUA,NOM,NZONA,NLONG,NFI,NDIM,LC,M,KM,IM,MCU, + 2 DIAGF,DIAGQ,CF,CQ,PREV,NEXT,SIGAL,XSW,WORK) + ENDIF + ENDIF +* + IF((LTMT).AND.(IPRINT.GT.1)) THEN + WRITE(6,*) 'TRACKING MERGING: FROM TRACKING FILE' + WRITE(6,*) ' ', + 1 NTR,' TRACKS ->', + 2 NTRTMT,' EQUIVALENT TRACKS' + WRITE(6,*) ' ', + 1 NSE,' SEGMENTS ->', + 2 NSETMT, ' SEGMENTS' + IF((.NOT.LPRISM).AND.(NDIM.EQ.2)) + 1 WRITE(6,*) ' ', + 2 NMU,' POLAR ANGLES ->', + 3 ' 1 EQUIVALENT POLAR ANGLE' + IF(LPRISM) THEN + WRITE(6,*) 'TRACKING MERGING: 3D PRISMATIC EXTENSION' + WRITE(6,*) ' ', + 1 N3TR,' TRACKS ->', + 2 N3TRTMT,' EQUIVALENT TRACKS' + WRITE(6,*) ' ', + 1 N3SE,' SEGMENTS ->', + 2 N3SETMT, ' SEGMENTS' + ENDIF + ENDIF + CALL KDRCPU(T2) + IF(IPRINT.GT.0) THEN + WRITE(6,100) 'SUMMATION UPON THE TRACKING FOR ACA/SCR ',(T2-T1) + ENDIF +*--- +* FOR ACA: (IF PACA.GE.2) +* CALCULATION OF ILU0 PRECONDITIONER FOR BICGSTAB ITERATIONS +*--- + IF(LACA) THEN + DO II=1,NGEFF + IG=NGIND(II) + JPSYS=KPSYS(II) + IF(IPRINT.GT.2) WRITE(6,200) 'GROUP',IG + CALL MCGDS3(NLONG,PACA,M,SIGAL(0,II), + 1 XSW((II-1)*(M+1)+1),VA,NZONA,LC,MCU,IM,JU,LC0,IM0, + 2 MCU0,DIAGF(1,II),CF(1,II),DIAGQ((II-1)*NLONG+1),DIAGFR, + 3 CFR,LUDF,LUCF) +* + IF(IPRINT.GT.3) THEN + CALL PRINAM('DIAGF ',DIAGFR(1),NLONG) + CALL PRINAM('CF ',CFR(1),LC) + ENDIF + CALL LCMPUT(JPSYS,'DIAGF$MCCG',NLONG,2,DIAGFR) + CALL LCMPUT(JPSYS,'CF$MCCG',LC,2,CFR) + IF(PACA.GE.2) THEN + CALL LCMPUT(JPSYS,'ILUDF$MCCG',NLONG,2,LUDF) + IF(LC0.GT.0) CALL LCMPUT(JPSYS,'ILUCF$MCCG',LC0,2,LUCF) + ENDIF + IF(IPRINT.GT.3) THEN + CALL PRINAM('DIAGQ ',DIAGQ((II-1)*NLONG+1),NLONG) + CALL PRINAM('CQ ',CQ((II-1)*LC+1),LC) + ENDIF + CALL LCMPUT(JPSYS,'CQ$MCCG',LC,2,CQ((II-1)*LC+1)) + CALL LCMPUT(JPSYS,'DIAGQ$MCCG',NLONG,2,DIAGQ((II-1)*NLONG+1)) + ENDDO + CALL KDRCPU(T3) + IF(IPRINT.GT.0) THEN + WRITE(6,100) 'CALCULATION OF ACA PRECONDITIONER ', + 1 (T3-T2) + ENDIF +* + IF(PACA.GE.2) THEN + IF(LC0.GT.0) DEALLOCATE(LUCF) + DEALLOCATE(LUDF) + ENDIF + DEALLOCATE(WORK,CFR,DIAGFR,DIAGQ,CQ) + DEALLOCATE(NEXT,PREV) + IF(LTMT) DEALLOCATE(H0,NOM0) + DEALLOCATE(XSW) + ENDIF +*---- +* FOR SCR/STIS: +* VECTORS NORMALIZATION +*---- + IF(LPJJ) THEN + CALL MCGDS6(NGEFF,NPJJM,NREG,PJJD,V,PJJ) + CALL MCGDS6(NGEFF,NPJJM,NREG,PJJDX,V,PJJX) + CALL MCGDS6(NGEFF,NPJJM,NREG,PJJDY,V,PJJY) + CALL MCGDS6(NGEFF,NPJJM,NREG,PJJDZ,V,PJJZ) + CALL MCGDS6(NGEFF,NPJJM,NREG,PJJDXI,V,PJJXI) + CALL MCGDS6(NGEFF,NPJJM,NREG,PJJDYI,V,PJJYI) + CALL MCGDS6(NGEFF,NPJJM,NREG,PJJDZI,V,PJJZI) + DEALLOCATE(PJJD,PJJDX,PJJDY,PJJDZ,PJJDXI,PJJDYI,PJJDZI) +* + DO II=1,NGEFF + JPSYS=KPSYS(II) + IF(IPRINT.GT.3) THEN + CALL PRINAM('PJJ ',PJJ((II-1)*NREG*NPJJM+1),NREG*NPJJM) + IF(LPS.GT.0) CALL PRINAM('PSJ ',PSJ((II-1)*LPS+1),LPS) + ENDIF + CALL LCMPUT(JPSYS,'PJJ$MCCG',NREG*NPJJM,2, + 1 PJJ((II-1)*NREG*NPJJM+1)) + CALL LCMPUT(JPSYS,'PJJX$MCCG',NREG*NPJJM,2, + 1 PJJX((II-1)*NREG*NPJJM+1)) + CALL LCMPUT(JPSYS,'PJJY$MCCG',NREG*NPJJM,2, + 1 PJJY((II-1)*NREG*NPJJM+1)) + CALL LCMPUT(JPSYS,'PJJZ$MCCG',NREG*NPJJM,2, + 1 PJJZ((II-1)*NREG*NPJJM+1)) + CALL LCMPUT(JPSYS,'PJJXI$MCCG',NREG*NPJJM,2, + 1 PJJXI((II-1)*NREG*NPJJM+1)) + CALL LCMPUT(JPSYS,'PJJYI$MCCG',NREG*NPJJM,2, + 1 PJJYI((II-1)*NREG*NPJJM+1)) + CALL LCMPUT(JPSYS,'PJJZI$MCCG',NREG*NPJJM,2, + 1 PJJZI((II-1)*NREG*NPJJM+1)) + IF(LPS.GT.0) THEN + CALL LCMPUT(JPSYS,'PSJ$MCCG',LPS,2,PSJ((II-1)*LPS+1)) + CALL LCMPUT(JPSYS,'PSJX$MCCG',LPS,2,PSJX((II-1)*LPS+1)) + CALL LCMPUT(JPSYS,'PSJY$MCCG',LPS,2,PSJY((II-1)*LPS+1)) + CALL LCMPUT(JPSYS,'PSJZ$MCCG',LPS,2,PSJZ((II-1)*LPS+1)) + ENDIF + ENDDO +* + IF(LPS.GT.0) DEALLOCATE(PSJ,PSJX,PSJY,PSJZ) + DEALLOCATE(PJJX,PJJXI,PJJY,PJJYI,PJJZ,PJJZI) + DEALLOCATE(PJJ) + ENDIF +* + DEALLOCATE(KANGL,WZMUA,ZMUA,HH,H,NOM) +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(CF,DIAGF) + RETURN +* + 100 FORMAT(' -->>TIME SPENT IN: ',A40,':',F13.3,' s.') + 200 FORMAT(1X,A6,1X,I4) + END |
