summaryrefslogtreecommitdiff
path: root/Dragon/src/LIBA23.f
diff options
context:
space:
mode:
Diffstat (limited to 'Dragon/src/LIBA23.f')
-rw-r--r--Dragon/src/LIBA23.f179
1 files changed, 179 insertions, 0 deletions
diff --git a/Dragon/src/LIBA23.f b/Dragon/src/LIBA23.f
new file mode 100644
index 0000000..59d3896
--- /dev/null
+++ b/Dragon/src/LIBA23.f
@@ -0,0 +1,179 @@
+*DECK LIBA23
+ SUBROUTINE LIBA23(NG,NANI,TT,NT0,NGTD,NPSN0,TEMP,FGTD,ID2,FAGG,
+ 1 LAGG,FDGG,WGAL,FAG,LAG,FDG,IAD,DEPL,PSN0,SCAT)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Assembly and temperature interpolation of a transfer matrix stored
+* in the APOLIB-2 format.
+*
+*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
+* NG number of energy groups.
+* NANI anisotropy level. NANI=1 for isotropic scattering.
+* TT temperature of isotope.
+* NT0 number of tabulated temperatures.
+* NGTD temperature dependence flag: =0 if no dependence;
+* =NG+1 otherwise.
+* NPSN0 size of vector PSN0.
+* TEMP tabulated temperatures.
+* FGTD first temperature-dependent group.
+* ID2 number of temperature-dependent terms in the matrix.
+* FAGG first incoming group for the galoche.
+* LAGG last incoming group for the galoche.
+* FDGG first outgoing group for the galoche.
+* WGAL galoche width. The last outgoing group is FDGG+WGAL-1.
+* FAG first incoming group for the rest of the matrix.
+* LAG last incoming group for the rest of the matrix.
+* FDG first outgoing group per incoming group for the rest of
+* the matrix.
+* IAD offset in vector PSN of the data related to each incoming
+* group.
+* DEPL displacement of the IAD offset for the first two
+* temperatures.
+* PSN0 input cross section data in APOLIB-2 compressed format.
+*
+*Parameters: output
+* SCAT interpolated transfer matrix.
+*
+*-----------------------------------------------------------------------
+*
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ INTEGER NG,NANI,NT0,NGTD,NPSN0,FGTD,ID2,FAGG,LAGG,FDGG,WGAL,FAG,
+ 1 LAG,FDG(NG),IAD(NG+1),DEPL(NGTD)
+ REAL TT,TEMP(NT0),PSN0(NPSN0),SCAT(NG,NG)
+*----
+* LOCAL VARIABLES
+*----
+ CHARACTER HSMG*131
+ PARAMETER (NINT=2,DTMIN=1.0)
+ LOGICAL LGTP,LGAUX
+ DOUBLE PRECISION S
+ REAL, ALLOCATABLE, DIMENSION(:) :: PSN
+ DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: DTEMP,WEIJHT
+*----
+* SCRATCH STORAGE ALLOCATION
+*----
+ ALLOCATE(DTEMP(NT0),WEIJHT(NT0))
+*
+ NPSN=IAD(NG+1)-1
+ IF(NT0.EQ.1) THEN
+ IPROX=1
+ IGTFIX=1
+ ELSE
+ DO 10 I=1,NT0
+ DTEMP(I)=TEMP(I)
+ 10 CONTINUE
+ 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 'LIBA23: 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
+ ALLOCATE(PSN(NPSN))
+ LGTP=I0.GT.0
+*----
+* GALOCHE
+*----
+ IF(WGAL.NE.0) THEN
+ DO 15 I=1,WGAL*(LAGG+1-FAGG)
+ PSN(I)=PSN0(I)
+ 15 CONTINUE
+ ENDIF
+ DO 50 IGA=FAG,LAG
+ IPGD=FDG(IGA)
+ IDGD=IPGD+IAD(IGA+1)-IAD(IGA)-1
+*----
+* PART INDEPENDENT OF TEMPERATURE OF LENGTH LONG FROM IPGD TO IGD
+*----
+ IF(IPGD.LT.FGTD)THEN
+ IGD=MIN0(IDGD,FGTD-1)
+ LONG=IGD+1-IPGD
+ DO 20 I=1,LONG
+ PSN(IAD(IGA)+I-1)=PSN0(IAD(IGA)+I-1)
+ 20 CONTINUE
+ ELSE
+ IGD=IPGD-1
+ LONG=0
+ ENDIF
+ IF(IGD.LT.IDGD)THEN
+ LONT=IDGD-IGD
+*----
+* PART DEPENDENT OF TEMPERATURE
+*----
+ DO 40 IG=1,LONT
+ ID=IAD(IGA)+LONG+IG-1
+ ID0=ID
+ IDP=ID
+ IF(IPROX.GT.1)IDP=IDP+DEPL(IGA)+ID2*(IPROX-2)
+ IF(IGTFIX .EQ. 1) THEN
+ PSN(ID0)=PSN0(IDP)
+ ELSE
+ S=0.0D0
+ IF(LGTP)ID=ID+DEPL(IGA)+ID2*(I0-1)
+ SP=PSN0(IDP)
+ LGAUX=.NOT.LGTP
+ DO 30 J=1,IORD
+ S=S+PSN0(ID)*WEIJHT(J)
+ IF(LGAUX)THEN
+ ID=ID+DEPL(IGA)
+ LGAUX=.FALSE.
+ ELSE
+ ID=ID+ID2
+ ENDIF
+ 30 CONTINUE
+ IF(IGTFIX.EQ.2) THEN
+ IF(SP.GE.0.) THEN
+ S=MAX(0.D0,S)
+ ELSE
+ S=MIN(S,0.D0)
+ ENDIF
+ ENDIF
+ PSN(ID0)=REAL(S)
+ ENDIF
+ 40 CONTINUE
+ ENDIF
+ 50 CONTINUE
+*----
+* BUILD THE COMPLETE TRANSFER MATRIX SCAT(IG->JG).
+*----
+ DO 70 IG=1,NG
+ DO 60 JG=1,NG
+ RAUX=0.
+ IF((JG.GE.FAGG).AND.(JG.LE.LAGG).AND.
+ 1 (IG.GE.FDGG).AND.(IG.LE.(FDGG+WGAL-1))) THEN
+ RAUX=PSN((JG-FAGG)*WGAL+IG-FDGG+1)
+ ELSE
+ IF((IG.GE.FDG(JG)) .AND.
+ 1 (IG.LE.(IAD(JG+1)-IAD(JG)+FDG(JG)-1))
+ 2 .AND.(JG.GE.FAG).AND.(JG.LE.LAG))
+ 3 RAUX=PSN(IAD(JG)+IG-FDG(JG))
+ ENDIF
+ SCAT(JG,IG)=RAUX/REAL(2*NANI-1)
+ 60 CONTINUE
+ 70 CONTINUE
+ DEALLOCATE(PSN)
+*----
+* SCRATCH STORAGE DEALLOCATION
+*----
+ DEALLOCATE(WEIJHT,DTEMP)
+ RETURN
+ END