Télécharger renume.eso

Retour à la liste

Numérotation des lignes :

renume
  1. C RENUME SOURCE PV 20/09/28 21:15:28 10727
  2. SUBROUTINE RENUME(PMTOT,
  3. $ IRENU,
  4. $ NEWNUM,
  5. $ IMPR,IRET)
  6. IMPLICIT INTEGER(I-N)
  7. IMPLICIT REAL*8 (A-H,O-Z)
  8. C***********************************************************************
  9. C NOM : RENUME
  10. C PROJET : Noyau linéaire NLIN
  11. C DESCRIPTION : On cherche une nouvelle numérotation des inconnues
  12. C pour minimiser le profil ou la largeur de bande d'un
  13. C profil d'une matrice Morse par les diverses méthodes
  14. C disponibles.
  15. C
  16. C IRENU=1 'RIEN' : pas de renumérotation
  17. C 2 'SLOA' : algorithme de chez Sloan
  18. C 3 'GIPR' : Gibbs-King (profile reduction)
  19. C 4 'GIBA' : Gibbs-Poole-Stockmeyer (bandwidth reduction)
  20. C
  21. C LANGAGE : ESOPE
  22. C AUTEUR : Stéphane GOUNAND (CEA/DRN/DMT/SEMT/LTMF)
  23. C mél : gounand@semt2.smts.cea.fr
  24. C***********************************************************************
  25. C APPELES : PRGRAP, PRSLOA, PRGPSK
  26. C APPELE PAR : PRASEM
  27. C***********************************************************************
  28. C ENTREES : PMTOT, IRENU
  29. C SORTIES : NEWNUM
  30. C CODE RETOUR (IRET) : = 0 si tout s'est bien passé
  31. C***********************************************************************
  32. C VERSION : v1, 26/11/99, version initiale
  33. C HISTORIQUE : v1, 26/11/99, création
  34. C HISTORIQUE :
  35. C HISTORIQUE :
  36. C***********************************************************************
  37. C Prière de PRENDRE LE TEMPS de compléter les commentaires
  38. C en cas de modification de ce sous-programme afin de faciliter
  39. C la maintenance !
  40. C***********************************************************************
  41. -INC PPARAM
  42. -INC CCOPTIO
  43. POINTEUR PMTOT.PMORS
  44. -INC SMLENTI
  45. INTEGER JG
  46. POINTEUR NEWNUM.MLENTI
  47. *-INC SLSTIND
  48. *
  49. * Segment LSTIND (liste séquentielle indexée)
  50. *
  51. SEGMENT LSTIND
  52. INTEGER IDX(NBM+1)
  53. INTEGER IVAL(NBTVAL)
  54. ENDSEGMENT
  55. *
  56. * LISTE SEQUENTIELLE INDEXEE D'ENTIERS
  57. *
  58. * NBM : NOMBRE DE MULTIPLETS
  59. * NBTVAL : NOMBRE TOTAL DE VALEURS
  60. * IDX(I) : INDICE DE LA PREMIERE VALEUR DU IEME
  61. * MULTIPLET DANS LE TABLEAU IVAL
  62. * IVAL(IDX(I) -> IDX(I+1)-1) : VALEURS DU IEME MULTIPLET
  63. POINTEUR ADJAC.LSTIND
  64. *
  65. INTEGER IRENU
  66. INTEGER IMPR,IRET
  67. *
  68. INTEGER ITOTPO,NTOTPO
  69. INTEGER E2,NEWPRO,OLDPRO,NEWPR2,OLDPR2
  70. LOGICAL OPTPRO,ISROK
  71. *
  72. ISROK=.FALSE.
  73. *
  74. * Executable statements
  75. *
  76. IF (IMPR.GT.1) WRITE(IOIMP,*) 'Entrée dans renume'
  77. *
  78. * Construction de la renumérotation...
  79. *
  80. IF (IRENU.GE.2.AND.IRENU.LE.4) THEN
  81. * construction du graphe symétrique (Sloan et Gibbs-King ont besoin
  82. * sue le graphe soit symétrique)
  83. *
  84. * In PRGRAP : SEGINI ADJAC
  85. CALL PRGRAP(PMTOT,
  86. $ ADJAC,
  87. $ IMPR,IRET)
  88. IF (IRET.NE.0) GOTO 9999
  89. *
  90. * ...par l'algorithme de l'article de Sloan
  91. IF (IRENU.EQ.2) THEN
  92. CALL PRSLOA(ADJAC,
  93. $ NEWNUM,
  94. $ IMPR,IRET)
  95. IF (IRET.NE.0) GOTO 9999
  96. * ...par l'algorithme TOMS 582
  97. ELSEIF (IRENU.EQ.3) THEN
  98. OPTPRO=.TRUE.
  99. CALL PRGPSK(ADJAC,OPTPRO,
  100. $ NEWNUM,
  101. $ IMPR,IRET)
  102. IF (IRET.NE.0) GOTO 9999
  103. ELSEIF (IRENU.EQ.4) THEN
  104. OPTPRO=.FALSE.
  105. CALL PRGPSK(ADJAC,OPTPRO,
  106. $ NEWNUM,
  107. $ IMPR,IRET)
  108. IF (IRET.NE.0) GOTO 9999
  109. ELSE
  110. WRITE(IOIMP,*) 'Erreur de programmation...'
  111. GOTO 9999
  112. ENDIF
  113. SEGACT NEWNUM
  114. IF (IMPR.GT.2) THEN
  115. SEGACT ADJAC
  116. *
  117. * Compute profiles of adjacency list
  118. * for old and new node numbers
  119. *
  120. NTOTPO=ADJAC.IDX(/1)-1
  121. E2=ADJAC.IDX(NTOTPO+1)-1
  122. CALL PROFI1(NTOTPO,NEWNUM.LECT,E2,ADJAC.IVAL,ADJAC.IDX,
  123. $ OLDPR2,NEWPR2,
  124. $ IMPR,IRET)
  125. IF (IRET.NE.0) GOTO 9999
  126. WRITE(IOIMP,*) 'Profil symétrique non ordonné = ',OLDPR2
  127. WRITE(IOIMP,*) 'Profil symétrique ordonné = ',NEWPR2
  128. SEGDES ADJAC
  129. ENDIF
  130. SEGSUP ADJAC
  131. SEGACT PMTOT
  132. NTOTPO=PMTOT.IA(/1)-1
  133. E2=PMTOT.IA(NTOTPO+1)-1
  134. CALL PROFI1(NTOTPO,NEWNUM.LECT,E2,PMTOT.JA,PMTOT.IA,
  135. $ OLDPRO,NEWPRO,
  136. $ IMPR,IRET)
  137. IF (IRET.NE.0) GOTO 9999
  138. SEGDES PMTOT
  139. IF (IMPR.GT.1) THEN
  140. WRITE(IOIMP,*) 'Profil Morse non ordonné = ',OLDPRO
  141. WRITE(IOIMP,*) 'Profil Morse ordonné = ',NEWPRO
  142. ENDIF
  143. SEGDES NEWNUM
  144. IF (OLDPRO.LT.NEWPRO) THEN
  145. ISROK=.FALSE.
  146. ELSE
  147. ISROK=.TRUE.
  148. ENDIF
  149. ENDIF
  150. *
  151. * ...non effectuée
  152. IF (IRENU.EQ.1.OR.(.NOT.ISROK)) THEN
  153. IF (IRENU.EQ.1) THEN
  154. SEGACT PMTOT
  155. NTOTPO=PMTOT.IA(/1)-1
  156. SEGDES PMTOT
  157. JG=NTOTPO
  158. SEGINI NEWNUM
  159. ELSEIF (.NOT.ISROK) THEN
  160. SEGACT NEWNUM*MOD
  161. NTOTPO=NEWNUM.LECT(/1)
  162. ENDIF
  163. DO 1 ITOTPO=1,NTOTPO
  164. NEWNUM.LECT(ITOTPO)=ITOTPO
  165. 1 CONTINUE
  166. * SEGDES NEWNUM
  167. SEGDES NEWNUM
  168. IF (IMPR.GT.2) THEN
  169. WRITE(IOIMP,*) 'Pas de renumérotation effectuée'
  170. ENDIF
  171. ENDIF
  172. *
  173. * Normal termination
  174. *
  175. IRET=0
  176. RETURN
  177. *
  178. * Format handling
  179. *
  180. *
  181. * Error handling
  182. *
  183. 9999 CONTINUE
  184. IRET=1
  185. WRITE(IOIMP,*) 'An error was detected in subroutine renume'
  186. RETURN
  187. *
  188. * End of subroutine RENUME
  189. *
  190. END
  191.  
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200.  

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