summaryrefslogtreecommitdiff
path: root/Donjon/src/DETCDRV.f
blob: 0a13bfb90e3a1dc6f1ff49922c41d6d4060591af (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
*DECK DETCDRV
      SUBROUTINE DETCDRV(IPDET,NGRP,NEL,NUN,NX,NY,NZ,MESHX,MESHY,MESHZ,
     1           KEYF,FLUX,IPRT,KC,DT,LHEX,LSIMEX,LNORM,VNORM,LPARAB)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Driver for the module DETECT:
*
*Copyright:
* Copyright (C) 2010 Ecole Polytechnique de Montreal.
*
*Author(s): 
* E. Varin, M. Guyot
*
*Parameters:
* IPDET  pointer to the library object
* NGRP   number of energy groups
* NEL    number of finite elements
* NUN    number of unknowns
* NX     number of x mesh-splitted elements 
* NY     number of y mesh-splitted elements 
* NZ     number of z mesh-splitted elements
* MESHX  
* MESHY  
* MESHZ  
* KEYF   keyflux recover from L_TRACk object
* FLUX   flux for each mesh-splitted elements
* IPRT   printing index
* KC     calculation type reference
* DT     time step
* LHEX   =.TRUE. if hexagonal detectors are present
* LSIMEX =.TRUE. if keyword SIMEX is present
* LNORM  =.TRUE. if keyword NORM is present
* VNORM  real used for normalization
* LPARAB =.TRUE. if parabolic interpolation is performed
*
*-----------------------------------------------------------------------
*
      USE GANLIB
      IMPLICIT NONE
*----
*  SUBROUTINE ARGUMENTS
*----
      TYPE(C_PTR) IPDET
      INTEGER IPRT,KC,NGRP,NEL,NX,NY,NZ,KEYF(NEL),NUN
      LOGICAL LHEX,LSIMEX,LNORM,LPARAB
      REAL    FLUX(NUN,NGRP),DT,MESHX(NX+1),MESHY(NY+1),MESHZ(NZ+1),
     1        VNORM
*----
*  LOCAL VARIABLES
*----
      INTEGER   NSTATE,IOUT
      PARAMETER (NSTATE=40,IOUT=6) 
      INTEGER   ILONG,ITYLCM,INFO(2),NREP,ITHEX,NHEX,J
      REAL      DEVPOS(6),PLNL,REF,RESP,VLAMDA,XMULT,TLG
      CHARACTER NXTYP*12,FIRST*12,NXDET*12,FIRST1*12
      LOGICAL   LREGUL
      INTEGER, ALLOCATABLE, DIMENSION(:) :: IHEX
      REAL, ALLOCATABLE, DIMENSION(:) :: SPEC,REP,FRACT,NVCST,PDD,APD,
     1          BPD
*----
*  SCRATCH STORAGE ALLOCATION
*----
      ALLOCATE(SPEC(NGRP))
*
      IF(IPRT.GE.1) THEN
        IF(KC.EQ.0) THEN
          WRITE(IOUT,*) 'DETECT: CALCULATION TYPE REFERENCE, KC = ',KC
        ELSE
          WRITE(IOUT,*) 'DETECT: CALCULATION TYPE NORMAL, KC = ',KC
        ENDIF
        WRITE(IOUT,*) 'DETECT: TIME STEP USED, DT = ',DT
      ENDIF
      CALL LCMSIX(IPDET,' ',0)
      NXTYP = ' '
      CALL LCMNXT(IPDET,NXTYP)
      FIRST = NXTYP
 10   CALL LCMNXT(IPDET,NXTYP)
      CALL LCMLEN(IPDET,NXTYP,ILONG,ITYLCM)
      IF (ITYLCM.EQ.0) THEN
        CALL LCMSIX(IPDET,NXTYP,1)
        CALL LCMGET(IPDET,'INFORMATION',INFO)
        CALL LCMGET(IPDET,'SPECTRAL',SPEC)
        NREP = INFO(2)
        ALLOCATE(REP(NREP))
        IF( NXTYP(1:5).EQ.'PLATN' )THEN
          ALLOCATE(FRACT(NREP-1),NVCST(NREP-2),PDD(NREP-2),APD(NREP-2),
     1    BPD(NREP-2))
          CALL LCMGET(IPDET,'FRACTION',FRACT)
          CALL LCMGET(IPDET,'INV-CONST',NVCST)
        ENDIF
        NXDET = ' '
        CALL LCMNXT(IPDET,NXDET)
        FIRST1 = NXDET
 20     CALL LCMNXT(IPDET,NXDET)
        CALL LCMLEN(IPDET,NXDET,ILONG,ITYLCM)
        IF (ITYLCM.EQ.0) THEN
           IF(IPRT.GT.3) WRITE(IOUT,*) 'NAME DETECTOR ',NXDET
           CALL LCMSIX(IPDET,NXDET,1)
           IF(LHEX) THEN
             CALL LCMLEN(IPDET,'NHEX',NHEX,ITHEX)
             IF(NHEX.EQ.0) CALL XABORT('@DETCDRV: HEXAGON NUMBERS'
     +             //' NOT PRESENT IN DETECT')
             ALLOCATE(IHEX(NHEX))
             CALL LCMGET(IPDET,'NHEX',IHEX)
           ENDIF
           CALL LCMGET(IPDET,'POSITION',DEVPOS)
           CALL LCMGET(IPDET,'RESPON',REP)
            IF(LSIMEX.AND.NXTYP.EQ.'VANAD_REGUL') THEN
              CALL DETINT(NX,NY,NZ,NEL,NUN,LPARAB,MESHX,MESHY,MESHZ,
     +        KEYF,FLUX,NGRP,DEVPOS,RESP,IPRT)
            ELSE
              CALL DETFLU(LHEX,NX,NY,NZ,NEL,NUN,MESHX,MESHY,MESHZ,KEYF,
     +        FLUX,NGRP,SPEC,DEVPOS,NHEX,IHEX,RESP,IPRT)
            ENDIF
*----
*  DETECTOR RESPONSE CALCULATION
*----
            IF(.NOT.LNORM)THEN
              PLNL = REP(1)
              REF  = REP(2)
              IF(NXTYP.EQ.'VANAD_REGUL')THEN
*----
*  VANADIUM RESPONSE CALCULATION
*----
                IF(LSIMEX) THEN
                  REF = RESP
                ELSE
                  IF(KC.EQ.1) THEN
                    VLAMDA = 1./225.
                    XMULT = 1.0 + VLAMDA*DT
                    XMULT = 1.0/XMULT
                    RESP = XMULT*(PLNL+DT*VLAMDA*RESP)
                    REF = PLNL
                  ELSE
                    REF = RESP
                  ENDIF
                ENDIF
              ELSEIF(NXTYP(1:5).EQ.'PLATN')THEN
*----
*  PLATINIUM RESPONSE CALCULATION
*----
                LREGUL = .FALSE.
                DO 30 J=1,NREP-2
                  PDD(J) = REP(J)
  30            CONTINUE
                IF(NXTYP.EQ.'PLATN_REGUL')THEN
                  LREGUL = .TRUE.
                ENDIF
                CALL DETPLAT(DT,RESP,REF,KC,PDD,LREGUL,FRACT,NVCST,
     +          NREP-2,APD,BPD)
                DO 40 J=1,NREP-2
                  REP(J) = PDD(J)
  40            CONTINUE
              ELSEIF (NXTYP(1:5).EQ.'CHION') THEN
*----
*  LECTURE DE CHAMBRES D'ION
*----
                IF(NREP.NE.3)CALL XABORT('@DETCDRV: ION CHAMBERS MUST '
     +            //'HAVE THREE STORED VALUES FOR RESPONSES')
                IF (KC.EQ.1) THEN
                  REF = REP(3)
                  RESP = LOG10(RESP/REF)
                  TLG = (RESP-PLNL)/DT
                  REF = TLG
                ELSE
                  REP(3) = RESP
                  RESP =LOG10(RESP/REP(3))
                ENDIF
              ENDIF
            ELSE
              REF = VNORM/RESP
              RESP = VNORM
            ENDIF
*----
*  DETECTOR RESPONSE STORAGE
*----
           REP(1) = RESP
           REP(2) = REF
           IF(IPRT.GT.4) WRITE(6,*) 'RESP, REF ',RESP, REF
           CALL LCMPUT(IPDET,'RESPON',NREP,2,REP)
           CALL LCMSIX(IPDET,' ',2)
        ENDIF
        IF(LHEX) DEALLOCATE(IHEX)
        IF(NXDET.EQ.FIRST1) GOTO 45
        GOTO 20
   45   CALL LCMSIX(IPDET,' ',2)
        DEALLOCATE(REP)
        IF(NXTYP(1:5).EQ.'PLATN')THEN
          DEALLOCATE(FRACT,NVCST,PDD,APD,BPD)
        ENDIF
      ENDIF
      IF (NXTYP.EQ.FIRST) GOTO 50
        GOTO 10
  50  CONTINUE
*----
*  SCRATCH STORAGE DEALLOCATION
*----
      DEALLOCATE(SPEC)
      RETURN
      END