! -*- f90 -*-
! Signatures for f2py-wrappers of FORTRAN LEVEL 2 BLAS functions.
!
! Author: Pearu Peterson
! Created: Jan-Feb 2002
!
!XXX: make beta and y optional in hemv,symv similarly to gemv

subroutine <tchar=s,d,c,z>gemv(m,n,alpha,a,x,beta,y,offx,incx,offy,incy,trans,rows,cols,ly)
  ! y = gemv(alpha,a,x,beta=0,y=0,offx=0,incx=1,offy=0,incy=0,trans=0)
  ! Calculate y <- alpha * op(A) * x + beta * y

  callstatement (*f2py_func)((trans?(trans==2?"C":"T"):"N"),&m,&n,&alpha,a,&m,x+offx,&incx,&beta,y+offy,&incy)
  callprotoargument char*,int*,int*,<type_in_c>*,<type_in_c>*,int*,<type_in_c>*,int*,<type_in_c>*,<type_in_c>*,int*

  integer optional,intent(in),check(trans>=0 && trans <=2) :: trans = 0
  integer optional, intent(in),check(incx>0||incx<0) :: incx = 1
  integer optional, intent(in),check(incy>0||incy<0) :: incy = 1
  <type_in> intent(in) :: alpha
  <type_in> intent(in),optional :: beta = <type_convert=0.0>

  <type_in> dimension(*),intent(in) :: x
  <type_in> dimension(ly),intent(in,copy,out),depend(ly),optional :: y
  integer intent(hide),depend(incy,rows,offy) :: ly = (y_capi==Py_None?1+offy+(rows-1)*abs(incy):-1)
  <type_in> dimension(m,n),intent(in) :: a
  integer depend(a),intent(hide):: m = shape(a,0)
  integer depend(a),intent(hide):: n = shape(a,1)

  integer optional,intent(in) :: offx=0
  integer optional,intent(in) :: offy=0
  check(offx>=0 && offx<len(x)) :: x
  check(len(x)>offx+(cols-1)*abs(incx)) :: x
  depend(offx,cols,incx) :: x

  check(offy>=0 && offy<len(y)) :: y
  check(len(y)>offy+(rows-1)*abs(incy)) :: y
  depend(offy,rows,incy) :: y

  integer depend(m,n,trans),intent(hide) :: rows = (trans?n:m)
  integer depend(m,n,trans),intent(hide) :: cols = (trans?m:n)

end subroutine <tchar=s,d,c,z>gemv

subroutine <tchar=c,z>hemv(n,alpha,a,x,offx,incx,beta,y,offy,incy,lower)
  ! Calculate y <- alpha * A * x + beta * y, A is hermitian

  callstatement (*f2py_func)((lower?"L":"U"),&n,&alpha,a,&n,x+offx,&incx,&beta,y+offy,&incy)
  callprotoargument char*,int*,<type_in_c>*,<type_in_c>*,int*,<type_in_c>*,int*,<type_in_c>*,<type_in_c>*,int*

  integer optional,intent(in),check(lower==0||lower==1) :: lower = 0
  integer optional, intent(in),check(incx>0||incx<0) :: incx = 1
  integer optional, intent(in),check(incy>0||incy<0) :: incy = 1
  <type_in> intent(in) :: alpha,beta

  <type_in> dimension(*),intent(in) :: x
  <type_in> dimension(*),intent(in,copy,out) :: y
  <type_in> dimension(n,n),intent(in),check(shape(a,0)==shape(a,1)) :: a
  integer depend(a),intent(hide):: n = shape(a,0)

  integer optional,intent(in),depend(x) :: offx=0
  integer optional,intent(in),depend(y) :: offy=0
  check(offx>=0 && offx<len(x)) :: offx
  check(offy>=0 && offy<len(y)) :: offy

  check(len(x)>offx+(n-1)*abs(incx)) :: n
  check(len(y)>offy+(n-1)*abs(incy)) :: n
  depend(x,offx,incx,y,offy,incy) :: n

end subroutine <tchar=c,z>hemv

subroutine <tchar=s,d>symv(n,alpha,a,x,offx,incx,beta,y,offy,incy,lower)
  ! Calculate y <- alpha * A * x + beta * y, A is symmetric

  callstatement (*f2py_func)((lower?"L":"U"),&n,&alpha,a,&n,x+offx,&incx,&beta,y+offy,&incy)
  callprotoargument char*,int*,<type_in_c>*,<type_in_c>*,int*,<type_in_c>*,int*,<type_in_c>*,<type_in_c>*,int*

  integer optional,intent(in),check(lower==0||lower==1) :: lower = 0
  integer optional, intent(in),check(incx>0||incx<0) :: incx = 1
  integer optional, intent(in),check(incy>0||incy<0) :: incy = 1
  <type_in> intent(in) :: alpha,beta

  <type_in> dimension(*),intent(in) :: x
  <type_in> dimension(*),intent(in,copy,out) :: y
  <type_in> dimension(n,n),intent(in),check(shape(a,0)==shape(a,1)) :: a
  integer depend(a),intent(hide):: n = shape(a,0)

  integer optional,intent(in),depend(x) :: offx=0
  integer optional,intent(in),depend(y) :: offy=0
  check(offx>=0 && offx<len(x)) :: offx
  check(offy>=0 && offy<len(y)) :: offy

  check(len(x)>offx+(n-1)*abs(incx)) :: n
  check(len(y)>offy+(n-1)*abs(incy)) :: n
  depend(x,offx,incx,y,offy,incy) :: n

