build root forest
subroutine init_forest_root use mod_forest use mod_global_parameters use mod_space_filling_curve use mod_amr_solution_node, only: getnode use mod_amr_neighbors, only: find_root_neighbor integer :: ig1,ig2,ig3, level, igrid, ipe integer :: iside, i1,i2,i3, Morton_no, isfc level=1 Morton_no=0 ipe=0 nparents=0 nleafs=ng1(1)*ng2(1)*ng3(1) nleafs_active=nleafs nleafs_level(1)=ng1(1)*ng2(1)*ng3(1) nleafs_level(2:nlevelshi)=0 call get_Morton_range ! Generate Morton-order space-filling curve to connect level 1 blocks call level1_Morton_order do isfc=1,nglev1 ig1=sfc_iglevel1(1,isfc) ig2=sfc_iglevel1(2,isfc) ig3=sfc_iglevel1(3,isfc) Morton_no=Morton_no+1 if (Morton_no>Morton_stop(ipe)) ipe=ipe+1 igrid=getnode(ipe) if (ipe==mype) then sfc_to_igrid(Morton_no)=igrid igrid_to_sfc(igrid)=Morton_no end if call init_tree_leaf(tree_root(ig1,ig2,ig3),ig1,ig2,ig3,level,igrid,ipe,& .true.) end do ! update root neighbor do ig3=1,ng3(1) do ig2=1,ng2(1) do ig1=1,ng1(1) do iside=1,2 i1=kr(1,1)*(2*iside-3);i2=kr(2,1)*(2*iside-3) i3=kr(3,1)*(2*iside-3); call find_root_neighbor(tree_root(ig1,ig2,ig3)%node%neighbor(iside,& 1), tree_root(ig1,ig2,ig3),i1,i2,i3) end do do iside=1,2 i1=kr(1,2)*(2*iside-3);i2=kr(2,2)*(2*iside-3) i3=kr(3,2)*(2*iside-3); call find_root_neighbor(tree_root(ig1,ig2,ig3)%node%neighbor(iside,& 2), tree_root(ig1,ig2,ig3),i1,i2,i3) end do do iside=1,2 i1=kr(1,3)*(2*iside-3);i2=kr(2,3)*(2*iside-3) i3=kr(3,3)*(2*iside-3); call find_root_neighbor(tree_root(ig1,ig2,ig3)%node%neighbor(iside,& 3), tree_root(ig1,ig2,ig3),i1,i2,i3) end do end do end do end do ! This call is here to ensure the sfc array is initialized call amr_Morton_order() end subroutine init_forest_root