Download corinc.eso

Back to the list

   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 : -INC CCOPTIO
  35 : -INC SMLENTI
  36 :       INTEGER JG
  37 :       POINTEUR KRINCD.MLENTI
  38 :       POINTEUR KRINCP.MLENTI
  39 :       POINTEUR KRIDUN.MLENTI
  40 :       POINTEUR KRCDUN.MLENTI
  41 : *
  42 : * Includes perso
  43 : *
  44 : *
  45 : *     Segment LSTIND (liste séquentielle indexée)
  46 : *
  47 :       SEGMENT LSTIND
  48 :       INTEGER IDX(NBM+1)
  49 :       INTEGER IVAL(NBTVAL)
  50 :       ENDSEGMENT
  51 : *
  52 : *     LISTE SEQUENTIELLE INDEXEE D'ENTIERS
  53 : *
  54 : *     NBM      : NOMBRE DE MULTIPLETS
  55 : *     NBTVAL   : NOMBRE TOTAL DE VALEURS 
  56 : *     IDX(I)   : INDICE DE LA PREMIERE VALEUR DU IEME 
  57 : *                MULTIPLET DANS LE TABLEAU IVAL
  58 : *     IVAL(IDX(I) -> IDX(I+1)-1) : VALEURS DU IEME MULTIPLET
  59 : *-INC SLSTIND
  60 :       INTEGER NBM,NBTVAL
  61 :       POINTEUR LIPUN.LSTIND
  62 : *
  63 :       INTEGER IMPR,IRET
  64 : *
  65 :       INTEGER IDXCOU,INOZER
  66 :       INTEGER ICOMPD,IDUNIQ
  67 :       INTEGER NCOMPD,NDUNIQ,NCOMPP,NINCP
  68 :       LOGICAL LFOUND
  69 : *     
  70 : * Executable statements
  71 : *
  72 :       IF (IMPR.GT.1) WRITE(IOIMP,*) 'Entrée dans corinc'
  73 : C On détermine le nombre de composantes primales distinctes
  74 :       SEGACT KRINCD
  75 :       NCOMPD=KRINCD.LECT(/1)
  76 :       JG=NCOMPD
  77 :       SEGINI KRIDUN
  77 :       CALL IUNIQ(KRINCD.LECT,NCOMPD,
  78 :      $     KRIDUN.LECT,NDUNIQ,
  79 :      $     IMPR,IRET)
  80 :       IF (IRET.NE.0) GOTO 9999
  81 :       JG=NDUNIQ
  82 :       SEGADJ,KRIDUN
  83 : * On construit la liste de repérage de KRINCD dans KRIDUN
  84 :       JG=NCOMPD
  85 :       SEGINI KRCDUN
  85 :       CALL IREPER(NCOMPD,NDUNIQ,
  86 :      $     KRINCD.LECT,KRIDUN.LECT,
  87 :      $     KRCDUN.LECT,
  88 :      $     IMPR,IRET)
  89 : C Pour chaque composante primale distincte, il faut déterminer
  90 : C avec quels composantes duales distinctes il est relié :
  91 : C Par exemple, si on a :
  92 : C      KRINCD = 1  1  1  2 
  93 : C      KRINCP = 2  2  3  4
  94 : C On a :    KRIDUN =  1     2
  95 : C On veut :  LIPUN = (2 3) (4) (c'est une liste indexée)
  96 :       SEGACT KRINCP
  97 :       NCOMPP=KRINCP.LECT(/1)
  98 :       NBM=NDUNIQ
  99 : * Au maximum, chaque élément KRINCD est relié à tous les 
 100 : * autres de KRINCP
 101 :       NBTVAL=NDUNIQ*NCOMPP
 102 :       SEGINI LIPUN
 103 : * On remplit la liste des index
 104 :       LIPUN.IDX(1)=1
 105 :       DO 1 IDUNIQ=1,NDUNIQ
 106 :          LIPUN.IDX(IDUNIQ+1)=LIPUN.IDX(IDUNIQ)+NCOMPP
 107 :  1    CONTINUE
 108 : * On construit la liste de correspondance contenant éventuellement
 109 : * des zéros que l'on supprimme après
 110 :       DO 3 ICOMPD=1,NCOMPD
 111 :          IDUNIQ=KRCDUN.LECT(ICOMPD)
 112 :          IDXCOU=LIPUN.IDX(IDUNIQ)
 113 :          NINCP=KRINCP.LECT(ICOMPD)
 114 :  5       CONTINUE
 115 :          LFOUND=(LIPUN.IVAL(IDXCOU).EQ.NINCP)
 116 :          IF (LIPUN.IVAL(IDXCOU).NE.0.AND.(.NOT.LFOUND)) THEN
 117 :             IDXCOU=IDXCOU+1
 118 :             GOTO 5
 119 :          ENDIF
 120 :          IF (.NOT.LFOUND) THEN
 121 :             LIPUN.IVAL(IDXCOU)=NINCP
 122 :          ENDIF
 123 :  3    CONTINUE
 124 : * On supprimme les zéros
 125 :       INOZER=1
 126 :       IDXCOU=1
 127 :       DO 7 IDUNIQ=1,NDUNIQ
 128 :  9       CONTINUE
 129 :          IF (IDXCOU.LE.LIPUN.IVAL(/1)) THEN
 130 :          IF (LIPUN.IVAL(IDXCOU).NE.0) THEN
 131 :              LIPUN.IVAL(INOZER)=LIPUN.IVAL(IDXCOU)
 132 :              INOZER=INOZER+1
 133 :              IDXCOU=IDXCOU+1
 134 :              GOTO 9
 135 :           ENDIF
 136 :           ENDIF
 137 :           IDXCOU=LIPUN.IDX(IDUNIQ+1)
 138 :           LIPUN.IDX(IDUNIQ+1)=INOZER
 139 :  7     CONTINUE
 140 :        NBTVAL=LIPUN.IDX(NDUNIQ+1)-1
 141 :        SEGADJ,LIPUN
 142 :        SEGDES LIPUN
 143 :        SEGDES KRINCP
 144 :        SEGSUP KRCDUN
 145 :        SEGDES KRIDUN
 146 :        SEGDES KRINCD
 147 : *
 148 : * Normal termination
 149 : *
 150 :       IRET=0
 151 :       RETURN
 152 : *
 153 : * Format handling
 154 : *
 155 : *
 156 : * Error handling
 157 : *
 158 :  9999 CONTINUE
 159 :       IRET=1
 160 :       WRITE(IOIMP,*) 'An error was detected in subroutine corinc'
 161 :       RETURN
 162 : *
 163 : * End of subroutine CORINC
 164 : *
 165 :       END
 166 : 
 167 :  
 168 :  
 169 :  
 170 :  

© Cast3M 2003 - All rights reserved.
Disclaimer