end subroutine <tchar=s,d>symv

subroutine <tchar=s,d,c,z>trmv(n,a,x,offx,incx,lower,trans,unitdiag)
  ! Calculate x <- op(A) * x, A is triangular

  callstatement (*f2py_func)((lower?"L":"U"),(trans?(trans==2?"C":"T"):"N"),(unitdiag?"U":"N"),&n,a,&n,x+offx,&incx)
  callprotoargument char*,char*,char*,int*,<type_in_c>*,int*,<type_in_c>*,int*

  integer optional,intent(in),check(trans>=0 && trans <=2) :: trans = 0
  integer optional,intent(in),check(lower==0||lower==1) :: lower = 0
  integer optional,intent(in),check(unitdiag==0||unitdiag==1) :: unitdiag = 0

  integer optional, intent(in),check(incx>0||incx<0) :: incx = 1

  <type_in> dimension(*),intent(in,out,copy) :: x
  <type_in> dimension(n,n),intent(in),check(shape(a,0)==shape(a,1)) :: a
  integer depend(a),intent(hide):: n = shape(a,0)

  integer optional,intent(in),depend(x) :: offx=0
  check(offx>=0 && offx<len(x)) :: offx

  check(len(x)>offx+(n-1)*abs(incx)) :: n
  depend(x,offx,incx) :: n

end subroutine <tchar=s,d,c,z>trmv

subroutine <tchar=s,d>ger(m,n,alpha,x,incx,y,incy,a,lda)
! a = ger(alpha,x,y,incx=1,incy=1,a=0,overwrite_x=1,overwrite_y=1,overwrite_a=0)
! Calculate a <- alpha*x*y^T + a
    integer intent(hide),depend(x) :: m = len(x)
    integer intent(hide),depend(y) :: n = len(y)
    <type_in> intent(in) :: alpha
    <type_in> dimension(m),intent(in,overwrite) :: x
    integer optional,intent(in),check(incx==1||incx==-1) :: incx = 1
    <type_in> dimension(n),intent(in,overwrite) :: y
    integer optional,intent(in),check(incy==1||incy==-1) :: incy = 1
    <type_in> dimension(m,n),intent(in,out,copy),optional :: a = <type_convert=0>
    integer intent(hide), depend(m) :: lda=m
end subroutine <tchar=s,d>ger

subroutine <tchar=c,z>geru(m,n,alpha,x,incx,y,incy,a,lda)
! a = ger(alpha,x,y,incx=1,incy=1,a=0,overwrite_x=1,overwrite_y=1,overwrite_a=0)
! Calculate a <- alpha*x*y^T + a
    integer intent(hide),depend(x) :: m = len(x)
    integer intent(hide),depend(y) :: n = len(y)
    <type_in> intent(in) :: alpha
    <type_in> dimension(m),intent(in,overwrite) :: x
    integer optional,intent(in),check(incx==1||incx==-1) :: incx = 1
    <type_in> dimension(n),intent(in,overwrite) :: y
    integer optional,intent(in),check(incy==1||incy==-1) :: incy = 1
    <type_in> dimension(m,n),intent(in,out,copy),optional :: a = <type_convert=0>
    integer intent(hide), depend(m) :: lda=m
end subroutine <tchar=c,z>geru


subroutine <tchar=c,z>gerc(m,n,alpha,x,incx,y,incy,a,lda)
! a = ger(alpha,x,y,incx=1,incy=1,a=0,overwrite_x=1,overwrite_y=1,overwrite_a=0)
! Calculate a <- alpha*x*y^H + a
    integer intent(hide),depend(x) :: m = len(x)
    integer intent(hide),depend(y) :: n = len(y)
    <type_in> intent(in) :: alpha
    <type_in> dimension(m),intent(in,overwrite) :: x
    integer optional,intent(in),check(incx==1||incx==-1) :: incx = 1
    <type_in> dimension(n),intent(in,overwrite) :: y
    integer optional,intent(in),check(incy==1||incy==-1) :: incy = 1
    <type_in> dimension(m,n),intent(in,out,copy),optional :: a = <type_convert=0>
    integer intent(hide), depend(m) :: lda=m
end subroutine <tchar=c,z>gerc
