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