39 SUBROUTINE sensor_spmd(SENSOR_TAB,IPARI ,NPRW ,ISENSP ,NSENSP ,
40 . XSENS ,X ,ACCELM ,IACCP ,NACCP ,
41 . GAUGE ,IGAUP ,NGAUP ,PARTSAV2,NSENSOR,
42 . COMM_SENS14,SENSOR_STRUCT )
54#include "implicit_f.inc"
66 INTEGER ,
INTENT(IN) :: NSENSOR
67 INTEGER IPARI(NPARI,NINTER),
68 . NPRW(*), ISENSP(2,*), NSENSP(*), IACCP(*), NACCP(*),
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) :: SENSOR_STRUCT(*)
78 INTEGER K, TYP, LEN, IN, N5, ISENSUSR, I, LEN1,LOC_PROC,
79 . ISENST1, ISENST2, KK, N1, N2,M,
80 . (NSENSOR), ISENST10,ISENST13,J
81 my_real rbuf(nsensor*lsenbuf), rxbuf(5,2*nsensor)
84 CHARACTER(len=4) :: MY_OPERATION
85 REAL(kind=8),
DIMENSION(:),
ALLOCATABLE :: SBUF_DOUBLE,RBUF_DOUBLE
86 INTEGER :: I2,I3,I4,IDX
99 typ = sensor_tab(k)%TYPE
102 ELSEIF (typ == 2)
THEN
104 IF(isensp(1,k) == loc_proc)
THEN
105 n1 = sensor_tab(k)%IPARAM(1)
106 IF(loc_proc /= 1)
THEN
110 rxbuf(3,kk) = x(1,n1)
111 rxbuf(4,kk) = x(2,n1)
112 rxbuf(5,kk) = x(3,n1)
120 IF(isensp(2,k) == loc_proc)
THEN
121 n2 = sensor_tab(k)%IPARAM(2)
122 IF(loc_proc /= 1)
THEN
126 rxbuf(3,kk) = x(1,n2)
127 rxbuf(4,kk) = x(2,n2)
128 rxbuf(5,kk) = x(3,n2)
138 in = sensor_tab(k)%IPARAM(1)
139 IF (in > ninter) in = sensor_tab(k)%IPARAM(2)
140 ibuf(len) = ipari(29,in)
143 in = sensor_tab(k)%IPARAM(1)
146 ELSEIF(typ == 10)
THEN
149 ELSEIF (typ == 13)
THEN
152 IF (isensp(1,k) == loc_proc)
THEN
153 n1 = sensor_tab(k)%IPARAM(1)
154 IF (loc_proc /= 1)
THEN
158 rxbuf(3,kk) = x(1,n1)
159 rxbuf(4,kk) = x(2,n1)
160 rxbuf(5,kk) = x(3,n1)
167 IF (isensp(2,k) == loc_proc)
THEN
168 n2 = sensor_tab(k)%IPARAM(2)
170 IF (loc_proc /= 1)
THEN
174 rxbuf(3,kk) = x(1,n2)
175 rxbuf(4,kk) = x(2,n2)
176 rxbuf(5,kk) = x(3,n2)
183 IF (loc_proc /= 1)
THEN
203 ELSEIF(typ == 29.OR.typ == 30.OR.typ == 31)
THEN
206 IF(naccelm>0) isenst1 = 1
210 IF (isenst1 == 1)
THEN
214 CALL spmd_rbcast(accelm,accelm,llaccelm,naccelm,0,2)
217 IF (isenst10 == 1)
THEN
224 IF (isenst2 == 1)
THEN
231 IF (isenst13 == 1)
THEN
238 typ = sensor_tab(k)%TYPE
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)
245 xsens(10,k) = xsens(4,k)
246 xsens(11,k) = xsens(5,k)
247 xsens(12,k) = xsens(6,k)
255 IF(comm_sens14%BOOL)
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)
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)
272 CALL spmd_allreduce(sbuf_double,rbuf_double,my_size,spmd_sum)
274 DO k=1,comm_sens14%NUM_SENS
275 j = comm_sens14%ID_SENS(k)
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)
285 DEALLOCATE( sbuf_double )
286 DEALLOCATE( rbuf_double )
302 typ = sensor_tab(k)%TYPE
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
310 in = sensor_tab(k)%IPARAM(1)
312 nprw(n5) =
min(ibuf(len),1)
subroutine sensor_spmd(sensor_tab, ipari, nprw, isensp, nsensp, xsens, x, accelm, iaccp, naccp, gauge, igaup, ngaup, partsav2, nsensor, comm_sens14, sensor_struct)