SROTM applies the modified Givens transformation, , to the 2-by-N matrix
where indicates transpose. The elements of are in
SX(LX+IINCX), I = 0:N-1, where LX = 1 if INCX >= 0, else LX = (-INCX)N,
and similarly for SY using LY and INCY.
With SPARAM(1)=SFLAG, has one of the following forms:
See SROTMG for a description of data storage in SPARAM.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
integer(kind=ilp), | intent(in) | :: | n | |||
real(kind=sp), | intent(inout) | :: | sx(*) | |||
integer(kind=ilp), | intent(in) | :: | incx | |||
real(kind=sp), | intent(inout) | :: | sy(*) | |||
integer(kind=ilp), | intent(in) | :: | incy | |||
real(kind=sp), | intent(in) | :: | sparam(5) |
pure subroutine stdlib_srotm(n,sx,incx,sy,incy,sparam) !! SROTM applies the modified Givens transformation, \(H\), to the 2-by-N matrix !! $$ \left[ \begin{array}{c}SX^T\\SY^T\\ \end{array} \right], $$ !! where \(^T\) indicates transpose. The elements of \(SX\) are in !! SX(LX+I*INCX), I = 0:N-1, where LX = 1 if INCX >= 0, else LX = (-INCX)*N, !! and similarly for SY using LY and INCY. !! With SPARAM(1)=SFLAG, \(H\) has one of the following forms: !! $$ H=\underbrace{\begin{bmatrix}SH_{11} & SH_{12}\\SH_{21} & SH_{22}\end{bmatrix}}_{SFLAG=-1}, !! \underbrace{\begin{bmatrix}1 & SH_{12}\\SH_{21} & 1\end{bmatrix}}_{SFLAG=0}, !! \underbrace{\begin{bmatrix}SH_{11} & 1\\-1 & SH_{22}\end{bmatrix}}_{SFLAG=1}, !! \underbrace{\begin{bmatrix}1 & 0\\0 & 1\end{bmatrix}}_{SFLAG=-2}. $$ !! See SROTMG for a description of data storage in SPARAM. ! -- reference blas level1 routine -- ! -- reference blas is a software package provided by univ. of tennessee, -- ! -- univ. of california berkeley, univ. of colorado denver and nag ltd..-- ! Scalar Arguments integer(ilp), intent(in) :: incx, incy, n ! Array Arguments real(sp), intent(in) :: sparam(5) real(sp), intent(inout) :: sx(*), sy(*) ! ===================================================================== ! Local Scalars real(sp) :: sflag, sh11, sh12, sh21, sh22, two, w, z, zero integer(ilp) :: i, kx, ky, nsteps ! Data Statements zero = 0.0_sp two = 2.0_sp sflag = sparam(1) if (n<=0 .or. (sflag+two==zero)) return if (incx==incy.and.incx>0) then nsteps = n*incx if (sflag<zero) then sh11 = sparam(2) sh12 = sparam(4) sh21 = sparam(3) sh22 = sparam(5) do i = 1,nsteps,incx w = sx(i) z = sy(i) sx(i) = w*sh11 + z*sh12 sy(i) = w*sh21 + z*sh22 end do else if (sflag==zero) then sh12 = sparam(4) sh21 = sparam(3) do i = 1,nsteps,incx w = sx(i) z = sy(i) sx(i) = w + z*sh12 sy(i) = w*sh21 + z end do else sh11 = sparam(2) sh22 = sparam(5) do i = 1,nsteps,incx w = sx(i) z = sy(i) sx(i) = w*sh11 + z sy(i) = -w + sh22*z end do end if else kx = 1 ky = 1 if (incx<0) kx = 1 + (1-n)*incx if (incy<0) ky = 1 + (1-n)*incy if (sflag<zero) then sh11 = sparam(2) sh12 = sparam(4) sh21 = sparam(3) sh22 = sparam(5) do i = 1,n w = sx(kx) z = sy(ky) sx(kx) = w*sh11 + z*sh12 sy(ky) = w*sh21 + z*sh22 kx = kx + incx ky = ky + incy end do else if (sflag==zero) then sh12 = sparam(4) sh21 = sparam(3) do i = 1,n w = sx(kx) z = sy(ky) sx(kx) = w + z*sh12 sy(ky) = w*sh21 + z kx = kx + incx ky = ky + incy end do else sh11 = sparam(2) sh22 = sparam(5) do i = 1,n w = sx(kx) z = sy(ky) sx(kx) = w*sh11 + z sy(ky) = -w + sh22*z kx = kx + incx ky = ky + incy end do end if end if return end subroutine stdlib_srotm