Télécharger kresll.eso

Retour à la liste

Numérotation des lignes :

kresll
  1. C KRESLL SOURCE GOUNAND 25/03/11 21:15:04 12185
  2. SUBROUTINE KRESLL()
  3. IMPLICIT INTEGER(I-N)
  4. IMPLICIT REAL*8 (A-H,O-Z)
  5. C*************************************************************************
  6. C Operateur KRES
  7. C
  8. C OBJET : Resoud l'equation AX=B par différentes méthodes
  9. C * directe (factorisation Choleski)
  10. C * itérative (Gradient conjugué, BiCGSTAB,
  11. C GMRES(m)) avec différents préconditionneurs
  12. C diagonal (Jacobi), D-ILU, ILU(0) (Choleski
  13. C incomplet), MILU(0)
  14. C SYNTAXE : CHPO3 = KRES MA1 'TYPI' TAB1
  15. C 'CLIM' CHPO1
  16. C 'SMBR' CHPO2
  17. C 'IMPR' VAL1 ;
  18. C Voir la notice pour plus de précisions.
  19. C
  20. C***********************************************************************
  21. C APPELES : KRES3, KRES4, KRES5
  22. C APPELES (E/S) : LIROBJ, ECROBJ, ERREUR, LIRMOT, LIRENT, LIRTAB,
  23. C ACME, ACMO, ACMM, ACMF, ECMO
  24. C APPELES (UTIL.) : QUETYP
  25. C APPELE PAR : KOPS
  26. C***********************************************************************
  27. C***********************************************************************
  28. C HISTORIQUE : 26/10/98 : prise en compte du cas particulier
  29. C où A est diagonale. C'est en fait assez pénible
  30. C car on utilise le CHPOINT comme structure de
  31. C données pour la matrice A et les vecteurs X,B,CLIM
  32. C HISTORIQUE : 09/02/99 : on peut utiliser le préconditionnement d'une
  33. C autre matrice que celle que l'on inverse
  34. C HISTORIQUE : 01/06/99 : on modifie la partie résolution itérative
  35. C en effet, lors de l'imposition des CL. de
  36. C Dirichlet, on changeait les valeurs de la
  37. C matrice Morse.
  38. C Ceci n'est pas bon lorsqu'on veut utiliser la
  39. C matrice assemblée pour plusieurs pas de temps.
  40. C On travaille maintenant sur une copie.
  41. C HISTORIQUE : 20/12/99 : reprogrammation de l'assemblage
  42. C Le nouvel assemblage n'est, pour l'instant effectif que
  43. C lorsqu'une méthode itérative est sélectionnée (-> fabrication
  44. C d'une matrice Morse). Le nouvel assemblage est plus performant
  45. C (temps de calcul, utilisation de la mémoire) et plus général (cas
  46. C particuliers à peu près supprimés) que le précédent.
  47. C HISTORIQUE : 05/01/00 : On ne supprime plus les 0.D0 de la matrice
  48. C assemblée (cf. clmors appelé par melim). Ceci pour ne plus avoir
  49. C perte éventuelle de symétrie de la matrice assemblée. Cela permet
  50. C aussi de ne plus dupliquer la matrice assemblée.
  51. C HISTORIQUE : 13/01/00 : Mise en conformité du solveur direct avec le
  52. C nouvel assemblage.
  53. C HISTORIQUE : 22/03/00 : Rajout des préconditionneurs ILUT
  54. C HISTORIQUE : 13/04/00 : Séparation Lecture des données
  55. C Ecriture des résultats (kres2)
  56. C Assemblage kres3
  57. C Méthode directe kres4
  58. C Méthodes itératives kres5
  59. C
  60. C***********************************************************************
  61. C Prière de PRENDRE LE TEMPS de compléter les commentaires
  62. C en cas de modification de ce sous-programme afin de faciliter
  63. C la maintenance !
  64. C***********************************************************************
  65.  
  66. -INC PPARAM
  67. -INC CCOPTIO
  68. -INC SMLREEL
  69. POINTEUR LRES.MLREEL
  70. -INC SMCHPOI
  71. POINTEUR KCLIM.MCHPOI
  72. POINTEUR KSMBR.MCHPOI
  73. POINTEUR MCHINI.MCHPOI
  74. POINTEUR MCHSOL.MCHPOI
  75. -INC SMTABLE
  76. POINTEUR MTINV.MTABLE
  77. * MATRIK est la matrice à inverser
  78. * MAPREC est la matrice dont on utilise le préconditionnement
  79. * MATASS est la matrice dont on utilise l'assemblage
  80. * pour préconditionner celui de MATRIK
  81. POINTEUR MAPREC.MATRIK
  82. POINTEUR MATASS.MATRIK
  83. C
  84. CHARACTER*8 TYPE
  85. * Paramètre m du GMRES(m)
  86. INTEGER IRSTRT
  87. INTEGER ITER
  88. REAL*8 BRTOL,RESID,RXMILU
  89. *
  90. REAL*8 XLFIL,XDTOL
  91. INTEGER KPREC
  92. INTEGER NMATRI
  93. INTEGER IP,KTYPI
  94. INTEGER IMPINV,IIMPR
  95. CHARACTER*4 MRENU,MMULAG
  96. INTEGER IMPR,IRET
  97. C
  98. C Définition des options
  99. C
  100. C 'IMPR' + un entier : niveau d'impression
  101. C 'TYPI' + une table contenant les informations
  102. C sur le type de résolution
  103. C 'CLIM' + un chpoint : conditions aux limites de Dirichlet
  104. C 'SMBR' + un chpoint : second membre (forces...)
  105. C 'PREC' + une matrice dont on va utiliser le préconditionnement
  106. C
  107. INTEGER NBM
  108. PARAMETER (NBM=4)
  109. CHARACTER*4 LMOT(NBM)
  110. C Tableau de correspondance : entier <-> mot
  111. C pour le type d'inversion
  112. INTEGER NBTYPI
  113. C INTEGER LNTYPI
  114. PARAMETER (NBTYPI=5)
  115. C PARAMETER (LNTYPI=18)
  116. C CHARACTER*(LNTYPI) LTYPI(NBTYPI)
  117. LOGICAL LBID,LVAL,LTIME,LMRENU,LDEPE,LLDEPE
  118. C
  119. C Initialisation des tableaux
  120. C
  121. DATA LMOT/'IMPR','TYPI','CLIM','SMBR'/
  122. C DATA LTYPI/'Choleski ',
  123. C $ 'Conjugate Gradient',
  124. C $ 'BiCGSTAB ',
  125. C $ 'BiCGSTAB(2) ',
  126. C $ 'GMRES(m) '/
  127. C
  128. TYPE='MATRIK'
  129. CALL LIROBJ(TYPE,MATRIK,1,IRET)
  130. IF(IRET.EQ.0) GOTO 9999
  131. c
  132. SEGACT MATRIK
  133. NMATRI=IRIGEL(/2)
  134. IF(NMATRI.EQ.0)THEN
  135. C% Résolution impossible : la matrice de RIGIDITE est vide
  136. CALL ERREUR(727)
  137. RETURN
  138. ENDIF
  139. SEGDES MATRIK
  140. c Valeurs par défaut reprise de prkres
  141. KSMBR=0
  142. MTINV=0
  143. IMPR=0
  144. KCLIM=0
  145. KTYPI=1
  146. MATASS=MATRIK
  147. MAPREC=MATRIK
  148. MRENU='SLOA'
  149. LMRENU=.FALSE.
  150. MMULAG='APR2'
  151. ISCAL=0
  152. IOUBL=0
  153. IMPINV=0
  154. MCHINI=0
  155. ITER=2000
  156. RESID=1.D-10
  157. BRTOL=1.D-40
  158. IRSTRT=50
  159. KPREC=3
  160. RXMILU=1.D0
  161. RXILUP=0.5D0
  162. XLFIL=2.D0
  163. XDTOL=-1.D0
  164. XSPIV=0.1D0
  165. LBCG=4
  166. ICALRS=0
  167. METASS=5
  168. LTIME=.FALSE.
  169. KTIME=0
  170. LDEPE=.TRUE.
  171. LLDEPE=.FALSE.
  172. IDDOT=0
  173. IMVEC=2
  174. IORINC=0
  175. C
  176. 1 CONTINUE
  177. CALL LIRMOT(LMOT,NBM,IP,0)
  178. IF(IP.EQ.0) GOTO 2
  179. GOTO (11,12,13,14),IP
  180. C Lecture du niveau d'impression
  181. C option 'IMPR'
  182. 11 CONTINUE
  183. c write(6,*)' option IMPR'
  184. CALL LIRENT(IMPR,1,IRET)
  185. IF (IRET.EQ.0) GOTO 9999
  186. GO TO 1
  187. C Lecture de la table pour les méthodes d'inversion
  188. C option 'TYPI'
  189. 12 CONTINUE
  190. CALL LIRTAB('METHINV',MTINV,1,IRET)
  191. IF(IRET.EQ.0)RETURN
  192. CALL LIRENT(KTYPI,1,IRET)
  193. C KTYPI : Méthode d'inversion du système (cf. LTYPI)
  194. C 1 : résolution directe (Choleski)
  195. C 2 : Gradient Conjugué
  196. C 3 : Bi-Gradient Conjugué Stabilisé (BiCGSTAB)
  197. C 4 : BiCGSTAB(2)
  198. C 5 : GMRES(m)
  199. C CALL ACME(MTINV,'TYPINV',KTYPI)
  200. IF (IERR.NE.0) GOTO 9999
  201. C write(6,*)' Ktypi=',ktypi
  202. IF (KTYPI.LT.1.OR.KTYPI.GT.NBTYPI) THEN
  203. WRITE(IOIMP,*) 'L''indice TYPINV ',
  204. $ 'is out of range (1..',NBTYPI,') :',KTYPI
  205. GOTO 9999
  206. ENDIF
  207. GO TO 1
  208. C Lecture du chpoint de conditions aux limites
  209. C option CLIM
  210. 13 CONTINUE
  211. CALL QUETYP(TYPE,1,IRET)
  212. IF(IRET.EQ.0) GOTO 9999
  213. IF(TYPE.EQ.'CHPOINT')THEN
  214. CALL LIROBJ(TYPE,KCLIM,1,IRET)
  215. ELSE
  216. WRITE(IOIMP,*) 'Erreur lecture C.lim'
  217. GOTO 9999
  218. ENDIF
  219. GO TO 1
  220. C Lecture du chpoint second membre
  221. C option SMBR
  222. 14 CONTINUE
  223. CALL QUETYP(TYPE,1,IRET)
  224. IF(IRET.EQ.0)RETURN
  225. IF(TYPE.EQ.'CHPOINT')THEN
  226. CALL LIROBJ('CHPOINT',KSMBR,1,IRET)
  227. c write(6,*)' lecture 2 membre '
  228. ELSE
  229. WRITE(IOIMP,*) 'Erreur lecture second membre'
  230. GOTO 9999
  231. ENDIF
  232. GOTO 1
  233. 2 CONTINUE
  234. C write(6,*)' On a pas finit les lectures '
  235. c NAT=2
  236. c NSOUPO=0
  237. c SEGINI MCHPO1
  238. c MCHPO1.JATTRI(1)=2
  239. c CALL ECROBJ('CHPOINT',MCHPO1)
  240. c return
  241. C
  242. C Matrice dont on utilise l'assemblage
  243. C (éventuellement identique à la matrice transmise)
  244. C
  245. TYPE='MATRIK '
  246. C CALL ACMO(MTINV,'MATASS',TYPE,MATASS)
  247. C IF (IERR.NE.0) GOTO 9999
  248. CALL LIROBJ('MATRIK',MATASS,1,IRET)
  249. IF(IRET.EQ.0) GOTO 9999
  250. C - Pour l'assemblage : type de renumérotation
  251. C CALL ACMM(MTINV,'TYRENU',MRENU)
  252. C IF (IERR.NE.0) GOTO 9999
  253. CALL LIRCHA(MRENU,1,LCHAR)
  254. IF(LCHAR.EQ.0)GO TO 9999
  255. C - Pour l'assemblage : prise en compte des mult.lag
  256. C CALL ACMM(MTINV,'PCMLAG',MMULAG)
  257. C IF (IERR.NE.0) GOTO 9999
  258. CALL LIRCHA(MMULAG,1,LCHAR)
  259. IF(LCHAR.EQ.0)GO TO 9999
  260. C - Pour l'assemblage : scaling de la matrice
  261. C CALL ACME(MTINV,'SCALING',ISCAL)
  262. C IF (IERR.NE.0) GOTO 9999
  263. ISCAL=0
  264. C Niveau d'impression pour la partie résolution itérative
  265. c CALL ACME(MTINV,'IMPINV',IMPINV)
  266. c IF (IERR.NE.0) GOTO 9999
  267. c IMPR=MAX(IMPR,IMPINV)
  268. IMPR=0
  269. C
  270. C Assemblage proprement dit
  271. C
  272. IIMPR=0
  273. * SG 2016/02/09 : non à la ligne suivante : il faut que METASS soit
  274. * égale à 5 (voir remarque dans makpr2)
  275. * METASS=4
  276. CALL KRES3(MATRIK,MATASS,MRENU,MMULAG,METASS,
  277. $ KTIME,LTIME,
  278. $ IIMPR,IRET)
  279. IF (IRET.NE.0) GOTO 9999
  280. *! WRITE(IOIMP,*) 'Aprés assemblage'
  281. *! CALL ECRENT(5)
  282. *! CALL ECROBJ('MATRIK ',MATRIK)
  283. *! CALL PRLIST
  284. *
  285. * "Oubli" des valeurs des matrice élémentaires
  286. * On met les tableaux de LIZAFM à 0 => à MENAGE de les supprimmer
  287. * si besoin est.
  288. *
  289. CALL OUBIMA(MATRIK,IMPR,IRET)
  290. IF (IRET.NE.0) GOTO 9999
  291. C
  292. C Méthode directe
  293. C
  294. IF (KTYPI.EQ.1) THEN
  295. CALL KRES4(MATRIK,KCLIM,KSMBR,
  296. $ ISCAL,
  297. $ MCHSOL,
  298. $ IMPR,IRET)
  299. IF (IRET.NE.0) GOTO 9999
  300. C
  301. C Méthodes itératives
  302. C
  303. ELSEIF(KTYPI.GE.2.AND.KTYPI.LE.NBTYPI)THEN
  304. C Paramètres pour la méthode itérative proprement dite
  305. C - Champoint d'initialisation de la méthode
  306. C (i.e. estimation de l'inconnue)
  307. TYPE='CHPOINT '
  308. C CALL ACMO(MTINV,'XINIT',TYPE,MCHINI)
  309. C IF (IERR.NE.0) GOTO 9999
  310. CALL LIROBJ('CHPOINT',MCHINI,1,IRET)
  311. IF(IRET.EQ.0) GOTO 9999
  312. C - Nombre maxi d'itérations à effectuer
  313. C CALL ACME(MTINV,'NITMAX',ITER)
  314. C IF (IERR.NE.0) GOTO 9999
  315. CALL LIRENT(ITER,1,IRET)
  316. IF(IRET.EQ.0) GOTO 9999
  317. C - Norme maxi (L2 normé par le second membre) du résidu
  318. C CALL ACMF(MTINV,'RESID',RESID)
  319. C IF (IERR.NE.0) GOTO 9999
  320. CALL LIRREE(RESID,1,IRET)
  321. IF(IRET.EQ.0) GOTO 9999
  322. C - 'Breakdown tolerance' pour les méthodes de type
  323. C BiCGSTAB. Si un certain produit scalaire de vecteurs
  324. C "direction" est inférieur à cette tolérance, la
  325. C méthode s'arrete.
  326. IF (KTYPI.EQ.3.OR.KTYPI.EQ.4) THEN
  327. C CALL ACMF(MTINV,'BCGSBTOL',BRTOL)
  328. C IF (IERR.NE.0) GOTO 9999
  329. CALL LIRREE(BRTOL,1,IRET)
  330. IF(IRET.EQ.0) GOTO 9999
  331. ENDIF
  332. C - Paramètre m de redémarrage pour GMRES(m)
  333. C i.e. nombre max. de vecteurs par rapport auxquels on
  334. C orthogonalise le résidu
  335. IF (KTYPI.EQ.5) THEN
  336. C CALL ACME(MTINV,'GMRESTRT',IRSTRT)
  337. C IF (IERR.NE.0) GOTO 9999
  338. CALL LIRENT(IRSTRT,1,IRET)
  339. IF(IRET.EQ.0) GOTO 9999
  340. ENDIF
  341. C Paramètres pour les différents préconditionneurs
  342. C Matrice dont on utilise le préconditionneur
  343. C (éventuellement identique à la matrice transmise).
  344. C TYPE='MATRIK '
  345. C CALL ACMO(MTINV,'MAPREC',TYPE,MAPREC)
  346. C IF (IERR.NE.0) GOTO 9999
  347. CALL LIROBJ('MATRIK',MAPREC,1,IRET)
  348. IF(IRET.EQ.0) GOTO 9999
  349. C - Type de préconditionnement : (cf. LPREC)
  350. C 0 : pas de préconditionnement
  351. C 1 : préconditionnement par la diagonale
  352. C 2 : préconditionnement D-ILU
  353. C 3 : préconditionnement ILU(0) (Choleski)
  354. C 4 : préconditionnement MILU(0) (Choleski modifié)
  355. C 5 : préconditionnement ILUT (dual truncation)
  356. C 6 : préconditionnement ILUT2 (une variante du
  357. C précédent qui remplit mieux la mémoire et
  358. C fonctionne mieux quelquefois)
  359. C CALL ACME(MTINV,'PRECOND',KPREC)
  360. C IF (IERR.NE.0) GOTO 9999
  361. CALL LIRENT(KPREC,1,IRET)
  362. IF(IRET.EQ.0) GOTO 9999
  363. C - Paramètre de relaxation pour le préconditionnement
  364. C MILU(0) compris entre 0.D0 et 1.D0
  365. C S'il est égal à 0, on se ramène à ILU(0)
  366. C S'il est égal à 1, MILU(0) est dit non relaxé
  367. IF (KPREC.EQ.4) THEN
  368. C CALL ACMF(MTINV,'MILURELX',RXMILU)
  369. C IF (IERR.NE.0) GOTO 9999
  370. CALL LIRREE(RXMILU,1,IRET)
  371. IF(IRET.EQ.0) GOTO 9999
  372. ENDIF
  373. C - Pour une méthode ILUT, on a les deux indices suivant :
  374. C * ILUTLFIL : encombrement maximal (approximatif) du
  375. C préconditionneur, par rapport à la matrice.
  376. C * ILUTDTOL : "drop tolerance" pour le préconditionneur.
  377. C i.e. en-dessous de cette valeur relative, les
  378. C termes de la factorisation incomplète seront
  379. C oubliés.
  380. IF (KPREC.GE.5.AND.KPREC.LE.9) THEN
  381. C CALL ACMF(MTINV,'ILUTLFIL',XLFIL)
  382. C IF (IERR.NE.0) GOTO 9999
  383. CALL LIRREE(XLFIL,1,IRET)
  384. IF(IRET.EQ.0) GOTO 9999
  385. C CALL ACMF(MTINV,'ILUTDTOL',XDTOL)
  386. C IF (IERR.NE.0) GOTO 9999
  387. CALL LIRREE(XDTOL,1,IRET)
  388. IF(IRET.EQ.0) GOTO 9999
  389. ENDIF
  390. C - Pour une méthode ILUTP, on a les deux indices suivant :
  391. C * ILUTPPIV (type REEL) : sensibilité du pivoting
  392. C IF (KPREC.GE.7.AND.KPREC.LE.9) THEN
  393. C CALL ACMF(MTINV,'ILUTPPIV',XSPIV)
  394. C ENDIF
  395. CALL KRES5(MATRIK,KCLIM,KSMBR,KTYPI,
  396. $ MCHINI,ITER,RESID,
  397. $ BRTOL,IRSTRT,LBCG,ICALRS,
  398. $ MAPREC,KPREC,
  399. $ RXMILU,RXILUP,XLFIL,XDTOL,XSPIV,
  400. $ ISCAL,
  401. $ KTIME,LTIME,IDDOT,IMVEC,IORINC,
  402. $ MCHSOL,LRES,LNMV,ICVG,
  403. $ IMPR,IRET)
  404. IF (IRET.NE.0) GOTO 9999
  405. CALL ECMO(MTINV,'CONVINV','LISTREEL',LRES)
  406. ELSE
  407. WRITE(IOIMP,*) 'KTYPI=',KTYPI,'out of range (1..',NBTYPI,')'
  408. GOTO 9999
  409. ENDIF
  410. CALL ECROBJ('CHPOINT ',MCHSOL)
  411. *
  412. * Normal termination
  413. *
  414. RETURN
  415. *
  416. * Format handling
  417. *
  418. *
  419. * Error handling
  420. *
  421. 9999 CONTINUE
  422. WRITE(IOIMP,*) 'An error was detected in kresll.eso'
  423. * 153 2
  424. * Opération illicite dans ce contexte
  425. CALL ERREUR(153)
  426. RETURN
  427. *
  428. * End of KRES2
  429. *
  430. END
  431.  
  432.  

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