Download fuspr3.eso

Back to the list

   1 : C FUSPR3    SOURCE    MAGN      09/07/30    21:17:04     6458           
   2 :       SUBROUTINE FUSPR3(PMORSS,NTTDDL,
   3 :      $     PMTOT,
   4 :      $     IMPR,IRET)
   5 :       IMPLICIT REAL*8 (A-H,O-Z)
   6 :       IMPLICIT INTEGER (I-N)
   7 : C***********************************************************************
   8 : C NOM         : FUSPR3
   9 : C PROJET      : Assemblage matrice élémentaire -> matrice Morse
  10 : C DESCRIPTION : Assemblage d'un ensemble de profils Morse
  11 : C               Le résultat est dans PMTOT.
  12 : C               Subroutine quasi-identique à FUSPR3. On 
  13 : C               suppose la matrice totale carrée
  14 : C               
  15 : C                   
  16 : C LANGAGE     : ESOPE
  17 : C AUTEUR      : Stéphane GOUNAND (CEA/DRN/DMT/SEMT/LTMF)
  18 : C               mél : gounand@semt2.smts.cea.fr
  19 : C***********************************************************************
  20 : C APPELES          : 
  21 : C APPELE PAR       : PRASEM, MAKPMT
  22 : C***********************************************************************
  23 : C ENTREES            : PMORSS
  24 : C SORTIES            : PMTOT
  25 : C CODE RETOUR (IRET) : = 0 si tout s'est bien passé
  26 : C***********************************************************************
  27 : C VERSION    : v1, 13/12/99, version initiale
  28 : C HISTORIQUE : v1, 13/12/99, création
  29 : C HISTORIQUE :
  30 : C HISTORIQUE :
  31 : C***********************************************************************
  32 : C Prière de PRENDRE LE TEMPS de compléter les commentaires
  33 : C en cas de modification de ce sous-programme afin de faciliter
  34 : C la maintenance !
  35 : C***********************************************************************
  36 : *
  37 : -INC CCOPTIO
  38 : -INC SMMATRIK
  39 :       INTEGER NTT,NJA
  40 :       POINTEUR PMCOU.PMORS
  41 :       POINTEUR PMTOT.PMORS
  42 : *
  43 :       SEGMENT PMORSS
  44 :       POINTEUR LISDD(NBPM).MLENTI
  45 :       POINTEUR LISPM(NBPM).PMORS
  46 :       ENDSEGMENT
  47 : *
  48 : 
  49 : -INC SMLENTI
  50 :       POINTEUR LDDCOU.MLENTI
  51 :       POINTEUR INDEX.MLENTI
  52 :       POINTEUR IWORK.MLENTI
  53 : *
  54 :       INTEGER IMPR,IRET
  55 : *
  56 :       INTEGER NTTDU2,NTTDUA,NTTPRI
  57 :       INTEGER NNZTOT
  58 : *
  59 : * Executable statements
  60 : *
  61 :       IF (IMPR.GT.5) WRITE(IOIMP,*) 'Entrée dans fuspr3'
  62 :       NBPM=PMORSS.LISDD(/1)
  63 :       JG=NBPM
  64 :       SEGINI INDEX
  65 :       DO I=1,NBPM
  66 :          INDEX.LECT(I)=1
  67 :       ENDDO
  68 :       JG=NTTDDL
  69 :       SEGINI IWORK
  70 :       DO IPM=1,NBPM
  71 :          LDDCOU=PMORSS.LISDD(IPM)
  72 :          PMCOU=PMORSS.LISPM(IPM)
  73 :          SEGACT LDDCOU
  74 :          SEGACT PMCOU
  75 :       ENDDO
  76 : *      WRITE(IOIMP,*) 'Partie 1'
  77 : *
  78 : * Passe 1 : Effectuons le dimensionnement de PMTOT
  79 : *
  80 :       NNZTOT=0
  81 :       DO ITTDUA=1,NTTDDL
  82 : *         WRITE(IOIMP,*) 'ITTDUA=',ITTDUA
  83 :          LDG=0
  84 : * Fin de la liste chaînée
  85 :          LAST=-1
  86 :          DO IPM=1,NBPM
  87 :             LDDCOU=PMORSS.LISDD(IPM)
  88 :             PMCOU=PMORSS.LISPM(IPM)
  89 :             IDX=INDEX.LECT(IPM)
  90 :             IF (IDX.GT.0) THEN
  91 :                ITTDCO=LDDCOU.LECT(IDX)
  92 :                IF (ITTDCO.EQ.ITTDUA) THEN
  93 : *                  WRITE(IOIMP,*) ' IPM=',IPM
  94 : *                  segprt,lddcou
  95 : *                  segprt,pmcou
  96 : * Parcourons la ligne de PMCOU
  97 :                   DO JNZCOU=PMCOU.IA(IDX),PMCOU.IA(IDX+1)-1
  98 :                      JACOL=PMCOU.JA(JNZCOU)
  99 :                      IF (IWORK.LECT(JACOL).EQ.0) THEN
 100 :                         LDG=LDG+1
 101 : *                        write(ioimp,*) 'iwork'
 102 :                         IWORK.LECT(JACOL)=LAST
 103 :                         LAST=JACOL
 104 :                      ENDIF
 105 :                   ENDDO
 106 :                   IDX=IDX+1
 107 :                   IF (IDX.LE.LDDCOU.LECT(/1)) THEN
 108 :                      INDEX.LECT(IPM)=IDX
 109 :                   ELSE
 110 :                      INDEX.LECT(IPM)=0
 111 :                   ENDIF
 112 :                ENDIF
 113 :             ENDIF
 114 :          ENDDO
 115 : *         WRITE(IOIMP,*) 'LDG=',LDG
 116 :          NNZTOT=NNZTOT+LDG
 117 : * Remise à zéro du segment de travail 
 118 :          DO ILDG=1,LDG
 119 :             IPREC=IWORK.LECT(LAST)
 120 :             IWORK.LECT(LAST)=0
 121 :             LAST=IPREC
 122 :          ENDDO
 123 :       ENDDO
 124 : *      WRITE(IOIMP,*) 'Partie 2'
 125 : *
 126 : * Passe 2 : Remplissage de PMTOT
 127 : *
 128 : * Rétablissement des index
 129 :       DO I=1,NBPM
 130 :          INDEX.LECT(I)=1
 131 :       ENDDO
 132 :       JG=NTTDDL
 133 :       NTT=NTTDDL
 134 :       NJA=NNZTOT
 135 :       SEGINI PMTOT
 136 :       JNZC=0
 137 :       PMTOT.IA(1)=1
 138 :       DO ITTDUA=1,NTTDDL
 139 :          DO IPM=1,NBPM
 140 :             LDDCOU=PMORSS.LISDD(IPM)
 141 :             PMCOU=PMORSS.LISPM(IPM)
 142 :             IDX=INDEX.LECT(IPM)
 143 :             IF (IDX.GT.0) THEN
 144 :                ITTDCO=LDDCOU.LECT(IDX)
 145 :                IF (ITTDCO.EQ.ITTDUA) THEN
 146 : * Parcourons la ligne de PMCOU
 147 :                   DO JNZA=PMCOU.IA(IDX),PMCOU.IA(IDX+1)-1
 148 :                      JACOL=PMCOU.JA(JNZA)
 149 :                      IF (IWORK.LECT(JACOL).EQ.0) THEN
 150 :                         JNZC=JNZC+1
 151 :                         PMTOT.JA(JNZC)=JACOL
 152 :                         IWORK.LECT(JACOL)=JNZC
 153 :                      ENDIF   
 154 :                   ENDDO
 155 :                   IDX=IDX+1
 156 :                   IF (IDX.LE.LDDCOU.LECT(/1)) THEN
 157 :                      INDEX.LECT(IPM)=IDX
 158 :                   ELSE
 159 :                      INDEX.LECT(IPM)=0
 160 :                   ENDIF
 161 :                ENDIF
 162 :             ENDIF
 163 :          ENDDO
 164 : * Remise à zéro du segment de travail 
 165 :          DO INZC=PMTOT.IA(ITTDUA),JNZC
 166 :             IWORK.LECT(PMTOT.JA(INZC))=0
 167 :          ENDDO
 168 :          PMTOT.IA(ITTDUA+1)=JNZC+1
 169 :       ENDDO
 170 :       SEGSUP INDEX
 171 :       SEGSUP IWORK
 172 :       SEGDES PMTOT
 173 :       DO IPM=1,NBPM
 174 :          LDDCOU=PMORSS.LISDD(IPM)
 175 :          PMCOU=PMORSS.LISPM(IPM)
 176 :          SEGDES LDDCOU
 177 :          SEGDES PMCOU
 178 :       ENDDO
 179 : *
 180 : * Normal termination
 181 : *
 182 :       IRET=0
 183 :       RETURN
 184 : *
 185 : * Format handling
 186 : *
 187 : *
 188 : * Error handling
 189 : *
 190 :  9999 CONTINUE
 191 :       IRET=1
 192 :       WRITE(IOIMP,*) 'An error was detected in subroutine fuspr3'
 193 :       RETURN
 194 : *
 195 : * End of subroutine FUSPR3
 196 : *
 197 :       END
 198 : 
 199 :  
 200 :  
 201 :  
 202 :  

© Cast3M 2003 - All rights reserved.
Disclaimer