38 . IPARI,IAD_ELEM,SHOOT_STRUCT )
50 USE spmd_comm_world_mod,
ONLY : spmd_comm_world
51#include "implicit_f.inc"
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)
73 INTEGER,
DIMENSION(NPARI,NINTER),
INTENT(in) :: IPARI
74 INTEGER,
DIMENSION(2,NSPMD+1),
INTENT(in) :: IAD_ELEM
79 INTEGER :: I,K,J,IJK,FIRST,LAST
80 INTEGER :: NIN,ID_INTER,,NRTM
84 INTEGER :: DICHOTOMIC_SEARCH_I_ASC
85 TYPE(
array_type),
DIMENSION(:),
ALLOCATABLE :: S_BUFFER
86 TYPE(
array_type),
DIMENSION(:),
ALLOCATABLE :: R_BUFFER
88 INTEGER :: GLOCAL_SURFACE_ID
89 INTEGER :: PROC_ID,REMOTE_PROC
91 INTEGER :: FRONTIER_ELM
92 INTEGER,
DIMENSION(NSPMD) :: NUMBER_REMOTE_SURF,NUMBER_REMOTE_SURF_R
93 LOGICAL,
DIMENSION(NSPMD) :: ALREADY_DONE
96 INTEGER :: MSGTYP,MSGOFF1,MSGOFF2
97 INTEGER :: RECV_NB,RECV_NB_2
98 INTEGER :: SIZE_R,SIZE_S
99 INTEGER,
DIMENSION(NSPMD) :: INDEX_R_PROC,
100 INTEGER,
DIMENSION(NSPMD) :: REQUEST_SIZE_R,REQUEST_SIZE_R_2
101 INTEGER,
DIMENSION(NSPMD) :: REQUEST_SIZE_S,REQUEST_SIZE_S_2
103 INTEGER,
DIMENSION(MPI_STATUS_SIZE) :: STATUS_MPI
104 INTEGER,
DIMENSION(MPI_STATUS_SIZE,NSPMD) :: ARRAY_STATUSES
111 number_inter = shift_interface(ninter+1,2)
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
123 nin = shift_interface(id_inter,2)
124 k = k - shift_interface(id_inter,1) + 1
140 glocal_surface_id = k
142 glocal_surface_id = intbuf_tab(nin)%MSEGLO(k)
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)
150 already_done(1:nspmd) = .false.
151 already_done(ispmd+1) = .true.
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)
156 shift = shoot_struct%SHIFT_M_NODE_PROC(node_id)
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
THEN
166 s_buffer(remote_proc)%INT_ARRAY_2D(1,number_remote_surf(remote_proc)) = intbuf_tab(nin)%MSEGLO(k)
168 s_buffer(remote_proc)%INT_ARRAY_2D(1,number_remote_surf(remote_proc)) = -intbuf_tab(nin)%MSEGLO(k)
170 s_buffer(remote_proc)%INT_ARRAY_2D(2,number_remote_surf(remote_proc)) = nin
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
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 )
201 frontier_elm = iad_elem(1,i+1)-iad_elem(1,i)
202 IF(frontier_elm>0)
THEN
204 CALL mpi_isend( number_remote_surf(i),1,mpi_integer,it_spmd(i),msgtyp
205 . spmd_comm_world,request_size_s(i),ierror )
212 IF(recv_nb>0)
CALL mpi_waitall(recv_nb,request_size_r,array_statuses,ierror)
215 ! receive
the data :
"list of deleted surface of interface type 24 or 25"
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
223 r_buffer(proc_id)%SIZE_INT_ARRAY_2D
225 size_r = r_buffer(proc_id
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 )
237 IF(number_remote_surf(i)>0)
THEN
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
241 . spmd_comm_world,request_size_s_2(i),ierror )
249 proc_id = index_r_proc_2(k
251 DO j=1,number_remote_surf_r(proc_id)
252 nin = r_buffer(proc_id)%INT_ARRAY_2D(2,j)
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)
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)
281 IF(number_remote_surf(i)>0)
THEN
282 CALL mpi_wait(request_size_s_2(i),status_mpi,ierror)
290 DEALLOCATE( s_buffer, r_buffer )