summaryrefslogtreecommitdiff
path: root/Donjon/src/CREXSI.f
blob: 4819bf46355555f2f3c2a9c8e308fb7ce60a6193 (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
*DECK CREXSI
      SUBROUTINE CREXSI(IPMAP,NENTRY,HENTRY,KENTRY,NMIX,NGRP,NL,ILEAK,
     1 IMPX,TOTAL,ZNUG,SNUGF,CHI,OVERV,DIFFX,DIFFY,DIFFZ,H,IJJ,NJJ,SCAT)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Recover and/or interpolate l_compo data.
*
*Copyright:
* Copyright (C) 2007 Ecole Polytechnique de Montreal.
*
*Author(s): 
* A. Hebert, D. Sekki
*
*Parameters: input
* IPMAP   pointer to the fuel-map information.
* NENTRY  number of lcm or xsm objects used by the module.
* HENTRY  character*12 name of each lcm or xsm objects.
* KENTRY  pointers to the lcm or xsm objects.
* NMIX    maximum number of material mixtures.
* NGRP    number of energy groups.
* NL      number of legendre orders (=1 for isotropic scattering).
* ILEAK   diffusion coefficient flag (=1: isotropic; =2: anisotropic).
* IMPX    printing index (=0 for no print).
*
*Parameters: output
* TOTAL   total macroscopic x-sections.
* ZNUG    nu*fission macroscopic x-sections.
* SNUGF   fission macroscopic x-sections.
* CHI     fission spectrum.
* OVERV   reciprocal neutron velocities.
* DIFFX   x-directed diffusion coefficients.
* DIFFY   y-directed diffusion coefficients.
* DIFFZ   z-directed diffusion coefficients.
* H       h-factors (kappa*fission macroscopic x-sections).
* IJJ     profile storage index.
* NJJ     profile storage width.
* SCAT    scattering macroscopic x-sections.
*
*-----------------------------------------------------------------------
*
      USE GANLIB
*----
*  SUBROUTINE ARGUMENTS
*----
      INTEGER NENTRY,NMIX,NGRP,NL,ILEAK,IMPX,IJJ(NMIX,NL,NGRP),
     1 NJJ(NMIX,NL,NGRP)
      TYPE(C_PTR) IPMAP,KENTRY(NENTRY)
      CHARACTER HENTRY(NENTRY)*12
      REAL TOTAL(NMIX,NGRP),ZNUG(NMIX,NGRP),SNUGF(NMIX,NGRP),
     1     CHI(NMIX,NGRP),OVERV(NMIX,NGRP),DIFFX(NMIX,NGRP),
     2     DIFFY(NMIX,NGRP),DIFFZ(NMIX,NGRP),H(NMIX,NGRP),
     3     SCAT(NMIX,NL,NGRP,NGRP)
*----
*  LOCAL VARIABLES
*----
      TYPE(C_PTR) IPCPO,JPCPO,JPMAP,KPMAP
      PARAMETER(NSTATE=40,IOUT=6)
      CHARACTER TEXT*12,NAMDIR*12,HCOMPO*12,HSMG*131
      INTEGER IPAR(NSTATE),IDATA(NSTATE)
      LOGICAL DERIV,UPS,LTAB
      DOUBLE PRECISION DFLOT
      REAL, ALLOCATABLE, DIMENSION(:) :: YTOTAL,YZNUG,YNUGF,YCHI,YOVERV,
     1 YDIFX,YDIFY,YDIFZ,YH,YSCAT,YFLUX
      INTEGER, ALLOCATABLE, DIMENSION(:) :: HISO,ITY,FMIX
      REAL, ALLOCATABLE, DIMENSION(:) :: CONC,BURNU,BRN0,BRN1
*
      IVARTY=0
      UPS=.FALSE.
      LTAB=.FALSE.
      DERIV=.FALSE.
      NFUEL=0
      MAXEN=NENTRY
      IF(C_ASSOCIATED(IPMAP))THEN
        CALL LCMGET(IPMAP,'STATE-VECTOR',IDATA)
        IF(IDATA(4).NE.NGRP)CALL XABORT('@CREXSI: DIFFERENT NUM'
     1   //'BER OF ENERGY GROUPS IN COMPO AND FUEL MAP.')
        NB=IDATA(1)
        NCH=IDATA(2)
        NFUEL=IDATA(7)
        MAXEN=MAXEN-1
        LTAB=.TRUE.
      ENDIF
*----
*  READ INTERPOLATION OPTION
*----
      CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
      DO 200 IEN=2,MAXEN
*     KEYWORD COMPO OR TABLE
      IF(TEXT.EQ.'COMPO')THEN
        IF(C_ASSOCIATED(IPMAP))CALL XABORT('@CREXSI: ONLY USE '
     1   //'OF EITHER COMPO OR TABLE OPTION. BOTH OPTIONS ARE '
     2   //'NOT ALLOWED.')
      ELSEIF(TEXT.EQ.'TABLE')THEN
        IF(.NOT.C_ASSOCIATED(IPMAP))CALL XABORT('@CREXSI: MISS'
     1   //'ING FUEL MAP.')
      ELSE
        CALL XABORT('@CREXSI: KEYWORD COMPO OR TABLE EXPECTED.')
      ENDIF
*     COMPO NAME
      CALL REDGET(ITYP,NITMA,FLOT,HCOMPO,DFLOT)
      IF(ITYP.NE.3)CALL XABORT('@CREXSI: COMPO NAME EXPECTED.')
      DO JEN=2,MAXEN
        IF(HCOMPO.EQ.HENTRY(JEN))THEN
          IPCPO=KENTRY(JEN)
          IF(IMPX.GT.1)CALL LCMLIB(IPCPO)
          GOTO 10
        ENDIF
      ENDDO
      WRITE(HSMG,'(44HCREXSI: UNABLE TO FIND THE COMPO WITH NAME '',
     1      A12,2H''.)') TEXT
      CALL XABORT(HSMG)
*----
*  READ MIX INFO
*----
   10 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
      IF(TEXT.NE.'MIX')CALL XABORT('@CREXSI: KEYWORD MIX EXPECTED.')
      CALL LCMGET(IPCPO,'STATE-VECTOR',IPAR)
      NGRP1=IPAR(2)
      NL1=IPAR(4)
      NISO=IPAR(3)
      IF(NGRP1.NE.NGRP)THEN
        WRITE(HSMG,'(43HCREXSI: INCONSISTENT NB OF GROUPS. IN MACRO,
     1        5HLIB =,I5,11H IN COMPO =,I5)') NGRP,NGRP1
        CALL XABORT(HSMG)
      ENDIF
      IF(NL1.LT.NL)THEN
        WRITE(HSMG,'(43HCREXSI: INCONSISTENT NB OF LEGENDRE ORDERS.,
     1        14H IN MACROLIB =,I5,11H IN COMPO =,I5)') NL,NL1
        CALL XABORT(HSMG)
      ENDIF
   20 ALLOCATE(HISO(3*NISO),ITY(NISO),CONC(NISO))
      CALL CREXSR(IPCPO,LTAB,HCOMPO,NMIX,IMPX,NISO,IBM,DERIV,UPS,
     1            NAMDIR,NISO1,HISO,ITY,CONC,NBURN,KBURN,IVARTY,
     2            IBTYP,BURN0,BURN1)
      JPCPO=LCMGID(IPCPO,NAMDIR)
*----
*  TABLE-OPTION INTERPOLATION
*----
      IF(LTAB)THEN
*       CHECK FUEL MIXTURE
        JPMAP=LCMGID(IPMAP,'FUEL')
        DO 30 IFUEL=1,NFUEL
        KPMAP=LCMGIL(JPMAP,IFUEL)
        CALL LCMGET(KPMAP,'MIX',IMIX)
        IF(IMIX.EQ.IBM)GOTO 40
        CALL LCMLEN(KPMAP,'MIX-VOID',LENGT,ITYP)
        IF(LENGT.EQ.0)GOTO 30
        CALL LCMGET(KPMAP,'MIX-VOID',IMIX)
        IF(IMIX.EQ.IBM)GOTO 40
   30   CONTINUE
        WRITE(IOUT,*)'@CREXSI: UNABLE TO FIND FUEL MIXTURE ',IBM
        CALL XABORT('@CREXSI: WRONG MIXTURE NUMBER.')
*
   40   ALLOCATE(BURNU(NBURN),BRN0(NCH*NB),BRN1(NCH*NB),FMIX(NCH*NB))
        CALL CRERGR(JPCPO,IPMAP,NISO1,NGRP,NMIX,NL,IBM,IMPX,IBTYP,DERIV,
     1  UPS,NBURN,BURNU,ILEAK,TOTAL,ZNUG,SNUGF,CHI,OVERV,DIFFX,DIFFY,
     2  DIFFZ,H,SCAT,IJJ,NJJ,HISO,ITY,CONC,FMIX,BRN0,BRN1,NCH,NB,IVARTY)
        DEALLOCATE(FMIX,BRN1,BRN0,BURNU)
        DEALLOCATE(CONC,ITY,HISO)
*----
*  COMPO-OPTION INTERPOLATION
*----
      ELSE
        ALLOCATE(YTOTAL(NGRP),YZNUG(NGRP),YNUGF(NGRP),YCHI(NGRP),
     1  YOVERV(NGRP),YDIFX(NGRP),YDIFY(NGRP),YDIFZ(NGRP),YH(NGRP),
     2  YSCAT(NL*NGRP*NGRP),YFLUX(NGRP))
        CALL CREINT(JPCPO,NISO1,DERIV,NBURN,KBURN,BURN0,BURN1,NGRP,
     1  NL,IMPX,HISO,ITY,CONC,ILEAK,YTOTAL,YZNUG,YNUGF,YCHI,YOVERV,
     2  YDIFX,YDIFY,YDIFZ,YH,YSCAT,YFLUX,UPS)
*       DATA STORAGE.
        DO 112 JGR=1,NGRP
          TOTAL(IBM,JGR)=YTOTAL(JGR)
          ZNUG(IBM,JGR)=YZNUG(JGR)
          SNUGF(IBM,JGR)=YNUGF(JGR)
          CHI(IBM,JGR)=YCHI(JGR)
          OVERV(IBM,JGR)=YOVERV(JGR)
          DIFFX(IBM,JGR)=YDIFX(JGR)
          DIFFY(IBM,JGR)=YDIFY(JGR)
          DIFFZ(IBM,JGR)=YDIFZ(JGR)
          H(IBM,JGR)=YH(JGR)
          DO 111 IGR=1,NGRP
          DO 110 IL=1,NL
            SCAT(IBM,IL,IGR,JGR)=YSCAT(NL*((JGR-1)*NGRP+IGR-1)+IL)
  110     CONTINUE
  111     CONTINUE
  112   CONTINUE
        DEALLOCATE(YFLUX,YSCAT,YH,YDIFZ,YDIFY,YDIFX,YOVERV,YCHI,YNUGF,
     1  YZNUG,YTOTAL)
        DEALLOCATE(CONC,ITY,HISO)
*       JGR IS THE SECONDARY GROUP.
        DO 135 JGR=1,NGRP
        DO 130 IL=1,NL
        IGMIN=JGR
        IGMAX=JGR
        DO IGR=NGRP,1,-1
          IF(SCAT(IBM,IL,IGR,JGR).NE.0.)THEN
            IGMIN=MIN(IGMIN,IGR)
            IGMAX=MAX(IGMAX,IGR)
          ENDIF
        ENDDO
        IJJ(IBM,IL,JGR)=IGMAX
        NJJ(IBM,IL,JGR)=IGMAX-IGMIN+1
  130   CONTINUE
  135   CONTINUE
      ENDIF
      CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
      IF(TEXT.EQ.'MIX')GOTO 20
  200 CONTINUE
      IF(TEXT.NE.';') CALL XABORT('@CREXSI: FINAL ; EXPECTED.')
      RETURN
      END