40 . IPARTC,IPARTTG,IPARTS,IPARTQ,IPARTT,
41 . IPARTP,IPARTR,SENSORS,TIME ,TIMESTEP,
54#include "implicit_f.inc"
68 my_real ,
INTENT(IN) :: time,timestep
69 TYPE (SUBSET_) ,
DIMENSION(NSUBS),
INTENT(IN) :: SUBSET
70 INTEGER,
INTENT(IN) :: NGROUC
71 INTEGER,
INTENT(IN) :: IOUT
72 INTEGER,
DIMENSION(*),
TARGET,
INTENT(IN) :: IPARTC,IPARTTG,IPARTS,IPARTQ
73 INTEGER,
DIMENSION(*),
TARGET,
INTENT(IN) :: IPARTT,IPARTP,IPARTR
74 INTEGER,
DIMENSION(NPARG,*),
INTENT(IN) :: IPARG
75 TYPE (SENSORS_) ,
INTENT(INOUT) :: SENSORS
76 TYPE(python_),
INTENT(INOUT) :: PYTHON
77 INTEGER,
INTENT(IN) :: NTASK
82 INTEGER :: I,K,J,IC,IG,NG,NP,IJK,KJI
83 INTEGER :: TYP,IPART,IPART_2,ISUBS,IGRN,NBR_GROUP,NSENSOR
84 INTEGER :: NFT,NF1,ITY,NEL
85 INTEGER,
DIMENSION(:),
POINTER :: IPART_POINTER
86 INTEGER :: NUMBER_PART_GROUP,NUMBER_PART_GROUP_2
87 INTEGER,
DIMENSION(MVSIZ) :: INDX_PART,INDX_PART_2
88 INTEGER :: NUMBER_SENSOR_PER_GROUP,NUMBER_SENSOR,TOT_NUMBER_PART_GROUP
89 INTEGER,
DIMENSION(:,:),
ALLOCATABLE :: CHECK_BOOL
90 LOGICAL,
DIMENSION(:),
ALLOCATABLE :: BOOL_SENSOR
93 INTEGER :: SURF_DIST_SENSOR,ENERGY_SENSOR,SENSOR_TEMP
94 INTEGER,
DIMENSION(SENSORS%NSENSOR) :: INDX_SURF_DIST_SENSOR,INDX_ENERGY,INDX_TEMP
95 INTEGER :: SIZE_COMM17_MIN_MAX,SIZE_COMM17_MEAN
96 LOGICAL :: ANY_PYTHON_SENSOR
97 INTEGER,
DIMENSION(:),
ALLOCATABLE :: UIDS
98 INTEGER,
DIMENSION(:),
ALLOCATABLE :: STATUSES
99 INTEGER,
DIMENSION(:),
ALLOCATABLE :: TYPES
100 DOUBLE PRECISION,
DIMENSION(:,:),
ALLOCATABLE :: RESULTS
128 CALL my_alloc(sensors%NGR_SENSOR,ntask)
130 sensors%COMM_SENS14%BOOL = .false.
131 sensors%COMM_SENS16%BOOL = .false.
132 sensors%COMM_SENS17%BOOL = .false.
133 any_python_sensor = .false.
135 sensors%COMM_SENS14%BUFFER_SIZE_MIN_MAX = 0
136 sensors%COMM_SENS14%BUFFER_SIZE_MEAN = 0
138 sensors%COMM_SENS16%BUFFER_SIZE_MIN_MAX = 0
139 sensors%COMM_SENS16%BUFFER_SIZE_MEAN = 0
141 sensors%COMM_SENS17%BUFFER_SIZE_MIN_MAX = 0
142 sensors%COMM_SENS17%BUFFER_SIZE_MEAN = 0
147 nsensor = sensors%NSENSOR
148 indx_surf_dist_sensor(1:nsensor) = 0
149 indx_energy(1:nsensor) = 0
150 indx_temp(1:nsensor) = 0
154 sensors%SENSOR_TAB(k)%RESULTS(1:sensor_result_size) = zero
155 typ = sensors%SENSOR_TAB(k)%TYPE
159 energy_sensor = energy_sensor + 1
160 indx_energy(energy_sensor) = k
161 ELSE IF (typ==16)
THEN
163 isurf = sensors%SENSOR_TAB(k)%IPARAM(2)
165 surf_dist_sensor = surf_dist_sensor + 1
166 indx_surf_dist_sensor(surf_dist_sensor) = k
168 ELSE IF (typ==17)
THEN
170 igrn = sensors%SENSOR_TAB(k)%IPARAM(1)
172 sensor_temp = sensor_temp + 1
173 indx_temp(sensor_temp) = k
180 IF (energy_sensor>0) sensors%COMM_SENS14%BOOL = .true.
181 sensors%COMM_SENS14%NUM_SENS = energy_sensor
183 IF (surf_dist_sensor>0) sensors%COMM_SENS16%BOOL = .true.
184 sensors%COMM_SENS16%NUM_SENS = surf_dist_sensor
186 IF (sensor_temp>0) sensors%COMM_SENS17%BOOL = .true.
187 sensors%COMM_SENS17%NUM_SENS = sensor_temp
192 ALLOCATE( sensors%COMM_SENS14%ID_SENS(energy_sensor) )
193 IF(energy_sensor>0) sensors%COMM_SENS14%ID_SENS(1:energy_sensor) = indx_energy(1:energy_sensor)
194 ALLOCATE( sensors%SENS_GROUP(ngroup
195 sensors%SENS_GROUP(1:ngroup)%NUM_PART = 0
196 ALLOCATE( sensors%SENSOR_STRUCT(nsensor) )
197 sensors%SENSOR_STRUCT(:)%TYP = 0
199 sensors%SENSOR_STRUCT(:)%NB_SUB = 0
201 IF(energy_sensor>0)
THEN
206 typ = sensors%SENSOR_TAB(k)%TYPE
209 ipart = sensors%SENSOR_TAB(k)%IPARAM(1)
210 isubs = sensors%SENSOR_TAB(k)%IPARAM(2)
213 sensors%SENSOR_STRUCT(k)%TYP = 1
214 sensors%SENSOR_STRUCT(k)%PART = ipart
217 sensors%SENSOR_STRUCT(k)%TYP = 2
218 np = subset(isubs)%NTPART
219 sensors%SENSOR_STRUCT(k)%NB_SUB = np
220 ALLOCATE( sensors%SENSOR_STRUCT(k)%SUB(np) )
222 sensors%SENSOR_STRUCT(k)%SUB(j)%PART = subset(isubs)%TPART(j)
239 ipart_pointer => ipartc(nf1:nf1+nel)
242 ipart_pointer => iparttg(nf1:nf1+nel)
243 ELSEIF(ity==1.OR.ity==101)
THEN
245 ipart_pointer => iparts(nf1:nf1+nel)
248 ipart_pointer => ipartq(nf1:nf1+nel)
251 ipart_pointer => ipartt(nf1:nf1+nel)
254 ipart_pointer => ipartp(nf1:nf1+nel)
257 ipart_pointer => ipartp(nf1:nf1+nel)
261 indx_part(1:mvsiz) = 0
262 indx_part_2(1:mvsiz) = 0
264 number_part_group = 1
265 indx_part(number_part_group) = ipart
267 ipart_2 = ipart_pointer(i)
268 IF(ipart/=ipart_2)
THEN
269 number_part_group = number_part_group + 1
270 indx_part(number_part_group) = ipart_2
275 indx_part_2(1:number_part_group) = indx_part(1:number_part_group)
278 number_part_group = 1
279 indx_part(number_part_group) = indx_part_2(1)
280 DO i=2,number_part_group_2
281 IF( indx_part_2(i-1)/=indx_part_2(i) )
THEN
282 number_part_group = number_part_group + 1
283 indx_part(number_part_group) = indx_part_2(i)
287 sensors%SENS_GROUP(ng)%NUM_PART = -number_part_group
289 ALLOCATE( bool_sensor(energy_sensor) )
290 bool_sensor(1:energy_sensor) = .true.
292 number_sensor_per_group = 0
293 DO ijk=1,number_part_group
294 ipart = indx_part(ijk)
297 IF(sensors%SENSOR_STRUCT(k)%TYP == 1)
THEN
298 IF(sensors%SENSOR_STRUCT(k)%PART == ipart)
THEN
299 number_sensor_per_group = number_sensor_per_group + 1
301 ELSEIF(sensors%SENSOR_STRUCT(k)%TYP == 2)
THEN
302 DO j=1,sensors%SENSOR_STRUCT(k)%NB_SUB
303 IF(bool_sensor(i).AND.sensors%SENSOR_STRUCT(k)%SUB(j)%PART == ipart)
THEN
304 number_sensor_per_group = number_sensor_per_group + 1
305 bool_sensor(i)=.false.
311 DEALLOCATE( bool_sensor )
313 tot_number_part_group = number_part_group * number_sensor_per_group
315 ALLOCATE( sensors%SENS_GROUP(ng)%PART(tot_number_part_group,3) )
316 sensors%SENS_GROUP(ng)%PART(1:tot_number_part_group
319 DO ijk=1,number_part_group
320 DO i=1,number_sensor_per_group
322 sensors%SENS_GROUP(ng)%PART(kji,1) = -indx_part(ijk)
326 ALLOCATE( check_bool(energy_sensor,number_part_group) )
327 DO ijk=1,energy_sensor
328 check_bool(ijk,1:number_part_group) = -indx_part(1:number_part_group)
333 DO ijk=1,number_part_group
334 ipart = indx_part(ijk)
338 IF(sensors%SENSOR_STRUCT(k)%TYP == 1)
THEN
339 IF(check_bool(i,ijk)<0)
THEN ! check
if already done(loop over
the part of an element group
340 IF(sensors%SENSOR_STRUCT(k)%PART == ipart)
THEN
343 sensors%SENSOR_STRUCT(k)%NUM_GROUP_PART = sensors%SENSOR_STRUCT(k)%NUM_GROUP_PART + 1
344 sensors%SENS_GROUP(ng)%PART(kji,2) = 1
345 sensors%SENS_GROUP(ng)%PART(kji,
347 sensors%SENS_GROUP(ng)%PART(kji,1) = abs(sensors%SENS_GROUP(ng)%PART(kji,1))
348 check_bool(i,ijk) = abs(check_bool(i,ijk))
352 ELSEIF(sensors%SENSOR_STRUCT(k)%TYP == 2)
THEN
353 IF(check_bool(i,ijk)<0)
THEN
354 DO j=1,sensors%SENSOR_STRUCT(k)%NB_SUB
355 IF(sensors%SENSOR_STRUCT(k)%SUB(j)%PART == ipart)
THEN
358 sensors%SENSOR_STRUCT(k)%NUM_GROUP_PART = sensors%SENSOR_STRUCT(k)%NUM_GROUP_PART + 1
359 sensors%SENS_GROUP(ng)%PART(kji,2) = 2
360 sensors%SENS_GROUP(ng)%PART(kji,3) = k
361 sensors%SENS_GROUP(ng)%PART(kji,1) = abs(sensors%SENS_GROUP(ng)%PART(kji,1))
362 check_bool(i,ijk) = abs(check_bool(i,ijk))
371 IF(bool) sensors%SENS_GROUP(ng)%NUM_PART = kji
372 DEALLOCATE( check_bool )
379 ALLOCATE( sensors%SENSOR_STRUCT(k)%FBSAV6_SENS(2,6,nthread) )
380 sensors%SENSOR_STRUCT(k)%FBSAV6_SENS(1:2,1:6,1:nthread) = zero
385 ALLOCATE( sensors%SENS_GROUP(0) )
386 ALLOCATE( sensors%SENSOR_STRUCT(0) )
387 ALLOCATE( sensors%COMM_SENS14%ID_SENS(0) )
392 ALLOCATE( sensors%COMM_SENS16%ID_SENS(surf_dist_sensor) )
393 IF(surf_dist_sensor>0)
THEN
394 sensors%COMM_SENS16%ID_SENS(1:surf_dist_sensor) = indx_surf_dist_sensor(1:surf_dist_sensor)
398 size_comm17_min_max = 0
400 ALLOCATE( sensors%COMM_SENS17%ID_SENS(sensor_temp) )
401 IF (sensor_temp > 0)
THEN
404 sensors%COMM_SENS17%ID_SENS(i) = k
406 size_comm17_min_max = size_comm17_min_max + 1
409 ALLOCATE( sensors%SENSOR_STRUCT(k)%FBSAV6_SENS(1,6,1) )
410 sensors%SENSOR_STRUCT(k)%FBSAV6_SENS(1,1:6,1:1) = zero
411 size_comm17_mean = size_comm17_mean + 6
413 ALLOCATE( sensors%SENSOR_STRUCT(k)%FBSAV6_SENS(1,1,1) )
414 sensors%SENSOR_STRUCT
415 size_comm17_mean = size_comm17_mean + 1
418 sensors%COMM_SENS17%BUFFER_SIZE_MIN_MAX = size_comm17_min_max
419 sensors%COMM_SENS17%BUFFER_SIZE_MEAN = size_comm17_mean
426 IF (nsensor > 0 )
THEN
427 IF (sensors%NRESET == nsensor)
THEN
429 sensors%SENSOR_TAB(i)%STATUS = 0
430 sensors%SENSOR_TAB(i)%TSTART = 1.e20
431 sensors%SENSOR_TAB(i)%TCRIT = 1.e20
432 sensors%SENSOR_TAB(i)%VALUE = zero
433 sensors%SENSOR_TAB(i)%VAR(:) = zero
434 IF (ispmd == 0)
WRITE (iout,100) sensors%SENSOR_TAB(i)%SENS_ID
436 ELSE IF (sensors%NRESET > 0)
THEN
437 DO j=1,sensors%NRESET
439 IF (sensors%RESET(j) == sensors%SENSOR_TAB
THEN
441 sensors%SENSOR_TAB(i)%TSTART = 1.e20
442 sensors%SENSOR_TAB(i)%TCRIT = 1.e20
443 sensors%SENSOR_TAB(i)%VALUE = zero
444 sensors%SENSOR_TAB(i)%VAR(:) = zero
445 IF (ispmd == 0)
WRITE (iout,100) sensors%SENSOR_TAB
451 IF (
ALLOCATED(sensors%RESET))
DEALLOCATE (sensors%RESET)
460 IF (nsensor > 0 )
THEN
463 typ = sensors%SENSOR_TAB(i)%TYPE
467 IF( typ == sensor_type_python )
THEN
468 any_python_sensor = .true.
475 sensors%LOGICAL_SENSOR_COUNT=0
478 IF(python%NB_FUNCTS > 0)
THEN
479 ALLOCATE(uids(nsensor))
480 ALLOCATE(results(sensor_result_size,nsensor))
481 ALLOCATE(statuses(nsensor))
482 ALLOCATE(types(nsensor))
484 typ = sensors%SENSOR_TAB(isens)%TYPE
486 uids(isens) = sensors%SENSOR_TAB(isens)%SENS_ID
487 statuses(isens) = sensors%SENSOR_TAB(isens)%STATUS
488 results(1:sensor_result_size,isens) = sensors%SENSOR_TAB(isens)%RESULTS(1:sensor_result_size)
490 CALL python_update_sensors(types,uids,statuses,results,nsensor)
496 IF (any_python_sensor)
THEN
498 typ = sensors%SENSOR_TAB(isens)%TYPE
499 IF (typ == sensor_type_python)
THEN
500 CALL sensor_python(sensors%SENSOR_TAB(isens))
506100
FORMAT(
' SENSOR NUMBER ',i10,
' ,IS RESET TO THE INITIAL STATE')