summaryrefslogtreecommitdiff
path: root/Dragon/src/SENDRV.f
diff options
context:
space:
mode:
Diffstat (limited to 'Dragon/src/SENDRV.f')
-rw-r--r--Dragon/src/SENDRV.f302
1 files changed, 302 insertions, 0 deletions
diff --git a/Dragon/src/SENDRV.f b/Dragon/src/SENDRV.f
new file mode 100644
index 0000000..1397332
--- /dev/null
+++ b/Dragon/src/SENDRV.f
@@ -0,0 +1,302 @@
+*DECK SENDRV
+ SUBROUTINE SENDRV(IPSENS,IPTRACK,IPLIB,IPFLUX,IPAFLUX,IPRINT,
+ > NR,NU,NI,NG,NANIS,NLTERM)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Creation of sensitivity profiles to
+* cross-section on the reactivity using first order perturbation
+* method using the adjoint calculation.
+*
+*Copyright:
+* Copyright (C) 2011 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): C. Laville, G. Marleau
+*
+*Parameters: input/output
+* IPSENS LCM Sensitivity object address.
+* IPTRACK LCM Tracking object address.
+* IPLIB LCM Library object address.
+* IPFLUX LCM Flux object address.
+* IPAFLUX LCM Adjoin flux object address.
+* IPRINT print level.
+* NR number of region in Tracking object.
+* NU number of unkwnow in Tracking/Flux objects.
+* NI number of isotopes in Library object.
+* NG number of energy group in Library object.
+* NANIS anisotropy order kept.
+* NLTERM total number of term of the flux.
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+ IMPLICIT NONE
+*----
+* Suboutine arguements
+*----
+ TYPE(C_PTR) IPTRACK,IPLIB,IPFLUX,IPAFLUX
+ INTEGER IPSENS,NR,NU,NI,NG,IPRINT,NANIS,NLTERM
+*----
+* Local variables
+*----
+ TYPE(C_PTR) KPISO,JPFLUX,JPAFLUX
+ INTEGER IG,JG,IR,KL,KKEYL,IL,IM,II
+ INTEGER ILENG,ILON,ITYLCM,NSENI,NSENS,NIC
+ REAL KEFF,D
+ CHARACTER ISONAM*12,REV*48,DATE*64,HSMG*131
+*----
+* Allocatable arrays
+*----
+ INTEGER, ALLOCATABLE, DIMENSION(:) :: MAT,KEY,MELISO,ISOC
+ INTEGER, ALLOCATABLE, DIMENSION(:,:) :: NAMISO,NAMISC
+ REAL, ALLOCATABLE, DIMENSION(:) :: VOL,ENERG,DENISO,SOLFLU,NUSIGF,
+ > CHI
+ REAL, ALLOCATABLE, DIMENSION(:,:,:) :: FLUXI,AFLUX
+ REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: P
+ TYPE(C_PTR), ALLOCATABLE, DIMENSION(:) :: IPISO
+*----
+* Parameters
+*----
+ INTEGER IOUT
+ CHARACTER NAMSBR*6
+ PARAMETER (IOUT=6,NAMSBR='SENDRV')
+*----
+* Scratch storage allocation
+* MAT Mixture of each region in Tracking object.
+* KEY Localisation of the flux/aflux for each region in Tracking
+* object.
+* MELISO Mixture of each isotope/region in Library object.
+* NAMISO Alias of each isotope/region in Library object.
+* NAMISC Independent isotopes names.
+* ISOC Independent isotope number associated with isotope/mixture.
+* VOL Volume of each region in Tracking object.
+* ENERG Energy boundaries in Library object.
+* DENISO Density of each isotope/region in Library object.
+* SOLFLU Flux solution of each region in Flux object.
+* FLUXI Flux of each region multiplied by the volume of the region.
+* AFLUX Adjoint flux of each region.
+* P Matrix calcution for sensitivity analysis.
+* NUSIGF Vector for nubar multiplied by the fission cross-section
+* CHI Vector for fission spectra.
+*----
+ ALLOCATE(MAT(NR),KEY(NU),MELISO(NI),NAMISO(3,NI),NAMISC(2,NI),
+ > ISOC(NI))
+ ALLOCATE(VOL(NR),ENERG(NG+1),DENISO(NI),SOLFLU(NU),
+ > FLUXI(NR,NLTERM,NG),AFLUX(NR,NLTERM,NG),P(NR,NANIS,NG,NG),
+ > NUSIGF(NG),CHI(NG))
+*--------
+* Step 1:
+* Recover Tracking informations
+* a) VOLUME
+* b) MATCOL
+* c) KEYFLX
+*----
+ VOL(:NR)=0.0
+ CALL LCMGET(IPTRACK,'VOLUME',VOL)
+*----
+ MAT(:NR)=0
+ CALL LCMGET(IPTRACK,'MATCOD',MAT)
+*----
+ KEY(:NU)=0
+ CALL LCMGET(IPTRACK,'KEYFLX',KEY)
+*----
+* Print information if required
+*----
+ IF(IPRINT .GE. 5) THEN
+ WRITE(IOUT,'(3(A12,8X))') 'Region # ','VOLUMES ',
+ > 'MATCOD '
+ WRITE(IOUT,'(I10,10X,E16.7,4X,I8)')
+ > (IR,VOL(IR),MAT(IR),IR=1,NR)
+ ENDIF
+*--------
+* Step 2:
+* Recover library informations
+* a) ENERGY GROUP BOUNDARIES
+* b) MIXTURE ASSOCIATED WITH ISOTOPE
+* c) ISOTOPES ALIAS
+* d) ISOTOPES DENSITIES
+*----
+ ENERG(:NG+1)=0.0
+ CALL LCMGET(IPLIB,'ENERGY',ENERG)
+*----
+ MELISO(:NI)=0
+ CALL LCMGET(IPLIB,'ISOTOPESMIX',MELISO)
+*----
+ CALL LCMGET(IPLIB,'ISOTOPESUSED',NAMISO)
+*----
+ DENISO(:NI)=0.0
+ CALL LCMGET(IPLIB,'ISOTOPESDENS',DENISO)
+*----
+* Scan library to determine number of sensitivity profiles:
+* NIC is number of independent isotopes
+* ISOC is the independent isotope number associated with
+* each isotope/mixture
+* NAMISC is the independent isotope name
+*----
+ CALL SENCNT(IPLIB,NI,NAMISO,MELISO,
+ > NSENS,NSENI,NAMISC,ISOC,NIC)
+ IF(IPRINT.GE.1) THEN
+ WRITE(IOUT,6000) NSENS+NSENI,NSENI
+ ENDIF
+*----
+* Print information if required
+*----
+ IF(IPRINT .GE. 5) THEN
+ WRITE(IOUT,'(A12)') 'ENERGY '
+ WRITE(IOUT,'(5E14.6)') (ENERG(IG),IG=1,NG+1)
+ WRITE(IOUT,'(6(A12,8X))') 'Isotope # ','ISOTOPESMIX ',
+ > 'ISOTOPESUSED','ISOTOPESDENS',
+ > 'Name Int Sen','IsoComb '
+ WRITE(IOUT,'(I8,12X,I8,12X,3A4,8X,E16.7,4X,2A4,12X,I8)')
+ > (II,MELISO(II),NAMISO(1,II),NAMISO(2,II),NAMISO(3,II),
+ > DENISO(II),NAMISC(1,ABS(ISOC(II))),NAMISC(2,ABS(ISOC(II))),
+ > ISOC(II),II=1,NI)
+ ENDIF
+*--------
+* Step 3:
+* Recover K-effective, flux and adjoint,
+* and compute integrated flux.
+*----
+ KEFF=0
+ CALL LCMGET(IPFLUX,'K-EFFECTIVE',KEFF)
+*----
+ FLUXI(:NR,:NLTERM,:NG)=0.0
+ AFLUX(:NR,:NLTERM,:NG)=0.0
+ CALL LCMLEN(IPFLUX,'FLUX',ILON,ITYLCM)
+ IF(ILON.EQ.0) CALL XABORT(NAMSBR//': MISSING FLUX INFO.')
+ JPFLUX=LCMGID(IPFLUX,'FLUX')
+ DO IG=1,NG
+ CALL LCMGDL(JPFLUX,IG,SOLFLU)
+ KL=0
+ KKEYL=0
+ DO IL=1,NANIS
+ DO IM=1,IL ! 2*IL-1 in 3D
+ KL=KL+1
+ DO IR=1,NR
+ FLUXI(IR,KL,IG)=SOLFLU(KEY(IR+KKEYL))*VOL(IR)
+ ENDDO
+ KKEYL=KKEYL+NR
+ ENDDO
+ ENDDO
+ ENDDO
+ CALL LCMLEN(IPAFLUX,'AFLUX',ILON,ITYLCM)
+ IF(ILON.EQ.0) CALL XABORT(NAMSBR//': MISSING AFLUX INFO.')
+ JPAFLUX=LCMGID(IPAFLUX,'AFLUX')
+ DO IG=1,NG
+ CALL LCMGDL(JPAFLUX,IG,SOLFLU)
+ KL=0
+ KKEYL=0
+ DO IL=1,NANIS
+ DO IM=1,IL ! 2*IL-1 in 3D
+ KL=KL+1
+ DO IR=1,NR
+ AFLUX(IR,KL,IG)=SOLFLU(KEY(IR+KKEYL))
+ ENDDO
+ KKEYL=KKEYL+NR
+ ENDDO
+ ENDDO
+ ENDDO
+*--------
+* Step 4:
+* Computation of the P matrix used for sensitivity calculation
+*----
+ P(:NR,:NANIS,:NG,:NG)=0.0
+ DO IG=1,NG
+ DO JG=1,NG
+ KL=0
+ DO IL=1,NANIS
+ DO IM=1,IL ! 2*IL-1 en 3D
+ KL=KL+1
+ DO IR=1,NR
+ P(IR,IL,IG,JG)=P(IR,IL,IG,JG)+
+ > FLUXI(IR,KL,IG)*AFLUX(IR,KL,JG)
+ ENDDO
+ ENDDO
+ ENDDO
+ ENDDO
+ ENDDO
+*--------
+* Step 5:
+* Computation of the D factor
+*----
+ D=0
+ ALLOCATE(IPISO(NI))
+ CALL LIBIPS(IPLIB,NI,IPISO)
+ DO II=1,NI
+ KPISO=IPISO(II) ! set II-th isotope
+ IF(.NOT.C_ASSOCIATED(KPISO)) THEN
+ WRITE(ISONAM,'(3A4)') NAMISO(1,II),NAMISO(2,II),NAMISO(3,II)
+ WRITE(HSMG,'(17HSENDRV: ISOTOPE '',A12,7H'' (ISO=,I8,5H) IS ,
+ 1 30HNOT AVAILABLE IN THE MICROLIB.)') ISONAM,II
+ CALL XABORT(HSMG)
+ ENDIF
+ CALL LCMLEN(KPISO,'NUSIGF',ILENG,ITYLCM)
+ IF(ILENG.GT.0) THEN
+ NUSIGF(:NG)=0.0
+ CHI(:NG)=0.0
+ CALL LCMGET(KPISO,'NUSIGF',NUSIGF)
+ CALL LCMGET(KPISO,'CHI',CHI)
+ DO IR=1,NR
+ IF(MAT(IR).EQ.MELISO(II)) THEN
+ DO IG=1,NG
+ DO JG=1,NG
+ D=D+FLUXI(IR,1,IG)*DENISO(II)
+ > *NUSIGF(IG)*CHI(JG)*AFLUX(IR,1,JG)
+ ENDDO
+ ENDDO
+ ENDIF
+ ENDDO
+ ENDIF
+ ENDDO
+ DEALLOCATE(IPISO)
+*--------
+* Step 6:
+* Initialize the top of the .sdf file
+*----
+ WRITE(IPSENS,7000) NG,NSENS+NSENI,NSENI,KEFF
+ WRITE(IPSENS,7001)
+ WRITE(IPSENS,7002) (ENERG(IG),IG=1,NG+1)
+*--------
+* Step 7:
+* Sensitivity analysis for each isotope/mixture
+*----
+ CALL SENCAL(IPSENS,IPLIB,IPRINT,NR,NG,NI,NANIS,NAMISO,MELISO,
+ > MAT,DENISO,KEFF,P,D,NAMISC,ISOC,NIC)
+*--------
+* Step 9:
+* Finish the creation of the .sdf file
+*----
+ CALL KDRVER(REV,DATE)
+ WRITE(IPSENS,7010) REV,DATE
+*----
+* Scratch storage deallocation
+*----
+ DEALLOCATE(CHI,NUSIGF,P,AFLUX,FLUXI,SOLFLU,DENISO,ENERG,VOL)
+ DEALLOCATE(ISOC,NAMISC,NAMISO,MELISO,KEY,MAT)
+ RETURN
+*----
+* Formats
+*----
+ 6000 FORMAT('Total number of profils (reactions,isotopes,mixtures) :',
+ >5X,I10/'Total number of integrated profiles ',
+ >'(reactions,isotopes) :',3X,I10)
+ 7000 FORMAT(
+ >I10,3X,'number of neutron groups'/
+ >I10,3X,'number of sensitivity profiles ',
+ >I10,3X,'are region integrated'/
+ >F10.6,3X,'k-eff from the forward case')
+ 7001 FORMAT('energy boundaries:')
+ 7002 FORMAT(1P,5E14.6)
+ 7010 FORMAT(//1X,'file verification information'/
+ >1X,'code system: DRAGON'/
+ >1X,'Version: ',A48/
+ >1X,'program: SENS:'/
+ >3X,'creation date: ',A64/
+ >3X,'library: UNKWNOW'/
+ >3X,'this is not a scale configuration controlled code')
+ END