summaryrefslogtreecommitdiff
path: root/Dragon/src/LIBA25.f
diff options
context:
space:
mode:
authorstainer_t <thomas.stainer@oecd-nea.org>2025-09-08 13:48:49 +0200
committerstainer_t <thomas.stainer@oecd-nea.org>2025-09-08 13:48:49 +0200
commit7dfcc480ba1e19bd3232349fc733caef94034292 (patch)
tree03ee104eb8846d5cc1a981d267687a729185d3f3 /Dragon/src/LIBA25.f
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/LIBA25.f')
-rw-r--r--Dragon/src/LIBA25.f244
1 files changed, 244 insertions, 0 deletions
diff --git a/Dragon/src/LIBA25.f b/Dragon/src/LIBA25.f
new file mode 100644
index 0000000..3c18edc
--- /dev/null
+++ b/Dragon/src/LIBA25.f
@@ -0,0 +1,244 @@
+*DECK LIBA25
+ SUBROUTINE LIBA25(IPLIB,LABS,LDIF,LFIS,L104,NGRO,FGHOMO,NGHOMO,
+ 1 NSEQHO,NL,SEQHOM,SN,SB,DELTA,ISONAM,TAUX,IMPX)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Compute self-shielded flux and cross sections from effective rates.
+*
+*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
+* IPLIB pointer to the lattice microscopic cross section library
+* (L_LIBRARY signature).
+* LABS absorption reaction flag (=.true. if the absorption reaction
+* is self-shielded).
+* LDIF scattering reaction flag (=.true. if the scattering reaction
+* is self-shielded).
+* LFIS fission reaction flag (=.true. if the fission reaction is
+* self-shielded).
+* L104 resonance flux flag (=.true. if the apolib contains dilution
+* /temperature-dependent flux information). If this information
+* is not provided, it will be reconstructed from a balance
+* relation.
+* NGRO number of energy groups.
+* FGHOMO first self-shielded energy group.
+* NGHOMO number of self-shielded energy groups.
+* NSEQHO number of tabulated dilutions.
+* NL number of legendre orders required in the calculation
+* NL=1 or higher.
+* SEQHOM tabulated dilutions.
+* SN dilution of isotope.
+* SB dilution of isotope used in Livolant-Jeanpierre normalization.
+* DELTA lethargy widths.
+* ISONAM alias name of current isotope.
+* TAUX interpolated effective rates:
+* TAUX(I,1) absorption effective rates;
+* TAUX(I,2) diffusion effective rates;
+* TAUX(I,3) nu*fission effective rates;
+* TAUX(I,4) pseudo-absorption effective rates used to
+* reconstruct the self-shielded flux;
+* TAUX(I,5) infinite-dilution absorption x-s.
+* IMPX print flag.
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ TYPE(C_PTR) IPLIB
+ INTEGER NGRO,FGHOMO,NGHOMO,NSEQHO,NL,ISONAM(3),IMPX
+ REAL SEQHOM(NSEQHO),SN(NGRO),SB(NGRO),DELTA(NGRO),TAUX(NGHOMO,6)
+ LOGICAL LABS,LDIF,LFIS,L104
+*----
+* LOCAL VARIABLES
+*----
+ PARAMETER(IOUT=6)
+ CHARACTER HSMG*131,STAR*1
+ LOGICAL LFIS2
+ INTEGER, ALLOCATABLE, DIMENSION(:) :: ITYPRO
+ DOUBLE PRECISION TMP,TMP1,AUX,FAC,ZNPHI
+ REAL, ALLOCATABLE, DIMENSION(:) :: SECT,VECT,SIGF,SS1
+ REAL, ALLOCATABLE, DIMENSION(:,:) :: SIGS
+ REAL, ALLOCATABLE, DIMENSION(:,:,:) :: SCAT
+*----
+* SCRATCH STORAGE ALLOCATION
+*----
+ ALLOCATE(ITYPRO(NGRO))
+ ALLOCATE(SECT(NGRO),SIGS(NGRO,NL),SCAT(NGRO,NGRO,NL),VECT(NGRO),
+ 1 SIGF(NGRO),SS1(NGRO))
+*----
+* RECOVER INFINITE-DILUTION X-S INFORMATION.
+*----
+ CALL LCMGET(IPLIB,'NTOT0',SECT)
+ CALL XDRLGS(IPLIB,-1,IMPX,0,NL-1,1,NGRO,SIGS,SCAT,ITYPRO)
+ CALL LCMLEN(IPLIB,'NUSIGF',LENGT,ITYLCM)
+ IF(LENGT.EQ.NGRO) THEN
+ CALL LCMGET(IPLIB,'NUSIGF',SIGF)
+ LFIS2=LFIS
+ ELSE
+ SIGF(:NGRO)=0.0
+ LFIS2=.FALSE.
+ ENDIF
+*----
+* COMPUTE P0 TRANSFER PROBABILITIES.
+*----
+ DO 15 IG2=1,NGRO
+ VECT(IG2)=SIGS(IG2,1)
+ SECT(IG2)=SECT(IG2)-SIGS(IG2,1)
+ DO 10 IG1=1,NGRO
+ SCAT(IG2,IG1,1)=SCAT(IG2,IG1,1)/SIGS(IG1,1)
+ 10 CONTINUE
+ 15 CONTINUE
+*----
+* RECOVER THE EFFECTIVE FLUX.
+*----
+ IF(IMPX.GT.4) WRITE(IOUT,200)
+ DO 20 L=1,NGRO
+ SS1(L)=1.0
+ 20 CONTINUE
+ DO 50 L=FGHOMO,FGHOMO+NGHOMO-1
+ SEIM=MAX(0.0,SN(L))
+ IF(SEIM.EQ.0.) CALL XABORT('LIBA25: SELF SHIELDING FAILURE.')
+ IF(LABS.AND.LDIF) THEN
+* COMPUTE THE EFFECTIVE FLUX.
+ TMP1=0.0D0
+ DO 30 IG2=1,FGHOMO-1
+ TMP1=TMP1+SCAT(L,IG2,1)*SIGS(IG2,1)*DELTA(IG2)/DELTA(L)
+ 30 CONTINUE
+ IF(TMP1.GT.5.0E-3*TAUX(L-FGHOMO+1,2)/DELTA(L)) THEN
+* USE A SIMPLIFIED MODEL.
+ AUX=TAUX(L-FGHOMO+1,1)/DELTA(L)
+ ELSE
+* USE A SLOWING-DOWN BALANCE EQUATION.
+ TMP=TMP1
+ DO 40 IG2=FGHOMO,FGHOMO+NGHOMO-1
+ TMP=TMP+SCAT(L,IG2,1)*TAUX(IG2-FGHOMO+1,2)/DELTA(L)
+ 40 CONTINUE
+ AUX=(TAUX(L-FGHOMO+1,1)+TAUX(L-FGHOMO+1,2))/DELTA(L)-TMP
+ ENDIF
+ ELSE IF(LABS) THEN
+* COMPUTE THE EFFECTIVE FLUX USING A SIMPLIFIED MODEL.
+ AUX=TAUX(L-FGHOMO+1,1)/DELTA(L)
+ ELSE
+ AUX=0.0
+ ENDIF
+*
+ IF((NSEQHO.EQ.1).OR.(SB(L).GE.1.0E10)) THEN
+* USE AN INFINITE DILUTION VALUE.
+ ZNPHI=0.0
+ ELSE IF(L104.AND.(SEIM.GT.SEQHOM(NSEQHO-1))) THEN
+* USE AN INTERPOLATED VALUE NEAR INFINITE DILUTION.
+ FAC=(SEQHOM(NSEQHO-1)/SEIM)**2
+ ZNPHI=FAC*TAUX(L-FGHOMO+1,4)+(1.0D0-FAC)*AUX
+ ELSE IF(L104) THEN
+* USE AN INTERPOLATED VALUE.
+ ZNPHI=TAUX(L-FGHOMO+1,4)
+ ELSE
+* USE A CALCULATED VALUE.
+ ZNPHI=AUX
+ ENDIF
+ PHI0=REAL(1.0D0-ZNPHI/SB(L))
+ STAR=' '
+ IF((PHI0.LE.0.0).OR.(PHI0.GT.1.2)) THEN
+ STAR='*'
+ IF(IMPX.GT.4) THEN
+ WRITE(HSMG,220) PHI0,L,ZNPHI,SEIM,(ISONAM(I0),I0=1,3),STAR
+ WRITE(IOUT,'(/1X,A131)') HSMG
+ ENDIF
+ ENDIF
+ IF(PHI0.LE.0.0) PHI0=TAUX(L-FGHOMO+1,2)/DELTA(L)/VECT(L)
+ SS1(L)=PHI0
+ SECT(L)=TAUX(L-FGHOMO+1,1)/DELTA(L)/PHI0
+ IF(LFIS2) SIGF(L)=TAUX(L-FGHOMO+1,3)/DELTA(L)/PHI0
+ IF(LDIF) SIGS(L,1)=TAUX(L-FGHOMO+1,2)/DELTA(L)/PHI0
+ IF(IMPX.GT.4) WRITE(IOUT,210) L,PHI0,SIGF(L),SECT(L),SIGS(L,1),
+ 1 SEIM,SB(L),ZNPHI
+ 50 CONTINUE
+ IF(IMPX.GT.4) WRITE(IOUT,'(/)')
+*
+ CALL LCMPUT(IPLIB,'NWT0',NGRO,2,SS1)
+*----
+* SELF-SHIELDING OF THE TRANSFERT CROSS SECTIONS.
+*----
+ IF(LDIF) THEN
+ DO 65 IG1=1,NGRO
+ DO 60 IG2=1,NGRO
+ SCAT(IG2,IG1,1)=SCAT(IG2,IG1,1)*SIGS(IG1,1)
+ 60 CONTINUE
+ 65 CONTINUE
+ INGRO=NL-1
+ DO 70 IL=NL-1,0,-1
+ IF(ITYPRO(IL+1).EQ.0) THEN
+ INGRO=INGRO-1
+ ELSE
+ GO TO 80
+ ENDIF
+ 70 CONTINUE
+ 80 DO 100 IL=1,NL-1
+ IF(ITYPRO(IL+1).GT.0) THEN
+ DO 95 IG2=1,NGRO
+ SIGS(IG2,IL+1)=SIGS(IG2,IL+1)*SIGS(IG2,1)/VECT(IG2)
+ DO 90 IG1=1,NGRO
+ SCAT(IG2,IG1,IL+1)=SCAT(IG2,IG1,IL+1)*SIGS(IG1,1)/VECT(IG1)
+ 90 CONTINUE
+ 95 CONTINUE
+ ENDIF
+ 100 CONTINUE
+*----
+* SAVE SELF-SHIELDED X-S INFORMATION.
+*----
+ CALL XDRLGS(IPLIB,1,IMPX,0,INGRO,1,NGRO,SIGS,SCAT,ITYPRO)
+ ENDIF
+*----
+* SELF-SHIELDING OF THE RADIATIVE CAPTURE CROSS SECTIONS.
+*----
+ CALL LCMLEN(IPLIB,'NG',LENGT,ITYLCM)
+ IF(LENGT.EQ.NGRO) THEN
+ CALL LCMGET(IPLIB,'NG',VECT)
+ DO 105 I=1,NGHOMO
+ IG=FGHOMO+I-1
+ VECT(IG)=VECT(IG)*SECT(IG)*DELTA(IG)/TAUX(I,5)
+ 105 CONTINUE
+ CALL LCMPUT(IPLIB,'NG',NGRO,2,VECT)
+ ENDIF
+*----
+* SELF-SHIELDING OF THE FISSION CROSS SECTIONS.
+*----
+ IF(LFIS2) THEN
+ CALL LCMGET(IPLIB,'NUSIGF',SS1)
+ CALL LCMGET(IPLIB,'NFTOT',VECT)
+ DO 110 I=1,NGRO
+ IF(SS1(I).NE.0.0) VECT(I)=VECT(I)*SIGF(I)/SS1(I)
+ 110 CONTINUE
+ CALL LCMPUT(IPLIB,'NFTOT',NGRO,2,VECT)
+ CALL LCMPUT(IPLIB,'NUSIGF',NGRO,2,SIGF)
+ ENDIF
+*
+ DO 120 I=1,NGRO
+ SECT(I)=SECT(I)+SIGS(I,1)
+ 120 CONTINUE
+ CALL LCMPUT(IPLIB,'NTOT0',NGRO,2,SECT)
+*----
+* SCRATCH STORAGE DEALLOCATION
+*----
+ DEALLOCATE(SS1,SIGF,VECT,SCAT,SIGS,SECT)
+ DEALLOCATE(ITYPRO)
+ RETURN
+*
+ 200 FORMAT(/5X,'GROUP',11X,'PHI0',10X,'SIGF0',10X,'SIGA0',10X,
+ 1 'SIGS0',10X,'DILUT',13X,'SB',10X,'ZNPHI')
+ 210 FORMAT(5X,I5,1P,7E15.5)
+ 220 FORMAT(47HLIBA25: *** WARNING *** INVALID VALUE OF PHI0 (,1P,
+ 1 E11.3,0P,10H) IN GROUP,I4,8H. ZNPHI=,1P E11.3,2X,5HSEIM=,E11.3,
+ 2 2X,5HISO=',3A4,2H' ,A1)
+ END