85 INTEGER ::
i,
j, counter
87 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: numcommnodesfromall
101 DO j = 1, global%NumNp
102 IF (nodeproc(
j) ==
i)
THEN
107 IF (counter == 1)
THEN
108 numcommprocs1 = numcommprocs1 + 1
114 ALLOCATE(commprocs1(1:numcommprocs1))
118 DO j = 1, global%NumNp
119 IF (nodeproc(
j) ==
i)
THEN
120 counter = counter + 1
121 commprocs1(counter) =
i
129 ALLOCATE(numcommnodes1(1:numcommprocs1))
130 DO i = 1, numcommprocs1
132 DO j = 1, global%NumNp
133 IF (nodeproc(
j) == commprocs1(
i))
THEN
134 numcommnodes1(
i) = numcommnodes1(
i) + 1
140 maxnumcommnodes1 = maxval(numcommnodes1)
141 ALLOCATE(commnodes1(1:numcommprocs1,1:maxnumcommnodes1))
142 DO i = 1, numcommprocs1
143 commnodes1(
i,1:maxnumcommnodes1) = -1
145 DO j = 1, global%NumNp
146 IF (nodeproc(
j) == commprocs1(
i))
THEN
147 counter = counter + 1
148 commnodes1(
i,counter) =
j
159 ALLOCATE(frmproc(0:nprocs-1))
160 ALLOCATE(req_rcv(1:nprocs))
161 ALLOCATE(stat_rcv(1:mpi_status_size,1:nprocs))
162 ALLOCATE(req_snd(1:nprocs))
163 ALLOCATE(stat_snd(1:mpi_status_size,1:nprocs))
167 DO j = 1, mpi_status_size
174 ALLOCATE(numcommnodesfromall(0:nprocs-1))
176 CALL mpi_irecv(numcommnodesfromall(
i),1, &
177 mpi_integer,
i,10,rocstar_communicator, &
182 DO j = 1, numcommprocs1
183 IF (commprocs1(
j) ==
i)
THEN
184 tempnodes = numcommnodes1(
j)
187 CALL mpi_isend(tempnodes,1,mpi_integer, &
188 i,10,rocstar_communicator,req_snd(
i+1),ierr)
190 CALL mpi_waitall(nprocs,req_rcv,stat_rcv,ierr)
191 CALL mpi_waitall(nprocs,req_snd,stat_snd,ierr)
201 numcommprocsfrom1 = 0
203 IF (numcommnodesfromall(
i) > 0)
THEN
204 numcommprocsfrom1 = numcommprocsfrom1 + 1
209 ALLOCATE(commprocsfrom1(1:numcommprocsfrom1))
210 ALLOCATE(numcommnodesfrom1(1:numcommprocsfrom1))
213 IF (numcommnodesfromall(
i) > 0)
THEN
214 counter = counter + 1
215 commprocsfrom1(counter) =
i
216 numcommnodesfrom1(counter) = numcommnodesfromall(
i)
222 DEALLOCATE(numcommnodesfromall)
275 INTEGER ::
i,
j, counter
277 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: numcommnodesfromall
278 INTEGER,
ALLOCATABLE,
DIMENSION(:,:) :: commnodesfrom2
279 REAL(kind=wp),
ALLOCATABLE,
DIMENSION(:) :: bufsnd
288 numcommprocsfrom2 = 0
292 DO j = 1, global%NumNp
293 IF (nodeproc(
j) ==
i)
THEN
298 IF (counter == 1)
THEN
299 numcommprocsfrom2 = numcommprocsfrom2 + 1
305 ALLOCATE(commprocsfrom2(1:numcommprocsfrom2))
309 DO j = 1, global%NumNp
310 IF (nodeproc(
j) ==
i)
THEN
311 counter = counter + 1
312 commprocsfrom2(counter) =
i
320 ALLOCATE(numcommnodesfrom2(1:numcommprocsfrom2))
321 DO i = 1, numcommprocsfrom2
322 numcommnodesfrom2(
i) = 0
323 DO j = 1, global%NumNp
324 IF (nodeproc(
j) == commprocsfrom2(
i))
THEN
325 numcommnodesfrom2(
i) = numcommnodesfrom2(
i) + 1
336 ALLOCATE(frmproc(0:nprocs-1))
337 ALLOCATE(req_rcv(1:nprocs))
338 ALLOCATE(stat_rcv(1:mpi_status_size,1:nprocs))
339 ALLOCATE(req_snd(1:nprocs))
340 ALLOCATE(stat_snd(1:mpi_status_size,1:nprocs))
344 DO j = 1, mpi_status_size
351 ALLOCATE(numcommnodesfromall(0:nprocs-1))
353 CALL mpi_irecv(numcommnodesfromall(
i),1, &
354 mpi_integer,
i,10,rocstar_communicator, &
359 DO j = 1, numcommprocsfrom2
360 IF (commprocsfrom2(
j) ==
i)
THEN
361 tempnodes = numcommnodesfrom2(
j)
364 CALL mpi_isend(tempnodes,1,mpi_integer, &
365 i,10,rocstar_communicator,req_snd(
i+1),ierr)
367 CALL mpi_waitall(nprocs,req_rcv,stat_rcv,ierr)
368 CALL mpi_waitall(nprocs,req_snd,stat_snd,ierr)
380 IF (numcommnodesfromall(
i) > 0)
THEN
381 numcommprocs2 = numcommprocs2 + 1
386 ALLOCATE(commprocs2(1:numcommprocs2))
387 ALLOCATE(numcommnodes2(1:numcommprocs2))
390 IF (numcommnodesfromall(
i) > 0)
THEN
391 counter = counter + 1
392 commprocs2(counter) =
i
393 numcommnodes2(counter) = numcommnodesfromall(
i)
399 DEALLOCATE(numcommnodesfromall)
402 maxnumcommnodes2 = maxval(numcommnodesfrom2)
403 ALLOCATE(commnodesfrom2(1:numcommprocsfrom2,1:maxnumcommnodes2))
404 DO i = 1, numcommprocsfrom2
405 commnodesfrom2(
i,1:maxnumcommnodes2) = -1
407 DO j = 1, global%NumNp
408 IF (nodeproc(
j) == commprocsfrom2(
i))
THEN
409 counter = counter + 1
410 commnodesfrom2(
i,counter) =
j
430 ALLOCATE(req_rcv(1:nprocs))
431 ALLOCATE(req_snd(1:nprocs))
432 ALLOCATE(stat_snd(1:mpi_status_size,1:nprocs))
433 ALLOCATE(stat_rcv(1:mpi_status_size,1:nprocs))
437 DO j = 1, mpi_status_size
444 ALLOCATE(frmproc(1:numcommprocs2))
445 DO i = 1, numcommprocs2
446 ALLOCATE(frmproc(
i)%rcvbuf(1:numcommnodes2(
i)))
447 CALL mpi_irecv(frmproc(
i)%rcvbuf(1),numcommnodes2(
i), &
448 mpi_double_precision,commprocs2(
i),10,rocstar_communicator, &
451 DO i = 1, numcommprocsfrom2
452 ALLOCATE(bufsnd(1:numcommnodesfrom2(
i)))
453 DO j = 1, numcommnodesfrom2(
i)
454 bufsnd(
j) = local2global(commnodesfrom2(
i,
j))
457 CALL mpi_isend(bufsnd,numcommnodesfrom2(
i),mpi_double_precision, &
458 commprocsfrom2(
i),10,rocstar_communicator,req_snd(
i+1),ierr)
463 CALL mpi_waitall(nprocs,req_rcv,stat_rcv,ierr)
464 CALL mpi_waitall(nprocs,req_snd,stat_snd,ierr)
479 maxnumcommnodes2 = maxval(numcommnodes2)
480 ALLOCATE(commnodes2(1:numcommprocs2,1:maxnumcommnodes2))
481 DO i = 1, numcommprocs2
482 commnodes2(
i,1:maxnumcommnodes2) = -1
483 DO j = 1, numcommnodes2(
i)
484 commnodes2(
i,
j) = int(frmproc(
i)%rcvbuf(
j))
490 DEALLOCATE(commnodesfrom2)
subroutine initcomm1(global)
subroutine initcomm2(global)