Télécharger simu21.eso

Retour à la liste

Numérotation des lignes :

simu21
  1. C SIMU21 SOURCE FANDEUR 10/12/14 21:19:41 6806
  2.  
  3. SUBROUTINE SIMU21(IPLA,IPLB,iplc,NMOD,CONV,nbonve,numv1,
  4. $ iplval,iphi,IPERM,XPREC21)
  5.  
  6. *********************************************************************
  7. *
  8. * S I M U 2 1
  9. * -----------
  10. *
  11. * FONCTION:
  12. * ---------
  13. * Passage au petit probleme (calcul de T et de D),
  14. * Resolution du petit probleme [T-(1/lambda)D]*Phi=0
  15. * Test de convergence
  16. *
  17. * PARAMETRES : (E)=ENTREE (S)=SORTIE
  18. * -----------
  19. * IPLA LISTREEL (E) alpha
  20. * IPLB LISTREEL (E) beta
  21. * iplc LISTREEL (E) sign(d)
  22. * NMOD ENTIER (E) nombre de modes demandés pour ce cycle
  23. * CONV LOGIQUE (S) = vrai si on a trouvé nbonve > NMOD
  24. * nbonve ENTIER (S) nombre de modes ayant convergés
  25. * numv1 ENTIER (E) dimension du probleme reduit
  26. * iplval ENTIER (S) POINTEUR VERS LES VALEURS PROPRES CONVERGEES
  27. * iphi ENTIER (S) POINTEUR VERS LES VECTEURS PROPRES CONVERGES
  28. * IPERM ENTIER (S) POINTEUR VERS LE TABLEAU DES PERMUTATIONS SI
  29. * LES MODES (iplval et iphi) SONT RANGES DANS
  30. * UN ORDRE DIFFERENT DE 1 2 3 ... nbonve
  31. * XPREC21 FLOTTANT (E) PRECISION SUR LES VALEURS PROPRES
  32. *
  33. *********************************************************************
  34.  
  35. IMPLICIT INTEGER(I-N)
  36. IMPLICIT REAL*8 (A-H,O-Z)
  37.  
  38.  
  39. -INC PPARAM
  40. -INC CCOPTIO
  41. -INC SMLREEL
  42. -INC SMLENTI
  43. -INC SMLCHPO
  44.  
  45. *=======================================================*
  46. * TYPE MATRIX et DECLARATIONS
  47. *=======================================================*
  48.  
  49. SEGMENT MATRIX
  50. REAL*8 A(N,N)
  51. ENDSEGMENT
  52.  
  53. POINTEUR IPRIG1.MATRIX, IPMAS1.MATRIX, IPHI.MATRIX
  54. POINTEUR IPLVAL.MLREEL ,IPLERR.MLREEL
  55. POINTEUR IPLA.MLREEL,IPLB.MLREEL,iplc.mlreel
  56. POINTEUR IPERM.MLENTI
  57. LOGICAL CONV,CONV2
  58. REAL*8 XPREC21
  59.  
  60. mlree1=ipla
  61. mlree2=iplb
  62. ildim=numv1
  63. JG=ILDIM
  64. SEGINI,IPLERR,IPERM
  65. N=ILDIM
  66. SEGINI,iprig1,ipmas1
  67. do ibr=1,ildim
  68. iprig1.a(ibr,ibr)=iplc.prog(ibr)
  69. enddo
  70. do ibr=1,ildim-1
  71. ipmas1.a(ibr,ibr)=ipla.prog(ibr)
  72. ipmas1.a(ibr,ibr+1)=iplb.prog(ibr)
  73. ipmas1.a(ibr+1,ibr)=iplb.prog(ibr)
  74. enddo
  75. ipmas1.a(ildim,ildim)=ipla.prog(ildim)
  76. *
  77. c write(6,*) 'simu21: appel sespa3 pour resoudre [T-(1/l)D]Phi=0'
  78. c write(6,*) ' D=',(iplc.prog(iuy),iuy=1,ildim)
  79. c write(6,*) ' alpha=',(ipla.prog(iuy),iuy=1,ildim)
  80. c write(6,*) ' beta=',(iplb.prog(iuy),iuy=1,ildim)
  81.  
  82. *=======================================================*
  83. * Resolution du systeme reduit tridiagonal
  84. *=======================================================*
  85. CALL SESPA3 ( IPMAS1, IPRIG1, IPHI, IPLVAL)
  86. IF(IERR .NE. 0) RETURN
  87.  
  88.  
  89. *=======================================================*
  90. * Test d'arret basé sur un estimateur du residu qui est egalement lié
  91. * a l'erreur relative des valeurs propres
  92. *=======================================================*
  93. *
  94. * REMARQUE IMPORTANTE :
  95. * bp 25/10/2010 : on ne parvient pas a demontrer (ni analytiquement et
  96. * ni numeriquement) ce lien avec l algo de Lanczo.eso tel quil est ecrit
  97. * (utilisation de la K-norme) alors qu il est evident avec la M-norme
  98. * cclusion : il faudrait passer a la M-norme un jour...
  99. * pour l instant, on se contente d etre + severe sur la precision demandee
  100. XPREC0 = XPREC21
  101. XPREC21 = XPREC21**1.5
  102.  
  103. XBETA=IPLB.PROG(ILDIM)
  104. DO 100 IB100 = 1 , ILDIM
  105. XLAMB=IPLVAL.PROG(IB100)
  106. XPHIN= IPHI.A( ILDIM, IB100 )
  107. * erreur absolue
  108. * XERR = ABS( ( XBETA * XPHIN ) )
  109. * erreur relative (sur XLAMB=1/lambda)
  110. XERR = ABS( ( XBETA * XPHIN )/ XLAMB )
  111. IPLERR.PROG( IB100 ) = XERR
  112. 100 CONTINUE
  113.  
  114. * lambda = 1 / (1/ lambda)
  115. DO 200 IB200=1,ILDIM
  116. iplval.prog(ib200)=1.D0/IPLVAL.PROG(IB200)
  117. 200 CONTINUE
  118. c if (iimpi.ge.6) then
  119. c write(6,*) 'simu21: iplval=',(iplval.prog(iou),iou=1,ILDIM)
  120. c write(6,*) 'simu21: IPLERR=',(IPLERR.prog(iou),iou=1,ILDIM)
  121. c endif
  122.  
  123.  
  124. *=========================================================*
  125. * On regarde si les NMODs premieres valeurs ont convergé
  126. *=========================================================*
  127.  
  128. jg=ildim
  129. segini,mlree1,mlree2
  130.  
  131. c----- Stratégie 1 : On trie par module croissant ---------
  132. call trifla(iplval.prog(1),mlree1.prog(1),iplerr.prog(1),
  133. $ mlree2.prog(1),jg,IPERM.lect(1))
  134.  
  135.  
  136. c----- Stratégie 2 : On trie par erreur croissante ---------
  137. c Possible car tri des vp fait par simul7 + tard
  138. c On obtient + de modes par cycle au prix d un + grand nombre de trous
  139. c => implique une modification de strate(gie) pour aller moins loin
  140. c et pour controler le spectre qui est tres diffus...
  141. c call trifla(iplerr.prog(1),mlree2.prog(1),
  142. c $ iplval.prog(1),mlree1.prog(1),jg,IPERM.lect(1))
  143. cbp 10/2010: finalement abandonné car difficile a mettre en oeuvre...
  144.  
  145. segsup,mlree1,mlree2
  146. IF (IERR .NE. 0) RETURN
  147. if (iimpi.ge.6) then
  148. write(6,*) 'simu21: iplval=',(iplval.prog(iou),iou=1,ILDIM)
  149. write(6,*) 'simu21: IPLERR=',(IPLERR.prog(iou),iou=1,ILDIM)
  150. endif
  151.  
  152. c convergence sur l'erreur relative
  153. CONV = .TRUE.
  154. nbonve0=nbonve
  155. nbonve=NMOD
  156.  
  157.  
  158. c------boucle sur les valeur propres
  159. DO 300 IB300 = 1,ildim
  160.  
  161. c -erreur relative < tolerance?
  162. EPS1 = IPLERR.PROG( IB300 )
  163. EPS=ABS(EPS1)
  164. IF ( EPS .GT. XPREC21 ) THEN
  165. if (IB300.eq.1) then
  166. nbonve=ib300-1
  167. if(ib300.le.NMOD+1) CONV=.FALSE.
  168. GOTO 310
  169. endif
  170. c pour eviter de redemarrer a cause d un mode multiple,
  171. c puisque cet estimateur d erreur est assez mechant,
  172. c on va tolerer une erreur relative plus grande
  173. EVP1 = (iplval.prog(IB300)) / (iplval.prog(IB300-1))
  174. EVP1 = ABS (EVP1 - 1.D0)
  175. if (EVP1.LT.XPREC21.AND.EPS.LT.(2.D2*XPREC21)) then
  176. if (iimpi.ge.6) then
  177. write(6,108) IB300,EPS
  178. 108 FORMAT(2X,'on sauve le candidat',I5,
  179. $ ' car mode multiple et erreur acceptable=',E10.5)
  180. endif
  181. elseif(EVP1.LT.(2.D2*XPREC21).AND.IB300.gt.2) then
  182. if (iimpi.ge.6) then
  183. write(6,109) IB300,EPS
  184. 109 FORMAT(2X,'on annule le candidat',I5,' car ',
  185. $ 'probable mode multiple et erreur inacceptable=',E10.5)
  186. endif
  187. nbonve=ib300-2
  188. if(ib300.le.NMOD+1) CONV=.FALSE.
  189. GOTO 310
  190. else
  191. * a priori ce n est pas un mode multiple et erreur inacceptable
  192. nbonve=ib300-1
  193. if(ib300.le.NMOD+1) CONV=.FALSE.
  194. GOTO 310
  195. endif
  196. ENDIF
  197. 300 CONTINUE
  198. c------fin de boucle sur les valeur propres
  199. 310 CONTINUE
  200.  
  201. * on remet la valeur initiale
  202. XPREC21 = XPREC0
  203. *=========================================================*
  204. * destruction des objets de travail
  205. *=========================================================*
  206. mlreel=IPLERR
  207. segsup,mlreel
  208. mlree1=iplval
  209. mlree2=IPERM
  210. SEGDES,mlree1,mlree2
  211. SEGSUP,IPRIG1,IPMAS1
  212.  
  213. RETURN
  214. END
  215.  
  216.  
  217.  

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