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.

drotmg.f 6.4 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. *> \brief \b DROTMG
  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 DROTMG(DD1,DD2,DX1,DY1,DPARAM)
  12. *
  13. * .. Scalar Arguments ..
  14. * DOUBLE PRECISION DD1,DD2,DX1,DY1
  15. * ..
  16. * .. Array Arguments ..
  17. * DOUBLE PRECISION DPARAM(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 (DSQRT(DD1)*DX1,DSQRT(DD2)*> DY2)**T.
  28. *> WITH DPARAM(1)=DFLAG, H HAS ONE OF THE FOLLOWING FORMS..
  29. *>
  30. *> DFLAG=-1.D0 DFLAG=0.D0 DFLAG=1.D0 DFLAG=-2.D0
  31. *>
  32. *> (DH11 DH12) (1.D0 DH12) (DH11 1.D0) (1.D0 0.D0)
  33. *> H=( ) ( ) ( ) ( )
  34. *> (DH21 DH22), (DH21 1.D0), (-1.D0 DH22), (0.D0 1.D0).
  35. *> LOCATIONS 2-4 OF DPARAM CONTAIN DH11, DH21, DH12, AND DH22
  36. *> RESPECTIVELY. (VALUES OF 1.D0, -1.D0, OR 0.D0 IMPLIED BY THE
  37. *> VALUE OF DPARAM(1) ARE NOT STORED IN DPARAM.)
  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 DD1 AND DD2. ALL ACTUAL SCALING OF DATA IS DONE USING GAM.
  42. *>
  43. *> \endverbatim
  44. *
  45. * Arguments:
  46. * ==========
  47. *
  48. *> \param[in,out] DD1
  49. *> \verbatim
  50. *> DD1 is DOUBLE PRECISION
  51. *> \endverbatim
  52. *>
  53. *> \param[in,out] DD2
  54. *> \verbatim
  55. *> DD2 is DOUBLE PRECISION
  56. *> \endverbatim
  57. *>
  58. *> \param[in,out] DX1
  59. *> \verbatim
  60. *> DX1 is DOUBLE PRECISION
  61. *> \endverbatim
  62. *>
  63. *> \param[in] DY1
  64. *> \verbatim
  65. *> DY1 is DOUBLE PRECISION
  66. *> \endverbatim
  67. *>
  68. *> \param[out] DPARAM
  69. *> \verbatim
  70. *> DPARAM is DOUBLE PRECISION array, dimension (5)
  71. *> DPARAM(1)=DFLAG
  72. *> DPARAM(2)=DH11
  73. *> DPARAM(3)=DH21
  74. *> DPARAM(4)=DH12
  75. *> DPARAM(5)=DH22
  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 double_blas_level1
  89. *
  90. * =====================================================================
  91. SUBROUTINE DROTMG(DD1,DD2,DX1,DY1,DPARAM)
  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. DOUBLE PRECISION DD1,DD2,DX1,DY1
  100. * ..
  101. * .. Array Arguments ..
  102. DOUBLE PRECISION DPARAM(5)
  103. * ..
  104. *
  105. * =====================================================================
  106. *
  107. * .. Local Scalars ..
  108. DOUBLE PRECISION DFLAG,DH11,DH12,DH21,DH22,DP1,DP2,DQ1,DQ2,DTEMP,
  109. $ DU,GAM,GAMSQ,ONE,RGAMSQ,TWO,ZERO
  110. * ..
  111. * .. Intrinsic Functions ..
  112. INTRINSIC DABS
  113. * ..
  114. * .. Data statements ..
  115. *
  116. DATA ZERO,ONE,TWO/0.D0,1.D0,2.D0/
  117. DATA GAM,GAMSQ,RGAMSQ/4096.D0,16777216.D0,5.9604645D-8/
  118. * ..
  119. IF (DD1.LT.ZERO) THEN
  120. * GO ZERO-H-D-AND-DX1..
  121. DFLAG = -ONE
  122. DH11 = ZERO
  123. DH12 = ZERO
  124. DH21 = ZERO
  125. DH22 = ZERO
  126. *
  127. DD1 = ZERO
  128. DD2 = ZERO
  129. DX1 = ZERO
  130. ELSE
  131. * CASE-DD1-NONNEGATIVE
  132. DP2 = DD2*DY1
  133. IF (DP2.EQ.ZERO) THEN
  134. DFLAG = -TWO
  135. DPARAM(1) = DFLAG
  136. RETURN
  137. END IF
  138. * REGULAR-CASE..
  139. DP1 = DD1*DX1
  140. DQ2 = DP2*DY1
  141. DQ1 = DP1*DX1
  142. *
  143. IF (DABS(DQ1).GT.DABS(DQ2)) THEN
  144. DH21 = -DY1/DX1
  145. DH12 = DP2/DP1
  146. *
  147. DU = ONE - DH12*DH21
  148. *
  149. IF (DU.GT.ZERO) THEN
  150. DFLAG = ZERO
  151. DD1 = DD1/DU
  152. DD2 = DD2/DU
  153. DX1 = DX1*DU
  154. END IF
  155. ELSE
  156. IF (DQ2.LT.ZERO) THEN
  157. * GO ZERO-H-D-AND-DX1..
  158. DFLAG = -ONE
  159. DH11 = ZERO
  160. DH12 = ZERO
  161. DH21 = ZERO
  162. DH22 = ZERO
  163. *
  164. DD1 = ZERO
  165. DD2 = ZERO
  166. DX1 = ZERO
  167. ELSE
  168. DFLAG = ONE
  169. DH11 = DP1/DP2
  170. DH22 = DX1/DY1
  171. DU = ONE + DH11*DH22
  172. DTEMP = DD2/DU
  173. DD2 = DD1/DU
  174. DD1 = DTEMP
  175. DX1 = DY1*DU
  176. END IF
  177. END IF
  178. * PROCEDURE..SCALE-CHECK
  179. IF (DD1.NE.ZERO) THEN
  180. DO WHILE ((DD1.LE.RGAMSQ) .OR. (DD1.GE.GAMSQ))
  181. IF (DFLAG.EQ.ZERO) THEN
  182. DH11 = ONE
  183. DH22 = ONE
  184. DFLAG = -ONE
  185. ELSE
  186. DH21 = -ONE
  187. DH12 = ONE
  188. DFLAG = -ONE
  189. END IF
  190. IF (DD1.LE.RGAMSQ) THEN
  191. DD1 = DD1*GAM**2
  192. DX1 = DX1/GAM
  193. DH11 = DH11/GAM
  194. DH12 = DH12/GAM
  195. ELSE
  196. DD1 = DD1/GAM**2
  197. DX1 = DX1*GAM
  198. DH11 = DH11*GAM
  199. DH12 = DH12*GAM
  200. END IF
  201. ENDDO
  202. END IF
  203. IF (DD2.NE.ZERO) THEN
  204. DO WHILE ( (DABS(DD2).LE.RGAMSQ) .OR. (DABS(DD2).GE.GAMSQ) )
  205. IF (DFLAG.EQ.ZERO) THEN
  206. DH11 = ONE
  207. DH22 = ONE
  208. DFLAG = -ONE
  209. ELSE
  210. DH21 = -ONE
  211. DH12 = ONE
  212. DFLAG = -ONE
  213. END IF
  214. IF (DABS(DD2).LE.RGAMSQ) THEN
  215. DD2 = DD2*GAM**2
  216. DH21 = DH21/GAM
  217. DH22 = DH22/GAM
  218. ELSE
  219. DD2 = DD2/GAM**2
  220. DH21 = DH21*GAM
  221. DH22 = DH22*GAM
  222. END IF
  223. END DO
  224. END IF
  225. END IF
  226. IF (DFLAG.LT.ZERO) THEN
  227. DPARAM(2) = DH11
  228. DPARAM(3) = DH21
  229. DPARAM(4) = DH12
  230. DPARAM(5) = DH22
  231. ELSE IF (DFLAG.EQ.ZERO) THEN
  232. DPARAM(3) = DH21
  233. DPARAM(4) = DH12
  234. ELSE
  235. DPARAM(2) = DH11
  236. DPARAM(5) = DH22
  237. END IF
  238. DPARAM(1) = DFLAG
  239. RETURN
  240. END