39 . XCELL,MULTI_FVM,XCELL_REMOTE,INTBUF_TAB,ALE_CONNECTIVITY)
45! * compute
the size & adress
for mpi comm
62 USE spmd_comm_world_mod,
ONLY : spmd_comm_world
63#include "implicit_f.inc"
75 INTEGER,
INTENT(in) :: NINTER
76 INTEGER,
INTENT(in) :: NSPMD
77 INTEGER,
INTENT(inout) :: NUMBER_INTER18
78 INTEGER,
INTENT(in) :: SXCELL
79 INTEGER,
DIMENSION(NUMBER_INTER18),
INTENT(inout) :: INTER18_LIST
80 my_real,
DIMENSION(3,SXCELL),
INTENT(in) :: xcell
81 TYPE(multi_fvm_struct),
INTENT(inout) ::
82 TYPE(
array_type),
DIMENSION(NINTER),
INTENT(inout) ::
83 TYPE(intbuf_struct_),
DIMENSION(NINTER),
INTENT(inout) :: INTBUF_TAB
89 INTEGER :: I,,,IJK,P,N
92 INTEGER :: NIN,NODE_ID,ELEM_ID,NUMBER_REMOTE_NODE
93 INTEGER :: BUFFER_SEND_SIZE,BUFFER_RCV_SIZE
95 INTEGER :: LOCAL_ADRESS
96 INTEGER,
DIMENSION(NINTER) :: ADRESS_INTER
97 INTEGER,
DIMENSION(NSPMD+1) :: ,ADRESS_RCV
101 my_real,
DIMENSION(:),
ALLOCATABLE :: buffer_send,buffer_rcv
105 INTEGER,
DIMENSION(NSPMD) :: REQUEST_SEND,REQUEST_RCV
106 INTEGER,
DIMENSION(MPI_STATUS_SIZE) :: STATUS_MPI
114 DO i=1,number_inter18
118 my_size = my_size +
nsnfi(nin)%P(p)
120 IF(xcell_remote(nin)%SIZE_MY_REAL_ARRAY_1D < my_size)
THEN
122 xcell_remote(nin)%SIZE_MY_REAL_ARRAY_1D = my_size
133 adress_send(1:nspmd+1) = 0
134 adress_rcv(1:nspmd+1) = 0
137 adress_send(p) = buffer_send_size + 1
138 adress_rcv(p) = buffer_rcv_size + 1
139 DO i=1,number_inter18
140 nin = inter18_list(i)
141 buffer_send_size = buffer_send_size +
nsnsi(nin)%P(p)
142 buffer_rcv_size = buffer_rcv_size +
nsnfi(nin)%P(p)
146 adress_send(nspmd+1) = buffer_send_size + 1
147 adress_rcv(nspmd+1) = buffer_rcv_size + 1
148 ALLOCATE( buffer_send(buffer_send_size) )
149 ALLOCATE( buffer_rcv(buffer_rcv_size) )
155 rcv_size = adress_rcv(p+1)-adress_rcv(p)
156 IF(p/=loc_proc.AND.rcv_size>0)
THEN
158 CALL mpi_irecv( buffer_rcv(adress_rcv(p)),rcv_size,real,
159 . it_spmd(p),msgtyp,spmd_comm_world,request_rcv(p),error_mpi )
167 adress_inter(1:ninter) = 0
170 DO i=1,number_inter18
171 nin = inter18_list(i)
172 DO j =1,
nsnsi(nin)%P(p)
173 n =
nsvsi(nin)%P(adress_inter(nin)+j)
174 node_id = intbuf_tab(nin)%NSV(n)
176 IF(.NOT.multi_fvm%IS_USED)
THEN
177 iad1 = ale_connectivity%NE_CONNECT%IAD_CONNECT(node_id)
178 iad2 = ale_connectivity%NE_CONNECT%IAD_CONNECT(node_id + 1) - 1
180 elem_id = ale_connectivity%NE_CONNECT%CONNECTED(k)
181 dl=
max(dl, xcell(1,elem_id))
187 buffer_send(ijk) = dl
189 adress_inter(nin) = adress_inter(nin) +
nsnsi(nin)%P(p)
195 ! ---------------------------
198 send_size = adress_send(p+1)-adress_send(p)
199 IF(p/=loc_proc.AND.send_size>0)
THEN
201 CALL mpi_isend( buffer_send(adress_send(p)),send_size,real,
202 . it_spmd(p),msgtyp,spmd_comm_world,request_send(p),error_mpi )
210 adress_inter(1:ninter) = 0
212 rcv_size = adress_rcv(p+1)-adress_rcv(p)
213 IF(p/=loc_proc.AND.rcv_size>0)
THEN
216 CALL mpi_wait(request_rcv(p),status_mpi,error_mpi)
217 DO i=1,number_inter18
218 nin = inter18_list(i)
219 number_remote_node =
nsnfi(nin)%P(p)
220 IF(number_remote_node>0)
THEN
221 DO j =1,number_remote_node
222 xcell_remote(nin)%MY_REAL_ARRAY_1D(adress_inter
224 adress_inter(nin) = adress_inter(nin) + number_remote_node
225 local_adress = local_adress + number_remote_node
235 send_size = adress_send(p+1)-adress_send(p)
236 IF(p/=loc_proc.AND.send_size>0)
THEN
237 CALL mpi_wait(request_send(p),status_mpi,error_mpi)
242 DEALLOCATE( buffer_send )
243 DEALLOCATE( buffer_rcv )