Télécharger calnu4.eso

Retour à la liste

Numérotation des lignes :

calnu4
  1. C CALNU4 SOURCE PV 20/09/26 21:15:24 10724
  2. SUBROUTINE CALNU4(LITYP,LINIV,KMINCT,PMTOT,
  3. $ IRENU,
  4. $ NEWNUM,
  5. $ IMPR,IRET)
  6. IMPLICIT REAL*8 (A-H,O-Z)
  7. IMPLICIT INTEGER (I-N)
  8. C***********************************************************************
  9. C NOM : CALNU4
  10. C PROJET : Noyau linéaire NLIN
  11. C DESCRIPTION : Calcul d'une renumérotation avec minimisation d'un
  12. C profil PUIS placement des inconnues suivant l'ordre
  13. C donné par LIORD
  14. C Dans calnum, on effectuait les choses suivantes :
  15. C - minimisation du profil sur les ddl sans les ML.
  16. C - insertion des ML dans la nouvelle numérotation
  17. C Maintenant, on essaie la chose suivante :
  18. C - minimisation du profil sur les ddl AVEC les ML.;
  19. C - retrait des ML de la numérotation ;
  20. C - réinsertion des ML pour les placer après les ddl non
  21. C ML auxquels ils sont liés.
  22. C
  23. C IRENU=1 'RIEN' : pas de renumérotation
  24. C 2 'SLOA' : algorithme de chez Sloan
  25. C 3 'GIPR' : Gibbs-King (profile reduction)
  26. C 4 'GIBA' : Gibbs-Poole-Stockmeyer (bandwidth reduction)
  27. C
  28. C LANGAGE : ESOPE
  29. C AUTEUR : Stéphane GOUNAND (CEA/DRN/DMT/SEMT/LTMF)
  30. C mél : gounand@semt2.smts.cea.fr
  31. C***********************************************************************
  32. C APPELES : RENUME
  33. C APPELES (UTIL.) : ISETI, ISHELI, RSETXI
  34. C APPELE PAR : PRASEM
  35. C***********************************************************************
  36. C ENTREES : KMINCT, PMTOT, IRENU
  37. C SORTIES : NEWNUM
  38. C CODE RETOUR (IRET) : = 0 si tout s'est bien passé
  39. C***********************************************************************
  40. C VERSION : v1, 01/04/04, version initiale
  41. C HISTORIQUE : v1, 01/04/04, création
  42. C HISTORIQUE : voir note * SG 10/06/2015
  43. C HISTORIQUE :
  44. C***********************************************************************
  45. C Prière de PRENDRE LE TEMPS de compléter les commentaires
  46. C en cas de modification de ce sous-programme afin de faciliter
  47. C la maintenance !
  48. C***********************************************************************
  49.  
  50. -INC PPARAM
  51. -INC CCOPTIO
  52. POINTEUR KMINCT.MINC
  53. POINTEUR PMTOT.PMORS
  54. -INC SMLENTI
  55. INTEGER JG
  56. POINTEUR LITYP.MLENTI
  57. POINTEUR LINIV.MLENTI
  58. POINTEUR DDLINC.MLENTI
  59. *inu POINTEUR DDLPT.MLENTI
  60. POINTEUR NEWNUM.MLENTI
  61. POINTEUR KRDDL.MLENTI
  62. POINTEUR NNUTOT.MLENTI
  63. POINTEUR PRMDDL.MLENTI
  64. SEGMENT LML
  65. POINTEUR ML(NINC).MLENTI
  66. ENDSEGMENT
  67. POINTEUR DDLDIM.MLENTI
  68. POINTEUR ITTDDL.MLENTI
  69. POINTEUR INUDDL.MLENTI
  70. POINTEUR LDD.LML
  71. POINTEUR LDDI.MLENTI
  72. POINTEUR NNU.LML
  73. POINTEUR NNUI.MLENTI
  74. POINTEUR NNUJ.MLENTI
  75. POINTEUR NNUK.MLENTI
  76. POINTEUR PRM.LML
  77. POINTEUR PRMI.MLENTI
  78. *-INC SMLLOGI
  79. SEGMENT MLLOGI
  80. LOGICAL LOGI(JG)
  81. ENDSEGMENT
  82. POINTEUR DDLOK.MLLOGI
  83. * POINTEUR PTLAG.MLLOGI
  84. POINTEUR DDLLAG.MLLOGI
  85. *
  86. *STAT-INC SMSTAT
  87. *
  88. INTEGER IMPR,IRET
  89. INTEGER IRENU
  90. *
  91. INTEGER ITOTPO,JTTDDL
  92. INTEGER NTOTPO,NTTDDL
  93. LOGICAL LLAG,LRELA
  94. *
  95. * Executable statements
  96. *
  97. IF (IMPR.GT.1) WRITE(IOIMP,*) 'Entrée dans calnu4'
  98. *
  99. * Construction de DDLINC : c'est un tableau d'entiers tel que :
  100. * DDLINC(jttddl) = ordre du ddl
  101. *
  102. * SEGPRT,KMINCT
  103. * SEGPRT,PMTOT
  104. * SEGPRT,LITYP
  105. * SEGPRT,LINIV
  106. SEGACT KMINCT
  107. SEGACT LITYP
  108. SEGACT LINIV
  109. NINC=KMINCT.LISINC(/2)
  110. MAXNIV=0
  111. DO IINC=1,NINC
  112. MAXNIV=MAX(MAXNIV,LINIV.LECT(IINC))
  113. ENDDO
  114. *
  115. * Construction de DDLINC et DDLPT : sorte de segment réciproque
  116. * de KMINCT
  117. * En fait, DDLPT est inutile pour la suite.
  118. * Construction de DDLLAG : liste des ddl de niveau > 1
  119. *
  120. NTOTPO=KMINCT.NPOS(/1)-1
  121. NTTDDL=KMINCT.NPOS(NTOTPO+1)-1
  122. JG=NTTDDL
  123. SEGINI DDLINC
  124. *inu JG=NTTDDL
  125. *inu SEGINI DDLPT
  126. JG=NTTDDL
  127. * Initialisé à .FALSE.
  128. SEGINI DDLLAG
  129. LRELA=.FALSE.
  130. DO ITOTPO=1,NTOTPO
  131. DO IINC=1,NINC
  132. IPOS=KMINCT.MPOS(ITOTPO,IINC)
  133. IF (IPOS.NE.0) THEN
  134. JPOS=KMINCT.NPOS(ITOTPO)+IPOS-1
  135. DDLINC.LECT(JPOS)=IINC
  136. *inu DDLPT.LECT(JPOS)=ITOTPO
  137. * Non ! IF (LITYP.LECT(IINC).LE.2) THEN
  138. IF (LINIV.LECT(IINC).GE.2) THEN
  139. DDLLAG.LOGI(JPOS)=.TRUE.
  140. LRELA=.TRUE.
  141. ENDIF
  142. ENDIF
  143. ENDDO
  144. ENDDO
  145. * SEGPRT,DDLINC
  146. *inu SEGPRT,DDLPT
  147. * SEGPRT,DDLLAG
  148. *dbg DO ITTDDL=1,NTTDDL
  149. *dbg CALL DDL2PI(ITTDDL,KMINCT,
  150. *dbg $ IPT,IBI,
  151. *dbg $ IMPR,IRET)
  152. *dbg IF (IRET.NE.0) GOTO 9999
  153. *dbg WRITE(IOIMP,*) 'ddl ',ITTDDL,' = IPT=',IPT,
  154. *dbg $ ' inconnue ',KMINCT.LISINC(IBI)
  155. *dbg ENDDO
  156. *inu SEGSUP DDLPT
  157. *
  158. * Construction des tableaux d'entiers suivants :
  159. * LDD.IINC(1..NTTINC) liste des ddl de l'inconnue iinc
  160. * DDLINC(JTTDDL)=IINC : numéro de l'inconnue du ddl de numéro jttddl
  161. * KRDDL(JTTDDL)=ITTINC avec LDD.IINC(ITTINC)
  162. *
  163. SEGINI LDD
  164. JG=NINC
  165. SEGINI DDLDIM
  166. DO IINC=1,NINC
  167. JG=0
  168. SEGINI LDDI
  169. LDD.ML(IINC)=LDDI
  170. ENDDO
  171. JG=NTTDDL
  172. SEGINI KRDDL
  173. DO JTTDDL=1,NTTDDL
  174. IINC=DDLINC.LECT(JTTDDL)
  175. LDDI=LDD.ML(IINC)
  176. ITTINC=DDLDIM.LECT(IINC)+1
  177. LDDI.LECT(**)=JTTDDL
  178. KRDDL.LECT(JTTDDL)=ITTINC
  179. DDLDIM.LECT(IINC)=ITTINC
  180. ENDDO
  181. C SEGPRT,DDLDIM
  182. C SEGPRT,LDD
  183. C DO IINC=1,NINC
  184. C LDDI=LDD.ML(IINC)
  185. C SEGPRT,LDDI
  186. C ENDDO
  187. C SEGPRT,KRDDL
  188. *STAT CALL PRMSTA(' Préparation renume divers',MSTAT,IMPR)
  189. *
  190. * Obtention de la nouvelle numérotation des ddl
  191. * In RENUME : SEGINI NNUTOT
  192. * In RENUME : SEGDES NNUTOT
  193. CALL RENUME(PMTOT,IRENU,NNUTOT,IMPR,IRET)
  194. IF (IRET.NE.0) GOTO 9999
  195. C SEGPRT,NNUTOT
  196. *STAT CALL PRMSTA(' Après renume',MSTAT,IMPR)
  197. *
  198. * Construction des NNUs pour les points qui ne sont pas dans
  199. * DDLLAG
  200. *
  201. SEGACT,NNUTOT
  202. * NINC=NINC
  203. SEGINI NNU
  204. DO IINC=1,NINC
  205. JG=DDLDIM.LECT(IINC)
  206. SEGINI NNUI
  207. NNU.ML(IINC)=NNUI
  208. ENDDO
  209. DO ITOTPO=1,NTOTPO
  210. DO IINC=1,NINC
  211. IPOS=KMINCT.MPOS(ITOTPO,IINC)
  212. IF (IPOS.NE.0) THEN
  213. JPOS=KMINCT.NPOS(ITOTPO)+IPOS-1
  214. * SG 10/06/2015 IF (.NOT.DDLLAG.LOGI(JPOS)) THEN
  215. INNU=NNUTOT.LECT(JPOS)
  216. NNUI=NNU.ML(IINC)
  217. KRNNUI=KRDDL.LECT(JPOS)
  218. NNUI.LECT(KRNNUI)=INNU
  219. * SG 10/06/2015 ENDIF
  220. ENDIF
  221. ENDDO
  222. ENDDO
  223. SEGSUP NNUTOT
  224. * SEGPRT,NNU
  225. * DO IINC=1,NINC
  226. * NNUI=NNU.ML(IINC)
  227. * SEGPRT,NNUI
  228. * ENDDO
  229.  
  230. IF (LRELA) THEN
  231. C
  232. C Obtention des numéros des ddl portant sur des points
  233. C où il n'y a que des multiplicateurs de Lagrange
  234. C le max ou le min des ddl de niveau INIV-1 qui lui sont
  235. C reliés
  236. C
  237. SEGACT PMTOT
  238. DO INIV=2,MAXNIV
  239. DO IINC=1,NINC
  240. JNIV=LINIV.LECT(IINC)
  241. IF (JNIV.EQ.INIV) THEN
  242. JTYP=LITYP.LECT(IINC)
  243. DO ITOTPO=1,NTOTPO
  244. IPOS=KMINCT.MPOS(ITOTPO,IINC)
  245. IF (IPOS.NE.0) THEN
  246. JTTDDL=KMINCT.NPOS(ITOTPO)+IPOS-1
  247. IF (DDLLAG.LOGI(JTTDDL)) THEN
  248. * WRITE(IOIMP,*) 'Lagrange JTTDDL=',JTTDDL
  249. JNNU=0
  250. KSTRT=PMTOT.IA(JTTDDL)
  251. KSTOP=PMTOT.IA(JTTDDL+1)-1
  252. * WRITE(IOIMP,*) 'iniv-1=',INIV-1
  253. * WRITE(IOIMP,*) 'kstrt=',kstrt
  254. * WRITE(IOIMP,*) 'kstop=',kstop
  255. DO KIND=KSTRT,KSTOP
  256. KTTDDL=PMTOT.JA(KIND)
  257. KINC=DDLINC.LECT(KTTDDL)
  258. KNIV=LINIV.LECT(KINC)
  259. * WRITE(IOIMP,*) 'kniv=',KNIV
  260. IF (KNIV.LE.INIV-1) THEN
  261. NNUK=NNU.ML(KINC)
  262. KRNNUK=KRDDL.LECT(KTTDDL)
  263. KNNU=NNUK.LECT(KRNNUK)
  264. * WRITE(IOIMP,*) 'ok knnu=',KNNU
  265. IF (KNNU.EQ.0) THEN
  266. WRITE(IOIMP,*) 'Erreur trop grave'
  267. GOTO 9999
  268. ENDIF
  269. IF (JNNU.EQ.0) THEN
  270. JNNU=KNNU
  271. ELSE
  272. IF (JTYP.EQ.4) THEN
  273. JNNU=MIN(JNNU,KNNU)
  274. *! ELSEIF (JTYP.EQ.3) THEN
  275. ELSEIF (JTYP.EQ.3.OR.JTYP.EQ.2) THEN
  276. JNNU=MAX(JNNU,KNNU)
  277. ELSE
  278. WRITE(IOIMP,*) 'Erreur grave 1.2'
  279. GOTO 9999
  280. ENDIF
  281. ENDIF
  282. ENDIF
  283. ENDDO
  284. IF (JNNU.EQ.0) THEN
  285. * SG 10/06/2015
  286. * Ceci peut ne pas etre une erreur apres elimination des relations,
  287. * il peut y avoir des multiplicateurs qui se retrouvent seuls
  288. * ce qui n'est pas un pb s'ils ont une matrice de stabilisation pour
  289. * eux.
  290. * A ce moment-là, on ne change pas leur position dans le profil
  291. * i.e on ne fait rien
  292. * Ceci etait l'ancien debug...
  293. if (.FALSE.) THEN
  294. WRITE(IOIMP,*) 'INIV=',INIV
  295. WRITE(IOIMP,*) 'IINC=',IINC
  296. WRITE(IOIMP,*) 'JTYP=',JTYP
  297. WRITE(IOIMP,*) 'JTTDDL=',JTTDDL
  298. DO KIND=KSTRT,KSTOP
  299. KTTDDL=PMTOT.JA(KIND)
  300. WRITE(IOIMP,*) 'KTTDDL=',KTTDDL
  301. KINC=DDLINC.LECT(KTTDDL)
  302. KNIV=LINIV.LECT(KINC)
  303. WRITE(IOIMP,*) 'KINC=',KINC
  304. WRITE(IOIMP,*) 'KNIV=',KNIV
  305. ENDDO
  306. WRITE(IOIMP,*) 'Erreur grave 1.5'
  307. GOTO 9999
  308. endif
  309. ELSE
  310. NNUJ=NNU.ML(IINC)
  311. KRNNUJ=KRDDL.LECT(JTTDDL)
  312. NNUJ.LECT(KRNNUJ)=JNNU
  313. ENDIF
  314. ENDIF
  315. ENDIF
  316. ENDDO
  317. ENDIF
  318. ENDDO
  319. ENDDO
  320. SEGDES PMTOT
  321. ENDIF
  322. C SEGPRT,NNU
  323. C DO IINC=1,NINC
  324. C NNUI=NNU.ML(IINC)
  325. C SEGPRT,NNUI
  326. C ENDDO
  327. SEGSUP KRDDL
  328. SEGSUP DDLLAG
  329. SEGSUP DDLINC
  330. SEGDES LINIV
  331. SEGDES LITYP
  332. SEGDES KMINCT
  333. *
  334. * 1 On calcule les permutations qui permettent de trier NNU
  335. * par ordre croissant de nouveau numéro.
  336. *
  337. SEGINI PRM
  338. DO IINC=1,NINC
  339. NTTINC=DDLDIM.LECT(IINC)
  340. JG=NTTINC
  341. SEGINI PRMI
  342. CALL ISETI(PRMI.LECT,NTTINC)
  343. PRM.ML(IINC)=PRMI
  344. NNUI=NNU.ML(IINC)
  345. CALL ISHELI(NTTINC,PRMI.LECT,NTTINC,NNUI.LECT,
  346. $ IMPR,IRET)
  347. IF (IRET.NE.0) GOTO 9999
  348. ENDDO
  349. C SEGPRT,PRM
  350. C DO IORD=1,NORD
  351. C PRMI=PRM.ML(IORD)
  352. C SEGPRT,PRMI
  353. C ENDDO
  354. *
  355. * 3 En "merge"ant les listes précédentes, on obtient
  356. * la permutation réciproque de la nouvelle numérotation
  357. * totale que l'on cherche (si, si !)
  358. *
  359. JG=NTTDDL
  360. SEGINI PRMDDL
  361. JG=NINC
  362. SEGINI ITTDDL
  363. DO IINC=1,NINC
  364. ITTDDL.LECT(IINC)=1
  365. ENDDO
  366. JG=NINC
  367. SEGINI DDLOK
  368. DO IINC=1,NINC
  369. DDLOK.LOGI(IINC)=(ITTDDL.LECT(IINC).LE.DDLDIM.LECT(IINC))
  370. ENDDO
  371. JG=NINC
  372. SEGINI INUDDL
  373. DO IINC=1,NINC
  374. IF (DDLOK.LOGI(IINC)) THEN
  375. NNUI=NNU.ML(IINC)
  376. PRMI=PRM.ML(IINC)
  377. * IITT=ITTDDL.LECT(IORD)
  378. * IPRM=PRM1.LECT(IITT)
  379. * INNU=NNU1.LECT(IPRM)
  380. INUDDL.LECT(IINC)=NNUI.LECT(PRMI.LECT(ITTDDL.LECT(IINC)))
  381. ENDIF
  382. ENDDO
  383. DO JTTDDL=1,NTTDDL
  384. JNUMIN=0
  385. JINC=0
  386. DO IINC=1,NINC
  387. IF (DDLOK.LOGI(IINC)) THEN
  388. IF (JNUMIN.EQ.0) THEN
  389. JNUMIN=INUDDL.LECT(IINC)
  390. JINC=IINC
  391. ELSE
  392. KNUMIN=INUDDL.LECT(IINC)
  393. IF (KNUMIN.LT.JNUMIN) THEN
  394. JNUMIN=KNUMIN
  395. JINC=IINC
  396. ENDIF
  397. ENDIF
  398. ENDIF
  399. ENDDO
  400. IF ((JNUMIN.EQ.0).OR.(JINC.EQ.0)) THEN
  401. WRITE(IOIMP,*) 'Erreur trop grave 2'
  402. GOTO 9999
  403. ENDIF
  404. LDDI=LDD.ML(JINC)
  405. NNUI=NNU.ML(JINC)
  406. PRMI=PRM.ML(JINC)
  407. KTTDDL=ITTDDL.LECT(JINC)
  408. PRMDDL.LECT(JTTDDL)=LDDI.LECT(PRMI.LECT(KTTDDL))
  409. ITTDDL.LECT(JINC)=KTTDDL+1
  410. DDLOK.LOGI(JINC)=(ITTDDL.LECT(JINC).LE.DDLDIM.LECT(JINC))
  411. IF (DDLOK.LOGI(JINC)) THEN
  412. NNUI=NNU.ML(JINC)
  413. PRMI=PRM.ML(JINC)
  414. INUDDL.LECT(JINC)=NNUI.LECT(PRMI.LECT(ITTDDL.LECT(JINC)))
  415. ENDIF
  416. ENDDO
  417. SEGSUP INUDDL
  418. SEGSUP DDLOK
  419. SEGSUP ITTDDL
  420. DO IINC=1,NINC
  421. PRMI=PRM.ML(IINC)
  422. SEGSUP PRMI
  423. ENDDO
  424. SEGSUP PRM
  425. DO IINC=1,NINC
  426. NNUI=NNU.ML(IINC)
  427. SEGSUP NNUI
  428. ENDDO
  429. SEGSUP NNU
  430. SEGSUP DDLDIM
  431. DO IINC=1,NINC
  432. LDDI=LDD.ML(IINC)
  433. SEGSUP LDDI
  434. ENDDO
  435. SEGSUP LDD
  436. * SEGPRT,PRMDDL
  437. *
  438. * D'où la nouvelle numérotation :
  439. *
  440. JG=NTTDDL
  441. SEGINI NEWNUM
  442. CALL RSETXI(NEWNUM.LECT,PRMDDL.LECT,NTTDDL)
  443. SEGDES NEWNUM
  444. SEGSUP PRMDDL
  445. *STAT CALL PRMSTA(' Merge et obtention NEWNUM',MSTAT,IMPR)
  446. * SEGPRT,NEWNUM
  447. * STOP 16
  448. *
  449. * Normal termination
  450. *
  451. IRET=0
  452. RETURN
  453. *
  454. * Format handling
  455. *
  456. *
  457. * Error handling
  458. *
  459. 9999 CONTINUE
  460. IRET=1
  461. WRITE(IOIMP,*) 'An error was detected in subroutine calnu4'
  462. RETURN
  463. *
  464. * End of subroutine CALNU4
  465. *
  466. END
  467.  
  468.  
  469.  
  470.  
  471.  
  472.  
  473.  
  474.  
  475.  
  476.  
  477.  

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