44 integer,
intent(in) :: idim^lim,nwfluxin
46 integer :: iigrid, igrid, idims, iside, i^
d, nxco^
d
47 integer :: ic^
d, inc^
d, ipe_neighbor
48 integer :: recvsize, sendsize
49 integer :: recvsize_cc, sendsize_cc
71 nrecv=nrecv+nrecv_fc(^
d)
72 nsend=nsend+nsend_fc(^
d)
74 isize(^
d)={nxco^dd*}*(nwfluxin)
75 recvsize=recvsize+nrecv_fc(^
d)*isize(^
d)
76 sendsize=sendsize+nsend_fc(^
d)*isize(^
d)
80 isize_stg(^
d)={nxco^dd*}*(^nd-1)
82 isize(^
d)=isize(^
d)+isize_stg(^
d)
83 recvsize=recvsize+nrecv_fc(^
d)*isize_stg(^
d)
84 sendsize=sendsize+nsend_fc(^
d)*isize_stg(^
d)
86 nrecv_ct=nrecv_ct+nrecv_cc(^
d)
87 nsend_ct=nsend_ct+nsend_cc(^
d)
88 recvsize_cc=recvsize_cc+nrecv_cc(^
d)*isize_stg(^
d)
89 sendsize_cc=sendsize_cc+nsend_cc(^
d)*isize_stg(^
d)
96 if (
allocated(recvbuffer))
then
97 if (recvsize /=
size(recvbuffer))
then
98 deallocate(recvbuffer)
99 allocate(recvbuffer(recvsize))
102 allocate(recvbuffer(recvsize))
105 if (
allocated(fc_recvreq))
then
106 if (nrecv /=
size(fc_recvreq))
then
107 deallocate(fc_recvreq, fc_recvstat)
108 allocate(fc_recvstat(mpi_status_size,nrecv), fc_recvreq(nrecv))
111 allocate(fc_recvstat(mpi_status_size,nrecv), fc_recvreq(nrecv))
114 if (
allocated(fc_sendreq))
then
115 if (nsend /=
size(fc_sendreq))
then
116 deallocate(fc_sendreq, fc_sendstat)
117 allocate(fc_sendstat(mpi_status_size,nsend), fc_sendreq(nsend))
120 allocate(fc_sendstat(mpi_status_size,nsend), fc_sendreq(nsend))
125 if (
allocated(sendbuffer))
then
126 if (sendsize /=
size(sendbuffer))
then
127 deallocate(sendbuffer)
128 allocate(sendbuffer(sendsize))
131 allocate(sendbuffer(sendsize))
134 if (
allocated(recvbuffer_cc))
then
135 if (recvsize_cc /=
size(recvbuffer_cc))
then
136 deallocate(recvbuffer_cc)
137 allocate(recvbuffer_cc(recvsize_cc))
140 allocate(recvbuffer_cc(recvsize_cc))
143 if (
allocated(cc_recvreq))
then
144 if (nrecv_ct /=
size(cc_recvreq))
then
145 deallocate(cc_recvreq, cc_recvstat)
146 allocate(cc_recvstat(mpi_status_size,nrecv_ct), cc_recvreq(nrecv_ct))
149 allocate(cc_recvstat(mpi_status_size,nrecv_ct), cc_recvreq(nrecv_ct))
152 if (
allocated(sendbuffer_cc))
then
153 if (sendsize_cc /=
size(sendbuffer_cc))
then
154 deallocate(sendbuffer_cc)
155 allocate(sendbuffer_cc(sendsize_cc))
158 allocate(sendbuffer_cc(sendsize_cc))
161 if (
allocated(cc_sendreq))
then
162 if (nsend_ct /=
size(cc_sendreq))
then
163 deallocate(cc_sendreq, cc_sendstat)
164 allocate(cc_sendstat(mpi_status_size,nsend_ct), cc_sendreq(nsend_ct))
167 allocate(cc_sendstat(mpi_status_size,nsend_ct), cc_sendreq(nsend_ct))
176 integer,
intent(in) :: idim^lim
178 integer :: iigrid, igrid, idims, iside, i^
d, nxco^
d
179 integer :: ic^
d, inc^
d, ipe_neighbor
180 integer :: pi^
d,mi^
d,ph^
d,mh^
d,idir
183 fc_recvreq=mpi_request_null
187 do iigrid=1,igridstail; igrid=igrids(iigrid);
190 i^
d=
kr(^
d,idims)*(2*iside-3);
192 if (neighbor_pole(i^
d,igrid)/=0) cycle
194 if (neighbor_type(i^
d,igrid)/=4) cycle
195 {
do ic^db=1+int((1-i^db)/2),2-int((1+i^db)/2)
196 inc^db=2*i^db+ic^db\}
197 ipe_neighbor=neighbor_child(2,inc^
d,igrid)
198 if (ipe_neighbor/=
mype)
then
200 itag=4**^nd*(igrid-1)+{inc^
d*4**(^
d-1)+}
201 call mpi_irecv(recvbuffer(ibuf),isize(idims), &
202 mpi_double_precision,ipe_neighbor,itag, &
204 ibuf=ibuf+isize(idims)
212 if(stagger_grid)
then
215 cc_recvreq=mpi_request_null
219 do iigrid=1,igridstail; igrid=igrids(iigrid);
222 i^d=kr(^d,idims)*(2*iside-3);
229 if (neighbor_type(i^d,igrid)==3)
then
231 pi^d=i^d+kr(idir,^d);
232 mi^d=i^d-kr(idir,^d);
233 ph^d=pi^d-kr(idims,^d)*(2*iside-3);
234 mh^d=mi^d-kr(idims,^d)*(2*iside-3);
236 if (neighbor_type(pi^d,igrid)==4.and.&
237 neighbor_type(ph^d,igrid)==3.and.&
238 neighbor_pole(pi^d,igrid)==0)
then
240 {
do ic^db=1+int((1-pi^db)/2),2-int((1+pi^db)/2)
241 inc^db=2*pi^db+ic^db\}
242 ipe_neighbor=neighbor_child(2,inc^d,igrid)
243 if (mype/=ipe_neighbor)
then
245 itag_cc=4**^nd*(igrid-1)+{inc^d*4**(^d-1)+}
246 call mpi_irecv(recvbuffer_cc(ibuf_cc),isize_stg(idims),&
247 mpi_double_precision,ipe_neighbor,itag_cc,&
248 icomm,cc_recvreq(irecv_cc),ierrmpi)
249 ibuf_cc=ibuf_cc+isize_stg(idims)
254 if (neighbor_type(mi^d,igrid)==4.and.&
255 neighbor_type(mh^d,igrid)==3.and.&
256 neighbor_pole(mi^d,igrid)==0)
then
258 {
do ic^db=1+int((1-mi^db)/2),2-int((1+mi^db)/2)
259 inc^db=2*mi^db+ic^db\}
260 ipe_neighbor=neighbor_child(2,inc^d,igrid)
261 if (mype/=ipe_neighbor)
then
263 itag_cc=4**^nd*(igrid-1)+{inc^d*4**(^d-1)+}
264 call mpi_irecv(recvbuffer_cc(ibuf_cc),isize_stg(idims),&
265 mpi_double_precision,ipe_neighbor,itag_cc,&
266 icomm,cc_recvreq(irecv_cc),ierrmpi)
267 ibuf_cc=ibuf_cc+isize_stg(idims)
284 integer,
intent(in) :: idim^lim
286 integer :: idims, iside, i^
d, ic^
d, inc^
d, ix^
d, ixco^
d, nxco^
d, iw
287 integer :: ineighbor, ipe_neighbor, igrid, iigrid, ibuf_send_next
288 integer :: idir, ibuf_cc_send_next, pi^
d, ph^
d, mi^
d, mh^
d
290 fc_sendreq = mpi_request_null
294 cc_sendreq=mpi_request_null
299 do iigrid=1,igridstail; igrid=igrids(iigrid);
304 i^dd=
kr(^dd,^
d)*(2*iside-3);
306 if (neighbor_pole(i^dd,igrid)/=0) cycle
308 if (neighbor_type(i^dd,igrid)==neighbor_coarse)
then
310 ineighbor=neighbor(1,i^dd,igrid)
311 ipe_neighbor=neighbor(2,i^dd,igrid)
312 if (ipe_neighbor/=
mype)
then
313 ic^dd=1+modulo(
node(
pig^dd_,igrid)-1,2);
314 inc^
d=-2*i^
d+ic^
d^
d%inc^dd=ic^dd;
315 itag=4**^nd*(ineighbor-1)+{inc^dd*4**(^dd-1)+}
319 ibuf_send_next=ibuf_send+isize(^
d)
320 sendbuffer(ibuf_send:ibuf_send_next-isize_stg(^
d)-1)=&
321 reshape(
pflux(iside,^
d,igrid)%flux,(/isize(^
d)-isize_stg(^
d)/))
323 sendbuffer(ibuf_send_next-isize_stg(^
d):ibuf_send_next-1)=&
324 reshape(
pflux(iside,^
d,igrid)%edge,(/isize_stg(^
d)/))
325 call mpi_isend(sendbuffer(ibuf_send),isize(^
d), &
326 mpi_double_precision,ipe_neighbor,itag, &
328 ibuf_send=ibuf_send_next
330 call mpi_isend(
pflux(iside,^
d,igrid)%flux,isize(^
d), &
331 mpi_double_precision,ipe_neighbor,itag, &
339 pi^dd=i^dd+
kr(idir,^dd);
340 mi^dd=i^dd-
kr(idir,^dd);
341 ph^dd=pi^dd-
kr(idims,^dd)*(2*iside-3);
342 mh^dd=mi^dd-
kr(idims,^dd)*(2*iside-3);
344 if (neighbor_type(pi^dd,igrid)==2.and.&
345 neighbor_type(ph^dd,igrid)==2.and.&
346 mype/=neighbor(2,pi^dd,igrid).and.&
347 neighbor_pole(pi^dd,igrid)==0)
then
349 ineighbor=neighbor(1,pi^dd,igrid)
350 ipe_neighbor=neighbor(2,pi^dd,igrid)
351 ic^dd=1+modulo(
node(
pig^dd_,igrid)-1,2);
352 inc^dd=-2*pi^dd+ic^dd;
353 itag_cc=4**^nd*(ineighbor-1)+{inc^dd*4**(^dd-1)+}
356 ibuf_cc_send_next=ibuf_cc_send+isize_stg(^
d)
357 sendbuffer_cc(ibuf_cc_send:ibuf_cc_send_next-1)=&
358 reshape(
pflux(iside,^
d,igrid)%edge,shape=(/isize_stg(^
d)/))
359 call mpi_isend(sendbuffer_cc(ibuf_cc_send),isize_stg(^
d),&
360 mpi_double_precision,ipe_neighbor,itag_cc,&
362 ibuf_cc_send=ibuf_cc_send_next
365 if (neighbor_type(mi^dd,igrid)==2.and.&
366 neighbor_type(mh^dd,igrid)==2.and.&
367 mype/=neighbor(2,mi^dd,igrid).and.&
368 neighbor_pole(mi^dd,igrid)==0)
then
370 ineighbor=neighbor(1,mi^dd,igrid)
371 ipe_neighbor=neighbor(2,mi^dd,igrid)
372 ic^dd=1+modulo(
node(
pig^dd_,igrid)-1,2);
373 inc^dd=-2*pi^dd+ic^dd;
374 inc^dd=-2*mi^dd+ic^dd;
375 itag_cc=4**^nd*(ineighbor-1)+{inc^dd*4**(^dd-1)+}
378 ibuf_cc_send_next=ibuf_cc_send+isize_stg(^
d)
379 sendbuffer_cc(ibuf_cc_send:ibuf_cc_send_next-1)=&
380 reshape(
pflux(iside,^
d,igrid)%edge,shape=(/isize_stg(^
d)/))
381 call mpi_isend(sendbuffer_cc(ibuf_cc_send),isize_stg(^
d),&
382 mpi_double_precision,ipe_neighbor,itag_cc,&
384 ibuf_cc_send=ibuf_cc_send_next
468 integer,
intent(in) :: idim^lim, nw0, nwfluxin
471 integer :: iigrid, igrid, idims, iside, iotherside, i^
d, ic^
d, inc^
d, ix^
l
472 integer :: nxco^
d, iw, ix, ipe_neighbor, ineighbor, nbuf, ibufnext, nw1
473 double precision :: cofiratio
479 cofiratio=one/dble(2**
ndim)
483 call mpi_waitall(nrecv,fc_recvreq,fc_recvstat,
ierrmpi)
487 nxco^
d=(ixmhi^
d-ixmlo^
d+1)/2;
490 do iigrid=1,igridstail; igrid=igrids(iigrid);
495 i^dd=
kr(^dd,^
d)*(2*iside-3);
497 if (neighbor_pole(i^dd,igrid)/=0) cycle
499 if (neighbor_type(i^dd,igrid)/=4) cycle
503 if (.not.neighbor_active(i^dd,igrid).or.&
504 .not.neighbor_active(0^dd&,igrid) )
then
505 {
do ic^ddb=1+int((1-i^ddb)/2),2-int((1+i^ddb)/2)
506 inc^ddb=2*i^ddb+ic^ddb\}
507 ipe_neighbor=neighbor_child(2,inc^dd,igrid)
508 if (ipe_neighbor/=
mype)
then
509 ibufnext=ibuf+isize(^
d)
525 if (slab_uniform)
then
526 psb(igrid)%w(ix^d%ixM^t,nw0:nw1) &
527 = psb(igrid)%w(ix^d%ixM^t,nw0:nw1) &
528 -
pflux(iside,^d,igrid)%flux(1^d%:^dd&,1:nwfluxin)
531 psb(igrid)%w(ix^d%ixM^t,iw)=psb(igrid)%w(ix^d%ixM^t,iw)&
532 -
pflux(iside,^d,igrid)%flux(1^d%:^dd&,iw-nw0+1) &
533 /ps(igrid)%dvolume(ix^d%ixM^t)
539 {
do ic^ddb=1+int((1-i^ddb)/2),2-int((1+i^ddb)/2)
540 inc^ddb=2*i^ddb+ic^ddb\}
541 ineighbor=neighbor_child(1,inc^dd,igrid)
542 ipe_neighbor=neighbor_child(2,inc^dd,igrid)
543 ixmin^d=ix^d%ixmin^dd=ixmlo^dd+(ic^dd-1)*nxco^dd;
544 ixmax^d=ix^d%ixmax^dd=ixmin^dd-1+nxco^dd;
545 if (ipe_neighbor==mype)
then
547 if (slab_uniform)
then
548 psb(igrid)%w(ix^s,nw0:nw1) &
549 = psb(igrid)%w(ix^s,nw0:nw1) &
550 +
pflux(iotherside,^d,ineighbor)%flux(:^dd&,1:nwfluxin)&
554 psb(igrid)%w(ix^s,iw)=psb(igrid)%w(ix^s,iw) &
555 +
pflux(iotherside,^d,ineighbor)%flux(:^dd&,iw-nw0+1) &
556 /ps(igrid)%dvolume(ix^s)
560 if (slab_uniform)
then
561 ibufnext=ibuf+isize(^d)
562 if(stagger_grid) ibufnext=ibufnext-isize_stg(^d)
563 psb(igrid)%w(ix^s,nw0:nw1) &
564 = psb(igrid)%w(ix^s,nw0:nw1)+cofiratio &
565 *reshape(source=recvbuffer(ibuf:ibufnext-1), &
566 shape=shape(psb(igrid)%w(ix^s,nw0:nw1)))
569 ibufnext=ibuf+isize(^d)
570 if(stagger_grid)
then
571 nbuf=(isize(^d)-isize_stg(^d))/nwfluxin
573 nbuf=isize(^d)/nwfluxin
576 psb(igrid)%w(ix^s,iw)=psb(igrid)%w(ix^s,iw) &
577 +reshape(source=recvbuffer(ibuf:ibufnext-1), &
578 shape=shape(psb(igrid)%w(ix^s,iw))) &
579 /ps(igrid)%dvolume(ix^s)
592 call mpi_waitall(nsend,fc_sendreq,fc_sendstat,ierrmpi)
780 integer,
intent(in) :: idim^lim
782 integer :: iigrid, igrid, idims, iside, iotherside, i^
d, ic^
d, inc^
d, ixmc^
l
783 integer :: nbuf, ibufnext
784 integer :: ibufnext_cc
785 integer :: pi^
d, mi^
d, ph^
d, mh^
d
786 integer :: ixe^
l(1:3), ixte^
l, ixf^
l(1:
ndim), ixfe^
l(1:3)
787 integer :: nx^
d, idir, ix, ipe_neighbor, ineighbor
788 logical :: pcorner(1:
ndim),mcorner(1:
ndim)
791 call mpi_waitall(nrecv_ct,cc_recvreq,cc_recvstat,
ierrmpi)
797 do iigrid=1,igridstail; igrid=igrids(iigrid);
800 i^
d=
kr(^
d,idims)*(2*iside-3);
801 if (neighbor_pole(i^
d,igrid)/=0) cycle
802 select case(neighbor_type(i^
d,igrid))
805 if (.not.neighbor_active(i^
d,igrid).or.&
806 .not.neighbor_active(0^
d&,igrid) )
then
807 {
do ic^db=1+int((1-i^db)/2),2-int((1+i^db)/2)
808 inc^db=2*i^db+ic^db\}
809 ipe_neighbor=neighbor_child(2,inc^
d,igrid)
811 if (ipe_neighbor/=
mype)
then
812 ibufnext=ibuf+isize(idims)
823 pi^d=i^d+kr(idir,^d);
824 mi^d=i^d-kr(idir,^d);
825 ph^d=pi^d-kr(idims,^d)*(2*iside-3);
826 mh^d=mi^d-kr(idims,^d)*(2*iside-3);
827 if (neighbor_type(ph^d,igrid)==neighbor_fine) pcorner(idir)=.true.
828 if (neighbor_type(mh^d,igrid)==neighbor_fine) mcorner(idir)=.true.
831 call set_ix_circ(ixf^l,ixte^l,ixe^l,ixfe^l,igrid,idims,iside,.false.,.false.,0^d&,pcorner,mcorner)
833 call add_sub_circ(ixf^l,ixte^l,ixe^l,ixfe^l,
pflux(iside,idims,igrid)%edge,idims,iside,.false.,psuse(igrid))
835 {
do ic^db=1+int((1-i^db)/2),2-int((1+i^db)/2)
836 inc^db=2*i^db+ic^db\}
837 ineighbor=neighbor_child(1,inc^d,igrid)
838 ipe_neighbor=neighbor_child(2,inc^d,igrid)
840 nx^d=(ixmhi^d-ixmlo^d+1)/2;
841 call set_ix_circ(ixf^l,ixte^l,ixe^l,ixfe^l,igrid,idims,iside,.true.,.false.,inc^d,pcorner,mcorner)
842 if (ipe_neighbor==mype)
then
843 call add_sub_circ(ixf^l,ixte^l,ixe^l,ixfe^l,
pflux(iotherside,idims,ineighbor)%edge,idims,iside,.true.,psuse(igrid))
845 ibufnext=ibuf+isize(idims)
846 call add_sub_circ(ixf^l,ixte^l,ixe^l,ixfe^l,&
847 reshape(source=recvbuffer(ibufnext-isize_stg(idims):ibufnext-1),&
848 shape=(/ ixtemax^d-ixtemin^d+1 ,^nd-1 /)),&
849 idims,iside,.true.,psuse(igrid))
854 case(neighbor_sibling)
860 pi^d=i^d+kr(idir,^d);
861 mi^d=i^d-kr(idir,^d);
862 ph^d=pi^d-kr(idims,^d)*(2*iside-3);
863 mh^d=mi^d-kr(idims,^d)*(2*iside-3);
864 if (neighbor_type(pi^d,igrid)==neighbor_fine&
865 .and.neighbor_type(ph^d,igrid)==neighbor_sibling&
866 .and.neighbor_pole(pi^d,igrid)==0)
then
870 call set_ix_circ(ixf^l,ixte^l,ixe^l,ixfe^l,igrid,idims,iside,.false.,.true.,0^d&,pcorner,mcorner)
872 call add_sub_circ(ixf^l,ixte^l,ixe^l,ixfe^l,
pflux(iside,idims,igrid)%edge,idims,iside,.false.,psuse(igrid))
875 {^ifthreed
do ix=1,2}
876 inc^d=kr(idims,^d)*3*(iside-1)+3*kr(idir,^d){^ifthreed+kr(6-idir-idims,^d)*ix};
877 ineighbor=neighbor_child(1,inc^d,igrid)
878 ipe_neighbor=neighbor_child(2,inc^d,igrid)
881 call set_ix_circ(ixf^l,ixte^l,ixe^l,ixfe^l,igrid,idims,iside,.true.,.true.,inc^d,pcorner,mcorner)
883 if (ipe_neighbor==mype)
then
884 call add_sub_circ(ixf^l,ixte^l,ixe^l,ixfe^l,
pflux(iotherside,idims,ineighbor)%edge,idims,iside,.true.,psuse(igrid))
886 ibufnext_cc=ibuf_cc+isize_stg(idims)
887 call add_sub_circ(ixf^l,ixte^l,ixe^l,ixfe^l,&
888 reshape(source=recvbuffer_cc(ibuf_cc:ibufnext_cc-1),&
889 shape=(/ ixtemax^d-ixtemin^d+1 ,^nd-1 /)),&
890 idims,iside,.true.,psuse(igrid))
895 pcorner(idir)=.false.
898 if (neighbor_type(mi^d,igrid)==neighbor_fine&
899 .and.neighbor_type(mh^d,igrid)==neighbor_sibling&
900 .and.neighbor_pole(mi^d,igrid)==0)
then
904 call set_ix_circ(ixf^l,ixte^l,ixe^l,ixfe^l,igrid,idims,iside,.false.,.true.,0^d&,pcorner,mcorner)
906 call add_sub_circ(ixf^l,ixte^l,ixe^l,ixfe^l,
pflux(iside,idims,igrid)%edge,idims,iside,.false.,psuse(igrid))
909 {^ifthreed
do ix=1,2}
910 inc^d=kr(idims,^d)*3*(iside-1){^ifthreed+kr(6-idir-idims,^d)*ix};
911 ineighbor=neighbor_child(1,inc^d,igrid)
912 ipe_neighbor=neighbor_child(2,inc^d,igrid)
915 call set_ix_circ(ixf^l,ixte^l,ixe^l,ixfe^l,igrid,idims,iside,.true.,.true.,inc^d,pcorner,mcorner)
917 if (ipe_neighbor==mype)
then
918 call add_sub_circ(ixf^l,ixte^l,ixe^l,ixfe^l,
pflux(iotherside,idims,ineighbor)%edge,idims,iside,.true.,psuse(igrid))
920 ibufnext_cc=ibuf_cc+isize_stg(idims)
921 call add_sub_circ(ixf^l,ixte^l,ixe^l,ixfe^l,&
922 reshape(source=recvbuffer_cc(ibuf_cc:ibufnext_cc-1),&
923 shape=(/ ixtemax^d-ixtemin^d+1 ,^nd-1 /)),&
924 idims,iside,.true.,psuse(igrid))
929 mcorner(idir)=.false.
937 if (nsend_ct>0)
call mpi_waitall(nsend_ct,cc_sendreq,cc_sendstat,ierrmpi)