You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
261 lines
6.4 KiB
261 lines
6.4 KiB
2 years ago
|
*> \brief \b SROTMG
|
||
|
*
|
||
|
* =========== DOCUMENTATION ===========
|
||
|
*
|
||
|
* Online html documentation available at
|
||
|
* http://www.netlib.org/lapack/explore-html/
|
||
|
*
|
||
|
* Definition:
|
||
|
* ===========
|
||
|
*
|
||
|
* SUBROUTINE SROTMG(SD1,SD2,SX1,SY1,SPARAM)
|
||
|
*
|
||
|
* .. Scalar Arguments ..
|
||
|
* REAL SD1,SD2,SX1,SY1
|
||
|
* ..
|
||
|
* .. Array Arguments ..
|
||
|
* REAL SPARAM(5)
|
||
|
* ..
|
||
|
*
|
||
|
*
|
||
|
*> \par Purpose:
|
||
|
* =============
|
||
|
*>
|
||
|
*> \verbatim
|
||
|
*>
|
||
|
*> CONSTRUCT THE MODIFIED GIVENS TRANSFORMATION MATRIX H WHICH ZEROS
|
||
|
*> THE SECOND COMPONENT OF THE 2-VECTOR (SQRT(SD1)*SX1,SQRT(SD2)*> SY2)**T.
|
||
|
*> WITH SPARAM(1)=SFLAG, H HAS ONE OF THE FOLLOWING FORMS..
|
||
|
*>
|
||
|
*> SFLAG=-1.E0 SFLAG=0.E0 SFLAG=1.E0 SFLAG=-2.E0
|
||
|
*>
|
||
|
*> (SH11 SH12) (1.E0 SH12) (SH11 1.E0) (1.E0 0.E0)
|
||
|
*> H=( ) ( ) ( ) ( )
|
||
|
*> (SH21 SH22), (SH21 1.E0), (-1.E0 SH22), (0.E0 1.E0).
|
||
|
*> LOCATIONS 2-4 OF SPARAM CONTAIN SH11,SH21,SH12, AND SH22
|
||
|
*> RESPECTIVELY. (VALUES OF 1.E0, -1.E0, OR 0.E0 IMPLIED BY THE
|
||
|
*> VALUE OF SPARAM(1) ARE NOT STORED IN SPARAM.)
|
||
|
*>
|
||
|
*> THE VALUES OF GAMSQ AND RGAMSQ SET IN THE DATA STATEMENT MAY BE
|
||
|
*> INEXACT. THIS IS OK AS THEY ARE ONLY USED FOR TESTING THE SIZE
|
||
|
*> OF SD1 AND SD2. ALL ACTUAL SCALING OF DATA IS DONE USING GAM.
|
||
|
*>
|
||
|
*> \endverbatim
|
||
|
*
|
||
|
* Arguments:
|
||
|
* ==========
|
||
|
*
|
||
|
*> \param[in,out] SD1
|
||
|
*> \verbatim
|
||
|
*> SD1 is REAL
|
||
|
*> \endverbatim
|
||
|
*>
|
||
|
*> \param[in,out] SD2
|
||
|
*> \verbatim
|
||
|
*> SD2 is REAL
|
||
|
*> \endverbatim
|
||
|
*>
|
||
|
*> \param[in,out] SX1
|
||
|
*> \verbatim
|
||
|
*> SX1 is REAL
|
||
|
*> \endverbatim
|
||
|
*>
|
||
|
*> \param[in] SY1
|
||
|
*> \verbatim
|
||
|
*> SY1 is REAL
|
||
|
*> \endverbatim
|
||
|
*>
|
||
|
*> \param[out] SPARAM
|
||
|
*> \verbatim
|
||
|
*> SPARAM is REAL array, dimension (5)
|
||
|
*> SPARAM(1)=SFLAG
|
||
|
*> SPARAM(2)=SH11
|
||
|
*> SPARAM(3)=SH21
|
||
|
*> SPARAM(4)=SH12
|
||
|
*> SPARAM(5)=SH22
|
||
|
*> \endverbatim
|
||
|
*
|
||
|
* Authors:
|
||
|
* ========
|
||
|
*
|
||
|
*> \author Univ. of Tennessee
|
||
|
*> \author Univ. of California Berkeley
|
||
|
*> \author Univ. of Colorado Denver
|
||
|
*> \author NAG Ltd.
|
||
|
*
|
||
|
*> \ingroup single_blas_level1
|
||
|
*
|
||
|
* =====================================================================
|
||
|
SUBROUTINE SROTMG(SD1,SD2,SX1,SY1,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 ..
|
||
|
REAL SD1,SD2,SX1,SY1
|
||
|
* ..
|
||
|
* .. Array Arguments ..
|
||
|
REAL SPARAM(5)
|
||
|
* ..
|
||
|
*
|
||
|
* =====================================================================
|
||
|
*
|
||
|
* .. Local Scalars ..
|
||
|
REAL GAM,GAMSQ,ONE,RGAMSQ,SFLAG,SH11,SH12,SH21,SH22,SP1,SP2,SQ1,
|
||
|
$ SQ2,STEMP,SU,TWO,ZERO
|
||
|
* ..
|
||
|
* .. Intrinsic Functions ..
|
||
|
INTRINSIC ABS
|
||
|
* ..
|
||
|
* .. Data statements ..
|
||
|
*
|
||
|
DATA ZERO,ONE,TWO/0.E0,1.E0,2.E0/
|
||
|
DATA GAM,GAMSQ,RGAMSQ/4096.E0,1.67772E7,5.96046E-8/
|
||
|
* ..
|
||
|
|
||
|
IF (SD1.LT.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.EQ.ZERO) THEN
|
||
|
SFLAG = -TWO
|
||
|
SPARAM(1) = SFLAG
|
||
|
RETURN
|
||
|
END IF
|
||
|
* REGULAR-CASE..
|
||
|
SP1 = SD1*SX1
|
||
|
SQ2 = SP2*SY1
|
||
|
SQ1 = SP1*SX1
|
||
|
*
|
||
|
IF (ABS(SQ1).GT.ABS(SQ2)) THEN
|
||
|
SH21 = -SY1/SX1
|
||
|
SH12 = SP2/SP1
|
||
|
*
|
||
|
SU = ONE - SH12*SH21
|
||
|
*
|
||
|
IF (SU.GT.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.LT.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.NE.ZERO) THEN
|
||
|
DO WHILE ((SD1.LE.RGAMSQ) .OR. (SD1.GE.GAMSQ))
|
||
|
IF (SFLAG.EQ.ZERO) THEN
|
||
|
SH11 = ONE
|
||
|
SH22 = ONE
|
||
|
SFLAG = -ONE
|
||
|
ELSE
|
||
|
SH21 = -ONE
|
||
|
SH12 = ONE
|
||
|
SFLAG = -ONE
|
||
|
END IF
|
||
|
IF (SD1.LE.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.NE.ZERO) THEN
|
||
|
DO WHILE ( (ABS(SD2).LE.RGAMSQ) .OR. (ABS(SD2).GE.GAMSQ) )
|
||
|
IF (SFLAG.EQ.ZERO) THEN
|
||
|
SH11 = ONE
|
||
|
SH22 = ONE
|
||
|
SFLAG = -ONE
|
||
|
ELSE
|
||
|
SH21 = -ONE
|
||
|
SH12 = ONE
|
||
|
SFLAG = -ONE
|
||
|
END IF
|
||
|
IF (ABS(SD2).LE.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.LT.ZERO) THEN
|
||
|
SPARAM(2) = SH11
|
||
|
SPARAM(3) = SH21
|
||
|
SPARAM(4) = SH12
|
||
|
SPARAM(5) = SH22
|
||
|
ELSE IF (SFLAG.EQ.ZERO) THEN
|
||
|
SPARAM(3) = SH21
|
||
|
SPARAM(4) = SH12
|
||
|
ELSE
|
||
|
SPARAM(2) = SH11
|
||
|
SPARAM(5) = SH22
|
||
|
END IF
|
||
|
|
||
|
SPARAM(1) = SFLAG
|
||
|
RETURN
|
||
|
*
|
||
|
* End of SROTMG
|
||
|
*
|
||
|
END
|