15 interface des_collect_gdata
17 module procedure des_collect_gdata_db2
18 end interface des_collect_gdata
20 integer :: itotalneigh, itotalindx
22 integer,
allocatable :: itoproc(:)
23 integer,
allocatable :: istartsend(:)
24 integer,
allocatable :: istartrecv(:)
28 integer,
allocatable :: isendnodes(:)
29 integer,
allocatable :: irecvnodes(:)
31 double precision,
allocatable :: dsendnodebuf(:)
32 double precision,
allocatable :: drecvnodebuf(:)
34 integer,
allocatable :: irecvreqnode(:)
35 integer,
allocatable :: isendreqnode(:)
54 use discretelement
, only: des_periodic_walls_x, des_periodic_walls_y, des_periodic_walls_z
61 integer :: lijkproc,liproc,ljproc,lkproc
63 integer :: li2,lj2,lk2
65 integer :: liproc_start, liproc_end
66 integer :: ljproc_start, ljproc_end
67 integer :: lkproc_start, lkproc_end
69 integer :: lci,lcj,lck,lproc,lcount
70 integer :: linode_start,linode_end, linode
71 integer :: ljnode_start,ljnode_end, ljnode
72 integer :: lknode_start,lknode_end, lknode
75 integer,
allocatable :: iprocsumindx(:)
80 liproc = iofproc(
mype)
81 ljproc = jofproc(
mype)
82 lkproc = kofproc(
mype)
85 if(des_periodic_walls_x .and.
nodesi > 1)
then 89 liproc_start =max(liproc-1,0)
90 liproc_end=min(liproc+1,
nodesi-1)
93 if(des_periodic_walls_y .and.
nodesj > 1)
then 97 ljproc_start =max(ljproc-1,0)
98 ljproc_end=min(ljproc+1,
nodesj-1)
101 if(des_periodic_walls_z .and.
nodesk > 1)
then 102 lkproc_start=lkproc-1
105 lkproc_start =max(lkproc-1,0)
106 lkproc_end=min(lkproc+1,
nodesk-1)
109 itotalneigh = (liproc_end-liproc_start+1)*&
110 (ljproc_end-ljproc_start+1)*(lkproc_end-lkproc_start+1)-1
113 allocate (itoproc(itotalneigh))
114 allocate (iprocsumindx(itotalneigh))
115 allocate (istartsend(itotalneigh+1))
116 allocate (istartrecv(itotalneigh+1))
117 allocate (isendreqnode(itotalneigh))
118 allocate (irecvreqnode(itotalneigh))
126 do lk = lkproc_start, lkproc_end
127 do lj = ljproc_start, ljproc_end
128 do li = liproc_start, liproc_end
134 lijkproc =
procijk(li2,lj2,lk2)
136 if (lijkproc.eq.
mype) cycle
140 do lproc = 1,itotalneigh
141 if (lijkproc .eq.itoproc(lproc))
then 146 if(.not.lpresent)
then 147 itotalneigh = itotalneigh + 1
151 itoproc(lproc) = lijkproc
155 linode_start = istart2
157 elseif(lci == -1)
then 161 linode_start = istart1
167 ljnode_start = jstart2
169 elseif(lcj == -1)
then 173 ljnode_start = jstart1
179 lknode_start = kstart2
181 elseif(lck == -1)
then 185 lknode_start = kstart1
189 do lknode = lknode_start,lknode_end
190 do linode = linode_start,linode_end
191 do ljnode = ljnode_start,ljnode_end
193 IF(wall_at(funijk(linode,ljnode,lknode))) cycle
194 iprocsumindx(lproc) = iprocsumindx(lproc) + 1
204 do lproc =1,itotalneigh+1
205 istartsend(lproc)=sum(iprocsumindx(1:lproc-1))+1
207 itotalindx=istartsend(itotalneigh+1)-1
210 allocate(isendnodes(itotalindx))
211 allocate(dsendnodebuf(itotalindx))
215 do lk = lkproc_start,lkproc_end
216 do lj = ljproc_start,ljproc_end
217 do li = liproc_start,liproc_end
221 lijkproc =
procijk(li2,lj2,lk2)
222 if (lijkproc.eq.
mype) cycle
224 do lproc =1,itotalneigh
225 if(lijkproc.eq.itoproc(lproc))
then 232 linode_start = istart2
234 elseif(lci == -1)
then 238 linode_start = istart1
244 ljnode_start = jstart2
246 elseif(lcj == -1)
then 250 ljnode_start = jstart1
256 lknode_start = kstart2
258 elseif(lck == -1)
then 262 lknode_start = kstart1
266 lcount = istartsend(lproc)+iprocsumindx(lproc)
267 do lknode = lknode_start,lknode_end
268 do linode = linode_start,linode_end
269 do ljnode = ljnode_start,ljnode_end
271 IF(wall_at(funijk(linode,ljnode,lknode))) cycle
272 isendnodes(lcount)=funijk(linode,ljnode,lknode)
273 iprocsumindx(lproc)=iprocsumindx(lproc)+1
286 do lk = lkproc_start, lkproc_end
287 do lj = ljproc_start, ljproc_end
288 do li = liproc_start, liproc_end
294 lijkproc =
procijk(li2,lj2,lk2)
296 if (lijkproc.eq.
mype) cycle
299 do lproc = 1,itotalneigh
300 if(lijkproc .eq. itoproc(lproc))
exit 303 lci=(liproc-li);lcj=(ljproc-lj);lck=(lkproc-lk)
305 linode_start = istart1; linode_end=iend1
306 ljnode_start = jstart1; ljnode_end=jend1
307 lknode_start = kstart1; lknode_end=kend1
308 if(lci.eq. 1) linode_end = istart1
309 if(lci.eq.-1) linode_start = iend1
310 if(lcj.eq. 1) ljnode_end = jstart1
311 if(lcj.eq.-1) ljnode_start = jend1
312 if(lck.eq. 1) lknode_end = kstart1
313 if(lck.eq.-1) lknode_start = kend1
315 do lknode = lknode_start,lknode_end
316 do linode = linode_start,linode_end
317 do ljnode = ljnode_start,ljnode_end
319 IF(wall_at(funijk(linode,ljnode,lknode))) cycle
320 iprocsumindx(lproc) = iprocsumindx(lproc) + 1
329 do lproc =1,itotalneigh+1
330 istartrecv(lproc)=sum(iprocsumindx(1:lproc-1))+1
332 itotalindx=istartrecv(itotalneigh+1)-1
334 allocate(irecvnodes(itotalindx))
335 allocate(drecvnodebuf(itotalindx))
339 do lk = lkproc_start,lkproc_end
340 do lj = ljproc_start,ljproc_end
341 do li = liproc_start,liproc_end
346 lijkproc =
procijk(li2,lj2,lk2)
348 if (lijkproc.eq.
mype) cycle
351 do lproc =1,itotalneigh
352 if(lijkproc.eq.itoproc(lproc))
then 357 lci=(liproc-li);lcj=(ljproc-lj);lck=(lkproc-lk)
360 linode_start = istart1; linode_end=iend1
361 ljnode_start = jstart1; ljnode_end=jend1
362 lknode_start = kstart1; lknode_end=kend1
364 if(lci.eq. 1) linode_end = istart1
365 if(lci.eq.-1) linode_start = iend1
366 if(lcj.eq. 1) ljnode_end = jstart1
367 if(lcj.eq.-1) ljnode_start = jend1
368 if(lck.eq. 1) lknode_end = kstart1
369 if(lck.eq.-1) lknode_start = kend1
371 lcount = istartrecv(lproc)+iprocsumindx(lproc)
372 do lknode = lknode_start,lknode_end
373 do linode = linode_start,linode_end
374 do ljnode = ljnode_start,ljnode_end
376 IF(wall_at(funijk(linode,ljnode,lknode))) cycle
377 irecvnodes(lcount)=funijk(linode,ljnode,lknode)
378 iprocsumindx(lproc)=iprocsumindx(lproc)+1
415 double precision,
intent(inout) :: pvar(:)
419 character(len=80),
parameter :: name =
'des_exchangenode' 420 integer :: lindx,lcount,lcount2,lneigh,ltag,lerr
421 integer :: lstart,lend,ltotal
425 do lcount = 1,itotalneigh
426 lneigh = itoproc(lcount)
427 lstart = istartsend(lcount);lend=istartsend(lcount+1)-1
428 do lcount2 = lstart,lend
429 dsendnodebuf(lcount2) = pvar(isendnodes(lcount2))
433 lstart = istartrecv(lcount);lend=istartrecv(lcount+1)-1
434 ltotal = lend-lstart+1
436 lneigh,ltag,irecvreqnode(lcount),lerr)
437 call mpi_check( name //
':mpi_irecv ', lerr )
440 lstart = istartsend(lcount);lend=istartsend(lcount+1)-1
441 ltotal = lend-lstart+1
443 lneigh,ltag,isendreqnode(lcount),lerr)
444 call mpi_check( name //
':mpi_irecv ', lerr )
447 do lcount = 1,itotalneigh
448 call des_mpi_wait(isendreqnode(lcount),lerr)
449 call mpi_check( name //
':mpi_wait-send', lerr )
450 call des_mpi_wait(irecvreqnode(lcount),lerr)
451 call mpi_check( name //
':mpi_wait-recv', lerr )
456 do lcount = 1,itotalindx
457 lindx = irecvnodes(lcount)
458 pvar(lindx) = pvar(lindx) + drecvnodebuf(lcount)
467 integer,
intent(in) :: lsource,ldest
480 subroutine des_collect_gdata_db2(pvar)
486 double precision,
intent(inout) :: pvar(:,:)
489 do lc=lbound(pvar,2), ubound(pvar,2)
493 end subroutine des_collect_gdata_db2
511 use discretelement
, only: des_periodic_walls_x, des_periodic_walls_y, des_periodic_walls_z
521 integer :: lijkproc,liproc,ljproc,lkproc
523 integer :: li2,lj2,lk2
524 integer :: liproc_start,liproc_end
525 integer :: ljproc_start,ljproc_end
526 integer :: lkproc_start,lkproc_end
527 integer :: lci,lcj,lck,lproc,lcount
528 integer :: linode_start,linode_end, linode
529 integer :: ljnode_start,ljnode_end, ljnode
530 integer :: lknode_start,lknode_end, lknode
532 integer,
allocatable :: iprocsumindx(:)
536 liproc = iofproc(mype)
537 ljproc = jofproc(mype)
538 lkproc = kofproc(mype)
541 if(des_periodic_walls_x.and.nodesi.gt.1)
then 542 liproc_start=liproc-1
545 liproc_start =max(liproc-1,0)
546 liproc_end=min(liproc+1,nodesi-1)
548 if(des_periodic_walls_y.and.nodesj.gt.1)
then 549 ljproc_start=ljproc-1
552 ljproc_start =max(ljproc-1,0)
553 ljproc_end=min(ljproc+1,nodesj-1)
555 if(des_periodic_walls_z.and.nodesk.gt.1)
then 556 lkproc_start=lkproc-1
559 lkproc_start =max(lkproc-1,0)
560 lkproc_end=min(lkproc+1,nodesk-1)
562 itotalneigh = (liproc_end-liproc_start+1)*&
563 (ljproc_end-ljproc_start+1)*(lkproc_end-lkproc_start+1)-1
566 allocate (itoproc(itotalneigh))
567 allocate (iprocsumindx(itotalneigh))
568 allocate (istartsend(itotalneigh+1))
569 allocate (irecvreqnode(itotalneigh))
570 allocate (isendreqnode(itotalneigh))
577 do lk = lkproc_start,lkproc_end
578 do lj = ljproc_start,ljproc_end
579 do li = liproc_start,liproc_end
580 li2 = mod(li,nodesi);
if(li2.lt.0)li2=nodesi-1
581 lj2 = mod(lj,nodesj);
if(lj2.lt.0)lj2=nodesj-1
582 lk2 = mod(lk,nodesk);
if(lk2.lt.0)lk2=nodesk-1
583 lijkproc =
procijk(li2,lj2,lk2)
584 if (lijkproc.eq.mype) cycle
587 do lproc = 1,itotalneigh
588 if (lijkproc .eq.itoproc(lproc))
then 593 if(.not.lpresent)
then 594 itotalneigh = itotalneigh + 1
597 itoproc(lproc) = lijkproc
598 lci=(liproc-li);lcj=(ljproc-lj);lck=(lkproc-lk)
599 linode_start = istart2; linode_end=iend1
600 ljnode_start = jstart2; ljnode_end=jend1
602 if(lci.eq.1) linode_end = istart2
603 if(lci.eq.-1) linode_start = iend1
604 if(lcj.eq.1) ljnode_end = jstart2
605 if(lcj.eq.-1) ljnode_start = jend1
606 if(lck.eq.1) lknode_end =
kstart2 607 if(lck.eq.-1) lknode_start =
kend1 608 do lknode = lknode_start,lknode_end
609 do linode = linode_start,linode_end
610 do ljnode = ljnode_start,ljnode_end
611 IF(dead_cell_at(linode,ljnode,lknode)) cycle
612 iprocsumindx(lproc) = iprocsumindx(lproc) + 1
620 do lproc =1,itotalneigh+1
621 istartsend(lproc)=sum(iprocsumindx(1:lproc-1))+1
623 itotalindx=istartsend(itotalneigh+1)-1
626 allocate (isendnodes(itotalindx))
627 allocate (dsendnodebuf(itotalindx))
628 allocate (drecvnodebuf(itotalindx))
632 do lk = lkproc_start,lkproc_end
633 do lj = ljproc_start,ljproc_end
634 do li = liproc_start,liproc_end
635 li2 = mod(li,nodesi);
if(li2.lt.0)li2=nodesi-1
636 lj2 = mod(lj,nodesj);
if(lj2.lt.0)lj2=nodesj-1
637 lk2 = mod(lk,nodesk);
if(lk2.lt.0)lk2=nodesk-1
638 lijkproc =
procijk(li2,lj2,lk2)
639 if (lijkproc.eq.mype) cycle
641 do lproc =1,itotalneigh
642 if(lijkproc.eq.itoproc(lproc))
then 646 lci=(liproc-li);lcj=(ljproc-lj);lck=(lkproc-lk)
647 linode_start = istart2; linode_end=iend1
648 ljnode_start = jstart2; ljnode_end=jend1
650 if(lci.eq.1) linode_end = istart2
651 if(lci.eq.-1) linode_start = iend1
652 if(lcj.eq.1) ljnode_end = jstart2
653 if(lcj.eq.-1) ljnode_start = jend1
654 if(lck.eq.1) lknode_end =
kstart2 655 if(lck.eq.-1) lknode_start =
kend1 656 lcount = istartsend(lproc)+iprocsumindx(lproc)
657 do lknode = lknode_start,lknode_end
658 do linode = linode_start,linode_end
659 do ljnode = ljnode_start,ljnode_end
660 IF(dead_cell_at(linode,ljnode,lknode)) cycle
661 isendnodes(lcount)=funijk(linode,ljnode,lknode)
662 iprocsumindx(lproc)=iprocsumindx(lproc)+1
696 double precision,
dimension(:),
intent(inout) ::pvar
701 character(len=80),
parameter :: name =
'des_exchangenode' 702 integer :: lindx,lcount,lcount2,lneigh,ltag,lerr
703 integer :: lstart,lend,ltotal
707 do lcount = 1,itotalneigh
708 lneigh = itoproc(lcount)
709 lstart = istartsend(lcount);lend=istartsend(lcount+1)-1
710 do lcount2 = lstart,lend
711 dsendnodebuf(lcount2) = pvar(isendnodes(lcount2))
714 ltotal = lend-lstart+1
716 lneigh,ltag,irecvreqnode(lcount),lerr)
717 call mpi_check( name //
':mpi_irecv ', lerr )
720 lneigh,ltag,isendreqnode(lcount),lerr)
721 call mpi_check( name //
':mpi_irecv ', lerr )
724 do lcount = 1,itotalneigh
725 call des_mpi_wait(isendreqnode(lcount),lerr)
726 call mpi_check( name //
':mpi_wait-send', lerr )
727 call des_mpi_wait(irecvreqnode(lcount),lerr)
728 call mpi_check( name //
':mpi_wait-recv', lerr )
733 do lcount = 1,itotalindx
734 lindx = isendnodes(lcount)
735 pvar(lindx) = pvar(lindx) + drecvnodebuf(lcount)
738 do lcount = 1,itotalindx
739 lindx = isendnodes(lcount)
740 pvar(lindx) = drecvnodebuf(lcount)
749 integer,
intent(in) :: lsource,ldest
759 subroutine des_dbgnodesr()
769 character (255) filename
771 integer lcount,lcount2,lstart,lend
775 write(filename,
'("dbg_nodesr",I4.4,".dat")')
mype 776 open(44,file=filename,convert=
'big_endian')
777 do lcount = 1,itotalneigh
778 lstart = istartsend(lcount);lend=istartsend(lcount+1)-1
779 write(44,
"(2/,72('*'))")
780 write(44,1100)
mype, itoproc(lcount)
781 write(44,
"(/2x,'Start:',I6)") lstart
782 write(44,
"( 2x,'End: ',I6)") lend
783 write(44,
"(72('-'))")
784 do lcount2 = lstart,lend
785 ijk = isendnodes(lcount2)
788 write(44,
"(72('-'))")
791 if(
allocated(irecvnodes))
then 792 do lcount = 1,itotalneigh
793 lstart = istartrecv(lcount);lend=istartrecv(lcount+1)-1
794 write(44,
"(2/,72('*'))")
795 write(44,1100) itoproc(lcount),
mype 796 write(44,
"(/2x,'Start:',I6)") lstart
797 write(44,
"( 2x,'End: ',I6)") lend
798 write(44,
"(72('-'))")
799 do lcount2 = lstart,lend
800 ijk = irecvnodes(lcount2)
801 write(44,1000)
'RECV',
i_of(ijk),
j_of(ijk),
k_of(ijk),ijk
803 write(44,
"(72('-'))")
809 1100
FORMAT(2x,
'Send Proc ',i2,
' --> Recv Proc' i2)
810 1000
FORMAT(3x,a,
': (',i3,
',',i3,
',',i3,
') :: ',i7)
812 end subroutine des_dbgnodesr
integer function procijk(fi, fj, fk)
integer, dimension(:), allocatable i_of
subroutine des_mpi_wait(preq, perr)
integer function iofproc(fijk)
subroutine, public des_exchangenode(pvar, padd)
subroutine des_collect_gdata_db1(pvar)
subroutine, public des_setnodeindices
integer, dimension(:), allocatable k_of
logical, dimension(:,:,:), allocatable dead_cell_at
integer function kofproc(fijk)
integer, dimension(:), allocatable j_of
integer function message_tag(lsource, ldest, lrecvface)
integer function jofproc(fijk)
subroutine, public init_des_collect_gdata
subroutine mpi_check(msg, ierr)