summaryrefslogtreecommitdiff
path: root/Dragon/src/LIBCMB.f
blob: 3b784c65e8c4e4a40e7f41c149aff749b09f8d43 (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
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
*DECK LIBCMB
      SUBROUTINE LIBCMB(MAXMIX,MAXISO,NBISO,NEWISO,NNMIX,MIXCMB,VOLTOT,
     >                  VOLFRA,DENMIX,ISONAM,ISONRF,SHINA,ISOMIX,HLIB,
     >                  ILLIB,DENISO,TMPISO,LSHI,SNISO,SBISO,NTFG,NIR,
     >                  GIR,MASKI,IEVOL,ITYP)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Combine mixtures by volume fraction.
*
*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): G. Marleau
*
*Parameters: input/output
* MAXMIX  maximum value of nbmix.
* MAXISO  maximum number of isotopes permitted.
* NBISO   number of isotopes before combination.
* NEWISO  number of isotopes after combination.
* NNMIX   new mixture to create or modify.
* MIXCMB  mixture to add.
* VOLTOT  total volume fraction to date.
* VOLFRA  volume fraction of current mixture.
* DENMIX  density of each mixture.
* ISONAM  name of isotopes.
* ISONRF  reference name of isotopes.
* SHINA   self-shielding name of isotopes.
* ISOMIX  mix number of each isotope.
* HLIB    isotope options.
* ILLIB   xs library index for each isotope.
* DENISO  density of isotopes.
* TMPISO  temperature of isotopes.
* LSHI    self-shielding flag.
* SNISO   dilution cross section.
* SBISO   dilution cross section used in Livolant-Jeanpierre
*         normalization.
* NTFG    number of thermal inelastic groups,
* NIR     Goldstein-Cohen flag:
*         use IR approximation for groups with index.ge.NIR;
*         use library value if NIR=0.
* GIR     Goldstein-Cohen IR parameter of each isotope.
* MASKI   treat isotope logical.
* IEVOL   depletion suppression flag (=1/2 to suppress/force depletion).
* ITYP    type of isotope.
*
*-----------------------------------------------------------------------
*
*----
*  SUBROUTINE ARGUMENTS
*----
      INTEGER      MAXMIX,MAXISO,NBISO,NEWISO,NNMIX,MIXCMB,
     >             ISONAM(3,MAXISO),ISONRF(3,MAXISO),ISOMIX(MAXISO),
     >             ILLIB(MAXISO),LSHI(MAXISO),NTFG(MAXISO),NIR(MAXISO),
     >             IEVOL(MAXISO),ITYP(MAXISO)
      LOGICAL      MASKI(MAXISO)
      REAL         VOLTOT,VOLFRA,DENMIX(MAXMIX),DENISO(MAXISO),
     >             TMPISO(MAXISO),SNISO(MAXISO),SBISO(MAXISO),
     >             GIR(MAXISO)
      CHARACTER(LEN=12) SHINA(MAXISO)
      CHARACTER(LEN=8) HLIB(MAXISO,4)
      DOUBLE PRECISION TOTWPC
*----
*  LOCAL PARAMETERS
*----
      CHARACTER    HSMG*131
*
      CMBVOL=VOLTOT+VOLFRA
      IF(MIXCMB.EQ.NNMIX) GO TO 150
      RMAS1=1.0
      RMAS2=1.0
      IF(MIXCMB.EQ.0) THEN
*----
*  MIXTURE TO ADD IS VOID
*----
        IF(DENMIX(NNMIX).EQ.-1.0) THEN
*----
*  REDUCE ATOMIC DENSITY
*----
          RMAS1=VOLTOT/CMBVOL
        ELSE
*----
*  REDUCE MIXTURE DENSITY BUT NOT WEIGHT PERCENT
*----
          DENMIX(NNMIX)=DENMIX(NNMIX)*VOLTOT/CMBVOL
        ENDIF
      ELSE
*----
*  MIXTURE TO ADD IS NOT VOID
*----
        IF(DENMIX(NNMIX).EQ.-1.0) THEN
          IF(DENMIX(MIXCMB).EQ.-1.0) THEN
*----
*  REDUCE ATOMIC DENSITY
*----
            RMAS1=VOLTOT/CMBVOL
            RMAS2=VOLFRA/CMBVOL
          ELSE
            IF(VOLTOT.GT.0.0)
     >        CALL XABORT('LIBCMB: CANNOT COMBINE MIXTURE WITH '//
     >                    ' WEIGHT PERCENT AND ATOM CONTENTS')
*----
*  TRANSFER MIXTURE DENSITY WITH INITIAL WEIGHT PERCENT TO NEWISO
*----
            DENMIX(NNMIX)=DENMIX(MIXCMB)
          ENDIF
        ELSE
          IF(DENMIX(MIXCMB).EQ.-1.0)
     >      CALL XABORT('LIBCMB: CANNOT COMBINE MIXTURE WITH '//
     >                  ' WEIGHT PERCENT AND ATOM CONTENTS')
