summaryrefslogtreecommitdiff
path: root/Dragon/src/LIBNFI.f
blob: dbb0aef2e1b9b7303ec10125aaf4a93d8c6adfbf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
*DECK LIBNFI
      SUBROUTINE LIBNFI(IPLIB,NGRO,NBISO,NBMIX,NDEL,NESP,IPISO,MIX,
     1 MAXNFI,NFISSI,LSAME)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Compute the maximum number of fissionable isotopes in a mixture.
*
*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
* IPLIB   pointer to the lattice microscopic cross section library
*         (L_LIBRARY signature).
* NGRO    number of energy groups.
* NBISO   number of isotopes present in the calculation domain.
* NBMIX   number of mixtures present in the calculation domain.
* NDEL    number of delayed precursor groups.
* NESP    number of energy-dependent fission spectra.
* IPISO   pointer array towards microlib isotopes.
* MIX     mixture number of each isotope (can be zero for void).
* MAXNFI  second dimension of array INDFIS.
*
*Parameters: output
* NFISSI  maximum number of fissionable isotopes in a mixture.
* LSAME   fission spectrum mask (=.true. if all the isotopes have the
*         same fission spectrum and the same precursor group decay
*         constants.
*
*-----------------------------------------------------------------------
*
      USE GANLIB
      IMPLICIT NONE
*----
*  SUBROUTINE ARGUMENTS
*----
      TYPE(C_PTR) IPLIB,IPISO(NBISO)
      INTEGER NGRO,NBISO,NBMIX,NDEL,NESP,MIX(NBISO),MAXNFI,NFISSI
      LOGICAL LSAME
*----
*  LOCAL VARIABLES
*----
      TYPE(C_PTR) JPLIB
      INTEGER MAXGRO,NSTATE
      PARAMETER (MAXGRO=50,NSTATE=40)
      CHARACTER HSMG*131,TEXT12*12
      REAL CHI2(MAXGRO),LAM1(MAXGRO),LAM2(MAXGRO)
      INTEGER IDATA(NSTATE),ISOT,IBM,IFIS,IGR,ILONG,ITYLCM,IWFIS,JBM,
     1 KFIS,LENGT1,LENGT2,LENGTZ
      LOGICAL LFISS
*----
*  ALLOCATABLE ARRAYS
*----
      INTEGER, ALLOCATABLE, DIMENSION(:) :: IWRK
      INTEGER, ALLOCATABLE, DIMENSION(:,:) :: INDFIS
      REAL, ALLOCATABLE, DIMENSION(:) :: CHI1
*----
*  SCRATCH STORAGE ALLOCATION
*----
      ALLOCATE(INDFIS(NBMIX,MAXNFI),CHI1(NGRO))
*
      NFISSI=0
      CALL LCMLEN(IPLIB,'MACROLIB',ILONG,ITYLCM)
      LSAME=(NGRO.LE.MAXGRO).AND.(NDEL.LE.MAXGRO)
      IF(ILONG.EQ.-1) THEN
         CALL LCMSIX(IPLIB,'MACROLIB',1)
         CALL LCMGTC(IPLIB,'SIGNATURE',12,TEXT12)
         IF(TEXT12.NE.'L_MACROLIB') THEN
            CALL XABORT('LIBNFI: INVALID SIGNATURE ON THE MACROLIB.')
         ENDIF
         CALL LCMGET(IPLIB,'STATE-VECTOR',IDATA)
         IF(IDATA(1).NE.NGRO) THEN
            WRITE(HSMG,'(38HLIBNFI: EXISTING MACROLIB HAVE NGROUP=,I4,
     1      26H NEW MACROLIB HAVE NGROUP=,I4,1H.)') IDATA(1),NGRO
            CALL XABORT(HSMG)
         ELSE IF(IDATA(2).GT.NBMIX) THEN
            WRITE(HSMG,'(37HLIBNFI: EXISTING MACROLIB HAVE NBMIX=,I4,
     1      25H NEW MACROLIB HAVE NBMIX=,I4,1H.)') IDATA(2),NBMIX
            CALL XABORT(HSMG)
         ELSE IF(IDATA(4).GT.NBISO*NESP) THEN
            WRITE(HSMG,'(38HLIBNFI: EXISTING MACROLIB HAVE NFISSI=,I4,
     1      13H GREATER THAN,I5,1H.)') IDATA(4)/NESP,NBISO
            CALL XABORT(HSMG)
         ENDIF
         NFISSI=IDATA(4)/NESP
         LSAME=LSAME.AND.(NFISSI.LE.1)
         IF(NFISSI.GT.0) THEN
            CALL LCMLEN(IPLIB,'FISSIONINDEX',ILONG,ITYLCM)
            IF(ILONG.EQ.0) THEN
*              THE NAMES ARE NOT DEFINED.
               DO 15 IFIS=1,NFISSI
               DO 10 IBM=1,NBMIX
               INDFIS(IBM,IFIS)=0
   10          CONTINUE
   15          CONTINUE
            ELSE IF(ILONG.EQ.NFISSI*NBMIX) THEN
               CALL LCMGET(IPLIB,'FISSIONINDEX',INDFIS)
            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,IDATA(2)
               INDFIS(IBM,IFIS)=IWRK((IFIS-1)*IDATA(2)+IBM)
   20          CONTINUE
               DO 30 IBM=IDATA(2)+1,NBMIX
               INDFIS(IBM,IFIS)=0
   30          CONTINUE
   31          CONTINUE
               DEALLOCATE(IWRK)
            ELSE
               CALL XABORT('LIBNFI: INVALID NUMBER OF MIXTURES.')
            ENDIF
         ENDIF
         CALL LCMSIX(IPLIB,' ',2)
      ENDIF
      DO 100 ISOT=1,NBISO
      IBM=MIX(ISOT)
      IF(IBM.GT.0) THEN
         JPLIB=IPISO(ISOT)
         IF(C_ASSOCIATED(JPLIB)) THEN
            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',CHI1)
               ELSE
                  CALL LCMGET(JPLIB,'CHI--01',CHI1)
               ENDIF
               LFISS=.FALSE.
               DO 35 IGR=1,NGRO
               LFISS=LFISS.OR.(CHI1(IGR).GT.0.0)
   35          CONTINUE
               IF(.NOT.LFISS) GO TO 100
               IF(LSAME) THEN
                  CALL LCMLEN(JPLIB,'LAMBDA-D',LENGT1,ITYLCM)
                  IF((LENGT1.EQ.NDEL).AND.(NDEL.GT.0)) THEN
                     CALL LCMGET(JPLIB,'LAMBDA-D',LAM1)
                  ENDIF
               ENDIF
               DO 40 IFIS=1,NFISSI
               IWFIS=INDFIS(IBM,IFIS)
               IF((IWFIS.EQ.ISOT).OR.(IWFIS.EQ.0)) THEN
                  KFIS=IFIS
                  GO TO 90
               ENDIF
   40          CONTINUE
               IF(LSAME) THEN
                  DO 70 IFIS=1,NFISSI
                  IWFIS=INDFIS(IBM,IFIS)
                  JPLIB=IPISO(IWFIS)
                  CALL LCMGET(JPLIB,'CHI',CHI2)
                  DO 50 IGR=1,NGRO
                  LSAME=LSAME.AND.(ABS(CHI1(IGR)-CHI2(IGR)).LE.1.0E-3)
   50             CONTINUE
                  CALL LCMLEN(JPLIB,'LAMBDA-D',LENGT2,ITYLCM)
                  IF((LENGT1.EQ.NDEL).AND.(LENGT2.EQ.NDEL)
     1                               .AND.(NDEL.GT.0)) THEN
                     CALL LCMGET(JPLIB,'LAMBDA-D',LAM2)
                     DO 60 IGR=1,NDEL
                     LSAME=LSAME.AND.(LAM1(IGR).EQ.LAM2(IGR))
   60                CONTINUE
                  ENDIF
   70             CONTINUE
               ENDIF
               NFISSI=NFISSI+1
               IF(NFISSI.GT.MAXNFI) CALL XABORT('LIBNFI: INDFIS OVERFL'
     1         //'OW.')
               KFIS=NFISSI
               DO 80 JBM=1,NBMIX
               INDFIS(JBM,KFIS)=0
   80          CONTINUE
   90          INDFIS(IBM,KFIS)=ISOT
            ENDIF
         ENDIF
      ENDIF
  100 CONTINUE
*----
*  SCRATCH STORAGE DEALLOCATION
*----
      DEALLOCATE(CHI1,INDFIS)
      RETURN
      END