submodule(specialmatrices_circulant) circulant_matvecs implicit none(type, external) contains module procedure spmv integer(ilp) :: i y = x y = real(ifft(fft(cmplx(y, kind=dp), A%n)*A%c_hat, A%n))/A%n end procedure spmv module procedure spmvs integer(ilp) :: i y = x do concurrent(i=1:size(x, 2)) y(:, i) = matmul(A, x(:, i)) end do end procedure spmvs end submodule circulant_matvecs