Télécharger vectp2.eso

Retour à la liste

Numérotation des lignes :

vectp2
  1. C VECTP2 SOURCE GOUNAND 25/10/23 21:15:10 12385
  2. subroutine vectp2(s,d,igr,x)
  3. *
  4. * Recherche un vecteur propre x(j,igr) associe a une valeur propre
  5. * simple d(igr) (important) d'une matrice 3x3 S
  6. * Les deux autres vecteurs de x sont tels que les trois vecteurs
  7. * forment une base orthonormale
  8. *
  9. * On utilise la méthode de deflation de Scherzinger et Dohrmann
  10. * CMAME'08
  11. * L'image de S-d(igr)I est de dimension 2 car d(igr) est valeur
  12. * propre simple. On determine d'abord une base B de cet espace.
  13. * Le complementaire est l'espace de dimension 1 associe au vecteur
  14. * propre x(j,igr) obtenu par produit vectoriel des 2 vecteurs de la
  15. * base B
  16. *
  17. *
  18. IMPLICIT INTEGER(I-N)
  19. IMPLICIT REAL*8 (A-H,O-Z)
  20. -INC PPARAM
  21. -INC CCOPTIO
  22. -INC CCREEL
  23. dimension s(3,3),d(3),x(3,3)
  24. logical ldbg
  25. dimension r(3,3),xnr2(3)
  26. *
  27. * Impressions
  28. ldbg=.false.
  29. *
  30. vp=d(igr)
  31. C Appliquer la methode ds Scherzinger et Dohrmann CMAME'08
  32. r(1,1)=s(1,1)-vp
  33. r(2,1)=s(1,2)
  34. r(3,1)=s(1,3)
  35. r(1,2)=r(2,1)
  36. r(2,2)=s(2,2)-vp
  37. r(3,2)=s(2,3)
  38. r(1,3)=r(3,1)
  39. r(2,3)=r(3,2)
  40. r(3,3)=s(3,3)-vp
  41. if (ldbg) then
  42. write(6,*) 'igr,d(igr)=',igr,d(igr)
  43. write(6,*) 'Matrice R = S-d(igr) I='
  44. do ii=1,idim
  45. write (6,*) (r(ii,jj),jj=1,idim)
  46. enddo
  47. endif
  48. *
  49. * Les colonnes de R sont les vecteurs obtenus par produit de R avec
  50. * les vecteurs de la base canonique
  51. * Celle de norme la plus grande sera notre 1er vecteur vb1 de la
  52. * base B
  53. *
  54. imax=0
  55. xmax=0.d0
  56. do i=1,3
  57. xnr2(i)=xzero
  58. do j=1,3
  59. xnr2(i)=xnr2(i)+r(j,i)**2
  60. enddo
  61. if (xnr2(i).gt.xmax) then
  62. xmax=xnr2(i)
  63. imax=i
  64. endif
  65. enddo
  66. jgr=imax
  67. if (ldbg) then
  68. write(6,*) 'Normes des colonnes de R'
  69. write(6,*) (xnr2(jj),jj=1,idim)
  70. write(6,*) 'indice du max des normes, jgr=',jgr
  71. endif
  72. * Normalement pas possible si hypothèses vérifiées
  73. if (jgr.eq.0) then
  74. jgr=1
  75. do i=1,3
  76. if (i.eq.jgr) then
  77. r(i,jgr)=1
  78. else
  79. r(i,jgr)=0
  80. endif
  81. enddo
  82. endif
  83. * On normalise vb1
  84. xnorm=sqrt(xnr2(jgr))
  85. do i=1,3
  86. r(i,jgr)=r(i,jgr)/xnorm
  87. enddo
  88. * On orthogonalise les deux autres vecteurs par rapport a vb1
  89. do j=1,3
  90. if (j.ne.jgr) then
  91. xpsca=xzero
  92. do i=1,3
  93. xpsca=xpsca+r(i,jgr)*r(i,j)
  94. enddo
  95. do i=1,3
  96. r(i,j)=r(i,j)-xpsca*r(i,jgr)
  97. enddo
  98. endif
  99. enddo
  100. if (ldbg) then
  101. write(6,*) 'Matrice R orthogonalise vs colonne jgr=',jgr
  102. do ii=1,idim
  103. write (6,*) (r(ii,jj),jj=1,idim)
  104. enddo
  105. endif
  106. * On calcule leur norme au carre
  107. xmax=xzero
  108. imax=0
  109. do i=1,3
  110. if (i.ne.jgr) then
  111. xnr2(i)=xzero
  112. do j=1,3
  113. xnr2(i)=xnr2(i)+r(j,i)**2
  114. enddo
  115. if (xnr2(i).gt.xmax) then
  116. xmax=xnr2(i)
  117. imax=i
  118. endif
  119. endif
  120. enddo
  121. jgr2=imax
  122. if (ldbg) then
  123. write(6,*) 'Normes des colonnes de R ortho'
  124. write(6,*) (xnr2(jj),jj=1,idim)
  125. write(6,*) 'indice du max des normes, jgr2=',jgr2
  126. endif
  127. * Le plus grand est notre vecteur vb2, qu'on normalise
  128. if (jgr2.eq.0) then
  129. do i=1,3
  130. if (i.ne.jgr) then
  131. jgr2=i
  132. goto 10
  133. endif
  134. enddo
  135. 10 continue
  136. do i=1,3
  137. if (i.eq.jgr2) then
  138. r(i,jgr2)=1
  139. else
  140. r(i,jgr2)=0
  141. endif
  142. enddo
  143. else
  144. xnorm=sqrt(xnr2(jgr2))
  145. do i=1,3
  146. r(i,jgr2)=r(i,jgr2)/xnorm
  147. enddo
  148. endif
  149. * Le vecteur propre associe a d(igr) est le produit vectoriel de vb1
  150. * et vb2
  151. ioth=modulo(igr,3)+1
  152. do i=1,3
  153. x(i,ioth)=r(i,jgr)
  154. enddo
  155. ioth2=modulo(igr+1,3)+1
  156. do i=1,3
  157. x(i,ioth2)=r(i,jgr2)
  158. enddo
  159. x(1,igr)=x(2,ioth)*x(3,ioth2)-x(3,ioth)*x(2,ioth2)
  160. x(2,igr)=x(3,ioth)*x(1,ioth2)-x(1,ioth)*x(3,ioth2)
  161. x(3,igr)=x(1,ioth)*x(2,ioth2)-x(2,ioth)*x(1,ioth2)
  162. return
  163. end
  164.  
  165.  

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