7 double precision,
dimension(:^D&,:),
allocatable :: w
61 integer,
private :: itag
126 integer :: nghostcellsCo, interpolation_order
127 integer :: nx^D, nxCo^D, ixG^L, i^D, ic^D, inc^D, idir
130 ixm^l=ixg^l^lsubnghostcells;
137 nx^d=ixmmax^d-ixmmin^d+1;
141 interpolation_order=1
143 interpolation_order=2
147 if (nghostcellsco+interpolation_order-1>
nghostcells)
then
148 call mpistop(
"interpolation order for prolongation in getbc too high")
157 ixs_srl_min^d(:,-1)=ixmmin^d
158 ixs_srl_min^d(:, 0)=ixmmin^d
161 ixs_srl_max^d(:, 0)=ixmmax^d
162 ixs_srl_max^d(:, 1)=ixmmax^d
164 ixr_srl_min^d(:,-1)=1
165 ixr_srl_min^d(:, 0)=ixmmin^d
166 ixr_srl_min^d(:, 1)=ixmmax^d+1
168 ixr_srl_max^d(:, 0)=ixmmax^d
169 ixr_srl_max^d(:, 1)=ixgmax^d
171 ixs_r_min^d(:,-1)=ixcommin^d
172 ixs_r_min^d(:, 0)=ixcommin^d
175 ixs_r_max^d(:, 0)=ixcommax^d
176 ixs_r_max^d(:, 1)=ixcommax^d
179 ixr_r_min^d(:, 1)=ixmmin^d
180 ixr_r_min^d(:, 2)=ixmmin^d+nxco^d
181 ixr_r_min^d(:, 3)=ixmmax^d+1
183 ixr_r_max^d(:, 1)=ixmmin^d-1+nxco^d
184 ixr_r_max^d(:, 2)=ixmmax^d
185 ixr_r_max^d(:, 3)=ixgmax^d
187 ixs_p_min^d(:, 0)=ixmmin^d-(interpolation_order-1)
188 ixs_p_min^d(:, 1)=ixmmin^d-(interpolation_order-1)
189 ixs_p_min^d(:, 2)=ixmmin^d+nxco^d-nghostcellsco-(interpolation_order-1)
190 ixs_p_min^d(:, 3)=ixmmax^d+1-nghostcellsco-(interpolation_order-1)
191 ixs_p_max^d(:, 0)=ixmmin^d-1+nghostcellsco+(interpolation_order-1)
192 ixs_p_max^d(:, 1)=ixmmin^d-1+nxco^d+nghostcellsco+(interpolation_order-1)
193 ixs_p_max^d(:, 2)=ixmmax^d+(interpolation_order-1)
194 ixs_p_max^d(:, 3)=ixmmax^d+(interpolation_order-1)
198 ixs_p_min^d(:, 0)=ixmmin^d
199 ixs_p_max^d(:, 3)=ixmmax^d
200 ixs_p_max^d(:, 1)=ixmmin^d-1+nxco^d+(interpolation_order-1)
201 ixs_p_min^d(:, 2)=ixmmin^d+nxco^d-(interpolation_order-1)
204 ixr_p_min^d(:, 0)=ixcommin^d-nghostcellsco-(interpolation_order-1)
205 ixr_p_min^d(:, 1)=ixcommin^d-(interpolation_order-1)
206 ixr_p_min^d(:, 2)=ixcommin^d-nghostcellsco-(interpolation_order-1)
207 ixr_p_min^d(:, 3)=ixcommax^d+1-(interpolation_order-1)
208 ixr_p_max^d(:, 0)=
nghostcells+(interpolation_order-1)
209 ixr_p_max^d(:, 1)=ixcommax^d+nghostcellsco+(interpolation_order-1)
210 ixr_p_max^d(:, 2)=ixcommax^d+(interpolation_order-1)
211 ixr_p_max^d(:, 3)=ixcommax^d+nghostcellsco+(interpolation_order-1)
215 ixr_p_min^d(:, 3)=ixcommax^d+1
216 ixr_p_max^d(:, 1)=ixcommax^d+(interpolation_order-1)
217 ixr_p_min^d(:, 2)=ixcommin^d-(interpolation_order-1)
223 allocate(pole_buf%ws(ixgs^t,nws))
226 { ixs_srl_stg_min^d(idir,-1)=ixmmin^d-
kr(idir,^d)
228 ixs_srl_stg_min^d(idir,0) =ixmmin^d-
kr(idir,^d)
229 ixs_srl_stg_max^d(idir,0) =ixmmax^d
230 ixs_srl_stg_min^d(idir,1) =ixmmax^d-
nghostcells+1-
kr(idir,^d)
231 ixs_srl_stg_max^d(idir,1) =ixmmax^d
233 ixr_srl_stg_min^d(idir,-1)=1-
kr(idir,^d)
235 ixr_srl_stg_min^d(idir,0) =ixmmin^d-
kr(idir,^d)
236 ixr_srl_stg_max^d(idir,0) =ixmmax^d
237 ixr_srl_stg_min^d(idir,1) =ixmmax^d+1-
kr(idir,^d)
238 ixr_srl_stg_max^d(idir,1) =ixgmax^d
240 ixs_r_stg_min^d(idir,-1)=ixcommin^d-
kr(idir,^d)
242 ixs_r_stg_min^d(idir,0) =ixcommin^d-
kr(idir,^d)
243 ixs_r_stg_max^d(idir,0) =ixcommax^d
244 ixs_r_stg_min^d(idir,1) =ixcommax^d+1-
nghostcells-
kr(idir,^d)
245 ixs_r_stg_max^d(idir,1) =ixcommax^d
247 ixr_r_stg_min^d(idir,0)=1-
kr(idir,^d)
249 ixr_r_stg_min^d(idir,1)=ixmmin^d-
kr(idir,^d)
250 ixr_r_stg_max^d(idir,1)=ixmmin^d-1+nxco^d
251 ixr_r_stg_min^d(idir,2)=ixmmin^d+nxco^d-
kr(idir,^d)
252 ixr_r_stg_max^d(idir,2)=ixmmax^d
253 ixr_r_stg_min^d(idir,3)=ixmmax^d+1-
kr(idir,^d)
254 ixr_r_stg_max^d(idir,3)=ixgmax^d
259 ixs_p_stg_min^d(idir,0)=ixmmin^d-1
260 ixs_p_stg_max^d(idir,0)=ixmmin^d-1+nghostcellsco
261 ixs_p_stg_min^d(idir,1)=ixmmin^d-1
262 ixs_p_stg_max^d(idir,1)=ixmmin^d-1+nxco^d+nghostcellsco
263 ixs_p_stg_min^d(idir,2)=ixmmax^d-nxco^d-nghostcellsco
264 ixs_p_stg_max^d(idir,2)=ixmmax^d
265 ixs_p_stg_min^d(idir,3)=ixmmax^d-nghostcellsco
266 ixs_p_stg_max^d(idir,3)=ixmmax^d
268 ixr_p_stg_min^d(idir,0)=ixcommin^d-1-nghostcellsco
269 ixr_p_stg_max^d(idir,0)=ixcommin^d-1
270 ixr_p_stg_min^d(idir,1)=ixcommin^d-1
271 ixr_p_stg_max^d(idir,1)=ixcommax^d+nghostcellsco
272 ixr_p_stg_min^d(idir,2)=ixcommin^d-1-nghostcellsco
273 ixr_p_stg_max^d(idir,2)=ixcommax^d
274 ixr_p_stg_min^d(idir,3)=ixcommax^d+1-1
275 ixr_p_stg_max^d(idir,3)=ixcommax^d+nghostcellsco
280 ixs_p_stg_min^d(idir,0)=ixmmin^d
281 ixs_p_stg_max^d(idir,0)=ixmmin^d-1+nghostcellsco+(interpolation_order-1)
282 ixs_p_stg_min^d(idir,1)=ixmmin^d
283 ixs_p_stg_max^d(idir,1)=ixmmin^d-1+nxco^d+nghostcellsco+(interpolation_order-1)
284 ixs_p_stg_min^d(idir,2)=ixmmax^d+1-nxco^d-nghostcellsco-(interpolation_order-1)
285 ixs_p_stg_max^d(idir,2)=ixmmax^d
286 ixs_p_stg_min^d(idir,3)=ixmmax^d+1-nghostcellsco-(interpolation_order-1)
287 ixs_p_stg_max^d(idir,3)=ixmmax^d
289 ixr_p_stg_min^d(idir,0)=ixcommin^d-nghostcellsco-(interpolation_order-1)
290 ixr_p_stg_max^d(idir,0)=ixcommin^d-1
291 ixr_p_stg_min^d(idir,1)=ixcommin^d
292 ixr_p_stg_max^d(idir,1)=ixcommax^d+nghostcellsco+(interpolation_order-1)
293 ixr_p_stg_min^d(idir,2)=ixcommin^d-nghostcellsco-(interpolation_order-1)
294 ixr_p_stg_max^d(idir,2)=ixcommax^d
295 ixr_p_stg_min^d(idir,3)=ixcommax^d+1
296 ixr_p_stg_max^d(idir,3)=ixcommax^d+nghostcellsco+(interpolation_order-1)
305 sizes_srl_send_stg(idir,i^d)={(ixs_srl_stg_max^d(idir,i^d)-ixs_srl_stg_min^d(idir,i^d)+1)|*}
306 sizes_srl_recv_stg(idir,i^d)={(ixr_srl_stg_max^d(idir,i^d)-ixr_srl_stg_min^d(idir,i^d)+1)|*}
307 sizes_r_send_stg(idir,i^d)={(ixs_r_stg_max^d(idir,i^d)-ixs_r_stg_min^d(idir,i^d)+1)|*}
317 sizes_r_recv_stg(idir,i^d)={(ixr_r_stg_max^d(idir,i^d)-ixr_r_stg_min^d(idir,i^d)+1)|*}
318 sizes_p_send_stg(idir,i^d)={(ixs_p_stg_max^d(idir,i^d)-ixs_p_stg_min^d(idir,i^d)+1)|*}
319 sizes_p_recv_stg(idir,i^d)={(ixr_p_stg_max^d(idir,i^d)-ixr_p_stg_min^d(idir,i^d)+1)|*}
326 if(.not.stagger_grid .or. physics_type==
'mf')
then
329 ixs_srl_min^d(-1,0)=1
330 ixs_srl_min^d( 1,0)=ixmmin^d
331 ixs_srl_min^d( 2,0)=1
332 ixs_srl_max^d(-1,0)=ixmmax^d
333 ixs_srl_max^d( 1,0)=ixgmax^d
334 ixs_srl_max^d( 2,0)=ixgmax^d
336 ixr_srl_min^d(-1,0)=1
337 ixr_srl_min^d( 1,0)=ixmmin^d
338 ixr_srl_min^d( 2,0)=1
339 ixr_srl_max^d(-1,0)=ixmmax^d
340 ixr_srl_max^d( 1,0)=ixgmax^d
341 ixr_srl_max^d( 2,0)=ixgmax^d
344 ixs_r_min^d( 1,0)=ixcommin^d
345 ixs_r_max^d(-1,0)=ixcommax^d
346 ixs_r_max^d( 1,0)=ixcogmax^d
349 ixr_r_max^d(-1,1)=ixmmin^d-1+nxco^d
350 ixr_r_min^d( 1,2)=ixmmin^d+nxco^d
351 ixr_r_max^d( 1,2)=ixgmax^d
354 ixs_p_max^d( 1,2)=ixgmax^d
357 ixr_p_max^d( 1,2)=ixcogmax^d
366 integer,
intent(in) :: nwstart, nwbc
367 integer :: i^D, ic^D, inc^D, iib^D
370 if (i^d==0|.and.) cycle
374 if (iib^d==2|.or.) cycle
376 {
do ic^db=1+int((1-i^db)/2),2-int((1+i^db)/2)
377 inc^db=2*i^db+ic^db\}
390 integer,
intent(inout) :: comm_type
391 integer,
intent(in) :: ix^L, ixG^L, nwstart, nwbc
393 integer,
dimension(ndim+1) :: fullsize, subsize, start
395 ^
d&fullsize(^
d)=ixgmax^
d;
397 ^
d&subsize(^
d)=ixmax^
d-ixmin^
d+1;
399 ^
d&start(^
d)=ixmin^
d-1;
400 start(
ndim+1)=nwstart-1
402 call mpi_type_create_subarray(
ndim+1,fullsize,subsize,start,mpi_order_fortran, &
403 mpi_double_precision,comm_type,
ierrmpi)
404 call mpi_type_commit(comm_type,
ierrmpi)
411 integer :: i^D, ic^D, inc^D, iib^D
414 if (i^d==0|.and.) cycle
419 if (iib^d==2|.or.) cycle
421 {
do ic^db=1+int((1-i^db)/2),2-int((1+i^db)/2)
422 inc^db=2*i^db+ic^db\}
433 subroutine getbc(time,qdt,psb,nwstart,nwbc,req_diag)
437 double precision,
intent(in) :: time, qdt
438 type(state),
target :: psb(max_blocks)
439 integer,
intent(in) :: nwstart
440 integer,
intent(in) :: nwbc
441 logical,
intent(in),
optional :: req_diag
443 double precision :: time_bcin
444 integer :: ipole, nwhead, nwtail
445 integer :: iigrid, igrid, ineighbor, ipe_neighbor, isizes
446 integer :: ixR^L, ixS^L
447 integer :: i^D, n_i^D, ic^D, inc^D, n_inc^D, iib^D, idir
449 integer :: idphyb(ndim,max_blocks)
450 integer :: isend_buf(npwbuf), ipwbuf, nghostcellsco
452 integer :: ibuf_start, ibuf_next
454 integer,
dimension(1) :: shapes
455 logical :: req_diagonal
458 time_bcin=mpi_wtime()
461 nwtail=nwstart+nwbc-1
463 req_diagonal = .true.
464 if (
present(req_diag)) req_diagonal = req_diag
474 do iigrid=1,igridstail; igrid=igrids(iigrid);
483 do iigrid=1,igridstail; igrid=igrids(iigrid);
484 if(any(neighbor_type(:^d&,igrid)==neighbor_coarse))
then
501 if(stagger_grid)
then
518 do iigrid=1,igridstail; igrid=igrids(iigrid);
520 ^d&idphyb(^d,igrid)=iib^d;
523 select case (neighbor_type(i^d,igrid))
524 case (neighbor_sibling)
533 do iigrid=1,igridstail; igrid=igrids(iigrid);
534 ^d&iib^d=idphyb(^d,igrid);
537 select case (neighbor_type(i^d,igrid))
538 case (neighbor_sibling)
540 case (neighbor_coarse)
548 do iigrid=1,igridstail; igrid=igrids(iigrid);
549 ^d&iib^d=idphyb(^d,igrid);
552 select case (neighbor_type(i^d,igrid))
553 case(neighbor_sibling)
555 case(neighbor_coarse)
565 if(stagger_grid)
then
573 do iigrid=1,igridstail; igrid=igrids(iigrid);
574 ^d&iib^d=idphyb(^d,igrid);
577 select case (neighbor_type(i^d,igrid))
578 case (neighbor_sibling)
588 if (isend_buf(ipwbuf)/=0)
deallocate(pwbuf(ipwbuf)%w)
597 do iigrid=1,igridstail; igrid=igrids(iigrid);
598 ^d&iib^d=idphyb(^d,igrid);
605 do iigrid=1,igridstail; igrid=igrids(iigrid);
606 ^d&iib^d=idphyb(^d,igrid);
615 do iigrid=1,igridstail; igrid=igrids(iigrid);
616 ^d&iib^d=idphyb(^d,igrid);
619 if (neighbor_type(i^d,igrid)==neighbor_fine)
call bc_fill_prolong(igrid,i^d,iib^d)
627 if(stagger_grid)
then
633 do iigrid=1,igridstail; igrid=igrids(iigrid);
634 ^d&iib^d=idphyb(^d,igrid);
643 do iigrid=1,igridstail; igrid=igrids(iigrid);
649 if (isend_buf(ipwbuf)/=0)
deallocate(pwbuf(ipwbuf)%w)
653 if(
bcphys.and.stagger_grid)
then
655 do iigrid=1,igridstail; igrid=igrids(iigrid);
656 if(.not.phyboundblock(igrid)) cycle
663 if(
bcphys.and.
associated(phys_boundary_adjust))
then
665 do iigrid=1,igridstail; igrid=igrids(iigrid);
666 if(.not.phyboundblock(igrid)) cycle
667 call phys_boundary_adjust(igrid,psb)
672 time_bc=time_bc+(mpi_wtime()-time_bcin)
677 integer,
intent(in) :: dir(^nd)
679 if (all(dir == 0))
then
681 else if (.not. req_diagonal .and. count(dir /= 0) > 1)
then
691 integer,
intent(in) :: igrid
693 integer :: idims,iside,i^D,k^L,ixB^L
696 ^d&dxlevel(^d)=rnode(rpdx^d_,igrid);
702 kmin^d=merge(0, 1, idims==^d)
703 kmax^d=merge(0, 1, idims==^d)
704 ixbmin^d=ixglo^d+kmin^d*nghostcells
705 ixbmax^d=ixghi^d-kmax^d*nghostcells
708 if(idims > 1 .and. neighbor_type(-1,0,igrid)==neighbor_boundary) ixbmin1=ixglo1
709 if(idims > 1 .and. neighbor_type( 1,0,igrid)==neighbor_boundary) ixbmax1=ixghi1}
711 if(idims > 1 .and. neighbor_type(-1,0,0,igrid)==neighbor_boundary) ixbmin1=ixglo1
712 if(idims > 1 .and. neighbor_type( 1,0,0,igrid)==neighbor_boundary) ixbmax1=ixghi1
713 if(idims > 2 .and. neighbor_type(0,-1,0,igrid)==neighbor_boundary) ixbmin2=ixglo2
714 if(idims > 2 .and. neighbor_type(0, 1,0,igrid)==neighbor_boundary) ixbmax2=ixghi2}
716 i^d=kr(^d,idims)*(2*iside-3);
717 if (aperiodb(idims))
then
718 if (neighbor_type(i^d,igrid) /= neighbor_boundary .and. &
719 .not. psb(igrid)%is_physical_boundary(2*idims-2+iside)) cycle
721 if (neighbor_type(i^d,igrid) /= neighbor_boundary) cycle
723 call bc_phys(iside,idims,time,qdt,psb(igrid),ixg^ll,ixb^l)
732 integer,
intent(in) :: igrid
734 integer :: idims,iside,i^D,k^L,ixB^L
737 ^d&dxlevel(^d)=rnode(rpdx^d_,igrid);
744 kmin2=merge(1, 0, idims .lt. 2 .and. neighbor_type(0,-1,igrid)==1)
745 kmax2=merge(1, 0, idims .lt. 2 .and. neighbor_type(0, 1,igrid)==1)}
747 kmin2=merge(1, 0, idims .lt. 2 .and. neighbor_type(0,-1,0,igrid)==1)
748 kmax2=merge(1, 0, idims .lt. 2 .and. neighbor_type(0, 1,0,igrid)==1)
749 kmin3=merge(1, 0, idims .lt. 3 .and. neighbor_type(0,0,-1,igrid)==1)
750 kmax3=merge(1, 0, idims .lt. 3 .and. neighbor_type(0,0, 1,igrid)==1)}
751 ixbmin^d=ixglo^d+kmin^d*nghostcells;
752 ixbmax^d=ixghi^d-kmax^d*nghostcells;
754 i^d=kr(^d,idims)*(2*iside-3);
755 if (aperiodb(idims))
then
756 if (neighbor_type(i^d,igrid) /= neighbor_boundary .and. &
757 .not. psb(igrid)%is_physical_boundary(2*idims-2+iside)) cycle
759 if (neighbor_type(i^d,igrid) /= neighbor_boundary) cycle
761 call bc_phys(iside,idims,time,qdt,psb(igrid),ixg^ll,ixb^l)
770 ipe_neighbor=neighbor(2,i^d,igrid)
771 if (ipe_neighbor/=mype)
then
773 itag=(3**^nd+4**^nd)*(igrid-1)+{(i^d+1)*3**(^d-1)+}
776 if(stagger_grid)
then
789 {
do ic^db=1+int((1-i^db)/2),2-int((1+i^db)/2)
790 inc^db=2*i^db+ic^db\}
791 ipe_neighbor=neighbor_child(2,inc^d,igrid)
792 if (ipe_neighbor/=mype)
then
794 itag=(3**^nd+4**^nd)*(igrid-1)+3**^nd+{inc^d*4**(^d-1)+}
795 call mpi_irecv(psb(igrid)%w,1,
type_recv_r(iib^d,inc^d), &
797 if(stagger_grid)
then
800 mpi_double_precision,ipe_neighbor,itag, &
812 ipe_neighbor=neighbor(2,i^d,igrid)
814 if(ipe_neighbor/=mype)
then
815 ineighbor=neighbor(1,i^d,igrid)
816 ipole=neighbor_pole(i^d,igrid)
820 itag=(3**^nd+4**^nd)*(ineighbor-1)+{(n_i^d+1)*3**(^d-1)+}
823 if(stagger_grid)
then
830 reshape(psb(igrid)%ws(ixs^s,idir),shapes)
842 n_i^d=i^d^d%n_i^dd=-i^dd;\}
844 if (isend_buf(ipwbuf)/=0)
then
847 deallocate(pwbuf(ipwbuf)%w)
849 allocate(pwbuf(ipwbuf)%w(ixs^s,nwhead:nwtail))
850 call pole_buffer(pwbuf(ipwbuf)%w,ixs^
l,ixs^
l,psb(igrid)%w,ixg^ll,ixs^
l)
853 itag=(3**^nd+4**^nd)*(ineighbor-1)+{(n_i^d+1)*3**(^d-1)+}
854 isizes={(ixsmax^d-ixsmin^d+1)*}*nwbc
855 call mpi_isend(pwbuf(ipwbuf)%w,isizes,mpi_double_precision, &
857 ipwbuf=1+modulo(ipwbuf,
npwbuf)
858 if(stagger_grid)
then
865 reshape(psb(igrid)%ws(ixs^s,idir),shapes)
879 integer,
intent(in) :: igrid,i^D,iib^D
880 integer :: ineighbor,ipe_neighbor,ipole,ixS^L,ixR^L,n_i^D,idir
882 ipe_neighbor=neighbor(2,i^d,igrid)
883 if(ipe_neighbor==mype)
then
884 ineighbor=neighbor(1,i^d,igrid)
885 ipole=neighbor_pole(i^d,igrid)
890 psb(ineighbor)%w(ixr^s,nwhead:nwtail)=&
891 psb(igrid)%w(ixs^s,nwhead:nwtail)
892 if(stagger_grid)
then
896 psb(ineighbor)%ws(ixr^s,idir)=psb(igrid)%ws(ixs^s,idir)
903 n_i^d=i^d^d%n_i^dd=-i^dd;\}
906 call pole_copy(psb(ineighbor)%w,ixg^ll,ixr^l,psb(igrid)%w,ixg^ll,ixs^l,ipole)
907 if(stagger_grid)
then
911 call pole_copy_stg(psb(ineighbor)%ws,ixr^l,psb(igrid)%ws,ixs^l,idir,ipole)
920 integer,
intent(in) :: igrid,i^D
922 integer :: idims,iside,k^L,ixB^L,ii^D
924 if(phyboundblock(igrid).and..not.stagger_grid.and.
bcphys)
then
933 {kmin^d=merge(0, 1, idims==^d)
934 kmax^d=merge(0, 1, idims==^d)
935 ixbmin^d=ixcogmin^d+kmin^d*nghostcells
936 ixbmax^d=ixcogmax^d-kmax^d*nghostcells\}
938 if(idims > 1 .and. neighbor_type(-1,0,igrid)==neighbor_boundary) ixbmin1=ixcogmin1
939 if(idims > 1 .and. neighbor_type( 1,0,igrid)==neighbor_boundary) ixbmax1=ixcogmax1}
941 if(idims > 1 .and. neighbor_type(-1,0,0,igrid)==neighbor_boundary) ixbmin1=ixcogmin1
942 if(idims > 1 .and. neighbor_type( 1,0,0,igrid)==neighbor_boundary) ixbmax1=ixcogmax1
943 if(idims > 2 .and. neighbor_type(0,-1,0,igrid)==neighbor_boundary) ixbmin2=ixcogmin2
944 if(idims > 2 .and. neighbor_type(0, 1,0,igrid)==neighbor_boundary) ixbmax2=ixcogmax2}
946 ixbmin^d=ixcogmin^d+nghostcells
947 ixbmax^d=ixcogmin^d+2*nghostcells-1
949 ixbmin^d=ixcogmax^d-2*nghostcells+1
950 ixbmax^d=ixcogmax^d-nghostcells
953 ii^d=kr(^d,idims)*(2*iside-3);
954 if ({abs(i^d)==1.and.abs(ii^d)==1|.or.}) cycle
955 if (neighbor_type(ii^d,igrid)/=neighbor_boundary) cycle
966 ipe_neighbor=neighbor(2,i^d,igrid)
967 if(ipe_neighbor/=mype)
then
968 ic^d=1+modulo(node(pig^d_,igrid)-1,2);
969 if({.not.(i^d==0.or.i^d==2*ic^d-3)|.or.})
return
970 ineighbor=neighbor(1,i^d,igrid)
971 ipole=neighbor_pole(i^d,igrid)
975 itag=(3**^nd+4**^nd)*(ineighbor-1)+3**^nd+{n_inc^d*4**(^d-1)+}
976 call mpi_isend(psc(igrid)%w,1,
type_send_r(iib^d,i^d), &
978 if(stagger_grid)
then
985 reshape(psc(igrid)%ws(ixs^s,idir),shapes)
990 mpi_double_precision,ipe_neighbor,itag, &
998 n_inc^d=2*i^d+(3-ic^d)^d%n_inc^dd=-2*i^dd+ic^dd;\}
1000 if(isend_buf(ipwbuf)/=0)
then
1003 deallocate(pwbuf(ipwbuf)%w)
1005 allocate(pwbuf(ipwbuf)%w(ixs^s,nwhead:nwtail))
1009 itag=(3**^nd+4**^nd)*(ineighbor-1)+3**^nd+{n_inc^d*4**(^d-1)+}
1010 isizes={(ixsmax^d-ixsmin^d+1)*}*nwbc
1011 call mpi_isend(pwbuf(ipwbuf)%w,isizes,mpi_double_precision, &
1013 ipwbuf=1+modulo(ipwbuf,
npwbuf)
1014 if(stagger_grid)
then
1021 reshape(psc(igrid)%ws(ixs^s,idir),shapes)
1022 ibuf_start=ibuf_next
1026 mpi_double_precision,ipe_neighbor,itag, &
1037 integer,
intent(in) :: igrid,i^D,iib^D
1039 integer :: ic^D,n_inc^D,ixS^L,ixR^L,ipe_neighbor,ineighbor,ipole,idir
1041 ipe_neighbor=neighbor(2,i^d,igrid)
1042 if(ipe_neighbor==mype)
then
1043 ic^d=1+modulo(node(pig^d_,igrid)-1,2);
1044 if({.not.(i^d==0.or.i^d==2*ic^d-3)|.or.})
return
1045 ineighbor=neighbor(1,i^d,igrid)
1046 ipole=neighbor_pole(i^d,igrid)
1048 n_inc^d=-2*i^d+ic^d;
1049 ixs^l=
ixs_r_^l(iib^d,i^d);
1050 ixr^l=
ixr_r_^l(iib^d,n_inc^d);
1051 psb(ineighbor)%w(ixr^s,nwhead:nwtail)=&
1052 psc(igrid)%w(ixs^s,nwhead:nwtail)
1053 if(stagger_grid)
then
1057 psb(ineighbor)%ws(ixr^s,idir)=psc(igrid)%ws(ixs^s,idir)
1061 ixs^l=
ixs_r_^l(iib^d,i^d);
1064 n_inc^d=2*i^d+(3-ic^d)^d%n_inc^dd=-2*i^dd+ic^dd;\}
1066 ixr^l=
ixr_r_^l(iib^d,n_inc^d);
1067 call pole_copy(psb(ineighbor)%w,ixg^ll,ixr^l,psc(igrid)%w,
ixcog^l,ixs^l,ipole)
1068 if(stagger_grid)
then
1073 call pole_copy_stg(psb(ineighbor)%ws,ixr^l,psc(igrid)%ws,ixs^l,idir,ipole)
1083 double precision :: tmp(ixGs^T)
1084 integer :: ixS^L,ixR^L,n_i^D,ixSsync^L,ixRsync^L
1087 ipe_neighbor=neighbor(2,i^d,igrid)
1088 if(ipe_neighbor/=mype)
then
1089 ineighbor=neighbor(1,i^d,igrid)
1090 ipole=neighbor_pole(i^d,igrid)
1102 psb(igrid)%ws(ixr^s,idir) = tmp(ixs^s)
1108 n_i^d=i^d^d%n_i^dd=-i^dd;\}
1116 shape=shape(psb(igrid)%ws(ixs^s,idir)))
1118 call pole_copy_stg(psb(igrid)%ws,ixr^l,pole_buf%ws,ixs^l,idir,ipole)
1126 integer,
intent(in) :: i^D,idir
1127 integer,
intent(inout) :: ixR^L,ixS^L
1128 integer,
intent(out) :: ixRsync^L,ixSsync^L
1134 if (i^d == -1 .and. idir == ^d)
then
1135 ixrsyncmin^d = ixrmax^d
1136 ixrsyncmax^d = ixrmax^d
1137 ixssyncmin^d = ixsmax^d
1138 ixssyncmax^d = ixsmax^d
1139 ixrmax^d = ixrmax^d - 1
1140 ixsmax^d = ixsmax^d - 1
1141 else if (i^d == 1 .and. idir == ^d)
then
1142 ixrsyncmin^d = ixrmin^d
1143 ixrsyncmax^d = ixrmin^d
1144 ixssyncmin^d = ixsmin^d
1145 ixssyncmax^d = ixsmin^d
1146 ixrmin^d = ixrmin^d + 1
1147 ixsmin^d = ixsmin^d + 1
1156 ipole=neighbor_pole(i^d,igrid)
1159 {
do ic^db=1+int((1-i^db)/2),2-int((1+i^db)/2)
1160 inc^db=2*i^db+ic^db\}
1161 ipe_neighbor=neighbor_child(2,inc^d,igrid)
1162 if(ipe_neighbor/=mype)
then
1163 ineighbor=neighbor_child(1,inc^d,igrid)
1170 shape=shape(psb(igrid)%ws(ixr^s,idir)))
1176 {
do ic^db=1+int((1-i^db)/2),2-int((1+i^db)/2)
1177 inc^db=2*i^db+ic^db\}
1178 ipe_neighbor=neighbor_child(2,inc^d,igrid)
1179 if(ipe_neighbor/=mype)
then
1180 ineighbor=neighbor_child(1,inc^d,igrid)
1183 n_i^d=i^d^d%n_i^dd=-i^dd;\}
1193 shape=shape(psb(igrid)%ws(ixr^s,idir)))
1206 ic^d=1+modulo(node(pig^d_,igrid)-1,2);
1207 if ({.not.(i^d==0.or.i^d==2*ic^d-3)|.or.})
return
1209 ipe_neighbor=neighbor(2,i^d,igrid)
1210 if (ipe_neighbor/=mype)
then
1213 itag=(3**^nd+4**^nd)*(igrid-1)+3**^nd+{inc^d*4**(^d-1)+}
1214 call mpi_irecv(psc(igrid)%w,1,
type_recv_p(iib^d,inc^d), &
1216 if(stagger_grid)
then
1219 mpi_double_precision,ipe_neighbor,itag,&
1231 ipole=neighbor_pole(i^d,igrid)
1233 {
do ic^db=1+int((1-i^db)/2),2-int((1+i^db)/2)
1234 inc^db=2*i^db+ic^db\}
1235 ipe_neighbor=neighbor_child(2,inc^d,igrid)
1236 if(ipe_neighbor/=mype)
then
1238 ineighbor=neighbor_child(1,inc^d,igrid)
1243 itag=(3**^nd+4**^nd)*(ineighbor-1)+3**^nd+{n_inc^d*4**(^d-1)+}
1244 call mpi_isend(psb(igrid)%w,1,
type_send_p(iib^d,inc^d), &
1246 if(stagger_grid)
then
1253 reshape(psb(igrid)%ws(ixs^s,idir),shapes)
1254 ibuf_start=ibuf_next
1258 mpi_double_precision,ipe_neighbor,itag, &
1265 n_inc^d=inc^d^d%n_inc^dd=ic^dd-i^dd;\}
1267 if(isend_buf(ipwbuf)/=0)
then
1270 deallocate(pwbuf(ipwbuf)%w)
1272 allocate(pwbuf(ipwbuf)%w(ixs^s,nwhead:nwtail))
1273 call pole_buffer(pwbuf(ipwbuf)%w,ixs^
l,ixs^
l,psb(igrid)%w,ixg^ll,ixs^
l)
1276 itag=(3**^nd+4**^nd)*(ineighbor-1)+3**^nd+{n_inc^d*4**(^d-1)+}
1277 isizes={(ixsmax^d-ixsmin^d+1)*}*nwbc
1278 call mpi_isend(pwbuf(ipwbuf)%w,isizes,mpi_double_precision, &
1280 ipwbuf=1+modulo(ipwbuf,
npwbuf)
1281 if(stagger_grid)
then
1288 reshape(psb(igrid)%ws(ixs^s,idir),shapes)
1289 ibuf_start=ibuf_next
1293 mpi_double_precision,ipe_neighbor,itag, &
1305 integer,
intent(in) :: igrid,i^D,iib^D
1307 integer :: ipe_neighbor,ineighbor,ixS^L,ixR^L,ic^D,inc^D,ipole,idir
1309 ipole=neighbor_pole(i^d,igrid)
1312 {
do ic^db=1+int((1-i^db)/2),2-int((1+i^db)/2)
1313 inc^db=2*i^db+ic^db\}
1314 ipe_neighbor=neighbor_child(2,inc^d,igrid)
1315 if(ipe_neighbor==mype)
then
1316 ixs^l=
ixs_p_^l(iib^d,inc^d);
1317 ineighbor=neighbor_child(1,inc^d,igrid)
1318 ipole=neighbor_pole(i^d,igrid)
1321 ixr^l=
ixr_p_^l(iib^d,n_inc^d);
1322 psc(ineighbor)%w(ixr^s,nwhead:nwtail) &
1323 =psb(igrid)%w(ixs^s,nwhead:nwtail)
1324 if(stagger_grid)
then
1328 psc(ineighbor)%ws(ixr^s,idir)=psb(igrid)%ws(ixs^s,idir)
1334 {
do ic^db=1+int((1-i^db)/2),2-int((1+i^db)/2)
1335 inc^db=2*i^db+ic^db\}
1336 ipe_neighbor=neighbor_child(2,inc^d,igrid)
1337 if(ipe_neighbor==mype)
then
1339 ineighbor=neighbor_child(1,inc^d,igrid)
1340 ipole=neighbor_pole(i^d,igrid)
1343 n_inc^d=inc^d^d%n_inc^dd=ic^dd-i^dd;\}
1347 if(stagger_grid)
then
1351 call pole_copy_stg(psc(ineighbor)%ws,ixr^
l,psb(igrid)%ws,ixs^
l,idir,ipole)
1360 integer,
intent(in) :: igrid
1362 integer :: iib^D,i^D,idims,iside
1363 logical,
dimension(-1:1^D&) :: NeedProlong
1365 ^d&iib^d=idphyb(^d,igrid);
1369 if (neighbor_type(i^d,igrid)==neighbor_coarse)
then
1371 needprolong(i^d)=.true.
1374 if(stagger_grid)
then
1385 if (needprolong(i^dd))
call bc_prolong_stg(igrid,i^dd,iib^dd,needprolong)
1396 if (needprolong(i^d))
call bc_prolong_stg(igrid,i^d,iib^d,needprolong)
1402 if (needprolong(i^d))
call bc_prolong_stg(igrid,i^d,iib^d,needprolong)
1408 if (needprolong(i^d))
call bc_prolong_stg(igrid,i^d,iib^d,needprolong)
1414 if (needprolong(i^d))
call bc_prolong_stg(igrid,i^d,iib^d,needprolong)
1421 ic^d=1+modulo(node(pig^d_,igrid)-1,2);
1422 if ({.not.(i^d==0.or.i^d==2*ic^d-3)|.or.})
return
1424 ipe_neighbor=neighbor(2,i^d,igrid)
1425 if(ipe_neighbor/=mype)
then
1426 ineighbor=neighbor(1,i^d,igrid)
1427 ipole=neighbor_pole(i^d,igrid)
1436 shape=shape(psc(igrid)%ws(ixr^s,idir)))
1443 n_inc^d=2*i^d+(3-ic^d)^d%n_inc^dd=-2*i^dd+ic^dd;\}
1451 shape=shape(psc(igrid)%ws(ixr^s,idir)))
1464 integer :: i^D,iib^D,igrid
1465 integer :: ixFi^L,ixCo^L,ii^D, idims,iside,ixB^L
1466 double precision :: dxFi^D, dxCo^D, xFimin^D, xComin^D, invdxCo^D
1469 dxfi^d=rnode(rpdx^d_,igrid);
1471 invdxco^d=1.d0/dxco^d;
1477 xfimin^d=rnode(rpxmin^d_,igrid)-dble(nghostcells)*dxfi^d;
1478 xcomin^d=rnode(rpxmin^d_,igrid)-dble(nghostcells)*dxco^d;
1480 if(stagger_grid.and.phyboundblock(igrid).and.
bcphys)
then
1483 ixcomin^d=int((xfimin^d+(dble(ixfimin^d)-half)*dxfi^d-xcomin^d)*invdxco^d)+1-1;
1484 ixcomax^d=int((xfimin^d+(dble(ixfimax^d)-half)*dxfi^d-xcomin^d)*invdxco^d)+1+1;
1488 if(neighbor_type(-1,0,0,igrid)==neighbor_boundary .or. &
1489 neighbor_type(1,0,0,igrid)==neighbor_boundary)
then
1490 if(neighbor_type(0,-1,0,igrid)==neighbor_boundary) ixcomin2=ixcommin2
1491 if(neighbor_type(0,0,-1,igrid)==neighbor_boundary) ixcomin3=ixcommin3
1492 if(neighbor_type(0,1,0,igrid)==neighbor_boundary) ixcomax2=ixcommax2
1493 if(neighbor_type(0,0,1,igrid)==neighbor_boundary) ixcomax3=ixcommax3
1495 else if(idims == 2)
then
1496 if(neighbor_type(0,-1,0,igrid)==neighbor_boundary .or. &
1497 neighbor_type(0,1,0,igrid)==neighbor_boundary)
then
1498 if(neighbor_type(0,0,-1,igrid)==neighbor_boundary) ixcomin3=ixcommin3
1499 if(neighbor_type(0,0,1,igrid)==neighbor_boundary) ixcomax3=ixcommax3
1504 ii^d=kr(^d,idims)*(2*iside-3);
1505 if(neighbor_type(ii^d,igrid)/=neighbor_boundary) cycle
1506 if(( {(iside==1.and.idims==^d.and.ixcomin^d<ixcogmin^d+nghostcells)|.or.} ) &
1507 .or.( {(iside==2.and.idims==^d.and.ixcomax^d>ixcogmax^d-nghostcells)|.or. }))
then
1508 {ixbmin^d=merge(ixcogmin^d,ixcomin^d,idims==^d);}
1509 {ixbmax^d=merge(ixcogmax^d,ixcomax^d,idims==^d);}
1510 call bc_phys(iside,idims,time,0.d0,psc(igrid),
ixcog^l,ixb^l)
1516 if(prolongprimitive)
then
1523 ixcomin^d=int((xfimin^d+(dble(ixfimin^d)-half)*dxfi^d-xcomin^d)*invdxco^d)+1-1;
1524 ixcomax^d=int((xfimin^d+(dble(ixfimax^d)-half)*dxfi^d-xcomin^d)*invdxco^d)+1+1;
1526 psc(igrid)%w,psc(igrid)%x)
1535 if(prolongprimitive)
then
1544 integer :: igrid,i^D,iib^D
1545 logical,
dimension(-1:1^D&) :: NeedProlong
1546 logical :: fine_^Lin
1547 integer :: ixFi^L,ixCo^L
1548 double precision :: dxFi^D,dxCo^D,xFimin^D,xComin^D,invdxCo^D
1552 if(i^d>-1) fine_min^din=(.not.needprolong(i^dd-kr(^d,^dd)).and.neighbor_type(i^dd-kr(^d,^dd),igrid)/=1)
1553 if(i^d<1) fine_max^din=(.not.needprolong(i^dd+kr(^d,^dd)).and.neighbor_type(i^dd+kr(^d,^dd),igrid)/=1)
1558 dxfi^d=rnode(rpdx^d_,igrid);
1560 invdxco^d=1.d0/dxco^d;
1562 xfimin^d=rnode(rpxmin^d_,igrid)-dble(nghostcells)*dxfi^d;
1563 xcomin^d=rnode(rpxmin^d_,igrid)-dble(nghostcells)*dxco^d;
1568 ixcomin^d=int((xfimin^d+(dble(ixfimin^d)-half)*dxfi^d-xcomin^d)*invdxco^d)+1-1;
1569 ixcomax^d=int((xfimin^d+(dble(ixfimax^d)-half)*dxfi^d-xcomin^d)*invdxco^d)+1+1;
1571 if(prolongprimitive)
call phys_to_primitive(ixg^ll,ixfi^l,psb(igrid)%w,psb(igrid)%x)
1573 call prolong_2nd_stg(psc(igrid),psb(igrid),ixco^l,ixfi^l,dxco^d,xcomin^d,dxfi^d,xfimin^d,.true.,fine_^lin)
1575 if(prolongprimitive)
call phys_to_conserved(ixg^ll,ixfi^l,psb(igrid)%w,psb(igrid)%x)
1578 needprolong(i^d)=.false.
1583 dxCo^D,invdxCo^D,xComin^D)
1585 integer,
intent(in) :: igrid, ixFi^L
1586 double precision,
intent(in) :: dxFi^D, xFimin^D,dxCo^D, invdxCo^D, xComin^D
1588 integer :: ixCo^D, jxCo^D, hxCo^D, ixFi^D, ix^D, iw, idims, nwmin,nwmax
1589 double precision :: xCo^D, xFi^D, eta^D
1590 double precision :: slopeL, slopeR, slopeC, signC, signR
1591 double precision :: slope(1:nw,ndim)
1593 double precision :: signedfactorhalf^D
1598 if(prolongprimitive)
then
1606 {
do ixfi^db = ixfi^lim^db
1609 xfi^db=xfimin^db+(dble(ixfi^db)-half)*dxfi^db
1614 ixco^db=int((xfi^db-xcomin^db)*invdxco^db)+1
1618 xco^db=xcomin^db+(dble(ixco^db)-half)*dxco^db \}
1624 if(slab_uniform)
then
1633 eta^d=(xfi^d-xco^d)*invdxco^d;
1667 ix^d=2*int((ixfi^d+ixmlo^d)/2)-ixmlo^d;
1668 {
if(xfi^d>xco^d)
then
1669 signedfactorhalf^d=0.5d0
1671 signedfactorhalf^d=-0.5d0
1673 eta^d=signedfactorhalf^d*(one-psb(igrid)%dvolume(ixfi^dd) &
1674 /sum(psb(igrid)%dvolume(ix^d:ix^d+1^d%ixFi^dd))) \}
1681 hxco^d=ixco^d-kr(^d,idims)\
1682 jxco^d=ixco^d+kr(^d,idims)\
1685 slopel=psc(igrid)%w(ixco^d,iw)-psc(igrid)%w(hxco^d,iw)
1686 sloper=psc(igrid)%w(jxco^d,iw)-psc(igrid)%w(ixco^d,iw)
1687 slopec=half*(sloper+slopel)
1690 signr=sign(one,sloper)
1691 signc=sign(one,slopec)
1709 slope(iw,idims)=signc*max(zero,min(dabs(slopec), &
1710 signc*slopel,signc*sloper))
1716 psb(igrid)%w(ixfi^d,nwmin:nwmax)=psc(igrid)%w(ixco^d,nwmin:nwmax)+&
1717 {(slope(nwmin:nwmax,^d)*eta^d)+}
1721 if(prolongprimitive)
then
1723 call phys_to_conserved(ixg^ll,ixfi^
l,psb(igrid)%w,psb(igrid)%x)
1729 dxCo^D,invdxCo^D,xComin^D)
1731 integer,
intent(in) :: igrid, ixFi^L
1732 double precision,
intent(in) :: dxFi^D, xFimin^D,dxCo^D, invdxCo^D, xComin^D
1734 integer :: ixCo^D, ixFi^D, nwmin,nwmax
1735 double precision :: xFi^D
1737 if(prolongprimitive)
then
1745 {
do ixfi^db = ixfi^lim^db
1747 xfi^db=xfimin^db+(dble(ixfi^db)-half)*dxfi^db
1751 ixco^db=int((xfi^db-xcomin^db)*invdxco^db)+1\}
1754 psb(igrid)%w(ixfi^d,nwmin:nwmax)=psc(igrid)%w(ixco^d,nwmin:nwmax)
1758 if(prolongprimitive)
call phys_to_conserved(ixg^ll,ixfi^
l,psb(igrid)%w,psb(igrid)%x)
1762 subroutine pole_copy(wrecv,ixIR^L,ixR^L,wsend,ixIS^L,ixS^L,ipole)
1764 integer,
intent(in) :: ixIR^L,ixR^L,ixIS^L,ixS^L,ipole
1765 double precision :: wrecv(ixIR^S,1:nw), wsend(ixIS^S,1:nw)
1767 integer :: iw, iside, iB
1771 iside=int((i^d+3)/2)
1774 select case (typeboundary(iw,ib))
1776 wrecv(ixr^s,iw) = wsend(ixsmax^d:ixsmin^d:-1^d%ixS^s,iw)
1778 wrecv(ixr^s,iw) =-wsend(ixsmax^d:ixsmin^d:-1^d%ixS^s,iw)
1780 call mpistop(
"Pole boundary condition should be symm or asymm")
1789 integer,
intent(in) :: ixR^L,ixS^L,idirs,ipole
1791 double precision :: wrecv(ixGs^T,1:nws), wsend(ixGs^T,1:nws)
1792 integer :: iB, iside
1796 iside=int((i^d+3)/2)
1798 select case (typeboundary(iw_mag(idirs),ib))
1800 wrecv(ixr^s,idirs) = wsend(ixsmax^d:ixsmin^d:-1^d%ixS^s,idirs)
1802 wrecv(ixr^s,idirs) =-wsend(ixsmax^d:ixsmin^d:-1^d%ixS^s,idirs)
1804 call mpistop(
"Pole boundary condition should be symm or asymm")
1813 integer,
intent(in) :: ixIR^L,ixR^L,ixIS^L,ixS^L
1814 double precision :: wrecv(ixIR^S,nwhead:nwtail), wsend(ixIS^S,1:nw)
1816 integer :: iw, iside, iB
1820 iside=int((i^d+3)/2)
1823 select case (typeboundary(iw,ib))
1825 wrecv(ixr^s,iw) = wsend(ixsmax^d:ixsmin^d:-1^d%ixS^s,iw)
1827 wrecv(ixr^s,iw) =-wsend(ixsmax^d:ixsmin^d:-1^d%ixS^s,iw)
1829 call mpistop(
"Pole boundary condition should be symm or asymm")
1836 end subroutine getbc
1842 integer,
intent(out) :: iib^D
1845 if(s%is_physical_boundary(2*^d) .and. &
1846 s%is_physical_boundary(2*^d-1))
then
1848 else if(s%is_physical_boundary(2*^d-1))
then
1850 else if(s%is_physical_boundary(2*^d))
then
subroutine bc_phys(iside, idims, time, qdt, s, ixGL, ixBL)
fill ghost cells at a physical boundary
subroutine getintbc(time, ixGL)
fill inner boundary values
subroutine coarsen_grid(sFi, ixFiGL, ixFiL, sCo, ixCoGL, ixCoL)
coarsen one grid to its coarser representative
subroutine mpistop(message)
Exit MPI-AMRVAC with an error message.
subroutine bc_recv_restrict
Receive from fine neighbor.
subroutine gc_prolong(igrid)
subroutine interpolation_linear(igrid, ixFiL, dxFiD, xFiminD, dxCoD, invdxCoD, xCominD)
subroutine bc_prolong(igrid, iD, iibD)
do prolongation for fine blocks after receipt data from coarse neighbors
subroutine indices_for_syncing(idir, iD, ixRL, ixSL, ixRsyncL, ixSsyncL)
subroutine bc_fill_srl_stg
fill siblings ghost cells with received data
subroutine pole_copy(wrecv, ixIRL, ixRL, wsend, ixISL, ixSL, ipole)
subroutine pole_copy_stg(wrecv, ixRL, wsend, ixSL, idirs, ipole)
subroutine bc_recv_prolong
Receive from coarse neighbor.
subroutine bc_fill_prolong(igrid, iD, iibD)
Send to finer neighbor.
subroutine bc_recv_srl
Receive from sibling at same refinement level.
subroutine bc_fill_restrict(igrid, iD, iibD)
fill coarser neighbor's ghost cells
subroutine fill_coarse_boundary(igrid, iD)
subroutine interpolation_copy(igrid, ixFiL, dxFiD, xFiminD, dxCoD, invdxCoD, xCominD)
subroutine bc_send_restrict
Send to coarser neighbor.
subroutine pole_buffer(wrecv, ixIRL, ixRL, wsend, ixISL, ixSL)
subroutine fill_boundary_before_gc(igrid)
Physical boundary conditions.
subroutine bc_fill_srl(igrid, iD, iibD)
subroutine bc_fill_restrict_stg
fill restricted ghost cells after receipt
subroutine bc_send_srl
Send to sibling at same refinement level.
subroutine fill_boundary_after_gc(igrid)
Physical boundary conditions.
logical function skip_direction(dir)
subroutine bc_send_prolong
Send to finer neighbor.
subroutine bc_fill_prolong_stg
fill coarser representative with data from coarser neighbors
subroutine bc_prolong_stg(igrid, iD, iibD, NeedProlong)
subroutine, public prolong_2nd_stg(sCo, sFi, ixCoLin, ixFiLin, dxCoD, xCominD, dxFiD, xFiminD, ghost, fine_Lin)
This subroutine performs a 2nd order prolongation for a staggered field F, preserving the divergence ...
update ghost cells of all blocks including physical boundaries
integer, dimension(-1:2^d &,-1:1^d &), target type_recv_srl_f
integer, dimension(-1:1^d &) sizes_r_send_total
integer, dimension(-1:1^d &, 0:3^d &), target type_recv_p_p1
integer, dimension(-1:2^d &,-1:1^d &), target type_recv_srl_p2
integer, dimension(-1:1^d &,-1:1^d &), target type_send_r_p2
integer, dimension(^nd, 0:3) l
integer, dimension(:), allocatable sendrequest_c_p
integer, dimension(^nd,-1:1) ixs_r_stg_
integer, dimension(^nd,-1:1) ixs_srl_stg_
subroutine get_bc_comm_type(comm_type, ixL, ixGL, nwstart, nwbc)
integer, dimension(^nd, 0:3^d &) sizes_p_send_stg
integer, dimension(-1:1^d &) sizes_srl_send_total
integer, dimension(-1:1^d &, 0:3^d &), target type_send_p_p1
subroutine identifyphysbound(s, iibD)
integer, dimension(^nd, 0:3) ixr_r_stg_
integer, dimension(:), allocatable sendrequest_r
integer, dimension(-1:2^d &,-1:1^d &), target type_send_srl_p1
integer, dimension(:), allocatable recvrequest_r
double precision, dimension(:), allocatable sendbuffer_p
integer, dimension(:,:), allocatable sendstatus_c_p
integer, dimension(^nd,-1:1^d &) sizes_r_send_stg
integer, dimension(-1:1^d &, 0:3^d &), target type_send_p_f
integer, dimension(-1:2,-1:1) ixr_srl_
integer, dimension(:^d &,:^d &), pointer type_recv_srl
integer, dimension(:,:), allocatable sendstatus_c_sr
integer, dimension(-1:1^d &, 0:3^d &), target type_recv_r_p2
double precision, dimension(:), allocatable recvbuffer_r
integer, dimension(:), allocatable recvrequest_c_p
subroutine create_bc_mpi_datatype(nwstart, nwbc)
integer, dimension(:), allocatable recvrequest_c_sr
integer, dimension(-1:2^d &,-1:1^d &), target type_recv_srl_p1
integer, dimension(:), allocatable sendrequest_c_sr
integer, dimension(-1:2^d &,-1:1^d &), target type_send_srl_p2
integer, dimension(-1:2,-1:1) ixs_srl_
double precision, dimension(:), allocatable recvbuffer_srl
integer, dimension(:^d &,:^d &), pointer type_send_srl
integer, dimension(:,:), allocatable recvstatus_p
integer, dimension(^nd, 0:3) ixs_p_stg_
integer, dimension(^nd, 0:3^d &) sizes_p_recv_stg
integer, dimension(-1:1^d &, 0:3^d &), target type_recv_p_p2
integer, dimension(-1:1^d &, 0:3^d &), target type_recv_r_f
integer, dimension(:^d &,:^d &), pointer type_recv_r
integer, dimension(:^d &,:^d &), pointer type_send_r
integer, dimension(^nd,-1:1^d &) sizes_srl_recv_stg
double precision, dimension(:), allocatable recvbuffer_p
integer, dimension(^nd,-1:1) ixr_srl_stg_
integer, dimension(-1:1^d &, 0:3^d &), target type_recv_r_p1
double precision, dimension(:), allocatable sendbuffer_r
integer, dimension(-1:1^d &, 0:3^d &), target type_recv_p_f
integer, dimension(-1:1, 0:3) ixr_p_
integer, dimension(-1:1, 0:3) ixr_r_
integer, dimension(0:3^d &) sizes_p_recv_total
integer, dimension(:,:), allocatable recvstatus_c_sr
integer, dimension(0:3^d &) sizes_r_recv_total
integer, parameter npwbuf
integer, dimension(-1:1, 0:3) ixs_p_
integer, dimension(:), allocatable sendrequest_p
integer, dimension(^nd, 0:3^d &) sizes_r_recv_stg
subroutine getbc(time, qdt, psb, nwstart, nwbc, req_diag)
do update ghost cells of all blocks including physical boundaries
subroutine put_bc_comm_types()
double precision, dimension(:), allocatable sendbuffer_srl
integer, dimension(-1:1^d &, 0:3^d &), target type_send_p_p2
integer, dimension(:,:), allocatable sendstatus_srl
integer, dimension(:,:), allocatable recvstatus_srl
integer, dimension(:), allocatable sendrequest_srl
integer, dimension(-1:2^d &,-1:1^d &), target type_send_srl_f
integer, dimension(:,:), allocatable recvstatus_r
integer, dimension(-1:1,-1:1) ixs_r_
integer, dimension(-1:1^d &,-1:1^d &), target type_send_r_p1
integer, dimension(0:3^d &) sizes_p_send_total
integer, dimension(:^d &,:^d &), pointer type_recv_p
integer, dimension(^nd, 0:3) ixr_p_stg_
integer, dimension(:^d &,:^d &), pointer type_send_p
integer, dimension(:,:), allocatable sendstatus_r
integer, dimension(:,:), allocatable sendstatus_p
integer, dimension(-1:1^d &) sizes_srl_recv_total
integer, dimension(-1:1^d &,-1:1^d &), target type_send_r_f
integer, dimension(:), allocatable recvrequest_p
integer, dimension(:), allocatable recvrequest_srl
integer, dimension(^nd,-1:1^d &) sizes_srl_send_stg
integer, dimension(:,:), allocatable recvstatus_c_p
This module contains definitions of global parameters and variables and some generic functions/subrou...
logical internalboundary
if there is an internal boundary
integer ixghi
Upper index of grid block arrays.
integer, dimension(3, 3) kr
Kronecker delta tensor.
integer, parameter ndim
Number of spatial dimensions for grid variables.
logical stagger_grid
True for using stagger grid.
logical, dimension(:), allocatable phyboundblock
True if a block has any physical boundary.
integer, dimension(:), allocatable, parameter d
logical ghost_copy
whether copy values instead of interpolation in ghost cells of finer blocks
integer ierrmpi
A global MPI error return code.
integer nghostcells
Number of ghost cells surrounding a grid.
This module defines the procedures of a physics module. It contains function pointers for the various...
procedure(sub_convert), pointer phys_to_primitive
logical phys_req_diagonal
Whether the physics routines require diagonal ghost cells, for example for computing a curl.
procedure(sub_convert), pointer phys_to_conserved
character(len=name_len) physics_type
String describing the physics type of the simulation.