1D padding operation
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(array_type), | intent(in), | target | :: | input | ||
| type(facets_type), | intent(in) | :: | facets | |||
| integer, | intent(in) | :: | pad_size | |||
| integer, | intent(in) | :: | imethod |
module function pad1d(input, facets, pad_size, imethod) result(output) !! 1D padding operation implicit none ! Arguments type(array_type), intent(in), target :: input type(facets_type), intent(in) :: facets integer, intent(in) :: pad_size integer, intent(in) :: imethod type(array_type), pointer :: output ! Local variables integer :: i, m, s integer :: idx_in, idx_out integer :: input_size, output_size integer, dimension(3) :: output_shape input_size = input%shape(1) output_size = input_size + 2 * pad_size output_shape = [ output_size, input%shape(2), size(input%val, dim=2) ] output => input%create_result(array_shape = output_shape) ! save the facet values to indices and adj_ja allocate(output%indices(2 + facets%num)) output%indices(1) = imethod output%indices(2) = pad_size output%indices(3) = facets%num allocate(output%adj_ja(2, 2 * facets%num)) do i = 1, facets%num output%adj_ja(1,(i-1)*2 + 1) = facets%orig_bound(1,1,i) output%adj_ja(2,(i-1)*2 + 1) = facets%dest_bound(1,1,i) output%adj_ja(1,(i-1)*2 + 2) = facets%orig_bound(2,1,i) output%adj_ja(2,(i-1)*2 + 2) = facets%dest_bound(2,1,i) end do ! Initialise with pad_value output%val = 0._real32 ! Copy input into the correct location in output do concurrent( & s = 1:output_shape(3), & m = 1:output_shape(2), & i = 1:input_size) idx_in = i + (m-1) * input_size idx_out = i + pad_size + (m-1) * output_size output%val(idx_out, s) = input%val(idx_in, s) end do if(output%indices(1) .ge. 3 .and. output%indices(1) .le. 5)then call fill_edge_region_1d( input, output ) end if output%get_partial_left => get_partial_pad1d output%get_partial_left_val => get_partial_pad1d_val if(input%requires_grad)then output%requires_grad = .true. output%is_forward = input%is_forward output%operation = 'pad' output%left_operand => input end if end function pad1d