Télécharger jacob2.eso

Retour à la liste

Numérotation des lignes :

jacob2
  1. C JACOB2 SOURCE GOUNAND 25/10/23 21:15:04 12385
  2. SUBROUTINE JACOB2(A,D,S)
  3. C=====================================================================
  4. C
  5. C DIAGONALISATION DE A SYMETRIQUE
  6. C ENTREEES
  7. C A(3,3) = MATRICE A DIAGONALISER A(1,3)=A(2,3)=0.
  8. C A(3,1)=A(3,2)=0.
  9. C SORTIES
  10. C D(3) = LES 3 VALEURS PROPRES D(1) > D(2) ET D(3)=A(3,3)
  11. C S(3,3) = VECTEURS PROPRES S(I,3)=0. 0. 1.
  12. C
  13. C RECUPERATION INCA FEVRIER 85 EBERSOLT
  14. C====================================================================
  15. IMPLICIT INTEGER(I-N)
  16. IMPLICIT REAL*8(A-H,O-Z)
  17. C
  18. -INC PPARAM
  19. -INC CCOPTIO
  20. -INC CCREEL
  21. C
  22. DIMENSION A(3,*),D(*),S(3,*)
  23. LOGICAL lverif,ldbg
  24. DIMENSION r(3,3),xnr(3)
  25. C
  26. C Valeur particuliere : SQRT(2.)*0.5 = 1/SQRT(2.)
  27. PARAMETER ( X1sr2 = 0.70710678118654752440084436210484904D0 )
  28. * Verifications
  29. lverif=.false.
  30. * Impressions
  31. ldbg=.false.
  32. xpre=xzprec*3.D0
  33. xpet=xpetit*10.D0
  34. xprev=xzprec*10.D0
  35. *
  36. D(3)=A(3,3)
  37. S(3,1)=0.D0
  38. S(3,2)=0.D0
  39. S(1,3)=0.D0
  40. S(2,3)=0.D0
  41. S(3,3)=1.D0
  42. * Scaling de A
  43. amax=0.d0
  44. do i=1,2
  45. do j=1,2
  46. amax=max(amax,abs(a(j,i)))
  47. enddo
  48. enddo
  49. * Matrice nulle
  50. if (amax.lt.xpet) then
  51. D(1)=XZERO
  52. D(2)=XZERO
  53. S(1,1)=1.D0
  54. S(2,1)=XZERO
  55. S(1,2)=XZERO
  56. S(2,2)=1.D0
  57. return
  58. endif
  59. C
  60. amax1=1.D0/amax
  61. do i=1,2
  62. do j=1,2
  63. R(j,i)=a(j,i)*amax1
  64. enddo
  65. enddo
  66. X1 =2.D0*R(1,2)
  67. X2 =R(1,1)-R(2,2)
  68. X3 =SQRT(X2*X2+X1*X1)
  69. D(1)=0.5D0*(R(1,1)+R(2,2)+X3)
  70. D(2)=D(1)-X3
  71. * Raccourci lorsque les deux valeurs propres sont egales
  72. *
  73. xsca=max(xpre,xpet)
  74. if (ldbg) then
  75. write(6,*) 'xpre,xpet,xsca,x3=',xpre,xpet,xsca,x3
  76. endif
  77. *
  78. if (x3.lt.xsca) then
  79. if (ldbg) write(6,*) '2 valeurs propres egales detectees'
  80. do i=1,2
  81. do j=1,2
  82. if (i.eq.j) then
  83. s(j,i)=1.d0
  84. else
  85. s(j,i)=0.d0
  86. endif
  87. enddo
  88. enddo
  89. goto 1000
  90. endif
  91. C
  92. C Appliquer la methode de Scherzinger et Dohrmann CMAME'08
  93. * Recherche du plus grand vecteur de l'image de A - d(1) I :
  94. C
  95. do i=1,2
  96. R(i,i)=R(i,i)-d(1)
  97. enddo
  98. imax=0
  99. xmax=0.d0
  100. do i=1,2
  101. xnr(i)=0.d0
  102. do j=1,2
  103. xnr(i)=xnr(i)+r(j,i)**2
  104. enddo
  105. if (xnr(i).gt.xmax) then
  106. xmax=xnr(i)
  107. imax=i
  108. endif
  109. enddo
  110. igr=imax
  111. * Normalement pas possible si valeurs propres non egales
  112. if (igr.eq.0) then
  113. igr=1
  114. r(1,1)=1.d0
  115. r(2,1)=0.d0
  116. else
  117. xnorm=sqrt(xnr(igr))
  118. do i=1,2
  119. r(i,igr)=r(i,igr)/xnorm
  120. enddo
  121. endif
  122. S(1,2)= r(1,igr)
  123. S(2,2)= r(2,igr)
  124. S(1,1)= S(2,2)
  125. S(2,1)=-S(1,2)
  126.  
  127. if (.false.) then
  128. * Methode ancienne
  129. R11=A(1,1)-D(1)
  130. R21=A(1,2)
  131. XNR1=SQRT(R11*R11+R21*R21)
  132. R12=A(2,1)
  133. R22=A(2,2)-D(1)
  134. XNR2=SQRT(R12*R12+R22*R22)
  135. IF (XNR1.GE.XNR2) THEN
  136. I=1
  137. T1=R11
  138. T2=R21
  139. XT=XNR1
  140. ELSE
  141. I=2
  142. T1=R12
  143. T2=R22
  144. XT=XNR2
  145. ENDIF
  146. C
  147. XSCA=MAX(MAX(ABS(D(1)),ABS(D(2)))*XZPREC,XPETIT)*2
  148. IF (XT.LE.XSCA) THEN
  149. * write(6,*) 'Cas 0'
  150. X5 = X1sr2
  151. S(1,1)=X5
  152. S(2,1)=SIGN(X5,X1)
  153. S(1,2)=-S(2,1)
  154. S(2,2)=X5
  155. ELSE
  156. *
  157. S1=T1/XT
  158. S2=T2/XT
  159. *
  160. * IF (I.EQ.1) THEN
  161. * write(6,*) 'Cas 1'
  162. S(1,1)= S2
  163. S(2,1)=-S1
  164. S(1,2)= S1
  165. S(2,2)= S2
  166. * ELSE
  167. * write(6,*) 'Cas 2'
  168. * S(1,1)= S1
  169. * S(2,1)= S2
  170. * S(1,2)=-S2
  171. * S(2,2)= S1
  172. * ENDIF
  173. ENDIF
  174. endif
  175. 1000 continue
  176. * Scaling des valeurs propres
  177. d(1)=d(1)*amax
  178. d(2)=d(2)*amax
  179. if (lverif) then
  180. * Orthonormalite
  181. call vmorth(s,2,3,xpre,r)
  182. if (ierr.ne.0) then
  183. write(6,*) '!!! X non orthonormale'
  184. if (ldbg) then
  185. write(6,*) 'Matrice des VPs s='
  186. do ii=1,2
  187. write (6,*) (s(ii,jj),jj=1,2)
  188. enddo
  189. write(6,*) 'Matrice des Pscals R='
  190. do ii=1,2
  191. write (6,*) (R(ii,jj),jj=1,2)
  192. enddo
  193. endif
  194. goto 9999
  195. endif
  196. * Vecteur propre
  197. xprevp=amax*xprev
  198. do i=1,2
  199. * vp(i) est-il bien le vp associe a la valeur propre d(i)
  200. * xnr espace de stockage ici
  201. call vvectp(a,2,3,d(i),s(1,i),xprevp,xnr)
  202. if (ierr.ne.0) then
  203. write(6,*) '!!! vp(i) nest pas vecteur propre i=',i
  204. if (ldbg) then
  205. write(6,*) ' v= (S - D(i)) s(j,i) ='
  206. write(6,*) (xnr(jj),jj=1,2)
  207. endif
  208. goto 9999
  209. endif
  210. enddo
  211. endif
  212. RETURN
  213. *
  214. * Error handling
  215. *
  216.  
  217. 9999 CONTINUE
  218. MOTERR(1:8)='JACOB2'
  219. call erreur(1127)
  220. RETURN
  221. END
  222.  
  223.  

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