# Some iterative solvers do not accept subarray argument?

**URL:** <https://discourse.julialang.org/t/some-iterative-solvers-do-not-accept-subarray-argument/24855>\
**Category:** General Usage\
**Created:** [June 2, 2019, 4:30pm UTC](https://discourse.julialang.org/t/some-iterative-solvers-do-not-accept-subarray-argument/24855 "2019-06-02T16:30:10Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![LaurentPlagne](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/laurentplagne/32/10103_2.png) [@LaurentPlagne](https://discourse.julialang.org/u/LaurentPlagne)\
**Post date:** [June 2, 2019, 4:30pm UTC](https://discourse.julialang.org/t/some-iterative-solvers-do-not-accept-subarray-argument/24855/1 "2019-06-02T16:30:10Z")

</div>

Hi,  
I am surprised that `IterativeSolvers.gauss_seidel` can take `views` for vector arguments while `jacobi`, `sor` and `ssor` cannot. Any reason for this ?

```julia

function test()
    nx=ny=10
    dx=dy=2
    A=poissonSparse(nx,ny,dx,dy)
    x2D=ones(nx,ny)
    y2D=ones(nx,ny)
    xv=view(x2D,1:nx*ny)
    yv=view(y2D,1:nx*ny)
    h=1/nx
    w=2/(1+sin(π*h))

    IterativeSolvers.gauss_seidel!(xv,A,yv,maxiter=100) #OK

    # IterativeSolvers.jacobi!(xv,A,yv,maxiter=100) #KO
    # IterativeSolvers.ssor!(xv,A,yv,w,maxiter=100) #KO
    # IterativeSolvers.sor!(xv,A,yv,w,maxiter=100) #KO

    #OK if I use 1D vectors (not views)
    x1D=Vector{Float64}(undef,nx*ny)
    y1D=Vector{Float64}(undef,nx*ny)
    copyto!(x1D,xv)
    copyto!(y1D,yv)

    IterativeSolvers.jacobi!(x1D,A,y1D,maxiter=100) #OK
    IterativeSolvers.ssor!(x1D,A,y1D,w,maxiter=100) #OK
    IterativeSolvers.sor!(x1D,A,y1D,w,maxiter=100) #OK
end

```

Here is the

> **MWE**
>
> ```julia
> using LinearAlgebra
> using IterativeSolvers
> using SparseArrays
> 
> function l1dpαI(nx,dx,α)
> dxm2=1.0/(dx^2)
> D=ones(nx)
> D .*= 2(1+α)dxm2
> U=ones(nx-1)
> U .*= -1dxm2
> SymTridiagonal(D,U)
> end
> 
> function poissonSparse(nx,ny,dx,dy)
> Lx=l1dpαI(nx,dx,0.0)
> Ly=l1dpαI(ny,dy,0.0)
> 
> sp=spzeros(Float64,nx*ny,nx*ny)
> for i=1:nx
> for j=1:ny
> I=i+nx*(j-1)
> 
> sp[I,I]=Lx[i,i]
> i>1 && (sp[I,I-1]=Lx[i,i-1])
> i<nx && (sp[I,I+1]=Lx[i,i+1])
> end
> end
> for i=1:nx
> for j=1:ny
> I=i+nx*(j-1)
> 
> sp[I,I]+=Ly[j,j]
> j<ny && (sp[I,I+ny]+=Ly[j,j+1])
> j>1 && (sp[I,I-ny]+=Ly[j,j-1])
> end
> end
> sp
> end
> 
> function test()
> nx=ny=10
> dx=dy=2
> A=poissonSparse(nx,ny,dx,dy)
> x2D=ones(nx,ny)
> y2D=ones(nx,ny)
> xv=view(x2D,1:nx*ny)
> yv=view(y2D,1:nx*ny)
> h=1/nx
> w=2/(1+sin(π*h))
> 
> IterativeSolvers.gauss_seidel!(xv,A,yv,maxiter=100) #OK
> 
> # IterativeSolvers.jacobi!(xv,A,yv,maxiter=100) #OK
> # IterativeSolvers.ssor!(xv,A,yv,w,maxiter=100) #OK
> # IterativeSolvers.sor!(xv,A,yv,w,maxiter=100) #OK
> 
> x1D=Vector{Float64}(undef,nx*ny)
> y1D=Vector{Float64}(undef,nx*ny)
> copyto!(x1D,xv)
> copyto!(y1D,yv)
> 
> IterativeSolvers.jacobi!(x1D,A,y1D,maxiter=100) #KO
> IterativeSolvers.ssor!(x1D,A,y1D,w,maxiter=100) #KO
> IterativeSolvers.sor!(x1D,A,y1D,w,maxiter=100) #KO
> end
> 
> test()
> 
> ```
