summaryrefslogtreecommitdiff
path: root/Dragon/src/MOCDS2.f
blob: b6e72c89dee1331cd29b24d78c613c697b9e8613 (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
*DECK MOCDS2
      SUBROUTINE MOCDS2(SUBDSC,LC,M,N,H,NOM,NZON,TR,SC,W,NFI,DIAGF,
     1                  DIAGQ,CA,CQ,PREV,NEXT,DINV2,A2,B2)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Calculation of contribution in second-order ACA coefficients on one
* track.
*
*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): I. Suslov and R. Le Tellier
*
*Parameters: input
* SUBDSC  ACA coefficients calculation subroutine.
* LC      dimension of vector MCU.
* M       number of material mixtures.
* N       number of elements for this track.
* H       tracking widths.
* NOM     integer tracking elements.
* NZON    index-number of the mixture type assigned to each volume.
* TR      macroscopic total cross section.
* SC      macroscopic P0 scattering cross section.
* W       weight associated with this track.
* NFI     total number of volumes for which specific values
*         of the neutron flux and reactions rates are required.
*
*Parameters: input/output
* CA      undefined.
* CQ      undefined.
* DIAGQ   undefined.
* DIAGF   undefined.
*
*Parameters: scratch
* PREV    undefined.
* NEXT    undefined.
* DINV2   undefined.
* A2      undefined.
* B2      undefined.
*
*-----------------------------------------------------------------------
*
      IMPLICIT NONE
*
*---
* SUBROUTINE ARGUMENTS
*---
      INTEGER LC,M,N,NFI,NZON(NFI),NOM(N),PREV(N),NEXT(N)
      DOUBLE PRECISION W,H(N),CA(LC),DIAGF(NFI),DINV2(N),A2(N),B2(N)
      REAL TR(0:M),SC(0:M),DIAGQ(NFI),CQ(LC)
      EXTERNAL SUBDSC
*---
* LOCAL VARIABLES
*---
      INTEGER IBCV
      DOUBLE PRECISION DMINV,DMAX
      PARAMETER(DMINV=2.D-2,IBCV=-7)
      DOUBLE PRECISION WW,AAW,CAW,AQW,CQW,CAWP,CQWP,B,A,DINV,DH,DHP,
     1 BN,AN,DINVN,BP,AP,DINVP
      INTEGER I,I1,NOMI,NZI,NOMIN,NZIN,NOMIP,NZIP,ICN,ICP
*
      DMAX=1.D0/DMINV
      WW=W
*---
*  CALCULATE COEFFICIENTS OF THIS TRACK
*---
*          MCGDS2A: Tabulated Exponentials
*          MCGDS2E: Exact Exponentials
      CALL SUBDSC(N,M,NFI,NOM,NZON,H,TR,SC,DINV2,B2,A2)
*----
*  CONSTRUCTION OF ACA MATRICES
*---
      NOMIN=0
      NZIN=0
      NOMI=0
      NZI=0
      DHP=0.0D0
      DH=0.0D0
      AN=0.0D0
      BN=0.0D0
      AP=0.0D0
      BP=0.0D0
      DO I=1,N
         ICN=NEXT(I)
         ICP=PREV(I)
         IF (I.GT.1) THEN
            NOMIP=NOMI
            NZIP=NZI
            NOMI=NOMIN
            NZI=NZIN
         ELSE
            NOMIP=NOM(N)
            NZIP=NZON(NOMIP)
            NOMI=NOM(1)
            NZI=NZON(NOMI)
         ENDIF
         IF (I.LT.N) THEN
            NOMIN=NOM(I+1)
            NZIN=NZON(NOMIN)
         ELSE
            NOMIN=NOM(1)
            NZIN=NZON(NOMIN)
         ENDIF
         IF (NZI.GE.0) THEN
*        -----------
*        Volume Cell
*        -----------
            DINV=DINV2(I)
            B=B2(I)
            A=A2(I)
            IF (NZIN.GE.0) THEN
*           next cell is a volume
               IF (I.EQ.N) THEN
                  I1=1
               ELSE
                  I1=I+1
               ENDIF
               DINVN=DINV2(I1)
               BN=B2(I1)
               AN=A2(I1)
               IF (ABS(DINV+DINVN).LT.DMINV) THEN
                  DH=DMAX
               ELSE
                  DH=1.D0/(DINV+DINVN)
               ENDIF
            ELSEIF (NZIN.EQ.IBCV) THEN
*           next cell is a fixed boundary condition
               DH=1.D0/(1.D0+DINV)
            ENDIF
            IF (NZIP.GE.0) THEN
*           previous cell is a volume
               IF (I.EQ.1) THEN
                  I1=N
               ELSE
                  I1=I-1
               ENDIF
               DINVP=DINV2(I1)
               BP=B2(I1)
               AP=A2(I1)               
               IF (ABS(DINV+DINVP).LT.DMINV) THEN
                  DHP=DMAX
               ELSE
                  DHP=1.D0/(DINV+DINVP)
               ENDIF
            ELSEIF (NZIP.EQ.IBCV) THEN
*           previous cell is a fixed boundary condition
               DHP=1.D0/(1.D0+DINV)
            ENDIF
*
*           assembling coefficients
            AAW=DH*A
            AQW=DH*B
            IF(NZIN.GE.0) THEN
*           next cell is a volume
               CAW=DH*AN
               CQW=DH*BN
            ELSE
*           next cell is a voided boundary condition
               CAW=0.D0
               CQW=0.D0
            ENDIF
*
            AAW=AAW+DHP*A
            AQW=AQW+DHP*B
            IF(NZIP.GE.0) THEN
*           previous cell is a volume
               CAWP=DHP*AP
               CQWP=DHP*BP
            ELSE
*           previous cell is a voided boundary condition
               CAWP=0.D0
               CQWP=0.D0
            ENDIF
*
*           assembling matrices
            DIAGF(NOMI)=DIAGF(NOMI)+AAW*WW
            DIAGQ(NOMI)=DIAGQ(NOMI)-REAL(W*AQW)
            IF(ICN.GT.0) THEN
*           next cell is a volume different from this one
               CA(ICN)=CA(ICN)-CAW*WW
               CQ(ICN)=CQ(ICN)+REAL(W*CQW)
            ELSE
*           next cell is a voided boundary or a volume identical to this one
                DIAGF(NOMI)=DIAGF(NOMI)-CAW*WW
                DIAGQ(NOMI)=DIAGQ(NOMI)+REAL(W*CQW)
            ENDIF 
            IF(ICP.GT.0) THEN
*           previous cell is a volume different from this one
               CA(ICP)=CA(ICP)-CAWP*WW
               CQ(ICP)=CQ(ICP)+REAL(W*CQWP)
            ELSE
*           previous cell is a voided boundary or a volume identical to this one
                DIAGF(NOMI)=DIAGF(NOMI)-CAWP*WW
                DIAGQ(NOMI)=DIAGQ(NOMI)+REAL(W*CQWP)
            ENDIF 
         ENDIF
*        -----------
      ENDDO
*
      RETURN
      END