Télécharger qzhess.eso

Retour à la liste

Numérotation des lignes :

qzhess
  1. C QZHESS SOURCE BP208322 12/10/03 21:15:28 7517
  2. SUBROUTINE QZHESS (MATA, MATB, CALV, MATZ)
  3. c SUBROUTINE QZHESS (XMATA, XMATB, CALV, XMATZ, NM,N)
  4. IMPLICIT INTEGER(I-N)
  5. IMPLICIT REAL*8 (A-H,O-Z)
  6. *
  7. *************************************************************************
  8. * *
  9. * MISE SOUS FORME DE HESSENBERG SUPERIEURE DE MATA *
  10. * ET TRIANGULARISATION SUPERIEURE SIMULTANEE DE MATB *
  11. * ( PREMIER PAS DE LA METHODE "QZ" POUR LE CALCUL MODAL COMPLEXE ) *
  12. * _____________________________________________________________________ *
  13. * *
  14. * *
  15. * DATE : le 23 Mars 1995 *
  16. * AUTEURS : J.ANTUNES , Nicolas BENECH *
  17. * _____________________________________________________________________ *
  18. * *
  19. * MODULE(S) APPELANT(S) : VIBRAC *
  20. * *
  21. * MODULE(S) APPELE(S) : *
  22. * _____________________________________________________________________ *
  23. * *
  24. * EN ENTREE : *
  25. * - MATA : matrice reelle generale (XMATRI) *
  26. * - MATB : matrice reelle generale (XMATRI) *
  27. * - CALV : indique si l'on calcule ou non les vecteurs propres *
  28. * *
  29. * EN SORTIE : *
  30. * - MATA : matrice sous forme Hessenberg superieure *
  31. * - MATB : matrice sous forme triangulaire superieure *
  32. * - MATZ : produit des transformations effectuees (si CALV=.TRUE.)*
  33. * *
  34. *************************************************************************
  35. *
  36.  
  37. -INC PPARAM
  38. -INC CCOPTIO
  39. -INC SMRIGID
  40. *
  41. INTEGER I , J , K , L , N , LB , L1 , NM , NK1 , NM1 , NM2
  42. LOGICAL CALV
  43. *-----------------------------------------------------------------------
  44. POINTEUR MATA.XMATRI, MATB.XMATRI, MATZ.XMATRI
  45. * REAL*8 XMATA(NM,N),XMATB(NM,N),XMATZ(NM,N)
  46. *
  47. c SEGACT , MATA*mod
  48. c SEGACT , MATB*mod
  49. NM=MATA.RE(/1)
  50. N=MATA.RE(/2)
  51. *
  52. *=======================================================================
  53. *========================= DEBUT DES CALCULS ===========================
  54. *=======================================================================
  55. *
  56. *-----------------------------------------------------------------------
  57. *----------------------- INITIALISATION DE Z -------------------------
  58. *-----------------------------------------------------------------------
  59. *
  60. NLIGRD=NM
  61. NLIGRP=N
  62. nelrig=1
  63. SEGINI , MATZ
  64. *
  65. IF ( .NOT. CALV ) GOTO 9
  66. DO 3 J = 1, N
  67. DO 2 I = 1, N
  68. MATZ.RE(I,J,1) = 0.0D0
  69. 2 CONTINUE
  70. MATZ.RE(J,J,1) = 1.0D0
  71. 3 CONTINUE
  72. *
  73. 9 continue
  74. *
  75. *-----------------------------------------------------------------------
  76. *--------- REDUCTION DE B A LA FORME TRIANGULAIRE SUPERIEURE ---------
  77. *-----------------------------------------------------------------------
  78. *
  79. 10 IF ( N .LE. 1 ) GOTO 170
  80. *
  81. *
  82. NM1 = N - 1
  83. *
  84. DO 100 L = 1, NM1
  85. L1 = L + 1
  86.  
  87. c S = somme des termes de B_il i=l+1..n
  88. S = 0.0D0
  89. DO 20 I = L1, N
  90. S = S + ABS(MATB.RE(I,L,1))
  91. 20 CONTINUE
  92. c S=0 : la ligne L verifie deja la forme triangulaire infer de B
  93. IF ( S .EQ. 0.0D0 ) GOTO 100
  94. c S = somme des termes de B_il i=l..n : ajout du terme diagonal
  95. S = S + ABS(MATB.RE(L,L,1))
  96.  
  97. c methode de Householder pour annuler les termes non-nul
  98. c
  99. c calcul de r = sign(B_ll)*sqrt(sum B_il^2)
  100. c (rem: r est souvent appelé \alpha dans la litterature)
  101. R = 0.0D0
  102. DO 25 I = L, N
  103. MATB.RE(I,L,1) = MATB.RE(I,L,1) / S
  104. R = R + MATB.RE(I,L,1)**2
  105. 25 CONTINUE
  106. R = SIGN(SQRT(R),MATB.RE(L,L,1))
  107. MATB.RE(L,L,1) = MATB.RE(L,L,1) + R
  108. RHO = R * MATB.RE(L,L,1)
  109. c triangularisation effective de B
  110. DO 50 J = L1, N
  111. T = 0.0D0
  112. DO 30 I = L, N
  113. T = T + MATB.RE(I,L,1) * MATB.RE(I,J,1)
  114. 30 CONTINUE
  115. T = -T / RHO
  116. DO 40 I = L, N
  117. MATB.RE(I,J,1) = MATB.RE(I,J,1) + T * MATB.RE(I,L,1)
  118. 40 CONTINUE
  119. 50 CONTINUE
  120. c la meme transformation est appliquee a A
  121. DO 80 J = 1, N
  122. T = 0.0D0
  123. DO 60 I = L, N
  124. T = T + MATB.RE(I,L,1) * MATA.RE(I,J,1)
  125. 60 CONTINUE
  126. T = -T / RHO
  127. DO 70 I = L, N
  128. MATA.RE(I,J,1) = MATA.RE(I,J,1) + T * MATB.RE(I,L,1)
  129. 70 CONTINUE
  130. *
  131. 80 CONTINUE
  132. c diagonale de B
  133. MATB.RE(L,L,1) = -S * R
  134. c mise a 0 des termes post-diagonaux
  135. DO 90 I = L1, N
  136. MATB.RE(I,L,1) = 0.0D0
  137. 90 CONTINUE
  138. *
  139. 100 CONTINUE
  140. *
  141. *
  142. C-----------------------------------------------------------------------
  143. C-------- REDUCTION DE A A LA FORME DE HESSENBERG SUPERIEURE ---------
  144. C-----------------------------------------------------------------------
  145. c while keeping B triangular...
  146. *
  147. IF ( N .EQ. 2 ) GOTO 170
  148. C
  149. NM2 = N - 2
  150. *
  151. DO 160 K = 1, NM2
  152. NK1 = NM1 - K
  153. *
  154. DO 150 LB = 1, NK1
  155. L = N - LB
  156. L1 = L + 1
  157. *
  158. S = ABS(MATA.RE(L,K,1)) + ABS(MATA.RE(L1,K,1))
  159. IF ( S .EQ. 0.0D0 ) GOTO 150
  160. U1 = MATA.RE(L,K,1) / S
  161. U2 = MATA.RE(L1,K,1) / S
  162. R = SIGN(SQRT(U1*U1+U2*U2),U1)
  163. V1 = -(U1 + R) / R
  164. V2 = -U2 / R
  165. U2 = V2 / V1
  166. *
  167. DO 110 J = K, N
  168. T = MATA.RE(L,J,1) + U2 * MATA.RE(L1,J,1)
  169. MATA.RE(L,J,1) = MATA.RE(L,J,1) + T * V1
  170. MATA.RE(L1,J,1) = MATA.RE(L1,J,1) + T * V2
  171. 110 CONTINUE
  172. MATA.RE(L1,K,1) = 0.0D0
  173. *
  174. DO 120 J = L, N
  175. T = MATB.RE(L,J,1) + U2 * MATB.RE(L1,J,1)
  176. MATB.RE(L,J,1) = MATB.RE(L,J,1) + T * V1
  177. MATB.RE(L1,J,1) = MATB.RE(L1,J,1) + T * V2
  178. 120 CONTINUE
  179. *
  180. S = ABS(MATB.RE(L1,L1,1)) + ABS(MATB.RE(L1,L,1))
  181. IF ( S .EQ. 0.0D0 ) GOTO 150
  182. U1 = MATB.RE(L1,L1,1) / S
  183. U2 = MATB.RE(L1,L,1) / S
  184. R = SIGN(SQRT(U1*U1+U2*U2),U1)
  185. V1 = -(U1 + R) / R
  186. V2 = -U2 / R
  187. U2 = V2 / V1
  188. *
  189. DO 130 I = 1, L1
  190. T = MATB.RE(I,L1,1) + U2 * MATB.RE(I,L,1)
  191. MATB.RE(I,L1,1) = MATB.RE(I,L1,1) + T * V1
  192. MATB.RE(I,L,1) = MATB.RE(I,L,1) + T * V2
  193. 130 CONTINUE
  194. MATB.RE(L1,L,1) = 0.0D0
  195. *
  196. DO 140 I = 1, N
  197. T = MATA.RE(I,L1,1) + U2 * MATA.RE(I,L,1)
  198. MATA.RE(I,L1,1) = MATA.RE(I,L1,1) + T * V1
  199. MATA.RE(I,L,1) = MATA.RE(I,L,1) + T * V2
  200. 140 CONTINUE
  201. *
  202. IF ( .NOT. CALV ) GOTO 150
  203. *
  204. DO 145 I = 1, N
  205. T = MATZ.RE(I,L1,1) + U2 * MATZ.RE(I,L,1)
  206. MATZ.RE(I,L1,1) = MATZ.RE(I,L1,1) + T * V1
  207. MATZ.RE(I,L,1) = MATZ.RE(I,L,1) + T * V2
  208. 145 CONTINUE
  209. *
  210. 150 CONTINUE
  211. *
  212. 160 CONTINUE
  213. *
  214. 170 CONTINUE
  215. *
  216. *========================== FIN DES CALCULS ============================
  217. c SEGDES , MATA,MATB,MATZ
  218. *
  219. RETURN
  220. END
  221.  
  222.  
  223.  
  224.  
  225.  
  226.  
  227.  
  228.  
  229.  
  230.  
  231.  
  232.  

© Cast3M 2003 - Tous droits réservés.
Mentions légales