! 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