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.

sglmts.f 6.0 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. *> \brief \b SGLMTS
  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 SGLMTS( N, M, P, A, AF, LDA, B, BF, LDB, D, DF,
  12. * X, U, WORK, LWORK, RWORK, RESULT )
  13. *
  14. * .. Scalar Arguments ..
  15. * INTEGER LDA, LDB, LWORK, M, P, N
  16. * REAL RESULT
  17. * ..
  18. * .. Array Arguments ..
  19. * REAL A( LDA, * ), AF( LDA, * ), B( LDB, * ),
  20. * $ BF( LDB, * ), RWORK( * ), D( * ), DF( * ),
  21. * $ U( * ), WORK( LWORK ), X( * )
  22. *
  23. *
  24. *> \par Purpose:
  25. * =============
  26. *>
  27. *> \verbatim
  28. *>
  29. *> SGLMTS tests SGGGLM - a subroutine for solving the generalized
  30. *> linear model problem.
  31. *> \endverbatim
  32. *
  33. * Arguments:
  34. * ==========
  35. *
  36. *> \param[in] N
  37. *> \verbatim
  38. *> N is INTEGER
  39. *> The number of rows of the matrices A and B. N >= 0.
  40. *> \endverbatim
  41. *>
  42. *> \param[in] M
  43. *> \verbatim
  44. *> M is INTEGER
  45. *> The number of columns of the matrix A. M >= 0.
  46. *> \endverbatim
  47. *>
  48. *> \param[in] P
  49. *> \verbatim
  50. *> P is INTEGER
  51. *> The number of columns of the matrix B. P >= 0.
  52. *> \endverbatim
  53. *>
  54. *> \param[in] A
  55. *> \verbatim
  56. *> A is REAL array, dimension (LDA,M)
  57. *> The N-by-M matrix A.
  58. *> \endverbatim
  59. *>
  60. *> \param[out] AF
  61. *> \verbatim
  62. *> AF is REAL array, dimension (LDA,M)
  63. *> \endverbatim
  64. *>
  65. *> \param[in] LDA
  66. *> \verbatim
  67. *> LDA is INTEGER
  68. *> The leading dimension of the arrays A, AF. LDA >= max(M,N).
  69. *> \endverbatim
  70. *>
  71. *> \param[in] B
  72. *> \verbatim
  73. *> B is REAL array, dimension (LDB,P)
  74. *> The N-by-P matrix A.
  75. *> \endverbatim
  76. *>
  77. *> \param[out] BF
  78. *> \verbatim
  79. *> BF is REAL array, dimension (LDB,P)
  80. *> \endverbatim
  81. *>
  82. *> \param[in] LDB
  83. *> \verbatim
  84. *> LDB is INTEGER
  85. *> The leading dimension of the arrays B, BF. LDB >= max(P,N).
  86. *> \endverbatim
  87. *>
  88. *> \param[in] D
  89. *> \verbatim
  90. *> D is REAL array, dimension( N )
  91. *> On input, the left hand side of the GLM.
  92. *> \endverbatim
  93. *>
  94. *> \param[out] DF
  95. *> \verbatim
  96. *> DF is REAL array, dimension( N )
  97. *> \endverbatim
  98. *>
  99. *> \param[out] X
  100. *> \verbatim
  101. *> X is REAL array, dimension( M )
  102. *> solution vector X in the GLM problem.
  103. *> \endverbatim
  104. *>
  105. *> \param[out] U
  106. *> \verbatim
  107. *> U is REAL array, dimension( P )
  108. *> solution vector U in the GLM problem.
  109. *> \endverbatim
  110. *>
  111. *> \param[out] WORK
  112. *> \verbatim
  113. *> WORK is REAL array, dimension (LWORK)
  114. *> \endverbatim
  115. *>
  116. *> \param[in] LWORK
  117. *> \verbatim
  118. *> LWORK is INTEGER
  119. *> The dimension of the array WORK.
  120. *> \endverbatim
  121. *>
  122. *> \param[out] RWORK
  123. *> \verbatim
  124. *> RWORK is REAL array, dimension (M)
  125. *> \endverbatim
  126. *>
  127. *> \param[out] RESULT
  128. *> \verbatim
  129. *> RESULT is REAL
  130. *> The test ratio:
  131. *> norm( d - A*x - B*u )
  132. *> RESULT = -----------------------------------------
  133. *> (norm(A)+norm(B))*(norm(x)+norm(u))*EPS
  134. *> \endverbatim
  135. *
  136. * Authors:
  137. * ========
  138. *
  139. *> \author Univ. of Tennessee
  140. *> \author Univ. of California Berkeley
  141. *> \author Univ. of Colorado Denver
  142. *> \author NAG Ltd.
  143. *
  144. *> \ingroup single_eig
  145. *
  146. * =====================================================================
  147. SUBROUTINE SGLMTS( N, M, P, A, AF, LDA, B, BF, LDB, D, DF,
  148. $ X, U, WORK, LWORK, RWORK, RESULT )
  149. *
  150. * -- LAPACK test routine --
  151. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  152. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  153. *
  154. * .. Scalar Arguments ..
  155. INTEGER LDA, LDB, LWORK, M, P, N
  156. REAL RESULT
  157. * ..
  158. * .. Array Arguments ..
  159. REAL A( LDA, * ), AF( LDA, * ), B( LDB, * ),
  160. $ BF( LDB, * ), RWORK( * ), D( * ), DF( * ),
  161. $ U( * ), WORK( LWORK ), X( * )
  162. *
  163. * ====================================================================
  164. *
  165. * .. Parameters ..
  166. REAL ZERO, ONE
  167. PARAMETER ( ZERO = 0.0E+0, ONE = 1.0E+0 )
  168. * ..
  169. * .. Local Scalars ..
  170. INTEGER INFO
  171. REAL ANORM, BNORM, EPS, XNORM, YNORM, DNORM, UNFL
  172. * ..
  173. * .. External Functions ..
  174. REAL SASUM, SLAMCH, SLANGE
  175. EXTERNAL SASUM, SLAMCH, SLANGE
  176. * ..
  177. * .. External Subroutines ..
  178. EXTERNAL SLACPY
  179. *
  180. * .. Intrinsic Functions ..
  181. INTRINSIC MAX
  182. * ..
  183. * .. Executable Statements ..
  184. *
  185. EPS = SLAMCH( 'Epsilon' )
  186. UNFL = SLAMCH( 'Safe minimum' )
  187. ANORM = MAX( SLANGE( '1', N, M, A, LDA, RWORK ), UNFL )
  188. BNORM = MAX( SLANGE( '1', N, P, B, LDB, RWORK ), UNFL )
  189. *
  190. * Copy the matrices A and B to the arrays AF and BF,
  191. * and the vector D the array DF.
  192. *
  193. CALL SLACPY( 'Full', N, M, A, LDA, AF, LDA )
  194. CALL SLACPY( 'Full', N, P, B, LDB, BF, LDB )
  195. CALL SCOPY( N, D, 1, DF, 1 )
  196. *
  197. * Solve GLM problem
  198. *
  199. CALL SGGGLM( N, M, P, AF, LDA, BF, LDB, DF, X, U, WORK, LWORK,
  200. $ INFO )
  201. *
  202. * Test the residual for the solution of LSE
  203. *
  204. * norm( d - A*x - B*u )
  205. * RESULT = -----------------------------------------
  206. * (norm(A)+norm(B))*(norm(x)+norm(u))*EPS
  207. *
  208. CALL SCOPY( N, D, 1, DF, 1 )
  209. CALL SGEMV( 'No transpose', N, M, -ONE, A, LDA, X, 1,
  210. $ ONE, DF, 1 )
  211. *
  212. CALL SGEMV( 'No transpose', N, P, -ONE, B, LDB, U, 1,
  213. $ ONE, DF, 1 )
  214. *
  215. DNORM = SASUM( N, DF, 1 )
  216. XNORM = SASUM( M, X, 1 ) + SASUM( P, U, 1 )
  217. YNORM = ANORM + BNORM
  218. *
  219. IF( XNORM.LE.ZERO ) THEN
  220. RESULT = ZERO
  221. ELSE
  222. RESULT = ( ( DNORM / YNORM ) / XNORM ) /EPS
  223. END IF
  224. *
  225. RETURN
  226. *
  227. * End of SGLMTS
  228. *
  229. END