summaryrefslogtreecommitdiff
path: root/Dragon/src/LIBRSC.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/LIBRSC.f
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/LIBRSC.f')
-rw-r--r--Dragon/src/LIBRSC.f350
1 files changed, 350 insertions, 0 deletions
diff --git a/Dragon/src/LIBRSC.f b/Dragon/src/LIBRSC.f
new file mode 100644
index 0000000..6013770
--- /dev/null
+++ b/Dragon/src/LIBRSC.f
@@ -0,0 +1,350 @@
+*DECK LIBRSC
+ SUBROUTINE LIBRSC(MAXTRA,IPLIB,LBIN,NGRP,NBISO,ISONAM,MASKI,LSHI,
+ 1 NFS,IMPX,IALTER)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Compute the correlation information between a pair of resonant
+* isotopes for the resonance spectrum expansion (RSE) method.
+*
+*Copyright:
+* Copyright (C) 2023 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
+* MAXTRA maximum number of energy bins of size DELI.
+* IPLIB pointer to the lattice microscopic cross section library
+* (L_LIBRARY signature).
+* ISOT index of the isotope been processed.
+* LBIN number of fine energy groups.
+* NGRP number of coarse energy groups.
+* NBISO number of isotopes present in the calculation domain.
+* ISONAM alias name of isotopes.
+* MASKI isotope masks (isotope with index I is process if
+* MASKI(I)=.true.).
+* LSHI resonant region number associated with each isotope.
+* NFS number of fine energy groups in each coarse energy group.
+* IMPX print flag (equal to zero for no print).
+* IALTER type of approximation (=0: use exponentials; =1: use Taylor
+* expansions).
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ TYPE(C_PTR) IPLIB
+ INTEGER MAXTRA,ISOT,LBIN,NGRP,NBISO,ISONAM(3,NBISO),LSHI(NBISO),
+ 1 NFS(NGRP),IMPX,IALTER
+ LOGICAL MASKI(NBISO)
+*----
+* LOCAL VARIABLES
+* KPLIB1: ISOTOPE WHERE THE COLLISION OCCURS
+* KPLIB2: SOURCE ISOTOPE
+*----
+ TYPE(C_PTR) KPLIB1,KPLIB2,LPLIB1,LPLIB2,MPLIB,IOFSET
+ CHARACTER HNAMIS1*12,HNAMIS2*12,HSMG*131
+*----
+* ALLOCATABLE ARRAYS
+*----
+ TYPE(C_PTR), ALLOCATABLE, DIMENSION(:) :: IPISO
+ INTEGER, ALLOCATABLE, DIMENSION(:) :: NJJ,MRANK,NFS2,ISOMIX
+ REAL, ALLOCATABLE, DIMENSION(:) :: EBIN,UUU,DEL,STR,SIGT,SIGS,PRI,
+ 1 STIS
+ DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: TTT,DDD
+ DOUBLE PRECISION, POINTER, DIMENSION(:,:) :: SSIGT,SSIGS
+ LOGICAL, ALLOCATABLE, DIMENSION(:) :: LCORR
+ TYPE MATRIX_ARRAY
+ DOUBLE PRECISION, POINTER, DIMENSION(:,:) :: MATRIX
+ END TYPE MATRIX_ARRAY
+ TYPE(MATRIX_ARRAY), ALLOCATABLE, DIMENSION(:) :: SIGT_M,TSIGT_M,
+ 1 SCAT_M,DDD_M,U_M,T_M
+ TYPE(MATRIX_ARRAY), ALLOCATABLE, DIMENSION(:,:) :: TSCAT_M
+*----
+* SCRATCH STORAGE ALLOCATION
+*----
+ ALLOCATE(IPISO(NBISO),NJJ(NGRP),MRANK(NGRP),ISOMIX(NBISO),
+ 1 LCORR(NBISO))
+ ALLOCATE(EBIN(LBIN+1),UUU(LBIN+1),DEL(LBIN),STR(LBIN),SIGT(LBIN),
+ 1 SIGS(LBIN),PRI(MAXTRA),STIS(LBIN))
+ ALLOCATE(U_M(NGRP),T_M(NGRP),SIGT_M(NGRP),SCAT_M(NGRP),
+ 1 TSIGT_M(NGRP),TSCAT_M(NGRP,NGRP))
+*----
+* FIND CORRELATED ISOTOPES.
+*----
+ CALL LIBIPS(IPLIB,NBISO,IPISO)
+ CALL LCMGET(IPLIB,'ISOTOPESMIX',ISOMIX)
+ LCORR(:NBISO)=.TRUE.
+ DO 30 ISOT=1,NBISO
+ IF(.NOT.MASKI(ISOT).OR.(LSHI(ISOT).EQ.0)) GO TO 30
+ WRITE(HNAMIS1,'(3A4)') (ISONAM(I0,ISOT),I0=1,3)
+ KPLIB1=IPISO(ISOT)
+ DO 20 JSOT=1,NBISO
+ IF(JSOT.EQ.ISOT) GO TO 20
+ IF((.NOT.MASKI(JSOT)).OR.(LSHI(ISOT).NE.LSHI(JSOT))) GO TO 20
+ WRITE(HNAMIS2,'(3A4)') (ISONAM(I0,JSOT),I0=1,3)
+ IF(LSHI(ISOT).GT.0) THEN
+ ! temperature correlation effect
+ IF(HNAMIS2(:8).NE.HNAMIS1(:8)) GO TO 20
+ ENDIF
+ LCORR(ISOT)=.FALSE.
+ CALL LCMSIX(KPLIB1,'PT-TABLE',1)
+ CALL LCMLEN(KPLIB1,HNAMIS2,LENGT,ITYLCM)
+ CALL LCMSIX(KPLIB1,' ',2)
+ IF(LENGT.NE.0) GO TO 20
+ IF(IMPX.GT.0) WRITE (6,'(/35H LIBRSC: COMPUTING CORRELATION EFFE,
+ 1 32HCTS BETWEEN ISOTOPES/MATERIALS '',A12,7H'' AND '',A12,2H''.)')
+ 2 HNAMIS1,HNAMIS2
+*----
+* RECOVER ISOTOPIC AND AUTOLIB DATA.
+*----
+ ALLOCATE(NFS2(NGRP))
+ KPLIB2=IPISO(JSOT)
+ CALL LCMGET(KPLIB2,'AWR',AWR)
+ CALL LCMGET(KPLIB2,'BIN-ENERGY',EBIN)
+ CALL LCMGET(KPLIB2,'BIN-NTOT0',SIGT)
+ CALL LCMLEN(KPLIB2,'BIN-SIGS00',ILONG,ITYLCM)
+ CALL LCMGET(KPLIB2,'BIN-SIGS00',SIGS)
+ CALL LCMGET(KPLIB2,'BIN-NFS',NFS2)
+ IBIN=0
+ DELMIN=1.0E10
+ UUU(1)=0.0
+ DO IG=1,NGRP
+ IF(NFS(IG).NE.NFS2(IG)) THEN
+ WRITE(HSMG,'(38HLIBRSC: INCOMPATIBLE BIN-NFS BETWEEN '',A12,
+ 1 7H'' AND '',A12,2H''.)') HNAMIS1,HNAMIS2
+ CALL XABORT(HSMG)
+ ENDIF
+ DO LI=1,NFS(IG)
+ DELM=LOG(EBIN(IBIN+LI)/EBIN(IBIN+LI+1))
+ UUU(IBIN+LI+1)=LOG(EBIN(1)/EBIN(IBIN+LI+1))
+ DEL(IBIN+LI)=DELM
+ DELMIN=MIN(DELMIN,DELM)
+ ENDDO
+ IBIN=IBIN+NFS(IG)
+ ENDDO
+ DEALLOCATE(NFS2)
+ IF(IBIN.NE.LBIN) CALL XABORT('LIBRSC: INVALID NUMBER OF BINS.')
+ CALL LCMLEN(KPLIB2,'BIN-DELI',LENGT,ITYLCM)
+ IF((LENGT.EQ.1).AND.(ITYLCM.EQ.2)) THEN
+ CALL LCMGET(KPLIB2,'BIN-DELI',DELI)
+ ELSE
+ DELI=1.0/REAL(INT(1.00001/DELMIN))
+ ENDIF
+ PRI(:MAXTRA)=0.0
+ CALL LIBPRI(MAXTRA,DELI,AWR,IALTER,0,NEXT,PRI)
+*----
+* NULLIFY POINTERS
+*----
+ DO IG=1,NGRP
+ NULLIFY(SIGT_M(IG)%MATRIX)
+ NULLIFY(TSIGT_M(IG)%MATRIX)
+ DO JG=1,NGRP
+ NULLIFY(TSCAT_M(IG,JG)%MATRIX)
+ ENDDO
+ ENDDO
+*----
+* LOOP OVER RESONANT GROUPS AND RECOVER T_M AND U_M DATA
+*----
+ MRANK(:NGRP)=0
+ CALL LCMSIX(KPLIB1,'PT-TABLE',1)
+ CALL LCMGET(KPLIB1,'NOR',MRANK)
+ LPLIB1=LCMGID(KPLIB1,'GROUP-RSE')
+ DO IG=1,NGRP
+ LGBIN=NFS(IG)
+ IF(LGBIN.EQ.0) CYCLE
+ MPLIB=LCMGIL(LPLIB1,IG)
+ MI=MRANK(IG)
+ CALL LCMGPD(MPLIB,'T_M',IOFSET)
+ CALL C_F_POINTER(IOFSET,T_M(IG)%MATRIX,(/ MI,MI /))
+ CALL LCMGPD(MPLIB,'U_M',IOFSET)
+ CALL C_F_POINTER(IOFSET,U_M(IG)%MATRIX,(/ LGBIN,MI /))
+ ENDDO
+ CALL LCMSIX(KPLIB1,' ',2)
+*----
+* LOOP OVER RESONANT GROUPS
+*----
+ ALLOCATE(DDD_M(NGRP))
+ LLL=0
+ DO IG=1,NGRP
+ NJJ(IG)=0
+ LGBIN=NFS(IG)
+ IF(LGBIN.EQ.0) CYCLE
+ !
+ ! compute SIGT_M
+ MI=MRANK(IG)
+ ALLOCATE(SSIGT(MI,MI))
+ SSIGT(:,:)=0.0D0
+ DO LI=1,LGBIN
+ SIGMA=SIGT(LLL+LI)
+ DO IMR1=1,MI
+ DO IMR2=1,MI
+ SSIGT(IMR1,IMR2)=SSIGT(IMR1,IMR2)+U_M(IG)%MATRIX(LI,IMR1)*
+ 1 SIGMA*U_M(IG)%MATRIX(LI,IMR2)
+ ENDDO
+ ENDDO
+ ENDDO
+ SIGT_M(IG)%MATRIX=>SSIGT
+ NULLIFY(SSIGT)
+ !
+ ! compute SCAT_M
+ DO JG=1,NGRP
+ NULLIFY(SCAT_M(JG)%MATRIX)
+ NULLIFY(DDD_M(JG)%MATRIX)
+ ENDDO
+ DO LI=1,LGBIN
+ III=1
+ CALL LIBECT(MAXTRA,LLL+LI,PRI,UUU(2),DELI,DEL,NEXT,III,MML,
+ 1 STIS)
+ STR(:LBIN)=0.0
+ DO MM=1,MML
+ LLJ=LLL+LI-MM+1
+ STR(LLJ)=STIS(MM)*SIGS(LLJ)
+ ENDDO
+ LLJ=LLL
+ DO JG=IG,1,-1
+ LGBIN2=NFS(JG)
+ IF(LLL+LI-MML+1.GT.LLJ+LGBIN2) EXIT
+ IF(.NOT.ASSOCIATED(U_M(JG)%MATRIX)) THEN
+ CALL XABORT('LIBRSC: U_M(JG)%MATRIX IS NOT ASSOCIATED.')
+ ENDIF
+ MJ=MRANK(JG)
+ IF(LI.EQ.1) THEN
+ NJJ(IG)=NJJ(IG)+1
+ ALLOCATE(DDD_M(JG)%MATRIX(LGBIN,MJ))
+ DDD_M(JG)%MATRIX(:LGBIN,:MJ)=0.0D0
+ ENDIF
+ DO LJ=1,LGBIN2
+ DDD_M(JG)%MATRIX(LI,:MJ)=DDD_M(JG)%MATRIX(LI,:MJ)+
+ 1 STR(LLJ+LJ)*U_M(JG)%MATRIX(LJ,:MJ)
+ ENDDO
+ IF(JG.GT.1) LLJ=LLJ-NFS(JG-1)
+ ENDDO
+ ENDDO
+ !
+ DO JG=IG-NJJ(IG)+1,IG
+ IF(ASSOCIATED(U_M(IG)%MATRIX).AND.
+ 1 ASSOCIATED(DDD_M(JG)%MATRIX)) THEN
+ MJ=MRANK(JG)
+ ALLOCATE(SSIGS(MI,MJ))
+ DO I=1,MI
+ DO J=1,MJ
+ SSIGS(I,J)=DOT_PRODUCT(U_M(IG)%MATRIX(:LGBIN,I),
+ 1 DDD_M(JG)%MATRIX(:LGBIN,J))
+ ENDDO
+ ENDDO
+ SCAT_M(JG)%MATRIX => SSIGS
+ NULLIFY(SSIGS)
+ DEALLOCATE(DDD_M(JG)%MATRIX)
+ ENDIF
+ ENDDO
+*----
+* LINEAR TRANSFORMATION
+*----
+ ALLOCATE(TTT(MI,MI))
+ TTT(:MI,:MI)=TRANSPOSE(T_M(IG)%MATRIX(:MI,:MI))
+ IF(ASSOCIATED(SIGT_M(IG)%MATRIX)) THEN
+ ALLOCATE(TSIGT_M(IG)%MATRIX(MI,MI))
+ ALLOCATE(SSIGT(MI,MI),DDD(MI,MI))
+ DO I=1,MI
+ DO J=1,MI
+ DDD(I,J)=DOT_PRODUCT(SIGT_M(IG)%MATRIX(I,:MI),
+ 1 T_M(IG)%MATRIX(:MI,J))
+ ENDDO
+ ENDDO
+ SSIGT=MATMUL(TTT,DDD)
+ TSIGT_M(IG)%MATRIX => SSIGT
+ NULLIFY(SSIGT)
+ DEALLOCATE(DDD,SIGT_M(IG)%MATRIX)
+ ENDIF
+ DO JG=1,IG
+ IF(ASSOCIATED(SCAT_M(JG)%MATRIX)) THEN
+ MJ=MRANK(JG)
+ ALLOCATE(TSCAT_M(IG,JG)%MATRIX(MI,MJ))
+ ALLOCATE(SSIGS(MI,MJ),DDD(MI,MJ))
+ DO I=1,MI
+ DO J=1,MJ
+ DDD(I,J)=DOT_PRODUCT(SCAT_M(JG)%MATRIX(I,:MJ),
+ 1 T_M(JG)%MATRIX(:MJ,J))
+ ENDDO
+ ENDDO
+ SSIGS=MATMUL(TTT,DDD)
+ TSCAT_M(IG,JG)%MATRIX => SSIGS
+ NULLIFY(SSIGS)
+ DEALLOCATE(DDD,SCAT_M(JG)%MATRIX)
+ ENDIF
+ ENDDO
+ DEALLOCATE(TTT)
+ LLL=LLL+LGBIN
+ ENDDO
+ DEALLOCATE(DDD_M)
+*----
+* SAVE INFORMATION IN IPLIB
+*----
+ NPOS=0
+ DO IG=1,NGRP
+ NPOS=NPOS+NJJ(IG)
+ ENDDO
+ CALL LCMSIX(KPLIB1,'PT-TABLE',1)
+ CALL LCMSIX(KPLIB1,HNAMIS2,1)
+ LPLIB1=LCMLID(KPLIB1,'SIGT_M',NGRP) ! holds TSIGT_M information
+ LPLIB2=LCMLID(KPLIB1,'SCAT_M',NPOS) ! holds TSCAT_M information
+ CALL LCMPUT(KPLIB1,'NJJS00',NGRP,1,NJJ)
+ CALL LCMSIX(KPLIB1,' ',2)
+ IPOS=0
+ DO IG=1,NGRP
+ MI=MRANK(IG)
+ IF(MI.EQ.0) CYCLE
+ IF(ASSOCIATED(TSIGT_M(IG)%MATRIX)) THEN
+ CALL LCMPDL(LPLIB1,IG,MI*MI,4,TSIGT_M(IG)%MATRIX)
+ DEALLOCATE(TSIGT_M(IG)%MATRIX)
+ ENDIF
+ DO JG=IG,IG-NJJ(IG)+1,-1
+ MJ=MRANK(JG)
+ IPOS=IPOS+1
+ IF(IPOS.GT.NPOS) CALL XABORT('LIBRSC: NPOS OVERFLOW.')
+ IF(ASSOCIATED(TSCAT_M(IG,JG)%MATRIX)) THEN
+ CALL LCMPDL(LPLIB2,IPOS,MI*MJ,4,TSCAT_M(IG,JG)%MATRIX)
+ DEALLOCATE(TSCAT_M(IG,JG)%MATRIX)
+ ELSE
+ ALLOCATE(SSIGS(MI,MJ))
+ SSIGS(:MI,:MJ)=0.0D0
+ CALL LCMPDL(LPLIB2,IPOS,MI*MJ,4,SSIGS)
+ DEALLOCATE(SSIGS)
+ ENDIF
+ ENDDO
+ ENDDO
+ CALL LCMSIX(KPLIB1,' ',2)
+ 20 CONTINUE
+ 30 CONTINUE
+*----
+* ERASE T_M AND U_M DATA
+*----
+ DO 40 ISOT=1,NBISO
+ IF(.NOT.MASKI(ISOT).OR.(LSHI(ISOT).EQ.0).OR.LCORR(ISOT)) GO TO 40
+ KPLIB1=IPISO(ISOT)
+ CALL LCMSIX(KPLIB1,'PT-TABLE',1)
+ LPLIB1=LCMGID(KPLIB1,'GROUP-RSE')
+ DO IG=1,NGRP
+ IF(NFS(IG).EQ.0) CYCLE
+ MPLIB=LCMGIL(LPLIB1,IG)
+ CALL LCMDEL(MPLIB,'T_M')
+ CALL LCMDEL(MPLIB,'U_M')
+ ENDDO
+ CALL LCMSIX(KPLIB1,' ',2)
+ 40 CONTINUE
+*----
+* SCRATCH STORAGE DEALLOCATION
+*----
+ DEALLOCATE(TSCAT_M,TSIGT_M,SCAT_M,SIGT_M,T_M,U_M)
+ DEALLOCATE(STIS,PRI,SIGS,SIGT,STR,DEL,UUU,EBIN)
+ DEALLOCATE(LCORR,ISOMIX,MRANK,NJJ,IPISO)
+ RETURN
+ END