Télécharger renume.eso

Retour à la liste

Numérotation des lignes :

renume
  1. C RENUME SOURCE GOUNAND 25/04/30 21:15:37 12258
  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. * que 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. ENDIF
  129. SEGSUP ADJAC
  130. SEGACT PMTOT
  131. NTOTPO=PMTOT.IA(/1)-1
  132. E2=PMTOT.IA(NTOTPO+1)-1
  133. CALL PROFI1(NTOTPO,NEWNUM.LECT,E2,PMTOT.JA,PMTOT.IA,
  134. $ OLDPRO,NEWPRO,
  135. $ IMPR,IRET)
  136. IF (IRET.NE.0) GOTO 9999
  137. IF (IMPR.GT.1) THEN
  138. WRITE(IOIMP,*) 'Profil Morse non ordonné = ',OLDPRO
  139. WRITE(IOIMP,*) 'Profil Morse ordonné = ',NEWPRO
  140. ENDIF
  141. IF (OLDPRO.LT.NEWPRO) THEN
  142. ISROK=.FALSE.
  143. ELSE
  144. ISROK=.TRUE.
  145. ENDIF
  146. ENDIF
  147. *
  148. * ...non effectuée
  149. IF (IRENU.EQ.1.OR.(.NOT.ISROK)) THEN
  150. IF (IRENU.EQ.1) THEN
  151. SEGACT PMTOT
  152. NTOTPO=PMTOT.IA(/1)-1
  153. JG=NTOTPO
  154. SEGINI NEWNUM
  155. ELSEIF (.NOT.ISROK) THEN
  156. SEGACT NEWNUM*MOD
  157. NTOTPO=NEWNUM.LECT(/1)
  158. ENDIF
  159. DO 1 ITOTPO=1,NTOTPO
  160. NEWNUM.LECT(ITOTPO)=ITOTPO
  161. 1 CONTINUE
  162. IF (IMPR.GT.2) THEN
  163. WRITE(IOIMP,*) 'Pas de renumérotation effectuée'
  164. ENDIF
  165. ENDIF
  166. *
  167. * Normal termination
  168. *
  169. IRET=0
  170. RETURN
  171. *
  172. * Format handling
  173. *
  174. *
  175. * Error handling
  176. *
  177. 9999 CONTINUE
  178. IRET=1
  179. WRITE(IOIMP,*) 'An error was detected in subroutine renume'
  180. RETURN
  181. *
  182. * End of subroutine RENUME
  183. *
  184. END
  185.  
  186.  

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