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.

dbdt02.f 4.8 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. *> \brief \b DBDT02
  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 DBDT02( M, N, B, LDB, C, LDC, U, LDU, WORK, RESID )
  12. *
  13. * .. Scalar Arguments ..
  14. * INTEGER LDB, LDC, LDU, M, N
  15. * DOUBLE PRECISION RESID
  16. * ..
  17. * .. Array Arguments ..
  18. * DOUBLE PRECISION B( LDB, * ), C( LDC, * ), U( LDU, * ),
  19. * $ WORK( * )
  20. * ..
  21. *
  22. *
  23. *> \par Purpose:
  24. * =============
  25. *>
  26. *> \verbatim
  27. *>
  28. *> DBDT02 tests the change of basis C = U**H * B by computing the
  29. *> residual
  30. *>
  31. *> RESID = norm( B - U * C ) / ( max(m,n) * norm(B) * EPS ),
  32. *>
  33. *> where B and C are M by N matrices, U is an M by M orthogonal matrix,
  34. *> and EPS is the machine precision.
  35. *> \endverbatim
  36. *
  37. * Arguments:
  38. * ==========
  39. *
  40. *> \param[in] M
  41. *> \verbatim
  42. *> M is INTEGER
  43. *> The number of rows of the matrices B and C and the order of
  44. *> the matrix Q.
  45. *> \endverbatim
  46. *>
  47. *> \param[in] N
  48. *> \verbatim
  49. *> N is INTEGER
  50. *> The number of columns of the matrices B and C.
  51. *> \endverbatim
  52. *>
  53. *> \param[in] B
  54. *> \verbatim
  55. *> B is DOUBLE PRECISION array, dimension (LDB,N)
  56. *> The m by n matrix B.
  57. *> \endverbatim
  58. *>
  59. *> \param[in] LDB
  60. *> \verbatim
  61. *> LDB is INTEGER
  62. *> The leading dimension of the array B. LDB >= max(1,M).
  63. *> \endverbatim
  64. *>
  65. *> \param[in] C
  66. *> \verbatim
  67. *> C is DOUBLE PRECISION array, dimension (LDC,N)
  68. *> The m by n matrix C, assumed to contain U**H * B.
  69. *> \endverbatim
  70. *>
  71. *> \param[in] LDC
  72. *> \verbatim
  73. *> LDC is INTEGER
  74. *> The leading dimension of the array C. LDC >= max(1,M).
  75. *> \endverbatim
  76. *>
  77. *> \param[in] U
  78. *> \verbatim
  79. *> U is DOUBLE PRECISION array, dimension (LDU,M)
  80. *> The m by m orthogonal matrix U.
  81. *> \endverbatim
  82. *>
  83. *> \param[in] LDU
  84. *> \verbatim
  85. *> LDU is INTEGER
  86. *> The leading dimension of the array U. LDU >= max(1,M).
  87. *> \endverbatim
  88. *>
  89. *> \param[out] WORK
  90. *> \verbatim
  91. *> WORK is DOUBLE PRECISION array, dimension (M)
  92. *> \endverbatim
  93. *>
  94. *> \param[out] RESID
  95. *> \verbatim
  96. *> RESID is DOUBLE PRECISION
  97. *> RESID = norm( B - U * C ) / ( max(m,n) * norm(B) * EPS ),
  98. *> \endverbatim
  99. *
  100. * Authors:
  101. * ========
  102. *
  103. *> \author Univ. of Tennessee
  104. *> \author Univ. of California Berkeley
  105. *> \author Univ. of Colorado Denver
  106. *> \author NAG Ltd.
  107. *
  108. *> \ingroup double_eig
  109. *
  110. * =====================================================================
  111. SUBROUTINE DBDT02( M, N, B, LDB, C, LDC, U, LDU, WORK, RESID )
  112. *
  113. * -- LAPACK test routine --
  114. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  115. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  116. *
  117. * .. Scalar Arguments ..
  118. INTEGER LDB, LDC, LDU, M, N
  119. DOUBLE PRECISION RESID
  120. * ..
  121. * .. Array Arguments ..
  122. DOUBLE PRECISION B( LDB, * ), C( LDC, * ), U( LDU, * ),
  123. $ WORK( * )
  124. * ..
  125. *
  126. * ======================================================================
  127. *
  128. * .. Parameters ..
  129. DOUBLE PRECISION ZERO, ONE
  130. PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 )
  131. * ..
  132. * .. Local Scalars ..
  133. INTEGER J
  134. DOUBLE PRECISION BNORM, EPS, REALMN
  135. * ..
  136. * .. External Functions ..
  137. DOUBLE PRECISION DASUM, DLAMCH, DLANGE
  138. EXTERNAL DASUM, DLAMCH, DLANGE
  139. * ..
  140. * .. External Subroutines ..
  141. EXTERNAL DCOPY, DGEMV
  142. * ..
  143. * .. Intrinsic Functions ..
  144. INTRINSIC DBLE, MAX, MIN
  145. * ..
  146. * .. Executable Statements ..
  147. *
  148. * Quick return if possible
  149. *
  150. RESID = ZERO
  151. IF( M.LE.0 .OR. N.LE.0 )
  152. $ RETURN
  153. REALMN = DBLE( MAX( M, N ) )
  154. EPS = DLAMCH( 'Precision' )
  155. *
  156. * Compute norm( B - U * C )
  157. *
  158. DO 10 J = 1, N
  159. CALL DCOPY( M, B( 1, J ), 1, WORK, 1 )
  160. CALL DGEMV( 'No transpose', M, M, -ONE, U, LDU, C( 1, J ), 1,
  161. $ ONE, WORK, 1 )
  162. RESID = MAX( RESID, DASUM( M, WORK, 1 ) )
  163. 10 CONTINUE
  164. *
  165. * Compute norm of B.
  166. *
  167. BNORM = DLANGE( '1', M, N, B, LDB, WORK )
  168. *
  169. IF( BNORM.LE.ZERO ) THEN
  170. IF( RESID.NE.ZERO )
  171. $ RESID = ONE / EPS
  172. ELSE
  173. IF( BNORM.GE.RESID ) THEN
  174. RESID = ( RESID / BNORM ) / ( REALMN*EPS )
  175. ELSE
  176. IF( BNORM.LT.ONE ) THEN
  177. RESID = ( MIN( RESID, REALMN*BNORM ) / BNORM ) /
  178. $ ( REALMN*EPS )
  179. ELSE
  180. RESID = MIN( RESID / BNORM, REALMN ) / ( REALMN*EPS )
  181. END IF
  182. END IF
  183. END IF
  184. RETURN
  185. *
  186. * End of DBDT02
  187. *
  188. END