Fill edge region for 1D padding
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(array_type), | intent(in) | :: | input | |||
| type(array_type), | intent(inout) | :: | output |
subroutine fill_edge_region_1d(input, output) !! Fill edge region for 1D padding implicit none ! Arguments type(array_type), intent(in) :: input type(array_type), intent(inout) :: output ! Local variables integer :: i, m, s, f integer :: step, idx_in, idx_out integer :: input_size, output_size, pad_size input_size = input%shape(1) output_size = output%shape(1) pad_size = output%indices(2) do f = 1, output%indices(3) do concurrent( s = 1:size(output%val, dim=2), m = 1:output%shape(2) ) select case(output%indices(1)) case(3, 4) ! circular or reflection step = merge(1, -1, output%indices(1) .eq. 3) do i = 1, pad_size idx_in = output%adj_ja(1,(f-1)*2 + 1) + step * (i - 1) + & (m-1)*input_size idx_out = output%adj_ja(2,(f-1)*2 + 1) + i - 1 + & (m-1)*output_size output%val(idx_out, s) = input%val(idx_in, s) end do case(5) ! replication idx_in = output%adj_ja(1,(f-1)*2 + 1) + (m-1)*input_size do i = 1, pad_size idx_out = output%adj_ja(2,(f-1)*2 + 1) + i - 1 + & (m-1)*output_size output%val(idx_out, s) = input%val(idx_in, s) end do end select end do end do end subroutine fill_edge_region_1d