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(,*),ITAB(*)
64C
66 . mtf(14,*),ms(*)
67 TYPE(INTBUF_STRUCT_) INTBUF_TAB(*)
68
69
70
71#ifdef MPI
72 INTEGER (MPI_STATUS_SIZE),
73 * REQ_SI(NSPMD),REQ_RI(NSPMD)
74 INTEGER P,LENSD,LENRV,IADS(NSPMD+1),IADR(NSPMD+1),IERROR,
75 * SIZ,LOC_PROC,MSGTYP,MSGOFF,IDEB(NINTER)
76 INTEGER NIN,NTY,INACTI
77 INTEGER J,L,NB,NN,K,N,NOD,,LEN,ALEN,ND
79 * DIMENSION(:), ALLOCATABLE :: bbufs, bbufr
80 DATA msgoff/151/
81
82
83
84 loc_proc = ispmd+1
85 iads = 0
86 iadr = 0
87 lensd = 0
88 lenrv = 0
89
90 alen=1
91
92 DO p=1,nspmd
93 iadr(p)=lenrv+1
94 DO nin=1,ninter
95 nty=ipari(7,nin)
96 inacti =ipari(22,nin)
97 IF((nty==7.and.ipari(34,nin)==-2.and.inacti==7).OR.
98 . (nty==22.and.ipari(34,nin)==-2.and.inacti==7))THEN
99 lensd = lensd +
nsnsi(nin)%P(p)*alen
100 lenrv = lenrv +
nsnfi(nin)%P(p)*alen
101 ENDIF
102 ENDDO
103 ENDDO
104 iadr(nspmd+1)=lenrv+1
105
106 IF(lensd>0)THEN
107 ALLOCATE(bbufs(lensd),stat=ierror)
108 IF(ierror/=0) THEN
109 CALL ancmsg(msgid=20,anmode=aninfo)
111 ENDIF
112 ENDIF
113
114
115 IF(lenrv>0)THEN
116 ALLOCATE(bbufr(lenrv),stat=ierror)
117 IF(ierror/=0) THEN
118 CALL ancmsg(msgid=20,anmode=aninfo)
120 ENDIF
121 ENDIF
122
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 IF((nty==7.and.ipari(34,nin)==-2.and.inacti==7).OR.
133 . (nty==22.and.ipari(34,nin)==-2.and.inacti==7))THEN
135
136 DO nn=1,nb
137 nd =
nsvsi(nin)%P(ideb(nin)+nn)
138 nod=intbuf_tab(nin)%NSV(nd)
139 bbufs(l )=ms(nod)
140 l=l+1
141 ENDDO
142 ENDIF
143 ideb(nin)=ideb(nin)+nb
144 ENDDO
145
146 siz = l-iads(p)
147 IF(siz>0)THEN
148 msgtyp = msgoff
149
151 . bbufs(iads(p)),siz,real ,it_spmd(p),msgtyp,
152 . spmd_comm_world,req_si(p),ierror )
153 ENDIF
154 ENDIF
155 ENDDO
156 iads(nspmd+1)=l
157
158 l=0
159 ideb = 0
160
161 DO p=1, nspmd
162 l=0
163 siz=iadr(p+1)-iadr(p)
164 IF (siz > 0) THEN
165 msgtyp = msgoff
166 CALL mpi_recv( bbufr(iadr(p)),siz,real,it_spmd(p),msgtyp,
167 * spmd_comm_world,status,ierror )
168 DO nin=1,ninter
169 nty =ipari(7,nin)
170 inacti =ipari(22,nin)
171
173
174 IF((nty==7.and.ipari(34,nin)==-2.and.inacti==7).OR.
175 . (nty==22.and.ipari(34,nin)==-2.and.inacti==7))THEN
176
177 IF (nb > 0)THEN
178 DO k=1,nb
179 msfi(nin)%P(ideb(nin)+k)=bbufr(iadr(p)+l)
180 l=l+1
181 ENDDO
182 ENDIF
183 ENDIF
184 ideb(nin)=ideb(nin)+nb
185 ENDDO
186 ENDIF
187 ENDDO
188
189
190 DO p = 1, nspmd
191 IF (p==nspmd)THEN
192 siz=lensd-iads(p)
193 ELSE
194 siz=iads(p+1)-iads(p)
195 ENDIF
196 IF(siz>0) THEN
197 CALL mpi_wait(req_si(p),status,ierror)
198 ENDIF
199 ENDDO
200
201 IF (ALLOCATED(bbufs)) DEALLOCATE(bbufs)
202 IF (ALLOCATED(bbufr)) DEALLOCATE(bbufr)
203#endif
204 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_pointer), dimension(:), allocatable msfi
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)