mg_allocate_storage Subroutine

public subroutine mg_allocate_storage(mg)

Allocate communication buffers and local boxes for a tree that has already been created

Arguments

Type IntentOptional Attributes Name
type(mg_t), intent(inout) :: mg

Calls

proc~~mg_allocate_storage~2~~CallsGraph proc~mg_allocate_storage~2 mg_allocate_storage proc~mg_ghost_cell_buffer_size~2 mg_ghost_cell_buffer_size proc~mg_allocate_storage~2->proc~mg_ghost_cell_buffer_size~2 proc~mg_prolong_buffer_size~2 mg_prolong_buffer_size proc~mg_allocate_storage~2->proc~mg_prolong_buffer_size~2 proc~mg_restrict_buffer_size~2 mg_restrict_buffer_size proc~mg_allocate_storage~2->proc~mg_restrict_buffer_size~2 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

Source Code

  subroutine mg_allocate_storage(mg)

    type(mg_t), intent(inout) :: mg
    integer                   :: i, id, lvl, nc
    integer                   :: n_send(0:mg%n_cpu-1, 3)
    integer                   :: n_recv(0:mg%n_cpu-1, 3)
    integer                   :: dsize(3)
    integer                   :: n_in, n_out, n_id

    if (.not. mg%tree_created) error stop "allocate_storage: tree is not yet created"

    if (mg%is_allocated) error stop "allocate_storage: tree is already allocated"

    do lvl = mg%lowest_lvl, mg%highest_lvl
       nc = mg%box_size_lvl(lvl)
       do i = 1, size(mg%lvls(lvl)%my_ids)
          id = mg%lvls(lvl)%my_ids(i)
          allocate(mg%boxes(id)%cc(0:nc+1, mg_num_vars + mg%n_extra_vars))

          ! Set all initial values to zero
          mg%boxes(id)%cc(:, :) = 0.0_dp
       end do
    end do

    allocate(mg%buf(0:mg%n_cpu-1))

    call mg_ghost_cell_buffer_size(mg, n_send(:, 1), n_recv(:, 1), dsize(1))
    call mg_restrict_buffer_size(mg, n_send(:, 2), n_recv(:, 2), dsize(2))
    call mg_prolong_buffer_size(mg, n_send(:, 3), n_recv(:, 3), dsize(3))

    do i = 0, mg%n_cpu-1
       n_out = maxval(n_send(i, :) * dsize(:))
       n_in = maxval(n_recv(i, :) * dsize(:))
       n_id = maxval(n_send(i, :))
       allocate(mg%buf(i)%send(n_out))
       allocate(mg%buf(i)%recv(n_in))
       allocate(mg%buf(i)%ix(n_id))
    end do

    mg%is_allocated = .true.
  end subroutine mg_allocate_storage