update_coarse Subroutine

private subroutine update_coarse(mg, lvl)

Arguments

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

Tree containing full grid

integer, intent(in) :: lvl

Update coarse values at lvl-1


Calls

proc~~update_coarse~3~~CallsGraph proc~update_coarse~3 update_coarse proc~mg_fill_ghost_cells_lvl~3 mg_fill_ghost_cells_lvl proc~update_coarse~3->proc~mg_fill_ghost_cells_lvl~3 proc~mg_restrict_lvl~3 mg_restrict_lvl proc~update_coarse~3->proc~mg_restrict_lvl~3 proc~residual_box~3 residual_box proc~update_coarse~3->proc~residual_box~3 proc~buffer_ghost_cells~3 buffer_ghost_cells proc~mg_fill_ghost_cells_lvl~3->proc~buffer_ghost_cells~3 proc~buffer_refinement_boundaries~3 buffer_refinement_boundaries proc~mg_fill_ghost_cells_lvl~3->proc~buffer_refinement_boundaries~3 proc~set_ghost_cells~3 set_ghost_cells proc~mg_fill_ghost_cells_lvl~3->proc~set_ghost_cells~3 proc~sort_and_transfer_buffers~3 sort_and_transfer_buffers proc~mg_fill_ghost_cells_lvl~3->proc~sort_and_transfer_buffers~3 proc~restrict_onto~3 restrict_onto proc~mg_restrict_lvl~3->proc~restrict_onto~3 proc~restrict_set_buffer~3 restrict_set_buffer proc~mg_restrict_lvl~3->proc~restrict_set_buffer~3 proc~mg_restrict_lvl~3->proc~sort_and_transfer_buffers~3 proc~buffer_for_nb~3 buffer_for_nb proc~buffer_ghost_cells~3->proc~buffer_for_nb~3 proc~buffer_for_fine_nb~3 buffer_for_fine_nb proc~buffer_refinement_boundaries~3->proc~buffer_for_fine_nb~3 proc~mg_has_children~3 mg_has_children proc~buffer_refinement_boundaries~3->proc~mg_has_children~3 proc~mg_get_child_offset~3 mg_get_child_offset proc~restrict_onto~3->proc~mg_get_child_offset~3 proc~mg_ix_to_ichild~3 mg_ix_to_ichild proc~restrict_set_buffer~3->proc~mg_ix_to_ichild~3 proc~bc_to_gc~3 bc_to_gc proc~set_ghost_cells~3->proc~bc_to_gc~3 proc~box_get_gc~3 box_get_gc proc~set_ghost_cells~3->proc~box_get_gc~3 proc~box_set_gc~3 box_set_gc proc~set_ghost_cells~3->proc~box_set_gc~3 proc~copy_from_nb~3 copy_from_nb proc~set_ghost_cells~3->proc~copy_from_nb~3 proc~fill_buffered_nb~3 fill_buffered_nb proc~set_ghost_cells~3->proc~fill_buffered_nb~3 proc~fill_refinement_bnd~3 fill_refinement_bnd proc~set_ghost_cells~3->proc~fill_refinement_bnd~3 mpi_waitall mpi_waitall proc~sort_and_transfer_buffers~3->mpi_waitall proc~mpi_irecv_wrapper mpi_irecv_wrapper proc~sort_and_transfer_buffers~3->proc~mpi_irecv_wrapper proc~mpi_isend_wrapper mpi_isend_wrapper proc~sort_and_transfer_buffers~3->proc~mpi_isend_wrapper proc~sort_sendbuf~3 sort_sendbuf proc~sort_and_transfer_buffers~3->proc~sort_sendbuf~3 proc~buffer_for_fine_nb~3->proc~mg_get_child_offset~3 proc~box_gc_for_fine_neighbor~3 box_gc_for_fine_neighbor proc~buffer_for_fine_nb~3->proc~box_gc_for_fine_neighbor~3 proc~box_gc_for_neighbor~3 box_gc_for_neighbor proc~buffer_for_nb~3->proc~box_gc_for_neighbor~3 proc~copy_from_nb~3->proc~box_set_gc~3 proc~copy_from_nb~3->proc~box_gc_for_neighbor~3 proc~fill_buffered_nb~3->proc~box_set_gc~3 proc~fill_refinement_bnd~3->proc~mg_get_child_offset~3 proc~fill_refinement_bnd~3->proc~box_gc_for_fine_neighbor~3 proc~sides_rb~3 sides_rb proc~fill_refinement_bnd~3->proc~sides_rb~3 mpi_irecv mpi_irecv proc~mpi_irecv_wrapper->mpi_irecv mpi_isend mpi_isend proc~mpi_isend_wrapper->mpi_isend interface~mrgrnk~3 mrgrnk proc~sort_sendbuf~3->interface~mrgrnk~3 proc~i_mrgrnk~3 I_mrgrnk interface~mrgrnk~3->proc~i_mrgrnk~3

