Specify minimum buffer size (per process) for communication
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mg_t), | intent(inout) | :: | mg | |||
| integer, | intent(out) | :: | n_send(0:mg%n_cpu-1) | |||
| integer, | intent(out) | :: | n_recv(0:mg%n_cpu-1) | |||
| integer, | intent(out) | :: | dsize |
subroutine mg_prolong_buffer_size(mg, n_send, n_recv, dsize) type(mg_t), intent(inout) :: mg integer, intent(out) :: n_send(0:mg%n_cpu-1) integer, intent(out) :: n_recv(0:mg%n_cpu-1) integer, intent(out) :: dsize integer :: lvl, min_lvl if (.not. allocated(mg%comm_restrict%n_send)) then error stop "Call restrict_buffer_size before prolong_buffer_size" end if min_lvl = max(mg%first_normal_lvl-1, mg%lowest_lvl) allocate(mg%comm_prolong%n_send(0:mg%n_cpu-1, min_lvl:mg%highest_lvl)) allocate(mg%comm_prolong%n_recv(0:mg%n_cpu-1, min_lvl:mg%highest_lvl)) mg%comm_prolong%n_recv(:, mg%highest_lvl) = 0 mg%comm_prolong%n_send(:, mg%highest_lvl) = 0 do lvl = min_lvl, mg%highest_lvl-1 mg%comm_prolong%n_recv(:, lvl) = mg%comm_restrict%n_send(:, lvl+1) mg%comm_prolong%n_send(:, lvl) = mg%comm_restrict%n_recv(:, lvl+1) end do ! Send fine grid points, because this is more flexible than sending coarse ! grid points (e.g., when multiple variables are used for interpolation) dsize = (mg%box_size)**2 n_send = maxval(mg%comm_prolong%n_send, dim=2) n_recv = maxval(mg%comm_prolong%n_recv, dim=2) end subroutine mg_prolong_buffer_size