Télécharger b3_v33.eso

Retour à la liste

Numérotation des lignes :

b3_v33
  1. C B3_V33 SOURCE PV090527 23/02/15 21:15:03 11592
  2. c**************************************************************************************
  3. subroutine b3_v33(x33,x3,v33)
  4. c A.Sellier jeu. 02 sept. 2010 18:13:24 CEST
  5. c diagonalisagion 33 a partir de jacobi + quelques controles
  6. c declarations externes
  7. implicit real*8(a-h,m-z)
  8. implicit integer(i-l)
  9. real*8 x33(3,3),x3(3),v33(3,3),y33(3,3)
  10. c declarations locales
  11. real*8 epsv,xmax,depsv
  12. integer i,j,k
  13. real*8 un
  14. real*8 eps3(3)
  15. c une matrice est consideree comme deja diagonale si test 20 verifie
  16. c fonction de la prescision relative epsv
  17. c epsv est aussi utilise dans jacob3 pour decider si deux valeurs
  18. c propres petites par rapport a la troisieme peuvent etre consideree
  19. c comme des doubles, ce qui evite de rechercher des vecteurs propres
  20. c avec une matrice mal conditonnee
  21. c enfin epsv est utilise en fin de programme pour tester si la matrice
  22. c de passage fonctionne correctement, pour cela on verifie si la propriete
  23. c vt*v est verifiee a epsv pres hors diagonale si ce n est pas le cas
  24. c on affiche un message non bloquant
  25. parameter(un=1.d0,epsv=1.d-6)
  26. real*8 v33t(3,3)
  27. real*8 u33(3,3),u033(3,3),dif33(3,3)
  28. real*8 xmax1
  29. logical vpmultiple,erreur,diago,ordre
  30. real*8 trace,z3(3),z33(3,3)
  31. integer imax,imin,imed
  32. real*8 zmax,zmin,zmed
  33. c epsv*d(1) valeur en dessous la quelle un terme hors diagonale est negligee
  34. c lors du calcul des vecteurs propres
  35. vpmultiple=.false.
  36. diago=.false.
  37. ordre=.true.
  38. erreur=.false.
  39.  
  40. c print*
  41. c call afic33(x33)
  42. c-----------------------------------------------------------------------
  43. c normalisation du tenseur avant digonalisation
  44. c print*,'avant normalisation ds b3_v33'
  45. c call afic33(x33)
  46. c xmax1=1.0d-8
  47. c do i=1,3
  48. c do j=1,3
  49. c xmax1=dmax1(xmax1,dabs(x33(i,j)))
  50. c end do
  51. c end do
  52. c do i=1,3
  53. c do j=1,3
  54. c x33(i,j)=x33(i,j)/xmax1
  55. c end do
  56. c end do
  57. c print*,'apres normalisation ds b3_v33'
  58. c call afic33(x33)
  59. c-----------------------------------------------------------------------
  60.  
  61. C STOCKAGE de x33 dans y33 pour diagonalisation par jacobi iterative
  62. c car cette methode ecrit sur y33
  63. do i=1,3
  64. do j=1,3
  65. y33(i,j)=x33(i,j)
  66. end do
  67. end do
  68. * call b3_jac(y33,v33,x3)
  69. call dsyevj3(y33,v33,x3)
  70.  
  71. c***********************************************************************
  72. c controle de l ordre des valeurs propres
  73. if((x3(1).gt.x3(2)).and.
  74. # (x3(2).gt.x3(3))) then
  75. continue
  76. else
  77. c on remet de l ordre
  78. trace=0.d0
  79. do i=1,3
  80. z3(i)=x3(i)
  81. trace=trace+z3(i)
  82. do j=1,3
  83. z33(i,j)=v33(i,j)
  84. end do
  85. end do
  86. c on cherche la plus grande valeur propre
  87. imax=1
  88. zmax=z3(imax)
  89. do i=2,3
  90. if(z3(i).gt.zmax) then
  91. imax=i
  92. zmax=z3(i)
  93. end if
  94. end do
  95. c on cherche la plus petite
  96. imin=3
  97. zmin=z3(imin)
  98. do i=2,1,-1
  99. if(z3(i).lt.zmin) then
  100. imin=i
  101. zmin=z3(i)
  102. end if
  103. end do
  104. if (imin.ne.imax) then
  105. c on deduit l intermediaire
  106. zmed=trace-(zmin+zmax)
  107. imed=6-(imin+imax)
  108. c on range correctement
  109. x3(1)=z3(imax)
  110. x3(2)=z3(imed)
  111. x3(3)=z3(imin)
  112. do j=1,3
  113. v33(j,1)=z33(j,imax)
  114. v33(j,2)=z33(j,imed)
  115. v33(j,3)=z33(j,imin)
  116. end do
  117. c on teste si c est bien dans l ordre
  118. C call chre3(z33,y33,v33)
  119. C if( (z33(1,1).lt.z33(2,2)).or.
  120. C # (z33(2,2).lt.z33(3,3)).or.
  121. C # (z33(1,1).lt.z33(3,3)) ) then
  122. C print*,'erreur b3_v33 lors du classement des VP'
  123. C print*,'valeurs propres:'
  124. C do i=1,3
  125. C write(*,'(A2,I1,A2,E10.3)') 'x(',i,')=',x3(i)
  126. C end do
  127. C print*,'matrice a diagonaliser'
  128. C call afic33(y33)
  129. C print*,'matrice de passage'
  130. C call afic33(v33)
  131. C print*,'matrice diagonale'
  132. C call afic33(z33)
  133. C erreur=.true.
  134. C end if
  135. end if
  136. end if
  137. c***********************************************************************
  138.  
  139. c controle des normes de v33
  140. do i=1,3
  141. xn=sqrt(v33(1,i)**2+v33(2,i)**2+v33(3,i)**2)
  142. c print*,'norme v(',i,')=',xn
  143. if(abs(xn-1.d0).gt.1.d-4) then
  144. print*,'vecteur propre anormal ds b3_v33'
  145. call afic33(x33)
  146. c print*,'remplacement par vi v vj'
  147. call indce1(i,k,l)
  148. v33(1,i)=v33(2,k)*v33(3,l)-v33(3,k)*v33(2,l)
  149. v33(2,i)=v33(3,k)*v33(1,l)-v33(1,k)*v33(3,l)
  150. v33(3,i)=v33(1,k)*v33(2,l)-v33(2,k)*v33(1,l)
  151. xn=sqrt(v33(1,i)**2+v33(2,i)**2+v33(3,i)**2)
  152. do k=1,3
  153. v33(k,i)=v33(k,i)/xn
  154. end do
  155. call afic33(v33)
  156. c read*
  157. end if
  158. end do
  159. goto 30
  160.  
  161. c **verif produit scalaire entre v1 et v2*****
  162. 20 eps1=0.d0
  163. do i=1,3
  164. eps1=eps1+v33(i,1)*v33(i,2)
  165. end do
  166. c print*,'valp33 v1.v2=',eps1
  167. if(abs(eps1).gt.1.d-4) then
  168. c print*,'erreur produit scalaire v1 v2 av :',eps1
  169. c test produit scalaire v1 v3
  170. eps1=0.d0
  171. do i=1,3
  172. eps1=eps1+v33(i,1)*v33(i,3)
  173. end do
  174. if(abs(eps1).gt.1.d-4) then
  175. c print*,'erreur produit scalaire v1 v3 av :',eps1
  176. c correction de v1
  177. do i=1,3
  178. v33(i,1)=v33(i,1)-eps1*v33(i,3)
  179. end do
  180. c renormalisation
  181. xn=dsqrt(v33(1,1)**2+v33(2,1)**2+v33(3,1)**2)
  182. do i=1,3
  183. v33(i,1)=v33(i,1)/xn
  184. end do
  185. c erreur=.true.
  186. c goto 10
  187. end if
  188. c v1 et v3 etant orthogonaux on reconstruit v2 par produit
  189. c vectoriel
  190. v33(1,2)=v33(2,1)*v33(3,3)-v33(3,1)*v33(2,3)
  191. v33(2,2)=v33(3,1)*v33(1,3)-v33(1,1)*v33(3,3)
  192. v33(3,2)=v33(1,1)*v33(2,3)-v33(2,1)*v33(1,3)
  193. else
  194. c test produit scalaire v2 v3
  195. eps1=0.d0
  196. do i=1,3
  197. eps1=eps1+v33(i,2)*v33(i,3)
  198. end do
  199. c print*,'valp33 v2.v3=',eps1
  200. if(abs(eps1).gt.1.d-4) then
  201. c print*,'erreur produit scalaire v2 v3 av :',eps1
  202. c test produit scalaire v1 v3
  203. eps1=0.d0
  204. do i=1,3
  205. eps1=eps1+v33(i,1)*v33(i,3)
  206. end do
  207. if(abs(eps1).gt.1.d-4) then
  208. c print*,'erreur produit scalaire v1 v3 av :',eps1
  209. c correction de v3
  210. do i=1,3
  211. v33(i,3)=v33(i,3)-eps1*v33(i,1)
  212. end do
  213. c renormalisation
  214. xn=dsqrt(v33(1,3)**2+v33(2,3)**2+v33(3,3)**2)
  215. do i=1,3
  216. v33(i,3)=v33(i,3)/xn
  217. end do
  218. end if
  219. c v1 et v3 etant orthogonaux on reconstruit v2 par produit
  220. c vectoriel
  221. v33(1,2)=v33(2,1)*v33(3,3)-v33(3,1)*v33(2,3)
  222. v33(2,2)=v33(3,1)*v33(1,3)-v33(1,1)*v33(3,3)
  223. v33(3,2)=v33(1,1)*v33(2,3)-v33(2,1)*v33(1,3)
  224. else
  225. c test du produit scalaire entre v1 v3
  226. eps1=0.d0
  227. do i=1,3
  228. eps1=eps1+v33(i,1)*v33(i,3)
  229. end do
  230. c print*,'valp33 v3.v1=',eps1
  231. if(dabs(eps1).gt.1.d-4) then
  232. c print*,'erreur produit scalaire v3 v1 av :',eps1
  233. c test produit scalaire v3 v2
  234. eps1=0.d0
  235. do i=1,3
  236. eps1=eps1+v33(i,2)*v33(i,3)
  237. end do
  238. if(dabs(eps1).gt.1.d-4) then
  239. c print*,'erreur produit scalaire v3 v2 av :',eps1
  240. c correction de v3 avec v2
  241. do i=1,3
  242. v33(i,3)=v33(i,3)-eps1*v33(i,2)
  243. end do
  244. c renormalisation
  245. xn=dsqrt(v33(1,3)**2+v33(2,3)**2+v33(3,3)**2)
  246. do i=1,3
  247. v33(i,3)=v33(i,3)/xn
  248. end do
  249. c v2 et v3 etant orthogonaux on reconstruit v1 par produit
  250. c vectoriel
  251. v33(1,1)=v33(2,2)*v33(3,3)-v33(3,2)*v33(2,3)
  252. v33(2,1)=v33(3,2)*v33(1,3)-v33(1,2)*v33(3,3)
  253. v33(3,1)=v33(1,2)*v33(2,3)-v33(2,2)*v33(1,3)
  254. end if
  255. end if
  256. end if
  257. end if
  258.  
  259. 30 continue
  260. c mise en ordre du produit vectoriel
  261. v33(1,3)=v33(2,1)*v33(3,2)-v33(3,1)*v33(2,2)
  262. v33(2,3)=v33(3,1)*v33(1,2)-v33(1,1)*v33(3,2)
  263. v33(3,3)=v33(1,1)*v33(2,2)-v33(2,1)*v33(1,2)
  264.  
  265.  
  266. c matrice de passage inverse
  267. do i=1,3
  268. do j=1,3
  269. v33t(i,j)=v33(j,i)
  270. end do
  271. end do
  272.  
  273. c***********************************************
  274.  
  275. c verif validite des matrice de passage
  276. c (on change de nase une matrice unitaire)
  277.  
  278. call mtmt3d(v33,v33t,3,3,3,u33)
  279. c print*,'Image matrice identite apres correction'
  280. c call afic33(u33)
  281. do i=1,3
  282. do j=1,3
  283. if (i.eq.j)then
  284. if( abs(u33(i,i)-un) .gt. sqrt(epsv))then
  285. erreur=.true.
  286. goto 10
  287. endif
  288. else
  289. if( abs(u33(i,j)) .gt. sqrt(epsv))then
  290. erreur=.true.
  291. goto 10
  292. endif
  293. end if
  294. end do
  295. end do
  296. c affichage des variables en cas de pb de diagonalisation
  297. c10 continue
  298.  
  299.  
  300. 10 if(erreur)then
  301. print*,'_______________________________'
  302. print*,'pb vecteur propre ds b3_v33'
  303. print*,'matrice deja diagonale :',diago
  304. print*,'ordre :',ordre
  305. print*,'vp multiple :',vpmultiple
  306. print*,'matrice a diagonaliser :'
  307. call afic33(x33)
  308. print*,'valeurs propres:',x3(1),x3(2),x3(3)
  309. print*,'x1-x2',x3(1)-x3(2)
  310. print*,'x2-x3',x3(2)-x3(3)
  311. print*,'|',epsv,'*x(1)|',dabs(epsv * x3(1))
  312. print*,'|',epsv,'*x(2)|',dabs(epsv * x3(2))
  313. print*,'matrice de passage:'
  314. call afic33(v33)
  315. print*,'image matrice identite:'
  316. call afic33(u33)
  317. print*,'valeurs propres:',x3(1),x3(2),x3(3)
  318. print*,'matrice de passage:'
  319. call afic33(v33)
  320. c read*
  321. end if
  322.  
  323. return
  324. end
  325. ***************************************************************************************
  326.  
  327.  
  328.  
  329.  
  330.  

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