Called by

proc~~update_coarse~3~~CalledByGraph proc~update_coarse~3 update_coarse proc~mg_fas_fmg~3 mg_fas_fmg proc~mg_fas_fmg~3->proc~update_coarse~3 proc~mg_fas_vcycle~3 mg_fas_vcycle proc~mg_fas_fmg~3->proc~mg_fas_vcycle~3 proc~mg_fas_vcycle~3->proc~update_coarse~3 proc~diffusion_solve_acoeff~3 diffusion_solve_acoeff proc~diffusion_solve_acoeff~3->proc~mg_fas_fmg~3 proc~diffusion_solve_acoeff~3->proc~mg_fas_vcycle~3 proc~diffusion_solve_vcoeff~3 diffusion_solve_vcoeff proc~diffusion_solve_vcoeff~3->proc~mg_fas_fmg~3 proc~diffusion_solve_vcoeff~3->proc~mg_fas_vcycle~3 proc~diffusion_solve~3 diffusion_solve proc~diffusion_solve~3->proc~mg_fas_fmg~3 proc~diffusion_solve~3->proc~mg_fas_vcycle~3

Source Code

  subroutine update_coarse(mg, lvl)
    type(mg_t), intent(inout) :: mg
    !< Tree containing full grid
    integer, intent(in)       :: lvl
    !< Update coarse values at lvl-1
    integer                   :: i, id, nc, nc_c

    nc   = mg%box_size_lvl(lvl)
    nc_c = mg%box_size_lvl(lvl-1)

    ! Compute residual
    do i = 1, size(mg%lvls(lvl)%my_ids)
       id = mg%lvls(lvl)%my_ids(i)
       call residual_box(mg, id, nc)
    end do

    ! Restrict phi and the residual
    call mg_restrict_lvl(mg, mg_iphi, lvl)
    call mg_restrict_lvl(mg, mg_ires, lvl)

    call mg_fill_ghost_cells_lvl(mg, lvl-1, mg_iphi)

    ! Set rhs_c = laplacian(phi_c) + restrict(res) where it is refined, and
    ! store current coarse phi in old.
    do i = 1, size(mg%lvls(lvl-1)%my_parents)
       id = mg%lvls(lvl-1)%my_parents(i)

       ! Set rhs = L phi
       call mg%box_op(mg, id, nc_c, mg_irhs)

       ! Add the fine grid residual to rhs
       mg%boxes(id)%cc(1:nc_c, 1:nc_c, 1:nc_c,&
           mg_irhs) = mg%boxes(id)%cc(1:nc_c, 1:nc_c, 1:nc_c,&
           mg_irhs) + mg%boxes(id)%cc(1:nc_c, 1:nc_c, 1:nc_c, mg_ires)

       ! Story a copy of phi
       mg%boxes(id)%cc(:, :, :, mg_iold) = mg%boxes(id)%cc(:, :, :, mg_iphi)
    end do
  end subroutine update_coarse