Télécharger corinc.eso

Retour à la liste

Numérotation des lignes :

corinc
  1. C CORINC SOURCE PV 05/12/01 21:15:02 5252
  2. SUBROUTINE CORINC(KRINCD,KRINCP,
  3. $ KRIDUN,LIPUN,
  4. $ IMPR,IRET)
  5. IMPLICIT INTEGER(I-N)
  6. IMPLICIT REAL*8 (A-H,O-Z)
  7. C***********************************************************************
  8. C NOM : CORINC
  9. C PROJET : Assemblage matrice élémentaire -> matrice Morse
  10. C DESCRIPTION : Construction d'une liste indexée de correspondance :
  11. C (nom d'inconnue duale)->(noms d'inconnues primales
  12. C associées)
  13. C
  14. C LANGAGE : ESOPE
  15. C AUTEUR : Stéphane GOUNAND (CEA/DRN/DMT/SEMT/LTMF)
  16. C mél : gounand@semt2.smts.cea.fr
  17. C***********************************************************************
  18. C APPELES : IUNIQ, IREPER
  19. C APPELE PAR : MKPMOR
  20. C***********************************************************************
  21. C ENTREES : KRINCD, KRINCP
  22. C SORTIES : KRIDUN, LIPUN
  23. C CODE RETOUR (IRET) : = 0 si tout s'est bien passé
  24. C***********************************************************************
  25. C VERSION : v1, 18/11/99, version initiale
  26. C HISTORIQUE : v1, 18/11/99, création
  27. C HISTORIQUE :
  28. C HISTORIQUE :
  29. C***********************************************************************
  30. C Prière de PRENDRE LE TEMPS de compléter les commentaires
  31. C en cas de modification de ce sous-programme afin de faciliter
  32. C la maintenance !
  33. C***********************************************************************
  34.  
  35. -INC PPARAM
  36. -INC CCOPTIO
  37. -INC SMLENTI
  38. INTEGER JG
  39. POINTEUR KRINCD.MLENTI
  40. POINTEUR KRINCP.MLENTI
  41. POINTEUR KRIDUN.MLENTI
  42. POINTEUR KRCDUN.MLENTI
  43. *
  44. * Includes perso
  45. *
  46. *
  47. * Segment LSTIND (liste séquentielle indexée)
  48. *
  49. SEGMENT LSTIND
  50. INTEGER IDX(NBM+1)
  51. INTEGER IVAL(NBTVAL)
  52. ENDSEGMENT
  53. *
  54. * LISTE SEQUENTIELLE INDEXEE D'ENTIERS
  55. *
  56. * NBM : NOMBRE DE MULTIPLETS
  57. * NBTVAL : NOMBRE TOTAL DE VALEURS
  58. * IDX(I) : INDICE DE LA PREMIERE VALEUR DU IEME
  59. * MULTIPLET DANS LE TABLEAU IVAL
  60. * IVAL(IDX(I) -> IDX(I+1)-1) : VALEURS DU IEME MULTIPLET
  61. *-INC SLSTIND
  62. INTEGER NBM,NBTVAL
  63. POINTEUR LIPUN.LSTIND
  64. *
  65. INTEGER IMPR,IRET
  66. *
  67. INTEGER IDXCOU,INOZER
  68. INTEGER ICOMPD,IDUNIQ
  69. INTEGER NCOMPD,NDUNIQ,NCOMPP,NINCP
  70. LOGICAL LFOUND
  71. *
  72. * Executable statements
  73. *
  74. IF (IMPR.GT.1) WRITE(IOIMP,*) 'Entrée dans corinc'
  75. C On détermine le nombre de composantes primales distinctes
  76. SEGACT KRINCD
  77. NCOMPD=KRINCD.LECT(/1)
  78. JG=NCOMPD
  79. SEGINI KRIDUN
  80. CALL IUNIQ(KRINCD.LECT,NCOMPD,
  81. $ KRIDUN.LECT,NDUNIQ,
  82. $ IMPR,IRET)
  83. IF (IRET.NE.0) GOTO 9999
  84. JG=NDUNIQ
  85. SEGADJ,KRIDUN
  86. * On construit la liste de repérage de KRINCD dans KRIDUN
  87. JG=NCOMPD
  88. SEGINI KRCDUN
  89. CALL IREPER(NCOMPD,NDUNIQ,
  90. $ KRINCD.LECT,KRIDUN.LECT,
  91. $ KRCDUN.LECT,
  92. $ IMPR,IRET)
  93. C Pour chaque composante primale distincte, il faut déterminer
  94. C avec quels composantes duales distinctes il est relié :
  95. C Par exemple, si on a :
  96. C KRINCD = 1 1 1 2
  97. C KRINCP = 2 2 3 4
  98. C On a : KRIDUN = 1 2
  99. C On veut : LIPUN = (2 3) (4) (c'est une liste indexée)
  100. SEGACT KRINCP
  101. NCOMPP=KRINCP.LECT(/1)
  102. NBM=NDUNIQ
  103. * Au maximum, chaque élément KRINCD est relié à tous les
  104. * autres de KRINCP
  105. NBTVAL=NDUNIQ*NCOMPP
  106. SEGINI LIPUN
  107. * On remplit la liste des index
  108. LIPUN.IDX(1)=1
  109. DO 1 IDUNIQ=1,NDUNIQ
  110. LIPUN.IDX(IDUNIQ+1)=LIPUN.IDX(IDUNIQ)+NCOMPP
  111. 1 CONTINUE
  112. * On construit la liste de correspondance contenant éventuellement
  113. * des zéros que l'on supprimme après
  114. DO 3 ICOMPD=1,NCOMPD
  115. IDUNIQ=KRCDUN.LECT(ICOMPD)
  116. IDXCOU=LIPUN.IDX(IDUNIQ)
  117. NINCP=KRINCP.LECT(ICOMPD)
  118. 5 CONTINUE
  119. LFOUND=(LIPUN.IVAL(IDXCOU).EQ.NINCP)
  120. IF (LIPUN.IVAL(IDXCOU).NE.0.AND.(.NOT.LFOUND)) THEN
  121. IDXCOU=IDXCOU+1
  122. GOTO 5
  123. ENDIF
  124. IF (.NOT.LFOUND) THEN
  125. LIPUN.IVAL(IDXCOU)=NINCP
  126. ENDIF
  127. 3 CONTINUE
  128. * On supprimme les zéros
  129. INOZER=1
  130. IDXCOU=1
  131. DO 7 IDUNIQ=1,NDUNIQ
  132. 9 CONTINUE
  133. IF (IDXCOU.LE.LIPUN.IVAL(/1)) THEN
  134. IF (LIPUN.IVAL(IDXCOU).NE.0) THEN
  135. LIPUN.IVAL(INOZER)=LIPUN.IVAL(IDXCOU)
  136. INOZER=INOZER+1
  137. IDXCOU=IDXCOU+1
  138. GOTO 9
  139. ENDIF
  140. ENDIF
  141. IDXCOU=LIPUN.IDX(IDUNIQ+1)
  142. LIPUN.IDX(IDUNIQ+1)=INOZER
  143. 7 CONTINUE
  144. NBTVAL=LIPUN.IDX(NDUNIQ+1)-1
  145. SEGADJ,LIPUN
  146. SEGDES LIPUN
  147. SEGDES KRINCP
  148. SEGSUP KRCDUN
  149. SEGDES KRIDUN
  150. SEGDES KRINCD
  151. *
  152. * Normal termination
  153. *
  154. IRET=0
  155. RETURN
  156. *
  157. * Format handling
  158. *
  159. *
  160. * Error handling
  161. *
  162. 9999 CONTINUE
  163. IRET=1
  164. WRITE(IOIMP,*) 'An error was detected in subroutine corinc'
  165. RETURN
  166. *
  167. * End of subroutine CORINC
  168. *
  169. END
  170.  
  171.  
  172.  
  173.  
  174.  
  175.  

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