rayle2
C RAYLE2 SOURCE CB215821 20/11/25 13:38:31 10792 & ,IPRX, IPIX, ICVG) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H, O-Z) ***************************************************************************** * * * RAYLEI * * ------ * ***************************************************************************** * * Fonction: * Trouve les valeurs propres d'une matrice de Rayleigh. * * création : Benoit Prabel mars 2009 * * ***************************************************************************** * * PROCEDURE D APPEL: CALL RAYLEI (IPA, IPB, IV, IW, XRVP, XIVP,IPLMOX, * IPLMOY,DELTA, IPRX, IPIX) * -INC PPARAM -INC CCOPTIO -INC SMLMOTS -INC SMCHPOI -INC SMRIGID -INC CCHAMP REAL*8 A01(1:2,1:2),B01(1:2,1:2) REAL*8 etaR(1:2),etaI(1:2) REAL*8 XRVP, XIVP, XRES, alpha0, alpha1, alpha2, DELTA CHARACTER*(LOCOMP) MOTCLE ICVG = 0 *-------Projection du probleme sur la base de vecteurs (V, W) * write(*,*) A01(1,1),A01(1,2),'| -lambda |',B01(1,1),B01(1,2) * write(*,*) A01(2,1),A01(2,2),'| |',B01(2,1),B01(2,2) *-------%il faut annuler le determinant de la matrice |A01 - lambda B01| * % det(A01 - lambda B01) = alpha0 + alpha1 lambda + alpha2 lambda^2 alpha0 = (A01(1,1)*A01(2,2)) - (A01(2,1)*A01(1,2)) alpha1 = (A01(2,1)*B01(1,2)) + (B01(2,1)*A01(1,2)) & - (A01(1,1)*B01(2,2)) - (B01(1,1)*A01(2,2)) alpha2 = (B01(1,1)*B01(2,2)) - (B01(2,1)*B01(1,2)) DELTA = (alpha1**2) - (4.*alpha0*alpha2) * write(*,*) 'Rayleigh trouve Delta=',DELTA *-------% selon DELTA, on en deduit le type de val propres: * %- 1 val propre Reelle double if( (abs(DELTA)) .lt. 1.D-10) then goto 200 else * %- 2 val propres Reelles simples => il faut continuer a iterer if( DELTA .gt. 0.) then goto 300 * %- 2 val propres Complexes conjuguées => on resout elseif( DELTA .lt. 0.) then goto 100 else * %normalement, on n'arrive pas la... return endif endif 100 CONTINUE *-------%on se place dans le cas de 2 vp Complexes conjuguées XRVP +/- i*XIVP ICVG=1 XRVP = -1.*alpha1 / (2.*alpha2) XIVP = ((abs(DELTA))**0.5) / (2.*alpha2) * %reste a calculer eta (=vecteur solution du pb projeté), * %puis les vect propres associés * % on fixe la 1ere valeur à 1 + 0*i etaR(1)=1. etaI(1)=0. * % on crée a11R = A01(1,1) - XRVP*B01(1,1) a11I = - XIVP*B01(1,1) a12R = A01(1,2) - XRVP*B01(1,2) a12I = - XIVP*B01(1,2) xdenR = (a12R**2) + (a12I**2) etaR(2) = -1.*(a11R*a12R + a11I*a12I) / xdenR etaI(2) = -1.*(a11I*a12R - a11R*a12I) / xdenR * % calcul du vect propre * % normalisation Complexe => nouvelle routine NORM1C * appel a MOTS1 copié de itinv1.eso pour exclure LX * CALL MOTS1 (IPLMOT,MOTCLE) IPRX=IPRX1 IPIX=IPIX1 * % c'est fini ! goto 900 200 CONTINUE *-------%on se place dans le cas de 1 val propre Reelle double XRVP ICVG=2 XRVP = -1.*alpha1 / (2.*alpha2) XIVP = 0.D0 * % on met les 2 vecteurs orthonormée Réels dans IPRX et IPIX !!! * % => il faudra donc bien testé DELTA dans le programme * % qui appelle Rayleigh pour différencier du cas complexe !!! * CALL MOTS1 (IPLMOT,MOTCLE) goto 900 * 300 CONTINUE *-------%on se place dans le cas de 2 val propres Reelles simples distinctes XRVP = ((DELTA**0.5) - alpha1) / (2.*alpha2) XRVP2 = -1.*( (DELTA**0.5) + alpha1 ) / (2.*alpha2) * write(*,*) XRVP,XRVP2 if( abs(1. - abs(XRVP/XRVP2)) .gt. 1.D-5) then * % => il faut donc continuer a iterer pour les séparer (ou les confondre) + nettement ICVG=0 XRVP = 0.D0 XIVP = 0.D0 IPRX = 0 IPIX = 0 else * %on a 2 val p reelle simple de meme module -> on resout * -> non! on prefere n'en donner qu'une... ICVG=3 * XIVP = XRVP2 if( (XRVP .lt. 0.) .and. (XRVP2 .gt. 0.)) XRVP=XRVP2 XIVP = 0.D0 * % on fixe la 1ere valeur du 1er vecteur propre à 1 + 0*i etaR(1) = 1. a11R = A01(1,1) - XRVP*B01(1,1) a12R = A01(1,2) - XRVP*B01(1,2) if( abs(a12R) .lt. 1.E-10 ) then etaR(1) = 0. etaR(2) = 1. else etaR(2) = -1.*(a11R/a12R) endif * CALL MOTS1 (IPLMOT,MOTCLE) * % on fixe la 1ere valeur du 2eme vecteur propre à 1 + 0*i * etaR(1) = 1. * a11R = A01(1,1) - XRVP2*B01(1,1) * a12R = A01(1,2) - XRVP2*B01(1,2) * if( abs(a12R) .lt. 1.E-10 ) then * etaR(1) = 0. * etaR(2) = 1. * else * etaR(2) = -1.*(a11R/a12R) * endif * call ADCHPO (IV, IW, IPRX2, etaR(1), etaR(2)) * CALL MOTS1 (IPLMOT,MOTCLE) * CALL NORMA1 (IPRX2,IPLMOT,MOTCLE,IPRX2) * IPIX = IPRX2 IPIX = 0 endif 900 CONTINUE END
© Cast3M 2003 - Tous droits réservés.
Mentions légales