subroutine set_B0_face(igrid,x,ixImin1,ixImin2,ixImin3,ixImax1,ixImax2,&
ixImax3,ixOmin1,ixOmin2,ixOmin3,ixOmax1,ixOmax2,ixOmax3)
use mod_global_parameters
integer, intent(in) :: igrid, ixImin1,ixImin2,ixImin3,ixImax1,ixImax2,&
ixImax3, ixOmin1,ixOmin2,ixOmin3,ixOmax1,ixOmax2,ixOmax3
double precision, intent(in) :: x(ixImin1:ixImax1,ixImin2:ixImax2,&
ixImin3:ixImax3,1:ndim)
double precision :: delx(ixImin1:ixImax1,ixImin2:ixImax2,ixImin3:ixImax3,&
1:ndim)
double precision :: xC(ixImin1:ixImax1,ixImin2:ixImax2,ixImin3:ixImax3,&
1:ndim),xshift1,xshift2,xshift3
integer :: idims, ixCmin1,ixCmin2,ixCmin3,ixCmax1,ixCmax2,ixCmax3, hxOmin1,&
hxOmin2,hxOmin3,hxOmax1,hxOmax2,hxOmax3, ix, idims2
if(slab_uniform)then
delx(ixImin1:ixImax1,ixImin2:ixImax2,ixImin3:ixImax3,1)=rnode(rpdx1_,&
igrid)
delx(ixImin1:ixImax1,ixImin2:ixImax2,ixImin3:ixImax3,2)=rnode(rpdx2_,&
igrid)
delx(ixImin1:ixImax1,ixImin2:ixImax2,ixImin3:ixImax3,3)=rnode(rpdx3_,&
igrid)
else
! for all non-cartesian and stretched cartesian coordinates
delx(ixImin1:ixImax1,ixImin2:ixImax2,ixImin3:ixImax3,&
1:ndim)=ps(igrid)%dx(ixImin1:ixImax1,ixImin2:ixImax2,ixImin3:ixImax3,&
1:ndim)
endif
do idims=1,ndim
hxOmin1=ixOmin1-kr(idims,1);hxOmin2=ixOmin2-kr(idims,2)
hxOmin3=ixOmin3-kr(idims,3);hxOmax1=ixOmax1-kr(idims,1)
hxOmax2=ixOmax2-kr(idims,2);hxOmax3=ixOmax3-kr(idims,3);
if(stagger_grid) then
! ct needs all transverse cells
ixCmax1=ixOmax1+nghostcells-nghostcells*kr(idims,1)
ixCmax2=ixOmax2+nghostcells-nghostcells*kr(idims,2)
ixCmax3=ixOmax3+nghostcells-nghostcells*kr(idims,3)
ixCmin1=hxOmin1-nghostcells+nghostcells*kr(idims,1)
ixCmin2=hxOmin2-nghostcells+nghostcells*kr(idims,2)
ixCmin3=hxOmin3-nghostcells+nghostcells*kr(idims,3);
else
! ixC is centered index in the idims direction from ixOmin-1/2 to ixOmax+1/2
ixCmax1=ixOmax1;ixCmax2=ixOmax2;ixCmax3=ixOmax3; ixCmin1=hxOmin1
ixCmin2=hxOmin2;ixCmin3=hxOmin3;
end if
! always xshift=0 or 1/2
xshift1=half*(one-kr(1,idims));xshift2=half*(one-kr(2,idims))
xshift3=half*(one-kr(3,idims));
do idims2=1,ndim
select case(idims2)
case(1)
do ix = ixCmin1,ixCmax1
! xshift=half: this is the cell center coordinate
! xshift=0: this is the cell edge i+1/2 coordinate
xC(ix,ixCmin2:ixCmax2,ixCmin3:ixCmax3,1)=x(ix,ixCmin2:ixCmax2,&
ixCmin3:ixCmax3,1)+(half-xshift1)*delx(ix,ixCmin2:ixCmax2,&
ixCmin3:ixCmax3,1)
end do
case(2)
do ix = ixCmin2,ixCmax2
! xshift=half: this is the cell center coordinate
! xshift=0: this is the cell edge i+1/2 coordinate
xC(ixCmin1:ixCmax1,ix,ixCmin3:ixCmax3,2)=x(ixCmin1:ixCmax1,ix,&
ixCmin3:ixCmax3,2)+(half-xshift2)*delx(ixCmin1:ixCmax1,ix,&
ixCmin3:ixCmax3,2)
end do
case(3)
do ix = ixCmin3,ixCmax3
! xshift=half: this is the cell center coordinate
! xshift=0: this is the cell edge i+1/2 coordinate
xC(ixCmin1:ixCmax1,ixCmin2:ixCmax2,ix,3)=x(ixCmin1:ixCmax1,&
ixCmin2:ixCmax2,ix,3)+(half-xshift3)*delx(ixCmin1:ixCmax1,&
ixCmin2:ixCmax2,ix,3)
end do
end select
end do
call set_B0_cell(ps(igrid)%B0(ixImin1:ixImax1,ixImin2:ixImax2,&
ixImin3:ixImax3,:,idims),xC,ixImin1,ixImin2,ixImin3,ixImax1,ixImax2,&
ixImax3,ixCmin1,ixCmin2,ixCmin3,ixCmax1,ixCmax2,ixCmax3)
end do
end subroutine set_B0_face