33
34
35
37 USE sensor_mod
38
39
40
41#include "implicit_f.inc"
42#include "comlock.inc"
43
44
45
46#include "param_c.inc"
47#include "units_c.inc"
48#include "com08_c.inc"
49#include "task_c.inc"
50
51
52
54 my_real,
DIMENSION(LLACCELM,*) :: accel
55 TYPE (SENSOR_STR_) ,TARGET :: SENSOR
56
57
58
59 INTEGER I,J,IPOINT,IDIR,IACC,ISENSOR_TYPE,NPOINT,INDX,NVAR,ICRIT
60
61 my_real :: time_unit,time,xindx, integral,increment,time_interval
62 my_real :: hic_period,hic_crit,hic,hic_prec,hic_tmp
63 my_real :: time_prec,test_time,delta_t,beta
64 my_real :: acc_x,acc_y,acc_z,acc,accg,acc_prec,current_value,gravity
65 my_real :: period_tmp,opt_period,t1,t2,tmin,tdelay,infinity
66 my_real ,
DIMENSION(:) ,
POINTER :: value_table
67
69 parameter(infinity = 1.0e20)
70
71
72
73
74
75
76
77
78 IF (sensor%STATUS == 1) RETURN
79
80 tmin = sensor%TMIN
81 tdelay = sensor%TDELAY
82 isensor_type = sensor%IPARAM(1)
83 iacc = sensor%IPARAM(2)
84 npoint = sensor%IPARAM(3)
85 idir = sensor%IPARAM(4)
86
87 hic_period = sensor%RPARAM(1)
88 hic_crit = sensor%RPARAM(2)
89 gravity = sensor%RPARAM(3)
90 time_unit = sensor%RPARAM(4)
91
92 time = tt
93 beta = 2.5d0
94 value_table(1:npoint) => sensor%VAR(
nvar+1:
nvar+npoint)
95
96 IF (isensor_type == 1) THEN ! acceletator based
97 acc_x = accel(20,iacc)
98 acc_y = accel(21,iacc)
99 acc_z = accel(22,iacc)
100 ELSE
101 acc_x = accn(1,iacc)
102 acc_y = accn(2,iacc)
103 acc_z = accn(3,iacc)
104 END IF
105
106 IF (idir == 1) THEN
107 acc = sqrt(acc_x**2 + acc_y**2 + acc_z**2)
108 ELSEIF (idir == 2) THEN
109 acc = acc_x
110 ELSEIF (idir == 3) THEN
111 acc = acc_y
112 ELSE
113 acc = acc_z
114 END IF
115 accg = acc / gravity
116
117
118
119 time_prec = sensor%VAR(1)
120 acc_prec = sensor%VAR(2)
121 xindx = sensor%VAR(3)
122 hic_prec = sensor%VAR(4)
123 indx = nint(xindx)
124 icrit = 0
125
126 time_interval = hic_period / npoint
127 test_time = time_prec + time_interval
128
129
130
131 IF (time > test_time) THEN
132 delta_t = time - time_prec
133
134 current_value = (acc_prec + accg*dt12) / delta_t
135
136 IF (indx == npoint) THEN
137
138 DO i = 1,npoint-1
139 value_table(i) = value_table(i+1)
140 END DO
141 ELSE
142 indx = indx + 1
143 ENDIF
144 value_table(indx) = current_value
145
146
147
148
149 opt_period = zero
150 hic = zero
151 DO i = 1,indx
152 integral = zero
153 DO j = i,indx
154 integral = integral + value_table(j)*delta_t
155 END DO
156 increment = indx + 1 - i
157 period_tmp = delta_t * increment
158 hic_tmp = period_tmp * ((integral/period_tmp)**beta)
159 hic_tmp = hic_tmp * time_unit
160 IF (hic_tmp > hic) THEN
161 hic = hic_tmp
162 opt_period = period_tmp
163 t1 =
max(time - opt_period, zero)
164 t2 = time
165 ENDIF
166 END DO
167
168
169 sensor%VAR(1) = time
170 sensor%VAR(2) = zero
171 sensor%VAR(3) = indx
172 IF (hic >= hic_prec) THEN
173 sensor%VAR(4) = hic
174 icrit = 1
175 ENDIF
176
177
178 IF (sensor%TCRIT + tmin > tt) THEN
179 IF (icrit == 0) THEN
180 sensor%TCRIT = infinity
181 ELSE IF (sensor%TCRIT == infinity) THEN
182 sensor%TCRIT =
min(sensor%TCRIT, tt)
183 END IF
184 ELSE IF (sensor%TSTART == infinity) THEN
185 sensor%TSTART = sensor%TCRIT + tmin + tdelay
186 END IF
187
188 IF (sensor%TSTART <= tt) THEN
189 sensor%STATUS = 1
190 END IF
191
192 ELSE
193
194 sensor%VAR(2) = sensor%VAR(2) + accg*dt12
195 ENDIF
196
197 IF (sensor%STATUS == 1 .and. ispmd == 0) THEN
198#include "lockon.inc"
199 WRITE (istdo,1100 ) sensor%SENS_ID,sensor%TSTART
200 WRITE (iout ,1100 ) sensor%SENS_ID,sensor%TSTART
201 WRITE (iout ,1200) hic, hic_period
202 WRITE (iout ,1300) t1, t2
203#include "lockoff.inc"
204 ENDIF
205
2061100 FORMAT(' SENSOR NUMBER ',i10,' ,ACTIVATED AT TIME ',1pe12.5)
2071200 FORMAT(' HIC = ',1pe12.5,' ,HIC PERIOD = ',1pe12.5)
2081300 FORMAT(' TIME T1 = ' 1pe12.5,' ,TIME T2 = ',1pe12.5)
209
210 RETURN
integer function nvar(text)