328 type(mg_box_t),
intent(in) :: box
329 integer,
intent(in) :: nc,iv,nb
330 integer,
intent(out) :: bc_type
331 double precision,
intent(out) :: bc(nc,nc)
333 double precision :: rr(nc,nc,3)
334 double precision :: rmina,rminb,rmaxa,rmaxb,xmina,xminb,xmaxa,xmaxb
335 double precision :: wbn(ixg^t)
336 double precision,
allocatable :: xcoarse(:,:,:)
337 integer :: iigrid,igrid,ix^
d,idir,ixbca,ixbcb,ixbcn,dlvl,wnc
339 bc_type=mg_bc_neumann
342 call mg_get_face_coords(box,nb,nc,rr)
346 if(mod(nb,2)==0)
then
351 rmina=rr(1,1,2)-0.5d0*box%dr(2)
352 rmaxa=rr(nc,1,2)+0.5d0*box%dr(2)
353 rminb=rr(1,1,3)-0.5d0*box%dr(3)
354 rmaxb=rr(1,nc,3)+0.5d0*box%dr(3)
355 do iigrid=1,igridstail
358 if(.not.
block%is_physical_boundary(nb)) cycle
360 wbn(ixbcn,ixglo2:ixghi2,ixglo3:ixghi3)=&
361 block%ws(ixbcn,ixglo2:ixghi2,ixglo3:ixghi3,idir)
362 if(
b0field) wbn(ixbcn,ixglo2:ixghi2,ixglo3:ixghi3)=&
363 wbn(ixbcn,ixglo2:ixghi2,ixglo3:ixghi3)+&
364 block%B0(ixbcn,ixglo2:ixghi2,ixglo3:ixghi3,idir,idir)
366 wbn(ixbcn,ixglo2:ixghi2,ixglo3:ixghi3)=half*(&
367 block%w(ixbcn,ixglo2:ixghi2,ixglo3:ixghi3,iw_mag(idir))+&
368 block%w(ixbcn+1,ixglo2:ixghi2,ixglo3:ixghi3,iw_mag(idir)))
369 if(
b0field) wbn(ixbcn,ixglo2:ixghi2,ixglo3:ixghi3)=&
370 wbn(ixbcn,ixglo2:ixghi2,ixglo3:ixghi3)+half*(&
371 block%B0(ixbcn,ixglo2:ixghi2,ixglo3:ixghi3,idir,0)+&
372 block%B0(ixbcn+1,ixglo2:ixghi2,ixglo3:ixghi3,idir,0))
374 xmina=
block%x(1,1,1,2)-0.5d0*
rnode(rpdx2_,igrid)
375 xmaxa=
block%x(1,ixghi2,1,2)+0.5d0*
rnode(rpdx2_,igrid)
376 xminb=
block%x(1,1,1,3)-0.5d0*
rnode(rpdx3_,igrid)
377 xmaxb=
block%x(1,1,ixghi3,3)+0.5d0*
rnode(rpdx3_,igrid)
378 if(xmina<rr(1,1,2) .and. xmaxa>rr(nc,1,2) .and.&
379 xminb<rr(1,1,3) .and. xmaxb>rr(1,nc,3))
then
382 ixbca=ceiling((rr(ix1,ix2,2)-xmina)/
rnode(rpdx2_,igrid))
383 ixbcb=ceiling((rr(ix1,ix2,3)-xminb)/
rnode(rpdx3_,igrid))
384 bc(ix1,ix2)=wbn(ixbcn,ixbca,ixbcb)
387 else if(
block%x(1,ixmlo2,1,2)>rmina .and.&
388 block%x(1,ixmhi2,1,2)<rmaxa .and.&
389 block%x(1,1,ixmlo3,3)>rminb .and.&
390 block%x(1,1,ixmhi3,3)<rmaxb)
then
393 allocate(xcoarse(wnc,wnc,2))
396 xcoarse(ix1,ix2,1)=sum(
block%x(1,&
399 xcoarse(ix1,ix2,2)=sum(
block%x(1,1,&
402 ixbca=ceiling((xcoarse(ix1,ix2,1)-rmina)/box%dr(2))
403 ixbcb=ceiling((xcoarse(ix1,ix2,2)-rminb)/box%dr(3))
404 bc(ixbca,ixbcb)=sum(wbn(ixbcn,&
414 if(mod(nb,2)==0)
then
419 rmina=rr(1,1,1)-0.5d0*box%dr(1)
420 rmaxa=rr(nc,1,1)+0.5d0*box%dr(1)
421 rminb=rr(1,1,3)-0.5d0*box%dr(3)
422 rmaxb=rr(1,nc,3)+0.5d0*box%dr(3)
423 do iigrid=1,igridstail
426 if(.not.
block%is_physical_boundary(nb)) cycle
428 wbn(ixglo1:ixghi1,ixbcn,ixglo3:ixghi3)=&
429 block%ws(ixglo1:ixghi1,ixbcn,ixglo3:ixghi3,idir)
430 if(
b0field) wbn(ixglo1:ixghi1,ixbcn,ixglo3:ixghi3)=&
431 wbn(ixglo1:ixghi1,ixbcn,ixglo3:ixghi3)+&
432 block%B0(ixglo1:ixghi1,ixbcn,ixglo3:ixghi3,idir,idir)
434 wbn(ixglo1:ixghi1,ixbcn,ixglo3:ixghi3)=half*(&
435 block%w(ixglo1:ixghi1,ixbcn,ixglo3:ixghi3,iw_mag(idir))+&
436 block%w(ixglo1:ixghi1,ixbcn+1,ixglo3:ixghi3,iw_mag(idir)))
437 if(
b0field) wbn(ixglo1:ixghi1,ixbcn,ixglo3:ixghi3)=&
438 wbn(ixglo1:ixghi1,ixbcn,ixglo3:ixghi3)+half*(&
439 block%B0(ixglo1:ixghi1,ixbcn,ixglo3:ixghi3,idir,0)+&
440 block%B0(ixglo1:ixghi1,ixbcn+1,ixglo3:ixghi3,idir,0))
442 xmina=
block%x(1,1,1,1)-0.5d0*
rnode(rpdx1_,igrid)
443 xmaxa=
block%x(ixghi1,1,1,1)+0.5d0*
rnode(rpdx1_,igrid)
444 xminb=
block%x(1,1,1,3)-0.5d0*
rnode(rpdx3_,igrid)
445 xmaxb=
block%x(1,1,ixghi3,3)+0.5d0*
rnode(rpdx3_,igrid)
446 if(xmina<rr(1,1,1) .and. xmaxa>rr(nc,1,1) .and.&
447 xminb<rr(1,1,3) .and. xmaxb>rr(1,nc,3))
then
450 ixbca=ceiling((rr(ix1,ix2,1)-xmina)/
rnode(rpdx1_,igrid))
451 ixbcb=ceiling((rr(ix1,ix2,3)-xminb)/
rnode(rpdx3_,igrid))
452 bc(ix1,ix2)=wbn(ixbca,ixbcn,ixbcb)
455 else if(
block%x(ixmlo1,1,1,1)>rmina .and.&
456 block%x(ixmhi1,1,1,1)<rmaxa .and.&
457 block%x(1,1,ixmlo3,3)>rminb .and.&
458 block%x(1,1,ixmhi3,3)<rmaxb)
then
461 allocate(xcoarse(wnc,wnc,2))
464 xcoarse(ix1,ix2,1)=sum(
block%x(&
466 1,1,1))/dble(2**dlvl)
467 xcoarse(ix1,ix2,2)=sum(
block%x(1,1,&
470 ixbca=ceiling((xcoarse(ix1,ix2,1)-rmina)/box%dr(1))
471 ixbcb=ceiling((xcoarse(ix1,ix2,2)-rminb)/box%dr(3))
472 bc(ixbca,ixbcb)=sum(wbn(&
483 if(mod(nb,2)==0)
then
488 rmina=rr(1,1,1)-0.5d0*box%dr(1)
489 rmaxa=rr(nc,1,1)+0.5d0*box%dr(1)
490 rminb=rr(1,1,2)-0.5d0*box%dr(2)
491 rmaxb=rr(1,nc,2)+0.5d0*box%dr(2)
492 do iigrid=1,igridstail
495 if(.not.
block%is_physical_boundary(nb)) cycle
497 wbn(ixglo1:ixghi1,ixglo2:ixghi2,ixbcn)=&
498 block%ws(ixglo1:ixghi1,ixglo2:ixghi2,ixbcn,idir)
499 if(
b0field) wbn(ixglo1:ixghi1,ixglo2:ixghi2,ixbcn)=&
500 wbn(ixglo1:ixghi1,ixglo2:ixghi2,ixbcn)+&
501 block%B0(ixglo1:ixghi1,ixglo2:ixghi2,ixbcn,idir,idir)
503 wbn(ixglo1:ixghi1,ixglo2:ixghi2,ixbcn)=half*(&
504 block%w(ixglo1:ixghi1,ixglo2:ixghi2,ixbcn,iw_mag(idir))+&
505 block%w(ixglo1:ixghi1,ixglo2:ixghi2,ixbcn+1,iw_mag(idir)))
506 if(
b0field) wbn(ixglo1:ixghi1,ixglo2:ixghi2,ixbcn)=&
507 wbn(ixglo1:ixghi1,ixglo2:ixghi2,ixbcn)+half*(&
508 block%B0(ixglo1:ixghi1,ixglo2:ixghi2,ixbcn,idir,0)+&
509 block%B0(ixglo1:ixghi1,ixglo2:ixghi2,ixbcn+1,idir,0))
511 xmina=
block%x(1,1,1,1)-0.5d0*
rnode(rpdx1_,igrid)
512 xmaxa=
block%x(ixghi1,1,1,1)+0.5d0*
rnode(rpdx1_,igrid)
513 xminb=
block%x(1,1,1,2)-0.5d0*
rnode(rpdx2_,igrid)
514 xmaxb=
block%x(1,ixghi2,1,2)+0.5d0*
rnode(rpdx2_,igrid)
515 if(xmina<rr(1,1,1) .and. xmaxa>rr(nc,1,1) .and.&
516 xminb<rr(1,1,2) .and. xmaxb>rr(1,nc,2))
then
519 ixbca=ceiling((rr(ix1,ix2,1)-xmina)/
rnode(rpdx1_,igrid))
520 ixbcb=ceiling((rr(ix1,ix2,2)-xminb)/
rnode(rpdx2_,igrid))
521 bc(ix1,ix2)=wbn(ixbca,ixbcb,ixbcn)
524 else if(
block%x(ixmlo1,1,1,1)>rmina .and.&
525 block%x(ixmhi1,1,1,1)<rmaxa .and.&
526 block%x(1,ixmlo2,1,2)>rminb .and.&
527 block%x(1,ixmhi2,1,2)<rmaxb)
then
530 allocate(xcoarse(wnc,wnc,2))
533 xcoarse(ix1,ix2,1)=sum(
block%x(&
535 1,1,1))/dble(2**dlvl)
536 xcoarse(ix1,ix2,2)=sum(
block%x(1,&
539 ixbca=ceiling((xcoarse(ix1,ix2,1)-rmina)/box%dr(1))
540 ixbcb=ceiling((xcoarse(ix1,ix2,2)-rminb)/box%dr(2))
541 bc(ixbca,ixbcb)=sum(wbn(&
544 ixbcn))/dble(2**(2*dlvl))