40 . IPARI,IAD_ELEM,SHOOT_STRUCT )
49 use remove_neighbour_segment_mod ,
only : remove_neighbour_segment
53 USE spmd_comm_world_mod,
ONLY : spmd_comm_world
54#include "implicit_f.inc"
72 INTEGER,
INTENT(in) :: SURFARCE_NB
73 INTEGER,
DIMENSION(SURFARCE_NB),
INTENT(in) :: SURFACE_ID
74 INTEGER,
DIMENSION(NINTER+1,2),
INTENT(in) :: SHIFT_INTERFACE
75 TYPE(intbuf_struct_),
DIMENSION(NINTER),
INTENT(inout) :: INTBUF_TAB
76 INTEGER,
DIMENSION(NPARI,NINTER),
INTENT(in) :: IPARI
77 INTEGER,
DIMENSION(2,NSPMD+1),
INTENT(in) ::
78 TYPE(shooting_node_type),
INTENT(inout) :: SHOOT_STRUCT
82 INTEGER :: I,K,J,IJK,FIRST,LAST
83 INTEGER :: NIN,ID_INTER,NUMBER_INTER,NRTM
87 INTEGER :: DICHOTOMIC_SEARCH_I_ASC
88 TYPE(
array_type),
DIMENSION(:),
ALLOCATABLE :: S_BUFFER
89 TYPE(
array_type),
DIMENSION(:),
ALLOCATABLE :: R_BUFFER
91 INTEGER :: GLOBAL_SURFACE_ID
92 INTEGER :: PROC_ID,REMOTE_PROC
94 INTEGER :: FRONTIER_ELM
95 INTEGER,
DIMENSION(NSPMD) :: NUMBER_REMOTE_SURF,NUMBER_REMOTE_SURF_R
96 LOGICAL,
DIMENSION(NSPMD) :: ALREADY_DONE
98 INTEGER :: IERROR ! error for mpi commm
99 INTEGER :: MSGTYP,MSGOFF1,MSGOFF2
100 INTEGER :: RECV_NB,RECV_NB_2
101 INTEGER :: SIZE_R,SIZE_S
102 INTEGER,
DIMENSION(NSPMD) :: INDEX_R_PROC,INDEX_R_PROC_2
103 INTEGER,
DIMENSION(NSPMD) :: REQUEST_SIZE_R,REQUEST_SIZE_R_2
104 INTEGER,
DIMENSION(NSPMD) :: REQUEST_SIZE_S,REQUEST_SIZE_S_2
106 INTEGER,
DIMENSION(MPI_STATUS_SIZE) :: STATUS_MPI
107 INTEGER,
DIMENSION(MPI_STATUS_SIZE,NSPMD) :: ARRAY_STATUSES
114 number_inter = shift_interface(ninter+1,2)
116 ALLOCATE( s_buffer(nspmd), r_buffer(nspmd) )
117 s_buffer(1:nspmd)%SIZE_INT_ARRAY_2D(1) = 2
118 s_buffer(1:nspmd)%SIZE_INT_ARRAY_2D(2) = surfarce_nb
119 number_remote_surf(1:nspmd) = 0
125 id_inter = dichotomic_search_i_asc(k, shift_interface(1,1), number_inter+1)
126 nin = shift_interface(id_inter,2)
127 k = k - shift_interface(id_inter,1) + 1
143 global_surface_id = k
145 global_surface_id = intbuf_tab(nin)%MSEGLO(k)
151 call surface_deactivation(ity,nrtm,global_surface_id,intbuf_tab(nin)%mseglo,intbuf_tab(nin)%mvoisin)
153 call remove_neighbour_segment( nin,global_surface_id,intbuf_tab(nin),shoot_struct )
159 already_done(1:nspmd) = .false.
160 already_done(ispmd+1) = .true.
162 node_id = intbuf_tab(nin)%IRECTM((k-1)*4+j)
163 nb_proc = shoot_struct%SHIFT_M_NODE_PROC(node_id+1) - shoot_struct%SHIFT_M_NODE_PROC(node_id)
165 shift = shoot_struct%SHIFT_M_NODE_PROC(node_id)
167 remote_proc = shoot_struct%M_NODE_PROC( shift+ijk )
168 IF(.NOT.already_done(remote_proc) )
THEN
169 already_done(remote_proc) = .true.
170 number_remote_surf(remote_proc) = number_remote_surf(remote_proc) + 1
171 IF(.NOT.
ALLOCATED( s_buffer(remote_proc)%INT_ARRAY_2D ) )
THEN
175 s_buffer(remote_proc)%INT_ARRAY_2D(1,number_remote_surf(remote_proc)) = intbuf_tab(nin)%MSEGLO(k)
177 s_buffer(remote_proc)%INT_ARRAY_2D(1,number_remote_surf(remote_proc)) = -intbuf_tab(nin)%MSEGLO(k)
179 s_buffer(remote_proc)%INT_ARRAY_2D(2,number_remote_surf(remote_proc)) = nin
196 frontier_elm = iad_elem(1,i+1)-iad_elem(1,i)
197 IF(frontier_elm>0)
THEN
198 recv_nb = recv_nb + 1
199 index_r_proc(recv_nb) = i
201 CALL mpi_irecv( number_remote_surf_r(i),1,mpi_integer,it_spmd(i),msgtyp,
202 . spmd_comm_world,request_size_r(recv_nb),ierror )
208 ! send
the data :
"number of deleted surface of interface type 24 or 25"
210 frontier_elm = iad_elem(1,i+1)-iad_elem(1,i)
211 IF(frontier_elm>0)
THEN
213 CALL mpi_isend( number_remote_surf(i),1,mpi_integer,it_spmd(i),msgtyp,
214 . spmd_comm_world,request_size_s
221 IF(recv_nb>0)
CALL mpi_waitall(recv_nb,request_size_r,array_statuses,ierror)
227 proc_id = index_r_proc(i)
228 IF(number_remote_surf_r(proc_id)>0)
THEN
229 recv_nb_2 = recv_nb_2 + 1
230 index_r_proc_2(recv_nb_2) = proc_id
231 r_buffer(proc_id)%SIZE_INT_ARRAY_2D(1) = 2
232 r_buffer(proc_id)%SIZE_INT_ARRAY_2D(2) = number_remote_surf_r(proc_id)
234 size_r = r_buffer(proc_id)%SIZE_INT_ARRAY_2D(1) * r_buffer(proc_id)%SIZE_INT_ARRAY_2D(2)
236 CALL mpi_irecv(r_buffer(proc_id)%INT_ARRAY_2D(1,1),size_r,
237 . mpi_integer,it_spmd(proc_id),msgtyp,
238 . spmd_comm_world,request_size_r_2(recv_nb_2),ierror )
246 IF(number_remote_surf(i)>0)
THEN
248 size_s = number_remote_surf(i) * s_buffer(i)%SIZE_INT_ARRAY_2D(1)
249 CALL mpi_isend( s_buffer(i)%INT_ARRAY_2D(1,1),size_s,mpi_integer,it_spmd(i),msgtyp,
250 . spmd_comm_world,request_size_s_2(i),ierror )
257 CALL mpi_waitany(recv_nb_2,request_size_r_2,k,status_mpi,ierror)
258 proc_id = index_r_proc_2(k)
260 DO j=1,number_remote_surf_r(proc_id)
261 nin = r_buffer(proc_id)%INT_ARRAY_2D(2,j)
268 global_surface_id = r_buffer(proc_id)%INT_ARRAY_2D(1,j)
270 call surface_deactivation(ity,nrtm,global_surface_id,intbuf_tab(nin)%mseglo,intbuf_tab(nin)%mvoisin)
272 call remove_neighbour_segment( nin,global_surface_id
284 frontier_elm = iad_elem(1,i+1)-iad_elem(1,i)
285 IF(frontier_elm>0)
THEN
286 CALL mpi_wait(request_size_s(i),status_mpi,ierror)
294 IF(number_remote_surf(i)>0)
THEN
295 CALL mpi_wait(request_size_s_2(i),status_mpi,ierror)
303 DEALLOCATE( s_buffer, r_buffer )