43
44
45
46
47
48 USE sensor_mod
50 USE spmd_mod
51
52
53
54#include "implicit_f.inc"
55
56
57
58#include "param_c.inc"
59#include "com04_c.inc"
60#include "com08_c.inc"
61#include "task_c.inc"
62#include "parit_c.inc"
63
64
65
66 INTEGER ,INTENT(IN) :: NSENSOR
67 INTEGER IPARI(NPARI,NINTER),
68 . NPRW(*), ISENSP(2,*), NSENSP(*), IACCP(*), NACCP(*),
69 . IGAUP(*), NGAUP(*)
71 . accelm(llaccelm,*), gauge(llgauge,*),partsav2(2,*)
72 TYPE (SENSOR_STR_) ,DIMENSION(NSENSOR) :: SENSOR_TAB
73 type(sensor_comm),INTENT(INOUT) :: COMM_SENS14
74 type(sensor_type),DIMENSION(NSENSOR),INTENT(INOUT) :: (*)
75
76
77
78 INTEGER K, TYP, LEN, IN, N5, ISENSUSR, I, LEN1,LOC_PROC,
79 . ISENST1, ISENST2, KK, N1, N2,M,
80 . IBUF(NSENSOR), ISENST10,ISENST13,J
81 my_real rbuf(nsensor*lsenbuf), rxbuf(5,2*nsensor)
82
83 INTEGER :: MY_SIZE
84 CHARACTER(len=4) :: MY_OPERATION
85 REAL(kind=8), dimension(:), ALLOCATABLE :: sbuf_double,rbuf_double
86 INTEGER :: I2,I3,I4,IDX
87
88
89
90 isenst1 = 0
91 isenst2 = 0
92 isenst10= 0
93 isenst13= 0
94 loc_proc = ispmd+1
95 kk = 0
96 len = 0
97 isensusr = 0
98 DO k=1,nsensor
99 typ = sensor_tab(k)%TYPE
100 IF (typ == 1) THEN
101 isenst1 = 1
102 ELSEIF (typ == 2) THEN
103 isenst2 = 1
104 IF(isensp(1,k) == loc_proc)THEN
105 n1 = sensor_tab(k)%IPARAM(1)
106 IF(loc_proc /= 1)THEN
107 kk = kk+1
108 rxbuf(1,kk) = k
109 rxbuf(2,kk) = 1
110 rxbuf(3,kk) = x(1,n1)
111 rxbuf(4,kk) = x(2,n1)
112 rxbuf(5,kk) = x(3,n1)
113 ELSE
114
115 xsens(1,k) = x(1,n1)
116 xsens(2,k) = x(2,n1)
117 xsens(3,k) = x(3,n1)
118 END IF
119 END IF
120 IF(isensp(2,k) == loc_proc)THEN
121 n2
122 IF(loc_proc /= 1)THEN
123 kk = kk+1
124 rxbuf(1,kk) = k
125 rxbuf(2,kk) = 2
126 rxbuf(3,kk) = x(1,n2)
127 rxbuf(4,kk) = x(2,n2)
128 rxbuf(5,kk) = x(3,n2)
129 ELSE
130
131 xsens(4,k) = x(1,n2)
132 xsens(5,k) = x(2,n2)
133 xsens(6,k) = x(3,n2)
134 END IF
135 END IF
136 ELSEIF(typ == 6)THEN
137 len = len + 1
138 in = sensor_tab(k)%IPARAM(1)
139 IF (in > ninter) in = sensor_tab(k)%IPARAM(2)
140 ibuf(len) = ipari(29,in)
141 ELSEIF(typ == 7)THEN
142 len = len + 1
143 in = sensor_tab(k)%IPARAM(1)
144 n5 = in + 4*nrwall
145 ibuf(len) = nprw(n5)
146 ELSEIF(typ == 10)THEN
147 isenst10 = 1
148
149 ELSEIF (typ == 13) THEN
150
151 isenst13 = 1
152 IF (isensp(1,k) == loc_proc) THEN
153 n1 = sensor_tab(k)%IPARAM(1)
154 IF (loc_proc /= 1) THEN
155 kk = kk+1
156 rxbuf(1,kk) = k
157 rxbuf(2,kk) = 1
158 rxbuf(3,kk) = x(1,n1)
159 rxbuf(4,kk) = x(2,n1)
160 rxbuf(5,kk) = x(3,n1)
161 ELSE
162 xsens(1,k) = x(1,n1)
163 xsens(2,k) = x(2,n1)
164 xsens(3,k) = x(3,n1)
165 END IF
166 END IF
167 IF (isensp(2,k) == loc_proc) THEN
168 n2 = sensor_tab(k)%IPARAM(2)
169 IF (n2 > 0 ) THEN
170 IF (loc_proc /= 1) THEN
171 kk = kk+1
172 rxbuf(1,kk) = k
173 rxbuf(2,kk) = 2
174 rxbuf(3,kk) = x(1,n2)
175 rxbuf(4,kk) = x(2,n2)
176 rxbuf(5,kk) = x(3,n2)
177 ELSE
178 xsens(4,k) = x(1,n2)
179 xsens(5,k) = x(2,n2)
180 xsens(6,k) = x(3,n2)
181 END IF
182 ELSE
183 IF (loc_proc /= 1) THEN
184 kk = kk+1
185 rxbuf(1,kk) = k
186 rxbuf(2,kk) = 2
187 rxbuf(3,kk) = zero
188 rxbuf(4,kk) = zero
189 rxbuf(5,kk) = zero
190 ELSE
191 xsens(4,k) = zero
192 xsens(5,k) = zero
193 xsens(6,k) = zero
194 END IF
195 END IF
196 END IF
197
198 ELSEIF(typ==16)THEN
199
200
201 isenst1 = 1
202
203 ELSEIF(typ == 29.OR.typ == 30.OR.typ == 31)THEN
204
205 isensusr = 1
206 IF(naccelm>0) isenst1 = 1
207 ENDIF
208 ENDDO
209
210 IF (isenst1 == 1) THEN
211
212
214 CALL spmd_rbcast(accelm,accelm,llaccelm,naccelm,0,2)
215 END IF
216
217 IF (isenst10 == 1) THEN
218
219
222 END IF
223
224 IF (isenst2 == 1) THEN
225
226
229 END IF
230
231 IF (isenst13 == 1) THEN
232
233
236 IF (tt == zero) THEN
237 DO k=1,nsensor
238 typ = sensor_tab(k)%TYPE
239 IF (typ == 13) THEN
240 xsens(7,k) = xsens(1,k)
241 xsens(8,k) = xsens(2,k)
242 xsens(9,k) = xsens(3,k)
243 n2 = sensor_tab(k)%IPARAM(2)
244 IF (n2 > 0) THEN
245 xsens(10,k) = xsens(4,k)
246 xsens(11,k) = xsens(5,k)
247 xsens(12,k) = xsens(6,k)
248 ENDIF
249 ENDIF
250 ENDDO
251 ENDIF
252 END IF
253
254
255 IF(comm_sens14%BOOL) THEN
256 IF(iparit>0) THEN
257 my_size = comm_sens14%NUM_SENS*2*6*nthread
258 ALLOCATE( sbuf_double(my_size) )
259 ALLOCATE( rbuf_double(my_size) )
260 DO k=1,comm_sens14%NUM_SENS
261 j = comm_sens14%ID_SENS(k)
262 DO i2=1,2
263 DO i3=1,6
264 DO i4=1,nthread
265 idx = ((k-1)*2*6*nthread) + ((i2-1)*6*nthread) + ((i3-1)*nthread) + i4
266 sbuf_double(idx) = sensor_struct(j)%FBSAV6_SENS(i2,i3,i4)
267 END DO
268 END DO
269 END DO
270 ENDDO
271
272 CALL spmd_allreduce(sbuf_double,rbuf_double,my_size,spmd_sum)
273
274 DO k=1,comm_sens14%NUM_SENS
275 j = comm_sens14%ID_SENS(k)
276 DO i2=1,2
277 DO i3=1,6
278 DO i4=1,nthread
279 idx = ((k-1)*2*6*nthread) + ((i2-1)*6*nthread) + ((i3-1)*nthread) + i4
280 sensor_struct(j)%FBSAV6_SENS(i2,i3,i4) = rbuf_double(idx)
281 END DO
282 END DO
283 END DO
284 ENDDO
285 DEALLOCATE( sbuf_double )
286 DEALLOCATE( rbuf_double )
287 ELSE
290 ENDIF
291 ENDIF
292
293
294 IF (len > 0) THEN
295
298
299
300 len = 0
301 DO k=1,nsensor
302 typ = sensor_tab(k)%TYPE
303 IF (typ == 6)THEN
304 len = len + 1
305 in = sensor_tab(k)%IPARAM(1)
306 IF (in > ninter) in = sensor_tab(k)%IPARAM(2)
307 ipari(29,in)=
min(ibuf(len),1)
308 ELSEIF (typ == 7)THEN
309 len = len + 1
310 in = sensor_tab(k)%IPARAM(1)
311 n5 = in + 4*nrwall
312 nprw(n5) =
min(ibuf(len),1)
313 ENDIF
314 ENDDO
315
316 ENDIF
317
318 RETURN
subroutine spmd_ibcast(tabi, tabr, n1, n2, from, add)
subroutine spmd_rbcast(tabi, tabr, n1, n2, from, add)
subroutine spmd_sd_acc(accelm, iaccp, naccp)
subroutine spmd_sd_sens(xsens, rxbuf, nsensp)
subroutine spmd_glob_dsum9(v, len)
subroutine spmd_glob_isum9(v, len)