Télécharger sespc5.eso

Retour à la liste

Numérotation des lignes :

sespc5
  1. C SESPC5 SOURCE CB215821 20/11/25 13:39:46 10792
  2. *
  3. ************************************************************************
  4. * SESPC5
  5. ************************************************************************
  6. * FONCTION:
  7. * ON TEST LA CONVERGENCE DES ELEMENTS PROPRES Complexes:
  8. * 1./ TEST entre 2 itérés de LA VALEUR PROPRE complexe.
  9. * 2./ TEST SUR Le Residu = [A - lambda B]*X.
  10. *
  11. * AUTEUR, DATE DE CREATION:
  12. * Benoit Prabel (Novembre 2008)
  13. *
  14. ************************************************************
  15.  
  16. SUBROUTINE SESPC5 ( ILVA1R,ILVA1I, ILVA2R,ILVA2I, IPLCH2,
  17. 1 IPA,IPB, BOOL1,BOOL2, NBMOD )
  18.  
  19. IMPLICIT INTEGER(I-N)
  20. IMPLICIT REAL*8 (A-H,O-Z)
  21.  
  22. -INC PPARAM
  23. -INC CCOPTIO
  24. -INC SMLREEL
  25. -INC SMLCHPO
  26.  
  27. ******
  28. * -- CONSTANTES --
  29. ***
  30. PARAMETER ( PRECI1 = 1.0D-6 )
  31. PARAMETER ( PRECI2 = 1.0D-6 )
  32.  
  33. ******
  34. * -- ARGUMENTS --
  35. ***
  36. POINTEUR ILVA1R.MLREEL,ILVA1I.MLREEL,ILVA2R.MLREEL,ILVA2I.MLREEL
  37. POINTEUR IPLCH1.MLCHPO, IPLCH2.MLCHPO
  38. INTEGER NBMOD, IPA,IPB, IPAX,IPBX
  39. LOGICAL BSWAP,BOOL1,BOOL2
  40.  
  41. ******
  42. * -- VARIABLES LOCALES --
  43. ***
  44. INTEGER IB100
  45. REAL*8 XTMP, ALPHA1, ALPHA2, RESMAX,RESMAR,RESMAI
  46. CHARACTER*(LOCOMP) MOTCLE
  47.  
  48.  
  49. *---- ON TRIE -----------------------------------------------------
  50. * le tri ne concerne que la liste 2 + le chpoint associé,
  51. * car on suppose la liste 1 deja ordonnée
  52. cbp,2019 segact,ILVA2R,ILVA2I
  53. segact,ILVA2R*mod
  54. segact,ILVA2I*mod
  55. segact,IPLCH2*mod
  56. ILDIM = ILVA2R.PROG(/1)
  57.  
  58. * algo type tri a bulle: pas tres efficace mais simple (cf ORDVEC.eso)
  59. 10 CONTINUE
  60. BSWAP = .FALSE.
  61.  
  62. * on boucle sur toutes les valeurs de la liste
  63. DO 100 IB100=1,(ILDIM-1)
  64.  
  65. * on recupere la valeur test (la ib100 ième)
  66. XR1 = ILVA2R.PROG(IB100)
  67. XI1 = ILVA2I.PROG(IB100)
  68. XM1 = ((XR1**2) + (XI1**2))**0.5
  69. XR2 = ILVA2R.PROG(IB100 + 1)
  70. XI2 = ILVA2I.PROG(IB100 + 1)
  71. XM2 = ((XR2**2) + (XI2**2))**0.5
  72.  
  73. * si le module de 2 val propre est trop proche, alors on trie selon la partie réelle
  74. if( (abs (XM1 - XM2)) .lt. (1.0D-5 * XM2)) then
  75. XM1 = XR1
  76. XM2 = XR2
  77. endif
  78.  
  79. * cas ou la valeur est mal placée
  80. if(XM1 .gt. XM2) then
  81. cbp,2019 segdes,ILVA2R,ILVA2I
  82. CALL SWAP( IB100, ILVA2R, IPLCH2 )
  83. cbp,2019 segact,ILVA2I*mod
  84. XTMP = ILVA2I.PROG( IB100 )
  85. ILVA2I.PROG( IB100 ) = ILVA2I.PROG( IB100 + 1 )
  86. ILVA2I.PROG( IB100 + 1 ) = XTMP
  87. IF ( IERR .NE. 0 ) RETURN
  88. BSWAP = .TRUE.
  89. cbp,2019 segact,ILVA2R
  90. endif
  91.  
  92. 100 CONTINUE
  93.  
  94. IF(BSWAP) GOTO 10
  95.  
  96.  
  97.  
  98. *---- TESTS DE CONVERGENCE sur les NBMOD 1ers modes ----------------
  99. CALL MOTS1 (IPLMOT,MOTCLE)
  100. BOOL1 = .true.
  101. BOOL2 = .true.
  102. JVEC = 0
  103. segact,ILVA1R,ILVA1I
  104. cbp,2019 segact,IPLCH2
  105.  
  106. DO 200 IB200 =1,NBMOD
  107.  
  108. JVEC = JVEC + 1
  109.  
  110. *------ CONVERGENCE DE LA VALEUR PROPRE ----------------------------
  111.  
  112. XR1 = ILVA1R.PROG(JVEC)
  113. XI1 = ILVA1I.PROG(JVEC)
  114. XR2 = ILVA2R.PROG(JVEC)
  115. XI2 = ILVA2I.PROG(JVEC)
  116.  
  117. * pour l'instant on ne juge pas necessaire de tester la vitesse de cvgce de lambda
  118. * du moins pas de cette maniere qui utilise 2 itérés parfois très lointains....
  119. goto 201
  120.  
  121. * write(*,*) 'test de la val p',JVEC,':',XR1,XI1,' ?=? ',XR2,XI2,
  122. * 1 ' ecart=',(XR2-XR1),(XI2-XI1)
  123. XREFR = max(PRECI1,(abs(XR2)))
  124. XREFI = max(PRECI1,(abs(XI2)))
  125. IF( ( (abs(XR2 - XR1)) .GT. (PRECI1*XREFR) )
  126. 1 .OR. ( (abs(XI2 - XI1)) .GT. (PRECI1*XREFI) ) ) THEN
  127. BOOL1 = .FALSE.
  128. GOTO 900
  129. ENDIF
  130.  
  131. 201 CONTINUE
  132. *------ CONVERGENCE DU VECTEUR PROPRE (Residu nul) ------------------
  133.  
  134. * Cas d'un mode Réel
  135. IF(XI2 .eq. 0.D0) THEN
  136. * write(*,*) 'on va tester le vecteur reel num',JVEC
  137. IPCHP2 = IPLCH2.ICHPOI( JVEC )
  138. CALL MUCPRI ( IPCHP2, IPA, IPAX )
  139. CALL MUCPRI ( IPCHP2, IPB, IPBX )
  140. CALL COMBI2 ( IPAX, 1.D0, IPBX, (-1.D0*XR2), IRES )
  141. CALL DTCHPO (IPAX)
  142. CALL DTCHPO (IPBX)
  143. CALL MAXIM1 (IRES,IPLMOT,MOTCLE,0,RESMAX)
  144. CALL DTCHPO (IRES)
  145. RESMAX = abs (RESMAX)
  146. * write(*,*) 'mode reel JVEC,RESMAX=',JVEC,RESMAX
  147.  
  148.  
  149. * Cas d'un mode Complexe
  150. ELSE
  151. * write(*,*) 'on va tester le vecteur complexe num',JVEC
  152. ICHP2R = IPLCH2.ICHPOI( JVEC )
  153. ICHP2I = IPLCH2.ICHPOI( JVEC + 1 )
  154. CALL COMBI2 (ICHP2R,(-1.D0*XR2),ICHP2I,XI2,ICHP3R)
  155. CALL COMBI2 (ICHP2R,(-1.D0*XI2),ICHP2I,(-1.D0*XR2),ICHP3I)
  156. CALL MUCPRI ( ICHP2R, IPA, IPAXR )
  157. CALL MUCPRI ( ICHP3R, IPB, IPBXR )
  158. CALL DTCHPO (ICHP3R)
  159. CALL MUCPRI ( ICHP2I, IPA, IPAXI )
  160. CALL MUCPRI ( ICHP3I, IPB, IPBXI )
  161. CALL DTCHPO (ICHP3I)
  162. CALL COMBI2 ( IPAXR, 1.D0, IPBXR, 1.D0, IRESR )
  163. CALL DTCHPO (IPAXR)
  164. CALL DTCHPO (IPBXR)
  165. CALL COMBI2 ( IPAXI, 1.D0, IPBXI, 1.D0, IRESI )
  166. CALL DTCHPO (IPAXI)
  167. CALL DTCHPO (IPBXI)
  168. CALL MAXIM1 (IRESR,IPLMOT,MOTCLE,0,RESMAR)
  169. CALL DTCHPO (IRESR)
  170. CALL MAXIM1 (IRESI,IPLMOT,MOTCLE,0,RESMAI)
  171. CALL DTCHPO (IRESI)
  172. RESMAX = (abs(RESMAR)) + (abs(RESMAI))
  173. * write(*,*) 'mode complexe JVEC,RESMAX=',JVEC,RESMAX
  174. JVEC = JVEC + 1
  175. ENDIF
  176.  
  177. IF( IERR .NE. 0 ) RETURN
  178.  
  179. * Test de convergence sur le residu
  180. IF(RESMAX .ge. PRECI2) then
  181. BOOL2 = .FALSE.
  182. GOTO 900
  183. ENDIF
  184.  
  185. if(JVEC .ge. NBMOD) goto 900
  186.  
  187.  
  188. 200 CONTINUE
  189.  
  190. 900 CONTINUE
  191. SEGDES ,ILVA1R,ILVA1I, ILVA2R,ILVA2I, IPLCH2
  192. * on modifie le nbmod proposé si le dernier mode est complexe
  193. * et que l'on a besoin du nbmod+1^ieme vecteur
  194. if(JVEC .gt. NBMOD) NBMOD=JVEC
  195.  
  196. RETURN
  197. END
  198.  
  199.  
  200.  
  201.  
  202.  
  203.  

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