sespc5
C SESPC5 SOURCE CB215821 20/11/25 13:39:46 10792 * ************************************************************************ * SESPC5 ************************************************************************ * FONCTION: * ON TEST LA CONVERGENCE DES ELEMENTS PROPRES Complexes: * 1./ TEST entre 2 itérés de LA VALEUR PROPRE complexe. * 2./ TEST SUR Le Residu = [A - lambda B]*X. * * AUTEUR, DATE DE CREATION: * Benoit Prabel (Novembre 2008) * ************************************************************ 1 IPA,IPB, BOOL1,BOOL2, NBMOD ) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC SMLREEL -INC SMLCHPO ****** * -- CONSTANTES -- *** PARAMETER ( PRECI1 = 1.0D-6 ) PARAMETER ( PRECI2 = 1.0D-6 ) ****** * -- ARGUMENTS -- *** POINTEUR ILVA1R.MLREEL,ILVA1I.MLREEL,ILVA2R.MLREEL,ILVA2I.MLREEL POINTEUR IPLCH1.MLCHPO, IPLCH2.MLCHPO INTEGER NBMOD, IPA,IPB, IPAX,IPBX LOGICAL BSWAP,BOOL1,BOOL2 ****** * -- VARIABLES LOCALES -- *** INTEGER IB100 REAL*8 XTMP, ALPHA1, ALPHA2, RESMAX,RESMAR,RESMAI CHARACTER*(LOCOMP) MOTCLE *---- ON TRIE ----------------------------------------------------- * le tri ne concerne que la liste 2 + le chpoint associé, * car on suppose la liste 1 deja ordonnée cbp,2019 segact,ILVA2R,ILVA2I segact,ILVA2R*mod segact,ILVA2I*mod segact,IPLCH2*mod * algo type tri a bulle: pas tres efficace mais simple (cf ORDVEC.eso) 10 CONTINUE BSWAP = .FALSE. * on boucle sur toutes les valeurs de la liste DO 100 IB100=1,(ILDIM-1) * on recupere la valeur test (la ib100 ième) XM1 = ((XR1**2) + (XI1**2))**0.5 XM2 = ((XR2**2) + (XI2**2))**0.5 * si le module de 2 val propre est trop proche, alors on trie selon la partie réelle if( (abs (XM1 - XM2)) .lt. (1.0D-5 * XM2)) then XM1 = XR1 XM2 = XR2 endif * cas ou la valeur est mal placée if(XM1 .gt. XM2) then cbp,2019 segdes,ILVA2R,ILVA2I cbp,2019 segact,ILVA2I*mod IF ( IERR .NE. 0 ) RETURN BSWAP = .TRUE. cbp,2019 segact,ILVA2R endif 100 CONTINUE IF(BSWAP) GOTO 10 *---- TESTS DE CONVERGENCE sur les NBMOD 1ers modes ---------------- BOOL1 = .true. BOOL2 = .true. JVEC = 0 segact,ILVA1R,ILVA1I cbp,2019 segact,IPLCH2 DO 200 IB200 =1,NBMOD JVEC = JVEC + 1 *------ CONVERGENCE DE LA VALEUR PROPRE ---------------------------- * pour l'instant on ne juge pas necessaire de tester la vitesse de cvgce de lambda * du moins pas de cette maniere qui utilise 2 itérés parfois très lointains.... goto 201 * write(*,*) 'test de la val p',JVEC,':',XR1,XI1,' ?=? ',XR2,XI2, * 1 ' ecart=',(XR2-XR1),(XI2-XI1) XREFR = max(PRECI1,(abs(XR2))) XREFI = max(PRECI1,(abs(XI2))) IF( ( (abs(XR2 - XR1)) .GT. (PRECI1*XREFR) ) 1 .OR. ( (abs(XI2 - XI1)) .GT. (PRECI1*XREFI) ) ) THEN BOOL1 = .FALSE. GOTO 900 ENDIF 201 CONTINUE *------ CONVERGENCE DU VECTEUR PROPRE (Residu nul) ------------------ * Cas d'un mode Réel IF(XI2 .eq. 0.D0) THEN * write(*,*) 'on va tester le vecteur reel num',JVEC IPCHP2 = IPLCH2.ICHPOI( JVEC ) RESMAX = abs (RESMAX) * write(*,*) 'mode reel JVEC,RESMAX=',JVEC,RESMAX * Cas d'un mode Complexe ELSE * write(*,*) 'on va tester le vecteur complexe num',JVEC ICHP2R = IPLCH2.ICHPOI( JVEC ) ICHP2I = IPLCH2.ICHPOI( JVEC + 1 ) RESMAX = (abs(RESMAR)) + (abs(RESMAI)) * write(*,*) 'mode complexe JVEC,RESMAX=',JVEC,RESMAX JVEC = JVEC + 1 ENDIF IF( IERR .NE. 0 ) RETURN * Test de convergence sur le residu IF(RESMAX .ge. PRECI2) then BOOL2 = .FALSE. GOTO 900 ENDIF if(JVEC .ge. NBMOD) goto 900 200 CONTINUE 900 CONTINUE SEGDES ,ILVA1R,ILVA1I, ILVA2R,ILVA2I, IPLCH2 * on modifie le nbmod proposé si le dernier mode est complexe * et que l'on a besoin du nbmod+1^ieme vecteur if(JVEC .gt. NBMOD) NBMOD=JVEC RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales