utils.f90 Source File


Source Code

submodule(specialmatrices_toeplitz) toeplitz_utilities
   implicit none(type, external)
contains
   module procedure dense_rdp
   integer(ilp) :: i, j, m, n
   real(dp), allocatable :: t(:)
   m = A%m; n = A%n; allocate (t(-(n - 1):m - 1)); allocate (B(m, n))
   t(:-1) = A%vr(n:2:-1)
   t(0:) = A%vc
   do concurrent(i=1:m, j=1:n)
      B(i, j) = t(i - j)
   end do
   end procedure dense_rdp

   module procedure transpose_rdp
   B = Toeplitz(A%vr, A%vc)
   end procedure transpose_rdp

   module procedure size_rdp
   if (present(dim)) then
      select case (dim)
      case (1)
         arr_size = A%m
      case (2)
         arr_size = A%n
      case default
         error stop "Matrix has only two dimensions."
      end select
   else
      arr_size = A%m*A%n
   end if
   end procedure size_rdp

   module procedure shape_rdp
   arr_shape = [A%m, A%n]
   end procedure shape_rdp

   module procedure scalar_multiplication_rdp
   B = Toeplitz(alpha*A%vc, alpha*A%vr)
   end procedure scalar_multiplication_rdp

   module procedure scalar_multiplication_bis_rdp
   B = Toeplitz(alpha*A%vc, alpha*A%vr)
   end procedure scalar_multiplication_bis_rdp

   module procedure Toeplitz2Circulant
   real(dp), allocatable :: c_vec(:)
   integer(ilp) :: m, n
   m = T%m; n = T%n; allocate (c_vec(m + n))
   c_vec(:m) = T%vc; c_vec(m + 1:) = cshift(T%vr(n:1:-1), -1)
   C = Circulant(c_vec)
   end procedure Toeplitz2Circulant
end submodule toeplitz_utilities