subroutine integrate_subnode(igrid,jgrid,dir)
use mod_forest, only: tree_node_ptr, igrid_to_node
use mod_global_parameters
integer, intent(in) :: igrid, jgrid, dir
! .. local ..
type(tree_node_ptr) :: tree
integer :: nx1,nx2,nx3
integer :: ig1,ig2,ig3, level, ig1targetmin,&
ig2targetmin,ig3targetmin, ig1targetmax,ig2targetmax,ig3targetmax
integer :: ix1targetmin,ix1targetmax,&
ix2targetmin,ix2targetmax,ix3targetmin,ix3targetmax, idim1targetmin,&
idim1targetmax,idim2targetmin,idim2targetmax,idim3targetmin,idim3targetmax
integer :: ixMdimlo1,ixMdimlo2,ixMdimlo3,&
ixMdimhi1,ixMdimhi2,ixMdimhi3, ix1orig,ix2orig,ix3orig, ix1,ix2,ix3
integer :: igdim1,igdim2
!-----------------------------------------------------------------------------
tree%node => igrid_to_node(igrid, mype)%node
ig1 = tree%node%ig1; ig2 = tree%node%ig2; ig3 = tree%node%ig3;
level = tree%node%level
! number of cells per grid.
nx1=ixMhi1-ixMlo1+1;nx2=ixMhi2-ixMlo2+1;nx3=ixMhi3-ixMlo3+1;
! assumes uniform cartesian grid with factor 2 refinement per dimension
if (level > collapseLevel) then
ig1targetmin = int(dble(ig1-1)/2.0d0**(level-collapseLevel))+1
ig1targetmax = ig1targetmin
else if (level < collapseLevel) then
ig1targetmin = int(2.0d0**(collapseLevel-level))*(ig1-1)+1
ig1targetmax = int(2.0d0**(collapseLevel-level))*ig1
else
ig1targetmin = ig1
ig1targetmax = ig1
end if
ix1targetmin = nx1*(ig1targetmin-1)+1
ix1targetmax = nx1*ig1targetmax
if (level > collapseLevel) then
ig2targetmin = int(dble(ig2-1)/2.0d0**(level-collapseLevel))+1
ig2targetmax = ig2targetmin
else if (level < collapseLevel) then
ig2targetmin = int(2.0d0**(collapseLevel-level))*(ig2-1)+1
ig2targetmax = int(2.0d0**(collapseLevel-level))*ig2
else
ig2targetmin = ig2
ig2targetmax = ig2
end if
ix2targetmin = nx2*(ig2targetmin-1)+1
ix2targetmax = nx2*ig2targetmax
if (level > collapseLevel) then
ig3targetmin = int(dble(ig3-1)/2.0d0**(level-collapseLevel))+1
ig3targetmax = ig3targetmin
else if (level < collapseLevel) then
ig3targetmin = int(2.0d0**(collapseLevel-level))*(ig3-1)+1
ig3targetmax = int(2.0d0**(collapseLevel-level))*ig3
else
ig3targetmin = ig3
ig3targetmax = ig3
end if
ix3targetmin = nx3*(ig3targetmin-1)+1
ix3targetmax = nx3*ig3targetmax
select case(dir)
case (1)
igdim1=(ig2-1)*nx2
igdim2=(ig3-1)*nx3
idim1targetmin=ix2targetmin;idim1targetmax=ix2targetmax;
idim2targetmin=ix3targetmin;idim2targetmax=ix3targetmax;
ixMdimlo1=ixMlo2;ixMdimhi1=ixMhi2;
ixMdimlo2=ixMlo3;ixMdimhi2=ixMhi3;
case (2)
igdim1=(ig1-1)*nx1
igdim2=(ig3-1)*nx3
idim1targetmin=ix1targetmin;idim1targetmax=ix1targetmax;
idim2targetmin=ix3targetmin;idim2targetmax=ix3targetmax;
ixMdimlo1=ixMlo1;ixMdimhi1=ixMhi1;
ixMdimlo2=ixMlo3;ixMdimhi2=ixMhi3;
case (3)
igdim1=(ig1-1)*nx1
igdim2=(ig2-1)*nx2
idim1targetmin=ix1targetmin;idim1targetmax=ix1targetmax;
idim2targetmin=ix2targetmin;idim2targetmax=ix2targetmax;
ixMdimlo1=ixMlo1;ixMdimhi1=ixMhi1;
ixMdimlo2=ixMlo2;ixMdimhi2=ixMhi2;
case default
call mpistop("slice direction not clear in integrate_subnode")
end select
if (level >= collapseLevel) then
do ix1orig = ixMdimlo1,ixMdimhi1
do ix2orig = ixMdimlo2,ixMdimhi2
ix1 = int(dble(ix1orig-nghostcells+igdim1-1)*2.0d0**(collapseLevel-level))+1
ix2 = int(dble(ix2orig-nghostcells+igdim2-1)*2.0d0**(collapseLevel-level))+1
collapsedData(ix1,ix2,1:nw+nwauxio) = collapsedData(ix1,ix2,&
1:nw+nwauxio) + ps_sub(jgrid)%w(ix1orig,ix2orig,&
1:nw+nwauxio) / 2.0d0**(2*(level-collapseLevel))
end do
end do
else
do ix1 = idim1targetmin,idim1targetmax
do ix2 = idim2targetmin,idim2targetmax
ix1orig = int(dble(ix1-idim1targetmin)/2.0d0**(collapseLevel-level))+1+&
nghostcells
ix2orig = int(dble(ix2-idim2targetmin)/2.0d0**(collapseLevel-level))+1+&
nghostcells
collapsedData(ix1,ix2,1:nw+nwauxio) = collapsedData(ix1,ix2,&
1:nw+nwauxio) + ps_sub(jgrid)%w(ix1orig,ix2orig,1:nw+nwauxio)
enddo
enddo
end if
end subroutine integrate_subnode