Generate a multigrid tree that includes the amrvac tree, but also contains coarser grid levels. A number of checks has already been performed in mg_setup_multigrid, so we don't repeat these checks here.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mg_t), | intent(inout) | :: | mg |
subroutine mg_tree_from_amrvac(mg) use mod_forest use mod_global_parameters type(mg_t), intent(inout) :: mg integer :: i, n, id, ix(ndim) integer :: n_boxes_total, i_c, c_id, c_ix(ndim) integer :: min_lvl, lvl integer :: nb, nb_ix, nb_dim integer :: n_finer type(tree_node), pointer :: pnode, pnode_ch type(tree_node_ptr), allocatable :: id_to_node(:) real(dp) :: dr_coarse ! Estimate number of finer blocks n_finer = nparents+nleafs call mg_build_rectangle(mg, [ domain_nx1,domain_nx2,domain_nx3 ],& block_nx1, dx(:,1), [ xprobmin1,xprobmin2,xprobmin3 ], periodB,& n_finer) mg%highest_lvl = levmax n_boxes_total = mg%n_boxes + n_finer ! To link the two trees allocate(id_to_node(n_boxes_total)) ! Link base level do i = 1, size(mg%lvls(1)%ids) id = mg%lvls(1)%ids(i) ix = mg%boxes(id)%ix pnode => tree_root(ix(1),ix(2),ix(3))%node pnode%id = id id_to_node(id)%node => pnode mg%boxes(id)%rank = pnode%ipe end do ! Add refinement do lvl = 1, mg%highest_lvl do i = 1, size(mg%lvls(lvl)%ids) id = mg%lvls(lvl)%ids(i) pnode => id_to_node(id)%node if (.not. pnode%leaf) then call mg_add_children(mg, id) do i_c = 1, mg_num_children c_id = mg%boxes(id)%children(i_c) c_ix = mg_child_dix(:, i_c) + 1 pnode_ch => pnode%child(c_ix(1),c_ix(2),c_ix(3))%node id_to_node(c_id)%node => pnode_ch pnode_ch%id = c_id mg%boxes(c_id)%rank = pnode_ch%ipe end do end if end do call mg_set_leaves_parents(mg%boxes, mg%lvls(lvl)) if (lvl < mg%highest_lvl) then call mg_set_next_level_ids(mg, lvl) call mg_set_neighbors_lvl(mg, lvl+1) end if end do ! Store boxes with refinement boundaries (from the coarse side) do lvl = 1, mg%highest_lvl call mg_set_refinement_boundaries(mg%boxes, mg%lvls(lvl)) end do ! Assign boxes to MPI processes call mg_load_balance_parents(mg) ! Allocate storage for boxes owned by this process call mg_allocate_storage(mg) if (associated(mg_after_new_tree)) then call mg_after_new_tree() end if end subroutine mg_tree_from_amrvac