! This file is part of SACAMOS, State of the Art CAble MOdels in 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-2017 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 .
!
! 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 .
!
! 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