Télécharger pragmg.eso

Retour à la liste

Numérotation des lignes :

pragmg
  1. C PRAGMG SOURCE GOUNAND 25/04/30 21:15:28 12258
  2. SUBROUTINE PRAGMG(KMORS,KIZA,KS2B,IPBLOC,KTYPI,LRES,
  3. $ LNMV,INCX,ITER,INMV,
  4. $ RESID,KPREC,
  5. $ NRESTS,ICALRS,IDDOT,IMVEC,KTIME,LTIME,LDUMP,ISMOOT,
  6. $ IMPR,IRET)
  7. IMPLICIT REAL*8 (A-H,O-Z)
  8. IMPLICIT INTEGER (I-N)
  9. C***********************************************************************
  10. C NOM : PRAGMG
  11. C DESCRIPTION :
  12. C Préparation de la résolution d'un système linéaire Ax=b
  13. C par une méthode Multigrille Algébrique
  14. C
  15. C LANGAGE : ESOPE
  16. C AUTEUR : Stéphane GOUNAND (CEA/DRN/DMT/SEMT/TTMF)
  17. C mél : gounand@semt2.smts.cea.fr
  18. C REFERENCE (bibtex-like) :
  19. C***********************************************************************
  20. C***********************************************************************
  21. C VERSION : v1, 17/06/08, version initiale
  22. C HISTORIQUE : 17/06/08 : Creation
  23. C HISTORIQUE :
  24. C***********************************************************************
  25. C Prière de PRENDRE LE TEMPS de compléter les commentaires
  26. C en cas de modification de ce sous-programme afin de faciliter
  27. C la maintenance !
  28. C***********************************************************************
  29. *
  30. * .. Includes et pointeurs associés ..
  31. *
  32. -INC PPARAM
  33. -INC CCOPTIO
  34. -INC CCREEL
  35. -INC SMLREEL
  36. INTEGER JG
  37. POINTEUR LRES.MLREEL
  38. -INC SMLENTI
  39. POINTEUR LNMV.MLENTI
  40. POINTEUR IBLOCK.MLENTI
  41. POINTEUR IPBLOC.MLENTI
  42. POINTEUR IPERM.MLENTI
  43. POINTEUR JPERM.MLENTI
  44. POINTEUR KMORS.PMORS
  45. POINTEUR KIZA.IZA,AIZA.IZA
  46. POINTEUR KS2B.IZA,RES.IZA
  47. POINTEUR INCX.IZA,INCDX.IZA
  48. -INC SMTABLE
  49. POINTEUR KTIME.MTABLE
  50. CHARACTER*8 CHARI
  51. LOGICAL LTIME,LOGII,LBLOCK,LOK,LDUMP,LSIGN
  52. * .. Parameters
  53. * This is a breakdown tolerance for BiCGSTAB-type method
  54. REAL*8 BRTOL
  55. *STAT-INC SMSTAT
  56. * .. Scalar Arguments ..
  57. INTEGER ITER, KPREC, IMPR, IRET
  58. INTEGER ICNT
  59. REAL*8 RESID,TOL,BNRM2,RNRM2,XFACT
  60. * ..
  61. * Vars reqd for STOPTEST2
  62. * REAL*8 TOL, BNRM2
  63. * ..
  64. * .. External subroutines ..
  65. * EXTERNAL STOPTEST2
  66. INTEGER NBVA,NJA,NTT,NTTPRE
  67. REAL*8 GNRM2
  68. EXTERNAL GNRM2
  69. * ..
  70. * .. Executable Statements ..
  71. *
  72. * WRITE(IOIMP,*) 'Debut de pragmg'
  73. IRET = 0
  74. *
  75. * On récupère les paramètres
  76. *
  77. *
  78. segact kmors
  79. segact kiza
  80. NTT =KMORS.IA(/1)-1
  81. NJA =KMORS.JA(/1)
  82. NBVA=KIZA.A(/1)
  83. SEGINI,RES=KS2B
  84. nbva=INCX.A(/1)
  85.  
  86. SEGINI INCDX
  87. IBLOCK=IPBLOC
  88. NBLOCK=IBLOCK.LECT(/1)-1
  89. C
  90. C Initialisation de l'historique de convergence
  91. C
  92. JG=ITER+1
  93. SEGINI LNMV
  94. SEGINI LRES
  95. *
  96. * Autres paramètres
  97. *
  98. IJOB=0
  99. IF (LDUMP) THEN
  100. IPRINT=-978
  101. ELSE
  102. IF (IMPR.GT.2) THEN
  103. IPRINT=IOIMP
  104. ELSE
  105. IPRINT=-1
  106. ENDIF
  107. ENDIF
  108. TOL=RESID
  109. ICNT=0
  110. *
  111. * AGMG ne fait que du résidu relatif d'où les petits ajustements
  112. * suivants.
  113. *
  114. * res = b - AX
  115. CALL GMOMV(IMVEC,'N',-1.D0,KMORS,KIZA,INCX,1.D0,RES)
  116. BNRM2=GNRM2(KS2B)
  117. RNRM2=GNRM2(RES)
  118. WRITE(IOIMP,*) 'RNRM2=',RNRM2
  119. IF (ICALRS.EQ.1) BNRM2=RNRM2
  120. IF (BNRM2.LT.XPETIT) BNRM2=1.D0
  121. RESID=RNRM2 / BNRM2
  122. ICNT=ICNT+1
  123. LRES.PROG(ICNT)=RESID
  124. LNMV.LECT(ICNT)=1
  125. *
  126. IF (RESID.LE.TOL) THEN
  127. ITER=0
  128. GOTO 30
  129. ENDIF
  130. *
  131. IF (ICALRS.EQ.0) THEN
  132. XFACT=1.D0/RESID
  133. TOL=TOL*XFACT
  134. ENDIF
  135. *
  136. * Changement automatique du signe des lignes de la matrice
  137. * et du second membre si le terme diagonal est négatif.
  138. *
  139. SEGACT,KMORS
  140. segact,KIZA
  141. *
  142. LSIGN=.FALSE.
  143. DO I=1,NTT
  144. DO J=KMORS.IA(I),(KMORS.IA(I+1)-1)
  145. IF (KMORS.JA(J).EQ.I) THEN
  146. IF (KIZA.A(J).LT.XZERO) THEN
  147. LSIGN=.TRUE.
  148. IDEB=I
  149. GOTO 20
  150. ELSE
  151. LSIGN=.FALSE.
  152. ENDIF
  153. ENDIF
  154. ENDDO
  155. ENDDO
  156. 20 CONTINUE
  157. *
  158. IF (LSIGN) THEN
  159. NSIGN=0
  160. SEGINI,AIZA=KIZA
  161. DO I=IDEB,NTT
  162. IFOUND=0
  163. DO J=KMORS.IA(I),(KMORS.IA(I+1)-1)
  164. * WRITE(IOIMP,*) 'I,J=',I,J
  165. * WRITE(IOIMP,*) 'JA(J)=',KMORS.JA(J)
  166. IF (KMORS.JA(J).EQ.I) THEN
  167. * WRITE(IOIMP,*) 'AISA.A(J)=',AISA.A(J)
  168. IF (AIZA.A(J).LT.XZERO) THEN
  169. IFOUND=-1
  170. GOTO 10
  171. ENDIF
  172. ENDIF
  173. ENDDO
  174. 10 CONTINUE
  175. IF (IFOUND.EQ.-1) THEN
  176. NSIGN=NSIGN+1
  177. RES.A(I)=-1.D0*RES.A(I)
  178. DO J=KMORS.IA(I),(KMORS.IA(I+1)-1)
  179. AIZA.A(J)=-1.D0*AIZA.A(J)
  180. ENDDO
  181. ENDIF
  182. ENDDO
  183. WRITE(IOIMP,*) NSIGN,' matrix rows changed sign.'
  184. ELSE
  185. AIZA=KIZA
  186. ENDIF
  187. *
  188. * To use the standard AGMG library, you should make sure that it
  189. * is compiled with same compiler and options than Castem's and that
  190. * the sequential example furnished with AGMG works.
  191. * Then it is sufficient to put agmg_seq.o and agmg.o in the
  192. * current directory and use essai for linking.
  193. *
  194. * No interface to the parallel version of agmg for now
  195. *
  196. WRITE(IOIMP,*) '***********************************'
  197. WRITE(IOIMP,*) ' '
  198. WRITE(IOIMP,*) 'Please uncomment the CALL AGMG(...',
  199. $ ' in the pragmg.eso subroutine if you wish to use'
  200. WRITE(IOIMP,*) 'the AGMG library by Y. Notay'
  201. WRITE(IOIMP,*) ' '
  202. WRITE(IOIMP,*) '***********************************'
  203. * 251 2
  204. *Tentative d'utilisation d'une option non implémentée
  205. CALL ERREUR(251)
  206. IRET=-1
  207. GOTO 9999
  208. *********************************************************************
  209. *
  210. * AGMG v3.3.7_block call (standard sequential version)
  211. *
  212. * WRITE(IOIMP,*) '4'
  213. * CALL ECMORS(KMORS,AIZA,3)
  214.  
  215. c$$$
  216. c$$$ ITR2=ITER-1
  217. c$$$ instance=0
  218. c$$$ NREST=NRESTS
  219. c$$$ IF (KTYPI.EQ.7.OR.KTYPI.EQ.8) then
  220. c$$$ call DAGMG_INTPARAM('smoothtype',ISMOOT,instance)
  221. c$$$ CALL DAGMG(NTT,AIZA.A,KMORS.JA,KMORS.IA,RES.A,INCDX.A,
  222. c$$$ $ IJOB,IPRINT,NREST,ITR2,TOL,NBLOCK,IBLOCK.LECT)
  223. c$$$ CALL dagmg_status(istat,instance)
  224. c$$$ CALL dagmg_niter(itr2,instance)
  225. c$$$ ELSE
  226. c$$$ if(ktypi.eq.10) then
  227. c$$$ call DAGMG_STOKES_INTPARAM('smoothtype',-1,instance)
  228. c$$$ endif
  229. c$$$ if(ktypi.eq.11) then
  230. c$$$ call DAGMG_STOKES_INTPARAM('smoothtype',-51,instance)
  231. c$$$ call DAGMG_STOKES_INTPARAM('pointcoarsening',1,instance)
  232. c$$$ call DAGMG_STOKES_INTPARAM('Ltransform',1,instance)
  233. c$$$ endif
  234. c$$$ CALL DAGMG_STOKES(NTT,AIZA.A,KMORS.JA,KMORS.IA,RES.A,INCDX.A,
  235. c$$$ $ IJOB,IPRINT,NREST,ITR2,TOL,NBLOCK,IBLOCK.LECT)
  236. c$$$ CALL dagmg_stokes_status(istat,instance)
  237. c$$$ CALL dagmg_stokes_niter(itr2,instance)
  238. c$$$ ENDIF
  239. c$$$* X = X_0 + \delta X
  240. c$$$ CALL GAXPY(1.D0,INCDX,INCX)
  241. c$$$* ON peut l'eviter car deja calcule par AGMG
  242. c$$$** Résidu final
  243. c$$$* CALL GCOPY(KS2B,RES)
  244. c$$$* CALL GMOMV(IMVEC,'N',-1.D0,KMORS,KIZA,INCX,1.D0,RES)
  245. c$$$* RNRM2=GNRM2(RES)
  246. c$$$* RESID=RNRM2/BNRM2
  247. c$$$*
  248. c$$$ IF (istat.NE.0) THEN
  249. c$$$ IRET=1
  250. c$$$ ELSE
  251. c$$$ IRET=0
  252. c$$$ ENDIF
  253. c$$$ ITER=ITR2
  254. c$$$*
  255. c$$$* write(ioimp,*) 'ITER,nbva=',ITER,nbva
  256. c$$$ JMAX=MIN(ITER+4,nbva)
  257. c$$$ DO J=5,JMAX
  258. c$$$ ICNT=ICNT+1
  259. c$$$* write(ioimp,*) 'ICNT=',ICNT
  260. c$$$ RESID=RES.A(J)/BNRM2
  261. c$$$ LRES.PROG(ICNT)=RESID
  262. c$$$ LNMV.LECT(ICNT)=LNMV.LECT(ICNT-1)+1
  263. c$$$ ENDDO
  264. c$$$ INMV=1+ITER
  265. *
  266. * End of AGMG call (standard sequential version)
  267. *
  268. *********************************************************************
  269. *
  270. IF (LTIME) THEN
  271. * CHARI='MGAGGREG'
  272. * CALL ECCTAB(KTIME,'MOT ',IVALI,XVALI,CHARI,LOGII,IRETI,
  273. * $ 'ENTIER ',IAT,XVALR,CHARR,LOGIR,IRETR)
  274. * CHARI='MGSOLUTI'
  275. * CALL ECCTAB(KTIME,'MOT ',IVALI,XVALI,CHARI,LOGII,IRETI,
  276. * $ 'ENTIER ',IST,XVALR,CHARR,LOGIR,IRETR)
  277. ENDIF
  278. *
  279. C
  280. C Désactivation
  281. C
  282. 30 CONTINUE
  283. * segprt,lres
  284. * segprt,lnmv
  285. JG=ICNT
  286. SEGADJ LRES
  287. SEGDES LRES
  288. SEGADJ LNMV
  289. SEGDES LNMV
  290. * segprt,lres
  291. * segprt,lnmv
  292. SEGSUP INCDX
  293. SEGDES INCX
  294. SEGDES KS2B
  295. SEGSUP RES
  296. IF (LSIGN) SEGSUP AIZA
  297. SEGDES KIZA
  298. SEGDES KMORS
  299. C
  300. C A breakdown has occured in the CGS method
  301. C
  302. IF (IRET.LT.0) GOTO 9999
  303. *
  304. * Normal termination
  305. *
  306. RETURN
  307. *
  308. * Format handling
  309. *
  310. * 1002 FORMAT(10(1X,1PE11.4))
  311. *
  312. * Error handling
  313. *
  314. 9999 CONTINUE
  315. WRITE(IOIMP,*) 'An error was detected in pragmg.eso'
  316. RETURN
  317. *
  318. * End of PRAGMG
  319. *
  320. END
  321.  
  322.  

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