43
44
45
46 USE sensor_python_mod
47 USE python_funct_mod
49 USE sensor_mod
50 USE my_alloc_mod
51
52
53
54#include "implicit_f.inc"
55
56
57
58#include "mvsiz_p.inc"
59#include "param_c.inc"
60#include "com01_c.inc"
61#include "com04_c.inc"
62#include "task_c.inc"
63#include "parit_c.inc"
64#include "comlock.inc"
65
66
67
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
78
79
80
81 LOGICAL :: BOOL
82 INTEGER :: I,K,J,IC,IG,NG,,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 ::
90 LOGICAL, DIMENSION(:), ALLOCATABLE :: BOOL_SENSOR
91
92 INTEGER :: ISURF
93 INTEGER :: SURF_DIST_SENSOR,ENERGY_SENSOR,
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
101 INTEGER :: ISENS
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124! %PART(:,3): id of the sensor | 3 | 67 |
125
126
127
128 CALL my_alloc(sensors%NGR_SENSOR,ntask)
129
130 sensors%COMM_SENS14%BOOL = .false.
131 sensors%COMM_SENS16%BOOL = .false.
132 sensors%COMM_SENS17%BOOL = .false.
133 any_python_sensor = .false.
134
135 sensors%COMM_SENS14%BUFFER_SIZE_MIN_MAX = 0
136 sensors%COMM_SENS14%BUFFER_SIZE_MEAN = 0
137
138 sensors%COMM_SENS16%BUFFER_SIZE_MIN_MAX = 0
139 sensors%COMM_SENS16%BUFFER_SIZE_MEAN = 0
140
141 sensors%COMM_SENS17%BUFFER_SIZE_MIN_MAX = 0
142 sensors%COMM_SENS17%BUFFER_SIZE_MEAN = 0
143
144 surf_dist_sensor = 0
145 energy_sensor = 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
151
152
153 DO k=1,nsensor
154 sensors%SENSOR_TAB(k)%RESULTS(1:sensor_result_size) = zero
155 typ = sensors%SENSOR_TAB(k)%TYPE
156
157 IF (typ==14) THEN
158
159 energy_sensor = energy_sensor + 1
160 indx_energy(energy_sensor) = k
161 ELSE IF (typ==16) THEN
162
163 isurf = sensors%SENSOR_TAB(k)%IPARAM(2)
164 IF (isurf/=0) THEN
165 surf_dist_sensor = surf_dist_sensor + 1
166 indx_surf_dist_sensor(surf_dist_sensor) = k
167 ENDIF
168 ELSE IF (typ==17) THEN
169
170 igrn = sensors%SENSOR_TAB(k)%IPARAM(1)
171 IF (igrn > 0) THEN
174 ENDIF
175 ENDIF
176
177 ENDDO
178
179
180 IF (energy_sensor>0) sensors%COMM_SENS14%BOOL = .true.
181 sensors%COMM_SENS14%NUM_SENS = energy_sensor
182
183 IF (surf_dist_sensor>0) sensors%COMM_SENS16%BOOL = .true.
184 sensors%COMM_SENS16%NUM_SENS = surf_dist_sensor
185
186 IF (
sensor_temp>0) sensors%COMM_SENS17%BOOL = .true.
188
189
190
191 IF (iparit>0) THEN
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
198 sensors%SENSOR_STRUCT(:)%PART = 0
199 sensors%SENSOR_STRUCT(:)%NB_SUB = 0
200
201 IF(energy_sensor>0) THEN
202
203
204 DO i=1,energy_sensor
205 k = indx_energy(i)
206 typ = sensors%SENSOR_TAB(k)%TYPE
207 ! --------------------
208
209 ipart = sensors%SENSOR_TAB(k)%IPARAM(1)
210 isubs = sensors%SENSOR_TAB(k)%IPARAM(2)
211 IF(ipart>0) THEN
212
213 sensors%SENSOR_STRUCT(k)%TYP = 1
214 sensors%SENSOR_STRUCT(k)%PART = ipart
215 ELSEIF(isubs>0) THEN
216
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) )
221 DO j=1,np
222 sensors%SENSOR_STRUCT(k)%SUB(j)%PART = subset(isubs)%TPART(j)
223 ENDDO
224 ENDIF
225
226 ENDDO
227
228
229
230
231 DO ng = 1, ngroup
232 ity = iparg(5,ng)
233 nft = iparg(3,ng)
234 nel = iparg(2,ng)
235 nf1 = nft + 1
236 ipart = 0
237 IF(ity==3) THEN
238 ipart = ipartc(nf1)
239 ipart_pointer => ipartc(nf1:nf1+nel)
240 ELSEIF(ity==7) THEN
241 ipart = iparttg(nf1)
242 ipart_pointer => iparttg(nf1:nf1+nel)
243 ELSEIF(ity==1.OR.ity==101) THEN
244 ipart = iparts(nf1)
245 ipart_pointer => iparts(nf1:nf1+nel)
246 ELSEIF(ity==2) THEN
247 ipart = ipartq(nf1)
248 ipart_pointer => ipartq(nf1:nf1+nel)
249 ELSEIF(ity==4) THEN
250 ipart = ipartt(nf1)
251 ipart_pointer => ipartt(nf1:nf1+nel)
252 ELSEIF(ity==5) THEN
253 ipart = ipartp(nf1)
254 ipart_pointer => ipartp(nf1:nf1+nel)
255 ELSEIF(ity==6) THEN
256 ipart = ipartr(nf1)
257 ipart_pointer => ipartp(nf1:nf1+nel)
258 ENDIF
259
260 IF(ipart/=0) THEN
261 indx_part(1:mvsiz) = 0
262 indx_part_2(1:mvsiz) = 0
263
264 number_part_group = 1
265 indx_part(number_part_group) = ipart
266 DO i=2,nel
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
271 ipart = ipart_2
272 ENDIF
273 ENDDO
275 indx_part_2(1:number_part_group) = indx_part(1:number_part_group)
276
277 number_part_group_2 = 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)
284 ENDIF
285 ENDDO
286
287 sensors%SENS_GROUP(ng)%NUM_PART = -number_part_group
288
289 ALLOCATE( bool_sensor(energy_sensor) )
290 bool_sensor(1:energy_sensor) = .true.
291
292 number_sensor_per_group = 0
293 DO ijk=1,number_part_group
294 ipart = indx_part(ijk)
295 DO i=1,energy_sensor
296 k = indx_energy(i)
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
300 ENDIF
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.
306 ENDIF
307 ENDDO
308 ENDIF
309 ENDDO
310 ENDDO
311 DEALLOCATE( bool_sensor )
312
313 tot_number_part_group = number_part_group * number_sensor_per_group
314
315 ALLOCATE( sensors%SENS_GROUP(ng)%PART(tot_number_part_group,3) )
316 sensors%SENS_GROUP(ng)%PART(1:tot_number_part_group
317
318 kji = 0
319 DO ijk=1,number_part_group
320 DO i=1,number_sensor_per_group
321 kji = kji + 1
322 sensors%SENS_GROUP(ng)%PART(kji,1) = -indx_part(ijk)
323 ENDDO
324 ENDDO
325
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)
329 ENDDO
330
331 bool = .false.
332 kji = 0
333 DO ijk=1,number_part_group
334 ipart = indx_part(ijk)
335 number_sensor = 0
336 DO i=1,energy_sensor
337 k = indx_energy(i)
338 IF(sensors%SENSOR_STRUCT(k)%TYP == 1) THEN
339 IF(check_bool(i,ijk)<0) THEN
340 IF(sensors%SENSOR_STRUCT(k)%PART == ipart) THEN
341 kji = kji + 1
342
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,3) = k
346
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))
349 bool = .true.
350 ENDIF
351 ENDIF
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
356 kji = kji + 1
357
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))
363 bool = .true.
364 ENDIF
365 ENDDO
366 ENDIF
367 ENDIF
368 ENDDO
369 ENDDO
370
371 IF(bool) sensors%SENS_GROUP(ng)%NUM_PART = kji
372 DEALLOCATE( check_bool )
373 ENDIF
374 ENDDO
375
376
377 DO i=1,energy_sensor
378 k = indx_energy(i)
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
381 ENDDO
382
383 ENDIF
384 ELSE
385 ALLOCATE( sensors%SENS_GROUP(0) )
386 ALLOCATE( sensors%SENSOR_STRUCT(0) )
387 ALLOCATE( sensors%COMM_SENS14%ID_SENS(0) )
388 ENDIF
389
390
391
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)
395 ENDIF
396
397
398 size_comm17_min_max = 0
399 size_comm17_mean = 0
400 ALLOCATE( sensors%COMM_SENS17%ID_SENS(
sensor_temp) )
403 k = indx_temp(i)
404 sensors%COMM_SENS17%ID_SENS(i) = k
405
406 size_comm17_min_max = size_comm17_min_max + 1
407
408 IF (iparit>0) THEN
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
412 ELSE
413 ALLOCATE( sensors%SENSOR_STRUCT(k)%FBSAV6_SENS(1,1,1) )
414 sensors%SENSOR_STRUCT(k)%FBSAV6_SENS(1,1,1) = zero
415 size_comm17_mean = size_comm17_mean + 1
416 ENDIF
417 ENDDO
418 sensors%COMM_SENS17%BUFFER_SIZE_MIN_MAX = size_comm17_min_max
419 sensors%COMM_SENS17%BUFFER_SIZE_MEAN = size_comm17_mean
420 ENDIF
421
422
423
424
425
426 IF (nsensor > 0 ) THEN
427 IF (sensors%NRESET == nsensor) THEN
428 DO i=1,nsensor
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
435 ENDDO
436 ELSE IF (sensors%NRESET > 0) THEN
437 DO j=1,sensors%NRESET
438 DO i=1,nsensor
439 IF (sensors%RESET(j) == sensors%SENSOR_TAB(i)%SENS_ID) THEN
440 sensors%SENSOR_TAB(i)%STATUS = 0
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(i)%SENS_ID
446 EXIT
447 END IF
448 ENDDO
449 ENDDO
450 END IF
451 IF (ALLOCATED(sensors%RESET)) DEALLOCATE (sensors%RESET)
452 sensors%NRESET = 0
453 ENDIF
454
455
456
457
458
459
460 IF (nsensor > 0 ) THEN
461 DO i=1,nsensor
462
463 typ = sensors%SENSOR_TAB(i)%TYPE
464 IF (typ == 0) THEN
465 CALL sensor_time(sensors%SENSOR_TAB(i) ,time ,timestep)
466 ENDIF
467 IF( typ == sensor_type_python ) THEN
468 any_python_sensor = .true.
469 ENDIF
470 ENDDO
471
472
474 ELSE
475 sensors%LOGICAL_SENSOR_COUNT=0
476 ENDIF
477
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))
483 DO isens = 1,nsensor
484 typ = sensors%SENSOR_TAB(isens)%TYPE
485 types(isens) = typ
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)
489 END DO
490 CALL python_update_sensors(types,uids,statuses,results,nsensor)
491 DEALLOCATE(types)
492 DEALLOCATE(uids)
493 DEALLOCATE(results)
494 DEALLOCATE(statuses)
495 ENDIF
496 IF (any_python_sensor) THEN
497 DO isens = 1,nsensor
498 typ = sensors%SENSOR_TAB(isens)%TYPE
499 IF (typ == sensor_type_python) THEN
500 CALL sensor_python(sensors%SENSOR_TAB(isens))
501 ENDIF
502 END DO
503 ENDIF
504
505
506100 FORMAT(' SENSOR NUMBER ',i10,' ,IS RESET TO THE INITIAL STATE')
507
508 RETURN
recursive subroutine quicksort_i(a, first, last)
subroutine sensor_logical(sensors)
subroutine sensor_temp(sensor, isens, igrnod)
subroutine sensor_time(sensor, time, timestep)