subroutine fill_subnode(igrid,active,jgrid,dir,xslice,normconv)
use mod_global_parameters
use mod_calculate_xw
integer, intent(in) :: igrid, dir
integer, intent(inout) :: jgrid
logical, intent(in) :: active
double precision, intent(in) :: xslice
double precision,dimension(0:nw+nwauxio),intent(out) :: normconv
! .. local ..
double precision, dimension(ixMlo1-1:ixMhi1,ixMlo2-1:ixMhi2,&
ixMlo3-1:ixMhi3,ndim) :: xC_TMP, xC
double precision, dimension(ixMlo1:ixMhi1,ixMlo2:ixMhi2,ixMlo3:ixMhi3,&
ndim) :: xCC_TMP, xCC
double precision, dimension(ixMlo1-1:ixMhi1,ixMlo2-1:ixMhi2,&
ixMlo3-1:ixMhi3,nw+nwauxio) :: wC_TMP
double precision, dimension(ixMlo1:ixMhi1,ixMlo2:ixMhi2,ixMlo3:ixMhi3,&
nw+nwauxio) :: wCC_TMP
double precision, dimension(ixGlo1:ixGhi1,ixGlo2:ixGhi2,&
ixGlo3:ixGhi3) :: x_save
integer :: ixslice, nwexpand, ixCmin1,ixCmin2,ixCmin3,&
ixCmax1,ixCmax2,ixCmax3, ixCCmin1,ixCCmin2,ixCCmin3,ixCCmax1,ixCCmax2,&
ixCCmax3
logical :: mask(ixGlo1:ixGhi1,ixGlo2:ixGhi2,ixGlo3:ixGhi3)
mask=.false.
! increase grid-count:
jgrid=jgrid+1
! Allocate subdim solution array:
if (ndim==1) then
nwexpand = nwauxio
else
if(slice_type/='dat')then
nwexpand = nwauxio
else
nwexpand = 0
endif
end if
call alloc_subnode(jgrid,dir,nwexpand)
call fill_subnode_info(igrid,jgrid,dir)
mask(ixMlo1:ixMhi1,ixMlo2:ixMhi2,ixMlo3:ixMhi3)=.true.
! Now hunt for the index closest to the slice:
select case (dir)
case (1)
ixslice = minloc(dabs(xslice-ps(igrid)%x(:,ixMlo2,ixMlo3,dir)),1,mask(:,&
ixMlo2,ixMlo3))
case (2)
ixslice = minloc(dabs(xslice-ps(igrid)%x(ixMlo1,:,ixMlo3,dir)),1,&
mask(ixMlo1,:,ixMlo3))
case (3)
ixslice = minloc(dabs(xslice-ps(igrid)%x(ixMlo1,ixMlo2,:,dir)),1,&
mask(ixMlo1,ixMlo2,:))
case default
call mpistop("slice direction not clear in fill_subnode")
end select
call calc_x(igrid,xC,xCC)
! Set the coordinate to be exactly on the slice:
xC(:,:,:,dir) = xslice
xCC(:,:,:,dir) = xslice
call calc_grid(unitslice,igrid,xC,xCC,xC_TMP,xCC_TMP,wC_TMP,wCC_TMP,&
normconv,ixCmin1,ixCmin2,ixCmin3,ixCmax1,ixCmax2,ixCmax3,ixCCmin1,&
ixCCmin2,ixCCmin3,ixCCmax1,ixCCmax2,ixCCmax3,.true.)
! CC stands for CellCenter
! C stands for Corner
! Fill the subdimensional solution and position array:
select case (dir)
case (1)
ps_sub(jgrid)%w(ixCCmin2:ixCCmax2,ixCCmin3:ixCCmax3,&
1:nw+nwexpand) = wCC_TMP(ixslice,ixCCmin2:ixCCmax2,ixCCmin3:ixCCmax3,&
1:nw+nwexpand)
ps_sub(jgrid)%x(ixCCmin2:ixCCmax2,ixCCmin3:ixCCmax3,&
1:ndim) = xCC_TMP(ixslice,ixCCmin2:ixCCmax2,ixCCmin3:ixCCmax3,&
1:ndim)
ps_sub(jgrid)%wC(ixCmin2:ixCmax2,ixCmin3:ixCmax3,&
1:nw+nwexpand) = wC_TMP(ixslice,ixCmin2:ixCmax2,ixCmin3:ixCmax3,&
1:nw+nwexpand)
ps_sub(jgrid)%xC(ixCmin2:ixCmax2,ixCmin3:ixCmax3,&
1:ndim) = xC_TMP(ixslice,ixCmin2:ixCmax2,ixCmin3:ixCmax3,1:ndim)
case (2)
ps_sub(jgrid)%w(ixCCmin1:ixCCmax1,ixCCmin3:ixCCmax3,&
1:nw+nwexpand) = wCC_TMP(ixCCmin1:ixCCmax1,ixslice,ixCCmin3:ixCCmax3,&
1:nw+nwexpand)
ps_sub(jgrid)%x(ixCCmin1:ixCCmax1,ixCCmin3:ixCCmax3,&
1:ndim) = xCC_TMP(ixCCmin1:ixCCmax1,ixslice,ixCCmin3:ixCCmax3,&
1:ndim)
ps_sub(jgrid)%wC(ixCmin1:ixCmax1,ixCmin3:ixCmax3,&
1:nw+nwexpand) = wC_TMP(ixCmin1:ixCmax1,ixslice,ixCmin3:ixCmax3,&
1:nw+nwexpand)
ps_sub(jgrid)%xC(ixCmin1:ixCmax1,ixCmin3:ixCmax3,&
1:ndim) = xC_TMP(ixCmin1:ixCmax1,ixslice,ixCmin3:ixCmax3,1:ndim)
case (3)
ps_sub(jgrid)%w(ixCCmin1:ixCCmax1,ixCCmin2:ixCCmax2,&
1:nw+nwexpand) = wCC_TMP(ixCCmin1:ixCCmax1,ixCCmin2:ixCCmax2,ixslice,&
1:nw+nwexpand)
ps_sub(jgrid)%x(ixCCmin1:ixCCmax1,ixCCmin2:ixCCmax2,&
1:ndim) = xCC_TMP(ixCCmin1:ixCCmax1,ixCCmin2:ixCCmax2,ixslice,&
1:ndim)
ps_sub(jgrid)%wC(ixCmin1:ixCmax1,ixCmin2:ixCmax2,&
1:nw+nwexpand) = wC_TMP(ixCmin1:ixCmax1,ixCmin2:ixCmax2,ixslice,&
1:nw+nwexpand)
ps_sub(jgrid)%xC(ixCmin1:ixCmax1,ixCmin2:ixCmax2,&
1:ndim) = xC_TMP(ixCmin1:ixCmax1,ixCmin2:ixCmax2,ixslice,1:ndim)
case default
call mpistop("slice direction not clear in fill_subnode")
end select
end subroutine fill_subnode