Télécharger gmr2.eso

Retour à la liste

Numérotation des lignes :

gmr2
  1. C GMR2 SOURCE GOUNAND 22/08/25 21:15:04 11434
  2. SUBROUTINE GMR2(KMORS,KISA,B,X,
  3. $ KPREC,INVDIA,ILUM,ILUI,
  4. $ LRES,LNMV,
  5. $ R,W,AV,
  6. $ Y,GCOS,GSIN,S,
  7. $ V, H,
  8. $ ITER,INMV,RESTRT,RESID,ICALRS,IDDOT,IMVEC,IMPR,IRET)
  9. IMPLICIT INTEGER(I-N)
  10. IMPLICIT REAL*8 (A-H,O-Z)
  11. C***********************************************************************
  12. C NOM : GMR2
  13. C DESCRIPTION :
  14. C DESCRIPTION :
  15. C Résolution d'un système linéaire Ax=b
  16. C par une méthode GMRES(m) (restarted Generalized Minimal
  17. C Residual) préconditionné par une factorisation ILU(0)
  18. C (Crout incomplet) ou MILU(0) (Crout inc. modifié relaxé) de A.
  19. C
  20. C LANGAGE : FORTRAN 77 + chouhia ESOPE (pour les E/S)
  21. C AUTEUR : Stéphane GOUNAND (CEA/DRN/DMT/SEMT/TTMF)
  22. C mél : gounand@semt2.smts.cea.fr
  23. C REFERENCE (bibtex-like) :
  24. C @BOOK{templates,
  25. C AUTHOR={R.Barrett, M.Berry, T.F.Chan, J.Demmel, J.Donato,
  26. C J.Dongarra, V.Eijkhout, R.Pozo, C.Romine,
  27. C H. Van der Vorst},
  28. C TITLE={Templates for the Solution of Linear Systems :
  29. C Building Blocks for Iterative Methods},
  30. C PUBLISHER={SIAM}, YEAR={1994}, ADDRESS={Philadelphia,PA} }
  31. C -> URL : http://www.netlib.org/templates/Templates.html
  32. C***********************************************************************
  33. C APPELES (BLAS 1) : DCOPY, DAXPY (subroutines)
  34. C DNRM2, DDOT, DSCAL (functions)
  35. C APPELES (BLAS 2) : DTRSV (subroutines)
  36. C APPELES (Calcul) : DMOMV : produit Matrice Morse - Vecteur
  37. C PSILU0 : Preconditionner solve
  38. C (Montée-Descente adaptée à ILU(0))
  39. C***********************************************************************
  40. C ENTREES : N, NNZ,
  41. C ROWPTR, COLIND, VAL,
  42. C B, JU, JLU, ALU, RESTRT, IMPR
  43. C ENTREES/SORTIES : X,
  44. C R,W,AV,
  45. C Y,GCOS,GSIN,S,
  46. C V,H,
  47. C ITER, RESID
  48. C SORTIES : LRES, IRET
  49. C CODE RETOUR (IRET) : 0 si ok
  50. C <0 si problème (cf. BRTOL)
  51. C >0 si l'algorithme n'a pas convergé
  52. C N : nombre de degrés de liberté
  53. C NNZ : nombre de valeurs non nulles de la matrice Morse
  54. C ROWPTR, COLIND, VAL : pointeur de ligne, index de colonne
  55. C et valeurs de la matrice Morse
  56. C B : vecteur second membre
  57. C ILUVAL : valeurs de la matrice de la factorisation
  58. C ILU(0) ou MILU(0) de A.
  59. C Cette matrice est stockée en Morse, elle a le
  60. C meme profil que A.
  61. C RESTRT : INTEGER
  62. C paramètre de redémarrage (restart) (i.e. m) pour
  63. C la méthode GMRES(m). (cf. prgmr.eso)
  64. C IMPR : niveau d'impression (0..4)
  65. C X : vecteur des inconnues.
  66. C En entrée, contient l'estimation x(0).
  67. C En sortie, la solution trouvée (si la méthode
  68. C a convergé).
  69. C R,W,AV : vecteurs de travail initialisés et détruits
  70. C Y,GCOS,GSIN,S dans prgmr.
  71. C V,H : tableaux de travail...
  72. C ITER : type INTEGER.
  73. C En entrée, contient le nombre maximum
  74. C d'itérations à effectuer.
  75. C En sortie, contient le nombre d'itérations
  76. C réellement effectuées.
  77. C RESID : type REAL*8.
  78. C En entrée, la valeur maximale du résidu à
  79. C convergence de l'algorithme mesurée comme suit :
  80. C norme[L2](b - A*x) / norme[L2]( b )
  81. C En sortie, la valeur effective de cette mesure.
  82. C LRES : pointeur sur segment MLREEL (include SMLREEL)
  83. C contient l'historique de la valeur de RESID en
  84. C fonction du nombre d'itérations effectuées.
  85. C
  86. C***********************************************************************
  87. C VERSION : 20/12/99
  88. C HISTORIQUE : v1, 16/06/98, création
  89. C HISTORIQUE : 20/12/99
  90. C Interfaçage avec le nouveau psilu0 (factorisations incomplètes
  91. C stockées au format MSR (Modified Sparse Row).
  92. C HISTORIQUE :
  93. C HISTORIQUE :
  94. C***********************************************************************
  95. C Prière de PRENDRE LE TEMPS de compléter les commentaires
  96. C en cas de modification de ce sous-programme afin de faciliter
  97. C la maintenance !
  98. C***********************************************************************
  99. *
  100. * .. Includes .. a commenter si mise au point ok
  101. -INC CCREEL
  102.  
  103. -INC PPARAM
  104. -INC CCOPTIO
  105. -INC SMLREEL
  106. POINTEUR LRES.MLREEL
  107. -INC SMLENTI
  108. POINTEUR LNMV.MLENTI
  109. POINTEUR KMORS.PMORS
  110. POINTEUR KISA.IZA
  111. POINTEUR INVDIA.IZA
  112. POINTEUR ILUM.PMORS
  113. POINTEUR ILUI.IZA
  114. POINTEUR B.IZA
  115. POINTEUR X.IZA
  116. * .. Parameters
  117. * This is a restart parameter for GMRES
  118. SEGMENT SPACE
  119. REAL*8 WRK(LDW,NLDW)
  120. ENDSEGMENT
  121. SEGMENT SPACE2
  122. POINTEUR WRK2(NIZA).IZA
  123. ENDSEGMENT
  124. * .. Work Vectors for GMRES..
  125. POINTEUR VTMP.IZA
  126. POINTEUR V.SPACE2
  127. POINTEUR H.SPACE
  128. POINTEUR R.IZA,W.IZA,AV.IZA
  129. POINTEUR Y.IZA,GCOS.IZA,GSIN.IZA
  130. POINTEUR S.IZA
  131.  
  132. INTEGER IMPR
  133. * .. Scalar Arguments ..
  134. INTEGER N,NNZ
  135. INTEGER ITER,RESTRT,IRET
  136. REAL*8 RESID
  137. * .. Tableaux de travail à supprimer
  138. C REAL*8 R(N),W(N),AV(N)
  139. C REAL*8 Y(RESTRT),GCOS(RESTRT),GSIN(RESTRT)
  140. C REAL*8 S(RESTRT+1)
  141. C REAL*8 V(N,RESTRT+1)
  142. C REAL*8 H(RESTRT+1,RESTRT)
  143. *
  144. *
  145. * .. Variables locales
  146. * .. Parameters
  147. REAL*8 ZERO,ONE
  148. PARAMETER (ZERO=0.0D0, ONE=1.0D0)
  149. * ..
  150. INTEGER I,MAXIT,J,K
  151. REAL*8 BNRM2,TOL,GDOT,GNRM2
  152. REAL*8 H1,H2,RAY
  153. * ..
  154. * .. External subroutines and functions..
  155. * ..
  156. * .. Executable Statements ..
  157. *
  158. *
  159. IRET = 0
  160. INMV = 0
  161. MAXIT = ITER
  162. TOL = RESID
  163. IF(IMPR.GT.5) WRITE(IOIMP,*) 'Entrée dans gmr2.eso'
  164. *
  165. * Set initial residual.
  166. *
  167. C r=b
  168. CALL GCOPY(B,R)
  169. * IF (GNRM2(X).NE.ZERO) THEN
  170. C r=b-Ax
  171. * CALL GMOMV ('N',ONE,KMORS,KISA,X,ONE,R)
  172. * ENDIF
  173. CALL GMOMV(IMVEC,'N',-ONE,KMORS,KISA,X,ONE,R)
  174. INMV=INMV+1
  175. *
  176. ITER = 0
  177. BNRM2 = GNRM2(B)
  178. IF(IMPR.GT.6) THEN
  179. WRITE(IOIMP,*) '||B||=',BNRM2
  180. ENDIF
  181. RNRM2 = GNRM2(R)
  182. IF (ICALRS.EQ.1) BNRM2=RNRM2
  183. *
  184. IF (BNRM2.LT.XPETIT) BNRM2 = ONE
  185. RESID = RNRM2 / BNRM2
  186. IF(IMPR.GT.6) THEN
  187. WRITE(IOIMP,*) 'Résidu initial=',RESID
  188. ENDIF
  189. LRES.PROG(ITER+1)=RESID
  190. LNMV.LECT(ITER+1)=INMV
  191. IF (RESID.LE.TOL) GOTO 30
  192. *
  193. 10 CONTINUE
  194. * Gestion du CTRL-C
  195. if (ierr.NE.0) return
  196. *
  197. * Construct the first column of V, and initialize S to the
  198. * elementary vector E1 scaled by RNORM.
  199. *
  200. C Preconditionner solve (ILU(0)) : Mv(1)=r
  201. VTMP=V.WRK2(1)
  202. CALL PSOLVE('N',KPREC,KMORS,KISA,INVDIA,ILUM,ILUI
  203. $ ,VTMP,R)
  204.  
  205. C s=||v(1)|| e(1)
  206. C v(1)=v(1) / ||v(1)||
  207. S.A(1) = GNRM2(VTMP)
  208. CALL GSCAL(ONE/S.A(1),VTMP)
  209. *
  210. DO 50 I = 1, RESTRT
  211. ITER = ITER + 1
  212. C av=A v(i)
  213. VTMP=V.WRK2(I)
  214. CALL GMOMV(IMVEC,'N',ONE,KMORS,KISA,VTMP,ZERO,AV)
  215. INMV=INMV+1
  216. C Preconditionner solve (ILU(0)) : Mw=av
  217. CALL PSOLVE('N',KPREC,KMORS,KISA,INVDIA,ILUM,ILUI
  218. $ ,W,AV)
  219. *
  220. * Construct I-th column of H so that it is orthonormal to
  221. * the previous I-1 columns.
  222. *
  223. DO 60 K = 1, I
  224. VTMP=V.WRK2(K)
  225. H.WRK(K,I) = GDOT(W,VTMP,IDDOT)
  226. CALL GAXPY(-ONE*H.WRK(K,I),VTMP,W)
  227. 60 CONTINUE
  228. H.WRK(I+1,I)=GNRM2(W)
  229. VTMP=V.WRK2(I+1)
  230. CALL GCOPY(W,VTMP)
  231.  
  232. Xval = H.WRK(I+1,I)
  233. IF(ABS(Xval) .LT. XPETIT )THEN
  234. CALL GSCAL(XGRAND,VTMP)
  235. ELSE
  236. CALL GSCAL(ONE/Xval,VTMP)
  237. ENDIF
  238. *
  239. C IF (I.GT.1)
  240. *
  241. * Apply Givens rotations to the I-th column of H. This
  242. * effectively reduces the Hessenberg matrix to upper
  243. * triangular form during the RESTRT iterations.
  244. *
  245. DO 70 K = 1, I-1
  246. H1= (GCOS.A(K)*H.WRK(K,I)) + (GSIN.A(K)*H.WRK(K+1,I))
  247. H2=-(GSIN.A(K)*H.WRK(K,I)) + (GCOS.A(K)*H.WRK(K+1,I))
  248. H.WRK(K,I) =H1
  249. H.WRK(K+1,I)=H2
  250. 70 CONTINUE
  251.  
  252. *
  253. * Approximate residual norm. Check tolerance. If okay, compute
  254. * final approximation vector X and quit.
  255. *
  256. RAY=SQRT((H.WRK(I,I)*H.WRK(I,I)) + (H.WRK(I+1,I)*H.WRK(I+1,I)))
  257. GCOS.A(I) = H.WRK(I,I) / RAY
  258. GSIN.A(I) = H.WRK(I+1,I) / RAY
  259. H.WRK(I,I)=RAY
  260. H.WRK(I+1,I)=ZERO
  261. S.A(I+1)=-GSIN.A(I)*S.A(I)
  262. S.A(I) = GCOS.A(I)*S.A(I)
  263. RESID=ABS(S.A(I+1)) / BNRM2
  264. LRES.PROG(ITER+1)=RESID
  265. LNMV.LECT(ITER+1)=INMV
  266. * IF (RESID.LE.TOL.OR.ITER.EQ.MAXIT) THEN
  267. IF (RESID.LE.TOL.OR.INMV.GE.MAXIT) THEN
  268. * Solve the system Hy=S
  269. CALL DCOPY(I,S.A,1,Y.A,1)
  270. CALL DTRSV('UPPER','NOTRANS','NONUNIT',I,H.WRK,RESTRT+1,
  271. $ Y.A,1)
  272. * Updating solution
  273. C CALL UPDATE(I,N,RESTRT,X,WORK2(1,H),WORK(1,Y),
  274. C $ WORK(1,S),WORK(1,V))
  275. DO 503 J=I,1,-1
  276. VTMP=V.WRK2(J)
  277. CALL GAXPY(Y.A(J),VTMP,X)
  278. 503 CONTINUE
  279. IF (RESID.LE.TOL) THEN
  280. GOTO 30
  281. ENDIF
  282. * IF (ITER.EQ.MAXIT) THEN
  283. IF (INMV.GE.MAXIT) THEN
  284. GOTO 40
  285. ENDIF
  286. ENDIF
  287. 50 CONTINUE
  288. *
  289. * Compute current solution vector X.
  290. *
  291. * Solve the system Hy=S
  292. CALL DCOPY(RESTRT,S.A,1,Y.A,1)
  293. CALL DTRSV('UPPER','NOTRANS','NONUNIT',
  294. $ RESTRT,H.WRK,RESTRT+1,Y.A,1)
  295. * Updating solution
  296. DO 303 J=RESTRT,1,-1
  297. VTMP=V.WRK2(J)
  298. CALL GAXPY(Y.A(J),VTMP,X)
  299. 303 CONTINUE
  300. *
  301. * Compute residual vector R, find norm,
  302. * then check for tolerance.
  303. *
  304. CALL GCOPY(B,R)
  305. CALL GMOMV(IMVEC,'N',-ONE,KMORS,KISA,X,ONE,R)
  306. INMV=INMV+1
  307. S.A(RESTRT+1) = GNRM2(R)
  308. RESID = S.A(RESTRT+1) / BNRM2
  309. LRES.PROG(ITER+1)=RESID
  310. LNMV.LECT(ITER+1)=INMV
  311. IF (RESID.LE.TOL) GOTO 30
  312. *
  313. * Iteration fails.
  314. *
  315. * IF (ITER.EQ.MAXIT) THEN
  316. IF (INMV.GE.MAXIT) THEN
  317. GOTO 40
  318. ENDIF
  319. *
  320. * Do some more
  321. *
  322. GOTO 10
  323. *
  324. * Iteration successful
  325. *
  326. 30 CONTINUE
  327. IRET = 0
  328. RETURN
  329. *
  330. * Iteration fails
  331. *
  332. 40 CONTINUE
  333. IRET = 1
  334. RETURN
  335. *
  336. * End of GMR2.
  337. *
  338. END
  339.  
  340.  

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