summaryrefslogtreecommitdiff
path: root/Dragon/src/DUODRV.f
blob: 6e12abe8b1e82a1d5108784b5da3867f8ca86438 (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 DUODRV
      SUBROUTINE DUODRV(IPLIB1,IPLIB2,IPRINT,LENER,LISOT,LMIXT,LREAC,
     > NMIX,NISOT,NGRP)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Compare two microlibs and analyse the discrepancies using the Keff
* Clio perturbation formula.
*
*Copyright:
* Copyright (C) 2013 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): A. Hebert
*
*Parameters: input
* IPLIB1  first microlib.
* IPLIB2  second microlib.
* IPRINT  print parameter.
* LENER   energy group analysis flag.
* LISOT   isotope analysis flag.
* LMIXT   mixture analysis flag.
* LREAC   nuclear reaction analysis flag.
* NMIX    number of mixtures.
* NISOT   number of isotopes.
* NGRP    number of energy groups.
*
*-----------------------------------------------------------------------
*
      USE GANLIB
*----
*  SUBROUTINE ARGUMENTS
*----
      TYPE(C_PTR) IPLIB1,IPLIB2
      INTEGER IPRINT,NMIX,NISOT,NGRP
      LOGICAL LENER,LISOT,LMIXT,LREAC
*----
*  LOCAL VARIABLES
*----
      PARAMETER (NSTATE=40)
      INTEGER ISTATE(NSTATE)
      DOUBLE PRECISION DBLLIR
      CHARACTER HREAC*8,CARLIR*12
*----
*  ALLOCATABLE ARRAYS
*----
      REAL, ALLOCATABLE, DIMENSION(:,:) :: FLUX1,AFLUX1,FLUX2,AFLUX2,
     > FLUXI1,AFLUXI1,FLUXI2,AFLUXI2
      REAL, ALLOCATABLE, DIMENSION(:,:,:) :: RHS1,LHS1,RHS2,LHS2,RHSI1,
     > LHSI1,RHSI2,LHSI2
*----
*  SCRATCH STORAGE ALLOCATION
*   RHS1    absorption macroscopic cross-section matrix
*   LHS1    production macroscopic cross-section matrix
*   FLUX1   direct flux
*   AFLUX1  adjoint flux flux
*   RHS2    absorption macroscopic cross-section matrix
*   LHS2    production macroscopic cross-section matrix
*   FLUX2   direct flux
*   AFLUX2  adjoint flux flux
*   RHSI1   absorption macroscopic cross-section matrix
*   LHSI1   production macroscopic cross-section matrix
*   FLUXI1  direct flux
*   AFLUXI1 adjoint flux flux
*   RHSI2   absorption macroscopic cross-section matrix
*   LHSI2   production macroscopic cross-section matrix
*   FLUXI2  direct flux
*   AFLUXI2 adjoint flux flux
*----
      ALLOCATE(RHS1(NGRP,NGRP,NMIX),LHS1(NGRP,NGRP,NMIX),
     > FLUX1(NGRP,NMIX),AFLUX1(NGRP,NMIX),RHS2(NGRP,NGRP,NMIX),
     > LHS2(NGRP,NGRP,NMIX),FLUX2(NGRP,NMIX),AFLUX2(NGRP,NMIX),
     > RHSI1(NGRP,NGRP,NISOT+NMIX),LHSI1(NGRP,NGRP,NISOT+NMIX),
     > FLUXI1(NGRP,NISOT+NMIX),AFLUXI1(NGRP,NISOT+NMIX),
     > RHSI2(NGRP,NGRP,NISOT+NMIX),LHSI2(NGRP,NGRP,NISOT+NMIX),
     > FLUXI2(NGRP,NISOT+NMIX),AFLUXI2(NGRP,NISOT+NMIX))
*----
*  -- MIXTURE KEYWORD --
*  CONSTRUCT THE RHS AND LHS MATRICES FOR THE FIRST SYSTEM
*----
      IF(.NOT.LMIXT) GO TO 100
      IF(IPRINT.GT.1) THEN
        WRITE(6,'(/48H DUODRV: ANALYSIS OF THE FIRST SYSTEM -- MIXTURE,
     >  8H KEYWORD)')
      ENDIF
      CALL LCMSIX(IPLIB1,'MACROLIB',1)
      CALL LCMGET(IPLIB1,'STATE-VECTOR',ISTATE)
      NFIS=ISTATE(4)
      CALL DUO001(IPLIB1,IPRINT,NMIX,NGRP,NFIS,3,ZKEFF1,RHS1,LHS1,FLUX1,
     > AFLUX1)
      CALL LCMSIX(IPLIB1,' ',2)
*----
*  CONSTRUCT THE RHS AND LHS MATRICES FOR THE SECOND SYSTEM
*----
      IF(IPRINT.GT.1) THEN
        WRITE(6,'(/48H DUODRV: ANALYSIS OF THE SECOND SYSTEM -- MIXTUR,
     >  9HE KEYWORD)')
      ENDIF
      CALL LCMSIX(IPLIB2,'MACROLIB',1)
      CALL LCMGET(IPLIB2,'STATE-VECTOR',ISTATE)
      NFIS=ISTATE(4)
      CALL DUO001(IPLIB2,IPRINT,NMIX,NGRP,NFIS,3,ZKEFF2,RHS2,LHS2,FLUX2,
     > AFLUX2)
      CALL LCMSIX(IPLIB2,' ',2)
