!
! This file is part of SACAMOS, State of the Art CAble MOdels for Spice. 
! It was developed by the University of Nottingham and the Netherlands Aerospace 
! Centre (NLR) for ESA under contract number 4000112765/14/NL/HK.
! 
! Copyright (C) 2016-2018 University of Nottingham
! 
! SACAMOS is free software: you can redistribute it and/or modify it under the 
! terms of the GNU General Public License as published by the Free Software 
! Foundation, either version 3 of the License, or (at your option) any later 
! version.
! 
! SACAMOS is distributed in the hope that it will be useful, but 
! WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
! or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License 
! for more details.
! 
! A copy of the GNU General Public License version 3 can be found in the 
! file GNU_GPL_v3 in the root or at <http://www.gnu.org/licenses/>.
! 
! SACAMOS uses the EISPACK library (in /SRC/EISPACK). EISPACK is subject to 
! the GNU Lesser General Public License. A copy of the GNU Lesser General Public 
! License version can be found in the file GNU_LGPL in the root of EISPACK 
! (/SRC/EISPACK ) or at <http://www.gnu.org/licenses/>.
! 
! The University of Nottingham can be contacted at: ggiemr@nottingham.ac.uk
!
!
! File Contents:
! 
!     SUBROUTINE Aprod
!     SUBROUTINE ATprod
!     SUBROUTINE zAprod
!     SUBROUTINE zATprod
!
! NAME
!     SUBROUTINE Aprod
!
! DESCRIPTION
!     Matrix vector multiplication for sparse, real matrices
!
! COMMENTS
!     
!
! HISTORY
!    19/3/2018 CJS 
!
!
SUBROUTINE Aprod ( n, x, y )

! form the vector y=K*x

USE type_specifications

IMPLICIT NONE

integer n
real(dp) :: x(n), y(n)

integer :: i,row,col

! START

y(:)=0d0

do i=1,n_entry
  row=i_K(i)
  col=j_K(i)
  
!  if (row.GT.n) then
!    write(*,*)'Error in Aprod, row=',row,' n=',n
!  end if
!  if (col.GT.n) then
!    write(*,*)'Error in Aprod, col=',col,' n=',n
!  end if
  
  y(row)=y(row)+s_K_re(i)*x(col)
  
end do

RETURN

END SUBROUTINE Aprod 
!
! NAME
!     SUBROUTINE ATprod
!
! DESCRIPTION
!     Transpose Matrix vector multiplication for sparse, real matrices
!
! COMMENTS
!     
!
! HISTORY
!    19/3/2018 CJS 
!
!
SUBROUTINE ATprod ( n, x, y )

! form the vector y=AT*x

USE type_specifications

IMPLICIT NONE

integer n
real(dp) :: x(n), y(n)

integer :: i,row,col

! START

y(:)=0d0

do i=1,n_entry
  row=j_K(i)
  col=i_K(i)
    
  y(row)=y(row)+s_K_re(i)*x(col)
  
end do

RETURN

END SUBROUTINE ATprod 
!
! NAME
!     SUBROUTINE zAprod
!
! DESCRIPTION
!     Matrix vector multiplication for sparse, real matrices
!
! COMMENTS
!     
!
! HISTORY
!    19/3/2018 CJS 
!
!
SUBROUTINE zAprod ( n, x, y )

! form the vector y=A*x

USE type_specifications

IMPLICIT NONE

integer n
complex(dp) :: x(n), y(n)

integer :: i,row,col

! START

y(:)=0d0

do i=1,n_entry
  row=i_K(i)
  col=j_K(i)
  
  y(row)=y(row)+s_K(i)*x(col)
  
end do

RETURN

END SUBROUTINE zAprod 
!     
! NAME
!     SUBROUTINE zATprod
!
! DESCRIPTION
!     Transpose Matrix vector multiplication for sparse, real matrices
!
! COMMENTS
!     
!
! HISTORY
!    19/3/2018 CJS 
!
!
SUBROUTINE zATprod ( n, x, y )

! form the vector y=AT*x

USE type_specifications

IMPLICIT NONE

integer n
complex(dp) :: x(n), y(n)

integer :: i,row,col

! START

y(:)=0d0

do i=1,n_entry
  row=j_K(i)
  col=i_K(i)
    
  y(row)=y(row)+(s_K(i))*x(col)
  
end do

RETURN

END SUBROUTINE zATprod 
