Télécharger jacod3.eso

Retour à la liste

Numérotation des lignes :

jacod3
  1. C JACOD3 SOURCE GOUNAND 25/10/27 21:15:04 12387
  2. subroutine jacod3(a,idima,d)
  3. C======================================================================
  4. C OBJET
  5. C -----
  6. C DIAGONALISATION D UNE MATRICE 3*3 SYMETRIQUE
  7. C sans sortir les vecteurs propres
  8. C
  9. C 2025/10 Gounand : on reprend la methode robuste et precise de
  10. C jacob3.eso
  11. C
  12. C ENTREES
  13. C -------
  14. C A(3,3) = MATRICE SYMETRIQUE
  15. C IDIM = 2 OU 3 SI 2 ON NE S OCCUPE QUE DE A(2,2)
  16. C SI 3 DE A(3,3)
  17. C SORTIES
  18. C -------
  19. C D(3) = VALEURS PROPRES ORDONNEES D(1)>D(2)>D(3)
  20. C
  21. C===============================================================
  22. IMPLICIT INTEGER(I-N)
  23. IMPLICIT REAL*8 (A-H,O-Z)
  24. -INC PPARAM
  25. -INC CCOPTIO
  26. -INC CCREEL
  27. dimension a(3,3),d(3),s(3,3),as(3,3)
  28. *
  29. * Impressions
  30. xpet=xpetit*10.D0
  31. if (idima.ne.3) then
  32. call jacod2(a,d)
  33. return
  34. endif
  35. *
  36. * SCALING DE A
  37. *
  38. amax=0.d0
  39. do i=1,idima
  40. do j=1,idima
  41. amax=max(amax,abs(a(j,i)))
  42. enddo
  43. enddo
  44. * Matrice nulle
  45. if (amax.lt.xpet) then
  46. do i=1,idima
  47. d(i)=0.D0
  48. enddo
  49. return
  50. endif
  51. C
  52. amax1=1.D0/amax
  53. do i=1,idima
  54. do j=1,idima
  55. as(j,i)=a(j,i)*amax1
  56. enddo
  57. enddo
  58. *
  59. * CALCUL DES INVARIANTS
  60. *
  61. * On applique la methode de Harari et Albocher IJNME'2023
  62. * pour calculer les invariants et les valeurs propres
  63. * Invariants J1=TRACE, J2, J3=DET
  64. xj1=as(1,1)+as(2,2)+as(3,3)
  65. do i=1,idima
  66. do j=1,idima
  67. if (i.eq.j) then
  68. s(j,i)=as(j,i)-xj1/3
  69. else
  70. s(j,i)=as(j,i)
  71. endif
  72. enddo
  73. enddo
  74. * Dans la methode, on veut les invariants J2(S) et J3(S)
  75. * où S est le deviateur de A (A = S + J1(A)/3 I)
  76. * On a J1(S)=0 et lambda_A = lambda_S + J1(A)/3
  77. *
  78. * A et S ont les memes vecteurs propres
  79. *
  80. * On exprime les invariants de S de maniere stable en fonction des
  81. * termes de A en particulier les differences diagonales
  82. * En particulier J2 et J4 sont exprimes sous forme de sommes de
  83. * carres donc positif. On peut donc en prendre les racines carrees
  84. * sans fremir
  85. d12=as(1,1)-as(2,2)
  86. d23=as(2,2)-as(3,3)
  87. d31=as(3,3)-as(1,1)
  88. * Expression de J2(S)
  89. xj2d=(d12**2+d23**2+d31**2)/6
  90. xj2o=as(1,2)**2+as(2,3)**2+as(3,1)**2
  91. xj2=xj2d+xj2o
  92. * Expression du determinant J3(S)
  93. xj3d=(d12-d31)*(d23-d12)*(d31-d23)/27
  94. xj3m=(d12-d31)*as(2,3)**2+(d23-d12)*as(3,1)**2
  95. $ +(d31-d23)*as(1,2)**2
  96. xj3m=-xj3m/3
  97. xj3o=2.d0*as(1,2)*as(2,3)*as(3,1)
  98. xj3=xj3d+xj3m+xj3o
  99. * Expression du discriminant Delta(S)=J4(S)=4 J2(S)^3 - 27 J3(S)^2
  100. xj4x=d12*d23*d31
  101. $ + as(1,2)**2*d12 + as(2,3)**2*d23 + as(1,3)**2*d31
  102. xj4y1=as(2,3)*(2*as(2,3)**2 - as(1,3)**2 - as(1,2)**2 + 2*d12*d31)
  103. $ +as(1,2)*as(1,3)*(d12-d31)
  104. xj4y2=as(1,3)*(2*as(1,3)**2 - as(2,3)**2 - as(1,2)**2 + 2*d23*d12)
  105. $ +as(1,2)*as(2,3)*(d23-d12)
  106. xj4y3=as(1,2)*(2*as(1,2)**2 - as(2,3)**2 - as(1,3)**2 + 2*d31*d23)
  107. $ +as(1,3)*as(2,3)*(d31-d23)
  108. xj4z1=as(2,3)*(as(1,3)**2 - as(1,2)**2) + as(1,2)*as(1,3)*d23
  109. xj4z2=as(1,3)*(as(1,2)**2 - as(2,3)**2) + as(2,3)*as(1,2)*d31
  110. xj4z3=as(1,2)*(as(2,3)**2 - as(1,3)**2) + as(1,3)*as(2,3)*d12
  111. *
  112. xj4=xj4x**2+xj4y1**2+xj4y2**2+xj4y3**2
  113. $ + 15* (xj4z1**2+xj4z2**2+xj4z3**2)
  114. *
  115. * CALCUL DES VALEURS PROPRES
  116. *
  117. sdet=sign(1.d0,xj3)
  118. xsj4=sqrt(xj4)
  119. xsj2=sqrt(xj2)
  120. xdenom=2*xj2*xsj2+3*sqrt(3.d0)*sdet*xj3
  121. ang=2.d0/3.d0*atan2(xsj4,xdenom)
  122. xf1=xsj2*sdet
  123. xf2=cos(ang)/sqrt(3.d0)
  124. xf3=sin(ang)
  125. * Si sdet=1 ds1 .GE. ds2 .GE. ds3
  126. * Si sdet=-1 ds3 .GE. ds2 .GE. ds1
  127. * dsi sont les valeurs propres de S
  128. * dAi sont les valeurs propres de A
  129. ds1=2*xf1*xf2
  130. ds2=xf1*(xf3-xf2)
  131. ds3=xf1*(-xf3-xf2)
  132. xj13=xj1/3
  133. das1=ds1+xj13
  134. das2=ds2+xj13
  135. das3=ds3+xj13
  136. d(2)=das2*amax
  137. if (sdet.gt.0) then
  138. d(1)=das1*amax
  139. d(3)=das3*amax
  140. else
  141. d(3)=das1*amax
  142. d(1)=das3*amax
  143. endif
  144. return
  145. end
  146.  
  147.  

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