mg_fill_ghost_cells_lvl Subroutine

public subroutine mg_fill_ghost_cells_lvl(mg, lvl, iv)

Fill ghost cells at a grid level

Arguments

Type IntentOptional Attributes Name
type(mg_t) :: mg
integer, intent(in) :: lvl
integer, intent(in) :: iv

Index of variable


Calls

proc~~mg_fill_ghost_cells_lvl~~CallsGraph proc~mg_fill_ghost_cells_lvl mg_fill_ghost_cells_lvl proc~buffer_ghost_cells buffer_ghost_cells proc~mg_fill_ghost_cells_lvl->proc~buffer_ghost_cells proc~buffer_refinement_boundaries buffer_refinement_boundaries proc~mg_fill_ghost_cells_lvl->proc~buffer_refinement_boundaries proc~set_ghost_cells set_ghost_cells proc~mg_fill_ghost_cells_lvl->proc~set_ghost_cells proc~sort_and_transfer_buffers sort_and_transfer_buffers proc~mg_fill_ghost_cells_lvl->proc~sort_and_transfer_buffers 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 mpi_waitall mpi_waitall proc~sort_and_transfer_buffers->mpi_waitall proc~mpi_irecv_wrapper mpi_irecv_wrapper proc~sort_and_transfer_buffers->proc~mpi_irecv_wrapper proc~mpi_isend_wrapper mpi_isend_wrapper proc~sort_and_transfer_buffers->proc~mpi_isend_wrapper proc~sort_sendbuf sort_sendbuf proc~sort_and_transfer_buffers->proc~sort_sendbuf 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 mpi_irecv mpi_irecv proc~mpi_irecv_wrapper->mpi_irecv mpi_isend mpi_isend proc~mpi_isend_wrapper->mpi_isend interface~mrgrnk mrgrnk proc~sort_sendbuf->interface~mrgrnk proc~i_mrgrnk I_mrgrnk interface~mrgrnk->proc~i_mrgrnk

Called by

proc~~mg_fill_ghost_cells_lvl~~CalledByGraph proc~mg_fill_ghost_cells_lvl mg_fill_ghost_cells_lvl proc~mg_fas_fmg mg_fas_fmg proc~mg_fas_fmg->proc~mg_fill_ghost_cells_lvl proc~mg_fas_vcycle mg_fas_vcycle proc~mg_fas_fmg->proc~mg_fas_vcycle proc~update_coarse update_coarse proc~mg_fas_fmg->proc~update_coarse proc~mg_fas_vcycle->proc~mg_fill_ghost_cells_lvl proc~smooth_boxes smooth_boxes proc~mg_fas_vcycle->proc~smooth_boxes proc~mg_fas_vcycle->proc~update_coarse proc~mg_fill_ghost_cells mg_fill_ghost_cells proc~mg_fill_ghost_cells->proc~mg_fill_ghost_cells_lvl proc~smooth_boxes->proc~mg_fill_ghost_cells_lvl proc~update_coarse->proc~mg_fill_ghost_cells_lvl proc~diffusion_solve diffusion_solve proc~diffusion_solve->proc~mg_fas_fmg proc~diffusion_solve->proc~mg_fas_vcycle proc~diffusion_solve_acoeff diffusion_solve_acoeff proc~diffusion_solve_acoeff->proc~mg_fas_fmg proc~diffusion_solve_acoeff->proc~mg_fas_vcycle proc~diffusion_solve_vcoeff diffusion_solve_vcoeff proc~diffusion_solve_vcoeff->proc~mg_fas_fmg proc~diffusion_solve_vcoeff->proc~mg_fas_vcycle

Source Code

  subroutine mg_fill_ghost_cells_lvl(mg, lvl, iv)

    type(mg_t)                   :: mg
    integer, intent(in)          :: lvl
    integer, intent(in)          :: iv
    !< Index of variable
    integer                      :: i, id, dsize, nc

    if (lvl < mg%lowest_lvl) error stop "fill_ghost_cells_lvl: lvl < lowest_lvl"
    if (lvl > mg%highest_lvl) error stop "fill_ghost_cells_lvl: lvl > highest_lvl"

    nc               = mg%box_size_lvl(lvl)

    if (lvl >= mg%first_normal_lvl) then
       dsize            = nc**(2-1)
       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, iv, .false.)
       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, iv, .false.)
          end do
       end if

       ! Transfer data between processes
       mg%buf(:)%i_recv = mg%comm_ghostcell%n_recv(:, lvl) * dsize
       call sort_and_transfer_buffers(mg, dsize)

       ! Set ghost cells to received data
       mg%buf(:)%i_recv = 0
    end if

    do i = 1, size(mg%lvls(lvl)%my_ids)
       id = mg%lvls(lvl)%my_ids(i)
       call set_ghost_cells(mg, id, nc, iv, .false.)
    end do
  end subroutine mg_fill_ghost_cells_lvl