*----
*  REDUCE MIXTURE DENSITY AND WEIGHT PERCENT FOR OLD ISO
*  TRANSFER MIXTURE DENSITY WITH REDUCED WEIGHT PERCENT TO NEWISO
*----
          RMAS1=VOLTOT*DENMIX(NNMIX)
          RMAS2=VOLFRA*DENMIX(MIXCMB)
          CMBMAS=RMAS1+RMAS2
          RMAS1=RMAS1/CMBMAS
          RMAS2=RMAS2/CMBMAS
          DENMIX(NNMIX)=CMBMAS/CMBVOL
        ENDIF
      ENDIF
      NEWISO=NBISO
*----
*  RESET OLD DENSITIES
*----
      IF(VOLTOT.EQ.0.0) THEN
        DO 90 ISO=1,NBISO
          IF(ISOMIX(ISO).EQ.NNMIX) THEN
            IF(MASKI(ISO)) THEN
              WRITE(HSMG,'(15HLIBCMB: MIXTURE,I6,18H IS ALREADY DEFINE,
     >        14HD FOR ISOTOPE ,3A4,1H.)') NNMIX,(ISONAM(I,ISO),I=1,3)
              CALL XABORT(HSMG)
            ENDIF
            ISOMIX(ISO)=0
          ENDIF
  90    CONTINUE
      ENDIF
      IF(DENMIX(MIXCMB).EQ.-1.0) THEN
        TOTWPC=1.0D0
      ELSE
        TOTWPC=0.0D0
        DO ISO=1,NBISO
          IF(ISOMIX(ISO).EQ.MIXCMB) THEN
            TOTWPC=TOTWPC+DBLE(DENISO(ISO))
          ENDIF
        ENDDO
        TOTWPC=1.0D0/TOTWPC
      ENDIF
      DO 100 ISO=1,NBISO
        IF(ISOMIX(ISO).EQ.NNMIX) THEN
          DENISO(ISO)=DENISO(ISO)*RMAS1
        ENDIF
 100  CONTINUE
      DO 110 ISO=1,NBISO
        IF(ISOMIX(ISO).EQ.MIXCMB) THEN
*----
*  SCAN ISO IN NNMIX TO IDENTIFY IDENTICAL ISOTOPES
*----
          DO 111 JSO=1,NBISO
            IF(ISOMIX(JSO).EQ.NNMIX) THEN
              IF(ISONRF(1,JSO).EQ.ISONRF(1,ISO).AND.
     >           ISONRF(2,JSO).EQ.ISONRF(2,ISO)) THEN
                IF(ISONAM(1,JSO).NE.ISONAM(1,ISO).OR.
     >             ISONAM(2,JSO).NE.ISONAM(2,ISO).OR.
     >             TMPISO(JSO)  .NE.TMPISO(ISO)  .OR.
     >             LSHI(JSO)    .NE.LSHI(ISO)    .OR.
     >             SNISO(JSO)   .NE.SNISO(ISO)   .OR.
     >             SBISO(JSO)   .NE.SBISO(ISO)        ) THEN
                  WRITE(HSMG,'(17HLIBCMB: ISOTOPES ,3A4,5H AND ,3A4,
     >            18H CANNOT BE MERGED.)') (ISONAM(I,ISO),I=1,3),
     >            (ISONAM(I,JSO),I=1,3)
                  CALL XABORT(HSMG)
                ENDIF
                DENISO(JSO)=DENISO(JSO)+REAL(TOTWPC)*DENISO(ISO)*RMAS2
                GO TO 115
              ENDIF
            ENDIF
 111      CONTINUE
          ISO2=0
          DO 112 JSO=1,NBISO
            IF(ISOMIX(JSO).EQ.0) THEN
              ISO2=JSO
              GO TO 113
            ENDIF
 112      CONTINUE
          NEWISO=NEWISO+1
          IF(NEWISO.GT.MAXISO) CALL XABORT('LIBCMB: MAXISO OVERFLOW.')
          ISO2=NEWISO
 113      ISOMIX(ISO2)=NNMIX
          DENISO(ISO2)=REAL(TOTWPC)*DENISO(ISO)*RMAS2
          TMPISO(ISO2)=TMPISO(ISO)
          NTFG(ISO2)=NTFG(ISO)
          NIR(ISO2)=NIR(ISO)
          GIR(ISO2)=GIR(ISO)
          SNISO(ISO2)=SNISO(ISO)
          SBISO(ISO2)=SBISO(ISO)
          LSHI(ISO2)=LSHI(ISO)
          MASKI(ISO2)=.TRUE.
          IEVOL(ISO2)=IEVOL(ISO)
          ITYP(ISO2)=ITYP(ISO)
          DO 120 ITC=1,3
            ISONAM(ITC,ISO2)=ISONAM(ITC,ISO)
            ISONRF(ITC,ISO2)=ISONRF(ITC,ISO)
 120      CONTINUE
          SHINA(ISO2)=SHINA(ISO)
          DO 140 ILC=1,4
            HLIB(ISO2,ILC)=HLIB(ISO,ILC)
 140      CONTINUE
          ILLIB(ISO2)=ILLIB(ISO)
        ENDIF
 115    CONTINUE
 110  CONTINUE
 150  NBISO=NEWISO
      VOLTOT=CMBVOL
      RETURN
      END