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/LIBA33.f | |
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/LIBA33.f')
| -rw-r--r-- | Dragon/src/LIBA33.f | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/Dragon/src/LIBA33.f b/Dragon/src/LIBA33.f new file mode 100644 index 0000000..073487f --- /dev/null +++ b/Dragon/src/LIBA33.f @@ -0,0 +1,151 @@ +*DECK LIBA33 + SUBROUTINE LIBA33(NG,NANI,TT,NT0,NPSN0,FGTD,TEMP,IAFAG,IFAGR, + 1 PSN0,SCAT) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Assembly and temperature interpolation of a transfer matrix stored +* in the APOLIB-3 format. +* +*Copyright: +* Copyright (C) 2022 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 +* NG number of energy groups. +* NANI anisotropy level. NANI=1 for isotropic scattering. +* TT temperature of isotope. +* NT0 number of tabulated temperatures. +* NPSN0 size of vector PSN0. +* FGTD first temperature-dependent group. +* TEMP tabulated temperatures. +* IAFAG address for the first arrival group XS +* IFAGR first arrival group index. +* PSN0 input cross section data in APOLIB-3 compressed format. +* +*Parameters: output +* SCAT interpolated transfer matrix (JG<-IG,ITEMP,IL). +* +*----------------------------------------------------------------------- +* +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NG,NANI,NT0,NPSN0,FGTD,IAFAG(NG+1,NANI),IFAGR(NG,NANI) + REAL TT,TEMP(NT0),PSN0(NPSN0),SCAT(NG,NG,NANI) +*---- +* LOCAL VARIABLES +*---- + CHARACTER HSMG*131 + PARAMETER (NINT=2,DTMIN=1.0) + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: DTEMP,WEIJHT,S + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:,:,:) :: DSCATT +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(DTEMP(NT0),WEIJHT(NT0),DSCATT(NG,NG,NT0,NANI),S(NG)) +* + IF(NT0.EQ.1) THEN + IPROX=1 + IGTFIX=1 + ELSE + DO I=1,NT0 + DTEMP(I)=TEMP(I) + ENDDO + CALL LIBA28(TT,DTEMP,NT0,NINT,WEIJHT,IORD,IPROX,I0) + IF(ABS(TT-TEMP(IPROX)).LE.DTMIN) THEN + IGTFIX=1 + ELSE IF((TT.LT.TEMP(1)).OR.(TT.GT.TEMP(NT0))) THEN + WRITE(HSMG,'(A,F8.2,A,F8.2,A,F8.2)') + 1 'LIBA33: A TEMPERATURE', TT,'K IS NOT INCLUDED BETWEEN ', + 2 TEMP(1),' AND ',TEMP(NT0) + WRITE(6,'(/1X,A)') HSMG + IGTFIX=2 + ELSE + IGTFIX=0 + ENDIF + ENDIF +*---- +* SCATTERING MATRIX RECONSTRUCTION +*---- + DSCATT(:NG,:NG,:NT0,:NANI)=0.D0 + NV=0 + DO IL=1,NANI + DO IG=1,NG ! departure group + JG1=IFAGR(IG,IL)+1 + ISIZE=IAFAG(IG+1,IL)-IAFAG(IG,IL) + JG2=JG1+ISIZE-1 + IF(JG2.GT.NG) CALL XABORT('LIBA33: NG OVERFLOW(1)') + IF(NV+ISIZE.GT.NPSN0) CALL XABORT('LIBA33: NPSN0 OVERFLOW(1)') + DSCATT(JG1:JG2,IG,1,IL)=PSN0(NV+1:NV+ISIZE)/REAL(2*IL-1) + NV=NV+ISIZE + ENDDO + IF(FGTD.GE.1) THEN + DO IT=2,NT0 + DO IG=1,FGTD-1 ! departure group + DSCATT(:NG,IG,IT,IL)=DSCATT(:NG,IG,1,IL) + ENDDO + DO IG=FGTD,NG ! departure group + JG1=IFAGR(IG,IL)+1 + ISIZE=IAFAG(IG+1,IL)-IAFAG(IG,IL) + JG2=JG1+ISIZE-1 + IF(JG2.GT.NG) CALL XABORT('LIBA33: NG OVERFLOW(2)') + IF(NV+ISIZE.GT.NPSN0) CALL XABORT('LIBA33: NPSN0 OVERFLO' + 1 //'W(2)') + DSCATT(JG1:JG2,IG,IT,IL)=PSN0(NV+1:NV+ISIZE)/REAL(2*IL-1) + NV=NV+ISIZE + ENDDO + ENDDO + ENDIF + ENDDO +*---- +* TEMPERATURE INTERPOLATION +*---- + SCAT(:NG,:NG,:NANI)=0.0 + IF(FGTD.GE.1) THEN + DO IL=1,NANI + SCAT(:NG,:FGTD-1,IL)=REAL(DSCATT(:NG,:FGTD-1,1,IL)) + ENDDO + ELSE + DO IL=1,NANI + SCAT(:NG,:NG,IL)=REAL(DSCATT(:NG,:NG,1,IL)) + ENDDO + RETURN + ENDIF + IDIS=NG+1-FGTD + DO IL=1,NANI + IF(IGTFIX.EQ.1) THEN + DO I=1,IDIS + SCAT(:NG,FGTD+I-1,IL)=REAL(DSCATT(:NG,FGTD+I-1,IPROX,IL)) + ENDDO + ELSE + DO IG=FGTD,NG ! departure group + S(:NG)=0.D0 + DO J=1,IORD ! temperature weighting + S(:NG)=S(:NG)+WEIJHT(J)*DSCATT(:NG,IG,I0+J,IL) + ENDDO + IF(IGTFIX.EQ.2) THEN + DO JG=1,NG ! arrival group + IF(DSCATT(JG,IG,IPROX,IL).GE.0.) THEN + S(JG)=MAX(0.D0,S(JG)) + ELSE + S(JG)=MIN(S(JG),0.D0) + ENDIF + ENDDO + ENDIF + SCAT(:NG,IG,IL)=REAL(S(:NG)) + ENDDO + ENDIF + ENDDO +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(S,DSCATT,WEIJHT,DTEMP) + RETURN + END |
