35 . NIN , ISENDTO, IRCVFROM, COMM, RANK, COMSIZE)
54#include "implicit_f.inc"
65#include "i25edge_c.inc"
69 INTEGER,
INTENT(IN) :: NEDGE
70 INTEGER,
INTENT(INOUT) :: LEDGE(NLEDGE,NEDGE)
71 INTEGER,
INTENT(IN) :: NIN,
72 . isendto(ninter+1,*), ircvfrom(ninter+1,*)
73 INTEGER :: COMM,RANK,COMSIZE
80 INTEGER,
DIMENSION(:),
ALLOCATABLE :: BUFFER_SEND,BUFFER_RECV
81 INTEGER :: LOCAL_SIZE(COMSIZE,2), TOTAL_SIZE
82 INTEGER :: DISPL(COMSIZE)
84 INTEGER :: COMSIZE2,LS
85 INTEGER :: S_LEFT,S_RIGHT
86 INTEGER :: ID_LEFT,ID_RIGHT
88 INTEGER DATA MSGOFF/1001/
89 INTEGER STATUS(MPI_STATUS_SIZE),IERROR
94 IF(.NOT. (nspmd == 1 .OR. comm == mpi_comm_null))
THEN
96 local_size(1:comsize,1:2) = 0
97 local_size(rank+1,1) = count(stfe(1:nedge) < zero)
101 IF(ledge(ledge_global_id,i) < 0)
THEN
102 local_size(rank+1,2) = local_size(rank+1,2) + 1
106 comsize2 = comsize * 2
119 total_size = sum(local_size(1:comsize
120 IF(total_size > 0)
THEN
121 ALLOCATE(buffer_send(local_size(rank+1,1)))
122 ALLOCATE(buffer_recv(total_size))
125 IF( stfe(i) < 0 )
THEN
128 buffer_send(j) = abs(ledge(ledge_global_id,i))
130 IF(abs(ledge(ledge_global_id,i)) == d_es)
THEN
131 WRITE(6,*) __file__,d_es,
"is deleted",stfe(i)
138 displ(i)=local_size(i-1,1)+displ(i-1)
140 CALL mpi_allgatherv(buffer_send,
141 . local_size(rank+1,1),
150 DEALLOCATE(buffer_send)
155 IF(
ledge_fie(nin)%P(e_global_id,i) == uid)
THEN
158 IF(uid == d_es)
WRITE(6,*) __file__,
"STF <- 0"
163 DEALLOCATE(buffer_recv)
168 total_size = sum(local_size(1:comsize,2))
169 IF(total_size > 0)
THEN
170 ALLOCATE(buffer_send(5*local_size(rank+1,2)))
171 ALLOCATE(buffer_recv(5*total_size))
174 IF( ledge(ledge_global_id,i) < 0 )
THEN
177 buffer_send(5*(j-1)+1) = abs(ledge(ledge_global_id,i))
178 buffer_send(5*(j-1)+2) = ledge(ledge_left_seg,i)
179 buffer_send(5*(j-1)+3) = ledge(ledge_right_seg,i)
180 buffer_send(5*(j-1)+2) = ledge(ledge_left_id,i)
181 buffer_send(5*(j-1)+3) = ledge(ledge_right_id,i)
183 IF(abs(ledge(ledge_global_id,i)) == d_es)
THEN
184 WRITE(6,*) __file__,d_es,
"is Free"
190 local_size(i,2) = local_size(i,2) * 5
194 displ(i)=local_size(i-1,2)+displ(i-1)
196 ls = local_size(rank+1,2)
197 CALL mpi_allgatherv(buffer_send,
207 DEALLOCATE(buffer_send)
210 uid = buffer_recv(5*(j-1)+1)
211 s_left = buffer_recv(5*(j-1)+2)
212 s_right = buffer_recv(5*(j-1)+3)
213 id_left = buffer_recv(5*(j-1)+4)
214 id_right = buffer_recv(5*(j-1)+5)
217 IF(
ledge_fie(nin)%P(e_global_id,i) == uid)
THEN
219 ledge_fie(nin)%P(e_right_seg,i) = s_right
221 ledge_fie(nin)%P(e_right_id,i) = id_right
225 DEALLOCATE(buffer_recv)
230 WHERE(stfe < zero) stfe = zero
232 IF(ledge(ledge_global_id,i) < 0)
THEN
233 ledge(ledge_global_id,i) = abs(ledge(ledge_global_id,i))