*----
*  PRINT THE DETAILED DELTA-RHO USING THE CLIO FORMULA
*----
      IF(IPRINT.GT.1) THEN
        WRITE(6,'(/33H DUODRV: PERFORMING CLIO ANALYSIS)')
      ENDIF
      CALL DUO002(IPRINT,NMIX,NGRP,LENER,ZKEFF1,ZKEFF2,RHS1,RHS2,
     > LHS1,LHS2,FLUX2,AFLUX1)
*----
*  -- ISOTOPE KEYWORD --
*  CONSTRUCT THE RHS AND LHS MATRICES FOR THE FIRST SYSTEM
*----
  100 IF(.NOT.LISOT) GO TO 200
      IF(IPRINT.GT.1) THEN
        WRITE(6,'(/48H DUODRV: ANALYSIS OF THE FIRST SYSTEM -- ISOTOPE,
     >  8H KEYWORD)')
      ENDIF
      CALL DUO003(IPLIB1,IPRINT,NMIX,NISOT,NGRP,3,ZKEFF1,RHSI1,
     > LHSI1,FLUXI1,AFLUXI1)
*----
*  CONSTRUCT THE RHS AND LHS MATRICES FOR THE SECOND SYSTEM
*----
      IF(IPRINT.GT.1) THEN
        WRITE(6,'(/48H DUODRV: ANALYSIS OF THE SECOND SYSTEM -- ISOTOP,
     >  9HE KEYWORD)')
      ENDIF
      CALL DUO003(IPLIB2,IPRINT,NMIX,NISOT,NGRP,3,ZKEFF2,RHSI2,
     > LHSI2,FLUXI2,AFLUXI2)
*----
*  PRINT THE DETAILED DELTA-RHO USING THE CLIO FORMULA
*----
      IF(IPRINT.GT.1) THEN
        WRITE(6,'(/33H DUODRV: PERFORMING CLIO ANALYSIS)')
      ENDIF
      CALL DUO004(IPLIB1,IPRINT,NMIX,NISOT,NGRP,LENER,ZKEFF1,ZKEFF2,
     > RHSI1,RHSI2,LHSI1,LHSI2,FLUXI2,AFLUXI1)
*----
*  -- REAC KEYWORD --
*----
  200 IF(.NOT.LREAC) GO TO 230
      CALL DUO003(IPLIB2,0,NMIX,NISOT,NGRP,3,ZKEFF2,RHSI2,LHSI2,
     > FLUXI2,AFLUXI2)
*
  210 CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR)
      IF(ITYPLU.NE.3) CALL XABORT('DUODRV: READ ERROR - CHARACTER VA'
     >  //'RIABLE EXPECTED')
  220 IF(CARLIR.EQ.'ENDREAC') THEN
        CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR)
        IF(ITYPLU.NE.3) CALL XABORT('DUODRV: READ ERROR - CHARACTER '
     >  //'VARIABLE EXPECTED')
        IF(CARLIR.NE.';') CALL XABORT('DUODRV: ; KEYWORD EXPECTED')
        GO TO 230
      ENDIF
      HREAC=CARLIR(:8)
*----
*  CONSTRUCT THE RHS MATRIX FOR THE FIRST SYSTEM
*----
      IF(IPRINT.GT.1) THEN
        WRITE(6,'(/49H DUODRV: ANALYSIS OF THE FIRST SYSTEM -- REACTION,
     >  1X,A8,1H.)') HREAC
      ENDIF
      CALL DUO006(IPLIB1,IPRINT,NISOT,NGRP,HREAC,3,RHSI1,FLUXI1,AFLUXI1)
*----
*  CONSTRUCT THE RHS MATRIX FOR THE SECOND SYSTEM
*----
      IF(IPRINT.GT.1) THEN
        WRITE(6,'(/48H DUODRV: ANALYSIS OF THE SECOND SYSTEM -- REACTI,
     >  2HON,1X,A8,1H.)') HREAC
      ENDIF
      CALL DUO006(IPLIB2,IPRINT,NISOT,NGRP,HREAC,3,RHSI2,FLUXI2,AFLUXI2)
*----
*  PRINT THE DETAILED DELTA-RHO USING THE CLIO FORMULA
*----
      IF(IPRINT.GT.1) THEN
        WRITE(6,'(/47H DUODRV: PERFORMING CLIO ANALYSIS FOR REACTION ,
     >  A8,1H.)') HREAC
      ENDIF
      CALL DUO007(IPLIB1,IPRINT,NISOT,NGRP,LENER,RHSI1,RHSI2,LHSI2,
     > FLUXI2,AFLUXI1,RHOREA)
*
      CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR)
      IF(ITYPLU.NE.3) CALL XABORT('DUODRV: READ ERROR - CHARACTER VA'
     > //'RIABLE EXPECTED')
      IF(CARLIR.EQ.'PICK') THEN
        CALL REDGET(ITYPLU,INTLIR,RHOREA,CARLIR,DBLLIR)
        IF(ITYPLU.NE.-2) CALL XABORT('DUODRV: OUTPUT REAL EXPECTED')
        ITYPLU=2
        CALL REDPUT(ITYPLU,INTLIR,RHOREA,CARLIR,DBLLIR)
      ELSE
        GO TO 220
      ENDIF
      GO TO 210
*----
*  SCRATCH STORAGE DEALLOCATION
*----
  230 DEALLOCATE(AFLUXI2,FLUXI2,LHSI2,RHSI2,AFLUXI1,FLUXI1,LHSI1,RHSI1,
     > AFLUX2,FLUX2,LHS2,RHS2,AFLUX1,FLUX1,LHS1,RHS1)
      RETURN
      END