summaryrefslogtreecommitdiff
path: root/Dragon/src/MACUPD.f
diff options
context:
space:
mode:
Diffstat (limited to 'Dragon/src/MACUPD.f')
-rw-r--r--Dragon/src/MACUPD.f295
1 files changed, 295 insertions, 0 deletions
diff --git a/Dragon/src/MACUPD.f b/Dragon/src/MACUPD.f
new file mode 100644
index 0000000..8efd97c
--- /dev/null
+++ b/Dragon/src/MACUPD.f
@@ -0,0 +1,295 @@
+*DECK MACUPD
+ SUBROUTINE MACUPD(NENTRY,KENTRY,IPRINT,NTOTMX,NBMIX ,NGROUP,
+ > NANISO,NIFISS,NEDMAC,ITRANC)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Update Dragon macrolib with other Dragon macrolib.
+*
+*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): G. Marleau
+*
+*Parameters: input
+* NENTRY number of structures.
+* KENTRY pointer to structures.
+* IPRINT print level.
+* NTOTMX maximum number of mixtures in input macrolibs.
+* NBMIX number of mixtures on output macrolib.
+* NGROUP number of groups.
+* NANISO maximun scattering anisotropy.
+* NIFISS number fissile isotopes per mixture.
+* NEDMAC number of aditional edition x-s.
+* ITRANC type of transport correction.
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+ IMPLICIT NONE
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ TYPE(C_PTR) KENTRY(NENTRY)
+ INTEGER NENTRY,IPRINT,NTOTMX,NBMIX,NGROUP,NANISO,NIFISS,
+ > NEDMAC,ITRANC
+*----
+* LOCAL VARIABLES
+*----
+ INTEGER IOUT,NSTATE,MAXPAR
+ PARAMETER (IOUT=6,NSTATE=40,MAXPAR=10)
+*----
+* INPUT
+*----
+ CHARACTER CARLIR*12
+ INTEGER ITYPLU,INTLIR
+ REAL REALIR
+ DOUBLE PRECISION DBLLIR
+*----
+* LOCAL PARAMETERS
+*----
+ TYPE(C_PTR) IPMACR
+ INTEGER ISTATE(NSTATE),ITEXT4,IMIX,IEN,NUMNEW,NUMOLD,NBMIXF,
+ > NIFISF,NGROF,NEDF,NDELF,NBMIXO,NIFISO,NEDO,NDELO,
+ > ILCMLN,ILCMTY,ITC,NPART,I
+ CHARACTER TEXT4*4,HGROUP*12,HPART0*1,HPART(MAXPAR)*1
+*----
+* ALLOCATABLE ARRAYS
+*----
+ INTEGER, ALLOCATABLE, DIMENSION(:) :: NAMEN,NUMFN,NUMPX
+ INTEGER, ALLOCATABLE, DIMENSION(:,:) :: IMLOC
+ REAL, ALLOCATABLE, DIMENSION(:) :: ENERN
+*----
+* SCRATCH STORAGE ALLOCATION
+* IMLOC mixture location
+*----
+ ALLOCATE(IMLOC(2,NTOTMX))
+*----
+* INITIALIZE IMLOC FOR MIXTURE ALREADY PRESENT ON OUTPUT MACROLIB
+*----
+ TEXT4=' '
+ READ(TEXT4,'(A4)') ITEXT4
+ IMLOC(:2,:NTOTMX)=0
+ DO 100 IMIX=1,NBMIX
+ IMLOC(1,IMIX)=1
+ IMLOC(2,IMIX)=IMIX
+ 100 CONTINUE
+ IF(IPRINT.GE.5) WRITE(IOUT,6000)
+*----
+* READ INPUT DATA
+* TYPICAL FORMAT:
+* EDIT iprint
+* CTRA { ON | OFF }
+* MIX numnew numold [{ UPDL | OLDL }]
+* WHERE
+* iprint = PRINT LEVEL
+* numnew = NEW MIXTURE NUMBER
+* numold = OLD MIXTURE NUMBER
+* UPDL = TAKE numold FORM LIBRARY TO UPDATE
+* OLDL = TAKE numold FORM OLD LIBRARY
+*----
+ ITYPLU = 3
+ CARLIR = 'MIX'
+ 1000 CONTINUE
+ IF(ITYPLU.NE.3) CALL XABORT('MACUPD: CHARACTER KEYWORD EXPECTED.')
+*----
+* CHECK FOR STOP/RETURN
+*----
+ IF(CARLIR .EQ. ';') THEN
+ GO TO 1005
+ ELSE IF(CARLIR(1:3).EQ.'MIX') THEN
+*----
+* READ MIX CARD
+*----
+ CALL REDGET(ITYPLU,NUMNEW,REALIR,CARLIR,DBLLIR)
+ IF(ITYPLU.NE.1) CALL XABORT('MACUPD: NEW MIXTURE NUMBER IS NOT'
+ > //' AN INTEGER.')
+ CALL REDGET(ITYPLU,NUMOLD,REALIR,CARLIR,DBLLIR)
+ IF(ITYPLU.NE.1) CALL XABORT('MACUPD: OLD MIXTURE NUMBER IS NOT'
+ > //' AN INTEGER.')
+ CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR)
+ IF(ITYPLU.NE.3) CALL XABORT('MACUPD: STRUCTURE TYPE IS NOT CHA'
+ > //'RACTER.')
+*---
+* TEST IF NUMNEW IS VALID
+*----
+ IF(NUMNEW.GT.NTOTMX) CALL XABORT('MACUPD: NEW MATERIAL NUMBER '
+ > //'IS TOO LARGE.')
+*----
+* BY DEFAULT CARLIR IS ASSUMED TO BE OLDL
+* IF CARLIR IS UPDL STORE INFORMATION IN IMLOC
+* KEYWORD OLDL NOT PROCESSED IF PRESENT
+* PROCESS KEYWORD OLDL ACCORDING TO USER'S GUIDE IN THE
+* CASE WHERE IT IS PRESENT
+*----
+ IF(CARLIR(1:4).EQ.'UPDL') THEN
+ IMLOC(1,NUMNEW)=1
+ IMLOC(2,NUMNEW)=NUMOLD
+ ELSE IF(CARLIR(1:4).EQ.'OLDL') THEN
+ IMLOC(1,NUMNEW)=2
+ IMLOC(2,NUMNEW)=NUMOLD
+ ELSE
+ IMLOC(1,NUMNEW)=2
+ IMLOC(2,NUMNEW)=NUMOLD
+ GO TO 1000
+ ENDIF
+ ELSE
+ CALL XABORT('MACUPD: KEYWORD '//CARLIR//' NOT PERMITTED.')
+ ENDIF
+ CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR)
+ GO TO 1000
+ 1005 CONTINUE
+*----
+* RECOVER CRITICITY PARAMETERS
+*----
+ CALL LCMLEN(KENTRY(2),'K-EFFECTIVE',ILCMLN,ILCMTY)
+ IF(ILCMLN.EQ.1) THEN
+ CALL LCMGET(KENTRY(2),'K-EFFECTIVE',REALIR)
+ CALL LCMPUT(KENTRY(1),'K-EFFECTIVE',1,2,REALIR)
+ ENDIF
+ CALL LCMLEN(KENTRY(2),'K-INFINITY',ILCMLN,ILCMTY)
+ IF(ILCMLN.EQ.1) THEN
+ CALL LCMGET(KENTRY(2),'K-INFINITY',REALIR)
+ CALL LCMPUT(KENTRY(1),'K-INFINITY',1,2,REALIR)
+ ENDIF
+ CALL LCMLEN(KENTRY(2),'B2 B1HOM',ILCMLN,ILCMTY)
+ IF(ILCMLN.EQ.1) THEN
+ CALL LCMGET(KENTRY(2),'B2 B1HOM',REALIR)
+ CALL LCMPUT(KENTRY(1),'B2 B1HOM',1,2,REALIR)
+ ENDIF
+*----
+* FIND TOTAL NUMBER OF MIXTURES CREATED
+*----
+ DO 120 IMIX=NTOTMX,1,-1
+ IF(IMLOC(2,IMIX).NE.0) THEN
+ NBMIXF=IMIX
+ GO TO 125
+ ENDIF
+ 120 CONTINUE
+ CALL XABORT('MACUPD: NO MIXTURES FOUND.')
+ 125 CONTINUE
+*----
+* TEST FOR ENERGY
+* FIND ADDITIONAL XS NAME
+* FIND TOTAL NUMBER OF FISSILE ISOTOPES AND THEIR NAME
+*----
+ ALLOCATE(NAMEN(2*NEDMAC),NUMFN(NBMIXF*NIFISS),
+ > NUMPX(NBMIXF*NIFISS),ENERN(2*NGROUP+1))
+ NAMEN(:2*NEDMAC)=ITEXT4
+*----
+* INITIALIZE VECTOR
+*----
+ NUMFN(:NBMIXF*NIFISS)=0
+ NUMPX(:NBMIXF*NIFISS)=0
+ NIFISF=0
+ NGROF =0
+ NEDF =0
+ NDELF =0
+ DO 130 IEN=1,NENTRY
+ IPMACR=KENTRY(IEN)
+ DO 131 IMIX=1,NTOTMX
+ IF(IMLOC(1,IMIX).EQ.IEN) THEN
+ ISTATE(:NSTATE)=0
+ CALL LCMGET(IPMACR,'STATE-VECTOR',ISTATE)
+ NBMIXO=ISTATE(2)
+ NIFISO=ISTATE(4)
+ NEDO=ISTATE(5)
+ NDELO=ISTATE(7)
+ CALL MACNFI(IPMACR,IPRINT,IEN ,NTOTMX,NGROUP,NIFISS,
+ > NEDMAC,NBMIXF,NGROF ,NIFISF,NEDF ,NDELF ,
+ > NBMIXO,NIFISO,NEDO ,NDELO ,IMLOC ,ENERN ,
+ > NAMEN ,NUMFN ,NUMPX )
+ GO TO 135
+ ENDIF
+ 131 CONTINUE
+ 135 CONTINUE
+ 130 CONTINUE
+*----
+* SAVE ENERGY, ADDITIONAL XS NAME AND FISSILE ISOTOPES INFORMATION
+* ON FINAL MACROLIB
+*----
+ IPMACR=KENTRY(1)
+ IF(NGROF.GT.0) THEN
+ CALL LCMPUT(IPMACR,'ENERGY',NGROF+1,2,ENERN)
+ CALL LCMPUT(IPMACR,'DELTAU',NGROF,2,ENERN(NGROF+2))
+ IF(IPRINT.GE.5) THEN
+ WRITE(IOUT,6010) 'ENERGY '
+ WRITE(IOUT,6013) (ENERN(ITC),ITC=1,NGROF+1)
+ WRITE(IOUT,6010) 'DELTAU '
+ WRITE(IOUT,6013) (ENERN(ITC),ITC=NGROF+2,2*NGROF+1)
+ ENDIF
+ ENDIF
+ IF(NEDF.GT.0) THEN
+ CALL LCMPUT(IPMACR,'ADDXSNAME-P0',2*NEDF,3,NAMEN)
+ IF(IPRINT.GE.5) THEN
+ WRITE(IOUT,6010) 'ADDXSNAME-P0'
+ WRITE(IOUT,6011) (NAMEN(ITC),ITC=1,2*NEDO)
+ ENDIF
+ ENDIF
+ IF(NIFISF.GT.0) THEN
+ IF(IPRINT.GE.5) THEN
+ WRITE(IOUT,6010) 'FISSIONINDEX'
+ WRITE(IOUT,6012) (NUMFN(ITC),ITC=1,NBMIXF*NIFISF)
+ ENDIF
+ ENDIF
+ DEALLOCATE(ENERN)
+*----
+* CROSS SECTION PROCESSING IN GROUP LIST DIRECTORY WITH UPDATE.
+*----
+ HGROUP='GROUP'
+ CALL MACUPG(KENTRY,HGROUP,NENTRY,NIFISF,NDELF,NEDF,NGROUP,NBMIXF,
+ > NIFISS,NANISO,NEDMAC,NTOTMX,ITRANC,IPRINT,NAMEN,NUMPX,IMLOC)
+*----
+* RESET NUMFFN TO ONE FOR TERMS WHICH ARE NOT 0 AND SAVE
+*----
+ IF(NIFISF.GT.0) THEN
+ CALL LCMPUT(IPMACR,'FISSIONINDEX',NBMIXF*NIFISF,1,NUMFN)
+ ENDIF
+*----
+* CCROSS SECTION PROCESSING IN COMPANION GROUP LIST DIRECTORY WITH
+* UPDATE.
+*----
+ NPART=0
+ DO 140 IEN=1,NENTRY
+ IPMACR=KENTRY(IEN)
+ CALL LCMLEN(IPMACR,'STATE-VECTOR',ILCMLN,ILCMTY)
+ IF(ILCMLN.EQ.0) GO TO 140
+ CALL LCMGET(IPMACR,'STATE-VECTOR',ISTATE)
+ IF(ISTATE(17).GT.0) THEN
+ NPART=ISTATE(17)+1
+ IF(NPART.GT.MAXPAR) CALL XABORT('MAXUPD: MAXPAR OVERFLOW.')
+ CALL LCMGTC(IPMACR,'PARTICLE',1,HPART0)
+ CALL LCMGTC(IPMACR,'PARTICLE-NAM',1,NPART,HPART)
+ GO TO 150
+ ENDIF
+ 140 CONTINUE
+ 150 DO I=1,NPART
+ IF(HPART(I).EQ.HPART0) CYCLE
+ HGROUP='GROUP-'//HPART(I)
+ CALL MACUPG(KENTRY,HGROUP,NENTRY,NIFISF,NDELF,NEDF,NGROUP,
+ > NBMIXF,NIFISS,NANISO,NEDMAC,NTOTMX,ITRANC,IPRINT,NAMEN,NUMPX,
+ > IMLOC)
+ ENDDO
+ DEALLOCATE(NUMPX,NUMFN,NAMEN)
+ NBMIX=NBMIXF
+ NIFISS=NIFISF
+ NEDMAC=NEDF
+*----
+* SCRATCH STORAGE DEALLOCATION
+*----
+ DEALLOCATE(IMLOC)
+ RETURN
+*----
+* EDIT FORMATS
+*----
+ 6000 FORMAT(1X,'MACUPD - UPDATING MACROLIB ')
+ 6010 FORMAT(7X, ' PRECESSING RECORD : ',A12)
+ 6011 FORMAT(10(2A4,4X))
+ 6012 FORMAT(10(I8,4X))
+ 6013 FORMAT(1P,8E15.7)
+ END