Télécharger kresll.eso

Retour à la liste

Numérotation des lignes :

kresll
  1. C KRESLL SOURCE GOUNAND 25/04/30 21:15:18 12258
  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=11)
  115. C PARAMETER (LNTYPI=18)
  116. C CHARACTER*(LNTYPI) LTYPI(NBTYPI)
  117. LOGICAL LBID,LVAL,LTIME,LMRENU,LDEPE,LLDEPE,LDUMP
  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. MRIGID=0
  141. c Valeurs par défaut reprise de prkres
  142. KSMBR=0
  143. MTINV=0
  144. IMPR=0
  145. KCLIM=0
  146. KTYPI=1
  147. MATASS=MATRIK
  148. MAPREC=MATRIK
  149. MRENU='SLOA'
  150. LMRENU=.FALSE.
  151. MMULAG='APR2'
  152. ISCAL=0
  153. INORMU=1
  154. IF (MRIGID.NE.0) THEN
  155. IOUBL=1
  156. ELSE
  157. IOUBL=0
  158. ENDIF
  159. IMPINV=0
  160. MCHINI=0
  161. ITER=2000
  162. RESID=1.D-10
  163. BRTOL=1.D-40
  164. IRSTRT=50
  165. KPREC=3
  166. RXMILU=1.D0
  167. RXILUP=0.5D0
  168. XLFIL=2.D0
  169. XDTOL=-1.D0
  170. XSPIV=0.1D0
  171. LBCG=4
  172. ICALRS=0
  173. METASS=5
  174. LTIME=.FALSE.
  175. IF (MRIGID.NE.0) THEN
  176. NELIM=2
  177. ELSE
  178. NELIM=0
  179. ENDIF
  180. IDDOT=0
  181. IMVEC=2
  182. ith=oothrd
  183. IF(ITH.NE.0)THEN
  184. IMVEC=0
  185. ENDIF
  186. IORINC=0
  187. MLAG1=0
  188. MLAG2=0
  189. LDUMP=.FALSE.
  190. ISMOOT=0
  191. C
  192. 1 CONTINUE
  193. CALL LIRMOT(LMOT,NBM,IP,0)
  194. IF(IP.EQ.0) GOTO 2
  195. GOTO (11,12,13,14),IP
  196. C Lecture du niveau d'impression
  197. C option 'IMPR'
  198. 11 CONTINUE
  199. c write(6,*)' option IMPR'
  200. CALL LIRENT(IMPR,1,IRET)
  201. IF (IRET.EQ.0) GOTO 9999
  202. GO TO 1
  203. C Lecture de la table pour les méthodes d'inversion
  204. C option 'TYPI'
  205. 12 CONTINUE
  206. CALL LIRTAB('METHINV',MTINV,1,IRET)
  207. IF(IRET.EQ.0)RETURN
  208. CALL LIRENT(KTYPI,1,IRET)
  209. C KTYPI : Méthode d'inversion du système (cf. LTYPI)
  210. C 1 : résolution directe (Choleski)
  211. C 2 : Gradient Conjugué
  212. C 3 : Bi-Gradient Conjugué Stabilisé (BiCGSTAB)
  213. C 4 : BiCGSTAB(2)
  214. C 5 : GMRES(m)
  215. C CALL ACME(MTINV,'TYPINV',KTYPI)
  216. IF (IERR.NE.0) GOTO 9999
  217. C write(6,*)' Ktypi=',ktypi
  218. IF (KTYPI.LT.1.OR.KTYPI.GT.NBTYPI) THEN
  219. WRITE(IOIMP,*) 'L''indice TYPINV ',
  220. $ 'is out of range (1..',NBTYPI,') :',KTYPI
  221. GOTO 9999
  222. ENDIF
  223. GO TO 1
  224. C Lecture du chpoint de conditions aux limites
  225. C option CLIM
  226. 13 CONTINUE
  227. CALL QUETYP(TYPE,1,IRET)
  228. IF(IRET.EQ.0) GOTO 9999
  229. IF(TYPE.EQ.'CHPOINT')THEN
  230. CALL LIROBJ(TYPE,KCLIM,1,IRET)
  231. ELSE
  232. WRITE(IOIMP,*) 'Erreur lecture C.lim'
  233. GOTO 9999
  234. ENDIF
  235. GO TO 1
  236. C Lecture du chpoint second membre
  237. C option SMBR
  238. 14 CONTINUE
  239. CALL QUETYP(TYPE,1,IRET)
  240. IF(IRET.EQ.0)RETURN
  241. IF(TYPE.EQ.'CHPOINT')THEN
  242. CALL LIROBJ('CHPOINT',KSMBR,1,IRET)
  243. c write(6,*)' lecture 2 membre '
  244. ELSE
  245. WRITE(IOIMP,*) 'Erreur lecture second membre'
  246. GOTO 9999
  247. ENDIF
  248. GOTO 1
  249. 2 CONTINUE
  250. C write(6,*)' On a pas finit les lectures '
  251. c NAT=2
  252. c NSOUPO=0
  253. c SEGINI MCHPO1
  254. c MCHPO1.JATTRI(1)=2
  255. c CALL ECROBJ('CHPOINT',MCHPO1)
  256. c return
  257. C
  258. C Matrice dont on utilise l'assemblage
  259. C (éventuellement identique à la matrice transmise)
  260. C
  261. TYPE='MATRIK '
  262. C CALL ACMO(MTINV,'MATASS',TYPE,MATASS)
  263. C IF (IERR.NE.0) GOTO 9999
  264. CALL LIROBJ('MATRIK',MATASS,1,IRET)
  265. IF(IRET.EQ.0) GOTO 9999
  266. C - Pour l'assemblage : type de renumérotation
  267. C CALL ACMM(MTINV,'TYRENU',MRENU)
  268. C IF (IERR.NE.0) GOTO 9999
  269. CALL LIRCHA(MRENU,1,LCHAR)
  270. IF(LCHAR.EQ.0)GO TO 9999
  271. C - Pour l'assemblage : prise en compte des mult.lag
  272. C CALL ACMM(MTINV,'PCMLAG',MMULAG)
  273. C IF (IERR.NE.0) GOTO 9999
  274. CALL LIRCHA(MMULAG,1,LCHAR)
  275. IF(LCHAR.EQ.0)GO TO 9999
  276. C - Pour l'assemblage : scaling de la matrice
  277. C CALL ACME(MTINV,'SCALING',ISCAL)
  278. C IF (IERR.NE.0) GOTO 9999
  279. ISCAL=0
  280. C Niveau d'impression pour la partie résolution itérative
  281. c CALL ACME(MTINV,'IMPINV',IMPINV)
  282. c IF (IERR.NE.0) GOTO 9999
  283. c IMPR=MAX(IMPR,IMPINV)
  284. IMPR=0
  285. C
  286. C Assemblage proprement dit
  287. C
  288. IIMPR=0
  289. * SG 2016/02/09 : non à la ligne suivante : il faut que METASS soit
  290. * égale à 5 (voir remarque dans makpr2)
  291. * METASS=4
  292. CALL KRES3(MATRIK,MATASS,MRENU,MMULAG,METASS,
  293. $ KTYPI,IORINC,MLAG1,MLAG2,IPBLOC,
  294. $ KTIME,LTIME,
  295. $ IIMPR,IRET)
  296. IF (IRET.NE.0) GOTO 9999
  297. *! WRITE(IOIMP,*) 'Aprés assemblage'
  298. *! CALL ECRENT(5)
  299. *! CALL ECROBJ('MATRIK ',MATRIK)
  300. *! CALL PRLIST
  301. *
  302. * "Oubli" des valeurs des matrice élémentaires
  303. * On met les tableaux de LIZAFM à 0 => à MENAGE de les supprimmer
  304. * si besoin est.
  305. *
  306. CALL OUBIMA(MATRIK,IMPR,IRET)
  307. IF (IRET.NE.0) GOTO 9999
  308. C
  309. C Méthode directe
  310. C
  311. IF (KTYPI.EQ.1) THEN
  312. CALL KRES4(MATRIK,KCLIM,KSMBR,
  313. $ ISCAL,
  314. $ MCHSOL,
  315. $ IMPR,IRET)
  316. IF (IRET.NE.0) GOTO 9999
  317. C
  318. C Méthodes itératives
  319. C
  320. ELSEIF(KTYPI.GE.2.AND.KTYPI.LE.NBTYPI)THEN
  321. C Paramètres pour la méthode itérative proprement dite
  322. C - Champoint d'initialisation de la méthode
  323. C (i.e. estimation de l'inconnue)
  324. TYPE='CHPOINT '
  325. C CALL ACMO(MTINV,'XINIT',TYPE,MCHINI)
  326. C IF (IERR.NE.0) GOTO 9999
  327. CALL LIROBJ('CHPOINT',MCHINI,1,IRET)
  328. IF(IRET.EQ.0) GOTO 9999
  329. C - Nombre maxi d'itérations à effectuer
  330. C CALL ACME(MTINV,'NITMAX',ITER)
  331. C IF (IERR.NE.0) GOTO 9999
  332. CALL LIRENT(ITER,1,IRET)
  333. IF(IRET.EQ.0) GOTO 9999
  334. C - Norme maxi (L2 normé par le second membre) du résidu
  335. C CALL ACMF(MTINV,'RESID',RESID)
  336. C IF (IERR.NE.0) GOTO 9999
  337. CALL LIRREE(RESID,1,IRET)
  338. IF(IRET.EQ.0) GOTO 9999
  339. C - 'Breakdown tolerance' pour les méthodes de type
  340. C BiCGSTAB. Si un certain produit scalaire de vecteurs
  341. C "direction" est inférieur à cette tolérance, la
  342. C méthode s'arrete.
  343. IF (KTYPI.EQ.3.OR.KTYPI.EQ.4) THEN
  344. C CALL ACMF(MTINV,'BCGSBTOL',BRTOL)
  345. C IF (IERR.NE.0) GOTO 9999
  346. CALL LIRREE(BRTOL,1,IRET)
  347. IF(IRET.EQ.0) GOTO 9999
  348. ENDIF
  349. C - Paramètre m de redémarrage pour GMRES(m)
  350. C i.e. nombre max. de vecteurs par rapport auxquels on
  351. C orthogonalise le résidu
  352. IF (KTYPI.EQ.5) THEN
  353. C CALL ACME(MTINV,'GMRESTRT',IRSTRT)
  354. C IF (IERR.NE.0) GOTO 9999
  355. CALL LIRENT(IRSTRT,1,IRET)
  356. IF(IRET.EQ.0) GOTO 9999
  357. ENDIF
  358. C Paramètres pour les différents préconditionneurs
  359. C Matrice dont on utilise le préconditionneur
  360. C (éventuellement identique à la matrice transmise).
  361. C TYPE='MATRIK '
  362. C CALL ACMO(MTINV,'MAPREC',TYPE,MAPREC)
  363. C IF (IERR.NE.0) GOTO 9999
  364. CALL LIROBJ('MATRIK',MAPREC,1,IRET)
  365. IF(IRET.EQ.0) GOTO 9999
  366. C - Type de préconditionnement : (cf. LPREC)
  367. C 0 : pas de préconditionnement
  368. C 1 : préconditionnement par la diagonale
  369. C 2 : préconditionnement D-ILU
  370. C 3 : préconditionnement ILU(0) (Choleski)
  371. C 4 : préconditionnement MILU(0) (Choleski modifié)
  372. C 5 : préconditionnement ILUT (dual truncation)
  373. C 6 : préconditionnement ILUT2 (une variante du
  374. C précédent qui remplit mieux la mémoire et
  375. C fonctionne mieux quelquefois)
  376. C CALL ACME(MTINV,'PRECOND',KPREC)
  377. C IF (IERR.NE.0) GOTO 9999
  378. CALL LIRENT(KPREC,1,IRET)
  379. IF(IRET.EQ.0) GOTO 9999
  380. C - Paramètre de relaxation pour le préconditionnement
  381. C MILU(0) compris entre 0.D0 et 1.D0
  382. C S'il est égal à 0, on se ramène à ILU(0)
  383. C S'il est égal à 1, MILU(0) est dit non relaxé
  384. IF (KPREC.EQ.4) THEN
  385. C CALL ACMF(MTINV,'MILURELX',RXMILU)
  386. C IF (IERR.NE.0) GOTO 9999
  387. CALL LIRREE(RXMILU,1,IRET)
  388. IF(IRET.EQ.0) GOTO 9999
  389. ENDIF
  390. C - Pour une méthode ILUT, on a les deux indices suivant :
  391. C * ILUTLFIL : encombrement maximal (approximatif) du
  392. C préconditionneur, par rapport à la matrice.
  393. C * ILUTDTOL : "drop tolerance" pour le préconditionneur.
  394. C i.e. en-dessous de cette valeur relative, les
  395. C termes de la factorisation incomplète seront
  396. C oubliés.
  397. IF (KPREC.GE.5.AND.KPREC.LE.9) THEN
  398. C CALL ACMF(MTINV,'ILUTLFIL',XLFIL)
  399. C IF (IERR.NE.0) GOTO 9999
  400. CALL LIRREE(XLFIL,1,IRET)
  401. IF(IRET.EQ.0) GOTO 9999
  402. C CALL ACMF(MTINV,'ILUTDTOL',XDTOL)
  403. C IF (IERR.NE.0) GOTO 9999
  404. CALL LIRREE(XDTOL,1,IRET)
  405. IF(IRET.EQ.0) GOTO 9999
  406. ENDIF
  407. C - Pour une méthode ILUTP, on a les deux indices suivant :
  408. C * ILUTPPIV (type REEL) : sensibilité du pivoting
  409. C IF (KPREC.GE.7.AND.KPREC.LE.9) THEN
  410. C CALL ACMF(MTINV,'ILUTPPIV',XSPIV)
  411. C ENDIF
  412. CALL KRES5(MATRIK,KCLIM,KSMBR,KTYPI,
  413. $ MCHINI,ITER,RESID,
  414. $ BRTOL,IRSTRT,LBCG,ICALRS,
  415. $ MAPREC,KPREC,
  416. $ RXMILU,RXILUP,XLFIL,XDTOL,XSPIV,
  417. $ ISCAL,
  418. $ KTIME,LTIME,LDUMP,ISMOOT,IDDOT,IMVEC,IPBLOC,
  419. $ MCHSOL,LRES,LNMV,ICVG,
  420. $ IMPR,IRET)
  421. IF (IRET.NE.0) GOTO 9999
  422. CALL ECMO(MTINV,'CONVINV','LISTREEL',LRES)
  423. ELSE
  424. WRITE(IOIMP,*) 'KTYPI=',KTYPI,'out of range (1..',NBTYPI,')'
  425. GOTO 9999
  426. ENDIF
  427. CALL ECROBJ('CHPOINT ',MCHSOL)
  428. *
  429. * Normal termination
  430. *
  431. RETURN
  432. *
  433. * Format handling
  434. *
  435. *
  436. * Error handling
  437. *
  438. 9999 CONTINUE
  439. WRITE(IOIMP,*) 'An error was detected in kresll.eso'
  440. * 153 2
  441. * Opération illicite dans ce contexte
  442. CALL ERREUR(153)
  443. RETURN
  444. *
  445. * End of KRES2
  446. *
  447. END
  448.  
  449.  

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