2 SUBROUTINE partitioner_para
4 & (pmethod, nelem, npoin, ndp, nparts, ikles, epart, npart)
29 #if defined HAVE_PTSCOTCH 39 #if defined HAVE_PTSCOTCH 43 INTEGER,
INTENT(IN) :: pmethod
44 INTEGER,
INTENT(IN) :: nelem
45 INTEGER,
INTENT(IN) :: npoin
46 INTEGER,
INTENT(IN) :: ndp
47 INTEGER,
INTENT(IN) :: ikles(nelem*ndp)
48 INTEGER,
INTENT(IN) :: nparts
49 INTEGER,
INTENT(OUT) :: epart(nelem)
51 INTEGER,
INTENT(OUT) :: npart(nelem)
57 INTEGER :: err, i, j, k
61 INTEGER :: ncommonnodes
63 INTEGER,
ALLOCATABLE :: eptr(:), eind(:)
64 INTEGER,
ALLOCATABLE :: nulltable(:)
65 #if defined HAVE_PTSCOTCH || HAVE_PARMETIS 66 INTEGER,
ALLOCATABLE :: epart_loc(:)
70 INTEGER :: options(0:2)
71 REAL*4,
ALLOCATABLE :: tpwgts(:), ubvec(:)
73 INTEGER,
ALLOCATABLE :: vwgt(:)
74 INTEGER,
ALLOCATABLE :: recvcount(:)
75 INTEGER,
ALLOCATABLE :: recvbuf(:)
76 INTEGER,
ALLOCATABLE :: elmdist(:)
77 INTEGER,
ALLOCATABLE :: displs(:)
80 #if defined HAVE_PTSCOTCH 82 REAL*8,
DIMENSION(SCOTCH_DGRAPHDIM) :: ptscotchgraph
83 REAL*8,
DIMENSION(SCOTCH_STRATDIM) :: ptscotchstrat
84 TYPE(c_ptr),
POINTER :: ptxadj(:), ptadjncy(:)
85 INTEGER,
POINTER :: xadj2(:), adjncy2(:)
90 #if defined HAVE_PARMETIS 91 WRITE(
lu,*)
'BEGIN PARTITIONING WITH PARMETIS' 93 ALLOCATE (elmdist(nparts+1),stat=err)
94 CALL check_allocate (err,
'ELMDIST')
98 IF (ndp==3.OR.ndp==6)
THEN 101 WRITE(
lu,*)
'PARMETIS: IMPLEMENTED FOR ',
102 &
'TRIANGLES OR PRISMS ONLY' 111 elmdist(i+1) = elmdist(i) + nelem/nparts
113 elmdist(nparts+1) = nelem + 1
115 nelem_loc = elmdist(ipid+2) - elmdist(ipid+1)
117 ALLOCATE (eptr(nelem_loc+1),stat=err)
118 CALL check_allocate(err,
'EPTR')
119 ALLOCATE (eind(nelem_loc*ndp),stat=err)
120 CALL check_allocate(err,
'EIND')
121 ALLOCATE (epart_loc(nelem_loc),stat=err)
122 CALL check_allocate(err,
'EPART_LOC')
127 eptr(i) = (i-1)*ndp + 1
131 DO i=elmdist(ipid+1),elmdist(ipid+2)-1
133 eind(k) = ikles((i-1)*ndp+j)
141 ALLOCATE (tpwgts(ncon*nparts),stat=err)
142 CALL check_allocate(err,
'TPWGTS')
143 ALLOCATE (ubvec(ncon),stat=err)
144 CALL check_allocate(err,
'UBVEC')
145 ALLOCATE(vwgt(nelem_loc),stat=err)
146 CALL check_allocate(err,
'VWGT')
148 tpwgts(:) = 1.d0/float(nparts)
155 CALL parmetis_v3_partmeshkway(elmdist, eptr, eind, vwgt,
157 & ncon, ncommonnodes, nparts, tpwgts,
158 & ubvec, options, edgecut, epart_loc,
166 ALLOCATE(recvcount(nparts),stat=err)
167 CALL check_allocate(err,
'RECVCOUNT')
168 ALLOCATE(displs(nparts),stat=err)
169 CALL check_allocate(err,
'RECVCOUNT')
171 recvcount(i) = elmdist(i+1) - elmdist(i)
175 displs(i) = displs(i-1) + recvcount(i-1)
179 & recvcount,displs, err)
183 DEALLOCATE(epart_loc)
184 DEALLOCATE(recvcount)
186 WRITE(
lu,*)
"TRYING TO USE PARMETIS TO PARTIONNE WHEN PARMETIS",
187 &
" IS NOT INSTALLED" 190 ELSE IF(pmethod.EQ.4)
THEN 191 #if defined HAVE_PTSCOTCH 192 WRITE(
lu,*)
'BEGIN PARTITIONING WITH PTSCOTCH' 194 ALLOCATE (elmdist(nparts+1),stat=err)
195 CALL check_allocate(err,
'ELMDIST')
199 IF (ndp==3.OR.ndp==6)
THEN 202 WRITE(
lu,*)
'PTSCOTCH: IMPLEMENTED FOR ',
203 &
'TRIANGLES OR PRISMS ONLY' 213 elmdist(i+1) = elmdist(i) + nelem/nparts
215 elmdist(nparts+1) = nelem + 1
217 nelem_loc = elmdist(ipid+2) - elmdist(ipid+1)
219 ALLOCATE (eptr(nelem_loc+1),stat=err)
220 CALL check_allocate(err,
'EPTR')
221 ALLOCATE (eind(nelem_loc*ndp),stat=err)
222 CALL check_allocate(err,
'EIND')
223 ALLOCATE (epart_loc(nelem_loc),stat=err)
224 CALL check_allocate(err,
'EPART_LOC')
230 eptr(i) = (i-1)*ndp + 1
234 DO i=elmdist(ipid+1),elmdist(ipid+2)-1
236 eind(k) = ikles((i-1)*ndp+j)
246 ALLOCATE(ptadjncy(1))
247 CALL parmetis_v3_mesh2dual(elmdist, eptr, eind,
248 & numflag, ncommonnodes,
254 recvbuf(1) = nelem_loc+1
255 CALL c_f_pointer(ptxadj(1),xadj2,recvbuf)
257 nedge = xadj2(nelem_loc+1)-1
259 CALL c_f_pointer(ptadjncy(1),adjncy2,recvbuf)
264 CALL scotchfstratinit(ptscotchstrat,err)
266 WRITE(
lu,*)
'PTSCOTCH ERROR: CANNOT INITIALIZE STRAT',err
270 CALL scotchfdgraphinit(ptscotchgraph,
comm,err)
272 WRITE(
lu,*)
'PTSCOTCH ERROR: CANNOT INITIALIZE GRAPH' 276 CALL scotchfdgraphbuild ( ptscotchgraph,
281 & xadj2(1:nelem_loc),
282 & xadj2(2:nelem_loc+1),
285 & xadj2(nelem_loc+1)-1,
286 & xadj2(nelem_loc+1)-1,
292 WRITE(
lu,*)
'PTSCOTCH ERROR: CANNOT BUILD GRAPH' 296 CALL scotchfdgraphcheck(ptscotchgraph,err)
298 WRITE(
lu,*)
'PTSCOTCH ERROR: GRAPH NOT CONSISTANT' 302 CALL scotchfdgraphpart ( ptscotchgraph,
309 WRITE(
lu,*)
'PTSCOTCH ERROR: CANNOT PARTITION GRAPH' 314 epart_loc(i) = epart_loc(i) + 1
317 CALL scotchfgraphexit(ptscotchgraph)
319 CALL scotchfstratexit(ptscotchstrat)
322 ALLOCATE(recvcount(nparts),stat=err)
323 CALL check_allocate(err,
'RECVCOUNT')
324 ALLOCATE(displs(nparts),stat=err)
325 CALL check_allocate(err,
'RECVCOUNT')
327 recvcount(i) = elmdist(i+1) - elmdist(i)
331 displs(i) = displs(i-1) + recvcount(i-1)
335 & recvcount,displs,err)
341 DEALLOCATE(epart_loc)
343 WRITE(
lu,*)
"TRYING TO PARTITIONNE WITH PTSCOTCH WHEN",
344 &
"PTSCOTCH IS NOT INSTALLED" 347 ELSEIF(pmethod.EQ.1)
THEN 348 WRITE(
lu,*)
'BEGIN PARTITIONING WITH METIS' 349 ALLOCATE (eptr(nelem+1),stat=err)
350 CALL check_allocate(err,
'EPTR')
351 ALLOCATE (eind(nelem*ndp),stat=err)
352 CALL check_allocate(err,
'EIND')
355 eptr(i) = (i-1)*ndp + 1
361 eind(k) = ikles((i-1)*ndp+j)
376 IF (ndp==3.OR.ndp==6)
THEN 379 WRITE(
lu,*)
'METIS: IMPLEMENTED FOR TRIANGLES OR PRISMS ONLY' 388 CALL metis_partmeshdual
389 & (nelem, npoin, eptr, eind, nulltable,
390 & nulltable, ncommonnodes, nparts, nulltable,
391 & nulltable, edgecut, epart, npart)
393 WRITE(
lu,*)
'ERROR: TRY TO RUN PARTEL_PARA WITH A '//
394 &
'SERIAL CONFIGURATION' 406 END SUBROUTINE partitioner_para
subroutine p_allgatherv_i(SEND_BUFFER, SEND_COUNT, RECV_BUFFER, RECV_COUNT, DISPLS, IERR)