30 . NODGLOBAL , NODLOCAL,
31 . NUMEL , NUMNOD , NUMEL_L , NUMNOD_L,
32 . NUMELS_L , NUMELQ_L, NUMELTG_L,
34 . NSVOIS , NQVOIS , NTGVOIS)
48#include "implicit_f.inc"
57 INTEGER,
INTENT(IN) :: CEP(*), CEL(*)
58 INTEGER,
DIMENSION(NUMNOD),
INTENT(IN) :: NODLOCAL
59 INTEGER,
DIMENSION(NUMNOD_L),
INTENT(IN) :: NODGLOBAL
60 INTEGER,
INTENT(IN) :: PROC, NUMNOD, NUMNOD_L, NUMEL, NUMEL_L,
61 . numels_l, numelq_l, numeltg_l
62 INTEGER,
INTENT(INOUT) :: NSVOIS, NQVOIS, NTGVOIS, NERVOIS, NESVOIS
66 INTEGER :: INODE, IAD, IAD1, IAD2, NODE_ID, P, IELEM, IELEM_L, PROC2, II
67 INTEGER,
DIMENSION(:),
ALLOCATABLE :: TAGELE
68 INTEGER,
DIMENSION(:, :),
ALLOCATABLE :: TAGELE_L
69 INTEGER,
DIMENSION(:),
ALLOCATABLE :: LERCVOIS, LESDVOIS, NERCVOIS, NESDVOIS
70 INTEGER,
DIMENSION(:),
ALLOCATABLE :: PROC_LIST
71 INTEGER :: ELEM1_L, ELEM2_L
76 ALLOCATE(tagele(numel))
78 ALLOCATE(tagele_l(nspmd, numel_l))
79 tagele_l(1:nspmd, 1:numel_l) = 0
81 ALLOCATE(nercvois(nspmd + 1))
82 nercvois(1:nspmd + 1) = 0
83 ALLOCATE(nesdvois(nspmd + 1))
84 nesdvois(1:nspmd + 1) = 0
90 DO inode = 1, numnod_l
91 node_id = nodglobal(inode)
92 iad1 = ale_connectivity%NE_CONNECT%IAD_CONNECT(node_id)
93 iad2 = ale_connectivity%NE_CONNECT%IAD_CONNECT(node_id + 1) - 1
94 IF (iad2 >= iad1)
ALLOCATE(proc_list(iad2 - iad1 + 1))
97 ielem = ale_connectivity%NE_CONNECT%CONNECTED(iad)
100 proc_list(iad - iad1 + 1) = proc2
101 IF (proc2 == proc)
THEN
108 ielem = ale_connectivity%NE_CONNECT%CONNECTED(iad)
110 proc2 = proc_list(iad - iad1 + 1)
111 IF (proc2 /= proc)
THEN
112 IF (tagele(ielem) == 0)
THEN
114 nercvois(proc2 + 1) = nercvois(proc2 + 1) + 1
115 IF (ale_connectivity%NE_CONNECT%TYPE(iad) == 1)
THEN
117 ELSE IF (ale_connectivity%NE_CONNECT%TYPE(iad) == 2)
THEN
119 ELSE IF (ale_connectivity%NE_CONNECT%TYPE(iad) == 2)
THEN
120 ntgvois = ntgvois + 1
127 IF (proc_list(iad - iad1 + 1) == proc)
THEN
128 elem1_l = cel(ale_connectivity%NE_CONNECT%CONNECTED(iad))
131 elem2_l = cel(ale_connectivity%NE_CONNECT%CONNECTED(ii))
132 proc2 = proc_list(ii - iad1 + 1)
133 IF (proc2 /= proc)
THEN
134 IF (tagele_l(proc2 + 1, elem1_l) == 0)
THEN
135 tagele_l(proc2 + 1, elem1_l) = 1
136 nesdvois(proc2 + 1) = nesdvois(proc2 + 1) + 1
143 IF (
ALLOCATED(proc_list))
DEALLOCATE(proc_list)
148 nesvois = nesvois + nesdvois(p)
149 nervois = nervois + nercvois(p)
152 DEALLOCATE(tagele_l, tagele, nercvois, nesdvois)
165 . NODGLOBAL , NODLOCAL,
166 . NUMEL , NUMNOD , NUMEL_L , NUMNOD_L,
167 . NUMELS_L , NUMELQ_L, NUMELTG_L,
168 . NERVOIS , NESVOIS ,
169 . NSVOIS , NQVOIS , NTGVOIS , ELEMID_L, LEN_IA,IXS)
182#include "implicit_f.inc"
186#include "com01_c.inc"
191 INTEGER,
INTENT(IN) :: CEP(*), CEL(*)
192 INTEGER,
DIMENSION(NUMNOD),
INTENT(IN) :: NODLOCAL
193 INTEGER,
DIMENSION(NUMNOD_L),
INTENT(IN) :: NODGLOBAL
194 INTEGER,
INTENT(IN) :: PROC, NUMNOD, NUMNOD_L, NUMEL, NUMEL_L, NUMELS_L, NUMELQ_L, NUMELTG_L
195 INTEGER,
INTENT(IN) :: NERVOIS, NESVOIS
196 INTEGER,
INTENT(INOUT) :: NSVOIS, NQVOIS, NTGVOIS
197 INTEGER,
DIMENSION(NUMEL),
INTENT(INOUT) :: ELEMID_L
198 INTEGER,
INTENT(INOUT) :: LEN_IA
199 INTEGER,
INTENT(IN) :: IXS(11,*)
203 INTEGER :: INODE, IAD, IAD1, IAD2, NODE_ID, P, IELEM, IELEM_L, PROC2, IFE, JFE
204INTEGER,
DIMENSION(:),
ALLOCATABLE :: TAGELE
205 INTEGER,
DIMENSION(:, :),
ALLOCATABLE :: TAGELE_L
206 INTEGER,
DIMENSION(:),
ALLOCATABLE :: LERCVOIS, LESDVOIS, NERCVOIS, NESDVOIS
207 INTEGER,
DIMENSION(:),
ALLOCATABLE :: CPULOCALER, CPULOCALES, TAGER, TAGES
208 INTEGER,
DIMENSION(:),
ALLOCATABLE :: IDX, TMP, TMP2, PROC_LIST
209 INTEGER :: ELEM1_L, ELEM2_L
214 ALLOCATE(tagele(numel))
216 ALLOCATE(tagele_l(nspmd, numel_l))
217 tagele_l(1:nspmd, 1:numel_l) = 0
218 elemid_l(1:numel) = 0
219 ALLOCATE(lercvois(nervois))
220 lercvois(1:nervois) = 0
221 ALLOCATE(lesdvois(nesvois))
222 lercvois(1:nervois) = 0
223 ALLOCATE(nercvois(nspmd + 1))
224 nercvois(1:nspmd + 1) = 0
225 ALLOCATE(nesdvois(nspmd + 1))
226 nesdvois(1:nspmd + 1) = 0
227 ALLOCATE(tager(nervois))
229 ALLOCATE(cpulocaler(nervois))
230 cpulocaler(1:nervois) = 0
231 ALLOCATE(tages(nesvois))
233 ALLOCATE(cpulocales(nesvois))
234 cpulocales(1:nesvois) = 0
235 ALLOCATE(idx(
max(nervois, nesvois)))
236 idx(1:
max(nervois, nesvois)) = 0
237 ALLOCATE(tmp(
max(nervois, nesvois)))
238 tmp(1:
max(nervois, nesvois)) = 0
239 ALLOCATE(tmp2(
max(nervois, nesvois)))
240 tmp2(1:
max(nervois, nesvois)) = 0
245 DO inode = 1, numnod_l
246 node_id = nodglobal(inode)
247 iad1 = ale_connectivity%NE_CONNECT%IAD_CONNECT(node_id)
248 iad2 = ale_connectivity%NE_CONNECT%IAD_CONNECT(node_id + 1) - 1
249 IF (iad2 >= iad1)
ALLOCATE(proc_list(iad2 - iad1 + 1))
252 ielem = ale_connectivity%NE_CONNECT%CONNECTED(iad)
255 proc_list(iad - iad1 + 1) = proc2
256 IF (proc2 == proc)
THEN
258 elemid_l(ielem) = ielem_l
264 ielem = ale_connectivity%NE_CONNECT%CONNECTED(iad)
266 proc2 = proc_list(iad - iad1 + 1)
267 IF (proc2 /= proc)
THEN
268 IF (tagele(ielem) == 0)
THEN
271 IF (ale_connectivity%NE_CONNECT%TYPE(iad) == 1)
THEN
272 elemid_l(ielem) = numels_l + ife
273 lercvois(ife) = numels_l + ife
274 ELSE IF (ale_connectivity%NE_CONNECT%TYPE(iad)
THEN
275 elemid_l(ielem) = numelq_l + ife
276 lercvois(ife) = numelq_l + ife
277 ELSE IF (ale_connectivity%NE_CONNECT%TYPE(iad) == 3)
THEN
278 elemid_l(ielem) = numeltg_l + ife
279 lercvois(ife) = numeltg_l
281 nercvois(proc2 + 1) = nercvois(proc2 + 1) + 1
283 cpulocaler(ife) = proc2
289 IF (proc_list(iad - iad1 + 1) == proc)
THEN
290 elem1_l = cel(ale_connectivity%NE_CONNECT%CONNECTED
293 elem2_l = cel(ale_connectivity%NE_CONNECT%CONNECTED(ii))
294 proc2 = proc_list(ii - iad1 + 1)
295 IF (proc2 /= proc)
THEN
296 IF (tagele_l(proc2 + 1, elem1_l) == 0)
THEN
297 tagele_l(proc2 + 1, elem1_l) = 1
298 nesdvois(proc2 + 1) = nesdvois(proc2 + 1) + 1
300 lesdvois(jfe) = elem1_l
301 tages(jfe) = ale_connectivity%NE_CONNECT%CONNECTED(iad)
302 cpulocales(jfe) = proc2
310 IF (
ALLOCATED(proc_list))
DEALLOCATE(proc_list)
314 nercvois(nspmd + 1) = nercvois(nspmd + 1) + nercvois(p)
315 nesdvois(nspmd + 1) = nesdvois(nspmd + 1) + nesdvois(p)
321 tmp2(ii) = lercvois(ii)
327 tager(ii) = tmp(idx(ii))
328 lercvois(ii) = tmp2(idx(ii))
331 tmp2(ii) = lercvois(ii)
335 DO WHILE (iad <= nervois)
336 DO iad1 = iad, nervois
337 IF (cpulocaler(iad) /= cpulocaler(iad1))
THEN
341 DO ii = iad, iad1 - 1
344 CALL quicksort_i2(tager(iad:iad1 - 1), idx(iad:iad1 - 1), 1, iad1 - iad)
349 lercvois(ii) = tmp2(idx(ii))
355 tmp2(ii) = lesdvois(ii)
361 tages(ii) = tmp(idx(ii))
362 lesdvois(ii) = tmp2(idx(ii))
365 tmp2(ii) = lesdvois(ii)
369 DO WHILE (iad <= nesvois)
370 DO iad1 = iad, nesvois
371 IF (cpulocales(iad) /= cpulocales(iad1))
THEN
375 DO ii = iad, iad1 - 1
378 CALL quicksort_i2(tages(iad:iad1 - 1), idx(iad:iad1 - 1), 1, iad1 - iad)
383 lesdvois(ii) = tmp2(idx(ii))
387 len_ia = len_ia + nspmd + 1
389 len_ia = len_ia + nervois
391 len_ia = len_ia + nspmd + 1
393 len_ia = len_ia + nesvois
395 DEALLOCATE(tagele, tagele_l, nercvois, nesdvois, lercvois, lesdvois,
396 . cpulocaler, cpulocales, tager, tages, tmp, tmp2, idx)
subroutine spmd_ne_connect(ale_connectivity, proc, cep, cel, nodglobal, nodlocal, numel, numnod, numel_l, numnod_l, numels_l, numelq_l, numeltg_l, nervois, nesvois, nsvois, nqvois, ntgvois, elemid_l, len_ia, ixs)