39
40
41
42
43
44 USE intbufdef_mod
47
48
49
50 USE spmd_comm_world_mod, ONLY : spmd_comm_world
51#include "implicit_f.inc"
52
53
54
55#include "spmd.inc"
56
57
58
59#include "task_c.inc"
60#include "com04_c.inc"
61#include "scr17_c.inc"
62#include "param_c.inc"
63
64
65#include "com01_c.inc"
66
67
68
69 INTEGER, INTENT(in) :: SURFARCE_NB
70 INTEGER, DIMENSION(SURFARCE_NB), INTENT(in) :: SURFACE_ID
71 INTEGER, DIMENSION(NINTER+1,2), INTENT(in) :: SHIFT_INTERFACE
72 TYPE(INTBUF_STRUCT_), DIMENSION(NINTER), INTENT(inout) :: INTBUF_TAB
73 INTEGER, DIMENSION(NPARI,NINTER)INTENT(in)
74INTEGER, DIMENSION(2,NSPMD+1), INTENT(in) :: IAD_ELEM
75 TYPE(shooting_node_type), INTENT(inout) :: SHOOT_STRUCT
76
77
78
79 INTEGER :: I,K,J,IJK,FIRST,LAST
80 INTEGER :: NIN,ID_INTER,NUMBER_INTER,NRTM
81 INTEGER :: ITY,IDEL
82 INTEGER :: NODE_ID
83 INTEGER :: SHIFT
84 INTEGER :: DICHOTOMIC_SEARCH_I_ASC
85 TYPE(array_type), DIMENSION(:), ALLOCATABLE :: S_BUFFER
86 TYPE(array_type), DIMENSION(:), ALLOCATABLE :: R_BUFFER
87
88 INTEGER :: GLOCAL_SURFACE_ID
89 INTEGER :: PROC_ID,REMOTE_PROC ! processor id and remote processor id
90 INTEGER :: NB_PROC
91 INTEGER :: FRONTIER_ELM
92 INTEGER, DIMENSION(NSPMD) :: NUMBER_REMOTE_SURF,NUMBER_REMOTE_SURF_R
93 LOGICAL, DIMENSION(NSPMD) :: ALREADY_DONE
94
95 INTEGER :: IERROR
96 INTEGER :: ,MSGOFF1,MSGOFF2
97 INTEGER :: RECV_NB,RECV_NB_2
98 INTEGER :: SIZE_R,SIZE_S
99 INTEGER, DIMENSION(NSPMD) :: INDEX_R_PROC,INDEX_R_PROC_2
100 INTEGER, DIMENSION(NSPMD) :: REQUEST_SIZE_R,REQUEST_SIZE_R_2
101 INTEGER, DIMENSION(NSPMD) :: REQUEST_SIZE_S,REQUEST_SIZE_S_2
102#ifdef MPI
103 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: STATUS_MPI
104 INTEGER, DIMENSION(MPI_STATUS_SIZE,NSPMD) :: ARRAY_STATUSES
105#endif
106 DATA msgoff1/13014/
107 DATA msgoff2/13015/
108
109 first = 1
110 last = surfarce_nb
111 number_inter = shift_interface(ninter+1,2)
112
113 ALLOCATE( s_buffer(nspmd), r_buffer(nspmd) )
114 s_buffer(1:nspmd)%SIZE_INT_ARRAY_2D(1) = 2
115 s_buffer(1:nspmd)%SIZE_INT_ARRAY_2D(2) = surfarce_nb
116 number_remote_surf(1:nspmd) = 0
117
118
119
120 DO i=first,last
121 k = surface_id(i)
123 nin = shift_interface(id_inter,2)
124 k = k - shift_interface(id_inter,1) + 1
125 ity = ipari(7,nin)
126 idel = ipari(17,nin)
127 nrtm = ipari(4,nin)
128
129
130
131
132
133
134
135
136
137
138
139 IF(ity==25) THEN
140 glocal_surface_id = k
141 ELSEIF(ity==24) THEN
142 glocal_surface_id = intbuf_tab(nin)%MSEGLO(k)
143 ENDIF
144 IF(ity==24.OR.ity==25) THEN
145 CALL surface_deactivation(ity,nrtm,glocal_surface_id,intbuf_tab(nin)%MSEGLO,intbuf_tab(nin)%MVOISIN)
146 ENDIF
147
148 IF(nspmd>1) THEN
149
150 already_done(1:nspmd) = .false.
151 already_done(ispmd+1) = .true.
152 DO j=1,4
153 node_id = intbuf_tab(nin)%IRECTM((k-1)*4+j)
154 nb_proc = shoot_struct%SHIFT_M_NODE_PROC(node_id+1) - shoot_struct%SHIFT_M_NODE_PROC(node_id)
155 IF(nb_proc>1) THEN
156 shift = shoot_struct%SHIFT_M_NODE_PROC(node_id)
157 DO ijk=1,nb_proc
158 remote_proc = shoot_struct%M_NODE_PROC( shift+ijk )
159 IF(.NOT.already_done(remote_proc) ) THEN
160 already_done(remote_proc) = .true.
161 number_remote_surf(remote_proc) = number_remote_surf(remote_proc) + 1
162 IF(.NOT.ALLOCATED( s_buffer(remote_proc)%INT_ARRAY_2D ) ) THEN
164 ENDIF
165 IF(ity==24) THEN
166 s_buffer(remote_proc)%INT_ARRAY_2D(1,number_remote_surf(remote_proc)) = intbuf_tab(nin)%MSEGLO(k)
167 ELSEIF(ity==25) THEN
168 s_buffer(remote_proc)%INT_ARRAY_2D(1,number_remote_surf(remote_proc
169 ENDIF
170 s_buffer(remote_proc)%INT_ARRAY_2D(2,number_remote_surf(remote_proc
171 ENDIF
172 ENDDO
173 ENDIF
174 ENDDO
175
176 ENDIF
177 ENDDO
178
179
180 IF(nspmd>1) THEN
181#ifdef MPI
182
183
184
185 recv_nb = 0
186 DO i=1,nspmd
187 frontier_elm = iad_elem(1,i+1)-iad_elem(1,i)
188 IF(frontier_elm>0) THEN
189 recv_nb = recv_nb + 1
190 index_r_proc(recv_nb) = i
191 msgtyp = msgoff1
192 CALL mpi_irecv( number_remote_surf_r(i),1,mpi_integer,it_spmd(i),msgtyp,
193 . spmd_comm_world,request_size_r(recv_nb),ierror )
194 ENDIF
195 ENDDO
196
197
198
199
200 DO i=1,nspmd
201 frontier_elm = iad_elem(1,i+1)-iad_elem(1,i)
202 IF(frontier_elm>0) THEN
203 msgtyp = msgoff1
204 CALL mpi_isend( number_remote_surf(i),1,mpi_integer,it_spmd(i),msgtyp,
205 . spmd_comm_world,request_size_s(i),ierror )
206 ENDIF
207 ENDDO
208
209
210
211
212 IF(recv_nb>0)
CALL mpi_waitall(recv_nb,request_size_r,array_statuses,ierror)
213
214
215
216 recv_nb_2 = 0
217 DO i=1,recv_nb
218 proc_id = index_r_proc(i)
219 IF(number_remote_surf_r(proc_id)>0) THEN
220 recv_nb_2 = recv_nb_2 + 1
221 index_r_proc_2(recv_nb_2) = proc_id
222 r_buffer(proc_id)%SIZE_INT_ARRAY_2D(1) = 2
223 r_buffer(proc_id)%SIZE_INT_ARRAY_2D(2) = number_remote_surf_r(proc_id)
225 size_r = r_buffer(proc_id)%SIZE_INT_ARRAY_2D(1) * r_buffer(proc_id)%SIZE_INT_ARRAY_2D(2)
226 msgtyp = msgoff2
227 CALL mpi_irecv(r_buffer(proc_id)%INT_ARRAY_2D(1,1),size_r,
228 . mpi_integer,it_spmd(proc_id),msgtyp,
229 . spmd_comm_world,request_size_r_2(recv_nb_2),ierror )
230 ENDIF
231 ENDDO
232
233
234
235
236 DO i=1,nspmd
237 IF(number_remote_surf(i)>0) THEN
238 msgtyp = msgoff2
239 size_s = number_remote_surf(i) * s_buffer(i)%SIZE_INT_ARRAY_2D(1)
240 CALL mpi_isend( s_buffer(i)%INT_ARRAY_2D(1,1),size_s,mpi_integer,it_spmd(i),msgtyp,
241 . spmd_comm_world,request_size_s_2(i),ierror )
242 ENDIF
243 ENDDO
244
245
246
247 DO i=1,recv_nb_2
248 CALL mpi_waitany(recv_nb_2,request_size_r_2,k,status_mpi,ierror)
249 proc_id = index_r_proc_2(k)
250
251 DO j=1,number_remote_surf_r(proc_id)
252 nin = r_buffer(proc_id)%INT_ARRAY_2D(2,j)
253 ity = ipari(7,nin)
254 idel = ipari(17,nin)
255 nrtm = ipari(4,nin)
256
257 glocal_surface_id = r_buffer(proc_id)%INT_ARRAY_2D(1,j)
258 IF(ity==24.OR.ity==25) THEN
259 CALL surface_deactivation(ity,nrtm,glocal_surface_id,intbuf_tab(nin)%MSEGLO,intbuf_tab(nin)%MVOISIN)
260 ENDIF
261
262 ENDDO
264
265 ENDDO
266
267
268
269
270 DO i=1,nspmd
271 frontier_elm = iad_elem(1,i+1)-iad_elem(1,i)
272 IF(frontier_elm>0) THEN
273 CALL mpi_wait(request_size_s(i),status_mpi,ierror)
274 ENDIF
275 ENDDO
276
277
278
279
280 DO i=1,nspmd
281 IF(number_remote_surf(i)>0) THEN
282 CALL mpi_wait(request_size_s_2(i),status_mpi,ierror)
284 ENDIF
285 ENDDO
286
287#endif
288 ENDIF
289
290 DEALLOCATE( s_buffer, r_buffer )
291
292
293 RETURN
integer function dichotomic_search_i_asc(val, array, len)
subroutine mpi_isend(buf, cnt, datatype, dest, tag, comm, ireq, ierr)
subroutine mpi_wait(ireq, status, ierr)
subroutine mpi_waitall(cnt, array_of_requests, status, ierr)
subroutine mpi_waitany(cnt, array_of_requests, index, status, ierr)
subroutine mpi_irecv(buf, cnt, datatype, source, tag, comm, ireq, ierr)
subroutine dealloc_2d_array(this)
subroutine alloc_2d_array(this)
subroutine surface_deactivation(ity, nrtm, glocal_surface_id, mseglo, mvoisin)