36
37
38
39
40
41
42
43
44
45
46
47
48
51
52
53
54#include "implicit_f.inc"
55
56
57
58#include "spmd.inc"
59
60
61
62#include "com01_c.inc"
63#include "com04_c.inc"
64#include "param_c.inc"
65#include "i25edge_c.inc"
66
67
68
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
75 . stfe(nedge)
76
77
78
79
80 INTEGER, DIMENSION(:), ALLOCATABLE :: BUFFER_SEND,BUFFER_RECV
81 INTEGER :: LOCAL_SIZE(COMSIZE,2), TOTAL_SIZE
82 INTEGER :: DISPL(COMSIZE)
83 INTEGER :: I,J, UID
84 INTEGER :: COMSIZE2,LS
85 INTEGER :: S_LEFT,S_RIGHT
86 INTEGER :: ID_LEFT,ID_RIGHT
87#ifdef MPI
88 INTEGER DATA MSGOFF/1001/
89 INTEGER STATUS(MPI_STATUS_SIZE),IERROR
90
91
92
93
94 IF(.NOT. (nspmd == 1 .OR. comm == mpi_comm_null)) THEN
95
96 local_size(1:comsize,1:2) = 0
97 local_size(rank+1,1) = count(stfe(1:nedge) < zero)
98
99
100 DO i = 1,nedge
101 IF(ledge(ledge_global_id,i) < 0) THEN
102 local_size(rank+1,2) = local_size(rank+1,2) + 1
103 ENDIF
104 ENDDO
105
106 comsize2 = comsize * 2
108 . local_size,
109 . comsize2,
110 . mpi_integer,
111 . mpi_sum,
112 . comm,
113 . ierror)
114
115
116
117
118
119 total_size = sum(local_size(1:comsize,1))
120 IF(total_size > 0) THEN
121 ALLOCATE(buffer_send(local_size(rank+1,1)))
122 ALLOCATE(buffer_recv(total_size))
123 j = 0
124 DO i = 1, nedge
125 IF( stfe(i) < 0 ) THEN
126 j = j + 1
127
128 buffer_send(j) = abs(ledge(ledge_global_id,i))
129#ifdef D_ES
130 IF(abs(ledge(ledge_global_id,i)) == d_es) THEN
131 WRITE(6,*) __file__,d_es,"is deleted",stfe(i)
132 ENDIF
133#endif
134 ENDIF
135 ENDDO
136 displ(1)=0
137 DO i=2,comsize
138 displ(i)=local_size(i-1,1)+displ(i-1)
139 ENDDO
140 CALL mpi_allgatherv(buffer_send,
141 . local_size(rank+1,1),
142 . mpi_integer,
143 . buffer_recv,
144 . local_size(:,1),
145 . displ,
146 . mpi_integer,
147 . comm,
148 . ierror)
149
150 DEALLOCATE(buffer_send)
151
152 DO j = 1, total_size
153 uid = buffer_recv(j)
155 IF(
ledge_fie(nin)%P(e_global_id,i) == uid)
THEN
157#ifdef D_ES
158 IF(uid == d_es) WRITE(6,*) __file__,"STF <- 0"
159#endif
160 ENDIF
161 ENDDO
162 ENDDO
163 DEALLOCATE(buffer_recv)
164 ENDIF
165
166
167
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))
172 j = 0
173 DO i = 1, nedge
174 IF( ledge(ledge_global_id,i) < 0 ) THEN
175 j = j + 1
176
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)
182#ifdef D_ES
183 IF(abs(ledge(ledge_global_id,i)) == d_es) THEN
184 WRITE(6,*) __file__,d_es,"is Free"
185 ENDIF
186#endif
187 ENDIF
188 ENDDO
189 DO i=1,comsize
190 local_size(i,2) = local_size(i,2) * 5
191 ENDDO
192 displ(1)=0
193 DO i=2,comsize
194 displ(i)=local_size(i-1,2)+displ(i-1)
195 ENDDO
196 ls = local_size(rank+1,2)
197 CALL mpi_allgatherv(buffer_send,
198 . ls,
199 . mpi_integer,
200 . buffer_recv,
201 . local_size(:,2),
202 . displ,
203 . mpi_integer,
204 . comm,
205 . ierror)
206
207 DEALLOCATE(buffer_send)
208
209 DO j = 1, total_size
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)
215
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
222 ENDIF
223 ENDDO
224 ENDDO
225 DEALLOCATE(buffer_recv)
226 ENDIF
227 ENDIF
228#endif
229
230 WHERE(stfe < zero) stfe = zero
231 DO i = 1,nedge
232 IF(ledge(ledge_global_id,i) < 0) THEN
233 ledge(ledge_global_id,i) = abs(ledge(ledge_global_id,i))
234 ENDIF
235 ENDDO
236
237
238
239
240 RETURN
subroutine mpi_allreduce(sendbuf, recvbuf, cnt, datatype, operation, comm, ierr)
type(int_pointer2), dimension(:), allocatable ledge_fie
type(real_pointer), dimension(:), allocatable stifie