You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

srotmg.f 6.2 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. *> \brief \b SROTMG
  2. *
  3. * =========== DOCUMENTATION ===========
  4. *
  5. * Online html documentation available at
  6. * http://www.netlib.org/lapack/explore-html/
  7. *
  8. * Definition:
  9. * ===========
  10. *
  11. * SUBROUTINE SROTMG(SD1,SD2,SX1,SY1,SPARAM)
  12. *
  13. * .. Scalar Arguments ..
  14. * REAL SD1,SD2,SX1,SY1
  15. * ..
  16. * .. Array Arguments ..
  17. * REAL SPARAM(5)
  18. * ..
  19. *
  20. *
  21. *> \par Purpose:
  22. * =============
  23. *>
  24. *> \verbatim
  25. *>
  26. *> CONSTRUCT THE MODIFIED GIVENS TRANSFORMATION MATRIX H WHICH ZEROS
  27. *> THE SECOND COMPONENT OF THE 2-VECTOR (SQRT(SD1)*SX1,SQRT(SD2)*> SY2)**T.
  28. *> WITH SPARAM(1)=SFLAG, H HAS ONE OF THE FOLLOWING FORMS..
  29. *>
  30. *> SFLAG=-1.E0 SFLAG=0.E0 SFLAG=1.E0 SFLAG=-2.E0
  31. *>
  32. *> (SH11 SH12) (1.E0 SH12) (SH11 1.E0) (1.E0 0.E0)
  33. *> H=( ) ( ) ( ) ( )
  34. *> (SH21 SH22), (SH21 1.E0), (-1.E0 SH22), (0.E0 1.E0).
  35. *> LOCATIONS 2-4 OF SPARAM CONTAIN SH11,SH21,SH12, AND SH22
  36. *> RESPECTIVELY. (VALUES OF 1.E0, -1.E0, OR 0.E0 IMPLIED BY THE
  37. *> VALUE OF SPARAM(1) ARE NOT STORED IN SPARAM.)
  38. *>
  39. *> THE VALUES OF GAMSQ AND RGAMSQ SET IN THE DATA STATEMENT MAY BE
  40. *> INEXACT. THIS IS OK AS THEY ARE ONLY USED FOR TESTING THE SIZE
  41. *> OF SD1 AND SD2. ALL ACTUAL SCALING OF DATA IS DONE USING GAM.
  42. *>
  43. *> \endverbatim
  44. *
  45. * Arguments:
  46. * ==========
  47. *
  48. *> \param[in,out] SD1
  49. *> \verbatim
  50. *> SD1 is REAL
  51. *> \endverbatim
  52. *>
  53. *> \param[in,out] SD2
  54. *> \verbatim
  55. *> SD2 is REAL
  56. *> \endverbatim
  57. *>
  58. *> \param[in,out] SX1
  59. *> \verbatim
  60. *> SX1 is REAL
  61. *> \endverbatim
  62. *>
  63. *> \param[in] SY1
  64. *> \verbatim
  65. *> SY1 is REAL
  66. *> \endverbatim
  67. *>
  68. *> \param[out] SPARAM
  69. *> \verbatim
  70. *> SPARAM is REAL array, dimension (5)
  71. *> SPARAM(1)=SFLAG
  72. *> SPARAM(2)=SH11
  73. *> SPARAM(3)=SH21
  74. *> SPARAM(4)=SH12
  75. *> SPARAM(5)=SH22
  76. *> \endverbatim
  77. *
  78. * Authors:
  79. * ========
  80. *
  81. *> \author Univ. of Tennessee
  82. *> \author Univ. of California Berkeley
  83. *> \author Univ. of Colorado Denver
  84. *> \author NAG Ltd.
  85. *
  86. *> \date November 2017
  87. *
  88. *> \ingroup single_blas_level1
  89. *
  90. * =====================================================================
  91. SUBROUTINE SROTMG(SD1,SD2,SX1,SY1,SPARAM)
  92. *
  93. * -- Reference BLAS level1 routine (version 3.8.0) --
  94. * -- Reference BLAS is a software package provided by Univ. of Tennessee, --
  95. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  96. * November 2017
  97. *
  98. * .. Scalar Arguments ..
  99. REAL SD1,SD2,SX1,SY1
  100. * ..
  101. * .. Array Arguments ..
  102. REAL SPARAM(5)
  103. * ..
  104. *
  105. * =====================================================================
  106. *
  107. * .. Local Scalars ..
  108. REAL GAM,GAMSQ,ONE,RGAMSQ,SFLAG,SH11,SH12,SH21,SH22,SP1,SP2,SQ1,
  109. $ SQ2,STEMP,SU,TWO,ZERO
  110. * ..
  111. * .. Intrinsic Functions ..
  112. INTRINSIC ABS
  113. * ..
  114. * .. Data statements ..
  115. *
  116. DATA ZERO,ONE,TWO/0.E0,1.E0,2.E0/
  117. DATA GAM,GAMSQ,RGAMSQ/4096.E0,1.67772E7,5.96046E-8/
  118. * ..
  119. IF (SD1.LT.ZERO) THEN
  120. * GO ZERO-H-D-AND-SX1..
  121. SFLAG = -ONE
  122. SH11 = ZERO
  123. SH12 = ZERO
  124. SH21 = ZERO
  125. SH22 = ZERO
  126. *
  127. SD1 = ZERO
  128. SD2 = ZERO
  129. SX1 = ZERO
  130. ELSE
  131. * CASE-SD1-NONNEGATIVE
  132. SP2 = SD2*SY1
  133. IF (SP2.EQ.ZERO) THEN
  134. SFLAG = -TWO
  135. SPARAM(1) = SFLAG
  136. RETURN
  137. END IF
  138. * REGULAR-CASE..
  139. SP1 = SD1*SX1
  140. SQ2 = SP2*SY1
  141. SQ1 = SP1*SX1
  142. *
  143. IF (ABS(SQ1).GT.ABS(SQ2)) THEN
  144. SH21 = -SY1/SX1
  145. SH12 = SP2/SP1
  146. *
  147. SU = ONE - SH12*SH21
  148. *
  149. IF (SU.GT.ZERO) THEN
  150. SFLAG = ZERO
  151. SD1 = SD1/SU
  152. SD2 = SD2/SU
  153. SX1 = SX1*SU
  154. END IF
  155. ELSE
  156. IF (SQ2.LT.ZERO) THEN
  157. * GO ZERO-H-D-AND-SX1..
  158. SFLAG = -ONE
  159. SH11 = ZERO
  160. SH12 = ZERO
  161. SH21 = ZERO
  162. SH22 = ZERO
  163. *
  164. SD1 = ZERO
  165. SD2 = ZERO
  166. SX1 = ZERO
  167. ELSE
  168. SFLAG = ONE
  169. SH11 = SP1/SP2
  170. SH22 = SX1/SY1
  171. SU = ONE + SH11*SH22
  172. STEMP = SD2/SU
  173. SD2 = SD1/SU
  174. SD1 = STEMP
  175. SX1 = SY1*SU
  176. END IF
  177. END IF
  178. * PROCESURE..SCALE-CHECK
  179. IF (SD1.NE.ZERO) THEN
  180. DO WHILE ((SD1.LE.RGAMSQ) .OR. (SD1.GE.GAMSQ))
  181. IF (SFLAG.EQ.ZERO) THEN
  182. SH11 = ONE
  183. SH22 = ONE
  184. SFLAG = -ONE
  185. ELSE
  186. SH21 = -ONE
  187. SH12 = ONE
  188. SFLAG = -ONE
  189. END IF
  190. IF (SD1.LE.RGAMSQ) THEN
  191. SD1 = SD1*GAM**2
  192. SX1 = SX1/GAM
  193. SH11 = SH11/GAM
  194. SH12 = SH12/GAM
  195. ELSE
  196. SD1 = SD1/GAM**2
  197. SX1 = SX1*GAM
  198. SH11 = SH11*GAM
  199. SH12 = SH12*GAM
  200. END IF
  201. ENDDO
  202. END IF
  203. IF (SD2.NE.ZERO) THEN
  204. DO WHILE ( (ABS(SD2).LE.RGAMSQ) .OR. (ABS(SD2).GE.GAMSQ) )
  205. IF (SFLAG.EQ.ZERO) THEN
  206. SH11 = ONE
  207. SH22 = ONE
  208. SFLAG = -ONE
  209. ELSE
  210. SH21 = -ONE
  211. SH12 = ONE
  212. SFLAG = -ONE
  213. END IF
  214. IF (ABS(SD2).LE.RGAMSQ) THEN
  215. SD2 = SD2*GAM**2
  216. SH21 = SH21/GAM
  217. SH22 = SH22/GAM
  218. ELSE
  219. SD2 = SD2/GAM**2
  220. SH21 = SH21*GAM
  221. SH22 = SH22*GAM
  222. END IF
  223. END DO
  224. END IF
  225. END IF
  226. IF (SFLAG.LT.ZERO) THEN
  227. SPARAM(2) = SH11
  228. SPARAM(3) = SH21
  229. SPARAM(4) = SH12
  230. SPARAM(5) = SH22
  231. ELSE IF (SFLAG.EQ.ZERO) THEN
  232. SPARAM(3) = SH21
  233. SPARAM(4) = SH12
  234. ELSE
  235. SPARAM(2) = SH11
  236. SPARAM(5) = SH22
  237. END IF
  238. SPARAM(1) = SFLAG
  239. RETURN
  240. END