Load balance all boxes in the multigrid tree, by simply distributing the load per grid level. This method will only work well for uniform grids.
Note that in a typical application the load balancing of the leaves is already determined, then mg_load_balance_parents can be used.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mg_t), | intent(inout) | :: | mg |
subroutine mg_load_balance_simple(mg) type(mg_t), intent(inout) :: mg integer :: i, id, lvl, single_cpu_lvl integer :: work_left, my_work, i_cpu ! Up to this level, all boxes have to be on a single processor because they ! have a different size and the communication routines do not support this single_cpu_lvl = max(mg%first_normal_lvl-1, mg%lowest_lvl) do lvl = mg%lowest_lvl, single_cpu_lvl do i = 1, size(mg%lvls(lvl)%ids) id = mg%lvls(lvl)%ids(i) mg%boxes(id)%rank = 0 end do end do ! Distribute the boxes equally. Due to the way the mesh is constructed, the ! mg%lvls(lvl)%ids array already contains a Morton-like ordering. do lvl = single_cpu_lvl+1, mg%highest_lvl work_left = size(mg%lvls(lvl)%ids) my_work = 0 i_cpu = 0 do i = 1, size(mg%lvls(lvl)%ids) if ((mg%n_cpu - i_cpu - 1) * my_work >= work_left) then i_cpu = i_cpu + 1 my_work = 0 end if my_work = my_work + 1 work_left = work_left - 1 id = mg%lvls(lvl)%ids(i) mg%boxes(id)%rank = i_cpu end do end do do lvl = mg%lowest_lvl, mg%highest_lvl call update_lvl_info(mg, mg%lvls(lvl)) end do end subroutine mg_load_balance_simple