Télécharger qzhess.eso

Retour à la liste

Numérotation des lignes :

qzhess
  1. C QZHESS SOURCE PV090527 26/05/04 21:15:05 12529
  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. rigrel=0
  64. SEGINI , MATZ
  65. *
  66. IF ( .NOT. CALV ) GOTO 9
  67. DO 3 J = 1, N
  68. DO 2 I = 1, N
  69. MATZ.RE(I,J,1) = 0.0D0
  70. 2 CONTINUE
  71. MATZ.RE(J,J,1) = 1.0D0
  72. 3 CONTINUE
  73. *
  74. 9 continue
  75. *
  76. *-----------------------------------------------------------------------
  77. *--------- REDUCTION DE B A LA FORME TRIANGULAIRE SUPERIEURE ---------
  78. *-----------------------------------------------------------------------
  79. *
  80. 10 IF ( N .LE. 1 ) GOTO 170
  81. *
  82. *
  83. NM1 = N - 1
  84. *
  85. DO 100 L = 1, NM1
  86. L1 = L + 1
  87.  
  88. c S = somme des termes de B_il i=l+1..n
  89. S = 0.0D0
  90. DO 20 I = L1, N
  91. S = S + ABS(MATB.RE(I,L,1))
  92. 20 CONTINUE
  93. c S=0 : la ligne L verifie deja la forme triangulaire infer de B
  94. IF ( S .EQ. 0.0D0 ) GOTO 100
  95. c S = somme des termes de B_il i=l..n : ajout du terme diagonal
  96. S = S + ABS(MATB.RE(L,L,1))
  97.  
  98. c methode de Householder pour annuler les termes non-nul
  99. c
  100. c calcul de r = sign(B_ll)*sqrt(sum B_il^2)
  101. c (rem: r est souvent appelé \alpha dans la litterature)
  102. R = 0.0D0
  103. DO 25 I = L, N
  104. MATB.RE(I,L,1) = MATB.RE(I,L,1) / S
  105. R = R + MATB.RE(I,L,1)**2
  106. 25 CONTINUE
  107. R = SIGN(SQRT(R),MATB.RE(L,L,1))
  108. MATB.RE(L,L,1) = MATB.RE(L,L,1) + R
  109. RHO = R * MATB.RE(L,L,1)
  110. c triangularisation effective de B
  111. DO 50 J = L1, N
  112. T = 0.0D0
  113. DO 30 I = L, N
  114. T = T + MATB.RE(I,L,1) * MATB.RE(I,J,1)
  115. 30 CONTINUE
  116. T = -T / RHO
  117. DO 40 I = L, N
  118. MATB.RE(I,J,1) = MATB.RE(I,J,1) + T * MATB.RE(I,L,1)
  119. 40 CONTINUE
  120. 50 CONTINUE
  121. c la meme transformation est appliquee a A
  122. DO 80 J = 1, N
  123. T = 0.0D0
  124. DO 60 I = L, N
  125. T = T + MATB.RE(I,L,1) * MATA.RE(I,J,1)
  126. 60 CONTINUE
  127. T = -T / RHO
  128. DO 70 I = L, N
  129. MATA.RE(I,J,1) = MATA.RE(I,J,1) + T * MATB.RE(I,L,1)
  130. 70 CONTINUE
  131. *
  132. 80 CONTINUE
  133. c diagonale de B
  134. MATB.RE(L,L,1) = -S * R
  135. c mise a 0 des termes post-diagonaux
  136. DO 90 I = L1, N
  137. MATB.RE(I,L,1) = 0.0D0
  138. 90 CONTINUE
  139. *
  140. 100 CONTINUE
  141. *
  142. *
  143. C-----------------------------------------------------------------------
  144. C-------- REDUCTION DE A A LA FORME DE HESSENBERG SUPERIEURE ---------
  145. C-----------------------------------------------------------------------
  146. c while keeping B triangular...
  147. *
  148. IF ( N .EQ. 2 ) GOTO 170
  149. C
  150. NM2 = N - 2
  151. *
  152. DO 160 K = 1, NM2
  153. NK1 = NM1 - K
  154. *
  155. DO 150 LB = 1, NK1
  156. L = N - LB
  157. L1 = L + 1
  158. *
  159. S = ABS(MATA.RE(L,K,1)) + ABS(MATA.RE(L1,K,1))
  160. IF ( S .EQ. 0.0D0 ) GOTO 150
  161. U1 = MATA.RE(L,K,1) / S
  162. U2 = MATA.RE(L1,K,1) / S
  163. R = SIGN(SQRT(U1*U1+U2*U2),U1)
  164. V1 = -(U1 + R) / R
  165. V2 = -U2 / R
  166. U2 = V2 / V1
  167. *
  168. DO 110 J = K, N
  169. T = MATA.RE(L,J,1) + U2 * MATA.RE(L1,J,1)
  170. MATA.RE(L,J,1) = MATA.RE(L,J,1) + T * V1
  171. MATA.RE(L1,J,1) = MATA.RE(L1,J,1) + T * V2
  172. 110 CONTINUE
  173. MATA.RE(L1,K,1) = 0.0D0
  174. *
  175. DO 120 J = L, N
  176. T = MATB.RE(L,J,1) + U2 * MATB.RE(L1,J,1)
  177. MATB.RE(L,J,1) = MATB.RE(L,J,1) + T * V1
  178. MATB.RE(L1,J,1) = MATB.RE(L1,J,1) + T * V2
  179. 120 CONTINUE
  180. *
  181. S = ABS(MATB.RE(L1,L1,1)) + ABS(MATB.RE(L1,L,1))
  182. IF ( S .EQ. 0.0D0 ) GOTO 150
  183. U1 = MATB.RE(L1,L1,1) / S
  184. U2 = MATB.RE(L1,L,1) / S
  185. R = SIGN(SQRT(U1*U1+U2*U2),U1)
  186. V1 = -(U1 + R) / R
  187. V2 = -U2 / R
  188. U2 = V2 / V1
  189. *
  190. DO 130 I = 1, L1
  191. T = MATB.RE(I,L1,1) + U2 * MATB.RE(I,L,1)
  192. MATB.RE(I,L1,1) = MATB.RE(I,L1,1) + T * V1
  193. MATB.RE(I,L,1) = MATB.RE(I,L,1) + T * V2
  194. 130 CONTINUE
  195. MATB.RE(L1,L,1) = 0.0D0
  196. *
  197. DO 140 I = 1, N
  198. T = MATA.RE(I,L1,1) + U2 * MATA.RE(I,L,1)
  199. MATA.RE(I,L1,1) = MATA.RE(I,L1,1) + T * V1
  200. MATA.RE(I,L,1) = MATA.RE(I,L,1) + T * V2
  201. 140 CONTINUE
  202. *
  203. IF ( .NOT. CALV ) GOTO 150
  204. *
  205. DO 145 I = 1, N
  206. T = MATZ.RE(I,L1,1) + U2 * MATZ.RE(I,L,1)
  207. MATZ.RE(I,L1,1) = MATZ.RE(I,L1,1) + T * V1
  208. MATZ.RE(I,L,1) = MATZ.RE(I,L,1) + T * V2
  209. 145 CONTINUE
  210. *
  211. 150 CONTINUE
  212. *
  213. 160 CONTINUE
  214. *
  215. 170 CONTINUE
  216. *
  217. *========================== FIN DES CALCULS ============================
  218. c SEGDES , MATA,MATB,MATZ
  219. *
  220. RETURN
  221. END
  222.  
  223.  
  224.  
  225.  
  226.  
  227.  
  228.  
  229.  
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236.  

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