37
38
39
41
42
43
44 USE spmd_comm_world_mod, ONLY : spmd_comm_world
45#include "implicit_f.inc"
46#include "r4r8_p.inc"
47
48
49
50#include "spmd.inc"
51
52
53
54#include "scr06_c.inc"
55#include "com01_c.inc"
56#include "com04_c.inc"
57#include "task_c.inc"
58#include "units_c.inc"
59#include "rad2r_c.inc"
60#include "tabsiz_c.inc"
61
62
63
64 INTEGER,INTENT(IN) :: IAD_ELEM(2,NSPMD+1),FR_ELEM(SFR_ELEM),
65 . SIZE,DD_R2R(NSPMD+1,SDD_R2R),DD_R2R_ELEM(SDD_R2R_ELEM),
66 . FLAG,WEIGHT(NUMNOD),SBUF_SIZE,RBUF_SIZE
67 my_real,
INTENT(IN) :: v(3,numnod),vr(3,numnod)
68 my_real,
INTENT(INOUT) :: wf,wf2,a(3,numnod),ar(3,numnod),
69 . ms(numnod),in(iroddl*numnod)
70 TYPE(NLOCAL_STR_), TARGET, INTENT(IN) :: NLOC_DMG
71
72
73
74#ifdef MPI
75 INTEGER MSGTYP,I,NOD,LOC_PROC,IERROR,
76 . SIZ,J,K,L,NB_NOD,
77 . STATUS(MPI_STATUS_SIZE),
78 . IAD_SEND(NSPMD+1),IAD_RECV(NSPMD+1),
79 . REQ_R(NSPMD),REQ_S(NSPMD),OFFSET,MSGOFF,NN,
80 . OFFSET_S_NL,OFFSET_R_NL
82 . rbuf(rbuf_size),sbuf(sbuf_size),
83 . df1,df2,df3,df4,df5,df6
84
85 INTEGER, POINTER, DIMENSION(:) :: IDXI,POSI
86 my_real,
POINTER,
DIMENSION(:) :: fnl
87
88 DATA msgoff/5015/
89
90
91
92
93
94 fnl => nloc_dmg%FNL(1:nloc_dmg%L_NLOC,1)
95 idxi => nloc_dmg%IDXI(1:numnod)
96 posi => nloc_dmg%POSI(1:nloc_dmg%NNOD+1)
97
98
99 offset = dd_r2r(nspmd+1,1)-1
100 offset_s_nl = offset + dd_r2r(nspmd+1,2)-1
101 offset_r_nl = offset_s_nl + dd_r2r(nspmd+1,3)-1
102
103 loc_proc = ispmd + 1
104 l = 1
105 iad_recv(1) = 1
106
107 DO i=1,nspmd
108 siz = size*(dd_r2r(i+1,2)-dd_r2r(i,2))+dd_r2r(i+1,4)-dd_r2r(i,4)
109 IF(siz/=0)THEN
110 msgtyp = msgoff
112 s rbuf(l),siz,real,it_spmd(i),msgtyp,
113 g spmd_comm_world,req_r(i),ierror)
114 l = l + siz
115 ENDIF
116 iad_recv(i+1) = l
117 END DO
118 l = 1
119 iad_send(1) = 1
120
121 DO i=1,nspmd
122
123 IF(iroddl/=0) THEN
124#include "vectorize.inc"
125 DO j=dd_r2r(i,1),dd_r2r(i+1,1)-1
126 nod = dd_r2r_elem(j)
127 sbuf(l ) = a(1,nod)
128 sbuf(l+1) = a(2,nod)
129 sbuf(l+2) = a(3,nod)
130 sbuf(l+3) = ar(1,nod)
131 sbuf(l+4) = ar(2,nod)
132 sbuf(l+5) = ar(3,nod)
133 IF (flag==1) THEN
134 sbuf(l+6) = ms(nod)
135 sbuf(l+7) = in(nod)
136 ENDIF
137 l = l + SIZE
138 ENDDO
139
140 ELSE
141#include "vectorize.inc"
142 DO j=dd_r2r(i,1),dd_r2r(i+1,1)-1
143 nod = dd_r2r_elem(j)
144 sbuf(l ) = a(1,nod)
145 sbuf(l+1) = a(2,nod)
146 sbuf(l+2) = a(3,nod)
147 IF (flag==1) THEN
148 sbuf(l+3) = ms(nod)
149 ENDIF
150 l = l + SIZE
151 END DO
152 ENDIF
153
154#include "vectorize.inc"
155 DO j=dd_r2r(i,3),dd_r2r(i+1,3)-1
156 nod = dd_r2r_elem(offset_s_nl + j)
157 k = posi(idxi(nod))
158 sbuf(l) = fnl(k)
159 l = l + 1
160 ENDDO
161
162 iad_send(i+1) = l
163 ENDDO
164
165
166
167 DO i=1,nspmd
168
169
170
171 IF(dd_r2r(i+1,1)-dd_r2r(i,1)>0)THEN
172 msgtyp = msgoff
173 siz = iad_send(i+1)-iad_send(i)
174 l = iad_send(i)
176 s sbuf(l),siz,real,it_spmd(i),msgtyp,
177 g spmd_comm_world,req_s(i),ierror)
178 ENDIF
179
180 ENDDO
181
182
183
184 DO i = 1, nspmd
185
186 nb_nod = dd_r2r(i+1,2)-dd_r2r(i,2)
187 IF(nb_nod>0)THEN
188 CALL mpi_wait(req_r(i),status,ierror)
189 l = iad_recv(i)
190
191 IF(iroddl/=0) THEN
192#include "vectorize.inc"
193 DO j=dd_r2r(i,2),dd_r2r(i+1,2)-1
194 nod = dd_r2r_elem(offset+j)
195 IF(weight(nod)==1)THEN
196 df1 = rbuf(l)-a(1,nod)
197 df2 = rbuf(l+1)-a(2,nod)
198 df3 = rbuf(l+2)-a(3,nod)
199 df4 = rbuf(l+3)-ar(1,nod)
200 df5 = rbuf(l+4)-ar(2,nod)
201 df6 = rbuf(l+5)-ar(3,nod)
202 ENDIF
203 a(1,nod) = rbuf(l)
204 a(2,nod) = rbuf(l+1)
205 a(3,nod) = rbuf(l+2)
206 ar(1,nod)= rbuf(l+3)
207 ar(2,nod)= rbuf(l+4)
208 ar(3,nod)= rbuf(l+5)
209 IF (flag==1) THEN
210 ms(nod)= rbuf(l+6)
211 in(nod)= rbuf(l+7)
212 ENDIF
213 l = l + SIZE
214
215 IF(weight(nod)==1)THEN
216 wf = wf + (df1*v(1,nod)+df2*v(2,nod)+
217 . df3*v(3,nod))/two
218 wf2= wf2+ (df1*a(1,nod)+df2*a(2,nod)+
219 . df3*a(3,nod))/(two*ms(nod))
220 wf = wf + (df4*vr(1,nod)+df5*vr(2,nod)+
221 . df6*vr(3,nod))/two
222 wf2= wf2+ (df4*ar(1,nod)+df5*ar(2,nod)+
223 . df6*ar(3,nod))/(two*in(nod))
224 ENDIF
225 END DO
226 ELSE
227#include "vectorize.inc"
228 DO j=dd_r2r(i,2),dd_r2r(i+1,2)-1
229 nod = dd_r2r_elem(offset+j)
230 IF(weight(nod)==1)THEN
231 df1 = rbuf(l)-a(1,nod)
232 df2 = rbuf(l+1)-a(2,nod)
233 df3 = rbuf(l+2)-a(3,nod)
234 ENDIF
235 a(1,nod) = rbuf(l)
236 a(2,nod) = rbuf(l+1)
237 a(3,nod) = rbuf(l+2)
238 IF (flag==1) THEN
239 ms(nod)= rbuf(l+3)
240 ENDIF
241 l = l + SIZE
242
243 IF(weight(nod)==1)THEN
244 wf = wf + (df1*v(1,nod)+df2*v(2,nod)+
245 . df3*v(3,nod))/two
246 wf2= wf2+ (df1*a(1,nod)+df2*a(2,nod)+
247 . df3*a(3,nod))/(two*ms(nod))
248 ENDIF
249 END DO
250 ENDIF
251
252#include "vectorize.inc"
253 DO j=dd_r2r(i,4),dd_r2r(i+1,4)-1
254 nod = dd_r2r_elem(offset_r_nl + j)
255 k = posi(idxi(nod))
256 fnl(k) = rbuf(l)
257 l = l + 1
258 ENDDO
259
260 ENDIF
261
262 END DO
263
264
265
266 DO i = 1, nspmd
267 IF(dd_r2r(i+1,1)-dd_r2r(i,1)>0)THEN
268 CALL mpi_wait(req_s(i),status,ierror)
269 ENDIF
270 ENDDO
271
272
273#endif
274 RETURN
subroutine mpi_isend(buf, cnt, datatype, dest, tag, comm, ireq, ierr)
subroutine mpi_wait(ireq, status, ierr)
subroutine mpi_irecv(buf, cnt, datatype, source, tag, comm, ireq, ierr)