Télécharger rayle2.eso

Retour à la liste

Numérotation des lignes :

rayle2
  1. C RAYLE2 SOURCE CB215821 20/11/25 13:38:31 10792
  2. SUBROUTINE RAYLE2 (IPA,IPB,IV,IW,XRVP,XIVP,IPLMOX,IPLMOY,DELTA
  3. & ,IPRX, IPIX, ICVG)
  4. IMPLICIT INTEGER(I-N)
  5. IMPLICIT REAL*8 (A-H, O-Z)
  6.  
  7. *****************************************************************************
  8. * *
  9. * RAYLEI *
  10. * ------ *
  11. *****************************************************************************
  12. *
  13. * Fonction:
  14. * Trouve les valeurs propres d'une matrice de Rayleigh.
  15. *
  16. * création : Benoit Prabel mars 2009
  17. *
  18. *
  19. *****************************************************************************
  20. *
  21. * PROCEDURE D APPEL: CALL RAYLEI (IPA, IPB, IV, IW, XRVP, XIVP,IPLMOX,
  22. * IPLMOY,DELTA, IPRX, IPIX)
  23. *
  24.  
  25. -INC PPARAM
  26. -INC CCOPTIO
  27. -INC SMLMOTS
  28. -INC SMCHPOI
  29. -INC SMRIGID
  30. -INC CCHAMP
  31.  
  32. REAL*8 A01(1:2,1:2),B01(1:2,1:2)
  33. REAL*8 etaR(1:2),etaI(1:2)
  34. REAL*8 XRVP, XIVP, XRES, alpha0, alpha1, alpha2, DELTA
  35. CHARACTER*(LOCOMP) MOTCLE
  36.  
  37. ICVG = 0
  38.  
  39. *-------Projection du probleme sur la base de vecteurs (V, W)
  40. call MUCPRI (IV, IPA, IPAV)
  41. call MUCPRI (IW, IPA, IPAW)
  42. CALL MUCPRI (IV, IPB, IPBV)
  43. CALL MUCPRI (IW, IPB, IPBW)
  44. call XTY1 (IV, IPAV, IPLMOX, IPLMOY, A01(1,1) )
  45. call XTY1 (IV, IPAW, IPLMOX, IPLMOY, A01(1,2) )
  46. call XTY1 (IW, IPAV, IPLMOX, IPLMOY, A01(2,1) )
  47. call XTY1 (IW, IPAW, IPLMOX, IPLMOY, A01(2,2) )
  48. call XTY1 (IV, IPBV, IPLMOX, IPLMOY, B01(1,1) )
  49. call XTY1 (IV, IPBW, IPLMOX, IPLMOY, B01(1,2) )
  50. call XTY1 (IW, IPBV, IPLMOX, IPLMOY, B01(2,1) )
  51. call XTY1 (IW, IPBW, IPLMOX, IPLMOY, B01(2,2) )
  52. * write(*,*) A01(1,1),A01(1,2),'| -lambda |',B01(1,1),B01(1,2)
  53. * write(*,*) A01(2,1),A01(2,2),'| |',B01(2,1),B01(2,2)
  54.  
  55.  
  56. *-------%il faut annuler le determinant de la matrice |A01 - lambda B01|
  57. * % det(A01 - lambda B01) = alpha0 + alpha1 lambda + alpha2 lambda^2
  58. alpha0 = (A01(1,1)*A01(2,2)) - (A01(2,1)*A01(1,2))
  59. alpha1 = (A01(2,1)*B01(1,2)) + (B01(2,1)*A01(1,2))
  60. & - (A01(1,1)*B01(2,2)) - (B01(1,1)*A01(2,2))
  61. alpha2 = (B01(1,1)*B01(2,2)) - (B01(2,1)*B01(1,2))
  62. DELTA = (alpha1**2) - (4.*alpha0*alpha2)
  63. * write(*,*) 'Rayleigh trouve Delta=',DELTA
  64.  
  65. *-------% selon DELTA, on en deduit le type de val propres:
  66. * %- 1 val propre Reelle double
  67. if( (abs(DELTA)) .lt. 1.D-10) then
  68. goto 200
  69. else
  70. * %- 2 val propres Reelles simples => il faut continuer a iterer
  71. if( DELTA .gt. 0.) then
  72. goto 300
  73. * %- 2 val propres Complexes conjuguées => on resout
  74. elseif( DELTA .lt. 0.) then
  75. goto 100
  76. else
  77. * %normalement, on n'arrive pas la...
  78. return
  79. endif
  80. endif
  81.  
  82. 100 CONTINUE
  83. *-------%on se place dans le cas de 2 vp Complexes conjuguées XRVP +/- i*XIVP
  84. ICVG=1
  85. XRVP = -1.*alpha1 / (2.*alpha2)
  86. XIVP = ((abs(DELTA))**0.5) / (2.*alpha2)
  87. * %reste a calculer eta (=vecteur solution du pb projeté),
  88. * %puis les vect propres associés
  89. * % on fixe la 1ere valeur à 1 + 0*i
  90. etaR(1)=1.
  91. etaI(1)=0.
  92. * % on crée
  93. a11R = A01(1,1) - XRVP*B01(1,1)
  94. a11I = - XIVP*B01(1,1)
  95. a12R = A01(1,2) - XRVP*B01(1,2)
  96. a12I = - XIVP*B01(1,2)
  97. xdenR = (a12R**2) + (a12I**2)
  98. etaR(2) = -1.*(a11R*a12R + a11I*a12I) / xdenR
  99. etaI(2) = -1.*(a11I*a12R - a11R*a12I) / xdenR
  100. * % calcul du vect propre
  101. call ADCHPO (IV, IW, IPRX, etaR(1), etaR(2))
  102. call ADCHPO (IV, IW, IPIX, etaI(1), etaI(2))
  103. * % normalisation Complexe => nouvelle routine NORM1C
  104. * appel a MOTS1 copié de itinv1.eso pour exclure LX
  105. * CALL MOTS1 (IPLMOT,MOTCLE)
  106. CALL MOTS2 (IPLMOT,MOTCLE)
  107. CALL NORM1C (IPRX,IPIX,IPLMOT,MOTCLE,IPRX1,IPIX1)
  108. IPRX=IPRX1
  109. IPIX=IPIX1
  110. * % c'est fini !
  111. goto 900
  112.  
  113. 200 CONTINUE
  114. *-------%on se place dans le cas de 1 val propre Reelle double XRVP
  115. ICVG=2
  116. XRVP = -1.*alpha1 / (2.*alpha2)
  117. XIVP = 0.D0
  118. * % on met les 2 vecteurs orthonormée Réels dans IPRX et IPIX !!!
  119. * % => il faudra donc bien testé DELTA dans le programme
  120. * % qui appelle Rayleigh pour différencier du cas complexe !!!
  121. * CALL MOTS1 (IPLMOT,MOTCLE)
  122. CALL MOTS2 (IPLMOT,MOTCLE)
  123. call NORMA1 (IV,IPLMOT,MOTCLE,IPRX)
  124. call NORMA1 (IW,IPLMOT,MOTCLE,IPIX)
  125. goto 900
  126. *
  127. 300 CONTINUE
  128. *-------%on se place dans le cas de 2 val propres Reelles simples distinctes
  129. XRVP = ((DELTA**0.5) - alpha1) / (2.*alpha2)
  130. XRVP2 = -1.*( (DELTA**0.5) + alpha1 ) / (2.*alpha2)
  131. * write(*,*) XRVP,XRVP2
  132. if( abs(1. - abs(XRVP/XRVP2)) .gt. 1.D-5) then
  133. * % => il faut donc continuer a iterer pour les séparer (ou les confondre) + nettement
  134. ICVG=0
  135. XRVP = 0.D0
  136. XIVP = 0.D0
  137. IPRX = 0
  138. IPIX = 0
  139. else
  140. * %on a 2 val p reelle simple de meme module -> on resout
  141. * -> non! on prefere n'en donner qu'une...
  142. ICVG=3
  143. * XIVP = XRVP2
  144. if( (XRVP .lt. 0.) .and. (XRVP2 .gt. 0.)) XRVP=XRVP2
  145. XIVP = 0.D0
  146. * % on fixe la 1ere valeur du 1er vecteur propre à 1 + 0*i
  147. etaR(1) = 1.
  148. a11R = A01(1,1) - XRVP*B01(1,1)
  149. a12R = A01(1,2) - XRVP*B01(1,2)
  150. if( abs(a12R) .lt. 1.E-10 ) then
  151. etaR(1) = 0.
  152. etaR(2) = 1.
  153. else
  154. etaR(2) = -1.*(a11R/a12R)
  155. endif
  156. call ADCHPO (IV, IW, IPRX, etaR(1), etaR(2))
  157. * CALL MOTS1 (IPLMOT,MOTCLE)
  158. CALL MOTS2 (IPLMOT,MOTCLE)
  159. CALL NORMA1 (IPRX,IPLMOT,MOTCLE,IPRX)
  160. * % on fixe la 1ere valeur du 2eme vecteur propre à 1 + 0*i
  161. * etaR(1) = 1.
  162. * a11R = A01(1,1) - XRVP2*B01(1,1)
  163. * a12R = A01(1,2) - XRVP2*B01(1,2)
  164. * if( abs(a12R) .lt. 1.E-10 ) then
  165. * etaR(1) = 0.
  166. * etaR(2) = 1.
  167. * else
  168. * etaR(2) = -1.*(a11R/a12R)
  169. * endif
  170. * call ADCHPO (IV, IW, IPRX2, etaR(1), etaR(2))
  171. * CALL MOTS1 (IPLMOT,MOTCLE)
  172. * CALL NORMA1 (IPRX2,IPLMOT,MOTCLE,IPRX2)
  173. * IPIX = IPRX2
  174. IPIX = 0
  175. endif
  176.  
  177. 900 CONTINUE
  178.  
  179. END
  180.  
  181.  
  182.  
  183.  
  184.  
  185.  
  186.  

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