41
42
43
44
45
46
47
48
49! - 1
value for the number of send values(=nb)
50
51
52
53
54
55
56
57
58
59
60
61
64 USE intbufdef_mod
65 USE multi_fvm_mod
66
67
68
69 USE spmd_comm_world_mod, ONLY : spmd_comm_world
70#include "implicit_f.inc"
71
72
73
74#include "spmd.inc"
75
76
77
78#include "com01_c.inc"
79#include "com04_c.inc"
80#include "param_c.inc"
81#include "task_c.inc"
82
83
84
85 INTEGER, INTENT(in) :: IFLAG, ISLEN7, IRLEN7
86 INTEGER, DIMENSION(NPARI,*), INTENT(in) :: IPARI
87
88 TYPE(INTBUF_STRUCT_) INTBUF_TAB(*)
89 TYPE(MULTI_FVM_STRUCT), INTENT(INOUT) :: MULTI_FVM
90
91
92
93#ifdef MPI
94 INTEGER :: P,LOC_PROC
95 INTEGER :: IBRIC
96 INTEGER :: L,II,IJ,LL,LL0,N,NI
97 INTEGER :: ADD,NB,LEN,LENI,SIZ,IDEB
98 INTEGER :: NIN,NTY,NB_INT18
99 INTEGER :: IERROR,IALLOCS, IALLOCR
100 INTEGER :: MSGTYP,MSGOFF
101 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: STATUS
102 INTEGER, DIMENSION(NINTER) :: DEBUT,DEBUTE
103 INTEGER, DIMENSION(PARASIZ) :: REQ_SI,REQ_RI
104 INTEGER, DIMENSION(PARASIZ+1) :: ADDS,ADDR
105
106 DATA msgoff/14141/
107 REAL(kind=8),dimension(:), ALLOCATABLE :: bbufs, bbufr
108 SAVE adds,addr,req_si,req_ri,iallocs,iallocr,bbufs,bbufr
109
110
111
112 loc_proc = ispmd + 1
113 nb_int18 = multi_fvm%NUMBER_INT18
114
115
116
117 len = 3*6 + 1
118
119 IF(iflag==1)THEN
120
121
122
123
124
125 DO ii=1,multi_fvm%NUMBER_INT18
126 nin = multi_fvm%INT18_LIST(ii)
127 debut(nin) = 0
128 debute(nin)= 0
129 ENDDO
130 iallocs = len*irlen7
131 ierror=0
132 IF(iallocs>0)
133 + ALLOCATE(bbufs(iallocs+nb_int18*nspmd*2),stat=ierror)
134 IF(ierror/=0) THEN
135 CALL ancmsg(msgid=20,anmode=aninfo)
137 END IF
138
139 iallocr = len*islen7
140
141 ierror=0
142 IF(iallocr>0)
143 + ALLOCATE(bbufr(iallocr+nb_int18*nspmd*2),stat=ierror)
144 IF(ierror/=0) THEN
145 CALL ancmsg(msgid=20,anmode=aninfo)
147 END IF
148
149
150
151 l = 0
152 DO p = 1, nspmd
153 add = l+1
154 addr(p) = add
155 siz = 0
156 IF(p/=loc_proc)THEN
157
158 DO ii=1,multi_fvm%NUMBER_INT18
159 nin = multi_fvm%INT18_LIST(ii)
161 nty = ipari(7,nin)
162 leni = len
163
164 IF(nb>0) THEN
165 l = l + 1 + nb*leni
166 ENDIF
167 ENDDO
168 siz = l+1-add
169 IF(siz>0)THEN
170 msgtyp = msgoff
171 CALL mpi_irecv( bbufr(add),siz,mpi_double_precision,
172 . it_spmd(p),msgtyp,spmd_comm_world,req_ri(p),ierror )
173 ENDIF
174 ENDIF
175 ENDDO
176 addr(nspmd+1) = addr(nspmd)+siz
177
178
179
180 l = 0
181 DO p = 1, nspmd
182 add = l+1
183 adds(p) = add
184 siz = 0
185 IF(p/=loc_proc)THEN
186 DO ii=1,multi_fvm%NUMBER_INT18
187 nin = multi_fvm%INT18_LIST(ii)
188 ideb = debut(nin)
190 nty = ipari(7,nin)
191 leni = len
192 IF(nb>0) THEN
193 ll = l+1
194 l = l
195 ll0 = ll
196 DO n = 1, nb
197 IF(
nsvfi(nin)%P(ideb+n)<0)
THEN
198 l = l + 1
199 bbufs
201 DO ij=1,6
202 bbufs(l+ij) = multi_fvm%R_AFI(nin)%R_FORCE_INT(1,ij,ideb+n)
203 bbufs(l+6+ij) = multi_fvm%R_AFI(nin)%R_FORCE_INT(2,ij,ideb+n)
204 bbufs(l+12+ij) = multi_fvm%R_AFI(nin)%R_FORCE_INT(3,ij,ideb+n)
205 ENDDO
206 DO ij = 1,6
207 multi_fvm%R_AFI
208 multi_fvm%R_AFI(nin)%R_FORCE_INT(2,ij,ideb+n) = 0
209 multi_fvm%R_AFI(nin)%R_FORCE_INT(3,ij,ideb+n) = 0
210 ENDDO
211 l = l + 18
212 ENDIF
213 ENDDO
214 bbufs(ll) = (l-ll0)/leni
215 debut(nin) = debut(nin) + nb
216 END IF
217 ENDDO
218
219 siz = l+1-add
220 IF(siz>0)THEN
221 msgtyp = msgoff
222 CALL mpi_isend( bbufs(add),siz,mpi_double_precision,it_spmd(p),
223 . msgtyp,spmd_comm_world,req_si(p),ierror )
224 ENDIF
225 ENDIF
226 ENDDO
227 adds(nspmd+1)=adds(nspmd)+siz
228
229
230
231 ELSEIF(iflag==2)THEN
232
233
234
235 DO p = 1, nspmd
236 IF(addr(p+1)-addr(p)>0) THEN
237 CALL mpi_wait(req_ri(p),status,ierror)
238 l = addr(p)
239 DO ii=1,multi_fvm%NUMBER_INT18
240 nin = multi_fvm%INT18_LIST(ii)
241 nty =ipari(7,nin)
242 IF(
nsnsi(nin)%P(p)>0)
THEN
243 nb = nint(bbufr(l))
244 l = l + 1
245 DO ij=1,nb
246 ibric = intbuf_tab(nin)%NSV( nint(bbufr(l)) )
247 multi_fvm%FORCE_INT_PON(1,1:6,ibric) =
248 . multi_fvm%FORCE_INT_PON(1,1:6,ibric) + bbufr(l+1:l+6)
249 multi_fvm%FORCE_INT_PON(2,1:6,ibric) =
250 . multi_fvm%FORCE_INT_PON(2,1:6,ibric) + bbufr(l+7:l+12)
251 multi_fvm%FORCE_INT_PON(3,1:6,ibric) =
252 . multi_fvm%FORCE_INT_PON(3,1:6,ibric) + bbufr(l+13:l+18)
253 l = l + len
254 ENDDO
255
256 END IF
257 ENDDO
258 ENDIF
259 ENDDO
260
261
262 IF(iallocr>0) THEN
263 DEALLOCATE(bbufr)
264 iallocr=0
265 END IF
266
267
268
269 DO p = 1, nspmd
270 IF(adds(p+1)-adds(p)>0) THEN
271 CALL mpi_wait(req_si(p),status,ierror)
272 ENDIF
273 ENDDO
274
275 IF(iallocs>0) THEN
276 DEALLOCATE(bbufs)
277 iallocs=0
278 END IF
279 END IF
280#endif
281 RETURN
end diagonal values have been computed in the(sparse) matrix id.SOL
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)
for(i8=*sizetab-1;i8 >=0;i8--)
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)