summaryrefslogtreecommitdiff
path: root/Donjon/src/MACSCA.f
blob: 619ad4526bb8e2e4b3d423799aabf849a7bbdbe9 (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
*DECK MACSCA
      SUBROUTINE MACSCA(KPOLD,KPNEW,SCAT,SCAT2,CM,JGR,IL,MIX,NMXNEW,
     1 NTOT,NMXOLD,NL,NGRP,LMAP)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Recover scattering matrices and store them in a new macrolib for
* a given anistropic level and energy group.
*
*Copyright:
* Copyright (C) 2007 Ecole Polytechnique de Montreal.
*
*Author(s): 
* J. Koclas, E. Varin, D. Sekki
*
*Parameters: input
* KPOLD   pointer to group directory in the initial macrolib.
* NL      number of legendre orders (=1 for isotropic scattering).
* NGRP    number of energy groups.
* NMXOLD  number of material mixtures in the initial macrolib.
* NMXNEW  number of material mixtures in the final macrolib.
* MIX     index of all (material and virtual) mixtures per region.
* NTOT    total number of all (material and virtual) mixtures.
* SCAT    scattering matrices in the initial macrolib.
* SCAT2   scattering matrices in the final macrolib.
* IL      anisotropic level to be treated.
* JGR     energy group to be treated.
* CM      anisotropic level in I2.2 format.
* LMAP    flag for the initial macrolib:
*          =.true. if the fuel map macrolib.
*
*Parameters: output
* KPNEW   pointer to group directory in the final macrolib.
*
*-----------------------------------------------------------------------
*
      USE GANLIB
*----
*  SUBROUTINE ARGUMENTS
*----
      TYPE(C_PTR) KPOLD,KPNEW
      REAL SCAT(NMXOLD,NL,NGRP,NGRP),SCAT2(NMXNEW,NL,NGRP,NGRP)
      INTEGER MIX(NTOT)
      CHARACTER CM*2
      LOGICAL LMAP
*----
*  LOCAL VARIABLES
*----
      INTEGER, ALLOCATABLE, DIMENSION(:) :: IPOS,IPOS2
      INTEGER, ALLOCATABLE, DIMENSION(:,:,:) :: IJJ,IJJ2,NJJ,NJJ2
      REAL, ALLOCATABLE, DIMENSION(:) :: WORK,WORK2
      CHARACTER HSMG*131
*----
*  SCRATCH STORAGE ALLOCATION
*----
      ALLOCATE(IPOS(NMXOLD),IPOS2(NMXNEW),IJJ(NMXOLD,NL,NGRP),
     1 IJJ2(NMXNEW,NL,NGRP),NJJ(NMXOLD,NL,NGRP),NJJ2(NMXNEW,NL,NGRP))
      ALLOCATE(WORK(NMXOLD*NGRP),WORK2(NMXNEW*NGRP))
      WORK(:NMXOLD*NGRP)=0.0
      WORK2(:NMXNEW*NGRP)=0.0
*----
*  RECOVER EXISTING DATA
*----
      CALL LCMLEN(KPNEW,'NJJS'//CM,ILENG,ITYP)
      IF(LMAP.AND.(ILENG.GT.0))THEN
        IF(ILENG.NE.NMXNEW)CALL XABORT('@MACSCA: INVALID MACROLIB(1).')
        CALL LCMGET(KPNEW,'SCAT'//CM,WORK2(1))
        CALL LCMGET(KPNEW,'NJJS'//CM,NJJ2(1,IL,JGR))
        CALL LCMGET(KPNEW,'IJJS'//CM,IJJ2(1,IL,JGR))
        CALL LCMGET(KPNEW,'IPOS'//CM,IPOS2(1))
        DO 15 IBM=1,NMXNEW
          IJJ0=IJJ2(IBM,IL,JGR)
          IPOSDE=IPOS2(IBM)
          DO 10 IGR=IJJ0,IJJ0-NJJ2(IBM,IL,JGR)+1,-1
            SCAT2(IBM,IL,IGR,JGR)=WORK2(IPOSDE)
            IPOSDE=IPOSDE+1
   10     CONTINUE
   15   CONTINUE
      ENDIF
*----
*  RECOVER SCAT,IJJ,NJJ,IPOS
*----
      CALL LCMLEN(KPOLD,'NJJS'//CM,ILENG,ITYP)
      IF(ILENG.EQ.0)CALL XABORT('@MACSCA: INVALID MACROLIB(2).')
      CALL LCMGET(KPOLD,'SCAT'//CM,WORK(1))
      CALL LCMGET(KPOLD,'NJJS'//CM,NJJ(1,IL,JGR))
      CALL LCMGET(KPOLD,'IJJS'//CM,IJJ(1,IL,JGR))
      CALL LCMGET(KPOLD,'IPOS'//CM,IPOS(1))
      DO 25 IBM=1,NMXOLD
        IJJ0=IJJ(IBM,IL,JGR)
        IPOSDE=IPOS(IBM)
        DO 20 IGR=IJJ0,IJJ0-NJJ(IBM,IL,JGR)+1,-1
          SCAT(IBM,IL,IGR,JGR)=WORK(IPOSDE)
          IPOSDE=IPOSDE+1
   20   CONTINUE
   25 CONTINUE
*----
*  NEW SCAT2
*----
      ITOT=0
      DO 50 IBM=1,NTOT
      IF(MIX(IBM).EQ.0)GOTO 50
      ITOT=ITOT+1
      IF(LMAP)THEN
*     ONLY FUEL DATA WILL BE COPIED
        IF(MIX(IBM).GT.0)GOTO 50
        J=-MIX(IBM)
        IF(J.GT.NMXOLD) THEN
          WRITE(HSMG,'(25HMACSCA: A MIXTURE INDEX (,I6,12H) IS GREATER,
     >    36H THAN THE TOTAL NUMBER OF MIXTURES (,I6,14H) IN 2ND RHS M,
     >    8HACROLIB.)') J,NMXOLD
          CALL XABORT(HSMG)
        ENDIF
      ELSE
*     FUEL DATA WILL NOT BE COPIED
        IF(MIX(IBM).LT.0)GOTO 50
        J=MIX(IBM)
        IF(J.GT.NMXOLD) THEN
          WRITE(HSMG,'(25HMACSCA: A MIXTURE INDEX (,I6,12H) IS GREATER,
     >    36H THAN THE TOTAL NUMBER OF MIXTURES (,I6,14H) IN 1ST RHS M,
     >    8HACROLIB.)') J,NMXOLD
          CALL XABORT(HSMG)
        ENDIF
      ENDIF
*     COPY DATA
      IJJ0=IJJ(J,IL,JGR)
      DO 40 IGR=IJJ0,IJJ0-NJJ(J,IL,JGR)+1,-1
        SCAT2(ITOT,IL,IGR,JGR)=SCAT(J,IL,IGR,JGR)
   40 CONTINUE
   50 CONTINUE
*----
*  NEW IJJ2 AND NJJ2
*----
      DO 70 IBM=1,NMXNEW
        IGMIN=JGR
        IGMAX=JGR
        DO 60 IGR=NGRP,1,-1
        IF(SCAT2(IBM,IL,IGR,JGR).NE.0.)THEN
          IGMIN=MIN(IGMIN,IGR)
          IGMAX=MAX(IGMAX,IGR)
        ENDIF
   60   CONTINUE
      IJJ2(IBM,IL,JGR)=IGMAX
      NJJ2(IBM,IL,JGR)=IGMAX-IGMIN+1
   70 CONTINUE
*----
*  STORE SCAT2,IJJ2,NJJ2,IPOS2
*----
      IPOSDE=0
      DO 85 IBM=1,NMXNEW
        IPOS2(IBM)=IPOSDE+1
        DO 80 IGR=IJJ2(IBM,IL,JGR),IJJ2(IBM,IL,JGR)-
     1            NJJ2(IBM,IL,JGR)+1,-1
          IPOSDE=IPOSDE+1
          WORK2(IPOSDE)=SCAT2(IBM,IL,IGR,JGR)
   80   CONTINUE
   85 CONTINUE
      CALL LCMPUT(KPNEW,'SCAT'//CM,IPOSDE,2,WORK2)
      CALL LCMPUT(KPNEW,'IPOS'//CM,NMXNEW,1,IPOS2)
      CALL LCMPUT(KPNEW,'NJJS'//CM,NMXNEW,1,NJJ2(1,IL,JGR))
      CALL LCMPUT(KPNEW,'IJJS'//CM,NMXNEW,1,IJJ2(1,IL,JGR))
*----
*  SCRATCH STORAGE DEALLOCATION
*----
      DEALLOCATE(WORK2,WORK)
      DEALLOCATE(NJJ2,NJJ,IJJ2,IJJ,IPOS2,IPOS)
      RETURN
      END