summaryrefslogtreecommitdiff
path: root/Dragon/src/MACNXS.f
blob: 255e8840e87b961523639c970ec6abac9f16482e (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
*DECK MACNXS
      SUBROUTINE MACNXS(IPLIST,MAXFIS,NGROUP,NBMIX,NIFISS,NANISO)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Normalization of macroscopic cross section information.
*
*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
* IPLIST  LCM pointer to the macrolib.
* MAXFIS  set to max(1,NIFISS).
* NGROUP  number of energy groups.
* NBMIX   number of mixtures.
* NIFISS  number of fissile isotopes.
* NANISO  maximum Legendre order:
*         =1 isotropic collision;
*         =2 linearly anisotropic collision.
*
*-----------------------------------------------------------------------
*
      USE GANLIB
*----
*  SUBROUTINE ARGUMENTS
*----
      TYPE(C_PTR) IPLIST
      INTEGER    MAXFIS,NGROUP,NBMIX,NIFISS,NANISO
*----
*  LOCAL VARIABLES
*----
      TYPE(C_PTR) JPLIST,KPLIST
      CHARACTER  CANISO*2
*----
* ALLOCATABLE ARRAYS
*----
      INTEGER, ALLOCATABLE, DIMENSION(:) :: INGSCT,IFGSCT
      REAL, ALLOCATABLE, DIMENSION(:) :: XSWORK,XSWOR2
      REAL, ALLOCATABLE, DIMENSION(:,:) :: CHWORK
      DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:,:) :: SCWORK
*----
*  SCRATCH STORAGE ALLOCATION
*   INGSCT  number of scattering group for cross sections.
*   IFGSCT  first scattering group for cross sections.
*----
      ALLOCATE(INGSCT(NBMIX),IFGSCT(NBMIX))
      ALLOCATE(XSWORK(NBMIX*NGROUP),XSWOR2(NBMIX*NIFISS),
     >         CHWORK(NBMIX,MAXFIS))
      ALLOCATE(SCWORK(NBMIX,NANISO,NGROUP))
*
      DO 100 IMIX=1,NBMIX
        DO 110 IAN=1,NANISO
          DO 120 IG=1,NGROUP
            SCWORK(IMIX,IAN,IG)=0.0D0
 120      CONTINUE
 110    CONTINUE
        DO 130 JFIS=1,NIFISS
          CHWORK(IMIX,JFIS)=0.0
 130    CONTINUE
 100  CONTINUE
      JPLIST=LCMGID(IPLIST,'GROUP')
      DO 140 IGR=1,NGROUP
        KPLIST=LCMGIL(JPLIST,IGR)
*----
*  COMPUTE SUM OF FISSION SPECTRUM.
*----
        CALL LCMLEN(KPLIST,'CHI',ILCMLN,ITYLCM)
        IF(ILCMLN.GT.0) THEN
          CALL LCMGET(KPLIST,'CHI',XSWOR2)
          DO 150 IFISS=1,NIFISS
            DO 160 IMAT=1,NBMIX
              CHWORK(IMAT,IFISS)=CHWORK(IMAT,IFISS)
     >                          +XSWOR2((IFISS-1)*NBMIX+IMAT)
 160        CONTINUE
 150      CONTINUE
        ENDIF
*----
*  SUM TRANSFER MATRICES OVER SECONDARY GROUPS.
*----
        DO 170 IANIS=1,NANISO
          WRITE(CANISO,'(I2.2)') IANIS-1
          CALL LCMLEN(KPLIST,'NJJS'//CANISO,ILCMLN,ITYLCM)
          IF(ILCMLN.GT.0) THEN
            CALL LCMGET(KPLIST,'NJJS'//CANISO,INGSCT)
            CALL LCMGET(KPLIST,'IJJS'//CANISO,IFGSCT)
            CALL LCMGET(KPLIST,'SCAT'//CANISO,XSWORK)
            IPO=0
            DO 180 IMAT=1,NBMIX
              IDG=IFGSCT(IMAT)
              IFG=IDG-INGSCT(IMAT)+1
              DO 190 JGR=IDG,IFG,-1
                IPO=IPO+1
                SCWORK(IMAT,IANIS,JGR)=SCWORK(IMAT,IANIS,JGR)
     >                                +XSWORK(IPO)
 190          CONTINUE
 180        CONTINUE
          ENDIF
 170    CONTINUE
 140  CONTINUE
*----
*  WRITE NORMALIZED X-S ON THE MACROLIB.
*----
      DO 200 IGR=1,NGROUP
        KPLIST=LCMGIL(JPLIST,IGR)
        CALL LCMLEN(KPLIST,'CHI',ILCMLN,ITYLCM)
        IF(ILCMLN.GT.0) THEN
          CALL LCMGET(KPLIST,'CHI',XSWOR2)
          DO 210 IFISS=1,NIFISS
            DO 220 IMAT=1,NBMIX
              IF(CHWORK(IMAT,IFISS).GT.0.5) XSWOR2((IFISS-1)*NBMIX+IMAT)
     >        =XSWOR2((IFISS-1)*NBMIX+IMAT)/CHWORK(IMAT,IFISS)
 220        CONTINUE
 210      CONTINUE
          CALL LCMPUT(KPLIST,'CHI',NBMIX*NIFISS,2,XSWOR2)
        ENDIF
        DO 230 IANIS=1,NANISO
          WRITE(CANISO,'(I2.2)') IANIS-1
          CALL LCMLEN(KPLIST,'SIGS'//CANISO,ILCMLN,ITYLCM)
          IF(ILCMLN.GT.0) THEN
            DO 240 IMAT=1,NBMIX
              XSWORK(IMAT)=REAL(SCWORK(IMAT,IANIS,IGR))
 240        CONTINUE
            CALL LCMPUT(KPLIST,'SIGS'//CANISO,NBMIX,2,XSWORK)
          ENDIF
 230    CONTINUE
 200  CONTINUE
*----
*  SCRATCH STORAGE DEALLOCATION
*----
      DEALLOCATE(SCWORK)
      DEALLOCATE(CHWORK,XSWOR2,XSWORK)
      DEALLOCATE(IFGSCT,INGSCT)
      RETURN
      END