mg_ghost_cell_buffer_size Subroutine

public subroutine mg_ghost_cell_buffer_size(mg, n_send, n_recv, dsize)

Specify minimum buffer size (per process) for communication

Arguments

Type IntentOptional 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

Calls

proc~~mg_ghost_cell_buffer_size~2~~CallsGraph proc~mg_ghost_cell_buffer_size~2 mg_ghost_cell_buffer_size proc~buffer_ghost_cells~2 buffer_ghost_cells proc~mg_ghost_cell_buffer_size~2->proc~buffer_ghost_cells~2 proc~buffer_refinement_boundaries~2 buffer_refinement_boundaries proc~mg_ghost_cell_buffer_size~2->proc~buffer_refinement_boundaries~2 proc~set_ghost_cells~2 set_ghost_cells proc~mg_ghost_cell_buffer_size~2->proc~set_ghost_cells~2 proc~buffer_for_nb~2 buffer_for_nb proc~buffer_ghost_cells~2->proc~buffer_for_nb~2 proc~buffer_for_fine_nb~2 buffer_for_fine_nb proc~buffer_refinement_boundaries~2->proc~buffer_for_fine_nb~2 proc~mg_has_children~2 mg_has_children proc~buffer_refinement_boundaries~2->proc~mg_has_children~2 proc~bc_to_gc~2 bc_to_gc proc~set_ghost_cells~2->proc~bc_to_gc~2 proc~box_get_gc~2 box_get_gc proc~set_ghost_cells~2->proc~box_get_gc~2 proc~box_set_gc~2 box_set_gc proc~set_ghost_cells~2->proc~box_set_gc~2 proc~copy_from_nb~2 copy_from_nb proc~set_ghost_cells~2->proc~copy_from_nb~2 proc~fill_buffered_nb~2 fill_buffered_nb proc~set_ghost_cells~2->proc~fill_buffered_nb~2 proc~fill_refinement_bnd~2 fill_refinement_bnd proc~set_ghost_cells~2->proc~fill_refinement_bnd~2 proc~box_gc_for_fine_neighbor~2 box_gc_for_fine_neighbor proc~buffer_for_fine_nb~2->proc~box_gc_for_fine_neighbor~2 proc~mg_get_child_offset~2 mg_get_child_offset proc~buffer_for_fine_nb~2->proc~mg_get_child_offset~2 proc~box_gc_for_neighbor~2 box_gc_for_neighbor proc~buffer_for_nb~2->proc~box_gc_for_neighbor~2 proc~copy_from_nb~2->proc~box_set_gc~2 proc~copy_from_nb~2->proc~box_gc_for_neighbor~2 proc~fill_buffered_nb~2->proc~box_set_gc~2 proc~fill_refinement_bnd~2->proc~box_gc_for_fine_neighbor~2 proc~fill_refinement_bnd~2->proc~mg_get_child_offset~2 proc~sides_rb~2 sides_rb proc~fill_refinement_bnd~2->proc~sides_rb~2

Called by

proc~~mg_ghost_cell_buffer_size~2~~CalledByGraph proc~mg_ghost_cell_buffer_size~2 mg_ghost_cell_buffer_size proc~mg_allocate_storage~2 mg_allocate_storage proc~mg_allocate_storage~2->proc~mg_ghost_cell_buffer_size~2

Source Code

  subroutine mg_ghost_cell_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                   :: i, id, lvl, nc

    allocate(mg%comm_ghostcell%n_send(0:mg%n_cpu-1,&
        mg%first_normal_lvl:mg%highest_lvl))
    allocate(mg%comm_ghostcell%n_recv(0:mg%n_cpu-1,&
        mg%first_normal_lvl:mg%highest_lvl))

    dsize = mg%box_size**(1-1)

    do lvl = mg%first_normal_lvl, mg%highest_lvl
       nc               = mg%box_size_lvl(lvl)
       mg%buf(:)%i_send = 0
       mg%buf(:)%i_recv = 0
       mg%buf(:)%i_ix   = 0

       do i = 1, size(mg%lvls(lvl)%my_ids)
          id = mg%lvls(lvl)%my_ids(i)
          call buffer_ghost_cells(mg, id, nc, 1, dry_run=.true.)
       end do

       if (lvl > 1) then
          do i = 1, size(mg%lvls(lvl-1)%my_ref_bnds)
             id = mg%lvls(lvl-1)%my_ref_bnds(i)
             call buffer_refinement_boundaries(mg, id, nc, 1, dry_run=.true.)
          end do
       end if

       ! Set ghost cells to received data
       mg%buf(:)%i_recv = 0
       do i = 1, size(mg%lvls(lvl)%my_ids)
          id = mg%lvls(lvl)%my_ids(i)
          call set_ghost_cells(mg, id, nc, 1, dry_run=.true.)
       end do

       mg%comm_ghostcell%n_send(:, lvl) = mg%buf(:)%i_send/dsize
       mg%comm_ghostcell%n_recv(:, lvl) = mg%buf(:)%i_recv/dsize
    end do

    n_send = maxval(mg%comm_ghostcell%n_send, dim=2)
    n_recv = maxval(mg%comm_ghostcell%n_recv, dim=2)
  end subroutine mg_ghost_cell_buffer_size