Télécharger priltp.eso

Retour à la liste

Numérotation des lignes :

priltp
  1. C PRILTP SOURCE GOUNAND 25/04/30 21:15:32 12258
  2. SUBROUTINE PRILTP(AMORS,AISA,MATRIK,XLFIL,XDTOL,XSPIV,
  3. $ IVARI,
  4. $ INCX,NORMP,LRACOU,
  5. $ IMPR,IRET)
  6. IMPLICIT REAL*8 (A-H,O-Z)
  7. IMPLICIT INTEGER (I-N)
  8. C***********************************************************************
  9. C NOM : PRILTP
  10. C DESCRIPTION :
  11. C Calcul du préconditionneur ILUTP d'une matrice Morse
  12. C Le préconditionneur est une matrice stockée
  13. C au format MSR (Modified Sparse Row, stockage de l'inverse de la
  14. C diagonale) de meme profil que la matrice Morse (format CSR) qu'il
  15. C préconditionne.
  16. C Le profil et les valeurs du préconditionneur sont
  17. C stockés dans KIDMAT(6 et 7) (réutilisation de l'existant).
  18. C
  19. C Ce sous-programme est en fait une interface à :
  20. C meiltp
  21. C qui est en Fortran presque pur (pour raison de rapidité)
  22. C et effectue la construction proprement dite du
  23. C préconditionneur.
  24. C
  25. C ATTENTION : pour une matrice A quelconque, la factorisation
  26. C --------- ILUTP peut ne pas exister (pivot nul) ou avoir
  27. C des pivots négatifs MEME SI la factorisation
  28. C complète de A existe et n'a que des pivots
  29. C positifs.
  30. C
  31. C
  32. C LANGAGE : ESOPE
  33. C AUTEUR : Stéphane GOUNAND (CEA/DRN/DMT/SEMT/LTMF)
  34. C mél : gounand@semt2.smts.cea.fr
  35. C REFERENCE (bibtex-like) :
  36. C @BOOK{templates,
  37. C AUTHOR={R.Barrett, M.Berry, T.F.Chan, J.Demmel, J.Donato,
  38. C J.Dongarra, V.Eijkhout, R.Pozo, C.Romine,
  39. C H. Van der Vorst},
  40. C TITLE={Templates for the Solution of Linear Systems :
  41. C Building Blocks for Iterative Methods},
  42. C PUBLISHER={SIAM}, YEAR={1994}, ADDRESS={Philadelphia,PA} }
  43. C -> URL : http://www.netlib.org/templates/Templates.html
  44. C Sparskit : a basic tool kit for sparse matrix computations
  45. C Version 2 (Youcef Saad)
  46. C -> URL : http://www.cs.umn.edu/Research/arpa/SPARSKIT/sparskit.html
  47. C REMARQUES :
  48. C On pourrait effectuer l'ordonnancement des colonnes du préconditionneur
  49. C (peut-être que la montée-descente va plus vite après, il faudrait
  50. C tester)
  51. C***********************************************************************
  52. C APPELES : MEILUT
  53. C APPELE PAR : KRES2
  54. C***********************************************************************
  55. C ENTREES : MATRIK, XLFIL, XDTOL, IMPR
  56. C SORTIES : ILUM, ILUI (KIDMAT(6-7) dans MATRIK), IRET
  57. C CODE RETOUR (IRET) : 0 si ok
  58. C <0 si problème
  59. C MATRIK : pointeur sur segment MATRIK de l'include SMMATRIK
  60. C on pioche dedans les informations nécessaires
  61. C (différents pointeurs, nb. de ddl...)
  62. C IMPR : niveau d'impression
  63. C***********************************************************************
  64. C VERSION : v1, 08/04/2004, version initiale
  65. C HISTORIQUE : v1, 08/04/2004, création
  66. C HISTORIQUE :
  67. C***********************************************************************
  68. C Prière de PRENDRE LE TEMPS de compléter les commentaires
  69. C en cas de modification de ce sous-programme afin de faciliter
  70. C la maintenance !
  71. C***********************************************************************
  72.  
  73. -INC PPARAM
  74. -INC CCOPTIO
  75. -INC CCREEL
  76. INTEGER NTT,NJA,NBVA
  77. POINTEUR AMORS.PMORS
  78. POINTEUR AISA.IZA
  79. POINTEUR KMORS.PMORS
  80. POINTEUR KISA.IZA
  81. POINTEUR ILUM.PMORS
  82. POINTEUR ILUI.IZA
  83. POINTEUR IDMATP.IDMAT
  84. POINTEUR IDMATD.IDMAT
  85. POINTEUR INCX.IZA
  86. POINTEUR INCX2.IZA
  87. -INC SMLENTI
  88. INTEGER JG
  89. POINTEUR IWORK.MLENTI
  90. POINTEUR JWORK.MLENTI
  91. POINTEUR KWORK.MLENTI
  92. POINTEUR IPERM.MLENTI
  93. POINTEUR JPERM.MLENTI
  94. -INC SMLREEL
  95. POINTEUR RWORK.MLREEL
  96. POINTEUR QWORK.MLREEL
  97. POINTEUR NORMP.MLREEL
  98. POINTEUR NORMP2.MLREEL
  99. * -INC SMLLOGI
  100. SEGMENT MLLOGI
  101. LOGICAL LOGI(JG)
  102. ENDSEGMENT
  103. POINTEUR LWORK.MLLOGI
  104. *
  105. REAL*8 XLFIL,XDTOL
  106. INTEGER IMPR,IRET
  107. *
  108. INTEGER ILFIL,NNZA,NNZLU,NNZMLU,NTTDDL
  109. REAL*8 XNTLIG
  110. LOGICAL LRACOU
  111. *
  112. IF (IMPR.GT.5) WRITE(IOIMP,*) 'Entrée dans priltp.eso'
  113. C On récupère les segments utiles
  114. SEGACT MATRIK
  115. ILUM =KIDMAT(6)
  116. ILUI =KIDMAT(7)
  117. C Le préconditionneur est-il déjà construit ?
  118. IF ((ILUM.EQ.0).OR.(ILUI.EQ.0)) THEN
  119. C La matrice Morse et son préconditionneur ont le meme
  120. C profil
  121. *! Attention, on modifie la matrice dans meiltp
  122. SEGACT AMORS*MOD
  123. NTTDDL=AMORS.IA(/1)-1
  124. NNZA=AMORS.JA(/1)
  125. SEGACT AISA*MOD
  126. *
  127. * Ceci bugge avec ILUTPGO2 !!!!!
  128. *
  129. *
  130. * XNTLIG=DBLE(NNZA)/DBLE(NTTDDL)
  131. * ILFIL=INT(XNTLIG*XLFIL/2.D0)
  132. * NNZMLU=NTTDDL*(2*ILFIL+1)
  133. *
  134. NNZMLU = INT(DBLE(NNZA)*XLFIL) + 1
  135. *
  136. NTT=NTTDDL-1
  137. NJA=NNZMLU+1
  138. SEGINI ILUM
  139. NBVA=NNZMLU+1
  140. SEGINI ILUI
  141. JG=NTTDDL
  142. SEGINI IWORK
  143. JG=NTTDDL
  144. SEGINI JWORK
  145. JG=NTTDDL
  146. SEGINI RWORK
  147. JG=NTTDDL
  148. SEGINI IPERM
  149. JG=NTTDDL
  150. SEGINI JPERM
  151. * WRITE(IOIMP,*) 'NTTDDL=',NTTDDL,'NNZA=',NNZA,
  152. * $ 'NNZMLU=',NNZMLU
  153. * WRITE(IOIMP,*) 'ILFIL=',ILFIL,'XLFIL=',XLFIL,'XDTOL=',XDTOL
  154. * IF (XSPIV.LT.XZERO.OR.XSPIV.GT.1.D0) THEN
  155. * WRITE(IOIMP,*) 'Error : XSPIV=',XSPIV
  156. * GOTO 9999
  157. * ENDIF
  158. IF (IVARI.EQ.0) THEN
  159. C Les boucles sont en Fortran pur
  160. CALL MEILTP(NTTDDL,NNZA,AISA.A,AMORS.JA,AMORS.IA,
  161. $ XLFIL,XDTOL,XSPIV,NNZMLU,
  162. $ ILUI.A,ILUM.JA,ILUM.IA,NNZLU,
  163. $ IWORK.LECT,JWORK.LECT,RWORK.PROG,
  164. $ IPERM.LECT,JPERM.LECT,
  165. $ IMPR,IRET)
  166. IF (IRET.NE.0) GOTO 9999
  167. ELSEIF (IVARI.EQ.1) THEN
  168. JG=NTTDDL
  169. SEGINI LWORK
  170. CALL MILTP2(NTTDDL,NNZA,AISA.A,AMORS.JA,AMORS.IA,
  171. $ XLFIL,XDTOL,XSPIV,NNZMLU,
  172. $ ILUI.A,ILUM.JA,ILUM.IA,NNZLU,
  173. $ IWORK.LECT,JWORK.LECT,RWORK.PROG,LWORK.LOGI,
  174. $ IPERM.LECT,JPERM.LECT,
  175. $ IMPR,IRET)
  176. IF (IRET.NE.0) GOTO 9999
  177. SEGSUP LWORK
  178. ELSEIF (IVARI.EQ.2) THEN
  179. JG=NTTDDL
  180. SEGINI LWORK
  181. JG=NTTDDL
  182. SEGINI KWORK
  183. JG=NTTDDL
  184. SEGINI QWORK
  185. CALL MILTP3(NTTDDL,NNZA,AISA.A,AMORS.JA,AMORS.IA,
  186. $ XLFIL,XDTOL,XSPIV,NNZMLU,
  187. $ ILUI.A,ILUM.JA,ILUM.IA,NNZLU,
  188. $ IWORK.LECT,JWORK.LECT,RWORK.PROG,LWORK.LOGI,
  189. $ KWORK.LECT,QWORK.PROG,
  190. $ IPERM.LECT,JPERM.LECT,
  191. $ IMPR,IRET)
  192. IF (IRET.NE.0) GOTO 9999
  193. SEGSUP QWORK
  194. SEGSUP KWORK
  195. SEGSUP LWORK
  196. ELSE
  197. WRITE(IOIMP,*) 'IVARI=',IVARI,' non prevu'
  198. ENDIF
  199. IF (IMPR.GT.1) THEN
  200. WRITE(IOIMP,*) 'Préconditionneur : nb.termesstockés=',
  201. $ NNZLU-1
  202. ENDIF
  203. *
  204. * SEGPRT,JPERM
  205. SEGSUP IPERM
  206. SEGSUP RWORK
  207. SEGSUP JWORK
  208. SEGSUP IWORK
  209. NBVA=NNZLU
  210. SEGADJ,ILUI
  211. NTT=NTTDDL-1
  212. NJA=NNZLU
  213. SEGADJ,ILUM
  214. * SEGPRT,ILUM
  215. * SEGPRT,ILUI
  216. *
  217. * On s'occupe des permutations
  218. *
  219. SEGACT MATRIK*MOD
  220. IF (.NOT.LRACOU) THEN
  221. KMORS=MATRIK.KIDMAT(4)
  222. SEGACT KMORS*MOD
  223. DO IJA=KMORS.IA(1),KMORS.IA(NTTDDL+1)-1
  224. KMORS.JA(IJA)=JPERM.LECT(KMORS.JA(IJA))
  225. ENDDO
  226. ENDIF
  227. IDMATP=MATRIK.KIDMAT(1)
  228. IDMATD=MATRIK.KIDMAT(2)
  229. IF (IDMATD.EQ.0) THEN
  230. WRITE(IOIMP,*) 'Erreur hyper grave'
  231. ENDIF
  232. IF (IDMATP.EQ.IDMATD) THEN
  233. SEGINI,IDMATP=IDMATD
  234. ELSE
  235. SEGACT IDMATP*MOD
  236. ENDIF
  237. * Copie de NUAN dans NUNA
  238. DO ITTDDL=1,NTTDDL
  239. IDMATP.NUNA(ITTDDL)=IDMATP.NUAN(ITTDDL)
  240. ENDDO
  241. * Mise à jour de NUAN
  242. DO ITTDDL=1,NTTDDL
  243. IDMATP.NUAN(ITTDDL)=JPERM.LECT(IDMATP.NUNA(ITTDDL))
  244. ENDDO
  245. * Mise à jour de NUNA
  246. DO ITTDDL=1,NTTDDL
  247. IDMATP.NUNA(IDMATP.NUAN(ITTDDL))=ITTDDL
  248. ENDDO
  249. INCX2=INCX
  250. SEGACT INCX2
  251. NBVA=NTTDDL
  252. SEGINI,INCX
  253. DO ITTDDL=1,NTTDDL
  254. INCX.A(JPERM.LECT(ITTDDL))=INCX2.A(ITTDDL)
  255. ENDDO
  256. SEGSUP INCX2
  257. IF (NORMP.NE.0) THEN
  258. NORMP2=NORMP
  259. SEGACT NORMP2
  260. JG=NTTDDL
  261. SEGINI,NORMP
  262. DO ITTDDL=1,NTTDDL
  263. NORMP.PROG(JPERM.LECT(ITTDDL))=NORMP2.PROG(ITTDDL)
  264. ENDDO
  265. SEGSUP NORMP2
  266. ENDIF
  267. SEGSUP JPERM
  268. MATRIK.KIDMAT(1)=IDMATP
  269. C
  270. C On stocke la factorisation obtenue du préconditionneur
  271. C
  272. SEGACT MATRIK*MOD
  273. KIDMAT(6)=ILUM
  274. KIDMAT(7)=ILUI
  275. C
  276. IF (IMPR.GT.6) THEN
  277. WRITE(IOIMP,*) 'création du préconditionneur Morse',
  278. $ ' de pointeurs',ILUM,'et',ILUI
  279. IF (IMPR.GT.8) THEN
  280. CALL ECMORS(ILUM,ILUI,(IMPR-1))
  281. ENDIF
  282. ENDIF
  283. ELSE
  284. IF (IMPR.GT.1) THEN
  285. WRITE(IOIMP,*)
  286. $ 'Préconditionneur deja construit.'
  287. ENDIF
  288. IF (IMPR.GT.6) THEN
  289. WRITE(IOIMP,*) 'Le préconditionneur est déjà construit :',
  290. $ 'ILUM=',ILUM,' et ILUI=',ILUI
  291. IF (IMPR.GT.8) THEN
  292. CALL ECMORS(ILUM,ILUI,(IMPR-1))
  293. ENDIF
  294. ENDIF
  295. ENDIF
  296. *
  297. * Normal termination
  298. *
  299. RETURN
  300. *
  301. * Format handling
  302. *
  303. *
  304. * Error handling
  305. *
  306. 9999 CONTINUE
  307. WRITE(IOIMP,*) 'An error was detected in priltp.eso'
  308. IRET=1
  309. RETURN
  310. *
  311. * End of PRILTP
  312. *
  313. END
  314.  
  315.  

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