40 . IAD_ELEM,FR_ELEM,X,V,MS,TEMP,KINET,NODNX_SMS,ITAB,INTBUF_TAB,IPARI,NIN,REMOTE_PROC_ID,
41 . ALREADY_SEND,INDEX_ALREADY_SEND,SORT_COMM,NODNX_SMS_SIZ,TEMP_SIZE)
66 USE spmd_comm_world_mod,
ONLY : spmd_comm_world
67#include "implicit_f.inc"
80#include "tabsiz_c.inc"
84 INTEGER,
INTENT(in) :: NIN
85 INTEGER,
INTENT(in) :: REMOTE_PROC_ID
86 INTEGER,
INTENT(in) :: NODNX_SMS_SIZ
87 INTEGER,
INTENT(in) :: TEMP_SIZE
88 INTEGER,
DIMENSION(NPARI,NINTER),
INTENT(in) :: IPARI
89 INTEGER,
DIMENSION(NINTER+1,NSPMD+1),
INTENT(in) :: ISENDTO,IRCVFROM
90 INTEGER,
DIMENSION(NUMNOD),
INTENT(inout) :: WEIGHT
91 INTEGER,
DIMENSION(2,NSPMD+1),
INTENT(in) :: IAD_ELEM
92 INTEGER,
DIMENSION(SFR_ELEM),
INTENT(in) :: FR_ELEM
93 my_real,
DIMENSION(3,NUMNOD),
INTENT(in) :: x,v
94 my_real,
DIMENSION(NUMNOD),
INTENT(in) :: ms
95 my_real,
DIMENSION(TEMP_SIZE),
INTENT(in) :: temp
96 INTEGER,
DIMENSION(NUMNOD),
INTENT(in) :: ITAB
97 INTEGER,
DIMENSION(NUMNOD),
INTENT(in) :: KINET
98 INTEGER,
DIMENSION(NODNX_SMS_SIZ),
INTENT(in) :: NODNX_SMS
99 TYPE(intbuf_struct_),
DIMENSION(NINTER),
INTENT(in) :: INTBUF_TAB
100 LOGICAL,
DIMENSION(NB_CELL_X,NB_CELL_Y,NB_CELL_Z),
INTENT(inout) :: ALREADY_SEND
101 INTEGER,
DIMENSION(NB_CELL_X*NB_CELL_Y*NB_CELL_Z),
INTENT(inout) :: INDEX_ALREADY_SEND
107 INTEGER :: I,J,NOD,L,L2,KK,IJK,KJI
109 INTEGER :: ADRESS,SHIFT_
110 INTEGER :: ISIZ,RSIZ,IDEB,JDEB
111 INTEGER :: NSN,NMN,IGAP,INTTH,INTFRIC,ITYP,ITIED
112 INTEGER :: IFQ,INACTI
114 INTEGER IERROR1,STATUS(MPI_STATUS_SIZE),IERROR
117 INTEGER :: IX,IY,IZ,NB
118 INTEGER,
DIMENSION(:),
ALLOCATABLE :: INDEX
119 INTEGER :: ISHIFT,RSHIFT
121 INTEGER :: MSGOFF, MSGOFF2, MSGOFF3, MSGOFF4, MSGOFF5
122 INTEGER :: MSGTYP,INFO
125 INTEGER,
DIMENSION(:),
ALLOCATABLE :: INDEX_2,ITRI
126 INTEGER,
DIMENSION(:),
ALLOCATABLE :: WORK
127 INTEGER :: CELL_X_ID,CELL_Y_ID,CELL_Z_ID
129 LOGICAL :: NEED_TO_RCV
131 INTEGER :: NB_INDEX_ALREADY_SEND,
VALUE,NB_SAVE
140 rsiz = sort_comm(nin)%RSIZ
141 isiz = sort_comm(nin)%ISIZ
145 intfric = ipari(72,nin)
147 itied = ipari(85,nin)
150 inacti = ipari(22,nin)
152 nb_index_already_send= 0
154 IF(ircvfrom(nin,loc_proc)/=0.OR.isendto(nin,loc_proc)/=0)
THEN
157 IF(isendto(nin,loc_proc)/=0)
THEN
159 p=sort_comm(nin)%PROC_LIST(remote_proc_id)
162 DO j = iad_elem(1,p), iad_elem(1,p+1)-1
164 weight(nod) = weight(nod)*(-1)
168 sort_comm(nin)%NB(p) = 0
170 ALLOCATE(index(2*numnod))
172 IF(itied/=0.AND.ityp==7)
THEN
175 nod = intbuf_tab(nin)%NSV(i)
176 IF(weight(nod)==1)
THEN
177 IF(
candf_si(nin)%P(i)/=0.AND.intbuf_tab(nin)%STFNS(i)>zero)
THEN
186 displ = sort_comm(nin)%RCV_DISPLS_CELL(remote_proc_id)
187 shift_ = sort_comm(nin)%NB_CELL_PROC(remote_proc_id)
189 DO kji=1,sort_comm(nin)%NB_CELL_PROC(remote_proc_id)
193 VALUE = sort_comm(nin)%CELL( displ + ijk )
194 cell_z_id = (
VALUE - mod(
VALUE,1000000) ) / 1000000
195 VALUE =
VALUE - cell_z_id * 1000000
196 cell_y_id = (
VALUE - mod(
VALUE,1000) ) / 1000
197 VALUE =
VALUE - cell_y_id * 1000
200 IF(.NOT.already_send(cell_x_id,cell_y_id,cell_z_id))
THEN
201 nb_index_already_send = nb_index_already_send + 1
202 index_already_send(nb_index_already_send) = cell_x_id+cell_y_id*1000+cell_z_id*1000000
203 already_send(cell_x_id,cell_y_id,cell_z_id) = .true.
207 i = sort_comm(nin)%VOXEL(cell_x_id,cell_y_id,cell_z_id)
209 nod = intbuf_tab(nin)%NSV(i)
210 IF(weight(nod)==1)
THEN
211 IF(intbuf_tab(nin)%STFNS(i)>zero)
THEN
216 i = sort_comm(nin)%NEXT_NOD(i)
223 DO i=1,nb_index_already_send
224 VALUE = index_already_send(i)
225 cell_z_id = (
VALUE - mod(
VALUE,1000000) ) / 1000000
226 VALUE =
VALUE - cell_z_id * 1000000
227 cell_y_id = (
VALUE - mod(
VALUE,1000) ) / 1000
228 VALUE =
VALUE - cell_y_id * 1000
230 already_send(cell_x_id,cell_y_id,cell_z_id) = .false.
235 IF(nb_save>1600)
THEN
236 ALLOCATE( work(70000) )
237 ALLOCATE( itri(nb_save) )
238 ALLOCATE( index_2(2*nb_save) )
245 index(nb) = itri(index_2(1))
247 IF(itri(index_2(i-1))/=itri(index_2(i)))
THEN
249 index(nb) = itri(index_2(i))
254 DEALLOCATE( index_2 )
255 ELSEIF(nb_save>0)
THEN
256 ALLOCATE( index_2(nb_save) )
257 CALL myqsort_int(nb_save, index, index_2, error_sort)
258 index_2(1:nb_save) = index
261 IF(index(i)/=index(i-1))
THEN
263 index_2(nb) = index(i)
266 index(1:nb) = index_2(1:nb)
267 DEALLOCATE( index_2 )
271 sort_comm(nin)%NB(p) = nb
275 DO j = iad_elem(1,p), iad_elem(1,p+1)-1
277 weight(nod) = weight(nod)*(-1)
284 sort_comm(nin)%NBSEND_NB=sort_comm(nin)%NBSEND_NB+1
285 sort_comm(nin)%SEND_NB(sort_comm
286 CALL mpi_isend(sort_comm(nin)%NB(p),1,mpi_integer,it_spmd(p),msgtyp,
292 ALLOCATE( sort_comm(nin)%DATA_PROC(p)%RBUF(rsiz*nb),stat=ierror)
293 ALLOCATE( sort_comm(nin)%DATA_PROC(p)%IBUF(isiz*nb),stat=ierror)
295 CALL ancmsg(msgid=20,anmode=aninfo)
302#include "vectorize.inc"
305 nod = intbuf_tab(nin)%NSV(i)
306 sort_comm(nin)%DATA_PROC(p)%RBUF(l+1) = x(1,nod)
307 sort_comm(nin)%DATA_PROC(p)%RBUF(l+2) = x(2,nod)
308 sort_comm(nin)%DATA_PROC(p)%RBUF(l+3) = x(3,nod)
309 sort_comm(nin)%DATA_PROC(p)%RBUF(l+4) = v(1,nod)
310 sort_comm(nin)%DATA_PROC(p)%RBUF(l+5) = v(2,nod)
311 sort_comm(nin)%DATA_PROC(p)%RBUF(l+6) = v(3,nod)
312 sort_comm(nin)%DATA_PROC(p)%RBUF(l+7) = ms(nod)
313 sort_comm(nin)%DATA_PROC(p)%RBUF(l+8) = intbuf_tab(nin)%STFNS(i)
314 sort_comm(nin)%DATA_PROC(p)%IBUF(l2+1) = i
315 sort_comm(nin)%DATA_PROC(p)%IBUF(l2+2) = itab(nod)
316 sort_comm(nin)%DATA_PROC(p)%IBUF(l2+3) = kinet(nod)
318 sort_comm(nin)%DATA_PROC(p)%IBUF(l2+4) = 0
319 sort_comm(nin)%DATA_PROC(p)%IBUF(l2+5) = 0
320 sort_comm(nin)%DATA_PROC(p)%IBUF(l2+6) = 0
332 IF(igap==1 .OR. igap==2)
THEN
335#include "vectorize.inc"
338 sort_comm(nin)%DATA_PROC(p)%RBUF(l+rshift)= intbuf_tab(nin)%GAP_S(i)
346#include "vectorize.inc"
349 sort_comm(nin)%DATA_PROC(p)%RBUF(l+rshift) = intbuf_tab(nin)%GAP_S(i)
350 sort_comm(nin)%DATA_PROC(p)%RBUF(l+rshift+1)= intbuf_tab(nin)%GAP_SL(i)
360#include "vectorize.inc"
363 nod = intbuf_tab(nin)%NSV(i)
364 sort_comm(nin)%DATA_PROC(p)%RBUF(l+rshift) = temp(nod)
365 sort_comm(nin)%DATA_PROC(p)%RBUF(l+rshift+1) = intbuf_tab(nin)%AREAS(i)
366 sort_comm(nin)%DATA_PROC(p)%IBUF(l2+ishift) = intbuf_tab(nin)%IELEC(i)
376#include "vectorize.inc"
379 sort_comm(nin)%DATA_PROC(p)%IBUF(l2+ishift) = intbuf_tab(nin)%IPARTFRICS(i)
387#include "vectorize.inc"
390 nod = intbuf_tab(nin)%NSV(i)
391 sort_comm(nin)%DATA_PROC(p)%IBUF(l2+ishift) = nodnx_sms(nod)
392 sort_comm(nin)%DATA_PROC(p)%IBUF(l2+ishift+1)= nod
397 ELSEIF(idtmins_int/=0)
THEN
399#include "vectorize.inc"
402 nod = intbuf_tab(nin)%NSV(i)
410#include "vectorize.inc"
413 nod = intbuf_tab(nin)%NSV(i)
415 sort_comm(nin)%DATA_PROC(p)%IBUF(l2+4) =
igapxremp
416 sort_comm(nin)%DATA_PROC(p)%IBUF(l2+5) =
i24xremp
417 sort_comm(nin)%DATA_PROC(p)%IBUF(l2+6) =
i24iremp
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)