Télécharger vectp3.eso

Retour à la liste

Numérotation des lignes :

vectp3
  1. C VECTP3 SOURCE GOUNAND 25/10/23 21:15:11 12385
  2. subroutine vectp3(s,d,igr,x)
  3. *
  4. * RECHERCHE des 2emes et 3emes VECTEURS PROPRES
  5. * les valeurs propres doivent être numeriquement distinctes
  6. *
  7. * X en entrée est une matrice orthonormee :
  8. * x(j,igr) : 1er vecteur propre vp(1) associe a d(igr)
  9. * x(j,i) ; i.ne.igr 2 vecteurs orthonormé orthogonaux a vp(1)
  10. *
  11. * S est une matrice symetrique
  12. * igr vaut 1 ou 3 et correspond a la valeur propre isolee
  13. * d(i) : valeurs propres
  14.  
  15. * Recherche un vecteur propre x(j,2) associe à la valeur propre
  16. * simple d(2) (important) d'une matrice 3x3 S
  17. *
  18. * L'image de S-d(2)I est de dimension 2 car d(2) est valeur
  19. * propre simple. On cherche uniquement la partie de l'image
  20. * orthogonale à vp(igr)
  21. * Pour ce faire, on prend la plus grande des images des deux
  22. * vecteurs de la base X différents de vp(igr). Ces deux images sont
  23. * colinéaires car à la fois orthogonales à vp(igr) et vp(2) : w1
  24. *
  25. * On choisit ensuite : vp(2) = w1 \pvec vp(1)
  26. * puis : vp(3) = vp(1) \pvec vp(2)
  27. *
  28. *
  29. * X en sortie contient les vecteurs propres correspondant a chaque
  30. * valeur propre
  31. *
  32. * On utilise la méthode de deflation de Scherzinger et Dohrmann
  33. * CMAME'08
  34. *
  35. *
  36. IMPLICIT INTEGER(I-N)
  37. IMPLICIT REAL*8 (A-H,O-Z)
  38. -INC PPARAM
  39. -INC CCOPTIO
  40. -INC CCREEL
  41. dimension s(3,3),d(3),x(3,3)
  42. logical ldbg
  43. dimension sr(3,3),u(3,3),xnu2(3)
  44. *
  45. * Impressions
  46. ldbg=.false.
  47. * igr vaut 1 ou 3 quand ipe vaut 3 ou 1
  48. ipe=4-igr
  49. vp=d(2)
  50. *
  51. do i=1,3
  52. do j=1,3
  53. sr(j,i)=s(j,i)
  54. enddo
  55. enddo
  56. do i=1,3
  57. sr(i,i)=sr(i,i)-vp
  58. enddo
  59. *
  60. * Recherche du plus grand vecteur de l'image de Sred - d(2) I par
  61. * les vecteurs orthogonaux à vp1 :
  62. * w1
  63. *
  64. if (ldbg) then
  65. write(6,*) 'Matrice S-d(2) I='
  66. do ii=1,3
  67. write (6,*) (sr(ii,jj),jj=1,3)
  68. enddo
  69. *inu do j=1,3
  70. *inu X1=SR(1,1)*x(1,j)+SR(1,2)*x(2,j)+SR(1,3)*x(3,j)
  71. *inu X2=SR(2,1)*x(1,j)+SR(2,2)*x(2,j)+SR(2,3)*x(3,j)
  72. *inu X3=SR(3,1)*x(1,j)+SR(3,2)*x(2,j)+SR(3,3)*x(3,j)
  73. *inu write(6,*) 'vpj d(igr) j=',j,x1,x2,x3
  74. *inu enddo
  75. endif
  76. *
  77. * Calcul des images i par S-d(2)I des deux vecteurs de X orthogonaux a
  78. * VP1 = U (j,i) # et de leur norme xnu(i)
  79. *
  80. do i=1,3
  81. do j=1,3
  82. u(j,i)=0.d0
  83. if (i.ne.igr) then
  84. do k=1,3
  85. u(j,i)=u(j,i)+sr(j,k)*x(k,i)
  86. enddo
  87. endif
  88. enddo
  89. enddo
  90. if (ldbg) then
  91. write(6,*) 'Matrice U des images par S-d(2)I'
  92. do ii=1,3
  93. write (6,*) (u(ii,jj),jj=1,3)
  94. enddo
  95. endif
  96. *
  97. * Normalement, les deux vecteurs dans u sont orthogonaux a vp(1)
  98. * Toutefois, lorsque les deux valeurs propres hors d(igr) sont proches,
  99. * on peut perdre en precision sur l'orthogonalite. Donc on
  100. * reorthogonalise systematiquement...
  101. *
  102. do i=1,3
  103. if (i.ne.igr) then
  104. xpsca=xzero
  105. do j=1,3
  106. xpsca=xpsca+u(j,i)*x(j,igr)
  107. enddo
  108. do j=1,3
  109. u(j,i)=u(j,i)-xpsca*x(j,igr)
  110. enddo
  111. endif
  112. enddo
  113. if (ldbg) then
  114. write(6,*) 'Matrice U des images reorthog vs vp(1)'
  115. do ii=1,3
  116. write (6,*) (u(ii,jj),jj=1,3)
  117. enddo
  118. endif
  119. * Calcul des normes
  120. imax=0
  121. xmax=0.d0
  122. do i=1,3
  123. xnu2(i)=xzero
  124. if (i.ne.igr) then
  125. do j=1,3
  126. xnu2(i)=xnu2(i)+u(j,i)**2
  127. enddo
  128. if (xnu2(i).gt.xmax) then
  129. xmax=xnu2(i)
  130. imax=i
  131. endif
  132. endif
  133. enddo
  134. *
  135. igr2=imax
  136. if (ldbg) then
  137. write(6,*) 'Normes des colonnes de U reortho'
  138. write(6,*) (xnu2(jj),jj=1,3)
  139. write(6,*) 'indice du max des normes, igr2=',igr2
  140. endif
  141. * On garde le plus grand et on le norme
  142. * Normalement pas possible si hypothèses vérifiées (valeurs propres distinctes)
  143. if (igr2.eq.0) then
  144. do i=1,3
  145. if (i.ne.igr) then
  146. igr2=i
  147. goto 10
  148. endif
  149. enddo
  150. 10 continue
  151. do i=1,3
  152. if (i.eq.igr2) then
  153. u(i,igr2)=1
  154. else
  155. u(i,igr2)=0
  156. endif
  157. enddo
  158. else
  159. xnorm=sqrt(xnu2(igr2))
  160. do i=1,3
  161. u(i,igr2)=u(i,igr2)/xnorm
  162. enddo
  163. endif
  164. *
  165. * Cela permet de construire notre 2eme et 3eme vecteur propre :
  166. * v2 = w1 \pvect v1
  167. * v3 = v1 \pvect v2
  168.  
  169. x(1,2)=u(2,igr2)*x(3,igr)-u(3,igr2)*x(2,igr)
  170. x(2,2)=u(3,igr2)*x(1,igr)-u(1,igr2)*x(3,igr)
  171. x(3,2)=u(1,igr2)*x(2,igr)-u(2,igr2)*x(1,igr)
  172. x(1,ipe)=x(2,igr)*x(3,2)-x(3,igr)*x(2,2)
  173. x(2,ipe)=x(3,igr)*x(1,2)-x(1,igr)*x(3,2)
  174. x(3,ipe)=x(1,igr)*x(2,2)-x(2,igr)*x(1,2)
  175. if (ipe.eq.1) then
  176. x(1,ipe)=-x(1,ipe)
  177. x(2,ipe)=-x(2,ipe)
  178. x(3,ipe)=-x(3,ipe)
  179. endif
  180. return
  181. end
  182.  
  183.  

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