s_compute_num_diags_non_uniform Subroutine

private subroutine s_compute_num_diags_non_uniform(self, kl, ku)

Arguments

Type IntentOptional Attributes Name
class(sll_t_spline_interpolator_1d), intent(in) :: self
integer, intent(out) :: kl
integer, intent(out) :: ku

Calls

proc~~s_compute_num_diags_non_uniform~~CallsGraph proc~s_compute_num_diags_non_uniform s_compute_num_diags_non_uniform find_cell find_cell proc~s_compute_num_diags_non_uniform->find_cell

Called by

proc~~s_compute_num_diags_non_uniform~~CalledByGraph proc~s_compute_num_diags_non_uniform s_compute_num_diags_non_uniform proc~s_spline_interpolator_1d__init sll_t_spline_interpolator_1d%s_spline_interpolator_1d__init proc~s_spline_interpolator_1d__init->proc~s_compute_num_diags_non_uniform

Source Code

  subroutine s_compute_num_diags_non_uniform( self, kl, ku )
    class(sll_t_spline_interpolator_1d), intent(in   ) :: self
    integer                            , intent(  out) :: kl
    integer                            , intent(  out) :: ku

    integer  :: i,j,s,d,icell
    real(wp) :: x

    ku = 0
    kl = 0

    associate( nbasis   => self % bspl % nbasis, &
               degree   => self % bspl % degree, &
               nbc_xmin => self % nbc_xmin     , &
               nbc_xmax => self % nbc_xmax )

      if (self%bc_xmin == sll_p_periodic) then

        do i = 1, nbasis
          x = self % tau(i)
          icell = self % bspl % find_cell( x )
          do s = 1, degree+1
            j = modulo(icell-self%bspl%offset-2+s,nbasis)+1
            d = j-i
            if (d >  nbasis/2) then; d = d-nbasis; else &
            if (d < -nbasis/2) then; d = d+nbasis; end if
            ku = max( ku,  d )
            kl = max( kl, -d )
          end do
        end do

      else

        do i = nbc_xmin+1, nbasis-nbc_xmax
          x = self % tau(i-nbc_xmin)
          icell = self % bspl % find_cell( x )
          do s = 1, degree+1
            j = icell-1+s
            d = j-i
            ku = max( ku,  d )
            kl = max( kl, -d )
          end do
        end do
        ! FIXME: In Hermite case ku and kl computed in general case where
        !        derivatives of B-splines do not vanish at boundary
        ku = ku + nbc_xmin
        kl = kl + nbc_xmax

      end if

    end associate

  end subroutine s_compute_num_diags_non_uniform