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/MUSP.f90 | |
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/MUSP.f90')
| -rw-r--r-- | Dragon/src/MUSP.f90 | 457 |
1 files changed, 457 insertions, 0 deletions
diff --git a/Dragon/src/MUSP.f90 b/Dragon/src/MUSP.f90 new file mode 100644 index 0000000..6df0331 --- /dev/null +++ b/Dragon/src/MUSP.f90 @@ -0,0 +1,457 @@ +! +!----------------------------------------------------------------------- +! +!Purpose: +! Calculation of the collision probabilities for the multicell +! surfacic approximation. +! +!Copyright: +! Copyright (C) 2025 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 +! IPTRK pointer to the tracking (L_TRACK signature). +! IFTRAK tracking file unit. +! IMPX print flag (equal to zero for no print). +! NREGIO total number of merged blocks for which specific values +! of the neutron flux and reactions rates are required. +! NBMIX number of mixtures (NBMIX=max(MAT(i))). +! MAT index-number of the mixture type assigned to each volume. +! VOL volumes. +! SIGT0 total macroscopic cross sections ordered by mixture. +! SIGW0 P0 within-group scattering macroscopic cross sections +! ordered by mixture. +! NELPIJ number of elements in pij matrix. +! ILK leakage flag (=.true. if neutron leakage through external +! boundary is present). +! NBATCH number of tracks dispached in eack OpenMP core. +! TITREC title. +! NALBP number of multigroup physical albedos. +! ALBP multigroup physical albedos. +! +!Parameters: output +! PIJ reduced and symmetrized collision probabilities. +! +!----------------------------------------------------------------------- +! +SUBROUTINE MUSP(IPTRK,IFTRAK,IMPX,NREGIO,NBMIX,MAT,VOL,SIGT0,SIGW0,NELPIJ, & + & ILK,NBATCH,TITREC,NALBP,ALBP,PIJ) + USE GANLIB + !---- + ! SUBROUTINE ARGUMENTS + !---- + LOGICAL ILK + TYPE(C_PTR) IPTRK + INTEGER IFTRAK,IMPX,NREGIO,NBMIX,MAT(NREGIO),NELPIJ,NBATCH,NALBP + REAL VOL(NREGIO),SIGT0(0:NBMIX),SIGW0(0:NBMIX),PIJ(NELPIJ),ALBP(NALBP) + CHARACTER TITREC*72 + !---- + ! LOCAL VARIABLES + !---- + PARAMETER (EPS1=1.0E-4,NSTATE=40) + TYPE(C_PTR) JPTRK,KPTRK + INTEGER ISTATT(NSTATE),NNPSYS(1) + CHARACTER TITRE2*72 + logical LSKIP + !---- + ! ALLOCATABLE ARRAYS + !---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: MATALB,NMC_NODE,NMC_SURF,MAT2,IGEN,INUM, & + & IFR,MIX,IMAC + REAL, ALLOCATABLE, DIMENSION(:) :: SIGT2,SIGW2,PIJW,PISW,PSJW,PSSW,WORK,ALB,DVX + REAL, ALLOCATABLE, DIMENSION(:,:) :: VOLSUR,PP,PSSB + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: DPROB,DPROBX + ! + IND(I,J) = MAX(I+J3+1,J+J3+1)*(MAX(I+J3+1,J+J3+1)-1)/2 & + & + MIN(I+J3+1,J+J3+1) + ! + WPR(I,J)= REAL(DPROB( IND(I,J),1 ) / DPROB( IND(I,0),1 )) + !---- + ! BICKLEY FLAG + !---- + SAVE IBICKL + DATA IBICKL/0/ + !---- + ! RECOVER BICKLEY TABLES + !---- + IF(IBICKL.EQ.0) THEN + CALL XDRTA2 + IBICKL=1 + ENDIF + !---- + ! RECOVER SALT SPECIFIC PARAMETERS + !---- + REWIND IFTRAK + CALL LCMGET(IPTRK,'STATE-VECTOR',ISTATT) + IF(NREGIO.NE.ISTATT(1)) THEN + CALL XABORT('MUSP: STATE VECTOR HAS INVALID # OF ZONES.') + ENDIF + NMACRO=ISTATT(24) ! NGEN + NMCEL=NMACRO + NMERGE=NMACRO + NGEN=NMACRO + ALLOCATE(IGEN(NMERGE),INUM(NMCEL)) + DO IK=1,NMERGE + IGEN(IK)=IK + ENDDO + DO IK=1,NMCEL + INUM(IK)=IK + ENDDO + IF(NMACRO.EQ.0) CALL XABORT('MUSP: MUST MODULE TRACKING IS MANDATORY.') + ALLOCATE(NMC_NODE(NMACRO+1),NMC_SURF(NMACRO+1)) + JPTRK=LCMGID(IPTRK,'MACRO-TRACK') + CALL LCMGET(IPTRK,'NMC_NODE',NMC_NODE) + CALL LCMGET(IPTRK,'NMC_SURF',NMC_SURF) + NMIX=NMC_SURF(NMACRO+1) + NIFR=NMC_SURF(NMACRO+1) + !---- + ! LOOP OVER MACRO GEOMETRIES AND COMPUTE PIJ MATRICES USING EXCELP + !---- + J1=0 + NMIX=0 + NPIJ=0 + NPIS=0 + NPSS=0 + DO IMACRO=1,NMACRO + J2=NMC_NODE(IMACRO+1)-NMC_NODE(IMACRO) + J3=NMC_SURF(IMACRO+1)-NMC_SURF(IMACRO) + J1=J1+J2 + NMIX=NMIX+J3 + NPIJ=NPIJ+J2*J2 + NPIS=NPIS+J2*J3 + NPSS=NPSS+J3*J3 + ENDDO + IF(J1.NE.NREGIO) CALL XABORT('MUSP: INVALID NREGIO.') + IF(NMIX.NE.NMC_SURF(NMACRO+1)) CALL XABORT('MUSP: INVALID NMIX.') + ALLOCATE(PIJW(NPIJ),PISW(NPIS),PSJW(NPIS),PSSW(NPSS)) + J1=0 + IPIJ=0 + IPIS=0 + IPSS=0 + DO IMACRO=1,NMACRO + J2=NMC_NODE(IMACRO+1)-NMC_NODE(IMACRO) + J3=NMC_SURF(IMACRO+1)-NMC_SURF(IMACRO) + N2PRO=(J2+J3+1)**2 + WRITE(TITRE2,'(A,9H -- MACRO,I5.5)') TRIM(TITREC),IMACRO + KPTRK=LCMGIL(JPTRK,IMACRO) + KNORM=4 ! use HELIOS-type normalization + NNPSYS(1)=1 + ALLOCATE(MAT2(J2),SIGT2(J2),SIGW2(J2)) + ALLOCATE(MATALB(-J3:J2),VOLSUR(-J3:J2,1),DPROB(N2PRO,1),DPROBX(N2PRO,1)) + CALL LCMGET(KPTRK,'MATCOD',MAT2) + CALL EXCELP(KPTRK,IFTRAK,IMPX,J3,J2,NBMIX,MAT2,KNORM,SIGT0,1,N2PRO, & + & 1,NNPSYS(1),NBATCH,TITRE2,NALBP,ALBP,MATALB,VOLSUR,DPROB,DPROBX) + !---- + ! CHECK IF SCATTERING REDUCTION IS REQUIRED + !---- + DO I=1,J2 + SIGT2(I)=SIGT0(MAT2(I)) ! sigt by node + SIGW2(I)=SIGW0(MAT2(I)) ! sigw by node + ENDDO + LSKIP=.TRUE. + DO I=1,J2 + LSKIP=LSKIP.AND.(SIGW2(I).EQ.0.0) + ENDDO + !---- + ! SCATTERING REDUCTION IF LSKIP=.FALSE. + !---- + IF(LSKIP) THEN + ! DO NOT PERFORM SCATTERING REDUCTION. + DO I=1,J2 + DO J=1,J2 + IF(SIGT2(J).EQ.0.0) THEN + PIJW(IPIJ+(J-1)*J2+I)=WPR(I,J) + ELSE + PIJW(IPIJ+(J-1)*J2+I)=WPR(I,J)/SIGT2(J) + ENDIF + ENDDO + ENDDO + DO I=1,J2 + DO JC=1,J3 + PISW(IPIS+(JC-1)*J2+I)=WPR(I,-JC) + IF(SIGT2(I).EQ.0.0) THEN + PSJW(IPIS+(I-1)*J3+JC)=WPR(-JC,I) + ELSE + PSJW(IPIS+(I-1)*J3+JC)=WPR(-JC,I)/SIGT2(I) + ENDIF + ENDDO + ENDDO + DO IC=1,J3 + DO JC=1,J3 + PSSW(IPSS+(JC-1)*J3+IC)=WPR(-IC,-JC) + ENDDO + ENDDO + ELSE + ! COMPUTE THE SCATTERING-REDUCED COLLISION AND ESCAPE MATRICES. + DO I=1,J2 + DO J=1,J2 + IF(SIGT2(J).EQ.0.0) THEN + PIJW(IPIJ+(J-1)*J2+I)=0.0 + ELSE + PIJW(IPIJ+(J-1)*J2+I)=-WPR(I,J)*SIGW2(J)/SIGT2(J) + ENDIF + ENDDO + PIJW(IPIJ+(I-1)*J2+I)=1.0+PIJW(IPIJ+(I-1)*J2+I) + ENDDO + CALL ALINV(J2,PIJW(IPIJ+1),J2,IER) + IF(IER.NE.0) CALL XABORT('MUSP: SINGULAR MATRIX.') + ALLOCATE(WORK(J2)) + DO I=1,J2 + DO K=1,J2 + WORK(K)=PIJW(IPIJ+(K-1)*J2+I) + ENDDO + DO J=1,J2 + WGAR=0.0 + DO K=1,J2 + IF(SIGT2(J).EQ.0.0) THEN + WGAR=WGAR+WORK(K)*WPR(K,J) + ELSE + WGAR=WGAR+WORK(K)*WPR(K,J)/SIGT2(J) + ENDIF + ENDDO + PIJW(IPIJ+(J-1)*J2+I)=WGAR + ENDDO + DO JC=1,J3 + WGAR=0.0 + DO K=1,J2 + WGAR=WGAR+WORK(K)*WPR(K,-JC) + ENDDO + PISW(IPIS+(JC-1)*J2+I)=WGAR + ENDDO + ENDDO + DEALLOCATE(WORK) + ! + ! COMPUTE THE SCATTERING-REDUCED COLLISION PROBABILITY MATRIX + ! FOR INCOMING NEUTRONS. + DO IC=1,J3 + DO J=1,J2 + IF(SIGT2(J).EQ.0.0) THEN + WGAR=WPR(-IC,J) + ELSE + WGAR=WPR(-IC,J)/SIGT2(J) + ENDIF + DO K=1,J2 + IF(SIGT2(K).NE.0.0) THEN + WGAR=WGAR+WPR(-IC,K)*PIJW(IPIJ+(J-1)*J2+K)*SIGW2(K)/SIGT2(K) + ENDIF + ENDDO + PSJW(IPIS+(J-1)*J3+IC)=WGAR + ENDDO + ENDDO + ! + ! COMPUTE THE SCATTERING-REDUCED TRANSMISSION PROBABILITY MATRIX. + DO IC=1,J3 + DO JC=1,J3 + WGAR=WPR(-IC,-JC) + DO K=1,J2 + IF(SIGT2(K).NE.0.0) THEN + WGAR=WGAR+WPR(-IC,K)*PISW(IPIS+(JC-1)*J2+K)*SIGW2(K)/SIGT2(K) + ENDIF + ENDDO + PSSW(IPSS+(JC-1)*J3+IC)=WGAR + ENDDO + ENDDO + ENDIF + DEALLOCATE(DPROBX,DPROB,VOLSUR,MATALB) + IF(IMPX.GE.8) THEN + IF(LSKIP) THEN + IN=1 + ELSE + IN=2 + ENDIF + CALL SYBPRX(IN,J3,J2,IMACRO,SIGT2,SIGW2,PIJW(IPIJ+1),PISW(IPIS+1), & + & PSJW(IPIS+1),PSSW(IPSS+1)) + ENDIF + DEALLOCATE(SIGW2,SIGT2,MAT2) + J1=J1+J2 + IPIJ=IPIJ+J2*J2 + IPIS=IPIS+J2*J3 + IPSS=IPSS+J3*J3 + ENDDO + ! end of SYB004 equivalent + !---- + ! COMPUTE THE GLOBAL SCATTERING-REDUCED COLLISION PROBABILITY MATRIX + !---- + ALLOCATE(IMAC(NREGIO),PP(NREGIO,NREGIO)) + CALL LCMGET(IPTRK,'MERGE_MACRO',IMAC) + PP(:NREGIO,:NREGIO)=0.0 + IPIJ=0 + DO JKG=1,NGEN + J2=NMC_NODE(JKG+1)-NMC_NODE(JKG) + I1=0 + DO IKK=1,NMERGE + IKG=IGEN(IKK) + I2=NMC_NODE(IKG+1)-NMC_NODE(IKG) + IF(IKG.EQ.JKG) THEN + DO J=1,J2 + DO I=1,J2 + PP(IMAC(I1+I),IMAC(I1+J))=PIJW(IPIJ+(J-1)*J2+I) + ENDDO + ENDDO + ENDIF + I1=I1+I2 + ENDDO + IPIJ=IPIJ+J2*J2 + ENDDO + !---- + ! COMPUTE PSSB=A*(I-PSS*A)**-1 + !---- + ALLOCATE(IFR(NIFR),ALB(NIFR),MIX(NMIX),DVX(NMIX)) + CALL LCMGET(IPTRK,'IFR',IFR) + CALL LCMGET(IPTRK,'ALB',ALB) + CALL LCMGET(IPTRK,'MIX',MIX) + CALL LCMGET(IPTRK,'DVX',DVX) + IJAT=MAXVAL(MIX) + ALLOCATE(PSSB(IJAT,2*IJAT)) + PSSB(:IJAT,:2*IJAT)=0.0 + DO I=1,IJAT + PSSB(I,I)=1.0 + ENDDO + DO ICEL=1,NMCEL + IKK=INUM(ICEL) + IKG=IGEN(IKK) + J3=NMC_SURF(IKG+1)-NMC_SURF(IKG) + IT=0 + DO IK=1,IKK-1 + IT=IT+(NMC_SURF(IGEN(IK)+1)-NMC_SURF(IGEN(IK))) + ENDDO + IS=0 + DO IK=1,ICEL-1 + IS=IS+(NMC_SURF(IGEN(INUM(IK))+1)-NMC_SURF(IGEN(INUM(IK)))) + ENDDO + IPSS=0 + DO IK=1,IKG-1 + IPSS=IPSS+(NMC_SURF(IK+1)-NMC_SURF(IK))**2 + ENDDO + DO JC=1,J3 + J1=IFR(IS+JC) + J2=MIX(IT+JC) + ALBEDO=ALB(IS+JC) + PSSB(J1,IJAT+J2)=PSSB(J1,IJAT+J2)+ALBEDO*DVX(IT+JC) + DO IC=1,J3 + J2=MIX(IT+IC) + PSSB(J1,J2)=PSSB(J1,J2)-PSSW(IPSS+(JC-1)*J3+IC)*ALBEDO*DVX(IT+IC) + ENDDO + ENDDO + ENDDO + CALL ALSB(IJAT,IJAT,PSSB,IER,IJAT) + IF(IER.NE.0) CALL XABORT('MUSP: SINGULAR MATRIX.') + !---- + ! COMPUTATION OF PISW*PSSB*PSJW + !---- + I1=0 + DO IKK=1,NMERGE + IKG=IGEN(IKK) + I2=NMC_NODE(IKG+1)-NMC_NODE(IKG) + I3=NMC_SURF(IKG+1)-NMC_SURF(IKG) + IT=0 + DO IK=1,IKK-1 + IT=IT+(NMC_SURF(IGEN(IK)+1)-NMC_SURF(IGEN(IK))) + ENDDO + IPIS=0 + DO IK=1,IKG-1 + IPIS=IPIS+(NMC_NODE(IK+1)-NMC_NODE(IK))*(NMC_SURF(IK+1)-NMC_SURF(IK)) + ENDDO + DO I=1,I2 + DO IC=1,I3 + ICC=MIX(IT+IC) + ZZZ=PISW(IPIS+(IC-1)*I2+I)*SIGN(1.0,DVX(IT+IC)) + J1=0 + DO JKK=1,NMERGE + JKG=IGEN(JKK) + J2=NMC_NODE(JKG+1)-NMC_NODE(JKG) + J3=NMC_SURF(JKG+1)-NMC_SURF(JKG) + JT=0 + DO IK=1,JKK-1 + JT=JT+(NMC_SURF(IGEN(IK)+1)-NMC_SURF(IGEN(IK))) + ENDDO + IPSJ=0 + DO IK=1,JKG-1 + IPSJ=IPSJ+(NMC_NODE(IK+1)-NMC_NODE(IK))*(NMC_SURF(IK+1)-NMC_SURF(IK)) + ENDDO + DO J=1,J2 + DO JC=1,J3 + JCC=MIX(JT+JC) + PBJ=PSJW(IPSJ+(J-1)*J3+JC) + PP(IMAC(I1+I),IMAC(J1+J))=PP(IMAC(I1+I),IMAC(J1+J))+ZZZ*DVX(JT+JC)* & + & PSSB(JCC,IJAT+ICC)*PBJ + ENDDO + ENDDO + J1=J1+J2 + ENDDO + ENDDO + ENDDO + I1=I1+I2 + ENDDO + ! end of SYBRX3 equivalent + DEALLOCATE(PSSB,DVX,MIX,ALB,IFR) + DEALLOCATE(PSSW,PSJW,PISW,PIJW) + DEALLOCATE(NMC_SURF,NMC_NODE) + DEALLOCATE(INUM,IGEN) + ! + IF(IMPX.GE.7) THEN + WRITE (6,170) (J,J=1,NREGIO) + DO I=1,NREGIO + WRITE (6,180) I,(PP(I,J),J=1,NREGIO) + ENDDO + WRITE (6,'(//)') + ENDIF + IF((IMPX.GE.10).OR.(IMPX.LT.0)) THEN + ! CHECK THE RECIPROCITY CONDITIONS. + VOLTOT=0.0 + DO I=1,NREGIO + VOLTOT=VOLTOT+VOL(I) + ENDDO + VOLTOT=VOLTOT/REAL(NREGIO) + WRK=0.0 + DO I=1,NREGIO + DO J=1,NREGIO + AAA=PP(I,J)*VOL(I) + BBB=PP(J,I)*VOL(J) + WRK=MAX(WRK,ABS(AAA-BBB)/VOLTOT) + ENDDO + ENDDO + IF(WRK.GE.EPS1) WRITE (6,150) WRK + IF(WRK.GE.EPS1) CALL XABORT('MUSP: non symmetric matrices.') + ! CHECK THE CONSERVATION CONDITIONS. + IF(.NOT.ILK) THEN + WRK=0.0 + DO I=1,NREGIO + F1=1.0 + DO J=1,NREGIO + AAA=PP(I,J) + F1=F1-AAA*(SIGT0(MAT(J))-SIGW0(MAT(J))) + ENDDO + WRK=AMAX1(WRK,ABS(F1)) + ENDDO + IF(WRK.GE.EPS1) WRITE (6,160) WRK + IF(WRK.GE.EPS1) CALL XABORT('MUSP: non conservative matrices.') + ENDIF + ENDIF + ! + IC=0 + DO IKK=1,NREGIO + IOF=(IKK-1)*NREGIO + DO JKK=1,IKK + IC=IC+1 + PIJ(IC)=PP(JKK,IKK)*VOL(JKK) + ENDDO + ENDDO + DEALLOCATE(IMAC,PP) + RETURN + ! + 150 FORMAT (/56H MUSP: THE SCATTERING-REDUCED PIJ DO NOT MEET THE RECIPR, & + & 25HOCITY CONDITIONS. RECIP =,1P,E10.3/) + 160 FORMAT (/56H MUSP: THE SCATTERING-REDUCED PIJ DO NOT MEET THE CONSER, & + & 25HVATION CONDITIONS. LEAK =,1P,E10.3/) + 170 FORMAT (//47H MUSP: SCATTERING-REDUCED COLLISION PROBABILITY, & + & 9H MATRIX ://(11X,2HJ=,I4,:,5X,2HJ=,I4,:,5X,2HJ=,I4,:,5X,2HJ=, & + & I4,:,5X,2HJ=,I4,:,5X,2HJ=,I4,:,5X,2HJ=,I4,:,5X,2HJ=,I4,:,5X,2HJ=, & + & I4,:,5X,2HJ=,I4,:,5X,2HJ=,I4)) + 180 FORMAT (3H I=,I4,2H: ,1P,11E11.3/(9X,11E11.3)) +END SUBROUTINE MUSP |
