summaryrefslogtreecommitdiff
path: root/Dragon/src/EDILUM.f
diff options
context:
space:
mode:
Diffstat (limited to 'Dragon/src/EDILUM.f')
-rw-r--r--Dragon/src/EDILUM.f433
1 files changed, 433 insertions, 0 deletions
diff --git a/Dragon/src/EDILUM.f b/Dragon/src/EDILUM.f
new file mode 100644
index 0000000..bbf8c36
--- /dev/null
+++ b/Dragon/src/EDILUM.f
@@ -0,0 +1,433 @@
+*DECK EDILUM
+ SUBROUTINE EDILUM(IPRINT,IPEDIT,MAXFP,NBISO,NBFISS,NBDPF,NSUPS,
+ & NREAC,NFATH,NBCH,HICH,HISO,MYLIST,HREAC,IDREAC,DENER,DDECA,
+ & IPREAC,PRATE,YIELD,LISO,NBFISS2,NBFPCH2)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Complete and lump the burnup chain from NBISO to NBCH isotopes.
+* Write the lumped chain on the LCM object. Based on subroutine
+* dralum.f in dragr module.
+*
+*Copyright:
+* Copyright (C) 2007 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
+* IPRINT print parameter.
+* IPEDIT pointer to the edition LCM object.
+* MAXFP second dimension of array 'YIELD'.
+* NBISO number of depleting nuclides before lumping.
+* NBFISS number of fissile isotopes with fission yields.
+* NBDPF number of fission products before lumping.
+* NSUPS number of stable isotopes producing energy.
+* NREAC number of depleting reactions including radioactive decay
+* NFATH maximum number of parent isotopes leading to the production of
+* an isotope in the depletion chain before lumping.
+* NBCH number of depleting nuclides after lumping.
+* HICH names of remaining isotopes after lumping.
+* HISO 'ISOTOPESDEPL' record before lumping.
+* MYLIST 'CHARGEWEIGHT' record before lumping.
+* HREAC 'DEPLETE-IDEN' record before lumping.
+* IDREAC 'DEPLETE-REAC' record before lumping.
+* DENER 'DEPLETE-ENER' record before lumping.
+* DDECA 'DEPLETE-DECA' record before lumping.
+* IPREAC 'PRODUCE-REAC' record before lumping.
+* PRATE 'PRODUCE-RATE' record before lumping.
+* YIELD 'FISSIONYIELD' record before lumping.
+* LISO =.true. when all isotopes are kept separately during
+* the merging.
+* NBFISS2 new number of fissile isotopes with fission yields.
+* NBFPCH2 new maximum number of fission products after lumping.
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ TYPE(C_PTR) IPEDIT
+ INTEGER IPRINT,MAXFP,NBISO,NBFISS,NBDPF,NSUPS,NREAC,NFATH,
+ & MYLIST(NBISO),HICH(3,NBCH),HISO(3,NBISO),NBCH,HREAC(2,NREAC),
+ & IDREAC(NREAC,NBISO),IPREAC(NFATH,NBISO),NBFISS2,NBFPCH2
+ REAL DENER(NREAC,NBISO),DDECA(NBISO),PRATE(NFATH,NBISO),
+ & YIELD(NBFISS,MAXFP)
+ LOGICAL LISO
+*----
+* LOCAL VARIABLES
+*----
+ PARAMETER (NSTATE=40,MAXIT=20,NSYSO=6)
+ CHARACTER HNAME*8,TEXT4*4
+ INTEGER ISTATE(NSTATE),MIX(NBCH),IMIX
+ INTEGER, ALLOCATABLE, DIMENSION(:,:) :: JPREAC,JDREAC,IPOS,HHHH
+ REAL, ALLOCATABLE, DIMENSION(:) :: EYIEL,DDDD
+ REAL, ALLOCATABLE, DIMENSION(:,:) :: RRATE,EENER
+*----
+* SCRATCH STORAGE ALLOCATION
+*----
+ PARAMETER (MAXFAT=25)
+ ALLOCATE(JPREAC(MAXFAT,NBCH),JDREAC(NREAC,NBCH),IPOS(NBCH,3),
+ & HHHH(3,NBCH))
+ ALLOCATE(RRATE(MAXFAT,NBCH),EENER(NREAC,NBCH),
+ & EYIEL(NBFISS2*NBFPCH2),DDDD(NBCH))
+*----
+* FIND THE POSITION OF THE LUMPED ISOTOPES IN THE COMPLETE CHAIN
+*----
+ J0OLD=0
+ J0=0
+ DO ISO=1,NBCH
+ DO JSO=1,NBISO
+ J0=JSO
+ IF((HICH(1,ISO).EQ.HISO(1,JSO)).AND.
+ & (HICH(2,ISO).EQ.HISO(2,JSO))) GO TO 10
+ ENDDO
+ WRITE(NSYSO,'(/35H EDILUM: LIST OF AVAILABLE ISOTOPES)')
+ DO JSO=1,NBISO
+ WRITE(NSYSO,'(2X,I5,5H --> ,2A4)') JSO,HISO(1,JSO),HISO(2,JSO)
+ ENDDO
+ WRITE(HNAME,'(2A4)') HICH(1,ISO),HICH(2,ISO)
+ CALL XABORT('EDILUM: UNABLE TO FIND '//HNAME)
+ 10 IF(.NOT.LISO) THEN
+ IF(J0.LE.J0OLD) THEN
+ WRITE(HNAME,'(2A4)') HISO(1,J0),HISO(2,J0)
+ CALL XABORT('EDILUM: ISOTOPIC DATA NOT SORTED:'//HNAME)
+ ENDIF
+ ENDIF
+ J0OLD=J0
+ IPOS(ISO,1)=J0
+ ENDDO
+ DO I=1,NBCH
+ IMIX=1
+ IF(I.EQ.1) GOTO 15
+ DO J=1,I-1
+ IF(IPOS(I,1).EQ.IPOS(J,1)) IMIX=IMIX+1
+ ENDDO
+ 15 MIX(I)=IMIX
+ ENDDO
+*----
+* REMOVE THE LUMPED FATHERS THAT ARE NEUTRON INDUCED REACTIONS.
+*----
+ DO ISO=1,NBISO
+ DO IFATH=1,NFATH
+ IF(IPREAC(IFATH,ISO).EQ.0) GO TO 20
+ IF(MOD(IPREAC(IFATH,ISO),100).EQ.1) GO TO 20
+ JND=IPREAC(IFATH,ISO)/100
+ DO J=1,NBCH
+ IF(IPOS(J,1).EQ.JND) GO TO 20
+ ENDDO
+ IPREAC(IFATH,ISO)=0
+ PRATE(IFATH,ISO)=0.0
+ 20 CONTINUE
+ ENDDO
+ ENDDO
+*----
+* LUMP IDREAC, DENER, IPREAC AND PRATE.
+*----
+ ITER=0
+ 40 ITER=ITER+1
+ IF(ITER.GT.MAXIT) CALL XABORT('EDILUM: TOO MANY ITERATIONS.')
+ NLUMP=0
+ DO ISO=1,NBCH
+ IND=IPOS(ISO,1)
+ DO IFATH=1,NFATH
+ IF(IPREAC(IFATH,IND).EQ.0) GO TO 50
+ IF(MOD(IPREAC(IFATH,IND),100).NE.1) GO TO 50
+ JND=IPREAC(IFATH,IND)/100
+ IF(MYLIST(JND).EQ.0) GO TO 50
+ DO J=1,NBCH
+ IF(IPOS(J,1).EQ.JND) GO TO 50
+ ENDDO
+ NLUMP=NLUMP+1 ! ISOTOPE JND IS LUMPED
+ DO IDA=1,NBISO
+ DO IFA=1,NFATH
+ IPGAR=IPREAC(IFA,IDA)
+ IF((IPGAR/100.EQ.JND).AND.(MOD(IPGAR,100).EQ.1)) THEN
+ IF(MYLIST(IDA).EQ.0) GO TO 50
+ ENDIF
+ ENDDO
+ ENDDO
+ DO IDA=1,NBISO
+ DO IFA=1,NFATH
+ IPGAR=IPREAC(IFA,IDA)
+ IF((IPGAR/100.EQ.JND).AND.(MOD(IPGAR,100).EQ.1)) THEN
+ IF(IDA.EQ.JND) CALL XABORT('EDILUM: BUG.')
+ PRGAR=PRATE(IFA,IDA)
+ DO IM=IFA,NFATH-1
+ IPREAC(IM,IDA)=IPREAC(IM+1,IDA)
+ PRATE(IM,IDA)=PRATE(IM+1,IDA)
+ ENDDO
+ IPREAC(NFATH,IDA)=0
+ PRATE(NFATH,IDA)=0.0
+ DO JFATH=1,NFATH
+ IF(IPREAC(JFATH,JND).EQ.0) GO TO 45
+ IM=NFATH+1
+ DO K=NFATH,1,-1
+ IF(IPREAC(K,IDA).EQ.IPREAC(JFATH,JND)) THEN
+ PRATE(K,IDA)=PRATE(K,IDA)+PRGAR*PRATE(JFATH,JND)
+ GO TO 44
+ ENDIF
+ IF(IPREAC(K,IDA).EQ.0) IM=K
+ ENDDO
+ IF(IM.GT.NFATH) CALL XABORT('EDILUM: NFATH OVERFLOW.')
+ IPREAC(IM,IDA)=IPREAC(JFATH,JND)
+ PRATE(IM,IDA)=PRGAR*PRATE(JFATH,JND)
+ 44 CONTINUE
+ ENDDO
+ 45 IF(MOD(IDREAC(2,JND),100).EQ.5) THEN
+ JFP=IDREAC(2,JND)/100
+ IF(MOD(IDREAC(2,IDA),100).EQ.5) THEN
+ IFP=IDREAC(2,IDA)/100
+ ELSE
+ NBDPF=NBDPF+1
+ IF(NBDPF.GT.MAXFP) THEN
+ CALL XABORT('EDILUM: MAXFP OVERFLOW.')
+ ENDIF
+ IFP=NBDPF
+ YIELD(:NBFISS,IFP)=0.0
+ ENDIF
+ DO IFI=1,NBFISS
+ YIELD(IFI,IFP)=YIELD(IFI,IFP)+YIELD(IFI,JFP)*PRGAR
+ ENDDO
+ IDREAC(2,IDA)=IFP*100+5
+ ENDIF
+ ENDIF
+ ENDDO
+ ENDDO
+ DO JFATH=1,NFATH
+ IF(IPREAC(JFATH,JND).GT.0) THEN
+ KT=MOD(IPREAC(JFATH,JND),100)
+ KND=IPREAC(JFATH,JND)/100
+ DENER(KT,KND)=DENER(KT,KND)+PRATE(JFATH,JND)*DENER(1,JND)
+ ENDIF
+ IPREAC(JFATH,JND)=0
+ PRATE(JFATH,JND)=0.0
+ ENDDO
+ YMAX=0.0
+ IF(MOD(IDREAC(2,JND),100).EQ.5) THEN
+ JFP=IDREAC(2,JND)/100
+ DO KSO=1,NBISO
+ IF(MOD(IDREAC(2,KSO),100).EQ.4) THEN
+ IFI=IDREAC(2,KSO)/100
+ DENER(2,KSO)=DENER(2,KSO)+YIELD(IFI,JFP)*DENER(1,JND)
+ ENDIF
+ ENDDO
+ DO IFI=1,NBFISS
+ YMAX=MAX(YMAX,ABS(YIELD(IFI,JFP)))
+ YIELD(IFI,JFP)=0.0
+ ENDDO
+ DENER(2,JND)=0.0
+ IDREAC(2,JND)=0
+ ENDIF
+ DENER(1,JND)=0.0
+ IDREAC(1,JND)=0
+ HALF=1.0E8*LOG(2.0)/DDECA(JND)/86400.0
+ IF(DDECA(JND).EQ.0.0) THEN
+ WRITE(HNAME,'(2A4)') HISO(1,JND),HISO(2,JND)
+ IF(YMAX.GT.1.0E-2) THEN
+ WRITE(NSYSO,6020) TRIM(HNAME),HALF,YMAX*100.0
+ CALL XABORT('EDILUM: ISOTOPE '//HNAME//' SHOULD NOT BE L'
+ & //'UMPED.(1)')
+ ENDIF
+ IF(IPRINT.GT.2) WRITE(NSYSO,6020) HNAME,HALF,YMAX*100.0
+ ELSE IF((HALF.GT.30.0).AND.(HALF.LT.999999.99)) THEN
+ WRITE(HNAME,'(2A4)') HISO(1,JND),HISO(2,JND)
+ IF(YMAX.GT.1.0E-2) THEN
+ WRITE(NSYSO,6020) TRIM(HNAME),HALF,YMAX*100.0
+ CALL XABORT('EDILUM: ISOTOPE '//HNAME//' SHOULD NOT BE L'
+ & //'UMPED.(2)')
+ ENDIF
+ IF(IPRINT.GT.2) WRITE(NSYSO,6020) HNAME,HALF,YMAX*100.0
+ ELSE IF(HALF.GT.30.0) THEN
+ WRITE(HNAME,'(2A4)') HISO(1,JND),HISO(2,JND)
+ IF(YMAX.GT.1.0E-2) THEN
+ WRITE(NSYSO,6020) TRIM(HNAME),HALF,YMAX*100.0
+ CALL XABORT('EDILUM: ISOTOPE '//HNAME//' SHOULD NOT BE L'
+ & //'UMPED.(3)')
+ ENDIF
+ IF(IPRINT.GT.2) WRITE(NSYSO,6020) HNAME,HALF,YMAX*100.0
+ ENDIF
+ DDECA(JND)=0.0
+ MYLIST(JND)=0
+ 50 CONTINUE
+ ENDDO
+ ENDDO
+ IF(IPRINT.GT.2) WRITE(NSYSO,'('' ......... NLUMP='',I5)') NLUMP
+ IF(NLUMP.GT.0) GO TO 40
+*----
+* WRITE VECTORS 'PRODUCE-REAC' AND 'PRODUCE-RATE' TO THE LCM OBJECT
+*----
+ DO ISO=1,NBCH
+ DO IFATH=1,MAXFAT
+ JPREAC(IFATH,ISO)=0
+ RRATE(IFATH,ISO)=0.0
+ ENDDO
+ IND=IPOS(ISO,1)
+ NN=0
+ DO IFATH=1,NFATH
+ IF(IPREAC(IFATH,IND).NE.0) THEN
+ DO J=1,IFATH-1
+ IF(IPREAC(IFATH,IND).EQ.IPREAC(J,IND)) THEN
+ JND1=IPREAC(IFATH,IND)/100
+ JND2=IPREAC(J,IND)/100
+ WRITE(NSYSO,'(/27H EDILUM: DUPLICATE FATHERS:,2A4,
+ & 1X,2A4)') HISO(1,JND1),HISO(2,JND1),HISO(1,JND2),
+ & HISO(2,JND2)
+ WRITE(HNAME,'(2A4)') HISO(1,IND),HISO(2,IND)
+ CALL XABORT('EDILUM: DUPLICATE FATHERS FOR '//HNAME)
+ ENDIF
+ ENDDO
+ DO I=1,NBCH
+ JSO=I
+ IF((IPOS(I,1).EQ.IPREAC(IFATH,IND)/100).AND.
+ & (MIX(I).EQ.MIX(ISO)))GO TO 70
+ ENDDO
+ JSO=-1
+ 70 IF(JSO.EQ.-1) THEN
+ JND=IPREAC(IFATH,IND)/100
+ IF(IPRINT.GT.2) THEN
+ WRITE(NSYSO,'(/24H EDILUM: UNKNOWN FATHER ,2A4,5H FOR ,
+ & 2A4)') HISO(1,JND),HISO(2,JND),HISO(1,IND),HISO(2,IND)
+ ENDIF
+ ELSE
+ NN=NN+1
+ IF(NN.GT.MAXFAT) THEN
+ WRITE(TEXT4,'(I4)') NN
+ CALL XABORT('EDILUM: MAXFAT OVERFLOW NN='//TEXT4)
+ ENDIF
+ JPREAC(NN,ISO)=100*JSO+MOD(IPREAC(IFATH,IND),100)
+ RRATE(NN,ISO)=PRATE(IFATH,IND)
+ ENDIF
+ ENDIF
+ ENDDO
+ ENDDO
+ CALL LCMPUT(IPEDIT,'PRODUCE-REAC',MAXFAT*NBCH,1,JPREAC)
+ CALL LCMPUT(IPEDIT,'PRODUCE-RATE',MAXFAT*NBCH,2,RRATE)
+*----
+* WRITE THE ISOTOPE ASCII NAMES ON LCM OBJECT
+*----
+ CALL LCMPUT(IPEDIT,'DEPLETE-IDEN',2*NREAC,3,HREAC(1,1))
+*----
+* WRITE THE LUMPED FISSION YIELD MATRIX TO THE LCM OBJECT
+*----
+ IBFI=0
+ IBFP=0
+ DO ISO=1,NBCH
+ IND=IPOS(ISO,1)
+ IPOS(ISO,2)=0
+ IPOS(ISO,3)=0
+ IF(MOD(IDREAC(2,IND),100).EQ.4) THEN
+ IBFI=IBFI+1
+ IF(IBFI.GT.NBFISS2) CALL XABORT('EDILUM: NBFISS OVERFLOW.')
+ IPOS(ISO,2)=IBFI
+ ELSE IF(MOD(IDREAC(2,IND),100).EQ.5) THEN
+ IBFP=IBFP+1
+ IF(IBFP.GT.NBFPCH2) CALL XABORT('EDILUM: NBFPCH2 OVERFLOW.')
+ IPOS(ISO,3)=IBFP
+ ENDIF
+ ENDDO
+ DO ISO=1,NBCH
+ IFI=IPOS(ISO,2)
+ IF(IFI.GT.0) THEN
+ DO JSO=1,NBCH
+ IFP=IPOS(JSO,3)
+ IF(IFP.GT.0) THEN
+ IND=IPOS(ISO,1)
+ JND=IPOS(JSO,1)
+ IF(MIX(ISO).NE.MIX(JSO)) THEN
+ EYIEL((IFP-1)*IBFI+IFI)=0.0
+ ELSE
+ EYIEL((IFP-1)*IBFI+IFI)=YIELD(IDREAC(2,IND)/100,
+ & IDREAC(2,JND)/100)
+ ENDIF
+ ENDIF
+ ENDDO
+ ENDIF
+ ENDDO
+ IF(IBFI*IBFP.GT.0) CALL LCMPUT(IPEDIT,'FISSIONYIELD',IBFI*IBFP,2,
+ & EYIEL)
+*----
+* WRITE VECTORS 'DEPLETE-REAC' AND 'DEPLETE-ENER' TO THE LCM OBJECT
+*----
+ DO ISO=1,NBCH
+ IND=IPOS(ISO,1)
+ DO I=1,NREAC
+ IF(IDREAC(I,IND)/100.GT.0) THEN
+ KREAC=MOD(IDREAC(I,IND),100)
+ IF((KREAC.LE.0).OR.(KREAC.GT.5)) THEN
+ CALL XABORT('EDILUM: INVALID REACTION.')
+ ENDIF
+ ENDIF
+ IF((I.EQ.2).AND.(MOD(IDREAC(I,IND),100).EQ.4)) THEN
+ IF(IPOS(ISO,2).EQ.0) CALL XABORT('EDILUM: FAILURE 1.')
+ JDREAC(I,ISO)=IPOS(ISO,2)*100+4
+ IF(IPRINT.GT.2) THEN
+ WRITE(NSYSO,6010) (HISO(I0,IPOS(ISO,1)),I0=1,3)
+ ENDIF
+ ELSE IF((I.EQ.2).AND.(MOD(IDREAC(I,IND),100).EQ.5)) THEN
+ IF(IPOS(ISO,3).EQ.0) CALL XABORT('EDILUM: FAILURE 2.')
+ JDREAC(I,ISO)=IPOS(ISO,3)*100+5
+ ELSE
+ JDREAC(I,ISO)=IDREAC(I,IND)
+ ENDIF
+ EENER(I,ISO)=DENER(I,IND)
+ ENDDO
+ ENDDO
+ CALL LCMPUT(IPEDIT,'DEPLETE-REAC',NREAC*NBCH,1,JDREAC)
+ CALL LCMPUT(IPEDIT,'DEPLETE-ENER',NREAC*NBCH,2,EENER)
+*----
+* WRITE VECTORS 'CHARGEWEIGHT', 'DEPLETE-DECA', 'ISOTOPESDEPL' AND
+* 'STATE-VECTOR' TO THE LCM OBJECT
+*----
+ NBHEAV=0
+ NSUPS2=0
+ DO ISO=1,NBCH
+ IF(IPOS(ISO,1).GT.NBISO-NSUPS) NSUPS2=NSUPS2+1
+ HHHH(1,ISO)=HISO(1,IPOS(ISO,1))
+ HHHH(2,ISO)=HISO(2,IPOS(ISO,1))
+ HHHH(3,ISO)=HISO(3,IPOS(ISO,1))
+ DDDD(ISO)=DDECA(IPOS(ISO,1))
+ IPOS(ISO,1)=MYLIST(IPOS(ISO,1))
+ ENDDO
+ CALL LCMPUT(IPEDIT,'ISOTOPESDEPL',3*NBCH,3,HHHH)
+ CALL LCMPUT(IPEDIT,'CHARGEWEIGHT',NBCH,1,IPOS(1,1))
+ CALL LCMPUT(IPEDIT,'DEPLETE-DECA',NBCH,2,DDDD)
+ ISTATE(:NSTATE)=0
+ ISTATE(1)=NBCH
+ ISTATE(2)=IBFI
+ ISTATE(3)=IBFP
+ ISTATE(4)=NBHEAV
+ ISTATE(5)=NBCH-NBHEAV
+ ISTATE(7)=NSUPS2
+ ISTATE(8)=NREAC
+ ISTATE(9)=MAXFAT
+ CALL LCMPUT(IPEDIT,'STATE-VECTOR',NSTATE,1,ISTATE)
+ IF(IPRINT.GT.2) WRITE(NSYSO,6000) (ISTATE(ISTA),ISTA=1,9)
+*----
+* SCRATCH STORAGE DEALLOCATION
+*----
+ DEALLOCATE(DDDD,EYIEL,EENER,RRATE)
+ DEALLOCATE(HHHH,IPOS,JDREAC,JPREAC)
+ RETURN
+*----
+* FORMAT
+*----
+ 6000 FORMAT(/' STATE-VECTOR FOR LUMPED DEPLETION CHAIN'/' -------'/
+ > ' NDEPL ',I6,' (NUMBER OF DEPLETING ISOTOPES)'/
+ > ' NDFI ',I6,' (NUMBER OF DIRECT FISSILE ISOTOPES)'/
+ > ' NDFP ',I6,' (NUMBER OF DIRECT FISSION PRODUCT)'/
+ > ' NHEAVY ',I6,' (NUMBER OF HEAVY ISOTOPES)'/
+ > ' NLIGHT ',I6,' (NUMBER OF FISSION PRODUCTS)'/
+ > ' NOTHER ',I6,' (NUMBER OF OTHER ISOTOPES)'/
+ > ' NSTABL ',I6,' (NUMBER OF STABLE ISOTOPES PRODUCING ENERGY)'/
+ > ' NREAC ',I6,' (MAXIMUM NUMBER OF DEPLETION REACTIONS)'/
+ > ' NPAR ',I6,' (MAXIMUM NUMBER OF PARENT REACTIONS)'/)
+ 6010 FORMAT(45H EDILUM: FISSILE ISOTOPE WITH FISSION YIELD: ,3A4)
+ 6020 FORMAT(18H EDILUM: ISOTOPE ',A,30H' IS LUMPED AND HAS A HALF-LIF,
+ > 4HE OF,1P,E12.4,25H DAYS. MAX FISSION YIELD=,1P,E8.1,2H%.)
+ END