Look up and store the iglo index and responsible processor for connections to the left and right of each local iglo index. Note this is only interested in passing particles and the non-trapped wfb. Trapped particles are considered to have no connections.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
integer, | intent(in), | dimension(:, :) | :: | itleft | ||
integer, | intent(in), | dimension(:, :) | :: | itright | ||
type(connections_type), | intent(out), | dimension(g_lo%llim_proc:) | :: | connections |
subroutine compute_connections(itleft, itright, connections)
use gs2_layouts, only: g_lo, il_idx, ik_idx, it_idx, ie_idx, is_idx, proc_id, idx
use le_grids, only: il_is_trapped, il_is_wfb, trapped_wfb
implicit none
integer, dimension(:, :), intent(in) :: itleft, itright
type(connections_type), dimension(g_lo%llim_proc:), intent(out) :: connections
integer :: iglo, il, ik, it, ie, is, iglo_connection
! Note connections_type have initial values reflecting no connections
! so we don't need to explicitly populate every instance.
!$OMP PARALLEL DO DEFAULT(none) &
!$OMP PRIVATE(iglo, il, ik, it, ie, is, iglo_connection) &
!$OMP SHARED(g_lo, itleft, itright, connections, trapped_wfb) &
!$OMP SCHEDULE(static)
do iglo = g_lo%llim_proc, g_lo%ulim_proc
! get processors and indices for j' (kx') modes connecting
! to mode j (kx) so we can set up communication -- MAB
il = il_idx(g_lo,iglo)
! if non-wfb trapped particle, no connections
! or if wfb is trapped, no connections
if (il_is_trapped(il) .or. (il_is_wfb(il) .and. trapped_wfb)) cycle
ik = ik_idx(g_lo,iglo)
it = it_idx(g_lo,iglo)
! If no links then cycle
if (itleft(it, ik) < 0 .and. itright(it, ik) < 0) cycle
ie = ie_idx(g_lo,iglo)
is = is_idx(g_lo,iglo)
if (itleft(it, ik) >= 0) then
iglo_connection = idx(g_lo, ik, itleft(it, ik), il, ie, is)
connections(iglo)%iproc_left = proc_id(g_lo, iglo_connection)
connections(iglo)%iglo_left = iglo_connection
connections(iglo)%neighbor = .true.
end if
if (itright(it, ik) >= 0) then
iglo_connection = idx(g_lo, ik, itright(it, ik), il, ie, is)
connections(iglo)%iproc_right = proc_id(g_lo, iglo_connection)
connections(iglo)%iglo_right = iglo_connection
connections(iglo)%neighbor = .true.
end if
end do
!$OMP END PARALLEL DO
end subroutine compute_connections