33
34
36
37
38
39
40
41
42
44 USE sensor_mod
45
46
47
48#include "implicit_f.inc"
49#include "comlock.inc"
50
51
52
53#include "units_c.inc"
54#include "com04_c.inc"
55#include "com08_c.inc"
56#include "task_c.inc"
57#include "parit_c.inc"
58
59
60
61 INTEGER ,INTENT(IN) :: NSENSOR
62 INTEGER ,INTENT(IN) :: ISENS
63 my_real ,
INTENT(IN) :: partsav2(2,*)
64 TYPE (SUBSET_) ,DIMENSION(NSUBS) ,INTENT(IN) :: SUBSET
65 TYPE (SENSOR_STR_) ,INTENT(INOUT) :: SENSOR
66 TYPE (SENSOR_TYPE), DIMENSION(NSENSOR), INTENT(INOUT) :: SENSOR_STRUCT
67
68
69
70 INTEGER :: I,J,IPART,ISUBS,NBR_GROUP,NP,INDX,ITSK,IFLAG,ICONST,
71 . NI,NK
72
73 . eint,ekin,iemax,kemin,kemax,ietol,ietime,ketol,ketime,
74 . avg_ei,avg_ek,alphai,alphak,infinity
75 parameter(infinity = 1.0e20)
76
77
78
79
80
81
82
83
84
85
86
87
88 IF (sensor%STATUS == 1) RETURN
89 avg_ek = zero
90 avg_ei = zero
91
92 ipart = sensor%IPARAM(1)
93 isubs = sensor%IPARAM(2)
94 iconst = sensor%IPARAM(3)
95 iselect= sensor%IPARAM(4)
96
97 tdelay = sensor%TDELAY
98 tmin = sensor%TMIN
99 tcrit = sensor%TCRIT
100 tstart = sensor%TSTART
101 iemin = sensor%RPARAM(1)
102 iemax = sensor%RPARAM(2)
103 kemin = sensor%RPARAM(3)
104 kemax = sensor%RPARAM(4)
105 ietol = sensor%RPARAM(5)
106 ketol = sensor%RPARAM(6)
107 ietime = sensor%RPARAM(7)
108 ketime = sensor%RPARAM(8)
109
110 eint = zero
111 ekin = zero
112 icrit = 0
113 icrit1 = 0
114 icrit2 = 0
115 iflag = 0
116
117
118
119
120 IF (iselect == 2) THEN
121 eint = sensor%VAR(9)
122 ekin = sensor%VAR(10)
123 ELSE
124 IF (iparit > 0) THEN
125 eint = zero
126 ekin = zero
127 nbr_group = sensor_struct(isens)%NUM_GROUP_PART
128 DO itsk=2,nthread
129 sensor_struct(isens)%FBSAV6_SENS(1,1:6,1) =
130 . sensor_struct(isens)%FBSAV6_SENS(1,1:6,1) +
131 . sensor_struct(isens)%FBSAV6_SENS(1,1:6,itsk)
132 sensor_struct(isens)%FBSAV6_SENS(2,1:6,1) =
133 . sensor_struct(isens)%FBSAV6_SENS(2,1:6,1) +
134 . sensor_struct(isens)%FBSAV6_SENS(2,1:6,itsk)
135 ENDDO
136
137 DO j=2,6
138 sensor_struct(isens)%FBSAV6_SENS(1,1,1) =
139 . sensor_struct(isens)%FBSAV6_SENS(1,1,1) + sensor_struct(isens)%FBSAV6_SENS(1,j,1)
140 sensor_struct(isens)%FBSAV6_SENS(2,1,1) =
141 . sensor_struct(isens)%FBSAV6_SENS(2,1,1) + sensor_struct(isens)%FBSAV6_SENS(2,j,1)
142 ENDDO
143 eint = sensor_struct(isens)%FBSAV6_SENS(1,1,1)
144 ekin = sensor_struct(isens)%FBSAV6_SENS(2,1,1)
145
146 DO itsk=1,nthread
147 DO j=1,6
148 sensor_struct(isens)%FBSAV6_SENS(1,j,itsk) = zero
149 sensor_struct(isens)%FBSAV6_SENS(2,j,itsk) = zero
150 ENDDO
151 ENDDO
152 ELSE
153 eint = zero
154 ekin = zero
155 IF (ipart > 0) THEN
156 eint = partsav2(1,ipart)
157 ekin = partsav2(2,ipart)
158 ELSEIF (isubs > 0) THEN
159 np = subset(isubs)%NTPART
160 DO j=1,np
161 ipart= subset(isubs)%TPART(j)
162 eint = eint + partsav2(1,ipart)
163 ekin = ekin + partsav2(2,ipart)
164 ENDDO
165 ENDIF
166 ENDIF
167 ENDIF
168
169
170
171 IF (eint < iemin) THEN
172 icrit = 1
173 iflag = 1
174 ELSE IF (eint > iemax) THEN
175 icrit = 1
176 iflag = 2
177 ELSE IF (ekin < kemin) THEN
178 icrit = 1
179 iflag = 3
180 ELSE IF (ekin > kemax) THEN
181 icrit = 1
182 iflag = 4
183 ENDIF
184 sensor%RESULTS(1) = eint
185 sensor%RESULTS(2) = ekin
186
187 IF (sensor%TCRIT + tmin > tt) THEN
188 IF (icrit == 0) THEN
189 sensor%TCRIT = infinity
190 ELSE IF (sensor%TCRIT == infinity) THEN
191 sensor%TCRIT =
min(sensor%TCRIT, tt)
192 END IF
193 ELSE IF (sensor%TSTART == infinity) THEN
194 sensor%TSTART = sensor%TCRIT + tmin + tdelay
195 END IF
196 IF (sensor%TSTART <= tt) THEN
197 sensor%STATUS = 1
198 END IF
199
200 IF (sensor%STATUS == 1 .and. ispmd == 0) THEN
201#include "lockon.inc"
202 WRITE (istdo,1000 ) sensor%SENS_ID,sensor%TSTART
203 WRITE (iout ,1000 ) sensor%SENS_ID,sensor%TSTART
204 IF (iflag == 1) THEN
205 WRITE (iout ,1100) iemin,eint
206 ELSE IF (iflag == 2) THEN
207 WRITE (iout ,1200) iemax,eint
208 ELSE IF (iflag == 3) THEN
209 WRITE (iout ,1300) kemin,ekin
210 ELSE IF (iflag == 4) THEN
211 WRITE (iout ,1400) kemax,ekin
212 END IF
213#include "lockoff.inc"
214 END IF
215
216
217
218 IF (iconst == 1) THEN
219 IF (tt == zero) THEN
220 ni = nint(ietime / dt2) + 1
221 nk = nint(ketime / dt2) + 1
222 sensor%VAR(1) = infinity
223 sensor%VAR(2) = infinity
224 sensor%VAR(3) = infinity
225 sensor%VAR(4) = infinity
226 sensor%VAR(7) =
max(zero ,
min(one ,two / ni))
227 sensor%VAR(8) =
max(zero ,
min(one ,two / nk))
228 END IF
229
230 IF (eint > zero .and. ietol > zero) THEN
231 alphai = sensor%VAR(7)
232 avg_ei = alphai*eint + (one - alphai) * sensor%VAR(5)
233 sensor%VAR(5) = avg_ei
234 END IF
235
236
237
238 IF (eint > zero .and. eint < avg_ei + ietol .and. eint > avg_ei - ietol) icrit1 = 1
239
240 IF (sensor%VAR(1) > tt) THEN
241 IF (icrit1 == 0) THEN
242 sensor%VAR(1) = infinity
243 ELSE IF (sensor%VAR(1) == infinity) THEN
244 sensor%VAR(1) = tt + ietime
245 END IF
246 ELSE IF (sensor%VAR(2) == infinity) THEN
247 sensor%VAR(2) = sensor%VAR(1) + tdelay
248 END IF
249 IF (sensor%VAR(2) <= tt) THEN
250 sensor%STATUS = 1
251 sensor%TSTART = sensor%VAR(2)
252 END IF
253
254 IF (sensor%VAR(2) <= tt .and. ispmd == 0) THEN
255#include "lockon.inc"
256 WRITE (istdo,1000 ) sensor%SENS_ID,tt
257 WRITE (iout ,1000 ) sensor%SENS_ID,tt
258 WRITE (iout ,2100) eint,avg_ei
259#include "lockoff.inc"
260 END IF
261
262
263
264
265 IF (ekin > zero .and. ketol > zero) THEN
266 alphak = sensor%VAR(8)
267 avg_ek = alphak*ekin + (one - alphak) * sensor%VAR(6)
268 sensor%VAR(6) = avg_ek
269 END IF
270
271 IF (ekin > zero .and. ekin < avg_ek + ketol .and. ekin > avg_ek - ketol) THEN
272 icrit2 = 1
273 END IF
274
275 IF (sensor%VAR(3) > tt) THEN
276 IF (icrit2 == 0) THEN
277 sensor%VAR(3) = infinity
278 ELSE IF (sensor%VAR(3) == infinity) THEN
279 sensor%VAR(3) = tt + ketime
280 END IF
281 ELSE IF (sensor%VAR(4) == infinity) THEN
282 sensor%VAR(4) = sensor%VAR(3) + tdelay
283 END IF
284 IF (sensor%VAR(4) <= tt) THEN
285 sensor%STATUS = 1
286 sensor%TSTART = sensor%VAR(4)
287 END IF
288
289 IF (sensor%VAR(4) <= tt .and. ispmd == 0) THEN
290#include "lockon.inc"
291 WRITE (istdo,1000 ) sensor%SENS_ID,tt
292 WRITE (iout ,1000 ) sensor%SENS_ID,tt
293 WRITE (iout ,2200) ekin,avg_ek
294#include "lockoff.inc"
295 END IF
296
297 END IF
298
2991000 FORMAT(' ENERGY SENSOR NUMBER ',i10,' ACTIVATED AT TIME ',1pe12.5)
3001100 FORMAT(' TARGET MIN INTERNAL ENERGY = ',1pe12.5,/
301 . ' CURRENT INTERNAL ENERGY AFTER TMIN and TDELAY = ',1pe12.5)
3021200 FORMAT(' TARGET MAX INTERNAL ENERGY = ',1pe12.5,/
303 . ' CURRENT INTERNAL ENERGY AFTER TMIN and TDELAY = ',1pe12.5)
3041300 FORMAT(' TARGET MIN KINETIC ENERGY = ',1pe12.5,/
305 . ' CURRENT INTERNAL ENERGY AFTER TMIN and TDELAY = '
3061400 FORMAT(' TARGET MAX KINETIC ENERGY = ',1pe12.5,/
307 . ' CURRENT INTERNAL ENERGY AFTER TMIN and TDELAY = ',1pe12.5)
3082100 FORMAT(' CONSTANT INT ENERGY = ',1pe12.5,', MEAN = ',1pe12.5)
3092200 FORMAT(' CONSTANT KIN ENERGY = ',1pe12.5,', MEAN = ',1pe12.5)
310
311 RETURN
subroutine sensor_energy(sensor, isens, subset, partsav2, nsensor, sensor_struct)