subroutine sfresvec(q,a,b,vec,eigv,nvec,rnorm,ndsr)
use precision, only: dp
implicit none
real(kind=dp), intent(out), dimension(:,:) :: q
real(kind=dp), intent(in), dimension(:,:) :: a, b
real(kind=dp), intent(inout), dimension(:,:) :: vec
real(kind=dp), intent(in), dimension(:) :: eigv
integer, intent(in) :: nvec
real(kind=dp), intent(out), dimension(:) :: rnorm
integer, intent(in) :: ndsr
integer :: ist, xvec_dim
xvec_dim = ubound(q, 1)
call dgemm('n','n',xvec_dim,ndsr,nvec, &
1.0_dp,b,xvec_dim, &
vec,nvec, &
0.0_dp,q,xvec_dim)
do ist = 1, ndsr
vec(:,ist) = -vec(:,ist)*eigv(ist)
end do
call dgemm('n','n',xvec_dim,ndsr,nvec, &
1.0_dp,a,xvec_dim, &
vec,nvec, &
1.0_dp,q,xvec_dim)
do ist = 1, ndsr
rnorm(ist) = dot_product(q(:,ist),q(:,ist))
end do
end subroutine sfresvec