subroutine alloc_buffers_c(self, nwgc, &
ixS_r_min1, ixS_r_max1, &
ixS_r_min2, ixS_r_max2, &
ixS_r_min3, ixS_r_max3, &
ixR_p_min1, ixR_p_max1, &
ixR_p_min2, ixR_p_max2, &
ixR_p_min3, ixR_p_max3 &
)
! neighbor is coarse
! required buffers:
! send: psc(ixS_r_) with indices type_send_r
! receive: psc(ixR_p_) with indices type_recv_p
class(nbprocs_info_t) :: self
integer, intent(in) :: nwgc
integer, dimension(-1:1,-1:1), intent(in) :: &
ixS_r_min1, ixS_r_max1, &
ixS_r_min2, ixS_r_max2, &
ixS_r_min3, ixS_r_max3
integer, dimension(-1:1,0:3), intent(in) :: &
ixR_p_min1, ixR_p_max1, &
ixR_p_min2, ixR_p_max2, &
ixR_p_min3, ixR_p_max3
! .. local ..
integer :: inb, isize_S, isize_R
integer :: igrid, i1, i2, i3
integer :: inc1, inc2, inc3
integer :: iib1, iib2, iib3, ibuf_start
integer :: ixSmin1, ixSmin2, ixSmin3
integer :: ixRmin1, ixRmin2, ixRmin3
integer :: ixSmax1, ixSmax2, ixSmax3
integer :: ixRmax1, ixRmax2, ixRmax3
self%imaxigrids_c = 0
do inb = 1, self%nbprocs_c
self%imaxigrids_c = max(self%course_nb(inb)%info%nigrids, self%imaxigrids_c)
isize_S = 0; isize_R = 0; ibuf_start = 1
do igrid = 1, self%course_nb(inb)%info%nigrids
iib1 = idphyb(1,self%course_nb(inb)%info%igrid(igrid))
iib2 = idphyb(2,self%course_nb(inb)%info%igrid(igrid))
iib3 = idphyb(3,self%course_nb(inb)%info%igrid(igrid))
i1 = self%course_nb(inb)%info%i1(igrid)
i2 = self%course_nb(inb)%info%i2(igrid)
i3 = self%course_nb(inb)%info%i3(igrid)
inc1 = self%course_nb(inb)%info%inc1(igrid)
inc2 = self%course_nb(inb)%info%inc2(igrid)
inc3 = self%course_nb(inb)%info%inc3(igrid)
ixSmin1=ixS_r_min1(iib1,i1);ixSmin2=ixS_r_min2(iib2,i2)
ixSmin3=ixS_r_min3(iib3,i3);ixSmax1=ixS_r_max1(iib1,i1)
ixSmax2=ixS_r_max2(iib2,i2);ixSmax3=ixS_r_max3(iib3,i3)
ixRmin1=ixR_p_min1(iib1,inc1);ixRmin2=ixR_p_min2(iib2,inc2)
ixRmin3=ixR_p_min3(iib3,inc3);ixRmax1=ixR_p_max1(iib1,inc1)
ixRmax2=ixR_p_max2(iib2,inc2);ixRmax3=ixR_p_max3(iib3,inc3)
isize_S = isize_S + (ixSmax1-ixSmin1+1) * (ixSmax2-ixSmin2+1) * (ixSmax3-ixSmin3+1)
isize_R = isize_R + (ixRmax1-ixRmin1+1) * (ixRmax2-ixRmin2+1) * (ixRmax3-ixRmin3+1)
self%course_nb(inb)%info%ibuf_start(igrid) = ibuf_start
self%course_nb(inb)%info%isize(igrid) = (ixSmax1-ixSmin1+1) * (ixSmax2-ixSmin2+1) * (ixSmax3-ixSmin3+1) * nwgc
ibuf_start = ibuf_start + self%course_nb(inb)%info%isize(igrid)
end do
self%course_nb(inb)%rcv%size = isize_R*nwgc
self%course_nb(inb)%send%size = isize_S*nwgc
self%course_nb(inb)%info_send%size = 5 * self%course_nb(inb)%info%nigrids
self%course_nb(inb)%info_rcv%size = 5 * self%course_nb(inb)%info%nigrids
allocate(self%course_nb(inb)%rcv%buffer(isize_R * nwgc))
allocate(self%course_nb(inb)%send%buffer(isize_S * nwgc))
allocate(self%course_nb(inb)%info_rcv%buffer(5 * self%course_nb(inb)%info%nigrids))
allocate(self%course_nb(inb)%info_send%buffer(5 * self%course_nb(inb)%info%nigrids))
end do
end subroutine alloc_buffers_c