41
42
43
46
47
48
49 USE spmd_comm_world_mod, ONLY : spmd_comm_world
50#include "implicit_f.inc"
51
52
53
54#include "spmd.inc"
55
56
57
58#include "com01_c.inc"
59#include "task_c.inc"
60
61
62
63 INTEGER , NRSKYI17, NIN, LSKYI17, NOINT,
64 . ISKYI17(*), IRSKYI17(*)
66 . fskyi17(lskyi17,4),
67 . frskyi17(4,*)
68
69
70
71#ifdef MPI
72 INTEGER P, L, ADD, LL, NB, LEN, SIZ, LOC_PROC,
73 . IDEB, N, MSGTYP, IERROR, IDEBI, NI, NOD,
74 . IALLOCS, IALLOCR, IES, I, NN, MSGOFF, MSGOFF2,
75 . STATUS(MPI_STATUS_SIZE),
76 . REQ_SI(NSPMD),REQ_S(NSPMD),REQ_R(NSPMD),
77 . ISIZRCV(2,NSPMD),ISIZENV(2,NSPMD),
78 . NSNFITOT(NSPMD),NSNSITOT(NSPMD)
79 DATA msgoff/146/
80 DATA msgoff2/147/
81 LOGICAL ITEST
82 my_real ,
DIMENSION(:),
ALLOCATABLE :: bbufs, bbufr
83
84
85
86 loc_proc = ispmd + 1
87
88 len = 5
89
90
91
92 DO p = 1, nspmd
93 isizrcv(1,p)=0
94 isizrcv(2,p)=0
95 isizenv(1,p) = 0
96 isizenv(2,p) = 0
97 nsnfitot(p) = 0
98 nsnsitot(p) = 0
99 IF(p/=loc_proc)THEN
100 siz =
nsnsi(nin)%P(p)
101 IF(siz>0)THEN
102 nsnsitot(p) = siz
103 msgtyp = msgoff
105 . isizrcv(1,p),2,mpi_integer,it_spmd(p),msgtyp,
106 . spmd_comm_world,req_r(p),ierror )
107 ENDIF
108 ENDIF
109 ENDDO
110
111
112
113
114
115 IF(nrskyi17>0) THEN
116 CALL sorti20(nrskyi17,irskyi17,frskyi17,4)
117 END IF
118
120 + nrskyi17,irskyi17,
nsnfi(nin)%P(1),isizenv,nsnfitot,len)
121
122 iallocs = 0
123 DO p = 1, nspmd
124 IF(p/=loc_proc.AND.nsnfitot(p)>0) THEN
125 msgtyp = msgoff
127 . isizenv(1,p),2,mpi_integer,it_spmd(p),msgtyp,
128 . spmd_comm_world,req_s(p),ierror )
129 iallocs = iallocs + isizenv(1,p)
130 ENDIF
131 END DO
132 ierror=0
133 IF(iallocs>0)
134 + ALLOCATE(bbufs(iallocs+nspmd),stat=ierror)
135 IF(ierror/=0) THEN
136 CALL ancmsg(msgid=20,anmode=aninfo)
138 END IF
139
140
141
142 ideb = 0
143 idebi = 1
144 l = 0
145 DO p = 1, nspmd
146 IF(p/=loc_proc.AND.isizenv(1,p)>0)THEN
147 add = l+1
149 IF(nb>0) THEN
150 ll = l+1
151 l = l + 1
152 DO n = 1, nb
153 IF(
nsvfi(nin)%P(ideb+n)<0)
THEN
154
155 ies = -
nsvfi(nin)%P(ideb+n)
156 IF(idebi<=nrskyi17) THEN
157 itest = irskyi17(idebi)==ideb+n
158 ELSE
159 itest = .false.
160 ENDIF
161 DO WHILE(itest)
162 bbufs(l+1) = ies
163 bbufs(l+2) = frskyi17(1,idebi)
164 bbufs(l+3) = frskyi17(2,idebi)
165 bbufs(l+4) = frskyi17(3,idebi)
166 bbufs(l+5) = frskyi17(4,idebi)
167 idebi = idebi + 1
168 l = l + len
169 IF(idebi<=nrskyi17) THEN
170 itest = irskyi17(idebi)==ideb+n
171 ELSE
172 itest = .false.
173 ENDIF
174 ENDDO
175 ENDIF
176 ENDDO
177 bbufs(ll) = (l-ll)/len
178 ideb = ideb + nb
179 END IF
180 siz = l+1-add
181 msgtyp = msgoff2
183 . bbufs(add),siz,real ,it_spmd(p),msgtyp,
184 . spmd_comm_world,req_si(p),ierror )
185 ELSEIF(p/=loc_proc)THEN
186 ideb = ideb +
nsnfi(nin)%P(p)
187 END IF
188 END DO
189
190
191
192 iallocr = 0
193 DO p = 1, nspmd
194 IF(nsnsitot(p)>0)THEN
195 CALL mpi_wait(req_r(p),status,ierror)
196 iallocr =
max(iallocr,isizrcv(1,p))
197 END IF
198 END DO
199
200 ierror=0
201 IF(iallocr>0)
202 . ALLOCATE(bbufr(iallocr+1),stat=ierror)
203 IF(ierror/=0) THEN
204 CALL ancmsg(msgid=20,anmode=aninfo)
206 ENDIF
207
208
209
210 DO p = 1, nspmd
211 IF(isizrcv(1,p)>0) THEN
212 msgtyp = msgoff2
213 l = 1
215 . bbufr(l),isizrcv(1,p)+1,real ,it_spmd(p),msgtyp,
216 . spmd_comm_world ,status,ierror )
217
218 IF(
nsnsi(nin)%P(p)>0)
THEN
219 nb = nint(bbufr(l))
220 l = l + 1
221
222 IF (nskyi17+nb > lskyi17) THEN
223 CALL ancmsg(msgid=25,anmode=aninfo_blind,
224 . i1=noint)
226 ENDIF
227
228 DO i = 1, nb
229 nn = nint(bbufr(5*(i-1)+l))
230 nskyi17 = nskyi17+1
231 iskyi17(nskyi17)=nn
232 fskyi17(nskyi17,1)=bbufr(5*(i-1)+l+1)
233 fskyi17(nskyi17,2)=bbufr(5*(i-1)+l+2)
234 fskyi17(nskyi17,3)=bbufr(5*(i-1)+l+3)
235 fskyi17(nskyi17,4)=bbufr(5*(i-1)+l+4)
236 END DO
237 l = l + nb*len
238 END IF
239 ENDIF
240 ENDDO
241 IF(iallocr>0) DEALLOCATE(bbufr)
242
243
244
245 DO p = 1, nspmd
246 IF(p/=loc_proc)THEN
247 IF(nsnfitot(p)>0) THEN
248 CALL mpi_wait(req_s(p),status,ierror)
249 END IF
250 IF(isizenv(1,p)>0)THEN
251 CALL mpi_wait(req_si(p),status,ierror)
252 END IF
253 END IF
254 END DO
255 IF(iallocs>0) DEALLOCATE(bbufs)
256
257#endif
258 RETURN
subroutine mpi_recv(buf, cnt, datatype, source, tag, comm, status, ierr)
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)
type(int_pointer), dimension(:), allocatable nsnsi
type(int_pointer), dimension(:), allocatable nsvfi
type(int_pointer), dimension(:), allocatable nsnfi
subroutine ancmsg(msgid, msgtype, anmode, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, r1, r2, r3, r4, r5, r6, r7, r8, r9, c1, c2, c3, c4, c5, c6, c7, c8, c9, prmode)