Télécharger kres23.eso

Retour à la liste

Numérotation des lignes :

kres23
  1. C KRES23 SOURCE GOUNAND 25/04/30 21:15:13 12258
  2. SUBROUTINE KRES23(KMINCT,KMORS,KIZA,NNUTOT,IORINC,KTYPI,
  3. $ IPERM,IPBLOC)
  4. IMPLICIT REAL*8 (A-H,O-Z)
  5. IMPLICIT INTEGER (I-N)
  6. C***********************************************************************
  7. C NOM : KRES23
  8. C DESCRIPTION : - Reordonnancer par bloc pour le multigrille
  9. C
  10. C Ce source est une adaptation de KRES13
  11. C
  12. C LANGAGE : ESOPE
  13. C AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF)
  14. C mél : gounand@semt2.smts.cea.fr
  15. C***********************************************************************
  16. C VERSION : v1, 22/04/2025, version initiale
  17. C HISTORIQUE : v1, 22/04/2025, création
  18. C HISTORIQUE :
  19. C HISTORIQUE :
  20. C***********************************************************************
  21.  
  22. -INC PPARAM
  23. -INC CCOPTIO
  24. -INC CCREEL
  25. POINTEUR KMINCT.MINC
  26. POINTEUR KMORS.PMORS
  27. POINTEUR KIZA.IZA
  28. -INC SMLENTI
  29. POINTEUR KTYINC.MLENTI
  30. POINTEUR KTYDDL.MLENTI
  31. POINTEUR KNODDL.MLENTI
  32. POINTEUR KRINC.MLENTI
  33. POINTEUR IWORK.MLENTI
  34. POINTEUR LAGRAN.MLENTI
  35. POINTEUR JORDRE.MLENTI,JORTMP.MLENTI
  36. POINTEUR IPERM.MLENTI,JPETMP.MLENTI
  37. POINTEUR JPERM.MLENTI,NNUTOT.MLENTI
  38. POINTEUR IBLOCK.MLENTI,IPBLOC.MLENTI
  39. POINTEUR ICPR.MLENTI
  40. -INC SMLOBJE
  41. POINTEUR IORINC.MLOBJE
  42. -INC SMLMOTS
  43. POINTEUR JORINC.MLMOTS,JORINU.MLMOTS
  44. -INC SMTABLE
  45. POINTEUR KTIME.MTABLE
  46. DIMENSION ITTIME(4)
  47. CHARACTER*(LOCHPO) CHCOMP
  48. CHARACTER*16 CHARI
  49. CHARACTER*1 CCOMP
  50. LOGICAL LTIME,LOGII,LNOD,LBLOCK,LOK,LNUL,LVERIF
  51. REAL*8 GNRM2
  52. C
  53. C Executable statements
  54. C
  55. LVERIF=.FALSE.
  56. LNOD=(KTYPI.EQ.11)
  57. SEGACT KMINCT
  58. NCOMP=KMINCT.LISINC(/2)
  59. NNOE=KMINCT.MPOS(/1)
  60. INC=KMINCT.NPOS(NNOE+1)-1
  61. JG=INC
  62. SEGINI KTYDDL
  63. KNODDL=0
  64. IF (LNOD) SEGINI KNODDL
  65. *
  66. WRITE(IOIMP,*) 'NCOMP,IORINC= ',NCOMP,IORINC
  67. *
  68. IF (IORINC.NE.0) THEN
  69. SEGACT IORINC
  70. NTYINC=IORINC.LISOBJ(/1)
  71. JGN=0
  72. JGM=0
  73. DO ITYINC=1,NTYINC
  74. MLMOTS=IORINC.LISOBJ(ITYINC)
  75. SEGACT MLMOTS
  76. JGN=MAX(JGN,MOTS(/1))
  77. JGM=JGM+MOTS(/2)
  78. ENDDO
  79. SEGINI,JORINC
  80. SEGINI,JORINU
  81. JG=JGM
  82. IG=0
  83. SEGINI KTYINC
  84. DO ITYINC=1,NTYINC
  85. MLMOTS=IORINC.LISOBJ(ITYINC)
  86. DO J=1,MOTS(/2)
  87. IG=IG+1
  88. JORINC.MOTS(IG)=MOTS(J)
  89. KTYINC.LECT(IG)=ITYINC
  90. ENDDO
  91. ENDDO
  92. * write(ioimp,*) 'JGN,JGM=',JGN,JGM
  93. CALL CUNIQ(JORINC.MOTS,JGN,JGM,JORINU.MOTS,JGMU,IMPR,IRET)
  94. IF (IRET.NE.0) GOTO 9999
  95. IF (JGM.NE.JGMU) THEN
  96. WRITE(IOIMP,*) 'IORINC ne doit pas avoir de doublons'
  97. GOTO 9999
  98. ENDIF
  99. SEGSUP JORINU
  100. IF (JGM.NE.NCOMP) THEN
  101. WRITE(IOIMP,*) 'IORINC doit referencer toutes'
  102. $ ,'les inconnues de la matrice'
  103. GOTO 9999
  104. ENDIF
  105. JG=NCOMP
  106. SEGINI KRINC
  107. CALL CREPER(JGN,NCOMP,JGM,KMINCT.LISINC,JORINC.MOTS,KRINC.LECT
  108. $ ,IMPR,IRET)
  109. IF (IRET.NE.0) GOTO 9999
  110. ELSE
  111. NTYINC=NCOMP
  112. ENDIF
  113. IF (IIMPI.NE.0) THEN
  114. WRITE(IOIMP,*) 'NCOMP= ',NCOMP
  115. WRITE(IOIMP,*) 'KMINCT.LISINC(1..',NCOMP,')= '
  116. WRITE(IOIMP,*)(KMINCT.LISINC(II),II=1,NCOMP)
  117. IF (IORINC.NE.0) THEN
  118. WRITE(IOIMP,*) 'JORINC.MOTS(1..',NCOMP,')= '
  119. WRITE(IOIMP,*)(JORINC.MOTS(II),II=1,NCOMP)
  120. WRITE(IOIMP,*) 'KRINC.LECT(1..',NCOMP,')= '
  121. WRITE(IOIMP,*)(KRINC.LECT(II),II=1,NCOMP)
  122. ENDIF
  123. ENDIF
  124. * segprt,mincpo
  125. DO ICOMP=1,NCOMP
  126. DO INOE=1,NNOE
  127. IPOS=KMINCT.MPOS(INOE,ICOMP)
  128. IF (IPOS.NE.0) THEN
  129. JPOS=KMINCT.NPOS(INOE)+IPOS-1
  130. IF (IORINC.ne.0) then
  131. KTYDDL.LECT(JPOS)=KTYINC.LECT(KRINC.LECT(ICOMP))
  132. ELSE
  133. KTYDDL.LECT(JPOS)=ICOMP
  134. ENDIF
  135. IF (LNOD) KNODDL.LECT(JPOS)=INOE
  136. ENDIF
  137. ENDDO
  138. ENDDO
  139. * segprt,ktyddl
  140. * if (lnod) segprt,knoddl
  141. segact kmors
  142. segact kiza
  143. *
  144. segact nnutot
  145. * write(ioimp,*) 'Permutation nnutot'
  146. * write(ioimp,187) (nnutot.lect(I),I=1,nnutot.lect(/1))
  147. * 1) Trouver le nombre de blocs
  148. NBLOCK=NTYINC
  149. ntt=inc
  150. if (iimpi.ne.0) then
  151. write(ioimp,*) 'Nb d''inconnues=',ntt
  152. write(ioimp,*) 'Nb de termes=',kmors.ja(/1)
  153. write(ioimp,*) 'Nb de blocs detectes nblock=',nblock
  154. endif
  155. JG=NBLOCK+1
  156. SEGINI IBLOCK
  157. lblock=nblock.gt.1
  158. 187 FORMAT (5X,10I8)
  159. if (lblock) then
  160. jg=ntt
  161. * segini jperm2
  162. segini iperm
  163. segini jperm
  164. do i=1,ntt
  165. jperm.lect(nnutot.lect(i))=i
  166. enddo
  167. * segprt,jperm
  168. *
  169. * 2) Trouver le nombre d'inconnus par blocs
  170. DO i=1,ntt
  171. jblock=ktyddl.lect(i)
  172. iblock.lect(jblock)=iblock.lect(jblock)+1
  173. enddo
  174. if (iimpi.ne.0) then
  175. write(ioimp,*) 'Nb inconnues par blocs'
  176. write(ioimp,187) (iblock.lect(I),I=1,iblock.lect(/1))
  177. endif
  178. * 3) D'où le segment de repérage
  179. do i=nblock,1,-1
  180. iblock.lect(i+1)=iblock.lect(i)
  181. enddo
  182. if (iimpi.ne.0) then
  183. write(ioimp,*) 'Segment de repérage tmp'
  184. write(ioimp,187) (iblock.lect(I),I=1,iblock.lect(/1))
  185. endif
  186. iblock.lect(1)=1
  187. do i=1,nblock
  188. iblock.lect(i+1)=iblock.lect(i+1)+iblock.lect(i)
  189. enddo
  190. if (iimpi.ne.0) then
  191. write(ioimp,*) 'Segment de repérage'
  192. write(ioimp,187) (iblock.lect(I),I=1,iblock.lect(/1))
  193. endif
  194. * 4) Construction des permutations
  195. ntt=kmors.ia(/1)-1
  196. if (iimpi.ne.0) then
  197. write(ioimp,*) 'Nb d''inconnues 2 ntt=',ntt
  198. endif
  199. if (ktypi.eq.11) then
  200. * Petite verif sur la taille des blocs
  201. nddl1=iblock.lect(2)-iblock.lect(1)
  202. do i=2,nblock
  203. nddl=iblock.lect(i+1)-iblock.lect(i)
  204. if (nddl.ne.nddl1) then
  205. write(ioimp,*) 'Le bloc ',i,' de taille =',nddl
  206. write(ioimp,*) 'na pas la meme taille que le bloc 1 ='
  207. $ ,nddl1
  208. goto 9999
  209. endif
  210. enddo
  211. * Le premier bloc donne le tableau de correspondance pour les noeuds
  212. JG=NNOE
  213. SEGINI ICPR
  214. ktt=0
  215. kblock=1
  216. do jtt=1,ntt
  217. itt=jperm.lect(jtt)
  218. jblock=ktyddl.lect(itt)
  219. if (jblock.eq.kblock) then
  220. ktt=ktt+1
  221. iperm.lect(itt)=ktt
  222. inod=knoddl.lect(itt)
  223. * jperm2.lect(ktt)=itt
  224. ICPR.LECT(INOD)=ktt
  225. endif
  226. enddo
  227. * segprt,iperm
  228. * segprt,iCPR
  229. do kblock=2,nblock
  230. ideb=iblock.lect(kblock)
  231. do jtt=1,ntt
  232. itt=jperm.lect(jtt)
  233. jblock=ktyddl.lect(itt)
  234. if (jblock.eq.kblock) then
  235. inod=knoddl.lect(itt)
  236. ktt1=ICPR.LECT(inod)
  237. if (ktt1.eq.0) then
  238. write(ioimp,*) 'Le noeud ',inod
  239. $ ,' present dans le bloc 1 nexiste pas'
  240. $ ,' dans le bloc ',kblock
  241. goto 9999
  242. else
  243. ktti=ideb+ktt1-1
  244. iperm.lect(itt)=ktti
  245. endif
  246. endif
  247. enddo
  248. enddo
  249. * segprt,iperm
  250. else
  251. ktt=0
  252. do kblock=1,nblock
  253. do jtt=1,ntt
  254. itt=jperm.lect(jtt)
  255. jblock=ktyddl.lect(itt)
  256. if (kblock.eq.jblock) then
  257. ktt=ktt+1
  258. iperm.lect(itt)=ktt
  259. * jperm2.lect(ktt)=itt
  260. endif
  261. enddo
  262. enddo
  263. endif
  264. * Attention, on reutilise jperm pour etre la reciproque de iperm et
  265. * non plus de nnutot
  266. do i=1,ntt
  267. jperm.lect(iperm.lect(i))=i
  268. enddo
  269. * write(ioimp,*) 'Permutation i'
  270. * write(ioimp,187) (iperm.lect(I),I=1,iperm.lect(/1))
  271. * write(ioimp,*) 'Permutation j'
  272. * write(ioimp,187) (jperm.lect(I),I=1,jperm.lect(/1))
  273. else
  274. if (ktypi.eq.10.or.ktypi.eq.11) then
  275. write(ioimp,*)
  276. $ 'The AGMG Stokes and NS solvers need blocks'
  277. goto 9999
  278. endif
  279. iperm=nnutot
  280. jperm=0
  281. iblock.lect(1)=1
  282. iblock.lect(2)=ntt+1
  283. if (iimpi.ne.0) then
  284. write(ioimp,*) 'Segment de repérage'
  285. write(ioimp,187) (iblock.lect(I),I=1,iblock.lect(/1))
  286. endif
  287. endif
  288. *
  289. * Verif pas de terme diagonal nul dans la matrice (sauf AGMG-Stokes KTYPI=10)
  290. *
  291. * segprt,kmors
  292. * segprt,kiza
  293. DO I=1,NTT
  294. LNUL=.FALSE.
  295. DO J=KMORS.IA(I),(KMORS.IA(I+1)-1)
  296. * WRITE(IOIMP,*) 'I,J=',I,J
  297. * WRITE(IOIMP,*) 'JA(J)=',KMORS.JA(J)
  298. IF (KMORS.JA(J).EQ.I) THEN
  299. * WRITE(IOIMP,*) 'KIZA.A(J)=',KIZA.A(J)
  300. LNUL=(KIZA.A(J).EQ.XZERO)
  301. IF (LNUL) GOTO 10
  302. ENDIF
  303. ENDDO
  304. 10 CONTINUE
  305. * WRITE(IOIMP,*) 'IFOUND=',IFOUND
  306. IF (LNUL) THEN
  307. LOK=.FALSE.
  308. * Le pivot a le droit d'etre nul s'il s'agit du dernier bloc pour la
  309. * methode AGMGStokes
  310. IF (KTYPI.EQ.10) THEN
  311. IF (KTYDDL.LECT(I).EQ.NBLOCK) THEN
  312. LOK=.TRUE.
  313. ENDIF
  314. ENDIF
  315. IF (.NOT.LOK) THEN
  316. WRITE(IOIMP,*) 'The ',I
  317. $ ,'th diagonal term of the matrix is nil'
  318. IF (LNOD) THEN
  319. write(ioimp,*) 'Node =',KNODDL.LECT(I)
  320. ENDIF
  321. write(ioimp,*) 'Bloc =',KTYDDL.LECT(I)
  322. IRET=-3
  323. GOTO 9999
  324. ENDIF
  325. ENDIF
  326. ENDDO
  327. *
  328. * Verifier que les blocs sont de meme taille pour NS
  329. *
  330. if (ktypi.eq.10.or.ktypi.eq.11.and.LVERIF) then
  331. IF (.NOT.lblock) THEN
  332. write(ioimp,*) 'The AGMG Stokes and NS solvers need blocks'
  333. goto 9999
  334. ENDIF
  335. if (ktypi.eq.11) then
  336. nddl1=iblock.lect(2)-iblock.lect(1)
  337. do i=2,nblock
  338. nddl=iblock.lect(i+1)-iblock.lect(i)
  339. if (nddl.ne.nddl1) then
  340. write(ioimp,*) 'Le bloc ',i,' de taille =',nddl
  341. write(ioimp,*) 'na pas la meme taille que le bloc 1 ='
  342. $ ,nddl1
  343. goto 9999
  344. endif
  345. enddo
  346. *
  347. * Verif que les inconnues sont dans le même ordre à l'intérieur de
  348. * chaque bloc
  349. *
  350. do i=2,nblock
  351. nddl=iblock.lect(i+1)-iblock.lect(i)
  352. ideb=iblock.lect(i)
  353. do iddl=1,nddl
  354. inod1=knoddl.lect(jperm.lect(iddl))
  355. inodi=knoddl.lect(jperm.lect(ideb+iddl-1))
  356. if (inodi.ne.inod1) then
  357. write(ioimp,*) 'Dans le bloc ',i,' le ddl ',iddl
  358. $ ,' porte sur le noeud inodi=',inodi
  359. write(ioimp,*) 'Dans le bloc ',1,' le ddl ',iddl
  360. $ ,' porte sur le noeud inod1=',inod1
  361. write(ioimp,*) 'inod1 != inodi est une erreur !'
  362. goto 9999
  363. endif
  364. enddo
  365. enddo
  366. endif
  367. endif
  368. *
  369. IF (IORINC.NE.0) THEN
  370. SEGSUP KRINC
  371. SEGSUP KTYINC
  372. SEGSUP JORINC
  373. ENDIF
  374. IF (LNOD) SEGSUP KNODDL
  375. SEGSUP KTYDDL
  376. IF (jperm.ne.0) segsup jperm
  377. C
  378. IPBLOC=IBLOCK
  379. C
  380. C Normal termination
  381. C
  382. RETURN
  383. C
  384. C Error Handling
  385. C
  386. 9999 CONTINUE
  387. MOTERR(1:8)='KRES23 '
  388. CALL ERREUR(1127)
  389. RETURN
  390. C
  391. C Format handling
  392. C
  393. 2022 FORMAT(10(1X,1PG12.5))
  394. C
  395. C End of subroutine KRES23
  396. C
  397. END
  398.  
  399.  

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