Download sorvtk.eso

Back to the list

   1 : C SORVTK    SOURCE    JC220346  13/11/19    21:15:00     7867           
   2 : ************************************************************************
   3 : * NOM         : sorvtk.eso
   4 : * DESCRIPTION : Sortie d'objets de type MAILLAGE, CHPOINT et/ou MCHAML
   5 : *               au format VTK
   6 : * REFERENCE   : VTK File Formats for VTK Version 4.2, extrait de
   7 : *               The VTK User's Guide, Kitware
   8 : *               (www.vtk.org/VTK/img/file-formats.pdf)
   9 : ************************************************************************
  10 : * HISTORIQUE :  18/06/2012 : JCARDO : création de la subroutine
  11 : * HISTORIQUE :  20/06/2012 : JCARDO : bug impression ITYEL en BINA
  12 : * HISTORIQUE :
  13 : * HISTORIQUE :
  14 : ************************************************************************
  15 : * Prière de PRENDRE LE TEMPS DE COMPLÉTER LES COMMENTAIRES
  16 : * en cas de modification de ce sous-programme afin de faciliter
  17 : * la maintenance !
  18 : ************************************************************************
  19 : * APPELÉ PAR : opérateur SORTir (prsort.eso)
  20 : ************************************************************************
  21 : * ENTRÉES :: aucune
  22 : * SORTIES :: aucune (sur fichiers uniquement)
  23 : ************************************************************************
  24 : * SYNTAXE (GIBIANE) :
  25 : *
  26 : *  SORT 'VTK' OBJ1 (MOT1) ... (OBJn) (MOTn)
  27 : *             (|'FORM'|) (|'AUTO'|) ('TEMP' FLOT1) ('DOUBLE_PRECISION')
  28 : *              |'BINA'|   |'NOUV'|
  29 : *              |'ZIP' |   |'SUIT'|
  30 : *                         |'NPVD'|
  31 : *
  32 : *  avec OBJi = [ MAILi | CHPOi | CHMLi | TABi ]
  33 : *
  34 : ************************************************************************
  35 :       SUBROUTINE SORVTK
  36 : 
  37 :       IMPLICIT INTEGER(I-N)
  38 :       IMPLICIT REAL*8(A-H,O-Z)
  39 : 
  40 : -INC CCGEOME
  41 : -INC CCOPTIO
  42 : -INC SMCOORD 
  43 : 
  44 : -INC SMELEME
  45 : -INC SMCHPOI
  46 : -INC SMCHAML
  47 : -INC SMLMOTS
  48 : -INC SMTABLE
  49 : 
  50 : -INC CCNOYAU
  51 : -INC CCASSIS
  52 : -INC CCFXDR
  53 : 
  54 :       EXTERNAL LONG
  55 : 
  56 : 
  57 : *     CARACTERE DOUBLE-QUOTE (")
  58 : *     --------------------------
  59 : *     Bug dans le traducteur ESOPE pour qui ' et " ont le même rôle
  60 : *     => lors de la traduction d'une chaine 'xxxx"yyyy"zzzz', la chaine
  61 : *        yyyy est mise en majuscule
  62 : *     => Paraview n'arrive pas à relire les .vtu car il ne reconnait
  63 : *        pas la valeur de certains attributs ("BigEndian", "Appended",
  64 : *        "UnstructuredGrid"...)
  65 :       CHARACTER*1 DQ
  66 : c       PARAMETER(DQ=ACHAR(34))
  67 : 
  68 : 
  69 : *     OCTETS PRE-DEFINIS A ECRIRE DANS LA SECTION 
  70 : *     ----------------------------------------------------------
  71 : *     IXDR1=représentation décimale BigEndian de la chaîne '   _'
  72 : *     IXDR2=représentation décimale BigEndian du marqueur End-Of-Record
  73 :       INTEGER*4 IXDR1,IXDR2
  74 :       DATA IXDR1/538976351/
  75 :       DATA IXDR2/10/
  76 : 
  77 : 
  78 : *     SEGMENTS DE TRAVAIL TEMPORAIRES
  79 : *     -------------------------------
  80 : *     SMAIL  = données sur les maillages lus (pointeur et nom)
  81 : *     SCHPO  = données sur les champs par points lus (pointeur et nom)
  82 : *     SCHML  = données sur les champs par éléments lus (pointeur et nom)
  83 : *     ICONN,IOFFS,ITYEL = données sur les cellules du maillage courant
  84 : *     IPOL2G|= Tables de correspondance entre la numérotation (globale)
  85 : *     IPOG2L|  des noeuds dans XCOOR et la numérotation (locale) des
  86 : *              noeuds du maillage dans le fichier .vtu
  87 : *     IELL2G = Table de correspondance entre la numérotation (globale)
  88 : *              des cellules du MAILLAGE courant et la numérotation
  89 : *              (locale) des cellules du MCHAML courant
  90 : *     ITYPII = donne le sous-maillage formé d'un type donné d'élément
  91 : *     INECUM = donne le nombre cumulé d'éléments des sous-maillages
  92 : *     TCHCO  = liste des composantes du CHPOINT ou du MCHAML courant
  93 : *     ICOOK  = liste des composantes à sortir (au moins 1 valeur)
  94 : *     SCHPV  = tableau compacté des valeurs du CHPOINT courant
  95 : *     SCHMV  = tableau compacté des valeurs du MCHAML courant
  96 : 
  97 :       SEGMENT SMAIL
  98 :           INTEGER IMAIL(NBMAIL)
  99 :           CHARACTER*4 TMAIL(NBMAIL)
 100 :       ENDSEGMENT
 101 :       SEGMENT SCHPO
 102 :           INTEGER ICHPO(NBCHPO)
 103 :           CHARACTER*8 TCHPO(NBCHPO)
 104 :       ENDSEGMENT
 105 :       SEGMENT SCHML
 106 :           INTEGER ICHML(NBCHML)
 107 :           CHARACTER*8 TCHML(NBCHML)
 108 :       ENDSEGMENT
 109 : 
 110 :       SEGMENT IPOL2G(NNO)
 111 :       SEGMENT IPOG2L(NPMAX)
 112 :       SEGMENT IELL2G(NEL2)
 113 :       SEGMENT ICONN(NBCON)
 114 :       SEGMENT IOFFS(NEL)
 115 :       SEGMENT ITYEL(NEL1)
 116 :       SEGMENT ITYPII(NOMBR)
 117 :       SEGMENT INECUM(NBSOU1)
 118 : 
 119 :       POINTEUR TCHCO.MLMOTS
 120 :       SEGMENT ICOOK(0)
 121 : 
 122 :       SEGMENT SCHPV
 123 :           REAL*8 XPOCHA(NCO,NNO)
 124 :       ENDSEGMENT
 125 :       SEGMENT SCHMV
 126 :           REAL*8 XELCHE(NCO,NEL)
 127 :       ENDSEGMENT
 128 : 
 129 : 
 130 : *     MOTS-CLÉS DE L'OPÉRATEUR
 131 : *     ------------------------
 132 :       PARAMETER(LMCLE=9)
 133 :       CHARACTER*4 MCLE(LMCLE)
 134 :       DATA MCLE/'AUTO','SUIT','NOUV','NPVD',
 135 :      &          'FORM','BINA','ZIP',
 136 :      &          'TEMP',
 137 :      &          'DOUB'/
 138 : 
 139 : 
 140 : *     VARIABLES BOOLÉENNES
 141 : *     --------------------
 142 : *     ZEXIS = vrai si le fichier .pvd existe déjà (et est compatible)
 143 : *     ZTEMP = vrai si le pas de temps a été indiqué (mot-clé 'TEMP')
 144 : *     ZPART = vrai si plusieurs maillages ont été transmis
 145 : *     ZOPT1,ZOPT2 = utilisés pour s'assurer que plusieurs mots-clés
 146 : *                     d'une même option n'ont pas été lus
 147 : *     ZOPEN = vrai si OPTI 'SORT' a bien été appelé au préalable
 148 : *     ZDOUB = vrai si on écrit les données en double précision
 149 :       LOGICAL ZEXIS,ZTEMP,ZPART,ZOPT1,ZOPT2,ZOPEN,ZDOUB
 150 : 
 151 : 
 152 : *     TABLEAUX DE CORRESPONDANCE entre les éléments géométriques de
 153 : *     CAST3M et ceux de VTK (www.vtk.org/VTK/img/file-formats.pdf)
 154 : *     --------------------
 155 :       INTEGER*2 ITYVTK(48)
 156 :       DATA ITYVTK
 157 : *         POI1   SEG2   SEG3   TRI3   TRI4   TRI6   TRI7   QUA4   QUA5
 158 :      .  /    1 ,    3 ,   21 ,    5 ,    0 ,   22 ,    0 ,    9 ,    0 ,
 159 : *         QUA8   QUA9   RAC2   RAC3   CUB8   CU20   PRI6   PR15   LIA3
 160 :      .      23 ,    0 ,    0 ,    0 ,   12 ,   25 ,   13 ,    0 ,    0 ,
 161 : *         LIA4   LIA6   LIA8   MULT   TET4   TE10   PYR5   PY13   ATTA
 162 :      .       0 ,    0 ,    0 ,    0 ,   10 ,   24 ,   14 ,    0 ,    0 ,
 163 : *         SUPE   RAP3   LIP6   LIP8   POLY   CU27   PR21   TE15   PY19
 164 :      .       0 ,    0 ,    0 ,    0 ,    0 ,    0 ,    0 ,    0 ,    0 ,
 165 : *         SEG4   QU16   TR12   PR18   SEG6   TR21   QU36   C216   P126
 166 :      .       0 ,    0 ,    0 ,    0 ,    0 ,    0 ,    0 ,    0 ,    0 ,
 167 : *         TE56   PY91   SURE
 168 :      .       0 ,    0 ,    0 /
 169 : 
 170 : *     Correspondance des numerotations pour les elements quadratiques
 171 :       INTEGER*2 INUVTK(20, 5) 
 172 :       INTEGER*2 NUSEG3(3), NUTRI6(6), NUQUA8(8), NUTE10(10), NUCU20(20)
 173 :       DATA NUSEG3 / 1, 3, 2 /
 174 :       DATA NUTRI6 / 1, 3, 5, 2, 4, 6 /
 175 :       DATA NUQUA8 / 1, 3, 5, 7, 2, 4, 6, 8 /
 176 :       DATA NUTE10 / 1, 3, 5, 10, 2, 4, 6, 7, 8, 9 /
 177 :       DATA NUCU20 / 1, 3, 5, 7, 13, 15, 17, 19, 2, 4, 6, 8, 14, 16, 18,
 178 :      .              20, 9, 10, 11, 12 /
 179 :       EQUIVALENCE (INUVTK(1,1),NUSEG3(1)),
 180 :      .            (INUVTK(1,2),NUTRI6(1)),
 181 :      .            (INUVTK(1,3),NUQUA8(1)),
 182 :      .            (INUVTK(1,4),NUTE10(1)),
 183 :      .            (INUVTK(1,5),NUCU20(1))
 184 : 
 185 :      
 186 :      
 187 : *     AUTRES DÉCLARATIONS
 188 : *     -------------------
 189 : 
 190 : *     Chaînes de caractères génériques
 191 :       CHARACTER*4   CHA4
 192 :       CHARACTER*8   CHA8
 193 :       CHARACTER*9   CHA9
 194 : 
 195 : *     Chaînes de caractères pour la conversion de nombres
 196 :       CHARACTER*15  CNU1,CNU2
 197 : 
 198 : *     Variables pour la manipulation des noms de fichiers
 199 :       CHARACTER*72  NOM1,NOM2,NOM3
 200 : 
 201 : *     Variable pour les formats I/O dynamiques
 202 :       CHARACTER*30  MYFMT
 203 : 
 204 : *     Buffer utilisé lors de la lecture préliminaire du fichier .pvd
 205 :       CHARACTER*200 CBUF
 206 : 
 207 : *     Ligne de commentaire écrite en-tête de tous les fichiers
 208 :       CHARACTER*120 CHEAD
 209 : 
 210 : 
 211 : *     *****************************************************************
 212 : *     CONTRÔLE DE LA TAILLE ET DE LA PRÉCISION DES DONNÉES NUMÉRIQUES
 213 : *     ÉCRITES SUR LES UNITÉS DE SORTIE IOXML ET IOBIN
 214 : *     *****************************************************************
 215 : *
 216 : *     /!\ CHOIX NON MODIFIABLES PAR 'DOUBLE_PRECISION' :
 217 : *
 218 : *       - En BINAire :
 219 : *         => les connectivités et offsets des cellules sont écrits sur
 220 : *            4 octets, ce qui "limite" le nombre de noeuds à 2 milliards
 221 : *         => les types des cellules sont codés sur 1 octet (puis groupés
 222 : *            par 4 pour pouvoir être écrits par XDR)
 223 : *         => Le standard VTK impose que la variable NBYTES ci-dessous
 224 : *            soit écrite sur 4 octets (soit ISIZNB=4)
 225 : *
 226 : *       - En FORMaté :
 227 : *         => les CHPOINT et MCHAML sont écrits sur N colonnes, où N est
 228 : *            le nombre de composantes : il y aura une erreur si N est
 229 : *            un multiple de 100 car N est écrit au format I2.
 230 : *
 231 : *     ------------------------------  
 232 : 
 233 : *     NBYTES=Nombre d'octets écrits jusqu'alors dans la section AppendedData (hors caractère '_' initial)
 234 : *     ISIZNB=Taille (en octets) sur laquelle écrire la variable NBYTES
 235 :       INTEGER NBYTES
 236 :       PARAMETER(ISIZNB=4)
 237 : 
 238 : *     Formats numériques prédéfinis pour l'écriture de réels
 239 :       CHARACTER*8 FMR4,FMR8
 240 :       PARAMETER(FMR4='E14.6E2 ')
 241 :       PARAMETER(FMR8='E24.15E3')
 242 : 
 243 : *     Variables à modifier selon la valeur de ZDOUB
 244 : *      - FMDAT=[FMR4|FMR8]
 245 : *      - FLDAT=['Float32'|'Float64']
 246 : *      - ISIZDA=[4|8]
 247 :       CHARACTER*8 FMDAT
 248 :       CHARACTER*7 FLDAT
 249 :       INTEGER     ISIZDA
 250 : 
 251 : *     Variables génériques de précision donnée
 252 :       INTEGER*4   INT4
 253 :       REAL*4      XRE4,YRE4,ZRE4
 254 :       REAL*8      XRE8,YRE8,ZRE8
 255 : 
 256 : 
 257 : *     (FIN DES DECLARATIONS)
 258 : *     *****************************************************************
 259 : *     *****************************************************************
 260 : 
 261 : 
 262 : *     Caractère DOUBLE-QUOTE (certains compilateurs ne supportent pas
 263 : *     qu'il soit défini en PARAMETER...)
 264 : *     => obligatoire du fait d'un preprocesseur ESOPE trop gourmand qui
 265 : *        convertit en majuscules tout ce qui est entre guillemets (")
 266 :       DQ=ACHAR(34)
 267 : 
 268 : *     Numéro de la sortie logique vers le fichier .vtu
 269 : *     (le numéro de l'éventuel .bin sera renvoyé par INITXDR)
 270 :       IOXML=IOPER
 271 : 
 272 : *     Nombre max. de noeuds (pour dimensionner les tableaux)
 273 :       IDIM1=IDIM+1
 274 :       NPMAX=XCOOR(/1)/IDIM1
 275 : 
 276 : *     Nom de base des fichiers à sortir
 277 :       INQUIRE(UNIT=IOPER,OPENED=ZOPEN)
 278 :       IF (.NOT.ZOPEN) THEN
 278 :           CALL ERREUR(-212)
 279 :           WRITE(IOIMP,*) '(via OPTI "SORT")'
 280 :           MOTERR(1:8)='VTK     '
 280 :           CALL ERREUR(705)
 281 :           RETURN
 282 :       ENDIF
 283 :       INQUIRE(UNIT=IOPER,NAME=NOMFIC)
 284 :       CLOSE(UNIT=IOPER,STATUS='DELETE')
 285 : *     ---------------------------------------
 286 : * /!\ On ferme immediatement le fichier ouvert par OPTI 'SORT'...
 287 : *     CE N'ETAIT PAS L'APPROCHE GÉNÉRALEMENT ADOPTÉE quand on utilisait
 288 : *     l'opérateur SORTir, mais ici il devient beaucoup plus commode de
 289 : *     procéder ainsi, pour plusieurs raisons :
 290 : *     - éventuellement plusieurs fichiers .vtu seront écrits
 291 : *     - le fichier .pvd peut être ou ne pas être écrit
 292 : *     - les fichiers .vtu peuvent être en mode ASCII ou BINAIRE
 293 : *     - il faut rajouter l'extension !
 294 : *     ---------------------------------------
 295 : 
 296 : *     On récupère le nom du répertoire dans NOM1, s'il existe
 297 :       IREP=INDEX(NOMFIC,'/',BACK=.TRUE.)
 298 :       NOM1='./'
 299 :       IF (IREP.GT.0) THEN
 300 :           NOM1=NOMFIC(1:IREP)
 301 :           NOMFIC=NOMFIC(IREP+1:LONG(NOMFIC))
 302 :       ENDIF
 303 : 
 304 : 
 305 : 
 306 : 
 307 : ************************************************************************
 308 : ************************************************************************
 309 : ************************************************************************
 310 : ************************************************************************
 311 : 
 312 : 
 313 : 
 314 : 
 315 : *     +---------------------------------------------------------------+
 316 : *     |                                                               |
 317 : *     |           L E C T U R E   D E S   A R G U M E N T S           |
 318 : *     |                                                               |
 319 : *     +---------------------------------------------------------------+
 320 : 
 321 : 
 322 : *     NBMAIL :: nombre d'objets 'MAILLAGE' lus
 323 : *     NBCHPO :: nombre d'objets 'CHPOINT' lus
 324 : *     NBCHML :: nombre d'objets 'MCHAML' lus
 325 :       NBMAIL=0
 326 :       NBCHPO=0
 327 :       NBCHML=0
 328 :       SEGINI,SMAIL,SCHPO,SCHML
 329 : 
 330 : *     IPVD=0 :: option 'AUTO' => complétion du .pvd si possible, création d'un nouveau sinon
 331 : *     IPVD=1 :: option 'SUIT' => force la complétion du .pvd (erreur s'il n'existe pas ou s'il est incompatible)
 332 : *     IPVD=2 :: option 'NOUV' => force l'écriture d'un nouveau .pvd
 333 : *     IPVD=3 :: option 'NPVD' => pas de fichier .pvd
 334 :       IPVD=0
 335 : 
 336 : *     IVTU=0 :: option 'FORMATE' => écriture du .vtu en formaté (ascii)
 337 : *     IVTU=1 :: option 'BINAIRE' => écriture du .vtu en binaire (section AppendedData)
 338 : *     IVTU=2 :: option 'ZIP'     => idem que 'BINA', avec compression zlib en plus
 339 :       IVTU=1
 340 : 
 341 : *     ZTEMP :: option 'TEMP'
 342 :       XTPS=0.D0
 343 :       ZTEMP=.FALSE.
 344 : 
 345 : *     ZDOUB :: option 'DOUBLE_PRECISION'
 346 :       ZDOUB=.FALSE.
 347 :       FMDAT=FMR4
 348 :       FLDAT='Float32'
 349 :       ISIZDA=4
 350 : 
 351 : *     ZOPT1 evite les ambiguites sur la valeur de IPVD
 352 : *     ZOPT2 evite les ambiguites sur la valeur de IVTU
 353 :       ZOPT1=.FALSE.
 354 :       ZOPT2=.FALSE.
 355 : 
 356 : 
 357 : 
 358 : *     (branchement vers les etiquettes de lecture d'objets =LIROBJ)
 359 :   10  CONTINUE
 360 : 
 360 :       CALL QUETYP(CHA8,0,IRETOU)
 361 :       IF (IRETOU.EQ.0) GOTO 99
 362 : 
 363 :       ILAB=0
 364 :       IF (CHA8.EQ.'MAILLAGE') ILAB=1
 365 :       IF (CHA8.EQ.'CHPOINT' ) ILAB=2
 366 :       IF (CHA8.EQ.'MCHAML'  ) ILAB=3
 367 :       IF (CHA8.EQ.'TABLE'   ) ILAB=4
 368 :       IF (ILAB.GT.0) GOTO(20,30,40,50),ILAB
 369 : 
 370 :       IF (CHA8.EQ.'MOT') THEN
 370 :           CALL LIRCHA(CHA4,1,LCHA)
 370 :           CALL CHRMOT(MCLE,LMCLE,CHA4,ICLE)
 371 :           IF (ICLE.GT.0) GOTO 11
 372 : 
 373 : *         ERREUR CRITIQUE 7 (On ne comprend pas le mot %m1:4)
 374 :           MOTERR(1:4)=CHA4
 374 :           CALL ERREUR(7)
 375 :           RETURN
 376 :       ENDIF
 377 : 
 378 : *     ERREUR CRITIQUE 39 (On ne veut pas d'objet de type %m1:8)
 379 :       MOTERR(1:8)=CHA8
 379 :       CALL ERREUR(39)
 380 :       RETURN
 381 : 
 382 : 
 383 : 
 384 : *     (branchement vers les étiquettes de traitement des mots-clés)
 385 :   11  GOTO( 70,  70,  70,  70,  71,  71,  71, 72,  73   ),ICLE
 386 : *           AUTO SUIT NOUV NPVD FORM BINA ZIP TEMP DOUB
 387 : 
 388 : 
 389 : 
 390 : *     =============================================
 391 : *     LECTURE ET MÉMORISATION D'UN OBJET 'MAILLAGE'
 392 : *     =============================================
 393 : 
 394 :   20  CONTINUE
 395 : 
 396 : *     Lecture d'un nouveau MELEME
 396 :       CALL LIROBJ('MAILLAGE',IPT1,1,IRETOU)
 397 :       IF (IERR.NE.0) GOTO 999
 398 : 
 399 : *     Vérification que le MELEME n'est pas déjà dans la liste
 400 :       DO I1=1,NBMAIL
 401 :           IF (IMAIL(I1).EQ.IPT1) GOTO 60
 402 :       ENDDO
 403 :       NBMAIL=NBMAIL+1
 404 : 
 405 : *     Attribution d'un nom par défaut à l'objet lu
 406 :       WRITE(CHA4,FMT='(I4.4)') NBMAIL
 407 : 
 408 : *     Mémorisation des informations
 409 :       SEGADJ,SMAIL
 410 :       IMAIL(NBMAIL)=IPT1
 411 :       TMAIL(NBMAIL)=CHA4
 412 : 
 413 :       GOTO 60
 414 : 
 415 : 
 416 : *     ============================================
 417 : *     LECTURE ET MÉMORISATION D'UN OBJET 'CHPOINT'
 418 : *     ============================================
 419 : 
 420 :   30  CONTINUE
 421 : 
 422 : *     Lecture d'un nouveau CHPOINT
 422 :       CALL LIROBJ('CHPOINT',MCHPO1,1,IRETOU)
 423 :       IF (IERR.NE.0) GOTO 999
 424 : 
 425 : *     Vérification que le CHPOINT n'est pas déjà dans la liste
 426 :       DO I1=1,NBCHPO
 427 :           IF (ICHPO(I1).EQ.MCHPO1) GOTO 60
 428 :       ENDDO
 429 :       NBCHPO=NBCHPO+1
 430 : 
 431 : *     Attribution d'un nom par défaut à l'objet lu
 431 :       CALL QUENOM(CHA8)
 432 :       IF (CHA8.EQ.'        ') WRITE(CHA8,FMT='("CHPO",I4.4)') NBCHPO
 433 : 
 434 : *     Mémorisation des informations
 435 :       SEGADJ,SCHPO
 436 :       ICHPO(NBCHPO)=MCHPO1
 437 :       TCHPO(NBCHPO)=CHA8
 438 : 
 439 :       GOTO 60
 440 : 
 441 : 
 442 : *     ===========================================
 443 : *     LECTURE ET MÉMORISATION D'UN OBJET 'MCHAML'
 444 : *     ===========================================
 445 : 
 446 :   40  CONTINUE
 447 : 
 448 : *     Lecture d'un nouveau MCHAML
 448 :       CALL LIROBJ('MCHAML',MCHEL1,1,IRETOU)
 449 :       IF (IERR.NE.0) GOTO 999
 450 : 
 451 : *     Vérification que le MCHAML n'est pas déjà dans la liste
 452 :       DO I1=1,NBCHML
 453 :           IF (ICHML(I1).EQ.MCHEL1) GOTO 60
 454 :       ENDDO
 455 :       NBCHML=NBCHML+1
 456 : 
 457 : *     Attribution d'un nom par défaut à l'objet lu
 457 :       CALL QUENOM(CHA8)
 458 :       IF (CHA8.EQ.'        ') WRITE(CHA8,FMT='("CHML",I4.4)') NBCHML
 459 : 
 460 : *     Mémorisation des informations
 461 :       SEGADJ,SCHML
 462 :       ICHML(NBCHML)=MCHEL1
 463 :       TCHML(NBCHML)=CHA8
 464 : 
 465 :       GOTO 60
 466 : 
 467 : 
 468 : *     ===========================================
 469 : *     LECTURE ET DECOMPOSITION D'UN OBJET 'TABLE'
 470 : *     ===========================================
 471 : 
 472 :   50  CONTINUE
 473 : 
 474 : *     Lecture d'une TABLE
 474 :       CALL LIROBJ('TABLE',MTABLE,1,IRETOU)
 475 :       IF (IERR.NE.0) GOTO 999
 476 : 
 477 : *     Décomposition de la TABLE en objets MAILLAGE, CHPOINT et MCHAML
 478 :       SEGACT,MTABLE
 479 :       DO K=MLOTAB,1,-1
 480 : 
 481 : *         Conversion de l'indice en chaine de caracteres
 482 :           CHA4=MTABTI(K)(1:4)
 483 :           IF (CHA4.EQ.'ENTI') WRITE(CHA8,FMT='(I8.8)') MTABII(K)
 484 :           IF (CHA4.EQ.'FLOT') WRITE(CHA8,FMT='(F8.4)') RMTABI(K)
 485 :           IF (CHA4.EQ.'MOT') THEN
 486 :               CHA8='        '
 487 :               IF (NBESC.NE.0) SEGACT IPILOC
 488 :               IMO1=IPCHAR(MTABII(K))
 489 :               IMO2=IPCHAR(MTABII(K)+1)
 490 :               ILON=MIN(8,IMO2-IMO1)
 491 :               CHA8(1:ILON)=ICHARA(IMO1:IMO1+ILON-1)
 492 :               IF (NBESC.NE.0) SEGDES IPILOC
 493 :           ENDIF
 494 : 
 495 : *         Vérification que le type d'objet est valide
 496 :           ITYPOK=0
 497 :           IF (MTABTV(K).EQ.'MAILLAGE') THEN
 498 :               ITYPOK=4
 499 :               IF (CHA4.EQ.'ENTI') CHA8(1:4)=CHA8(5:8)
 500 :               IF (CHA4.EQ.'FLOT') CHA8(1:4)=CHA8(2:5)
 501 :           ELSEIF (MTABTV(K).EQ.'CHPOINT'.OR.MTABTV(K).EQ.'MCHAML') THEN
 502 :               ITYPOK=8
 503 :           ENDIF
 504 : 
 505 : *         Ecriture du nom puis du pointeur vers l'objet
 506 :           IF (ITYPOK.GT.0) THEN
 506 :               CALL ECRCHA(CHA8(1:ITYPOK))
 506 :               CALL ECROBJ(MTABTV(K),MTABIV(K))
 507 :           ELSE
 508 : *             ERREUR CRITIQUE 763 (Dans la table %m1:8, l'objet d'indice %m9:16 n'est pas de type %m17:40)
 508 :               CALL QUENOM(CHA8)
 509 :               MOTERR(1:8)=CHA8
 510 :               WRITE(MOTERR(9:16),FMT='("n°",I6)') K
 511 :               MOTERR(17:40)=' MAILLAGE/CHPOINT/MCHAML'
 511 :               CALL ERREUR(763)
 512 :               RETURN
 513 :           ENDIF
 514 :       ENDDO
 515 :       SEGDES,MTABLE
 516 : 
 517 :       GOTO 10
 518 : 
 519 : 
 520 : *     ========================================
 521 : *     ATTRIBUTION D'UN NOM AU DERNIER OBJET LU
 522 : *     ========================================
 523 : 
 524 :   60  CONTINUE
 525 : 
 525 :       CALL QUETYP(CHA8,0,IRETOU)
 526 :       IF (IRETOU.NE.0.AND.CHA8.EQ.'MOT') THEN
 526 :           CALL LIRCHA(CHA8,0,LCHA)
 526 :           CALL CHRMOT(MCLE,LMCLE,CHA8(1:4),ICLE)
 527 :           IF (ICLE.GT.0) GOTO 11
 528 : *         Remarque : On utilise le fait que I1 est incrémenté au passage sur ENDDO
 529 : *                    Ainsi, I1 reste figé si on sort prématurement, et vaut bien N+1
 530 : *                    si les N itérations se sont déroulées sans encombre
 531 :           IF (ILAB.EQ.1) THEN
 532 :               TMAIL(I1)='____'
 533 :               TMAIL(I1)(1:LCHA)=CHA8(1:LCHA)
 534 :           ENDIF
 535 :           IF (ILAB.EQ.2) TCHPO(I1)=CHA8
 536 :           IF (ILAB.EQ.3) TCHML(I1)=CHA8
 537 :       ENDIF
 538 : 
 539 :       GOTO 10
 540 : 
 541 : 
 542 : *     ====================
 543 : *     LECTURE D'UN MOT-CLÉ
 544 : *     ====================
 545 : 
 546 : *     Mots-clés 'AUTO, 'NOUV', 'SUIT' ou 'NPVD'
 547 :   70  CONTINUE
 548 :       ICLE1=ICLE-1
 549 :       IF (ZOPT1.AND.IPVD.NE.ICLE1) THEN
 550 : *         ERREUR CRITIQUE 880 (Syntaxe incorrecte, voir notice)
 550 :           CALL ERREUR(880)
 551 :           WRITE(IOIMP,*) '(options ',MCLE(IPVD),' et ',MCLE(ICLE),
 552 :      .                   ' incompatibles)'
 553 :           RETURN
 554 :       ENDIF
 555 :       ZOPT1=.TRUE.
 556 :       IPVD=ICLE1
 557 :       GOTO 10
 558 : 
 559 : *     Mots-clés 'FORM, 'BINA' ou 'ZIP'
 560 :   71  CONTINUE
 561 :       ICLE1=ICLE-5
 562 :       IF (ZOPT2.AND.IVTU.NE.ICLE1) THEN
 563 : *         ERREUR CRITIQUE 880 (Syntaxe incorrecte, voir notice)
 563 :           CALL ERREUR(880)
 564 :           WRITE(IOIMP,*) '(options ',MCLE(IVTU+4),' et ',MCLE(ICLE),
 565 :      .                   ' incompatibles)'
 566 :           RETURN
 567 :       ENDIF
 568 :       ZOPT2=.TRUE.
 569 :       IVTU=ICLE1
 570 : 
 571 :       IF (IVTU.EQ.2) THEN
 572 : *         ERREUR CRITIQUE 251 (Tentative d'utilisation d'une option non implémentée)
 572 :           CALL ERREUR(251)
 573 :           WRITE(IOIMP,*) '(option ZIP indisponible pour le moment)'
 574 :           RETURN
 575 :       ENDIF
 576 :       GOTO 10
 577 : 
 578 : *     Mot-clé 'TEMP'
 579 :   72  CONTINUE
 580 :       ZTEMP=.TRUE.
 580 :       CALL LIRREE(XTPS,0,IRETOU)
 581 :       IF (IRETOU.EQ.0) THEN
 582 : *         ERREUR CRITIQUE 166 (Le mot-clé %m1:4 n'est pas suivi de la donnée correspondante)
 583 :           MOTERR(1:4)='TEMP'
 583 :           CALL ERREUR(166)
 584 :           RETURN
 585 :       ENDIF
 586 :       GOTO 10
 587 : 
 588 : *     Mot-clé 'DOUB'
 589 :   73  CONTINUE
 590 :       ZDOUB=.TRUE.
 591 :       FMDAT=FMR8
 592 :       FLDAT='Float64'
 593 :       ISIZDA=8
 594 :       GOTO 10
 595 : 
 596 : 
 597 : 
 598 : 
 599 :   99  CONTINUE
 600 : 
 601 : 
 602 : *     Vérification : il faut au moins 1 objet MAILLAGE pour continuer
 603 :       IF (NBMAIL.EQ.0) THEN
 604 : *         ERREUR CRITIQUE 37 (On ne trouve pas d'objet de type %m1:8)
 605 :           MOTERR(1:8)='MAILLAGE'
 605 :           CALL ERREUR(37)
 606 :           RETURN
 607 :       ENDIF
 608 : 
 609 : *     Il y a-t-il plusieurs objets MAILLAGE ?
 610 :       ZPART=(NBMAIL.GT.1)
 611 : 
 612 : 
 613 : 
 614 : *     IMPRESSIONS POUR DEBOGAGE
 615 : *     #########################
 616 :       IF (IIMPI.NE.0) THEN
 617 :         WRITE(IOIMP,FMT='(I2,A)') NBMAIL,' MAILLAGE(s) lu(s)'
 618 :         WRITE(IOIMP,FMT='(5X,I7,2X,A4)') (IMAIL(I),TMAIL(I),I=1,NBMAIL)
 619 : 
 620 :         WRITE(IOIMP,FMT='(I2,A)') NBCHPO,' CHPOINT(s) lu(s)'
 621 :         WRITE(IOIMP,FMT='(5X,I7,2X,A8)') (ICHPO(I),TCHPO(I),I=1,NBCHPO)
 622 : 
 623 :         WRITE(IOIMP,FMT='(I2,A)') NBCHML,' MCHAML(s) lu(s)'
 624 :         WRITE(IOIMP,FMT='(5X,I7,2X,A8)') (ICHML(I),TCHML(I),I=1,NBCHML)
 625 :       ENDIF
 626 : *     #########################
 627 : 
 628 : 
 629 : 
 630 : 
 631 : ************************************************************************
 632 : ************************************************************************
 633 : ************************************************************************
 634 : ************************************************************************
 635 : 
 636 : 
 637 : 
 638 : 
 639 : *     +---------------------------------------------------------------+
 640 : *     |                                                               |
 641 : *     |      V É R I F I C A T I O N S   D A N S   L E   . P V D      |
 642 : *     |                                                               |
 643 : *     +---------------------------------------------------------------+
 644 : 
 645 : 
 646 :       NOM3=NOM1(1:LONG(NOM1))//NOMFIC(1:LONG(NOMFIC))//'.pvd'
 647 : 
 648 :       INQUIRE(FILE=NOM3,EXIST=ZEXIS)
 649 : 
 650 : 
 651 : *     Option 'AUTO' ou 'SUIT' : on vérifie que le .pvd pré-existant
 652 : *     est compatible avec les données que l'on veut rajouter
 653 : *     (cette vérification n'a pas vocation à être infaillible, elle
 654 : *     permet seulement d'éviter aux étourdis de corrompre le .pvd)
 655 : *
 656 : *     Après lecture du .pvd : ITF=dernier indice enregistré
 657 : *                             XTF=dernier instant enregistré
 658 :       ITF=0
 659 :       IF (IPVD.LT.2.AND.ZEXIS) THEN
 660 :           OPEN(UNIT    = IOXML       ,
 661 :      .         FILE    = NOM3        ,
 662 :      .         STATUS  = 'OLD'       ,
 663 :      .         FORM    = 'FORMATTED' ,
 664 :      .         ACCESS  = 'SEQUENTIAL',
 665 :      .         IOSTAT  = IOS         )
 665 :           CALL FINFIC(IOXML)
 666 : 
 667 : *      a) Si 'TEMP' est spécifié, on vérifie que le .pvd contient un
 668 : *         champ 'timestep' et que la chronologie est respectée. Si en
 669 : *         outre plusieurs maillages sont fournis, on vérifie que la
 670 : *         partition est identique (vérif. du nom et du nombre seult.)
 671 : 
 672 :           IF (ZTEMP) THEN
 673 : 
 674 : *             On va devoir vérifier les NBMAIL derniers items (+2 balises de fermeture du .pvd)
 675 :               DO I1=1,NBMAIL+2
 676 :                   BACKSPACE(IOXML)
 677 :               ENDDO
 678 : 
 679 :               DO IMAI=1,NBMAIL
 680 : 
 681 : *                 Lecture de l'item puis recherche des champs 'timestep', 'part' et 'file'
 682 :                   READ(UNIT=IOXML,FMT='(A)') CBUF
 683 :                   II1=INDEX(CBUF,'timestep=')
 684 :                   II2=INDEX(CBUF,'part=')
 685 :                   II3=INDEX(CBUF,'file='//DQ//NOMFIC(1:LONG(NOMFIC)))
 686 : 
 687 : 
 688 : *                 DÉCLENCHEMENT D'UNE ERREUR SI :
 689 : 
 690 : *                 - le champ 'file' ne contient pas le nom du fichier lu => 9004
 691 :                   IF (II3.EQ.0) GOTO 9004
 692 : 
 693 : *                 - les NBMAIL derniers items n'ont pas le même 'timestep'           => 9001
 694 : *                 - pas de champ 'timestep' trouvé                                   => 9002
 695 : *                 - le 'timestep' lu est supérieur à la valeur spécifiée dans 'TEMP' => 9003
 696 : *                 - le format du fichier n'est pas reconnu                           => 9004
 697 :                   IF (II1.GT.0) THEN
 698 :                       WRITE(MYFMT,FMT='("(",A8,")")') FMDAT
 699 :                       READ(CBUF(II1+10:II1+23),FMT=MYFMT,IOSTAT=IOS) XTF
 700 :                       IF (IOS.NE.0) GOTO 9004
 701 :                       IF (IMAI.GT.1.AND.XTF1.NE.XTF) GOTO 9001
 702 :                       IF (XTF.GE.XTPS) GOTO 9003
 703 :                       XTF1=XTF
 704 :                   ELSE
 705 :                       GOTO 9002
 706 :                   ENDIF
 707 : 
 708 : *                 - un seul maillage spécifié alors qu'on a trouvé un champ 'part'           => 9001
 709 : *                 - plusieurs maillages spécifiés alors qu'on ne trouve aucun champ 'part'   => 9001
 710 : *                 - le i-ème champ 'part' n'a pas le même nom que le i-ème maillage spécifié => 9001
 711 : *                 - le format du fichier n'est pas reconnu                                   => 9004
 712 :                   IF (ZPART.AND.(II2.GT.0)) THEN
 713 :                       READ(CBUF(II2+6:II2+9),FMT='(A4)',IOSTAT=IOS) CHA4
 714 :                       IF (IOS.NE.0) GOTO 9004
 715 :                       IF (CHA4.NE.TMAIL(IMAI)) GOTO 9001
 716 :                   ELSEIF (ZPART.OR.(II2.GT.0)) THEN
 717 :                       GOTO 9001
 718 :                   ENDIF
 719 : 
 720 :               ENDDO
 721 : 
 722 : *             PAS D'ERREUR : on récupère l'indice du dernier p.d.t.
 722 :               CALL LENCHA(NOMFIC,NC)
 723 :               READ(CBUF(II3+NC+7:II3+NC+15),FMT='(A9)',IOSTAT=IOS) CHA9
 724 :               II4=INDEX(CHA9,'.')-1
 725 :               WRITE(MYFMT,FMT='("(I",I1,".",I1,")")',IOSTAT=IOS) II4,II4
 726 :               READ(CHA9(1:II4),FMT=MYFMT,IOSTAT=IO3) ITF
 727 :               IF (IOS.NE.0.OR.II4.EQ.-1) GOTO 9004
 728 : 
 729 : 
 730 : *      b) Si 'TEMP' est absent, on vérifie que le .pvd ne contient pas
 731 : *         de champ 'timestep' mais uniquement un champ 'part'
 732 :           ELSE
 733 :               BACKSPACE(IOXML)
 734 :               BACKSPACE(IOXML)
 735 :               BACKSPACE(IOXML)
 736 : 
 737 : *             Lecture du dernier item puis recherche des champs 'timestep' et 'part'
 738 :               READ(UNIT=IOXML,FMT='(A)') CBUF
 739 :               II1=INDEX(CBUF,'timestep=')
 740 :               II2=INDEX(CBUF,'part=')
 741 : 
 742 : *             DÉCLENCHEMENT D'UNE ERREUR SI :
 743 : *             - un champ 'timestep' est trouvé                => 9005
 744 : *             - aucun champ 'part' ni 'timestep' n'est trouvé => 9004
 745 :               IF (II1.GT.0) GOTO 9005
 746 :               IF (II2.EQ.0) GOTO 9004
 747 :               
 748 :           ENDIF
 749 : 
 750 :           CLOSE(UNIT=IOXML)
 751 :       ENDIF
 752 : 
 753 : 
 754 : *     Pas d'erreur => on passe à la suite
 755 :       GOTO 9000
 756 : 
 757 : 
 758 : *     MESSAGES D'ERREUR : fichier .pvd incompatible et option 'SUIT'
 759 : *     ***************************************************************
 760 : *     ERREUR CRITIQUE 26 (Tache impossible. Probablement données erronées)
 761 : 
 762 :  9001 IF (IPVD.EQ.0) GOTO 9050
 762 :       CALL ERREUR(26)
 763 :       WRITE(IOIMP,*) 'VTK ''SUIT'' : le fichier existe déjà et la ',
 764 :      .               'partition spécifiée diffère du p.d.t. précédent'
 765 :       GOTO 999
 766 : 
 767 :  9002 IF (IPVD.EQ.0) GOTO 9050
 767 :       CALL ERREUR(26)
 768 :       WRITE(IOIMP,*) 'VTK ''SUIT'' : le fichier existe déjà et ',
 769 :      .               'n''est pas compatible avec l''option ''TEMP'''
 770 :       GOTO 999
 771 : 
 772 :  9003 IF (IPVD.EQ.0) GOTO 9050
 772 :       CALL ERREUR(26)
 773 :       WRITE(IOIMP,*) 'VTK ''SUIT'' : le fichier existe déjà et la ',
 774 :      .               'valeur spécifiée pour ''TEMP'' est trop petite'
 775 :       GOTO 999
 776 : 
 777 :  9004 IF (IPVD.EQ.0) GOTO 9050
 777 :       CALL ERREUR(26)
 778 :       WRITE(IOIMP,*) 'VTK ''SUIT'' : le fichier existe déjà mais ',
 779 :      .               'il semble corrompu...'
 780 :       GOTO 999
 781 : 
 782 :  9005 IF (IPVD.EQ.0) GOTO 9050
 782 :       CALL ERREUR(26)
 783 :       WRITE(IOIMP,*) 'VTK ''SUIT'' : le fichier existe déjà et ',
 784 :      .               'requiert l''utilisation du mot-clé ''TEMP'''
 785 :       GOTO 999
 786 : *     ***************************************************************
 787 : 
 788 : 
 789 : *     Fichier .pvd incompatible et option 'AUTO'
 790 : *     => on continue mais le .pvd existant sera écrasé
 791 :  9050 ZEXIS=.FALSE.
 792 : 
 793 : 
 794 : 
 795 : 
 796 : 
 797 : ************************************************************************
 798 : ************************************************************************
 799 : ************************************************************************
 800 : ************************************************************************
 801 : 
 802 : 
 803 : 
 804 :       
 805 : *     +---------------------------------------------------------------+
 806 : *     |                                                               |
 807 : *     |      É C R I T U R E   D E S   F I C H I E R S   . V T U      |
 808 : *     |                                                               |
 809 : *     +---------------------------------------------------------------+
 810 : 
 811 :  9000 CONTINUE
 812 : 
 813 : *     Lorsqu'il y a déjà deux unités logiques XDR ouvertes (REST et
 814 : *     SAUV en l'occurence), l'ouverture d'une troisième unité engendre
 815 : *     un bug critique (redémarrage du jeu de données !). On s'assure
 816 : *     que le fichier de RESTitution est bien fermé pour éviter cela.
 817 :       IF (IVTU.GT.0.AND.IXDRR.NE.0) THEN
 817 :           CALL IXDRCLOSE(IXDRR,.TRUE.)
 818 :           IXDRR=0
 819 :       ENDIF
 820 : 
 821 : 
 822 : *     Préparation de l'entête des fichiers
 822 :       CALL GIBDAT(IJOUR,IMOIS,IANNEE)
 823 :       IANNEE=MOD(IANNEE,100)+2000
 823 :       CALL GIBNAM(CHA8)
 823 :       CALL NETCHA(CHA8)
 824 :       WRITE(CHEAD,FMT='(A,I2.2,A1,I2.2,A1,I4,A)')
 825 :      .    ''
 828 :       CALL LENCHA(CHEAD,LHEAD)
 829 : 
 830 : 
 831 : *     ---------------------
 832 : *     NOM DES FICHIERS .vtu
 833 : *     ---------------------
 834 : *
 835 : *            repetoire/  nom_de_base.XXXXxxxx.YYYY.vtu
 836 : *           |__________||___________|
 837 : *               NOM1        NOMFIC           |
 838 : *                       |____________________|        |
 839 : *                                NOM2                 |
 840 : *                       |_____________________________|
 841 : *                                    NOM3
 842 : *
 843 : *     - XXXXxxxx : /!\ SEULEMENT SI L'OPTION 'TEMP' EST PRÉSENTE
 844 : *                  => entier écrit sur 4 à 8 caractères et incrémenté
 845 : *                     à chaque pas de temps sorti
 846 : *                  
 847 : *     - YYYY     : /!\ SEULMENT SI PLUSIEURS MAILLAGES SONT FOURNIS
 848 : *                      OU SI ON SORT UN .PVD SANS OPTION 'TEMP'
 849 : *                  => chaine de 4 caractères alpha-numériques indiquant
 850 : *                     le nom de la partition géométrie sortie
 851 : *
 852 :       NOM2=NOMFIC
 853 :       IF (ZTEMP) THEN
 854 :           IPDT=ITF+1
 855 :           WRITE(CHA8,FMT='(I8.8)') IPDT
 856 :           LPDT=MAX(4,INT(LOG10(DBLE(IPDT)))+1)
 857 :           NOM2=NOM2(1:LONG(NOM2))//'.'//CHA8(9-LPDT:8)
 858 :       ENDIF
 859 : 
 860 : 
 861 : *     (BOUCLE SUR LES MAILLAGES)
 862 :       DO 100 IMAI=1,NBMAIL
 863 : 
 864 : *         =============================================================
 865 : *          I N I T I A L I S A T I O N   D U   F I C H I E R   . V T U
 866 : *         =============================================================
 867 : 
 868 : *         Détermination du nom complet du fichier .vtu
 869 :           NOM3=NOM1(1:LONG(NOM1))//NOM2
 870 :           IF ((.NOT.ZTEMP.AND.IPVD.LT.3).OR.ZPART) THEN
 871 :               NOM3=NOM3(1:LONG(NOM3))//'.'//TMAIL(IMAI)
 872 :           ENDIF
 873 :           NOM3=NOM3(1:LONG(NOM3))//'.vtu'
 874 : 
 875 : 
 876 : *         Commande d'ouverture du fichier XML
 877 :           OPEN(UNIT   = IOXML,
 878 :      .         FILE   = NOM3,
 879 :      .         STATUS = 'UNKNOWN',
 880 :      .         FORM   = 'FORMATTED',
 881 :      .         ACCESS = 'SEQUENTIAL',
 882 :      .       IOSTAT   = IOS)
 883 : 
 884 : 
 885 : *         Commande d'ouverture du fichier binaire
 886 :           IF (IVTU.GT.0) THEN
 887 :               IOBIN=INITXDR(NOM3(1:LONG(NOM3))//'.bin','w',.FALSE.)
 888 : 
 889 : *             Début de la section binaire AppendedData
 889 :               CALL IXDRINT(IOBIN,IXDR1)
 890 :               IPOS=0
 891 :           ENDIF
 892 : 
 893 : 
 894 : *         Ecriture des entêtes
 895 :           WRITE(UNIT=IOXML,FMT='(A)',IOSTAT=IOS)
 896 :      .    ''
 897 : 
 898 :           WRITE(UNIT=IOXML,FMT='(A)',IOSTAT=IOS)
 899 :      .    CHEAD(1:LHEAD)
 900 : 
 901 :           IF (IVTU.EQ.0) THEN
 902 :               WRITE(UNIT=IOXML,FMT='(A)',IOSTAT=IOS)
 903 :      .        ''
 905 :           ELSE
 906 :               WRITE(UNIT=IOXML,FMT='(A)',IOSTAT=IOS)
 907 :      .        ''
 909 :           ENDIF
 910 : 
 911 :           WRITE(UNIT=IOXML,FMT='(4X,A)',IOSTAT=IOS)
 912 :      .    ''
 913 : 
 914 : 
 915 : 
 916 : 
 917 : *         =============================================================
 918 : *                    D O N N É E S   G É O M É T R I Q U E S
 919 : *         =============================================================
 920 : *         NEL   = nombre d'éléments du maillage au total
 921 : *         NNO   = nombre de noeuds du maillage au total
 922 : *         NBSOU = nombre de sous-maillages (un par type d'élément)
 923 : 
 924 :           IPT1=IMAIL(IMAI)
 925 :           SEGACT,IPT1
 926 :           NBSOU=IPT1.LISOUS(/1)
 927 :           NBSOU1=MAX(1,NBSOU)
 928 : 
 929 : *         Pour chaque MAILLAGE passé en argument, on doit :
 930 : *          - remplir les tables de correspondance LOCAL <--> GLOBAL
 931 : *          - déterminer le nombre de noeuds au total
 932 : *          - déterminer le nombre d'éléments au total
 933 : *          - mémoriser les caractéristiques des cellules (connectivité,
 934 : *            offset, type d'élément VTK)
 935 : *          - si des MCHAML sont à sortir, mémoriser le type et le nombre
 936 : *            d'éléments dans chaque sous-maillage
 937 : 
 938 :           NEL=0
 939 :           NEL1=0
 940 :           NNO=0
 941 :           NBCON=0
 942 :           IOF=0
 943 :           SEGINI,IPOG2L,IOFFS,ITYEL,ICONN
 944 :           IF (NBCHML.GT.0) SEGINI,ITYPII,INECUM
 945 : 
 946 : *         (BOUCLE SUR LES SOUS-MAILLAGES)
 947 :           IPT2=IPT1
 948 :           DO ISOU=1,NBSOU1
 949 :               IF (NBSOU.GT.0) THEN
 950 :                   IPT2=IPT1.LISOUS(ISOU)
 951 :                   SEGACT,IPT2
 952 :               ENDIF
 953 : 
 954 : *             L'élément est-il représentable par VTK ?
 955 :               ITYP=IPT2.ITYPEL
 956 :               ITY=ITYVTK(ITYP)
 957 :               IF (ITY.EQ.0) THEN
 958 : *                 ERREUR CRITIQUE 21 (Données incompatibles)
 958 :                   CALL ERREUR(21)
 959 :                   WRITE(IOIMP,*) 'Le maillage ',TMAIL(IMAI),
 960 :      .                           ' comporte des éléments ',NOMS(ITYP),
 961 :      .                           ' incompatibles avec VTK'
 962 :                   GOTO 999
 963 :               ENDIF
 964 : 
 965 : *             On mémorise les infos ci-dessous pour aller plus vite
 966 : *             lors du traitement ultérieur des MCHAML
 967 :               IF (NBCHML.GT.0) THEN
 968 :                   ITYPII(ITYP)=ISOU
 969 :                   INECUM(ISOU)=NEL
 970 :               ENDIF
 971 : 
 972 : *             (BOUCLE SUR LES ÉLÉMENTS DU SOUS-MAILLAGE)
 973 :               NN1=IPT2.NUM(/1)
 974 :               NN2=IPT2.NUM(/2)
 975 :               NEL=NEL+NN2
 976 :               NEL1=NEL
 977 :               NBCON=NBCON+(NN1*NN2)
 978 :               SEGADJ,ICONN,IOFFS,ITYEL
 979 : 
 980 :               DO I2=1,NN2
 981 :                   DO I1=1,NN1                   
 982 :                       IF (ITY.GE.20) THEN
 983 : *                         Correction pour les elements quadratiques                         
 984 :                           I3 = INUVTK(I1,ITY-20)
 985 :                       ELSE
 986 :                           I3 = I1
 987 :                       ENDIF
 988 :                       INUM=IPT2.NUM(I3,I2)
 989 :                       IPOG2L(INUM)=1
 990 :                       ICONN(IOF+I1)=INUM
 991 :                   ENDDO
 992 :                   IOF=IOF+NN1
 993 :                   IOFFS(NEL-NN2+I2)=IOF
 994 :                   ITYEL(NEL-NN2+I2)=ITY
 995 :               ENDDO
 996 : 
 997 :               IF (NBSOU.GT.0) SEGDES,IPT2
 998 :           ENDDO
 999 : 
1000 : 
1001 : *         (BOUCLE SUR LA TABLE GLOBALE IPOG2L)
1002 :           NNO=NBCON
1003 :           SEGINI,IPOL2G
1004 :           NNO=0
1005 :           DO I3=1,NPMAX
1006 :               IF (IPOG2L(I3).EQ.1) THEN
1007 :                   NNO=NNO+1
1008 :                   IPOL2G(NNO)=I3
1009 :                   IPOG2L(I3)=NNO
1010 :               ENDIF
1011 :           ENDDO
1012 :           IF (NNO.NE.NBCON) SEGADJ,IPOL2G
1013 : 
1014 : c 
1015 : 
1016 : 
1017 : *         ÉCRITURE DANS LE FICHIER
1018 : *         *************************************************************
1019 : *         *************************************************************
1020 : 
1021 :           WRITE(CNU1,FMT='(I15)') NNO
1022 :           WRITE(CNU2,FMT='(I15)') NEL
1022 :           CALL LIMCHA(CNU1,ID1,IF1)
1022 :           CALL LIMCHA(CNU2,ID2,IF2)
1023 :           WRITE(UNIT=IOXML,FMT='(8X,A)',IOSTAT=IOS)
1024 :      .    ''
1026 : 
1027 : 
1028 : 
1029 : *         *****************************************************
1030 : *                      S E C T I O N   P O I N T S
1031 : *         *****************************************************
1032 : 
1033 :           WRITE(UNIT=IOXML,FMT='(12X,A)',IOSTAT=IOS)
1034 :      .    ''
1035 : 
1036 : *         ===================== FORMATÉ =====================
1037 :           IF (IVTU.EQ.0) THEN
1038 :               WRITE(UNIT=IOXML,FMT='(16X,A)',IOSTAT=IOS)
1039 :      .        ''
1041 : 
1042 :               DO IK=1,NNO
1043 :                   II=IPOL2G(IK)-1
1044 : 
1045 :                   XRE8=XCOOR(II*IDIM1+1)
1046 :                   YRE8=XCOOR(II*IDIM1+2)
1047 :                   ZRE8=0.D0
1048 :                   IF (IDIM.EQ.3) ZRE8=XCOOR(II*IDIM1+3)
1049 : 
1050 :                   WRITE(MYFMT,FMT='("(20X,3",A8,")")') FMDAT
1051 :                   WRITE(UNIT=IOXML,FMT=MYFMT,IOSTAT=IOS)
1052 :      .            XRE8,YRE8,ZRE8
1053 :               ENDDO
1054 : 
1055 :               WRITE(UNIT=IOXML,FMT='(16X,A)',IOSTAT=IOS)
1056 :      .        ''
1057 : 
1058 : 
1059 : *         ===================== BINAIRE =====================
1060 :           ELSE
1061 : 
1062 :               NBYTES=(3*NNO)*ISIZDA
1063 : 
1064 :               WRITE(CNU1,FMT='(I15)') IPOS
1065 :               IPOS=IPOS+ISIZNB+NBYTES
1066 : 
1066 :               CALL LIMCHA(CNU1,ID1,IF1)
1067 :               WRITE(UNIT=IOXML,FMT='(16X,A)',IOSTAT=IOS)
1068 :      .        ''
1071 : 
1071 :               CALL IXDRINT(IOBIN,NBYTES)
1072 : 
1073 :               IF (ZDOUB) THEN
1074 :                   DO IK=1,NNO
1075 :                       II=IPOL2G(IK)-1
1076 : 
1077 :                       XRE8=XCOOR(II*IDIM1+1)
1078 :                       YRE8=XCOOR(II*IDIM1+2)
1079 :                       ZRE8=0.D0
1080 :                       IF (IDIM.EQ.3) ZRE8=XCOOR(II*IDIM1+3)
1081 : 
1081 :                       CALL IXDRDOUBLE(IOBIN,XRE8)
1081 :                       CALL IXDRDOUBLE(IOBIN,YRE8)
1081 :                       CALL IXDRDOUBLE(IOBIN,ZRE8)
1082 :                   ENDDO
1083 :               ELSE
1084 :                   DO IK=1,NNO
1085 :                       II=IPOL2G(IK)-1
1086 : 
1087 :                       XRE4=XCOOR(II*IDIM1+1)
1088 :                       YRE4=XCOOR(II*IDIM1+2)
1089 :                       ZRE4=0.
1090 :                       IF (IDIM.EQ.3) ZRE4=XCOOR(II*IDIM1+3)
1091 : 
1091 :                       CALL IXDRREAL(IOBIN,XRE4)
1091 :                       CALL IXDRREAL(IOBIN,YRE4)
1091 :                       CALL IXDRREAL(IOBIN,ZRE4)
1092 :                   ENDDO
1093 :               ENDIF
1094 : 
1095 :           ENDIF
1096 : 
1097 :           WRITE(UNIT=IOXML,FMT='(12X,A)',IOSTAT=IOS)
1098 :      .    ''
1099 : 
1100 : 
1101 : *         *****************************************************
1102 : *                       S E C T I O N   C E L L S             
1103 : *         *****************************************************
1104 : 
1105 :           WRITE(UNIT=IOXML,FMT='(12X,A)',IOSTAT=IOS)
1106 :      .    ''
1107 : 
1108 : *         ===================== FORMATÉ =====================
1109 :           IF (IVTU.EQ.0) THEN
1110 :               WRITE(UNIT=IOXML,FMT='(16X,A)',IOSTAT=IOS)
1111 :      .        ''
1113 : 
1114 :               WRITE(UNIT=IOXML,FMT='(20X,8I10)',IOSTAT=IOS)
1115 :      .        ((IPOG2L(ICONN(K))-1),K=1,ICONN(/1))
1116 : 
1117 :               WRITE(UNIT=IOXML,FMT='(16X,A)',IOSTAT=IOS)
1118 :      .        ''
1119 : 
1120 : *             ----------------------
1121 : 
1122 :               WRITE(UNIT=IOXML,FMT='(16X,A)',IOSTAT=IOS)
1123 :      .        ''
1125 : 
1126 :               WRITE(UNIT=IOXML,FMT='(20X,8I10)',IOSTAT=IOS)
1127 :      .        (IOFFS(K),K=1,NEL)
1128 : 
1129 :               WRITE(UNIT=IOXML,FMT='(16X,A)',IOSTAT=IOS)
1130 :      .        ''
1131 : 
1132 : *             ----------------------
1133 : 
1134 :               WRITE(UNIT=IOXML,FMT='(16X,A)',IOSTAT=IOS)
1135 :      .        ''
1137 : 
1138 :               WRITE(UNIT=IOXML,FMT='(20X,20I4)',IOSTAT=IOS)
1139 :      .        (ITYEL(K),K=1,NEL)
1140 : 
1141 :               WRITE(UNIT=IOXML,FMT='(16X,A)',IOSTAT=IOS)
1142 :      .        ''
1143 : 
1144 : 
1145 : *         ===================== BINAIRE =====================
1146 :           ELSE
1147 :               NBYTES=ICONN(/1)*4
1148 : 
1149 :               WRITE(CNU1,FMT='(I15)') IPOS
1150 :               IPOS=IPOS+ISIZNB+NBYTES
1151 : 
1151 :               CALL LIMCHA(CNU1,ID1,IF1)
1152 :               WRITE(UNIT=IOXML,FMT='(16X,A)',IOSTAT=IOS)
1153 :      .        ''
1156 : 
1156 :               CALL IXDRINT(IOBIN,NBYTES)
1157 : 
1158 :               DO K=1,ICONN(/1)
1158 :                   CALL IXDRINT(IOBIN,IPOG2L(ICONN(K))-1)
1159 :               ENDDO
1160 : 
1161 : *             ----------------------
1162 : 
1163 :               NBYTES=NEL*4
1164 : 
1165 :               WRITE(CNU1,FMT='(I15)') IPOS
1166 :               IPOS=IPOS+ISIZNB+NBYTES
1167 : 
1167 :               CALL LIMCHA(CNU1,ID1,IF1)
1168 :               WRITE(UNIT=IOXML,FMT='(16X,A)',IOSTAT=IOS)
1169 :      .        ''
1172 : 
1172 :               CALL IXDRINT(IOBIN,NBYTES)
1173 : 
1174 :               DO K=1,NEL
1174 :                   CALL IXDRINT(IOBIN,IOFFS(K))
1175 :               ENDDO
1176 : 
1177 : *             ----------------------
1178 : 
1179 : *             Groupement de quatre UInt8 en un seul Int32
1180 : *             (pour prendre moins de place !)
1181 :               NBYTES=NEL
1182 :               NBTROP=NEL-(NBYTES/4)*4
1183 :               IF (NBTROP.GT.0) THEN
1184 :                   NEL1=NEL+4-NBTROP
1185 :                   SEGADJ,ITYEL
1186 :                   NBYTES=NEL1
1187 :               ENDIF
1188 : 
1189 :               WRITE(CNU1,FMT='(I15)') IPOS
1190 :               IPOS=IPOS+ISIZNB+NBYTES
1191 : 
1191 :               CALL LIMCHA(CNU1,ID1,IF1)
1192 :               WRITE(UNIT=IOXML,FMT='(16X,A)',IOSTAT=IOS)
1193 :      .        ''
1196 : 
1196 :               CALL IXDRINT(IOBIN,NBYTES)
1197 : 
1198 :               K20=0
1199 :               DO K2=1,(NBYTES/4)
1200 :                   IXDR3=0
1201 :                   DO K1=1,4
1202 :                       IXDR3=IXDR3+(256**(4-K1))*ITYEL(K20+K1)
1203 :                   ENDDO
1203 :                   CALL IXDRINT(IOBIN,IXDR3)
1204 :                   K20=K20+4
1205 :               ENDDO
1206 : 
1207 :           ENDIF
1208 : 
1209 :           WRITE(UNIT=IOXML,FMT='(12X,A)',IOSTAT=IOS)
1210 :      .    ''
1211 : 
1212 : *         *************************************************************
1213 : *         *************************************************************
1214 : *         FIN D'ÉCRITURE DANS LE FICHIER
1215 : 
1216 : 
1217 :           SEGSUP,IPOL2G,ICONN,IOFFS,ITYEL
1218 : 
1219 : 
1220 : 
1221 : 
1222 : 
1223 : *         =============================================================
1224 : *           G R A N D E U R S   D É F I N I E S   A U X   N O E U D S
1225 : *         =============================================================
1226 : 
1227 :           WRITE(UNIT=IOXML,FMT='(12X,A)',IOSTAT=IOS)
1228 :      .    ''
1229 : 
1230 : *         (BOUCLE SUR LES CHAMPS PAR POINTS)
1231 :           DO 200 ICHP=1,NBCHPO
1232 : 
1233 :               MCHPO1=ICHPO(ICHP)
1234 :               SEGACT,MCHPO1
1235 : 
1236 : *             NSOUPO = Nombre de sous-champs
1237 :               NSOUPO=MCHPO1.IPCHP(/1)
1238 :               IF (NSOUPO.EQ.0) GOTO 200
1239 : 
1240 : 
1241 : *          1) CRÉATION DE LA LISTE DES COMPOSANTES DANS TCHCO
1242 : *             On crée cette liste avant toute chose et non pas au fur
1243 : *             et à mesure pour éviter de faire des SEGADJ sur le gros
1244 : *             segment SCHPV
1245 :               JGN=4
1246 :               JGM=0
1247 :               SEGINI,TCHCO
1248 :               DO I1=1,NSOUPO
1249 :                   MSOUP1=MCHPO1.IPCHP(I1)
1250 :                   SEGACT,MSOUP1
1251 :                   NC=MSOUP1.NOCOMP(/2)
1252 :                   JGM1=JGM
1253 :                   DO 210 I2=1,NC
1254 :                       CHA4=MSOUP1.NOCOMP(I2)
1255 :                       DO I3=1,JGM1
1256 :                           IF (TCHCO.MOTS(I3).EQ.CHA4) GOTO 210
1257 :                       ENDDO
1258 :                       JGM=JGM+1
1259 :                       SEGADJ,TCHCO
1260 :                       TCHCO.MOTS(JGM)=CHA4
1261 :   210             CONTINUE
1262 :                   SEGDES,MSOUP1
1263 :               ENDDO
1264 : 
1265 : 
1266 : *          2) CONCATÉNATION DE TOUS LES VPOCHA DANS XPOCHA
1267 : *             - on écrase la structure compliquée du CHPOINT dans un simple tableau (n°comp.;n°noeud)
1268 : *             - on passe de la numérotation globale à la numérotation locale
1269 :               NCO=JGM
1270 :               SEGINI,SCHPV,ICOOK
1271 :               DO 220 ISOU=1,NSOUPO
1272 :                   MSOUP1=MCHPO1.IPCHP(ISOU)
1273 :                   SEGACT,MSOUP1
1274 : 
1275 :                   MPOVA1=MSOUP1.IPOVAL
1276 :                   IF (MPOVA1.EQ.0) GOTO 219
1277 :                   SEGACT,MPOVA1
1278 : 
1279 :                   IPT2=MSOUP1.IGEOC
1280 :                   IF (IPT2.EQ.0) GOTO 218
1281 :                   SEGACT,IPT2
1282 : 
1283 :                   NN1=MPOVA1.VPOCHA(/1)
1284 :                   NC1=MPOVA1.VPOCHA(/2)
1285 : 
1286 :                   DO I1=1,NC1
1287 : *                     Recherche de la composante dans la liste TCHCO
1288 :                       CHA4=MSOUP1.NOCOMP(I1)
1289 :                       DO ICO=1,NCO
1290 :                           IF (TCHCO.MOTS(ICO).EQ.CHA4) GOTO 240
1291 :                       ENDDO
1292 : 
1293 : *                     MISE À JOUR DE SCHPV
1294 : *                     - si un noeud du support du SOUPO n'appartient pas au maillage courant, on passe au suivant
1295 : *                     - si un noeud du MAILLAGE courant n'est pas présent dans le support du SOUPO, sa valeur reste à zéro
1296 :   240                 NTROUV=0
1297 :                       DO 250 I2=1,NN1
1298 :                           INO=IPOG2L(IPT2.NUM(1,I2))
1299 :                           IF (INO.EQ.0) GOTO 250
1300 :                           SCHPV.XPOCHA(ICO,INO)=SCHPV.XPOCHA(ICO,INO)
1301 :      &                                         +MPOVA1.VPOCHA(I2,I1)
1302 :                           NTROUV=1
1303 :   250                 CONTINUE
1303 :                       IF (NTROUV.EQ.1) CALL AJOU(ICOOK,ICO)
1304 :                   ENDDO
1305 : 
1306 :                   SEGDES,IPT2
1307 :   218             SEGDES,MPOVA1
1308 :   219             SEGDES,MSOUP1
1309 :   220         CONTINUE
1310 : 
1311 :               SEGDES,MCHPO1
1312 : 
1313 : 
1314 : *             S'il n'y a rien à sortir, on passe au CHPOINT suivant
1315 :               NCOK=ICOOK(/1)
1316 :               IF (NCOK.EQ.0) GOTO 299
1316 :               IF (NCOK.LT.NCO) CALL ORDO01(ICOOK(1),NCOK,.TRUE.)
1317 : 
1318 : 
1319 : 
1320 : *             ÉCRITURE DANS LE FICHIER
1321 : *             *********************************************************
1322 : *             *********************************************************
1323 : 
1324 :               WRITE(MYFMT,FMT='("(16X,A,",I2,"A5,A)")') NCOK
1325 :               WRITE(UNIT=IOXML,FMT=MYFMT,IOSTAT=IOS)
1326 :      .        ''
1329 : 
1330 : 
1331 :               CHA8=TCHPO(ICHP)
1332 : 
1333 : *             ===================== FORMATÉ =====================
1334 :               IF (IVTU.EQ.0) THEN
1335 : 
1336 :                   WRITE(CNU1,FMT='(I15)') NCOK
1336 :                   CALL LIMCHA(CNU1,ID1,IF1)
1337 :                   WRITE(UNIT=IOXML,FMT='(16X,A)',IOSTAT=IOS)
1338 :      .            ''
1341 : 
1342 :                   WRITE(MYFMT,FMT='("(20X,",I2,A8,")")') NCOK,FMDAT
1343 :                   WRITE(UNIT=IOXML,FMT=MYFMT,IOSTAT=IOS)
1344 :      .            ((SCHPV.XPOCHA(ICOOK(K),J),K=1,NCOK),J=1,NNO)
1345 : 
1346 :                   WRITE(UNIT=IOXML,FMT='(16X,A)',IOSTAT=IOS)
1347 :      .            ''
1348 : 
1349 : 
1350 : *             ===================== BINAIRE =====================
1351 :               ELSE
1352 :                   NBYTES=(NCOK*NNO)*ISIZDA
1353 : 
1354 :                   WRITE(CNU1,FMT='(I15)') IPOS
1355 :                   IPOS=IPOS+ISIZNB+NBYTES
1356 : 
1357 :                   WRITE(CNU2,FMT='(I15)') NCOK
1357 :                   CALL LIMCHA(CNU1,ID1,IF1)
1357 :                   CALL LIMCHA(CNU2,ID2,IF2)
1358 :                   WRITE(UNIT=IOXML,FMT='(16X,A)',IOSTAT=IOS)
1359 :      .            ''
1363 : 
1363 :                   CALL IXDRINT(IOBIN,NBYTES)
1364 : 
1365 :                   IF (ZDOUB) THEN
1366 :                       DO J=1,NNO
1367 :                           DO K=1,NCOK
1368 :                               XRE8=SCHPV.XPOCHA(ICOOK(K),J)
1368 :                               CALL IXDRDOUBLE(IOBIN,XRE8)
1369 :                           ENDDO
1370 :                       ENDDO
1371 :                   ELSE
1372 :                       DO J=1,NNO
1373 :                           DO K=1,NCOK
1374 :                               XRE4=SCHPV.XPOCHA(ICOOK(K),J)
1374 :                               CALL IXDRREAL(IOBIN,XRE4)
1375 :                           ENDDO
1376 :                       ENDDO
1377 :                   ENDIF
1378 :               ENDIF
1379 : 
1380 : *             *********************************************************
1381 : *             *********************************************************
1382 : *             FIN D'ÉCRITURE DANS LE FICHIER
1383 : 
1384 : 
1385 :   299         SEGSUP,SCHPV,TCHCO,ICOOK
1386 : 
1387 : 
1388 :   200     CONTINUE
1389 : *         (FIN DE LA BOUCLE SUR LES CHAMPS PAR POINTS)
1390 : 
1391 :           WRITE(UNIT=IOXML,FMT='(12X,A)',IOSTAT=IOS)
1392 :      .    ''
1393 : 
1394 : 
1395 :           SEGSUP,IPOG2L
1396 : 
1397 : 
1398 : 
1399 : 
1400 : 
1401 : *         =============================================================
1402 : *          G R A N D E U R S   D É F I N I E S   P A R   É L É M E N T
1403 : *         =============================================================
1404 : 
1405 :           WRITE(UNIT=IOXML,FMT='(12X,A)',IOSTAT=IOS)
1406 :      .    ''
1407 : 
1408 : *         (BOUCLE SUR LES CHAMPS PAR ÉLÉMENTS)
1409 :           DO 300 ICHE=1,NBCHML
1410 : 
1411 :               MCHEL1=ICHML(ICHE)
1412 :               SEGACT,MCHEL1
1413 : 
1414 : *             NSOCHA = Nombre de sous-champs
1415 :               NSOCHA=MCHEL1.ICHAML(/1)
1416 :               IF (NSOCHA.EQ.0) GOTO 300
1417 : 
1418 : 
1419 : *          1) CRÉATION DE LA LISTE DES COMPOSANTES DANS TCHCO
1420 : *             On crée cette liste avant toute chose et non pas au fur
1421 : *             et à mesure pour éviter de faire des SEGADJ sur le gros
1422 : *             segment SCHMV
1423 : *             + VÉRIFICATIONS SUR LE TYPE DE MCHAML
1424 :               JGN=8
1425 :               JGM=0
1426 :               SEGINI,TCHCO
1427 :               DO I1=1,NSOCHA
1428 :                   MCHAM1=MCHEL1.ICHAML(I1)
1429 :                   SEGACT,MCHAM1
1430 : 
1431 :                   NC1=MCHAM1.IELVAL(/1)
1432 :                   JGM1=JGM
1433 :                   DO 310 I2=1,NC1
1434 : 
1435 : *                     VÉRIFICATION 1 : composante de type scalaire ?
1436 :                       IF (MCHAM1.TYPCHE(I2).NE.'REAL*8') THEN
1437 : *                         ERREUR CRITIQUE 679 (Le type de la composante %m1:8 du MCHAML est incorrect)
1438 :                           MOTERR(1:8)=MCHAM1.NOMCHE(I2)
1438 :                           CALL ERREUR(679)
1439 :                           WRITE(IOIMP,*) '(le champ par éléments "',
1440 :      .                                   TCHML(ICHE),'" contient des ',
1441 :      .                                   'composantes non scalaires'
1442 :                           GOTO 999
1443 :                       ENDIF
1444 : 
1445 : *                     VÉRIFICATION 2 : une seule valeur par cellule ?
1446 :                       MELVA1=MCHAM1.IELVAL(I2)
1447 :                       SEGACT,MELVA1
1448 :                       IF (MELVA1.VELCHE(/1).NE.1) THEN
1449 : *                         ERREUR CRITIQUE 707 (Le MCHAML doit contenir une valeur (de chaque composante) par élément)
1449 :                           CALL ERREUR(707)
1450 :                           WRITE(IOIMP,*) '(le champ par éléments "',
1451 :      .                                   TCHML(ICHE),'" n''est pas de',
1452 :      .                                   ' type "GRAVITE")'
1453 :                           GOTO 999
1454 :                       ENDIF
1455 :                       SEGDES,MELVA1
1456 : 
1457 : *                     CRÉATION DE LA LISTE TCHCO
1458 :                       CHA8=MCHAM1.NOMCHE(I2)
1459 :                       DO I3=1,JGM1
1460 :                           IF (TCHCO.MOTS(I3).EQ.CHA8) GOTO 310
1461 :                       ENDDO
1462 :                       JGM=JGM+1
1463 :                       SEGADJ,TCHCO
1464 :                       TCHCO.MOTS(JGM)=CHA8
1465 :   310             CONTINUE
1466 : 
1467 :                   SEGDES,MCHAM1
1468 :               ENDDO
1469 : 
1470 : 
1471 : 
1472 : *          2) CONCATÉNATION DE TOUS LES VELCHE DANS XELCHE
1473 : *             - on écrase la structure compliquée du MCHAML dans un simple tableau (n°comp.;n°cell.)
1474 : *             - on passe de la numérotation globale à la numérotation locale
1475 :               NCO=JGM
1476 :               SEGINI,SCHMV,ICOOK
1477 :               DO 320 I1=1,NSOCHA
1478 :                   MCHAM1=MCHEL1.ICHAML(I1)
1479 :                   SEGACT,MCHAM1
1480 : 
1481 : *                 IPT2 = SUPPORT DU SOUS-CHAMP DU MCHAML
1482 :                   IPT2=MCHEL1.IMACHE(I1)
1483 :                   SEGACT,IPT2
1484 :                   ITYP2=IPT2.ITYPEL
1485 :                   ITY2=ITYVTK(ITYP2)
1486 :                   IF (ITY2.EQ.0) THEN
1487 : C                     ERREUR CRITIQUE 21 (Données incompatibles)
1487 :                       CALL ERREUR(21)
1488 :                       WRITE(IOIMP,*) 'Le champ "',TCHML(ICHE),
1489 :      .                               '" s''appuye sur des éléments ',
1490 :      .                             NOMS(ITYP),' incompatibles avec VTK'
1491 :                       GOTO 999
1492 :                   ENDIF
1493 :                   NEL2=IPT2.NUM(/2)
1494 : 
1495 : 
1496 : *                 IPT3 = SOUS-MELEME DU MAILLAGE COURANT CONSTITUE DU
1497 : *                        MEME TYPE D'ELEMENTS QUE IPT2
1498 :                   I3=ITYPII(ITYP2)
1499 :                   IF (I3.EQ.0) GOTO 319
1500 :                   IPT3=IPT1
1501 :                   IF (NBSOU.GT.0) THEN
1502 :                       IPT3=IPT1.LISOUS(I3)
1503 :                       SEGACT,IPT3
1504 :                   ENDIF
1505 :                   NNN3=IPT3.NUM(/1)
1506 :                   NEL3=IPT3.NUM(/2)
1507 : 
1508 : 
1509 : *                 On cherche pour chaque élément de IPT2 un élément de
1510 : *                 IPT3 qui possède les mêmes noeuds, dans le même ordre
1511 :                   SEGINI,IELL2G
1512 :                   DO 330 IEL2=1,NEL2
1513 :                       DO 331 IEL3=1,NEL3
1514 :                           DO INO=1,NNN3
1515 :                               INUM2=IPT2.NUM(INO,IEL2)
1516 :                               INUM3=IPT3.NUM(INO,IEL3)
1517 :                               IF (INUM2.NE.INUM3) GOTO 331
1518 :                           ENDDO
1519 : 
1520 : *                         ON A TROUVÉ UN ÉLÉMENT COMMUN A IPT2 ET IPT3
1521 :                           IELL2G(IEL2)=INECUM(I3)+IEL3
1522 :                           GOTO 330
1523 :   331                 CONTINUE
1524 :   330             CONTINUE
1525 : 
1526 : 
1527 : *                 Remplissage de SCHMV pour chaque composante du SOCHA
1528 :                   DO 340 J1=1,NCO
1529 :                       MELVA1=MCHAM1.IELVAL(J1)
1530 :                       IF (MELVA1.EQ.0) GOTO 340
1531 :                       SEGACT,MELVA1
1532 :                       NBVAL=MELVA1.VELCHE(/2)
1533 : 
1534 : *                     Recherche de la composante dans la liste TCHCO
1535 :                       CHA8=MCHAM1.NOMCHE(J1)
1536 :                       DO ICO=1,NCO
1537 :                           IF (TCHCO.MOTS(ICO).EQ.CHA8) GOTO 350
1538 :                       ENDDO
1539 : 
1540 : *                     MISE À JOUR DE SCHMV
1541 : *                     - si une cellule du support du SOCHA n'appartient pas au maillage courant, on passe à la suivante
1542 : *                     - si une cellule du MAILLAGE courant n'est pas présente dans le support du SOCHA, sa valeur reste à zéro
1543 :   350                 NTROUV=0
1544 :                       DO 360 J2=1,NEL2
1545 :                           IEL=IELL2G(J2)
1546 :                           IF (IEL.EQ.0) GOTO 360
1547 :                           IF (NBVAL.EQ.1) THEN
1548 : *                             ATTENTION, le MELVA1 est uniforme !
1549 :                               SCHMV.XELCHE(ICO,IEL)=MELVA1.VELCHE(1,1)
1550 :                           ELSE
1551 :                               SCHMV.XELCHE(ICO,IEL)=MELVA1.VELCHE(1,J2)
1552 :                           ENDIF
1553 :                           NTROUV=1
1554 :   360                 CONTINUE
1554 :                       IF (NTROUV.EQ.1) CALL AJOU(ICOOK,ICO)
1555 : 
1556 :                       SEGDES,MELVA1
1557 :   340             CONTINUE
1558 : 
1559 : 
1560 :                   SEGSUP,IELL2G
1561 : 
1562 : *             /!\ IPT2 et IPT3 peuvent être égaux à IPT1, or IPT1 doit rester actif !!
1563 :                   IF (NBSOU.GT.0) SEGDES,IPT3
1564 :   319             IF (IPT2.NE.IPT1) SEGDES,IPT2
1565 : 
1566 :                   SEGDES,MCHAM1
1567 : 
1568 :   320         CONTINUE
1569 : 
1570 :               SEGDES,MCHEL1
1571 : 
1572 : 
1573 : *             S'il n'y a rien à sortir, on passe au MCHAML suivant
1574 :               NCOK=ICOOK(/1)
1575 :               IF (NCOK.EQ.0) GOTO 399
1575 :               IF (NCOK.LT.NCO) CALL ORDO01(ICOOK(1),NCOK,.TRUE.)
1576 : 
1577 : 
1578 : 
1579 : 
1580 : *             ÉCRITURE DANS LE FICHIER
1581 : *             *********************************************************
1582 : *             *********************************************************
1583 : 
1584 :               WRITE(MYFMT,FMT='("(16X,A,",I2,"A9,A)")') NCOK
1585 :               WRITE(UNIT=IOXML,FMT=MYFMT,IOSTAT=IOS)
1586 :      .        ''
1589 : 
1590 : 
1591 :               CHA8=TCHML(ICHE)
1592 : 
1593 : *             ===================== FORMATÉ =====================
1594 :               IF (IVTU.EQ.0) THEN
1595 : 
1596 :                   WRITE(CNU1,FMT='(I15)') NCOK
1596 :                   CALL LIMCHA(CNU1,ID1,IF1)
1597 :                   WRITE(UNIT=IOXML,FMT='(16X,A,I2,A)',IOSTAT=IOS)
1598 :      .            ''
1601 : 
1602 :                   WRITE(MYFMT,FMT='("(20X,",I2,A8,")")') NCOK,FMDAT
1603 :                   WRITE(UNIT=IOXML,FMT=MYFMT,IOSTAT=IOS)
1604 :      .            ((SCHMV.XELCHE(ICOOK(K),J),K=1,NCOK),J=1,NEL)
1605 : 
1606 :                   WRITE(UNIT=IOXML,FMT='(16X,A)',IOSTAT=IOS)
1607 :      .            ''
1608 :     
1609 : 
1610 : *             ===================== BINAIRE =====================
1611 :               ELSE
1612 :                   NBYTES=(NCOK*NEL)*ISIZDA
1613 : 
1614 :                   WRITE(CNU1,FMT='(I15)') IPOS
1615 :                   IPOS=IPOS+ISIZNB+NBYTES
1616 : 
1617 :                   WRITE(CNU2,FMT='(I15)') NCOK
1617 :                   CALL LIMCHA(CNU1,ID1,IF1)
1617 :                   CALL LIMCHA(CNU2,ID2,IF2)
1618 :                   WRITE(UNIT=IOXML,FMT='(16X,A,I2,A)',IOSTAT=IOS)
1619 :      .            ''
1623 : 
1623 :                   CALL IXDRINT(IOBIN,NBYTES)
1624 : 
1625 :                   IF (ZDOUB) THEN
1626 :                       DO J=1,NEL
1627 :                           DO K=1,NCOK
1628 :                               XRE8=SCHMV.XELCHE(ICOOK(K),J)
1628 :                               CALL IXDRDOUBLE(IOBIN,XRE8)
1629 :                           ENDDO
1630 :                       ENDDO
1631 :                   ELSE
1632 :                       DO J=1,NEL
1633 :                           DO K=1,NCOK
1634 :                               XRE4=SCHMV.XELCHE(ICOOK(K),J)
1634 :                               CALL IXDRREAL(IOBIN,XRE4)
1635 :                           ENDDO
1636 :                       ENDDO
1637 :                   ENDIF
1638 :               ENDIF
1639 : 
1640 : *             *********************************************************
1641 : *             *********************************************************
1642 : *             FIN D'ÉCRITURE DANS LE FICHIER
1643 : 
1644 : 
1645 :   399         SEGSUP,SCHMV,TCHCO,ICOOK
1646 : 
1647 : 
1648 :   300     CONTINUE
1649 : *         (FIN DE LA BOUCLE SUR LES CHAMPS PAR ÉLÉMENTS)
1650 : 
1651 :           WRITE(UNIT=IOXML,FMT='(12X,A)',IOSTAT=IOS)
1652 :      .    ''
1653 : 
1654 : 
1655 : 
1656 :           SEGDES,IPT1
1657 :           IF (NBCHML.GT.0) SEGSUP,ITYPII,INECUM
1658 : 
1659 : 
1660 : 
1661 : 
1662 : *         =============================================================
1663 : *               F E R M E T U R E   D U   F I C H I E R   . V T U
1664 : *         =============================================================
1665 : 
1666 :           WRITE(UNIT=IOXML,FMT='(8X,A)',IOSTAT=IOS)
1667 :      .    ''
1668 : 
1669 :           WRITE(UNIT=IOXML,FMT='(4X,A)',IOSTAT=IOS)
1670 :      .    ''
1671 : 
1672 : 
1673 : *         CAS DES FICHIERS BINAIRES (OPTIONS 'BINA' OU 'ZIP')
1674 : *         On doit recopier le contenu du fichier .bin dans la balise
1675 : *          du fichier .vtu
1676 :           IF (IVTU.GT.0) THEN
1677 : 
1678 :               WRITE(UNIT=IOXML,FMT='(4X,A)',IOSTAT=IOS)
1679 :      .        ''
1680 : 
1681 : *             Changement de mode d'écriture ASCII->BINAIRE pour le .vtu
1682 :               CLOSE(UNIT=IOXML)
1683 :               IOBIN2=INITXDR(NOM3,'a',.FALSE.)
1684 : 
1685 : *             Relecture et copie du fichier binaire
1686 : *             (par paquets de 4 octets, "brique de base" de XDR)
1686 :               CALL IXDRCLOSE(IOBIN,.FALSE.)
1687 :               IOBIN=INITXDR(NOM3(1:LONG(NOM3))//'.bin','r',.FALSE.)
1688 :               DO I=1,(1+(IPOS/4))
1688 :                   CALL IXDRINT(IOBIN ,INT4)
1688 :                   CALL IXDRINT(IOBIN2,INT4)
1689 :               ENDDO
1690 : 
1691 : *             Suppression du fichier binaire temporaire
1691 :               CALL IXDRCLOSE(IOBIN,.FALSE.)
1692 :               OPEN(UNIT = IOBIN,
1693 :      .             FILE = NOM3(1:LONG(NOM3))//'.bin')
1694 :               CLOSE(UNIT=IOBIN,STATUS='DELETE')
1695 : 
1696 : *             Insertion des marqueurs EOR et EOF pour que le contenu de
1697 : *             la section binaire ne soit pas écrasé lors de la fermeture
1698 : *             de la balise  (effectuée ci-après)
1698 :               CALL IXDRINT(IOBIN2,IXDR2)
1698 :               CALL IXDRINT(IOBIN2,IXDR2)
1699 : 
1700 : *             Changement de mode d'écriture BINAIRE->ASCII pour le .vtu
1700 :               CALL IXDRCLOSE(IOBIN2,.FALSE.)
1701 :               OPEN(UNIT   = IOXML        ,
1702 :      .             FILE   = NOM3         ,
1703 :      .             STATUS = 'UNKNOWN'    ,
1704 :      .             FORM   = 'FORMATTED'  ,
1705 :      .             ACCESS = 'SEQUENTIAL' ,
1706 :      .             IOSTAT = IOS          )
1706 :               CALL FINFIC(IOXML)
1707 : 
1708 :               WRITE(UNIT=IOXML,FMT='(4X,A)',IOSTAT=IOS)
1709 :      .        ''
1710 : 
1711 :           ENDIF
1712 : 
1713 :           WRITE(UNIT=IOXML,FMT='(A)',IOSTAT=IOS)
1714 :      .    ''
1715 : 
1716 : 
1717 :           CLOSE(UNIT=IOXML)
1718 : 
1719 : 
1720 :   100 CONTINUE
1721 : * (FIN DE LA BOUCLE SUR LES MAILLAGES)
1722 : 
1723 : 
1724 : 
1725 : 
1726 : 
1727 : ************************************************************************
1728 : ************************************************************************
1729 : ************************************************************************
1730 : ************************************************************************
1731 : 
1732 : 
1733 : 
1734 : 
1735 : *     +---------------------------------------------------------------+
1736 : *     |                                                               |
1737 : *     |        É C R I T U R E   D U   F I C H I E R   . P V D        |
1738 : *     |                                                               |
1739 : *     +---------------------------------------------------------------+
1740 : 
1741 : *     Nom du fichier .pvd
1742 :       NOM3=NOM1(1:LONG(NOM1))//NOMFIC(1:LONG(NOMFIC))//'.pvd'
1743 : 
1744 : 
1745 : *  1) Option 'NPVD'
1746 : *     => fin de la subroutine
1747 :       IF (IPVD.EQ.3) GOTO 999
1748 : 
1749 : 
1750 : *  2) Option 'AUTO' ou 'SUIT' quand le .pvd existe et est compatible
1751 : *     => on complète le .pvd
1752 : 
1753 :       IF (IPVD.LT.2.AND.ZEXIS) THEN
1754 : 
1755 : *         On se place à la fin du fichier existant puis...
1756 :           OPEN(UNIT   = IOXML        ,
1757 :      .         FILE   = NOM3         ,
1758 :      .         STATUS = 'OLD'        ,
1759 :      .         FORM   = 'FORMATTED'  ,
1760 :      .         ACCESS = 'SEQUENTIAL' ,
1761 :      .         IOSTAT = IOS          )
1761 :           CALL FINFIC(IOXML)
1762 : 
1763 : *         ...on recule de 2 enregistrements pour écraser les balises de
1764 : *            fermeture
1765 :           BACKSPACE(IOXML)
1766 :           BACKSPACE(IOXML)
1767 : 
1768 : 
1769 : *  3) Option 'NOUV', ou pas de fichier existant et compatible
1770 : *     => on crée le .pvd (ou on l'écrase)
1771 :       ELSE
1772 :           OPEN(UNIT   = IOXML        ,
1773 :      .         FILE   = NOM3         ,
1774 :      .         STATUS = 'UNKNOWN'    ,
1775 :      .         FORM   = 'FORMATTED'  ,
1776 :      .         ACCESS = 'SEQUENTIAL' ,
1777 :      .         IOSTAT = IOS          )
1778 :           REWIND(IOXML)
1779 : 
1780 :           WRITE(UNIT=IOXML,FMT='(A)',IOSTAT=IOS)
1781 :      .    ''
1782 : 
1783 :           WRITE(UNIT=IOXML,FMT='(A)',IOSTAT=IOS)
1784 :      .    CHEAD(1:LHEAD)
1785 : 
1786 :           WRITE(UNIT=IOXML,FMT='(A)',IOSTAT=IOS)
1787 :      .    ''
1788 :     
1789 :           WRITE(UNIT=IOXML,FMT='(4X,A)',IOSTAT=IOS)
1790 :      .    ''
1791 :       ENDIF
1792 : 
1793 : 
1794 :       WRITE(MYFMT,FMT='("(8X,A,",A8,",A)")') FMDAT
1795 :       DO IMAI=1,NBMAIL
1796 : 
1797 : *         Nom de chaque fichier .vtu créé par cette exécution de la subroutine
1798 :           NOM3=NOM2
1799 :           IF ((.NOT.ZTEMP.AND.IPVD.LT.3).OR.ZPART) THEN
1800 :               NOM3=NOM3(1:LONG(NOM3))//'.'//TMAIL(IMAI)
1801 :           ENDIF
1802 :           NOM3=NOM3(1:LONG(NOM3))//'.vtu'
1803 : 
1804 : *         ECRITURE DE LA LIGNE CORRESPONDANTE DANS LA COLLECTION
1805 : *         - champ 'timestep' : seulement avec l'option 'TEMP'
1806 : *         - champ 'part'     : en l'absence de 'TEMP', ou si plusieurs maillages étaient fournis
1807 : *         - champ 'file'     : toujours !!
1808 :           IF (ZTEMP) THEN
1809 :               IF (ZPART) THEN
1810 :                   WRITE(UNIT=IOXML,FMT=MYFMT,IOSTAT=IOS)
1811 :      .            ''
1814 :               ELSE
1815 :                   WRITE(UNIT=IOXML,FMT=MYFMT,IOSTAT=IOS)
1816 :      .        ''
1818 :               ENDIF
1819 :           ELSE
1820 :               WRITE(UNIT=IOXML,FMT='(8X,A)',IOSTAT=IOS)
1821 :      .        ''
1823 :           ENDIF
1824 :       ENDDO
1825 : 
1826 : 
1827 :       WRITE(UNIT=IOXML,FMT='(4X,A)',IOSTAT=IOS) ''
1828 :       WRITE(UNIT=IOXML,FMT='(A)',IOSTAT=IOS)    ''
1829 : 
1830 :       CLOSE(UNIT=IOXML)
1831 : 
1832 : 
1833 : 
1834 : 
1835 : ************************************************************************
1836 : ************************************************************************
1837 : ************************************************************************
1838 : ************************************************************************
1839 : 
1840 : 
1841 : 
1842 : 
1843 : *     +---------------------------------------------------------------+
1844 : *     |                                                               |
1845 : *     |            F I N   D E   L A   S U B R O U T I N E            |
1846 : *     |                                                               |
1847 : *     +---------------------------------------------------------------+
1848 : 
1849 : 
1850 :   999 CONTINUE
1851 :       SEGDES,SMAIL,SCHPO,SCHML
1852 : 
1853 : 
1854 :       RETURN
1855 : 
1856 :       END
1857 : 
1858 :  
1859 :  
1860 :  
1861 :  

© Cast3M 2003 - All rights reserved.
Disclaimer