38
39
40
43 USE intbufdef_mod
44
45
46
47 USE spmd_comm_world_mod, ONLY : spmd_comm_world
48#include "implicit_f.inc"
49
50
51
52#include "spmd.inc"
53
54
55
56#include "param_c.inc"
57#include "com04_c.inc"
58#include "task_c.inc"
59#include "com01_c.inc"
60
61
62
63 INTEGER IPARI(NPARI,*),ITAB(*)
64
66 . mtf(14,*),a(3,*)
67
68 TYPE(INTBUF_STRUCT_) INTBUF_TAB(*)
69
70
71
72#ifdef MPI
73 INTEGER STATUS(MPI_STATUS_SIZE),
74 * REQ_SI(NSPMD),REQ_RI(NSPMD)
75 INTEGER P,LENSD,LENRV,IADS(NSPMD+1),IADR(NSPMD+1),IERROR,
76 * SIZ,LOC_PROC,MSGTYP,MSGOFF,IDEB(NINTER)
77 INTEGER NIN,NTY,INACTI
78 INTEGER J,L,NB,NN,K,,NOD,MODE,LEN,ALEN,ND
80 * DIMENSION(:), ALLOCATABLE :: bbufs, bbufr
81 DATA msgoff/153/
82
83
84
85
86 loc_proc = ispmd+1
87 iads = 0
88 iadr = 0
89 lensd = 0
90 lenrv = 0
91
92 alen=3
93
94 DO p=1,nspmd
95 iadr(p)=lenrv+1
96 DO nin=1,ninter
97 nty=ipari(7,nin)
98 inacti =ipari(22,nin)
99 IF((nty==7.and.ipari(34,nin)==-2.and.inacti==7).OR.
100 . (nty==22.and.ipari(34,nin)==-2.and.inacti==7))THEN
101 lensd = lensd +
nsnsi(nin)%P(p)*alen
102 lenrv = lenrv +
nsnfi(nin)%P(p)*alen
103 ENDIF
104 ENDDO
105 ENDDO
106 iadr(nspmd+1)=lenrv+1
107 IF(lensd>0)THEN
108 ALLOCATE(bbufs(lensd),stat=ierror)
109 IF(ierror/=0) THEN
110 CALL ancmsg(msgid=20,anmode=aninfo)
112 ENDIF
113 ENDIF
114
115
116 IF(lenrv>0)THEN
117 ALLOCATE(bbufr(lenrv),stat=ierror)
118 IF(ierror/=0) THEN
119 CALL ancmsg(msgid=20,anmode=aninfo)
121 ENDIF
122 ENDIF
123
124 l=1
125 ideb=0
126 DO p=1, nspmd
127 iads(p)=l
128 IF (p/= loc_proc) THEN
129 DO nin=1,ninter
130 nty =ipari(7,nin)
131 inacti =ipari(22,nin)
132
133 IF((nty==7.and.ipari(34,nin)==-2.and.inacti==7).OR.
134 . (nty==22.and.ipari(34,nin)==-2.and.inacti==7))THEN
136
137 DO nn=1,nb
138 nd =
nsvsi(nin)%P(ideb(nin)+nn)
139 nod=intbuf_tab(nin)%NSV(nd)
140 bbufs(l )=mtf(1,nod)
141 bbufs(l+1)=mtf(2,nod)
142 bbufs(l+2)=mtf(3,nod)
143
144
145
146
147
148
149 l=l+3
150 ENDDO
151 ideb(nin)=ideb(nin)+nb
152 ENDIF
153 ENDDO
154
155 siz = l-iads(p)
156 IF(siz>0)THEN
157 msgtyp = msgoff
158
160 . bbufs(iads(p)),siz,real ,it_spmd(p),msgtyp,
161 . spmd_comm_world,req_si(p),ierror )
162 ENDIF
163 ENDIF
164 ENDDO
165 iads(nspmd+1)=l
166
167 l=0
168 ideb = 0
169 DO p=1, nspmd
170 l=0
171 siz=iadr(p+1)-iadr(p)
172 IF (siz > 0) THEN
173 msgtyp = msgoff
174 CALL mpi_recv( bbufr(iadr(p)),siz,real,it_spmd(p),msgtyp,
175 * spmd_comm_world,status,ierror )
176 DO nin=1,ninter
177 nty =ipari(7,nin)
178 inacti =ipari(22,nin)
179
181
182 IF((nty==7.and.ipari(34,nin)==-2.and.inacti==7).OR.
183 . (nty==22.and.ipari(34,nin)==-2.and.inacti==7))THEN
184
185 IF (nb > 0)THEN
186 DO k=1,nb
187 mtfi_v(nin)%P(1,ideb(nin)+k)=bbufr(iadr(p)+l)
188 mtfi_v(nin)%P(2,ideb(nin)+k)=bbufr(iadr(p)+l+1)
189 mtfi_v(nin)%P(3,ideb(nin)+k)=bbufr(iadr(p)+l+2)
190
191
192
193 l=l+3
194 ENDDO
195 ENDIF
196 ENDIF
197 ideb(nin)=ideb(nin)+nb
198 ENDDO
199 ENDIF
200 ENDDO
201
202 DO p = 1, nspmd
203 siz=iads(p+1)-iads(p)
204 IF(siz>0) THEN
205 CALL mpi_wait(req_si(p),status,ierror)
206 ENDIF
207 ENDDO
208
209 IF (ALLOCATED(bbufs)) DEALLOCATE(bbufs)
210 IF (ALLOCATED(bbufr)) DEALLOCATE(bbufr)
211#endif
212 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)
type(int_pointer), dimension(:), allocatable nsvsi
type(int_pointer), dimension(:), allocatable nsnsi
type(real_pointer2), dimension(:), allocatable mtfi_v
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)