OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
sensor_init.F
Go to the documentation of this file.
1Copyright> OpenRadioss
2Copyright> Copyright (C) 1986-2025 Altair Engineering Inc.
3Copyright>
4Copyright> This program is free software: you can redistribute it and/or modify
5Copyright> it under the terms of the GNU Affero General Public License as published by
6Copyright> the Free Software Foundation, either version 3 of the License, or
7Copyright> (at your option) any later version.
8Copyright>
9Copyright> This program is distributed in the hope that it will be useful,
10Copyright> but WITHOUT ANY WARRANTY; without even the implied warranty of
11Copyright> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12Copyright> GNU Affero General Public License for more details.
13Copyright>
14Copyright> You should have received a copy of the GNU Affero General Public License
15Copyright> along with this program. If not, see <https://www.gnu.org/licenses/>.
16Copyright>
17Copyright>
18Copyright> Commercial Alternative: Altair Radioss Software
19Copyright>
20Copyright> As an alternative to this open-source version, Altair also offers Altair Radioss
21Copyright> software under a commercial license. Contact Altair to discuss further if the
22Copyright> commercial version may interest you: https://www.altair.com/radioss/.
23!||====================================================================
24!|| sensor_init ../engine/source/tools/sensor/sensor_init.F
25!||--- called by ------------------------------------------------------
26!|| resol ../engine/source/engine/resol.F
27!||--- calls -----------------------------------------------------
28!|| quicksort_i ../common_source/tools/sort/quicksort.F
29!|| sensor_logical ../engine/source/tools/sensor/sensor_logical.F
30!|| sensor_python ../engine/source/tools/sensor/sensor_python.F90
31!|| sensor_time ../engine/source/tools/sensor/sensor_time.f
32!||--- uses -----------------------------------------------------
33!|| groupdef_mod ../common_source/modules/groupdef_mod.F
34!|| my_alloc_mod ../common_source/tools/memory/my_alloc.F90
35!|| python_funct_mod ../common_source/modules/python_mod.F90
36!|| sensor_mod ../common_source/modules/sensor_mod.F90
37!|| sensor_python_mod ../engine/source/tools/sensor/sensor_python.F90
38!||====================================================================
39 SUBROUTINE sensor_init( SUBSET,IPARG,NGROUC,
40 . IPARTC,IPARTTG,IPARTS,IPARTQ,IPARTT,
41 . IPARTP,IPARTR,SENSORS,TIME ,TIMESTEP,
42 . IOUT ,PYTHON,NTASK)
43C-----------------------------------------------
44C M o d u l e s
45C-----------------------------------------------
46 USE sensor_python_mod
47 USE python_funct_mod
48 USE groupdef_mod
49 USE sensor_mod
50 USE my_alloc_mod
51C-----------------------------------------------
52C I m p l i c i t T y p e s
53C-----------------------------------------------
54#include "implicit_f.inc"
55C-----------------------------------------------
56C C o m m o n B l o c k s
57C-----------------------------------------------
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"
65C-----------------------------------------------
66C D u m m y A r g u m e n t s
67C-----------------------------------------------
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
78C-----------------------------------------------
79C L o c a l V a r i a b l e s
80C-----------------------------------------------
81 LOGICAL :: BOOL
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
91
92 INTEGER :: ISURF
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
101 INTEGER :: ISENS
102! *********************************************
103! In 1 element group : 1 or several PART
104! --> one or several /SENSOR linked to the PARTs
105! structure of SENS_GROUP(NG)%PART
106! for energy sensor type 1 : only 1 part per sensor
107! for energy sensor type 2 : several part per sensor
108! %PART(:,1): id of the part
109! %PART(:,2): type of energy sensor
110! %PART(:,3): id of the sensor
111!
112! Example with one element group with :
113! * 2 /PARTs
114! * one sensor type=1 per PART
115! %PART(:,1): id of the part | 32 | 89 |
116! %PART(:,2): type of energy sensor | 1 | 1 |
117! %PART(:,3): id of the sensor | 3 | 67 |
118
119! Example with one element group with :
120! * 2 /PARTs
121! * 2 sensors type= 1 & 2
122! %PART(:,1): id of the part | 32 | 32 89 |
123! %PART(:,2): type of energy sensor | 1 | 2 |
124! %PART(:,3): id of the sensor | 3 | 67 |
125!
126c=======================================================================
127 ! Allocate SENSORS%ngr_sensor
128 CALL my_alloc(sensors%NGR_SENSOR,ntask)
129C
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
143c
144 surf_dist_sensor = 0
145 energy_sensor = 0
146 sensor_temp = 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 ! count the number of sensors by type
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 ! sensor energy
159 energy_sensor = energy_sensor + 1
160 indx_energy(energy_sensor) = k
161 ELSE IF (typ==16) THEN
162 ! distance to surface
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 ! sensor temperature
170 igrn = sensors%SENSOR_TAB(k)%IPARAM(1)
171 IF (igrn > 0) THEN
172 sensor_temp = sensor_temp + 1
173 indx_temp(sensor_temp) = k
174 ENDIF
175 ENDIF
176 ! --------------------
177 ENDDO
178 ! -----------------------------------------
179 ! activation of the mpi communication
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.
187 sensors%COMM_SENS17%NUM_SENS = sensor_temp
188
189 ! ---------------------
190 ! ENERGY SENSOR
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 ! type of part : subset (=2) or not (=1)
198 sensors%SENSOR_STRUCT(:)%PART = 0 ! part id
199 sensors%SENSOR_STRUCT(:)%NB_SUB = 0 ! number of subset
200
201 IF(energy_sensor>0) THEN
202 ! -----------------------------------------
203 ! get the /PART id for each sensor
204 DO i=1,energy_sensor
205 k = indx_energy(i)
206 typ = sensors%SENSOR_TAB(k)%TYPE
207 ! --------------------
208 ! sensor energy
209 ipart = sensors%SENSOR_TAB(k)%IPARAM(1)
210 isubs = sensors%SENSOR_TAB(k)%IPARAM(2)
211 IF(ipart>0) THEN
212 ! only one part per sensor
213 sensors%SENSOR_STRUCT(k)%TYP = 1
214 sensors%SENSOR_STRUCT(k)%PART = ipart ! part id
215 ELSEIF(isubs>0) THEN
216 ! several subparts per sensor
217 sensors%SENSOR_STRUCT(k)%TYP = 2
218 np = subset(isubs)%NTPART ! number of part
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) ! part id
223 ENDDO
224 ENDIF
225 ! -------------------
226 ENDDO
227
228 ! -----------------------------------------
229 ! count the number of element group for each part
230 ! and create a pointer to the FBSAV6 double precision array (parith/on array)
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) ! shell
239 ipart_pointer => ipartc(nf1:nf1+nel)
240 ELSEIF(ity==7) THEN
241 ipart = iparttg(nf1) ! shell3n
242 ipart_pointer => iparttg(nf1:nf1+nel)
243 ELSEIF(ity==1.OR.ity==101) THEN
244 ipart = iparts(nf1) ! solid & ig3dsolid element
245 ipart_pointer => iparts(nf1:nf1+nel)
246 ELSEIF(ity==2) THEN
247 ipart = ipartq(nf1) ! quad
248 ipart_pointer => ipartq(nf1:nf1+nel)
249 ELSEIF(ity==4) THEN
250 ipart = ipartt(nf1) ! truss
251 ipart_pointer => ipartt(nf1:nf1+nel)
252 ELSEIF(ity==5) THEN
253 ipart = ipartp(nf1) ! poutre
254 ipart_pointer => ipartp(nf1:nf1+nel)
255 ELSEIF(ity==6) THEN
256 ipart = ipartr(nf1) ! poutre
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 ! number of part in a element group
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
274 CALL quicksort_i(indx_part,1,number_part_group)
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 ! number of part in one groupe
288 ! count the number of sensor for a element group
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 ! total size of SENS_GROUP(NG)%PART
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,1:3) = 0
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)! part id
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)! part id
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 ! check if already done(loop over the part of an element group!!!)
340 IF(sensors%SENSOR_STRUCT(k)%PART == ipart) THEN
341 kji = kji + 1
342 ! number of group per part for a given sensor
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 ! type of energy sensor
345 sensors%SENS_GROUP(ng)%PART(kji,3) = k ! index of the current sensor
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 ! check if already done (loop over the part of an element group!!!)
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 ! number of group per subpart
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 ! type of energy sensor
360 sensors%SENS_GROUP(ng)%PART(kji,3) = k ! index of the current sensor
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 ! number of part in one groupe * number of sensor
372 DEALLOCATE( check_bool )
373 ENDIF
374 ENDDO
375 ! -----------------------------------------
376 ! allocation of FBSAV6 double precision array (parith/on array)
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 ! DISTANCE TO SURFACE SENSOR
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 ! SENSOR TEMPERATURE
398 size_comm17_min_max = 0
399 size_comm17_mean = 0
400 ALLOCATE( sensors%COMM_SENS17%ID_SENS(sensor_temp) )
401 IF (sensor_temp > 0) THEN
402 DO i=1,sensor_temp
403 k = indx_temp(i)
404 sensors%COMM_SENS17%ID_SENS(i) = k
405 ! Temp max and min : 1 data per sensor
406 size_comm17_min_max = size_comm17_min_max + 1
407 ! Temp mean : 6 data per sensor (parith/on) / 1 data per sensor (parith/off)
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
423C ---------------------------------------------------------------------
424C Reinitialize sensors defined in /SENS/RESET
425c----------------------------------------------------------------------
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
457C ---------------------------------------------------------------------
458C Play Sensors which could be active at TT=0
459c----------------------------------------------------------------------
460 IF (nsensor > 0 ) THEN
461 DO i=1,nsensor
462 ! Time Sensor if TT=0
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 ! Logical Sensors can be active at TT=0
473 CALL sensor_logical(sensors)
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 ! ISENS
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 ! TYP
502 END DO ! ISENS
503 ENDIF
504
505c-----------------------------------------------------------------------
506100 FORMAT(' SENSOR NUMBER ',i10,' ,IS RESET TO THE INITIAL STATE')
507c-----------
508 RETURN
509 END SUBROUTINE sensor_init
#define my_real
Definition cppsort.cpp:32
end diagonal values have been computed in the(sparse) matrix id.SOL
recursive subroutine quicksort_i(a, first, last)
Definition quicksort.F:92
subroutine sensor_init(subset, iparg, ngrouc, ipartc, iparttg, iparts, ipartq, ipartt, ipartp, ipartr, sensors, time, timestep, iout, python, ntask)
Definition sensor_init.F:43
subroutine sensor_logical(sensors)
subroutine sensor_time(sensor, time, timestep)
Definition sensor_time.F:33