summaryrefslogtreecommitdiff
path: root/Dragon/src/LIBDEN.f
diff options
context:
space:
mode:
Diffstat (limited to 'Dragon/src/LIBDEN.f')
-rw-r--r--Dragon/src/LIBDEN.f1150
1 files changed, 1150 insertions, 0 deletions
diff --git a/Dragon/src/LIBDEN.f b/Dragon/src/LIBDEN.f
new file mode 100644
index 0000000..da4eeb2
--- /dev/null
+++ b/Dragon/src/LIBDEN.f
@@ -0,0 +1,1150 @@
+*DECK LIBDEN
+ SUBROUTINE LIBDEN (IPLIB,NGROUP,NBISO,NBMIX,NL,NDEL,NESP,ISONAM,
+ 1 IPISO,MIX,DEN,MASK,MASKL,NED,NAMEAD,ITRANC,MAXNFI,NPART,LSAME,
+ 2 ITSTMP,TMPDAY,STERN)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Transformation of the isotope ordered microscopic cross sections to
+* group ordered macroscopic cross sections (part 2).
+*
+*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 and A. Naceur
+*
+*Parameters: input
+* IPLIB pointer to the lattice microscopic cross section library
+* (L_LIBRARY signature).
+* NGROUP number of energy groups.
+* NBISO number of isotopes present in the calculation domain.
+* NBMIX number of mixtures present in the calculation domain.
+* NL number of Legendre orders required in the calculation
+* (NL=1 or higher).
+* NDEL number of delayed precursor groups.
+* NESP number of energy-dependent fission spectra.
+* ISONAM names of microlib isotopes.
+* IPISO pointer array towards microlib isotopes.
+* MIX mixture number of each isotope (can be zero).
+* DEN density of each isotope.
+* MASK mixture mask (=.true. if a mixture is to be made).
+* MASKL group mask (=.true. if an energy group is to be treated).
+* NED number of extra edit vectors.
+* NAMEAD names of these extra edits.
+* ITRANC type of transport corrections in the microlib
+* (=0: no transport correction).
+* MAXNFI maximum number of fissionable isotopes in a mixture.
+* NPART number of companion particles.
+* LSAME fission spectrum flag (=.true. if all the isotopes have the
+* same fission spectrum and the same precursor group decay
+* constants).
+* ITSTMP type of cross section perturbation (=0: perturbation
+* forbidden; =1: perturbation not used even if present;
+* =2: perturbation used if present).
+* TMPDAY time stamp in day/burnup/irradiation.
+* STERN Sternheimer flag (=0/1: off/on).
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+ IMPLICIT NONE
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ TYPE(C_PTR) IPLIB,IPISO(NBISO)
+ INTEGER NGROUP,NBISO,NBMIX,NL,NDEL,NESP,ISONAM(3,NBISO),
+ 1 MIX(NBISO),NED,ITRANC,MAXNFI,NPART,NAMEAD(2,NED),ITSTMP,STERN
+ REAL DEN(NBISO),TMPDAY(3)
+ LOGICAL MASK(NBMIX),MASKL(NGROUP),LSAME
+*----
+* LOCAL VARIABLES
+*----
+ INTEGER NBLK,NSTATE,IOUT,MAXESP
+ PARAMETER (NBLK=50,NSTATE=40,IOUT=6,MAXESP=4)
+ CHARACTER CM*4,CV*12,HSMG*131,TEXT12*12,HCM(0:10)*2,NORD(3)*4,
+ 1 TEXT2*2,HPRT1*1
+ LOGICAL EXIST,MASKK,LOGL,LALL,LWP1,LSTRD,LH,LC,LOVERV,LDIFF,
+ 1 LFISS,LWT0,LWT1
+ INTEGER IDATA(NSTATE),IESP(MAXESP+1),I,J,I0,IOF,IOF0,IP,IPOSDE,
+ 1 IPASS,ISP,IGR,IG1,LLL,LLL0,IGMIN,IGMAX,IBM,JBM,IDEL,IED,IFIS,
+ 2 NXSPER,ISOT,IBLK,ILONG,LENGTZ,ITYLCM,IWFIS,IXSPER,KFIS,M,NBM0,
+ 3 NFISS0,NFISSI,NGROUPS
+ REAL TMPPER(2,3),TIMFCT,DENISO,ENEAVG,FACT,TOTDEN,XTF
+ DOUBLE PRECISION SQFMAS,XDRCST,NMASS,EVJ,ZNU
+ TYPE(C_PTR) JPLIB,KPLIB
+*----
+* ALLOCATABLE ARRAYS
+*----
+ INTEGER, ALLOCATABLE, DIMENSION(:) :: IPOS,IJJ,NJJ,IWRK,NGPART
+ INTEGER, ALLOCATABLE, DIMENSION(:,:) :: NJJM,IJJM,INDFIS
+ REAL, ALLOCATABLE, DIMENSION(:) :: GA1,GA2,SCAT,VOLMIX,NWTMIX,
+ 1 VOLI,C2PART,KGAS,ENER
+ REAL, ALLOCATABLE, DIMENSION(:,:) :: GA3,GAR,WRK1,WRK2,DENMAT
+ REAL, ALLOCATABLE, DIMENSION(:,:,:) :: GAF,CHECK,ZNUS,ZCHI,FLUX
+ TYPE(C_PTR), ALLOCATABLE, DIMENSION(:,:) :: IPGRP
+ LOGICAL, ALLOCATABLE, DIMENSION(:) :: LMADE
+ CHARACTER(LEN=1), ALLOCATABLE, DIMENSION(:) :: HNPART
+ CHARACTER(LEN=12), ALLOCATABLE, DIMENSION(:) :: ISONRF
+*----
+* DATA STATEMENTS
+*----
+ DATA HCM/'00','01','02','03','04','05','06','07','08','09','10'/
+ DATA NORD/' ',' LIN',' QUA'/
+*----
+* SCRATCH STORAGE ALLOCATION
+* IPGRP LCM pointers of the macrolib groupwise directories.
+*----
+ ALLOCATE(NJJM(NBMIX,NBLK),IJJM(NBMIX,NBLK),IPOS(NBMIX),
+ 1 INDFIS(NBMIX,MAXNFI),IJJ(NGROUP),NJJ(NGROUP))
+ ALLOCATE(GA2(NGROUP*NGROUP),GA3(NDEL,MAXNFI),GAR(NBMIX,NBLK+1),
+ 1 GAF(NBMIX,NGROUP,NBLK),SCAT(NGROUP*NBMIX),CHECK(NBMIX,NGROUP,NL),
+ 2 ZNUS(NBMIX*MAXNFI*NESP,NGROUP,0:NDEL),
+ 3 ZCHI(NBMIX*MAXNFI*NESP,NGROUP,0:NDEL))
+ ALLOCATE(IPGRP(NGROUP,NPART+1))
+ ALLOCATE(LMADE(NBISO))
+ ALLOCATE(NGPART(NPART+1),C2PART(NPART+1),HNPART(NPART+1))
+ ALLOCATE(DENMAT(NBMIX,NGROUP+1))
+*----
+* FOR AVERAGED NEUTRON VELOCITY
+* V=SQRT(2*ENER/M)=SQRT(2/M)*SQRT(ENER)
+* SQFMAS=SQRT(2/M) IN CM/S/SQRT(EV) FOR V IN CM/S AND E IN EV
+* =SQRT(2*1.602189E-19(J/EV)* 1.0E4(CM2/M2) /1.67495E-27 (KG))
+* =1383155.30602 CM/S/SQRT(EV)
+*----
+ EVJ=XDRCST('eV','J')
+ NMASS=XDRCST('Neutron mass','kg')
+ SQFMAS=SQRT(2.0D4*EVJ/NMASS)
+*----
+* SET MULTIPLE FISSION SPECTRA INFORMATION.
+*----
+ IF(NESP.GT.1) THEN
+ IF(NESP.GT.MAXESP) CALL XABORT('LIBDEN: MAXESP OVERFLOW.')
+ CALL LCMGET(IPLIB,'CHI-LIMITS',IESP)
+ ENDIF
+*----
+* SET CROSS SECTION PERTURBATION INFORMATION.
+*----
+ NXSPER=1
+ TIMFCT=0.0
+ CALL LCMLEN(IPLIB,'TIMESPER',ILONG,ITYLCM)
+ IF((ILONG.GE.2).AND.(ILONG.LE.6)) THEN
+ IF(ITSTMP.EQ.0) THEN
+ CALL XABORT('LIBDEN: XS PERTURBATION FORBIDDEN.')
+ ELSE IF(ITSTMP.EQ.2) THEN
+ CALL LCMGET(IPLIB,'TIMESPER',TMPPER)
+ TIMFCT=TMPDAY(1)-TMPPER(1,1)
+ XTF=TIMFCT/TMPPER(2,1)
+ IF(XTF.NE.0.0) NXSPER=2
+ IF(XTF.LT.0.0) THEN
+ WRITE(IOUT,6000) TMPPER(1,1),TMPDAY(1)
+ ELSE IF(XTF.GT.1.0) THEN
+ WRITE(IOUT,6001) TMPPER(1,1)+TMPPER(2,1),TMPDAY(1)
+ ENDIF
+ ENDIF
+ ENDIF
+*----
+* RECOVER MIXTURE VOLUMES IN MICROLIB.
+*----
+ CALL LCMLEN(IPLIB,'ISOTOPESVOL',ILONG,ITYLCM)
+ IF(ILONG.GT.0) THEN
+ ALLOCATE(VOLMIX(NBMIX),VOLI(NBISO))
+ CALL LCMGET(IPLIB,'ISOTOPESVOL',VOLI)
+ VOLMIX(:NBMIX)=0.0
+ DO ISOT=1,NBISO
+ IBM=MIX(ISOT)
+ IF(IBM.GT.0) VOLMIX(IBM)=VOLI(ISOT)
+ ENDDO
+ CALL LCMPUT(IPLIB,'MIXTURESVOL',NBMIX,2,VOLMIX)
+ DEALLOCATE(VOLI,VOLMIX)
+ ENDIF
+*----
+* MASKK=.TRUE. IF MIXTURE MASKING IS TO BE USED (IT IS NOT USED IF
+* ALL MIXTURES ARE TO BE UPDATED).
+*----
+ LDIFF=.TRUE.
+ CALL LCMLEN(IPLIB,'MACROLIB',ILONG,ITYLCM)
+ MASKK=(ILONG.EQ.-1)
+ IF(MASKK) THEN
+ CALL LCMSIX(IPLIB,'MACROLIB',1)
+ CALL LCMGTC(IPLIB,'SIGNATURE',12,TEXT12)
+ IF(TEXT12.NE.'L_MACROLIB') THEN
+ CALL XABORT('LIBDEN: INVALID SIGNATURE ON THE MACROLIB.')
+ ENDIF
+ CALL LCMGET(IPLIB,'STATE-VECTOR',IDATA)
+ NBM0=IDATA(2)
+ NFISSI=IDATA(4)/NESP
+ LDIFF=(IDATA(9).EQ.1)
+ IF(IDATA(1).NE.NGROUP) THEN
+ WRITE(HSMG,'(37HLIBDEN: EXISTING MACROLIB HAS NGROUP=,I4,
+ 1 25H NEW MACROLIB HAS NGROUP=,I4,1H.)') IDATA(1),NGROUP
+ CALL XABORT(HSMG)
+ ELSE IF((IDATA(6).NE.2).AND.(ITRANC.GT.0)) THEN
+ WRITE(HSMG,'(37HLIBDEN: EXISTING MACROLIB HAS ITRANC=,I4,
+ 1 25H NEW MACROLIB HAS ITRANC=,I4,1H.)') IDATA(6),ITRANC
+ CALL XABORT(HSMG)
+ ELSE IF(NBM0.GT.NBMIX) THEN
+ WRITE(HSMG,'(36HLIBDEN: EXISTING MACROLIB HAS NBMIX=,I4,
+ 1 24H NEW MACROLIB HAS NBMIX=,I4,1H.)') NBM0,NBMIX
+ CALL XABORT(HSMG)
+ ELSE IF(NFISSI.GT.NBISO) THEN
+ WRITE(HSMG,'(37HLIBDEN: EXISTING MACROLIB HAS NFISSI=,I4,
+ 1 13H GREATER THAN,I5,1H.)') IDATA(4),NBISO
+ CALL XABORT(HSMG)
+ ENDIF
+ IF(NFISSI.GT.0) THEN
+ CALL LCMLEN(IPLIB,'FISSIONINDEX',ILONG,ITYLCM)
+ IF(ILONG.EQ.0) THEN
+* THE NAMES ARE NOT DEFINED.
+ DO 11 IFIS=1,NFISSI
+ DO 10 IBM=1,NBMIX
+ INDFIS(IBM,IFIS)=0
+ 10 CONTINUE
+ 11 CONTINUE
+ ELSE IF(ILONG.EQ.NFISSI*NBMIX) THEN
+ CALL LCMGET(IPLIB,'FISSIONINDEX',INDFIS)
+ DO 16 IFIS=1,NFISSI
+ DO 15 IBM=1,NBMIX
+ IF(INDFIS(IBM,IFIS).GT.NBISO) THEN
+ CALL XABORT('LIBDEN: INVALID RECORD FISSIONINDEX.')
+ ENDIF
+ 15 CONTINUE
+ 16 CONTINUE
+ ELSE IF(ILONG.LT.NFISSI*NBMIX) THEN
+* REORDER THE 'FISSIONINDEX' MATRIX.
+ ALLOCATE(IWRK(ILONG))
+ CALL LCMGET(IPLIB,'FISSIONINDEX',IWRK)
+ DO 31 IFIS=1,NFISSI
+ DO 20 IBM=1,NBM0
+ INDFIS(IBM,IFIS)=IWRK((IFIS-1)*NBM0+IBM)
+ 20 CONTINUE
+ DO 30 IBM=NBM0+1,NBMIX
+ INDFIS(IBM,IFIS)=0
+ 30 CONTINUE
+ 31 CONTINUE
+ DEALLOCATE(IWRK)
+ ELSE
+ CALL XABORT('LIBDEN: INVALID NUMBER OF MIXTURES.')
+ ENDIF
+ ENDIF
+ CALL LCMSIX(IPLIB,' ',2)
+ LALL=NBMIX.GT.NBM0
+ ELSE
+ NFISSI=0
+ LALL=.FALSE.
+ ENDIF
+*----
+* RECOVER PARTICLE DATA
+*----
+ CALL LCMLEN(IPLIB,'PARTICLE',ILONG,ITYLCM)
+ IF(ILONG.EQ.0) THEN
+ HPRT1=' '
+ HNPART(1)=' '
+ ELSE
+ CALL LCMGTC(IPLIB,'PARTICLE',1,HPRT1)
+ CALL LCMGTC(IPLIB,'PARTICLE-NAM',1,NPART+1,HNPART)
+ CALL LCMGET(IPLIB,'PARTICLE-NGR',NGPART)
+ CALL LCMGET(IPLIB,'PARTICLE-MC2',C2PART)
+ CALL LCMSIX(IPLIB,'MACROLIB',1)
+ CALL LCMPTC(IPLIB,'PARTICLE',1,HPRT1)
+ CALL LCMPTC(IPLIB,'PARTICLE-NAM',1,NPART+1,HNPART)
+ CALL LCMPUT(IPLIB,'PARTICLE-NGR',NPART+1,1,NGPART)
+ CALL LCMPUT(IPLIB,'PARTICLE-MC2',NPART+1,2,C2PART)
+ CALL LCMSIX(IPLIB,' ',2)
+ IF(HPRT1.NE.HNPART(1)) THEN
+ WRITE(HSMG,'(27HLIBDEN: MICROLIB PARTICLE (,A1,10H) IS DIFFE,
+ 1 26HRENT FROM PARTICLE-NAM(1)=,A1,1H.)') HPRT1,HNPART(1)
+ CALL XABORT(HSMG)
+ ENDIF
+ DO IP=2,NPART+1
+ ALLOCATE(GA1(NGPART(IP)+1))
+ CALL LCMGET(IPLIB,HNPART(IP)//'ENERGY',GA1)
+ CALL LCMSIX(IPLIB,'MACROLIB',1)
+ CALL LCMPUT(IPLIB,HNPART(IP)//'ENERGY',NGPART(IP)+1,2,GA1)
+ CALL LCMSIX(IPLIB,' ',2)
+ DEALLOCATE(GA1)
+ ENDDO
+ ENDIF
+*----
+* SELECT NUMBER OF GROUPS TO PROCESS
+*----
+ NGROUPS=0
+ DO 35 LLL=1,NGROUP
+ IF(MASKL(LLL).OR.LALL) NGROUPS=NGROUPS+1
+ 35 CONTINUE
+ IF(NGROUPS.EQ.0) GO TO 880
+*----
+* CHECK IF ALL REQUIRED ISOTOPES ARE PRESENT IN THE MICROLIB
+*----
+ ALLOCATE(GA1(NGROUP+1))
+ DO 40 ISOT=1,NBISO
+ IF(MIX(ISOT).EQ.0) GO TO 40
+ IF(.NOT.MASK(MIX(ISOT))) GO TO 40
+ JPLIB=IPISO(ISOT)
+ IF(.NOT.C_ASSOCIATED(JPLIB)) THEN
+ WRITE(HSMG,'(17HLIBDEN: ISOTOPE '',3A4,8H'' (SPEC=,I6,5H) IS ,
+ > 30HNOT AVAILABLE IN THE MICROLIB.)') (ISONAM(I0,ISOT),I0=1,3),
+ > ISOT
+ CALL XABORT(HSMG)
+ ENDIF
+ 40 CONTINUE
+*----
+* SET THE LCM MACROLIB GROUPWISE AND MICROLIB ISOTOPEWISE DIRECTORIES
+*----
+ CALL LCMSIX(IPLIB,'MACROLIB',1)
+ JPLIB=LCMLID(IPLIB,'GROUP',NGROUP)
+ DO 45 LLL=1,NGROUP
+ IPGRP(LLL,1)=LCMDIL(JPLIB,LLL)
+ 45 CONTINUE
+ DO 47 IP=2,NPART+1
+ JPLIB=LCMLID(IPLIB,'GROUP-'//HNPART(IP),NGROUP)
+ DO 46 LLL=1,NGROUP
+ IPGRP(LLL,IP)=LCMDIL(JPLIB,LLL)
+ 46 CONTINUE
+ 47 CONTINUE
+ CALL LCMSIX(IPLIB,' ',2)
+*----
+* PROCESS THE SCATTERING TABLES.
+*----
+ DO 52 I=1,NGROUP
+ DO 51 IBM=1,NBMIX
+ DO 50 J=1,NL
+ CHECK(IBM,I,J)=0.0
+ 50 CONTINUE
+ 51 CONTINUE
+ 52 CONTINUE
+ DO 245 IP=1,NPART+1
+ DO 240 M=1,NL
+ IF(M.LE.11) THEN
+ CM=HCM(M-1)//' '
+ ELSE
+ WRITE(CM,'(I2.2,2X)') M-1
+ ENDIF
+ DO 235 IPASS=0,(NGROUP-1)/NBLK
+ LLL0=IPASS*NBLK
+ DO 70 IBLK=1,NBLK
+ DO 60 IBM=1,NBMIX
+ GAR(IBM,IBLK)=0.0
+ 60 CONTINUE
+ DO 71 LLL=1,NGROUP
+ DO 72 IBM=1,NBMIX
+ GAF(IBM,LLL,IBLK)=0.0
+ 72 CONTINUE
+ 71 CONTINUE
+ 70 CONTINUE
+ DO 80 ISOT=1,NBISO
+ LMADE(ISOT)=DEN(ISOT).EQ.0.0
+ 80 CONTINUE
+ DO 140 ISOT=1,NBISO
+ IF(LMADE(ISOT)) GO TO 140
+ JPLIB=IPISO(ISOT)
+ IF(.NOT.C_ASSOCIATED(JPLIB)) GO TO 140
+*
+* RECOVER THE MICROSCOPIC TRANSFER XS WITHOUT USING XDRLGS (IN
+* ORDER TO REDUCE CPU TIME)
+ IF(IP.GE.2) CALL LCMSIX(JPLIB,HNPART(IP),1)
+ FACT=1.0
+ DO 135 IXSPER=1,NXSPER
+ CALL LCMLEN(JPLIB,'SIGS'//CM//NORD(IXSPER),ILONG,ITYLCM)
+ IF(ILONG.EQ.0) GO TO 130
+ CALL LCMGET(JPLIB,'SIGS'//CM//NORD(IXSPER),GA1)
+ CALL LCMGET(JPLIB,'NJJS'//CM//NORD(IXSPER),NJJ)
+ CALL LCMGET(JPLIB,'IJJS'//CM//NORD(IXSPER),IJJ)
+ CALL LCMGET(JPLIB,'SCAT'//CM//NORD(IXSPER),GA2)
+ IOF0=0
+ DO 90 LLL=1,LLL0
+ IOF0=IOF0+NJJ(LLL)
+ 90 CONTINUE
+ DO 110 IBM=1,NBMIX
+ IF((MASK(IBM).OR.(.NOT.MASKK)).AND.(MIX(ISOT).EQ.IBM)) THEN
+ IOF=IOF0
+ DO 105 IBLK=1,NBLK
+ LLL=LLL0+IBLK
+ IF(LLL.GT.NGROUP) GO TO 110
+ GAR(IBM,IBLK)=GAR(IBM,IBLK)+GA1(LLL)*DEN(ISOT)
+ DO 100 IG1=IJJ(LLL),IJJ(LLL)-NJJ(LLL)+1,-1
+ IOF=IOF+1
+ GAF(IBM,IG1,IBLK)=GAF(IBM,IG1,IBLK)+GA2(IOF)*DEN(ISOT)*FACT
+ 100 CONTINUE
+ 105 CONTINUE
+ ENDIF
+ 110 CONTINUE
+ LMADE(ISOT)=.TRUE.
+ 130 FACT=FACT*TIMFCT
+ 135 CONTINUE
+ IF(IP.GE.2) CALL LCMSIX(JPLIB,' ',2)
+*-
+ 140 CONTINUE
+ DO 230 IBLK=1,NBLK
+ LLL=LLL0+IBLK
+ IF(LLL.GT.NGROUP) GO TO 230
+ KPLIB=IPGRP(LLL,IP)
+ IF(MASKL(LLL).OR.LALL) THEN
+ IF(MASKK) THEN
+ ILONG=1
+ IF(M.GT.1) CALL LCMLEN(KPLIB,'SIGS'//CM,ILONG,ITYLCM)
+ GAR(:NBMIX,NBLK+1)=0.0
+ IF(ILONG.GT.0) THEN
+ CALL LCMGET(KPLIB,'SIGS'//CM,GAR(1,NBLK+1))
+ ENDIF
+ DO 150 IBM=1,NBMIX
+ IF(.NOT.MASK(IBM)) GAR(IBM,IBLK)=GAR(IBM,NBLK+1)
+ 150 CONTINUE
+ ENDIF
+ CALL LCMPUT(KPLIB,'SIGS'//CM,NBMIX,2,GAR(1,IBLK))
+ ENDIF
+*
+ LOGL=MASKL(LLL).OR.LALL
+ DO 165 IBM=1,NBMIX
+ DO 160 IG1=1,NGROUP
+ LOGL=LOGL.OR.(MASKL(IG1).AND.(GAF(IBM,IG1,IBLK).NE.0.0))
+ 160 CONTINUE
+ 165 CONTINUE
+ IF(LOGL) THEN
+ IF(MASKK) THEN
+ ILONG=1
+ IF(M.GT.1) CALL LCMLEN(KPLIB,'SCAT'//CM,ILONG,ITYLCM)
+ IF(ILONG.GT.0) THEN
+ DO 170 I=1,NBMIX
+ IPOS(I)=-99
+ 170 CONTINUE
+ CALL LCMGET(KPLIB,'SCAT'//CM,SCAT)
+ CALL LCMGET(KPLIB,'NJJS'//CM,NJJM(1,IBLK))
+ CALL LCMGET(KPLIB,'IJJS'//CM,IJJM(1,IBLK))
+ CALL LCMGET(KPLIB,'IPOS'//CM,IPOS)
+ DO 190 IBM=1,NBMIX
+ IF(.NOT.MASK(IBM)) THEN
+ IPOSDE=IPOS(IBM)
+ IF(IPOSDE.EQ.-99) GO TO 190
+ DO 180 IG1=IJJM(IBM,IBLK),IJJM(IBM,IBLK)-NJJM(IBM,IBLK)
+ 1 +1,-1
+ GAF(IBM,IG1,IBLK)=SCAT(IPOSDE)
+ IPOSDE=IPOSDE+1
+ 180 CONTINUE
+ ENDIF
+ 190 CONTINUE
+ ENDIF
+ ENDIF
+*
+ IPOSDE=0
+ DO 220 IBM=1,NBMIX
+ IPOS(IBM)=IPOSDE+1
+ IGMIN=LLL
+ IGMAX=LLL
+ DO 200 IG1=NGROUP,1,-1
+ IF(GAF(IBM,IG1,IBLK).NE.0.0) THEN
+ IGMIN=MIN(IGMIN,IG1)
+ IGMAX=MAX(IGMAX,IG1)
+ ENDIF
+ 200 CONTINUE
+ IJJM(IBM,IBLK)=IGMAX
+ NJJM(IBM,IBLK)=IGMAX-IGMIN+1
+ DO 210 IG1=IGMAX,IGMIN,-1
+ IPOSDE=IPOSDE+1
+ SCAT(IPOSDE)=GAF(IBM,IG1,IBLK)
+ CHECK(IBM,IG1,M)=CHECK(IBM,IG1,M)+SCAT(IPOSDE)
+ 210 CONTINUE
+ GAR(IBM,1)=SCAT(IPOS(IBM)+IJJM(IBM,IBLK)-LLL)
+ 220 CONTINUE
+ CALL LCMPUT(KPLIB,'SCAT'//CM,IPOSDE,2,SCAT)
+ CALL LCMPUT(KPLIB,'NJJS'//CM,NBMIX,1,NJJM(1,IBLK))
+ CALL LCMPUT(KPLIB,'IJJS'//CM,NBMIX,1,IJJM(1,IBLK))
+ CALL LCMPUT(KPLIB,'IPOS'//CM,NBMIX,1,IPOS)
+ CALL LCMPUT(KPLIB,'SIGW'//CM,NBMIX,2,GAR(1,1))
+ ENDIF
+ 230 CONTINUE
+ 235 CONTINUE
+ 240 CONTINUE
+ 245 CONTINUE
+*----
+* STERNHEIMER DENSITY CORRECTION FOR CHARGED PARTICLE CASES
+*----
+ IF(HPRT1.EQ.'B'.OR.HPRT1.EQ.'C') THEN
+ ALLOCATE(ISONRF(NBISO),ENER(NGROUP+1),KGAS(NBMIX))
+ CALL LCMGTC(IPLIB,'ISOTOPERNAME',12,NBISO,ISONRF)
+ CALL LCMGET(IPLIB,'ENERGY',ENER)
+ CALL LCMGET(IPLIB,'MIXTUREGAS',KGAS)
+ CALL LIBSDC(NBMIX,NGROUP,NBISO,ISONRF,MIX,DEN,MASK,ENER,KGAS,
+ 1 DENMAT)
+ DEALLOCATE(KGAS,ENER,ISONRF)
+ ENDIF
+*----
+* PROCESS THE REACTION VECTORS TOTAL, TOTAL-P1, STRD, H-FACTOR,
+* C-FACTOR, OVERV AND TRANC.
+*----
+ LWP1=.FALSE.
+ LSTRD=.FALSE.
+ LH=.FALSE.
+ LC=.FALSE.
+ LOVERV=.FALSE.
+ DO 340 IBM=1,NBMIX
+ IF(MASK(IBM).OR.(.NOT.MASKK)) THEN
+ DO 255 IP=1,14
+ DO 250 LLL=1,NGROUP
+ GAF(IBM,LLL,IP)=0.0
+ 250 CONTINUE
+ 255 CONTINUE
+ TOTDEN=0.0
+ DO 320 ISOT=1,NBISO
+ IF((MIX(ISOT).NE.IBM).OR.(DEN(ISOT).EQ.0.0)) GO TO 320
+ JPLIB=IPISO(ISOT)
+ IF(.NOT.C_ASSOCIATED(JPLIB)) GO TO 320
+*-
+ DENISO=DEN(ISOT)
+ TOTDEN=TOTDEN+DENISO
+ DO 315 IXSPER=1,NXSPER
+ CALL LCMGET(JPLIB,'NTOT0 '//NORD(IXSPER),GA1)
+ DO 260 LLL=1,NGROUP
+ GAF(IBM,LLL,1)=GAF(IBM,LLL,1)+GA1(LLL)*DENISO
+ 260 CONTINUE
+ CALL LCMLEN(JPLIB,'NTOT1 '//NORD(IXSPER),ILONG,ITYLCM)
+ IF(ILONG.GT.0) THEN
+ LWP1=.TRUE.
+ CALL LCMGET(JPLIB,'NTOT1 '//NORD(IXSPER),GA1)
+ DO 270 LLL=1,NGROUP
+ GAF(IBM,LLL,3)=GAF(IBM,LLL,3)+GA1(LLL)*DENISO
+ 270 CONTINUE
+ ENDIF
+ IF(LDIFF) THEN
+ CALL LCMLEN(JPLIB,'STRD '//NORD(IXSPER),ILONG,ITYLCM)
+ IF(ILONG.GT.0) THEN
+ LSTRD=.TRUE.
+ CALL LCMGET(JPLIB,'STRD '//NORD(IXSPER),GA1)
+ DO 280 LLL=1,NGROUP
+ GAF(IBM,LLL,5)=GAF(IBM,LLL,5)+GA1(LLL)*DENISO
+ 280 CONTINUE
+ ENDIF
+ ENDIF
+ CALL LCMLEN(JPLIB,'H-FACTOR'//NORD(IXSPER),ILONG,ITYLCM)
+ IF(ILONG.GT.0) THEN
+ LH=.TRUE.
+ CALL LCMGET(JPLIB,'H-FACTOR'//NORD(IXSPER),GA1) !eV-barns
+ DO 290 LLL=1,NGROUP
+ GAF(IBM,LLL,7)=GAF(IBM,LLL,7)+GA1(LLL)*DENISO !MeV/cm
+ 290 CONTINUE
+ ENDIF
+ CALL LCMLEN(JPLIB,'C-FACTOR'//NORD(IXSPER),ILONG,ITYLCM)
+ IF(ILONG.GT.0) THEN
+ LC=.TRUE.
+ CALL LCMGET(JPLIB,'C-FACTOR'//NORD(IXSPER),GA1)
+ DO 295 LLL=1,NGROUP
+ GAF(IBM,LLL,13)=GAF(IBM,LLL,13)+GA1(LLL)*DENISO
+ 295 CONTINUE
+ ENDIF
+ CALL LCMLEN(JPLIB,'OVERV '//NORD(IXSPER),ILONG,ITYLCM)
+ IF((ILONG.GT.0).AND.((HPRT1.EQ.'N').OR.(HPRT1.EQ.'NEUT').OR.
+ 1 (HPRT1.EQ.' '))) THEN
+ LOVERV=.TRUE.
+ CALL LCMGET(JPLIB,'OVERV '//NORD(IXSPER),GA1)
+ DO 300 LLL=1,NGROUP
+ GAF(IBM,LLL,9)=GAF(IBM,LLL,9)+GA1(LLL)*DENISO
+ 300 CONTINUE
+ ENDIF
+ IF(ITRANC.NE.0) THEN
+ CALL LCMGET(JPLIB,'TRANC '//NORD(IXSPER),GA1)
+ DO 310 LLL=1,NGROUP
+ GAF(IBM,LLL,11)=GAF(IBM,LLL,11)+GA1(LLL)*DENISO
+ 310 CONTINUE
+ ENDIF
+ DENISO=DENISO*TIMFCT
+ 315 CONTINUE
+*-
+ 320 CONTINUE
+ IF(LOVERV) THEN
+ DO 330 LLL=1,NGROUP
+ IF(GAF(IBM,LLL,9).NE.0.0) THEN
+ GAF(IBM,LLL,9)=GAF(IBM,LLL,9)/TOTDEN
+ ENDIF
+ 330 CONTINUE
+ ENDIF
+ ENDIF
+ !-----------------------------------------------------------
+ !APPLY STERNHEIMER DENSITY CORRECTION ON HEAT DEPOSITION FOR
+ !ELECTRON AND POSITRON.
+ !REASON: SOFT INLEASTIC HEAT DEPOSITION IN ELECTR
+ !CONTAINS A COLLISONNAL STOPPING POWER WHICH HAS NOT
+ !BEEN CORRECTED IN NJOY.
+ !-----------------------------------------------------------
+ IF (STERN.EQ.1) THEN
+ IF (HPRT1.EQ.'B'.OR.HPRT1.EQ.'C') THEN
+ DO LLL=1,NGROUP
+ GAF(IBM,LLL,7)=GAF(IBM,LLL,7)-DENMAT(IBM,LLL) !eV/cm
+ ENDDO
+ ENDIF
+ ENDIF
+ 340 CONTINUE
+ DO 420 LLL=1,NGROUP
+ KPLIB=IPGRP(LLL,1)
+ IF(MASKL(LLL).OR.LALL) THEN
+ IF(MASKK) THEN
+ GAF(:NBMIX,LLL,2)=0.0
+ CALL LCMGET(KPLIB,'NTOT0',GAF(1,LLL,2))
+ DO 350 IBM=1,NBMIX
+ IF(.NOT.MASK(IBM)) GAF(IBM,LLL,1)=GAF(IBM,LLL,2)
+ 350 CONTINUE
+ ENDIF
+ CALL LCMPUT(KPLIB,'NTOT0',NBMIX,2,GAF(1,LLL,1))
+ IF(LWP1) THEN
+ IF(MASKK) THEN
+ GAF(:NBMIX,LLL,4)=0.0
+ CALL LCMGET(KPLIB,'NTOT1',GAF(1,LLL,4))
+ DO 360 IBM=1,NBMIX
+ IF(.NOT.MASK(IBM)) GAF(IBM,LLL,3)=GAF(IBM,LLL,4)
+ 360 CONTINUE
+ ENDIF
+ CALL LCMPUT(KPLIB,'NTOT1',NBMIX,2,GAF(1,LLL,3))
+ ENDIF
+ IF(LSTRD) THEN
+ IF(MASKK) THEN
+ GAF(:NBMIX,LLL,6)=0.0
+ CALL LCMGET(KPLIB,'DIFF',GAF(1,LLL,6))
+ DO 370 IBM=1,NBMIX
+ IF(.NOT.MASK(IBM)) THEN
+ GAF(IBM,LLL,5)=1.0/(3.0*GAF(IBM,LLL,6))
+ ENDIF
+ 370 CONTINUE
+ ENDIF
+ DO 380 IBM=1,NBMIX
+ IF(GAF(IBM,LLL,5).NE.0.0) THEN
+ GAF(IBM,LLL,5)=1.0/(3.0*GAF(IBM,LLL,5))
+ ENDIF
+ 380 CONTINUE
+ CALL LCMPUT(KPLIB,'DIFF',NBMIX,2,GAF(1,LLL,5))
+ ENDIF
+ IF(LH) THEN
+ IF(MASKK) THEN
+ GAF(:NBMIX,LLL,8)=0.0
+ CALL LCMLEN(KPLIB,'H-FACTOR',ILONG,ITYLCM)
+ IF(ILONG.GT.0) THEN
+ CALL LCMGET(KPLIB,'H-FACTOR',GAF(1,LLL,8))
+ DO 390 IBM=1,NBMIX
+ IF(.NOT.MASK(IBM)) GAF(IBM,LLL,7)=GAF(IBM,LLL,8)
+ 390 CONTINUE
+ ENDIF
+ ENDIF
+ CALL LCMPUT(KPLIB,'H-FACTOR',NBMIX,2,GAF(1,LLL,7)) !eV/cm
+ ENDIF
+ IF(LC) THEN
+ IF(MASKK) THEN
+ GAF(:NBMIX,LLL,14)=0.0
+ CALL LCMGET(KPLIB,'C-FACTOR',GAF(1,LLL,14))
+ DO 395 IBM=1,NBMIX
+ IF(.NOT.MASK(IBM)) GAF(IBM,LLL,13)=GAF(IBM,LLL,14)
+ 395 CONTINUE
+ ENDIF
+ CALL LCMPUT(KPLIB,'C-FACTOR',NBMIX,2,GAF(1,LLL,13)) !e/cm
+ ENDIF
+ IF(LOVERV) THEN
+ IF(MASKK) THEN
+ GAF(:NBMIX,LLL,10)=0.0
+ CALL LCMGET(KPLIB,'OVERV',GAF(1,LLL,10))
+ DO 400 IBM=1,NBMIX
+ IF(.NOT.MASK(IBM)) GAF(IBM,LLL,9)=GAF(IBM,LLL,10)
+ 400 CONTINUE
+ ENDIF
+ CALL LCMPUT(KPLIB,'OVERV',NBMIX,2,GAF(1,LLL,9))
+ ENDIF
+ IF(ITRANC.NE.0) THEN
+ IF(MASKK) THEN
+ GAF(:NBMIX,LLL,12)=0.0
+ CALL LCMGET(KPLIB,'TRANC',GAF(1,LLL,12))
+ DO 410 IBM=1,NBMIX
+ IF(.NOT.MASK(IBM)) GAF(IBM,LLL,11)=GAF(IBM,LLL,12)
+ 410 CONTINUE
+ ENDIF
+ CALL LCMPUT(KPLIB,'TRANC',NBMIX,2,GAF(1,LLL,11))
+ ENDIF
+ ENDIF
+ 420 CONTINUE
+*----
+* PROCESS THE FISSION VECTORS FOR EACH NEW FISSILE ISOTOPE.
+*----
+ NFISS0=NFISSI
+ DO 460 ISOT=1,NBISO
+ IBM=MIX(ISOT)
+ IF(IBM.EQ.0) GO TO 460
+ IF(MASK(IBM).OR.(.NOT.MASKK)) THEN
+ JPLIB=IPISO(ISOT)
+ IF(.NOT.C_ASSOCIATED(JPLIB)) GO TO 460
+ CALL LCMLEN(JPLIB,'NUSIGF',ILONG,ITYLCM)
+ IF(NESP.EQ.1) THEN
+ CALL LCMLEN(JPLIB,'CHI',LENGTZ,ITYLCM)
+ ELSE
+ CALL LCMLEN(JPLIB,'CHI--01',LENGTZ,ITYLCM)
+ ENDIF
+ IF((ILONG.GT.0).AND.(LENGTZ.GT.0)) THEN
+ IF(NESP.EQ.1) THEN
+ CALL LCMGET(JPLIB,'CHI',GA1)
+ ELSE
+ CALL LCMGET(JPLIB,'CHI--01',GA1)
+ ENDIF
+ LFISS=.FALSE.
+ DO 425 IGR=1,NGROUP
+ LFISS=LFISS.OR.(GA1(IGR).GT.0.0)
+ 425 CONTINUE
+ IF(.NOT.LFISS) GO TO 455
+ DO 430 IFIS=1,NFISSI
+ IWFIS=INDFIS(IBM,IFIS)
+ IF((IWFIS.EQ.ISOT).OR.(IWFIS.EQ.0)) THEN
+ KFIS=IFIS
+ GO TO 450
+ ENDIF
+ 430 CONTINUE
+ NFISSI=NFISSI+1
+ IF(NFISSI.GT.MAXNFI) CALL XABORT('LIBDEN: INDFIS IS FULL.')
+ KFIS=NFISSI
+ DO 440 JBM=1,NBMIX
+ INDFIS(JBM,KFIS)=0
+ 440 CONTINUE
+ 450 INDFIS(IBM,KFIS)=ISOT
+ ENDIF
+ 455 CONTINUE
+ ENDIF
+ 460 CONTINUE
+ IF(NFISS0.GT.0) THEN
+ ALLOCATE(WRK1(NBM0,NFISS0*NESP),WRK2(NBM0,NFISS0*NESP))
+ DO 480 LLL=1,NGROUP
+ IF(MASKL(LLL).OR.LALL) THEN
+ DO 465 IDEL=0,NDEL
+ ZNUS(:NBMIX*MAXNFI*NESP,LLL,IDEL)=0.0
+ ZCHI(:NBMIX*MAXNFI*NESP,LLL,IDEL)=0.0
+ 465 CONTINUE
+ KPLIB=IPGRP(LLL,1)
+ CALL LCMLEN(KPLIB,'NUSIGF',ILONG,ITYLCM)
+ IF(ILONG.NE.NBM0*NFISS0*NESP) THEN
+ CALL XABORT('LIBDEN: NBM ERROR.')
+ ENDIF
+ CALL LCMGET(KPLIB,'NUSIGF',WRK1)
+ CALL LCMGET(KPLIB,'CHI',WRK2)
+ DO 467 IFIS=1,NFISS0*NESP
+ DO 466 IBM=1,NBM0
+ ZNUS((IFIS-1)*NBMIX+IBM,LLL,0)=WRK1(IBM,IFIS)
+ ZCHI((IFIS-1)*NBMIX+IBM,LLL,0)=WRK2(IBM,IFIS)
+ 466 CONTINUE
+ 467 CONTINUE
+ DO 475 IDEL=1,NDEL
+ WRITE(TEXT12,'(6HNUSIGF,I2.2)') IDEL
+ CALL LCMLEN(KPLIB,TEXT12,ILONG,ITYLCM)
+ IF(ILONG.NE.0) THEN
+ CALL LCMGET(KPLIB,TEXT12,WRK1)
+ WRITE(TEXT12,'(3HCHI,I2.2)') IDEL
+ CALL LCMGET(KPLIB,TEXT12,WRK2)
+ DO 471 IFIS=1,NFISS0*NESP
+ DO 470 IBM=1,NBM0
+ ZNUS((IFIS-1)*NBMIX+IBM,LLL,IDEL)=WRK1(IBM,IFIS)
+ ZCHI((IFIS-1)*NBMIX+IBM,LLL,IDEL)=WRK2(IBM,IFIS)
+ 470 CONTINUE
+ 471 CONTINUE
+ ENDIF
+ 475 CONTINUE
+ ENDIF
+ 480 CONTINUE
+ DEALLOCATE(WRK2,WRK1)
+ ENDIF
+ IF(NFISSI.GT.0) THEN
+ DO 525 ISP=1,NESP
+ DO 520 KFIS=1,NFISSI
+ IF(KFIS.GT.NFISS0*NESP) THEN
+ DO 492 IDEL=0,NDEL
+ DO 491 LLL=1,NGROUP
+ DO 490 IBM=1,NBMIX
+ IOF=(KFIS-1)*NBMIX*NESP+(ISP-1)*NBMIX+IBM
+ ZNUS(IOF,LLL,IDEL)=0.0
+ ZCHI(IOF,LLL,IDEL)=0.0
+ 490 CONTINUE
+ 491 CONTINUE
+ 492 CONTINUE
+ ELSE
+ DO 510 IBM=1,NBMIX
+ IWFIS=INDFIS(IBM,KFIS)
+ IF((IWFIS.NE.0).AND.(MASK(IBM).OR.(.NOT.MASKK))) THEN
+ DO 505 IDEL=0,NDEL
+ DO 500 LLL=1,NGROUP
+ IOF=(KFIS-1)*NBMIX*NESP+(ISP-1)*NBMIX+IBM
+ ZNUS(IOF,LLL,IDEL)=0.0
+ ZCHI(IOF,LLL,IDEL)=0.0
+ 500 CONTINUE
+ 505 CONTINUE
+ ENDIF
+ 510 CONTINUE
+ ENDIF
+ 520 CONTINUE
+ 525 CONTINUE
+*-
+ IF(NESP.EQ.1) THEN
+* ONE FISSION SPECTRUM (CLASSICAL CASE)
+ DO 585 KFIS=1,NFISSI
+ DO 580 IBM=1,NBMIX
+ IWFIS=INDFIS(IBM,KFIS)
+ IF((IWFIS.NE.0).AND.(MASK(IBM).OR.(.NOT.MASKK))) THEN
+ IF(LSAME) THEN
+ IOF=IBM
+ ELSE
+ IOF=(KFIS-1)*NBMIX+IBM
+ ENDIF
+ JPLIB=IPISO(IWFIS)
+ IF(.NOT.C_ASSOCIATED(JPLIB)) GO TO 580
+*-
+ DENISO=DEN(IWFIS)
+ DO 570 IXSPER=1,NXSPER
+ CALL LCMGET(JPLIB,'NUSIGF '//NORD(IXSPER),GA1)
+ DO 530 LLL=1,NGROUP
+ ZNUS(IOF,LLL,0)=ZNUS(IOF,LLL,0)+GA1(LLL)*DENISO
+ 530 CONTINUE
+ IF(NDEL.GT.0) THEN
+ WRITE(TEXT12,'(6HNUSIGF,I2.2,A4)') NDEL,NORD(IXSPER)
+ CALL LCMLEN(JPLIB,TEXT12,ILONG,ITYLCM)
+ IF(ILONG.GT.0) THEN
+ DO 545 IDEL=1,NDEL
+ WRITE(TEXT12,'(6HNUSIGF,I2.2,A4)') IDEL,NORD(IXSPER)
+ CALL LCMGET(JPLIB,TEXT12,GA1)
+ DO 540 LLL=1,NGROUP
+ ZNUS(IOF,LLL,IDEL)=ZNUS(IOF,LLL,IDEL)+GA1(LLL)*
+ 1 DENISO
+ 540 CONTINUE
+ 545 CONTINUE
+ ENDIF
+ WRITE(TEXT12,'(3HCHI,I2.2,3X,A4)') NDEL,NORD(IXSPER)
+ CALL LCMLEN(JPLIB,TEXT12,ILONG,ITYLCM)
+ IF((ILONG.GT.0).AND.(IXSPER.EQ.1)) THEN
+ DO 555 IDEL=1,NDEL
+ WRITE(TEXT12,'(3HCHI,I2.2,3X,A4)') IDEL,NORD(IXSPER)
+ CALL LCMGET(JPLIB,TEXT12,GA1)
+ DO 550 LLL=1,NGROUP
+ ZCHI(IOF,LLL,IDEL)=GA1(LLL)
+ 550 CONTINUE
+ 555 CONTINUE
+ ENDIF
+ ENDIF
+ IF(IXSPER.EQ.1) THEN
+ CALL LCMGET(JPLIB,'CHI '//NORD(IXSPER),GA1)
+ DO 560 LLL=1,NGROUP
+ ZCHI(IOF,LLL,0)=GA1(LLL)
+ 560 CONTINUE
+ ENDIF
+ DENISO=DENISO*TIMFCT
+ 570 CONTINUE
+ ENDIF
+ 580 CONTINUE
+ 585 CONTINUE
+ ELSE
+* NESP>1 MULTIPLE FISSION SPECTRA CASE
+ DO 662 ISP=1,NESP
+ DO 661 KFIS=1,NFISSI
+ DO 660 IBM=1,NBMIX
+ IWFIS=INDFIS(IBM,KFIS)
+ IF((IWFIS.NE.0).AND.(MASK(IBM).OR.(.NOT.MASKK))) THEN
+ IF(LSAME) THEN
+ IOF=IBM
+ ELSE
+ IOF=(KFIS-1)*NBMIX*NESP+(ISP-1)*NBMIX+IBM
+ ENDIF
+ JPLIB=IPISO(IWFIS)
+ IF(.NOT.C_ASSOCIATED(JPLIB)) GO TO 660
+*-
+ DENISO=DEN(IWFIS)
+ DO 650 IXSPER=1,NXSPER
+ CALL LCMGET(JPLIB,'NUSIGF '//NORD(IXSPER),GA1)
+ DO 610 LLL=IESP(ISP)+1,IESP(ISP+1)
+ ZNUS(IOF,LLL,0)=ZNUS(IOF,LLL,0)+GA1(LLL)*DENISO
+ 610 CONTINUE
+ IF((NDEL.GT.0).AND.(ISP.EQ.1)) THEN
+ WRITE(TEXT12,'(6HNUSIGF,I2.2,A4)') NDEL,NORD(IXSPER)
+ CALL LCMLEN(JPLIB,TEXT12,ILONG,ITYLCM)
+ IF(ILONG.GT.0) THEN
+ DO 625 IDEL=1,NDEL
+ WRITE(TEXT12,'(6HNUSIGF,I2.2,A4)') IDEL,NORD(IXSPER)
+ CALL LCMGET(JPLIB,TEXT12,GA1)
+ DO 620 LLL=1,NGROUP
+ ZNUS(IOF,LLL,IDEL)=ZNUS(IOF,LLL,IDEL)+GA1(LLL)*
+ 1 DENISO
+ 620 CONTINUE
+ 625 CONTINUE
+ ENDIF
+ WRITE(TEXT12,'(3HCHI,I2.2,3X,A4)') NDEL,NORD(IXSPER)
+ CALL LCMLEN(JPLIB,TEXT12,ILONG,ITYLCM)
+ IF((ILONG.GT.0).AND.(IXSPER.EQ.1)) THEN
+ DO 635 IDEL=1,NDEL
+ WRITE(TEXT12,'(3HCHI,I2.2,3X,A4)') IDEL,NORD(IXSPER)
+ CALL LCMGET(JPLIB,TEXT12,GA1)
+ DO 630 LLL=1,NGROUP
+ ZCHI(IOF,LLL,IDEL)=GA1(LLL)
+ 630 CONTINUE
+ 635 CONTINUE
+ ENDIF
+ ENDIF
+ IF(IXSPER.EQ.1) THEN
+ WRITE(TEXT2,'(I2.2)') ISP
+ TEXT12='CHI--'//TEXT2//' '//NORD(IXSPER)
+ CALL LCMLEN(JPLIB,TEXT12,ILONG,ITYLCM)
+ IF(ILONG.EQ.NGROUP) THEN
+ CALL LCMGET(JPLIB,TEXT12,GA1)
+ DO 640 LLL=1,NGROUP
+ ZCHI(IOF,LLL,0)=GA1(LLL)
+ 640 CONTINUE
+ ENDIF
+ ENDIF
+ DENISO=DENISO*TIMFCT
+ 650 CONTINUE
+ ENDIF
+ 660 CONTINUE
+ 661 CONTINUE
+ 662 CONTINUE
+ ENDIF
+*-
+ DO 680 LLL=1,NGROUP
+ IF(MASKL(LLL).OR.LALL) THEN
+ KPLIB=IPGRP(LLL,1)
+ ILONG=NBMIX*NFISSI*NESP
+ IF(LSAME) ILONG=NBMIX
+ CALL LCMPUT(KPLIB,'NUSIGF',ILONG,2,ZNUS(1,LLL,0))
+ CALL LCMPUT(KPLIB,'CHI',ILONG,2,ZCHI(1,LLL,0))
+ DO 670 IDEL=1,NDEL
+ WRITE(TEXT12,'(6HNUSIGF,I2.2)') IDEL
+ CALL LCMPUT(KPLIB,TEXT12,ILONG,2,ZNUS(1,LLL,IDEL))
+ WRITE(TEXT12,'(3HCHI,I2.2)') IDEL
+ CALL LCMPUT(KPLIB,TEXT12,ILONG,2,ZCHI(1,LLL,IDEL))
+ 670 CONTINUE
+ ENDIF
+ 680 CONTINUE
+ ENDIF
+*----
+* PROCESS THE EXTRA VECTOR EDITS.
+*----
+ DO 770 IED=1,NED
+ WRITE(CV,'(2A4)') (NAMEAD(I0,IED),I0=1,2)
+ IF(CV(:2).EQ.'NW') GO TO 770
+ IF(CV.EQ.'TRANC') GO TO 770
+ IF((CV(:3).EQ.'BST').OR.(CV(:3).EQ.'CST')) GO TO 770
+ IF(CV(:8).EQ.'H-FACTOR') GO TO 770
+ EXIST=.FALSE.
+ DO 740 IBM=1,NBMIX
+ IF(MASK(IBM).OR.(.NOT.MASKK)) THEN
+ DO 690 LLL=1,NGROUP
+ GAF(IBM,LLL,1)=0.0
+ 690 CONTINUE
+ DO 730 ISOT=1,NBISO
+ IF((MIX(ISOT).NE.IBM).OR.(DEN(ISOT).EQ.0.0)) GO TO 730
+ JPLIB=IPISO(ISOT)
+ IF(.NOT.C_ASSOCIATED(JPLIB)) GO TO 730
+*-
+ DENISO=DEN(ISOT)
+ DO 710 IXSPER=1,NXSPER
+ CALL LCMLEN(JPLIB,CV(:8)//NORD(IXSPER),ILONG,ITYLCM)
+ IF(ILONG.EQ.0) GO TO 720
+ EXIST=.TRUE.
+ CALL LCMGET(JPLIB,CV(:8)//NORD(IXSPER),GA1)
+ DO 700 LLL=1,NGROUP
+ GAF(IBM,LLL,1)=GAF(IBM,LLL,1)+GA1(LLL)*DENISO
+ 700 CONTINUE
+ DENISO=DENISO*TIMFCT
+ 710 CONTINUE
+*-
+ 720 CONTINUE
+ 730 CONTINUE
+ ENDIF
+ 740 CONTINUE
+ DO 760 LLL=1,NGROUP
+ IF(MASKL(LLL).OR.LALL) THEN
+ KPLIB=IPGRP(LLL,1)
+ IF(MASKK) THEN
+ CALL LCMLEN(KPLIB,CV,ILONG,ITYLCM)
+ IF(ILONG.GT.0) THEN
+ EXIST=.TRUE.
+ GAF(:NBMIX,LLL,2)=0.0
+ CALL LCMGET(KPLIB,CV,GAF(1,LLL,2))
+ DO 750 IBM=1,NBMIX
+ IF(.NOT.MASK(IBM)) GAF(IBM,LLL,1)=GAF(IBM,LLL,2)
+ 750 CONTINUE
+ ENDIF
+ ENDIF
+ IF(EXIST) CALL LCMPUT(KPLIB,CV,NBMIX,2,GAF(1,LLL,1))
+ ENDIF
+ 760 CONTINUE
+ 770 CONTINUE
+*
+ CALL LCMGET(IPLIB,'ENERGY',GA1)
+ IF(GA1(NGROUP+1).EQ.0.0) GA1(NGROUP+1)=1.0E-5
+ CALL LCMSIX(IPLIB,'MACROLIB',1)
+ IF(NED.GT.0) CALL LCMPUT(IPLIB,'ADDXSNAME-P0',2*NED,3,NAMEAD)
+ IF(MASKK) THEN
+ CALL LCMGET(IPLIB,'STATE-VECTOR',IDATA)
+ IDATA(2)=MAX(NBM0,NBMIX)
+ IDATA(3)=MAX(IDATA(3),NL)
+ IDATA(4)=NFISSI*NESP
+ IDATA(5)=MAX(IDATA(5),NED)
+ ELSE
+ IDATA(1)=NGROUP
+ IDATA(2)=NBMIX
+ IDATA(3)=NL
+ IDATA(4)=NFISSI*NESP
+ IDATA(5)=NED
+ TEXT12='L_MACROLIB'
+ CALL LCMPTC(IPLIB,'SIGNATURE',12,TEXT12)
+ CALL LCMPUT(IPLIB,'ENERGY',NGROUP+1,2,GA1)
+ ENDIF
+*----
+* COMPUTE 1/V (ENER IS IN EV, NEUTRON MASS IS IN KG)
+*----
+ IF((.NOT.LOVERV).AND.((HPRT1.EQ.'N').OR.(HPRT1.EQ.'NEUT').OR.
+ 1 (HPRT1.EQ.' '))) THEN
+ DO 800 LLL=1,NGROUP
+ ENEAVG=SQRT(GA1(LLL)*GA1(LLL+1))
+ ZNU=1.0/(SQRT(ENEAVG)*SQFMAS)
+ DO 790 IBM=1,NBMIX
+ GAR(IBM,1)=REAL(ZNU)
+ 790 CONTINUE
+ KPLIB=IPGRP(LLL,1)
+ CALL LCMPUT(KPLIB,'OVERV',NBMIX,2,GAR(1,1))
+ 800 CONTINUE
+ ENDIF
+ DEALLOCATE(GA1)
+*----
+* SET THE STATE VECTOR
+*----
+ IF(LSAME) IDATA(4)=MIN(NFISSI*NESP,1)
+ IDATA(6)=ITRANC
+ IF(ITRANC.NE.0) IDATA(6)=2
+ IDATA(7)=NDEL
+ IDATA(8)=0
+ IDATA(9)=0
+ IF(LSTRD) IDATA(9)=1
+ IDATA(10)=0
+ IF(LWP1) IDATA(10)=1
+ DO 810 I=11,NSTATE
+ IDATA(I)=0
+ 810 CONTINUE
+ CALL LCMLEN(IPLIB,'SPH',ILONG,ITYLCM)
+ IF(ILONG.NE.0) IDATA(14)=1
+ CALL LCMPUT(IPLIB,'TIMESTAMP',3,2,TMPDAY)
+ CALL LCMPUT(IPLIB,'STATE-VECTOR',NSTATE,1,IDATA)
+*----
+* RECOVER THE PRECURSOR DECAY CONSTANTS.
+*----
+ IF(NDEL*NFISSI.GT.0) THEN
+ IF(NFISS0.GT.0) THEN
+ CALL LCMLEN(IPLIB,'LAMBDA-D',ILONG,ITYLCM)
+ IF(ILONG.EQ.0) THEN
+ GA3(:NDEL,1)=0.0
+ ELSE
+ CALL LCMGET(IPLIB,'LAMBDA-D',GA3(1,1))
+ ENDIF
+ ENDIF
+ DO 825 KFIS=NFISS0+1,NFISSI
+ DO 820 IDEL=1,NDEL
+ GA3(IDEL,KFIS)=0.0
+ 820 CONTINUE
+ 825 CONTINUE
+ CALL LCMSIX(IPLIB,' ',2)
+ DO 835 KFIS=1,NFISSI
+ DO 830 IBM=1,NBMIX
+ IWFIS=INDFIS(IBM,KFIS)
+ IF((IWFIS.NE.0).AND.(MASK(IBM).OR.(.NOT.MASKK))) THEN
+ JPLIB=IPISO(IWFIS)
+ IF(.NOT.C_ASSOCIATED(JPLIB)) GO TO 830
+ CALL LCMLEN(JPLIB,'LAMBDA-D',ILONG,ITYLCM)
+ IF(LSAME.AND.(ILONG.GT.0)) THEN
+ CALL LCMGET(JPLIB,'LAMBDA-D',GA3(1,1))
+ ELSE IF(ILONG.GT.0) THEN
+ CALL LCMGET(JPLIB,'LAMBDA-D',GA3(1,KFIS))
+ ENDIF
+ ENDIF
+ 830 CONTINUE
+ 835 CONTINUE
+ CALL LCMSIX(IPLIB,'MACROLIB',1)
+ IF(LSAME) THEN
+ CALL LCMPUT(IPLIB,'LAMBDA-D',NDEL,2,GA3(1,1))
+ ELSE
+ CALL LCMPUT(IPLIB,'LAMBDA-D',NDEL*NFISSI,2,GA3)
+ ENDIF
+ ENDIF
+*
+ IF((NFISSI.GT.0).AND.(.NOT.LSAME)) THEN
+ CALL LCMPUT(IPLIB,'FISSIONINDEX',NBMIX*NFISSI,1,INDFIS)
+ ENDIF
+*
+ DO 850 LLL=1,NGROUP
+ IF(MASKL(LLL).OR.LALL) THEN
+ KPLIB=IPGRP(LLL,1)
+ DO 840 M=0,NL-1
+ IF(M.LE.10) THEN
+ CM=HCM(M)//' '
+ ELSE
+ WRITE(CM,'(I2.2,2X)') M
+ ENDIF
+ CALL LCMPUT(KPLIB,'CHECK'//CM,NBMIX,2,CHECK(1,LLL,M+1))
+ 840 CONTINUE
+ ENDIF
+ 850 CONTINUE
+ CALL LCMSIX(IPLIB,' ',2)
+*----
+* RECOVER THE INTEGRATED FLUX
+*----
+ CALL LCMLEN(IPLIB,'MIXTURESVOL',ILONG,ITYLCM)
+ IF(ILONG.GT.0) THEN
+ ALLOCATE(VOLMIX(NBMIX),NWTMIX(NGROUP),FLUX(NBMIX,NGROUP,2))
+ CALL LCMGET(IPLIB,'MIXTURESVOL',VOLMIX)
+ LWT0=.FALSE.
+ LWT1=.FALSE.
+ FLUX(:NBMIX,:NGROUP,:2)=0.0
+ DO 860 ISOT=1,NBISO
+ IBM=MIX(ISOT)
+ IF(IBM.GT.0) THEN
+ JPLIB=IPISO(ISOT)
+ IF(C_ASSOCIATED(JPLIB)) THEN
+ CALL LCMLEN(JPLIB,'NWT0',ILONG,ITYLCM)
+ IF(ILONG.EQ.NGROUP) THEN
+ LWT0=.TRUE.
+ CALL LCMGET(JPLIB,'NWT0',NWTMIX)
+ DO IGR=1,NGROUP
+ FLUX(IBM,IGR,1)=NWTMIX(IGR)*VOLMIX(IBM)
+ ENDDO
+ ENDIF
+ CALL LCMLEN(JPLIB,'NWT1',ILONG,ITYLCM)
+ IF(ILONG.EQ.NGROUP) THEN
+ LWT1=.TRUE.
+ CALL LCMGET(JPLIB,'NWT1',NWTMIX)
+ DO IGR=1,NGROUP
+ FLUX(IBM,IGR,2)=NWTMIX(IGR)*VOLMIX(IBM)
+ ENDDO
+ ENDIF
+ ENDIF
+ ENDIF
+ 860 CONTINUE
+ CALL LCMSIX(IPLIB,'MACROLIB',1)
+ CALL LCMPUT(IPLIB,'VOLUME',NBMIX,2,VOLMIX)
+ JPLIB=LCMGID(IPLIB,'GROUP')
+ DO 870 IGR=1,NGROUP
+ KPLIB=LCMGIL(JPLIB,IGR)
+ IF(LWT0) CALL LCMPUT(KPLIB,'FLUX-INTG',NBMIX,2,FLUX(1,IGR,1))
+ IF(LWT1) CALL LCMPUT(KPLIB,'FLUX-INTG-P1',NBMIX,2,FLUX(1,IGR,2))
+ 870 CONTINUE
+ CALL LCMSIX(IPLIB,' ',2)
+ DEALLOCATE(FLUX,NWTMIX,VOLMIX)
+ ENDIF
+*----
+* SCRATCH STORAGE DEALLOCATION
+*----
+ 880 DEALLOCATE(DENMAT)
+ DEALLOCATE(HNPART,C2PART,NGPART)
+ DEALLOCATE(LMADE)
+ DEALLOCATE(IPGRP)
+ DEALLOCATE(ZCHI,ZNUS,CHECK,SCAT,GAF,GAR,GA3,GA2)
+ DEALLOCATE(NJJ,IJJ,INDFIS,IPOS,IJJM,NJJM)
+ RETURN
+*----
+* FORMAT
+*----
+ 6000 FORMAT(' WARNING IN LIBDEN FOR PERTURBATION'/
+ > ' EXTRAPOLATION BELOW PRETURBATION TABLES'/
+ > ' INITIAL TIME = ',F15.6,' DAYS'/
+ > ' EXTRAPOLATION TIME = ',F15.6,' DAYS')
+ 6001 FORMAT(' WARNING IN LIBDEN FOR PERTURBATION'/
+ > ' EXTRAPOLATION ABOVE PRETURBATION TABLES'/
+ > ' FINAL TIME = ',F15.6,' DAYS'/
+ > ' EXTRAPOLATION TIME = ',F15.6,' DAYS')
+ END