| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mg_t), | intent(inout) | :: | mg | |||
| type(mg_box_t), | intent(inout) | :: | box | |||
| integer, | intent(in) | :: | nc | |||
| integer, | intent(in) | :: | iv | |||
| integer, | intent(in) | :: | fine_id | |||
| integer, | intent(in) | :: | fine_rank | |||
| integer, | intent(in) | :: | nb | |||
| logical, | intent(in) | :: | dry_run |
subroutine buffer_for_fine_nb(mg, box, nc, iv, fine_id, fine_rank, nb,& dry_run) type(mg_t), intent(inout) :: mg type(mg_box_t), intent(inout) :: box integer, intent(in) :: nc integer, intent(in) :: iv integer, intent(in) :: fine_id integer, intent(in) :: fine_rank integer, intent(in) :: nb logical, intent(in) :: dry_run integer :: i, dsize, ix_offset(1) real(dp) :: gc(1) i = mg%buf(fine_rank)%i_send dsize = nc**(1-1) if (.not. dry_run) then ix_offset = mg_get_child_offset(mg, fine_id) call box_gc_for_fine_neighbor(box, nb, ix_offset, nc, iv, gc) mg%buf(fine_rank)%send(i+1:i+dsize) = pack(gc, .true.) end if ! Later the buffer is sorted, using the fact that loops go from low to high ! box id, and we fill ghost cells according to the neighbor order i = mg%buf(fine_rank)%i_ix if (.not. dry_run) then mg%buf(fine_rank)%ix(i+1) = mg_num_neighbors * fine_id + & mg_neighb_rev(nb) end if mg%buf(fine_rank)%i_send = mg%buf(fine_rank)%i_send + dsize mg%buf(fine_rank)%i_ix = mg%buf(fine_rank)%i_ix + 1 end subroutine buffer_for_fine_nb