32 * NSENSOR ,SENSOR_STRUCT)
48#include "implicit_f.inc"
61 INTEGER ,
INTENT(IN) :: NSENSOR
62 INTEGER ,
INTENT(IN) :: ISENS
63 my_real ,
INTENT(IN) :: partsav2(2,*)
64 TYPE (SUBSET_) ,
DIMENSION(NSUBS) ,
INTENT(IN) ::
65 TYPE (SENSOR_STR_) ,
INTENT(INOUT) :: SENSOR
66 TYPE (SENSOR_TYPE),
DIMENSION(NSENSOR),
INTENT(INOUT) :: SENSOR_STRUCT
70 INTEGER :: I,J,IPART,ISUBS,NBR_GROUP,NP,INDX,ITSK,IFLAG,,
71 . ni,nk,icrit,icrit1,icrit2,iselect
72 my_real :: tmin,tdelay,tstart,tstops,iemin,tcrit,
73 . eint,ekin,iemax,kemin,kemax,ietol,ietime,ketol,ketime,
74 . avg_ei,avg_ek,alphai,alphak,infinity
75 parameter(infinity = 1.0e20)
88 IF (sensor%STATUS == 1)
RETURN
92 ipart = sensor%IPARAM(1)
93 isubs = sensor%IPARAM(2)
94 iconst = sensor%IPARAM(3)
95 iselect= sensor%IPARAM(4)
97 tdelay = sensor%TDELAY
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)
120 IF (iselect == 2)
THEN
122 ekin = sensor%VAR(10)
127 nbr_group = sensor_struct(isens)%NUM_GROUP_PART
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)
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)
143 eint = sensor_struct(isens)%FBSAV6_SENS(1,1,1)
144 ekin = sensor_struct(isens)%FBSAV6_SENS(2,1,1)
148 sensor_struct(isens)%FBSAV6_SENS(1,j,itsk) = zero
149 sensor_struct(isens)%FBSAV6_SENS(2,j,itsk) = zero
156 eint = partsav2(1,ipart)
157 ekin = partsav2(2,ipart)
158 ELSEIF (isubs > 0)
THEN
159 np = subset(isubs)%NTPART
161 ipart= subset(isubs)%TPART(j)
162 eint = eint + partsav2(1,ipart)
163 ekin = ekin + partsav2(2,ipart)
171 IF (eint < iemin)
THEN
174 ELSE IF (eint > iemax)
THEN
177 ELSE IF (ekin < kemin)
THEN
180 ELSE IF (ekin > kemax)
THEN
184 sensor%RESULTS(1) = eint
185 sensor%RESULTS(2) = ekin
187 IF (sensor%TCRIT + tmin > tt)
THEN
189 sensor%TCRIT = infinity
190 ELSE IF (sensor%TCRIT == infinity)
THEN
191 sensor%TCRIT =
min(sensor%TCRIT, tt)
193 ELSE IF (sensor%TSTART == infinity)
THEN
194 sensor%TSTART = sensor%TCRIT + tmin + tdelay
196 IF (sensor%TSTART <= tt)
THEN
200 IF (sensor%STATUS == 1 .and. ispmd == 0)
THEN
202 WRITE (istdo,1000 ) sensor%SENS_ID,sensor%TSTART
203 WRITE (iout ,1000 ) sensor%SENS_ID,sensor%TSTART
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
213#include "lockoff.inc"
218 IF (iconst == 1)
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))
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
238 IF (eint > zero .and. eint < avg_ei + ietol .and. eint > avg_ei - ietol) icrit1 = 1
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
246 ELSE IF (sensor%VAR(2) == infinity)
THEN
247 sensor%VAR(2) = sensor%VAR(1) + tdelay
249 IF (sensor%VAR(2) <= tt)
THEN
251 sensor%TSTART = sensor%VAR(2)
254 IF (sensor%VAR(2) <= tt .and. ispmd == 0)
THEN
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"
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
271 IF (ekin > zero .and. ekin < avg_ek + ketol .and. ekin > avg_ek - ketol)
THEN
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
281 ELSE IF (sensor%VAR(4) == infinity)
THEN
282 sensor%VAR(4) = sensor%VAR(3) + tdelay
284 IF (sensor%VAR(4) <= tt)
THEN
286 sensor%TSTART = sensor%VAR(4)
289 IF (sensor%VAR(4) <= tt .and. ispmd == 0)
THEN
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"
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 = ',1pe12.5)
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)