summaryrefslogtreecommitdiff
path: root/Dragon/src/EVODPL.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/EVODPL.f
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/EVODPL.f')
-rw-r--r--Dragon/src/EVODPL.f425
1 files changed, 425 insertions, 0 deletions
diff --git a/Dragon/src/EVODPL.f b/Dragon/src/EVODPL.f
new file mode 100644
index 0000000..7868b98
--- /dev/null
+++ b/Dragon/src/EVODPL.f
@@ -0,0 +1,425 @@
+*DECK EVODPL
+ SUBROUTINE EVODPL(IMPX,YDPL,NVAR,XT,EPS1,EXPMAX,H1,ITYPE,IDIRAC,
+ 1 IEVOL2,MU1,IMA,MAXA,NSUPF,NFISS,KFISS,YSF,ADPL,BDPL,ICHAIN)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Multi-purpose driver for solving the isotopic depletion equations,
+* taking into account the saturation phenomena.
+*
+*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/output
+* IMPX print flag (equal to zero for no print).
+* YDPL initial/final number densities.
+* NVAR number of nuclides in the complete depletion chain.
+* XT initial and final value of the independent variable.
+* EPS1 required accuracy for the ODE solver.
+* EXPMAX saturation limit. A nuclide is saturating if
+* -ADPL(MU1(I))*(XT(2)-XT(1)).GT.EXPMAX. Suggested value:
+* EXPMAX=80.0. EXPMAX=0.0 means that the saturation model is
+* not used.
+* H1 guessed first stepsize.
+* ITYPE type of ODE solution:
+* =1 fifth-order Runge-Kutta method;
+* =2 fourth-order Kaps-Rentrop method.
+* IDIRAC saturation model flag (=1 to use Dirac function contributions
+* in the saturating nuclide number densities.
+* IEVOL2 flag making an isotope non-depleting:
+* =1 to force an isotope to be non-depleting;
+* =2 to force an isotope to be depleting;
+* =3 to force an isotope to be at saturation.
+* MU1 position of each diagonal element in matrix ADPL.
+* IMA position of the first non-zero column element in matrix ADPL.
+* MAXA first dimension of matrix ADPL.
+* NSUPF number of depleting fission products.
+* NFISS number of fissile isotopes producing fission products.
+* KFISS position in chain of the fissile isotopes.
+* YSF initial/final product of the fission yields and fission
+* rates.
+* ADPL initial/final depletion matrix.
+* BDPL initial/final depletion source.
+* ICHAIN name of the isotopes in the depletion chain.
+*
+*-----------------------------------------------------------------------
+*
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ INTEGER IMPX,NVAR,ITYPE,IDIRAC,IEVOL2(NVAR),MU1(NVAR),IMA(NVAR),
+ 1 MAXA,NSUPF,NFISS,KFISS(NFISS),ICHAIN(2,NVAR)
+ REAL YDPL(NVAR,2),XT(2),EPS1,EXPMAX,H1,YSF(NFISS,NSUPF,2),
+ 1 ADPL(MAXA,2),BDPL(NVAR,2)
+*----
+* LOCAL VARIABLES
+*----
+ LOGICAL LSAT
+ CHARACTER*2 SHOW(120,120)
+*----
+* ALLOCATABLE ARRAYS
+*----
+ INTEGER, ALLOCATABLE, DIMENSION(:) :: KSAT,IPERM,MU12,IMA2,KFIS2
+ REAL, ALLOCATABLE, DIMENSION(:) :: YST1,YSAT
+ REAL, ALLOCATABLE, DIMENSION(:,:) :: ADPL2,BDPL2,BDPL3
+ REAL, ALLOCATABLE, DIMENSION(:,:,:) :: YSF2,YSF3
+*----
+* SCRATCH STORAGE ALLOCATION
+*----
+ ALLOCATE(KSAT(NVAR),IPERM(NVAR),MU12(NVAR),IMA2(NVAR),
+ 1 KFIS2(NFISS))
+ ALLOCATE(YST1(NVAR),YSAT(NVAR),ADPL2(MAXA,2),BDPL2(NVAR,2),
+ 1 YSF2(NFISS,NSUPF,2))
+*----
+* COMPUTE THE LUMPING INDEX VECTOR IPERM
+*----
+ DO 10 I=1,NVAR
+ IPERM(I)=I
+ 10 CONTINUE
+ NTER=0
+ 20 NTER=NTER+1
+ INDSAT=0
+ DO 30 I=1,NVAR
+ IF(IPERM(I).GE.0) THEN
+ LSAT=(IEVOL2(I).EQ.3).AND.(EXPMAX.GT.0.0)
+ IF(EXPMAX.GT.0.0) THEN
+ LSAT=LSAT.OR.((ABS(ADPL(MU1(I),1)*(XT(2)-XT(1))).GT.EXPMAX)
+ > .AND.(ABS(ADPL(MU1(I),2)*(XT(2)-XT(1))).GT.EXPMAX))
+ ENDIF
+ IF(LSAT) THEN
+ DO 25 II=1,NFISS
+ IF(I.EQ.KFISS(II)) GO TO 30
+ 25 CONTINUE
+ IPERM(I)=0
+ IF(INDSAT.EQ.0) THEN
+ IF(IMPX.GT.5) WRITE(6,'(17H EVODPL: ISOTOPE ,2A4,
+ 1 18H IS SATURATING(1).)') ICHAIN(1,I),ICHAIN(2,I)
+ IPERM(I)=-NTER
+ INDSAT=I
+ ENDIF
+ ENDIF
+ ENDIF
+ 30 CONTINUE
+ IF(INDSAT.EQ.0) GO TO 60
+ DO 50 I=INDSAT+1,NVAR
+ JMN=I-MU1(I)+IMA(I-1)+1
+ IMN=I-IMA(I)+MU1(I)
+ DO 40 J=MIN(JMN,IMN),I-1
+ IF((IPERM(I).EQ.0).AND.(IPERM(J).EQ.-NTER)) THEN
+ IF(IMPX.GT.5) WRITE(6,'(17H EVODPL: ISOTOPE ,2A4,
+ 1 18H IS SATURATING(2).)') ICHAIN(1,I),ICHAIN(2,I)
+ IPERM(I)=-NTER
+ GO TO 50
+ ENDIF
+ 40 CONTINUE
+ 50 CONTINUE
+ GO TO 20
+ 60 NTER=NTER-1
+ N=0
+ DO 70 I=1,NVAR
+ IF(IPERM(I).GT.0) THEN
+ N=N+1
+ IPERM(I)=N
+ ENDIF
+ 70 CONTINUE
+ IF(IMPX.GT.3) THEN
+ WRITE(6,400) NVAR,XT(1),XT(2),EPS1,H1,ITYPE,NTER,NVAR-N,NFISS,
+ 1 NSUPF,(IPERM(I),I=1,NVAR)
+ WRITE(6,410) (YDPL(I,1),I=1,NVAR)
+ ENDIF
+ IF(IMPX.GT.5) THEN
+ NVARM=MIN(NVAR,120)
+ WRITE (6,'(//34H EVODPL: DEPLETION MATRIX PROFILE:/)')
+ DO 85 I=1,NVARM
+ DO 80 J=1,NVARM
+ SHOW(I,J)=' '
+ 80 CONTINUE
+ 85 CONTINUE
+ IMAM1=0
+ DO 120 I=1,NVARM
+ DO 90 J=I-MU1(I)+IMAM1+1,I-1
+ SHOW(I,J)='*'
+ 90 CONTINUE
+ DO 100 J=I-IMA(I)+MU1(I),I-1
+ SHOW(J,I)='*'
+ 100 CONTINUE
+ IF(I.GT.NVAR-NSUPF) THEN
+ DO 110 K=1,NFISS
+ KFI=KFISS(K)
+ IF((KFI.GT.0).AND.(KFI.LE.120)) SHOW(I,KFI)='-'
+ 110 CONTINUE
+ ENDIF
+ SHOW(I,I)='+'
+ IMAM1=IMA(I)
+ 120 CONTINUE
+ DO 130 I=1,NVARM
+ WRITE (6,'(1X,I4,1X,2A4,1X,120A2)') I,ICHAIN(1,I),ICHAIN(2,I),
+ 1 (SHOW(I,J),J=1,NVARM)
+ 130 CONTINUE
+ IF(NVAR.GT.120)
+ > WRITE(6,'(34H MATRIX TRUNCATED TO 120 ELEMENTS.)')
+ IF(IMPX .GE. 1000) THEN
+ write(6,'(A)') 'ORIGINAL DEPLETION SYSTEM'
+ write(6,'(3I10)') NVAR,NFISS,NSUPF
+ write(6,'(A6)') 'MU1 '
+ write(6,'(20I5)') (MU1(I),I=1,NVAR)
+ write(6,'(A6)') 'IMA '
+ write(6,'(20I5)') (IMA(I),I=1,NVAR)
+ write(6,'(A6)') 'ADPL1 '
+ write(6,'(1P,5E20.12)') (ADPL(I,1),I=1,IMA(NVAR))
+ write(6,'(A6)') 'BDPL1 '
+ write(6,'(1P,5E20.12)') (BDPL(I,1),I=1,NVAR)
+ write(6,'(A6)') 'KFISS '
+ write(6,'(20I5)') (KFISS(K),K=1,NFISS)
+ write(6,'(A6)') 'YSF1 '
+ write(6,'(1P,5E20.12)') ((YSF(I,J,1),I=1,NFISS),J=1,NSUPF)
+ ENDIF
+ ENDIF
+*----
+* LUMPING OF THE DEPLETION MATRICES
+*----
+ DO 135 IFI=1,NFISS
+ KFIS2(IFI)=KFISS(IFI)
+ 135 CONTINUE
+ DO 140 I=1,NVAR
+ YST1(I)=YDPL(I,1)
+ MU12(I)=MU1(I)
+ IMA2(I)=IMA(I)
+ 140 CONTINUE
+ DO 162 L=1,2
+ DO 145 I=1,NVAR
+ BDPL2(I,L)=BDPL(I,L)
+ 145 CONTINUE
+ DO 150 I=1,IMA(NVAR)
+ ADPL2(I,L)=ADPL(I,L)
+ 150 CONTINUE
+ DO 161 I=1,NFISS
+ DO 160 J=1,NSUPF
+ YSF2(I,J,L)=YSF(I,J,L)
+ 160 CONTINUE
+ 161 CONTINUE
+ 162 CONTINUE
+ NVAR2=NVAR
+ NSUPF2=NSUPF
+ DO 180 ITER=1,NTER
+ I0=0
+ NSAT=0
+ DO 170 I=1,NVAR
+ IF((IPERM(I).GT.0).OR.(IPERM(I).LT.-ITER)) THEN
+ I0=I0+1
+ ELSE IF(IPERM(I).EQ.-ITER) THEN
+ I0=I0+1
+ NSAT=NSAT+1
+ KSAT(NSAT)=I0
+ ENDIF
+ 170 CONTINUE
+ IF(I0.NE.NVAR2) CALL XABORT('EVODPL: ALGORITHM FAILURE 1.')
+ MAXB=NVAR
+ MAXY=NSUPF
+ CALL EVOSAT(IMPX,MAXA,MAXB,MAXY,2,NSAT,NVAR2,KSAT,YST1,YSAT,MU12,
+ 1 IMA2,NSUPF2,NFISS,IDIRAC,KFIS2,YSF2(1,1,1),ADPL2(1,1),BDPL2(1,1),
+ 2 NSUPF3)
+ NVAR2=NVAR2-NSAT
+ NSUPF2=NSUPF3
+ NSAT=0
+ I0=0
+ DO 175 I=1,NVAR
+ IF((IPERM(I).GT.0).OR.(IPERM(I).LT.-ITER)) THEN
+ I0=I0+1
+ YDPL(I,1)=YST1(I0)
+ ELSE IF(IPERM(I).EQ.-ITER) THEN
+ NSAT=NSAT+1
+ YDPL(I,1)=YSAT(NSAT)
+ ENDIF
+ 175 CONTINUE
+ 180 CONTINUE
+ IF(IMPX.GT.4) WRITE(6,420) (YDPL(I,1),I=1,NVAR)
+*----
+* SOLUTION OF THE LUMPED DEPLETION SYSTEM
+*----
+ DO 185 I=1,NVAR
+ YDPL(I,2)=YDPL(I,1)
+ 185 CONTINUE
+ IF(NVAR2.EQ.0) GO TO 315
+ DO 190 I=1,NVAR2
+ FACT=(BDPL2(I,2)-BDPL2(I,1))/(XT(2)-XT(1))
+ BDPL2(I,1)=BDPL2(I,1)-FACT*XT(1)
+ BDPL2(I,2)=FACT
+ 190 CONTINUE
+ DO 200 I=1,IMA2(NVAR2)
+ FACT=(ADPL2(I,2)-ADPL2(I,1))/(XT(2)-XT(1))
+ ADPL2(I,1)=ADPL2(I,1)-FACT*XT(1)
+ ADPL2(I,2)=FACT
+ 200 CONTINUE
+ DO 215 I=1,NFISS
+ DO 210 J=1,NSUPF2
+ FACT=(YSF2(I,J,2)-YSF2(I,J,1))/(XT(2)-XT(1))
+ YSF2(I,J,1)=YSF2(I,J,1)-FACT*XT(1)
+ YSF2(I,J,2)=FACT
+ 210 CONTINUE
+ 215 CONTINUE
+ IF(IMPX.GT.4) THEN
+ WRITE(6,430) NSUPF2
+ WRITE(6,440) (YST1(I),I=1,NVAR2)
+ ENDIF
+ IF(IMPX.GT.5) THEN
+ NVARM=MIN(NVAR2,120)
+ WRITE (6,'(//41H EVODPL: LUMPED DEPLETION MATRIX PROFILE:/)')
+ DO 225 I=1,NVARM
+ DO 220 J=1,NVARM
+ SHOW(I,J)=' '
+ 220 CONTINUE
+ 225 CONTINUE
+ IMAM1=0
+ DO 260 I=1,NVARM
+ DO 230 J=I-MU12(I)+IMAM1+1,I-1
+ SHOW(I,J)='*'
+ 230 CONTINUE
+ DO 240 J=I-IMA2(I)+MU12(I),I-1
+ SHOW(J,I)='*'
+ 240 CONTINUE
+ IF(I.GT.NVAR2-NSUPF2) THEN
+ DO 250 K=1,NFISS
+ KFI=KFIS2(K)
+ IF((KFI.GT.0).AND.(KFI.LE.60)) SHOW(I,KFI)='-'
+ 250 CONTINUE
+ ENDIF
+ SHOW(I,I)='+'
+ IMAM1=IMA2(I)
+ 260 CONTINUE
+ DO 270 I=1,NVARM
+ WRITE (6,'(1X,I4,1X,2A4,1X,120A2)') I,ICHAIN(1,I),ICHAIN(2,I),
+ 1 (SHOW(I,J),J=1,NVARM)
+ 270 CONTINUE
+ IF(NVAR.GT.120)
+ > WRITE(6,'(34H MATRIX TRUNCATED TO 120 ELEMENTS.)')
+ IF(IMPX .GE. 1000) THEN
+ write(6,'(A)') 'LUMPED DEPLETION SYSTEM'
+ write(6,'(3I10)') NVAR2,NFISS,NSUPF2
+ write(6,'(A6)') 'MU1 '
+ write(6,'(20I5)') (MU12(I),I=1,NVAR2)
+ write(6,'(A6)') 'IMA '
+ write(6,'(20I5)') (IMA2(I),I=1,NVAR2)
+ write(6,'(A6)') 'ADPL2 '
+ write(6,'(1P,5E20.12)') (ADPL2(I,1),I=1,IMA2(NVAR2))
+ write(6,'(A6)') 'BDPL2 '
+ write(6,'(1P,5E20.12)') (BDPL2(I,1),I=1,NVAR2)
+ write(6,'(A6)') 'KFISS '
+ write(6,'(20I5)') (KFIS2(K),K=1,NFISS)
+ write(6,'(A6)') 'YSF1 '
+ write(6,'(1P,5E20.12)') ((YSF2(I,J,1),I=1,NFISS),J=1,NSUPF2)
+ ENDIF
+ ENDIF
+ ALLOCATE(BDPL3(NVAR2,2),YSF3(NFISS,NSUPF2,2))
+ DO 280 I=1,NVAR2
+ BDPL3(I,1)=BDPL2(I,1)
+ BDPL3(I,2)=BDPL2(I,2)
+ 280 CONTINUE
+ DO 295 I=1,NFISS
+ DO 290 J=1,NSUPF2
+ YSF3(I,J,1)=YSF2(I,J,1)
+ YSF3(I,J,2)=YSF2(I,J,2)
+ 290 CONTINUE
+ 295 CONTINUE
+ CALL EVOODE(YST1,NVAR2,XT(1),XT(2),EPS1,H1,NOK,NBAD,ITYPE,MU12,
+ 1 IMA2,MAXA,NSUPF2,NFISS,KFIS2,YSF3,ADPL2,BDPL3)
+ DEALLOCATE(YSF3,BDPL3)
+ IF(IMPX.GT.4) THEN
+ WRITE(6,450) (YST1(I),I=1,NVAR2)
+ IF(ITYPE.LE.2) WRITE(6,'(13H EVODPL: NOK=,I5,6H NBAD=,I5)')
+ 1 NOK,NBAD
+ ENDIF
+ DO 310 I=1,NVAR
+ IF(IPERM(I).GT.0) YDPL(I,2)=YST1(IPERM(I))
+ 310 CONTINUE
+*----
+* COMPUTE NUMBER DENSITIES OF THE SATURATED ISOTOPES
+*----
+ 315 IF(NTER.EQ.0) GO TO 370
+ DO 320 I=1,NVAR
+ YST1(I)=YDPL(I,2)
+ BDPL2(I,2)=BDPL(I,2)
+ MU12(I)=MU1(I)
+ IMA2(I)=IMA(I)
+ 320 CONTINUE
+ DO 330 I=1,IMA(NVAR)
+ ADPL2(I,2)=ADPL(I,2)
+ 330 CONTINUE
+ DO 345 I=1,NFISS
+ KFIS2(I)=KFISS(I)
+ DO 340 J=1,NSUPF
+ YSF2(I,J,2)=YSF(I,J,2)
+ 340 CONTINUE
+ 345 CONTINUE
+ NVAR2=NVAR
+ NSUPF2=NSUPF
+ DO 365 ITER=1,NTER
+ I0=0
+ NSAT=0
+ DO 350 I=1,NVAR
+ IF((IPERM(I).GT.0).OR.(IPERM(I).LT.-ITER)) THEN
+ I0=I0+1
+ ELSE IF(IPERM(I).EQ.-ITER) THEN
+ I0=I0+1
+ NSAT=NSAT+1
+ KSAT(NSAT)=I0
+ ENDIF
+ 350 CONTINUE
+ IF(I0.NE.NVAR2) CALL XABORT('EVODPL: ALGORITHM FAILURE 2.')
+ MAXB=NVAR
+ MAXY=NSUPF
+ CALL EVOSAT(IMPX,MAXA,MAXB,MAXY,1,NSAT,NVAR2,KSAT,YST1,YSAT,MU12,
+ 1 IMA2,NSUPF2,NFISS,IDIRAC,KFIS2,YSF2(1,1,2),ADPL2(1,2),BDPL2(1,2),
+ 2 NSUPF3)
+ IF(IMPX.GT.4) WRITE(6,425) ITER,(YSAT(I),I=1,NSAT)
+ NVAR2=NVAR2-NSAT
+ NSUPF2=NSUPF3
+ NSAT=0
+ I0=0
+ DO 360 I=1,NVAR
+ IF((IPERM(I).GT.0).OR.(IPERM(I).LT.-ITER)) THEN
+ I0=I0+1
+ YDPL(I,2)=YST1(I0)
+ ELSE IF(IPERM(I).EQ.-ITER) THEN
+ NSAT=NSAT+1
+ YDPL(I,2)=YSAT(NSAT)
+ ENDIF
+ 360 CONTINUE
+ 365 CONTINUE
+ 370 IF(IMPX.GT.3) WRITE(6,460) (YDPL(I,2),I=1,NVAR)
+*----
+* SCRATCH STORAGE DEALLOCATION
+*----
+ DEALLOCATE(YSF2,BDPL2,ADPL2,YSAT,YST1)
+ DEALLOCATE(KFIS2,IMA2,MU12,IPERM,KSAT)
+ RETURN
+*
+ 400 FORMAT(//45H EVODPL: SOLUTION OF THE DEPLETION EQUATIONS.//14X,
+ 1 25HTOTAL NUMBER OF NUCLIDES=,I5/26X,13HINITIAL TIME=,1P,E12.4/
+ 2 28X,11HFINAL TIME=,E12.4/15X,24HACCURACY FOR ODE SOLVER=,E12.4/
+ 3 16X,23HGUESSED FIRST STEPSIZE=,E12.4,0P/22X,17HTYPE OF SOLUTION=,
+ 4 I3/39H NUMBER OF GROUP OF SATURATED NUCLIDES=,I5/10X,
+ 5 29HNUMBER OF SATURATED NUCLIDES=,I5/12X,19HNUMBER OF FISSILE N,
+ 6 8HUCLIDES=,I5/12X,27HNUMBER OF FISSION PRODUCTS=,I5//
+ 7 22H LUMPING INDEX VECTOR:/(1X,20I5))
+ 410 FORMAT(/48H EVODPL: INITIAL VALUES OF THE DEPLETION SYSTEM:/
+ 1 (1X,1P,10E12.4))
+ 420 FORMAT(/53H EVODPL: SATURATED INITIAL CONDITIONS OF THE DEPLETIO,
+ 1 9HN SYSTEM:/(1X,1P,10E12.4))
+ 425 FORMAT(/51H EVODPL: FINAL VALUES OF THE SATURATED NUCLIDES IN ,
+ 1 9HGROUP NO.,I5//(1X,1P,10E12.4))
+ 430 FORMAT(/42H NUMBER OF NON-SATURATED FISSION PRODUCTS=,I5)
+ 440 FORMAT(/55H EVODPL: INITIAL VALUES OF THE LUMPED DEPLETION SYSTEM:
+ 1 /(1X,1P,10E12.4))
+ 450 FORMAT(/53H EVODPL: ODE SOLUTION OF THE LUMPED DEPLETION SYSTEM:/
+ 1 (1X,1P,10E12.4))
+ 460 FORMAT(/42H EVODPL: SOLUTION OF THE DEPLETION SYSTEM:/
+ 1 (1X,1P,10E12.4))
+ END