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~~CallsGraph proc~mg_allocate_storage mg_allocate_storage proc~mg_ghost_cell_buffer_size mg_ghost_cell_buffer_size proc~mg_allocate_storage->proc~mg_ghost_cell_buffer_size proc~mg_prolong_buffer_size mg_prolong_buffer_size proc~mg_allocate_storage->proc~mg_prolong_buffer_size proc~mg_restrict_buffer_size mg_restrict_buffer_size proc~mg_allocate_storage->proc~mg_restrict_buffer_size proc~buffer_ghost_cells buffer_ghost_cells proc~mg_ghost_cell_buffer_size->proc~buffer_ghost_cells proc~buffer_refinement_boundaries buffer_refinement_boundaries proc~mg_ghost_cell_buffer_size->proc~buffer_refinement_boundaries proc~set_ghost_cells set_ghost_cells proc~mg_ghost_cell_buffer_size->proc~set_ghost_cells proc~buffer_for_nb buffer_for_nb proc~buffer_ghost_cells->proc~buffer_for_nb proc~buffer_for_fine_nb buffer_for_fine_nb proc~buffer_refinement_boundaries->proc~buffer_for_fine_nb proc~mg_has_children mg_has_children proc~buffer_refinement_boundaries->proc~mg_has_children proc~bc_to_gc bc_to_gc proc~set_ghost_cells->proc~bc_to_gc proc~box_get_gc box_get_gc proc~set_ghost_cells->proc~box_get_gc proc~box_set_gc box_set_gc proc~set_ghost_cells->proc~box_set_gc proc~copy_from_nb copy_from_nb proc~set_ghost_cells->proc~copy_from_nb proc~fill_buffered_nb fill_buffered_nb proc~set_ghost_cells->proc~fill_buffered_nb proc~fill_refinement_bnd fill_refinement_bnd proc~set_ghost_cells->proc~fill_refinement_bnd proc~box_gc_for_fine_neighbor box_gc_for_fine_neighbor proc~buffer_for_fine_nb->proc~box_gc_for_fine_neighbor proc~mg_get_child_offset mg_get_child_offset proc~buffer_for_fine_nb->proc~mg_get_child_offset proc~box_gc_for_neighbor box_gc_for_neighbor proc~buffer_for_nb->proc~box_gc_for_neighbor proc~copy_from_nb->proc~box_set_gc proc~copy_from_nb->proc~box_gc_for_neighbor proc~fill_buffered_nb->proc~box_set_gc proc~fill_refinement_bnd->proc~box_gc_for_fine_neighbor proc~fill_refinement_bnd->proc~mg_get_child_offset proc~sides_rb sides_rb proc~fill_refinement_bnd->proc~sides_rb

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, 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