SROTMG Constructs the modified Givens transformation matrix which zeros the
second component of the 2-vector
With SPARAM(1)=SFLAG, has one of the following forms:
Locations 2-4 of SPARAM contain SH11, SH21, SH12 and SH22 respectively.
(Values of 1.0, -1.0, or 0.0 implied by the value of SPARAM(1) are not stored in SPARAM.)
The values of parameters GAMSQ and RGAMSQ may be inexact. This is OK as they are only
used for testing the size of DD1 and DD2. All actual scaling of data is done using GAM.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
real(kind=sp), | intent(inout) | :: | sd1 | |||
real(kind=sp), | intent(inout) | :: | sd2 | |||
real(kind=sp), | intent(inout) | :: | sx1 | |||
real(kind=sp), | intent(in) | :: | sy1 | |||
real(kind=sp), | intent(out) | :: | sparam(5) |
pure subroutine stdlib_srotmg(sd1,sd2,sx1,sy1,sparam) !! SROTMG Constructs the modified Givens transformation matrix \(H\) which zeros the !! second component of the 2-vector !! $$ \left[ {\sqrt{SD_1}\cdot SX_1,\sqrt{SD_2}\cdot SY_2} \right]^T. $$ !! With SPARAM(1)=SFLAG, \(H\) has one of the following forms: !! $$ H=\underbrace{\begin{bmatrix}SH_{11} & SD_{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}. $$ !! Locations 2-4 of SPARAM contain SH11, SH21, SH12 and SH22 respectively. !! (Values of 1.0, -1.0, or 0.0 implied by the value of SPARAM(1) are not stored in SPARAM.) !! The values of parameters GAMSQ and RGAMSQ may be inexact. This is OK as they are only !! used for testing the size of DD1 and DD2. All actual scaling of data is done using GAM. ! -- 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 real(sp), intent(inout) :: sd1, sd2, sx1 real(sp), intent(in) :: sy1 ! Array Arguments real(sp), intent(out) :: sparam(5) ! ===================================================================== ! Local Scalars real(sp) :: gam, gamsq, one, rgamsq, sflag, sh11, sh12, sh21, sh22, sp1, sp2, sq1, sq2,& stemp, su, two, zero ! Intrinsic Functions intrinsic :: abs ! Data Statements zero = 0.0_sp one = 1.0_sp two = 2.0_sp gam = 4096.0_sp gamsq = 1.67772e7_sp rgamsq = 5.96046e-8_sp if (sd1<zero) then ! go zero-h-d-and-sx1.. sflag = -one sh11 = zero sh12 = zero sh21 = zero sh22 = zero sd1 = zero sd2 = zero sx1 = zero else ! case-sd1-nonnegative sp2 = sd2*sy1 if (sp2==zero) then sflag = -two sparam(1) = sflag return end if ! regular-case.. sp1 = sd1*sx1 sq2 = sp2*sy1 sq1 = sp1*sx1 if (abs(sq1)>abs(sq2)) then sh21 = -sy1/sx1 sh12 = sp2/sp1 su = one - sh12*sh21 if (su>zero) then sflag = zero sd1 = sd1/su sd2 = sd2/su sx1 = sx1*su else ! this code path if here for safety. we do not expect this ! condition to ever hold except in edge cases with rounding ! errors. see doi: 10.1145/355841.355847 sflag = -one sh11 = zero sh12 = zero sh21 = zero sh22 = zero sd1 = zero sd2 = zero sx1 = zero end if else if (sq2<zero) then ! go zero-h-d-and-sx1.. sflag = -one sh11 = zero sh12 = zero sh21 = zero sh22 = zero sd1 = zero sd2 = zero sx1 = zero else sflag = one sh11 = sp1/sp2 sh22 = sx1/sy1 su = one + sh11*sh22 stemp = sd2/su sd2 = sd1/su sd1 = stemp sx1 = sy1*su end if end if ! procedure..scale-check if (sd1/=zero) then do while ((sd1<=rgamsq) .or. (sd1>=gamsq)) if (sflag==zero) then sh11 = one sh22 = one sflag = -one else sh21 = -one sh12 = one sflag = -one end if if (sd1<=rgamsq) then sd1 = sd1*gam**2 sx1 = sx1/gam sh11 = sh11/gam sh12 = sh12/gam else sd1 = sd1/gam**2 sx1 = sx1*gam sh11 = sh11*gam sh12 = sh12*gam end if enddo end if if (sd2/=zero) then do while ( (abs(sd2)<=rgamsq) .or. (abs(sd2)>=gamsq) ) if (sflag==zero) then sh11 = one sh22 = one sflag = -one else sh21 = -one sh12 = one sflag = -one end if if (abs(sd2)<=rgamsq) then sd2 = sd2*gam**2 sh21 = sh21/gam sh22 = sh22/gam else sd2 = sd2/gam**2 sh21 = sh21*gam sh22 = sh22*gam end if end do end if end if if (sflag<zero) then sparam(2) = sh11 sparam(3) = sh21 sparam(4) = sh12 sparam(5) = sh22 else if (sflag==zero) then sparam(3) = sh21 sparam(4) = sh12 else sparam(2) = sh11 sparam(5) = sh22 end if sparam(1) = sflag return end subroutine stdlib_srotmg