Télécharger sorvtk.eso

Retour à la liste

Numérotation des lignes :

sorvtk
  1. C SORVTK SOURCE CB215821 23/07/12 21:15:11 11704
  2. C***********************************************************************
  3. C NOM : sorvtk.eso
  4. C DESCRIPTION : Sortie d'objets de type MAILLAGE, CHPOINT et/ou MCHAML
  5. C au format VTK
  6. C REFERENCE : VTK File Formats for VTK Version 4.2, extrait de
  7. C The VTK User's Guide, Kitware
  8. C (www.vtk.org/VTK/img/file-formats.pdf)
  9. C***********************************************************************
  10. C HISTORIQUE : 18/06/2012 : JCARDO : creation de la subroutine
  11. C HISTORIQUE : 20/06/2012 : JCARDO : bug impression ITYEL en BINA
  12. C HISTORIQUE : 16/02/2015 : JCARDO : bug memoire + nouveaux elements
  13. C HISTORIQUE : 09/03/2015 : JCARDO : autre bug memoire
  14. C HISTORIQUE :
  15. C***********************************************************************
  16. C Priere de PRENDRE LE TEMPS DE COMPLETER LES COMMENTAIRES
  17. C en cas de modification de ce sous-programme afin de faciliter
  18. C la maintenance !
  19. C***********************************************************************
  20. C APPELE PAR : operateur SORTir (prsort.eso)
  21. C***********************************************************************
  22. C ENTREES :: aucune
  23. C SORTIES :: aucune (sur fichiers uniquement)
  24. C***********************************************************************
  25. C SYNTAXE (GIBIANE) :
  26. C
  27. C SORT 'VTK' OBJ1 (MOT1) ... (OBJn) (MOTn)
  28. C (|'FORM'|) (|'AUTO'|) ('TEMP' FLOT1) ('DOUBLE_PRECISION')
  29. C |'BINA'| |'NOUV'|
  30. C |'ZIP' | |'SUIT'|
  31. C |'NPVD'|
  32. C
  33. C avec OBJi = [ MAILi | CHPOi | CHMLi | TABi ]
  34. C
  35. C***********************************************************************
  36. SUBROUTINE SORVTK
  37.  
  38. IMPLICIT INTEGER(I-N)
  39. IMPLICIT REAL*8(A-H,O-Z)
  40.  
  41. -INC PPARAM
  42.  
  43. -INC CCGEOME
  44. -INC CCNOYAU
  45. -INC CCASSIS
  46. -INC CCFXDR
  47. -INC CCOPTIO
  48. -INC CCREEL
  49.  
  50. -INC SMCOORD
  51. -INC SMELEME
  52. -INC SMCHPOI
  53. -INC SMCHAML
  54. -INC SMLMOTS
  55. -INC SMTABLE
  56.  
  57.  
  58. EXTERNAL LONG
  59.  
  60.  
  61. C OCTETS PRE-DEFINIS A ECRIRE DANS LA SECTION <AppendedData>
  62. C ----------------------------------------------------------
  63. C IXDR1=representation decimale BigEndian de la chaIne ' _'
  64. C IXDR2=representation decimale BigEndian du marqueur End-Of-Record
  65. INTEGER IXDR1,IXDR2
  66. DATA IXDR1/538976351/
  67. DATA IXDR2/10/
  68.  
  69.  
  70. C SEGMENTS DE TRAVAIL TEMPORAIRES
  71. C -------------------------------
  72. C SMAIL = donnees sur les maillages lus (pointeur et nom)
  73. C SCHPO = donnees sur les champs par points lus (pointeur et nom)
  74. C SCHML = donnees sur les champs par elements lus (pointeur et nom)
  75. C ICONN,IOFFS,ITYEL = donnees sur les cellules du maillage courant
  76. C IPOL2G|= Tables de correspondance entre la numerotation (globale)
  77. C IPOG2L| des noeuds dans XCOOR et la numerotation (locale) des
  78. C noeuds du maillage dans le fichier .vtu
  79. C IELL2G = Table de correspondance entre la numerotation (globale)
  80. C des cellules du MAILLAGE courant et la numerotation
  81. C (locale) des cellules du MCHAML courant
  82. C ITYPII = donne le sous-maillage forme d'un type donne d'element
  83. C INECUM = donne le nombre cumule d'elements des sous-maillages
  84. C TCHCO = liste des composantes du CHPOINT ou du MCHAML courant
  85. C ICOOK = liste des composantes a sortir (au moins 1 valeur)
  86. C SCHPV = tableau compacte des valeurs du CHPOINT courant
  87. C SCHMV = tableau compacte des valeurs du MCHAML courant
  88.  
  89. SEGMENT SMAIL
  90. CHARACTER*(LONOM) TMAIL(NBMAIL)
  91. INTEGER IMAIL(NBMAIL)
  92. INTEGER IPART(NBMAIL)
  93. INTEGER KMAIL(NBMAIL)
  94. ENDSEGMENT
  95. SEGMENT SCHPO
  96. INTEGER ICHPO(NBCHPO)
  97. CHARACTER*(LONOM) TCHPO(NBCHPO)
  98. ENDSEGMENT
  99. SEGMENT SCHML
  100. INTEGER ICHML(NBCHML)
  101. CHARACTER*(LONOM) TCHML(NBCHML)
  102. ENDSEGMENT
  103.  
  104. SEGMENT IPOL2G(NNO)
  105. SEGMENT IPOG2L(NPMAX)
  106. SEGMENT IELL2G(NEL2)
  107. SEGMENT ICONN(NBCON)
  108. SEGMENT IOFFS(NEL)
  109. SEGMENT ITYEL(NEL1)
  110. SEGMENT ITYPII(NOMBR)
  111. SEGMENT INECUM(NBSOU1)
  112.  
  113. POINTEUR TCHCO.MLMOTS
  114. SEGMENT ICOOK(0)
  115.  
  116. SEGMENT SCHPV
  117. REAL*8 XPOCHA(NCO,NNO)
  118. ENDSEGMENT
  119. SEGMENT SCHMV
  120. REAL*8 XELCHE(NCO,NEL)
  121. ENDSEGMENT
  122.  
  123.  
  124. C MOTS-CLES DE L'OPERATEUR
  125. C ------------------------
  126. PARAMETER(LMCLE=9)
  127. CHARACTER*4 MCLE(LMCLE)
  128. DATA MCLE/'AUTO','SUIT','NOUV','NPVD',
  129. & 'FORM','BINA','ZIP',
  130. & 'TEMP',
  131. & 'DOUB'/
  132.  
  133.  
  134. C VARIABLES BOOLEENNES
  135. C --------------------
  136. C ZEXIS = vrai si le fichier .pvd existe deja (et est compatible)
  137. C ZTEMP = vrai si le pas de temps a ete indique (mot-cle 'TEMP')
  138. C ZPART = vrai si plusieurs maillages ont ete transmis
  139. C ZOPT1,ZOPT2 = utilises pour s'assurer que plusieurs mots-cles
  140. C d'une meme option n'ont pas ete lus
  141. C ZOPEN = vrai si OPTI 'SORT' a bien ete appele au prealable
  142. C ZDOUB = vrai si on ecrit les donnees en double precision
  143. LOGICAL ZEXIS,ZTEMP,ZPART,ZOPT1,ZOPT2,ZOPEN,ZDOUB
  144.  
  145.  
  146. C TABLEAUX DE CORRESPONDANCE entre les elements geometriques de
  147. C CAST3M et ceux de VTK (www.vtk.org/VTK/img/file-formats.pdf)
  148. C --------------------
  149. INTEGER*2 ITYVTK(48)
  150. DATA ITYVTK
  151. C POI1 SEG2 SEG3 TRI3 TRI4 TRI6 TRI7 QUA4 QUA5
  152. . / 1 , 3 , 21 , 5 , 0 , 22 , 34 , 9 , 0 ,
  153. C QUA8 QUA9 RAC2 RAC3 CUB8 CU20 PRI6 PR15 LIA3
  154. . 23 , 28 , 0 , 0 , 12 , 25 , 13 , 26 , 0 ,
  155. C LIA4 LIA6 LIA8 MULT TET4 TE10 PYR5 PY13 ATTA
  156. . 0 , 0 , 0 , 0 , 10 , 24 , 14 , 27 , 0 ,
  157. C SUPE RAP3 LIP6 LIP8 POLY CU27 PR21 TE15 PY19
  158. . 0 , 0 , 0 , 0 , 0 , 29 , 0 , 0 , 0 ,
  159. C SEG4 QU16 TR12 PR18 SEG6 TR21 QU36 C216 P126
  160. . 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
  161. C TE56 PY91 SURE
  162. . 0 , 0 , 0 /
  163.  
  164. C Correspondance des numerotations pour les elements quadratiques
  165. INTEGER*2 INUVTK(27, 14)
  166. INTEGER*2 NUSEG3(3), NUTRI6(6), NUQUA8(8),NUTE10(10),NUCU20(20),
  167. . NUPR15(15),NUPY13(13),NUQUA9(9),NUCU27(27),NUTRI7(7)
  168. DATA NUSEG3 / 1, 3, 2 /
  169. DATA NUTRI6 / 1, 3, 5, 2, 4, 6 /
  170. DATA NUQUA8 / 1, 3, 5, 7, 2, 4, 6, 8 /
  171. DATA NUTE10 / 1, 3, 5, 10, 2, 4, 6, 7, 8, 9 /
  172. DATA NUCU20 / 1, 3, 5, 7, 13, 15, 17, 19, 2, 4, 6, 8, 14, 16, 18,
  173. . 20, 9, 10, 11, 12 /
  174. DATA NUPR15 / 1, 3, 5, 10, 12, 14, 2, 4, 6, 11, 13, 15, 7, 8, 9 /
  175. DATA NUPY13 / 1, 3, 5, 7, 13, 2, 4, 6, 8, 9, 10, 11, 12 /
  176. DATA NUQUA9 / 1, 3, 5, 7, 2, 4, 6, 8, 9 /
  177. DATA NUCU27 / 1, 3, 5, 7, 13, 15, 17, 19, 2, 4, 6, 8, 14, 16, 18,
  178. . 20, 9, 10, 11, 12, 24, 22, 21, 23, 25, 26, 27 /
  179. DATA NUTRI7 / 1, 3, 5, 2, 4, 6, 7 /
  180. EQUIVALENCE (INUVTK(1,1 ),NUSEG3(1)),
  181. . (INUVTK(1,2 ),NUTRI6(1)),
  182. . (INUVTK(1,3 ),NUQUA8(1)),
  183. . (INUVTK(1,4 ),NUTE10(1)),
  184. . (INUVTK(1,5 ),NUCU20(1)),
  185. . (INUVTK(1,6 ),NUPR15(1)),
  186. . (INUVTK(1,7 ),NUPY13(1)),
  187. . (INUVTK(1,8 ),NUQUA9(1)),
  188. . (INUVTK(1,9 ),NUCU27(1)),
  189. . (INUVTK(1,14),NUTRI7(1))
  190.  
  191.  
  192. C AUTRES DECLARATIONS
  193. C -------------------
  194.  
  195. C Chaines de caracteres generiques
  196. CHARACTER*4 CHA4
  197. CHARACTER*8 CHA8
  198. CHARACTER*(LOCOMP) MOCOMP
  199. CHARACTER*9 CHA9
  200.  
  201. C Chaine de caracteres destinee a recueillir un nom GIBIANE
  202. CHARACTER*(LONOM) CNOM
  203.  
  204. C Chaines de caracteres pour la conversion de nombres
  205. CHARACTER*15 CNU1,CNU2
  206.  
  207. C Nom de base des fichiers a ecrire (fourni via OPTI SORT)
  208. CHARACTER*(LOCHAI) NOMFIC
  209.  
  210. C Variables pour la manipulation des noms de fichiers
  211. CHARACTER*(LOCHAI) NOM1,NOM2,NOM3
  212.  
  213. C Variable pour les formats I/O dynamiques
  214. CHARACTER*30 MYFMT
  215.  
  216. C Buffer utilise lors de la lecture preliminaire du fichier .pvd
  217. CHARACTER*200 CBUF
  218.  
  219. C Ligne de commentaire ecrite en-tete de tous les fichiers
  220. CHARACTER*120 CHEAD
  221.  
  222.  
  223. C *****************************************************************
  224. C CONTROLE DE LA TAILLE ET DE LA PRECISION DES DONNEES NUMERIQUES
  225. C ECRITES SUR LES UNITES DE SORTIE IOXML ET IOBIN
  226. C *****************************************************************
  227. C
  228. C /!\ CHOIX NON MODIFIABLES PAR 'DOUBLE_PRECISION' :
  229. C
  230. C - En BINAire :
  231. C => les connectivites et offsets des cellules sont ecrits sur
  232. C 4 octets, ce qui "limite" le nombre de noeuds a 2 milliards
  233. C => les types des cellules sont codes sur 1 octet (puis groupes
  234. C par 4 pour pouvoir etre ecrits par XDR)
  235. C => Le standard VTK impose que la variable NBYTES ci-dessous
  236. C soit ecrite sur 4 octets (soit ISIZNB=4)
  237. C
  238. C - En FORMate :
  239. C => les CHPOINT et MCHAML sont ecrits sur N colonnes, ou N est
  240. C le nombre de composantes : il y aura une erreur si N est
  241. C un multiple de 100 car N est ecrit au format I2.
  242. C
  243. C ------------------------------
  244.  
  245. C NBYTES=Nombre d'octets ecrits jusqu'alors dans la section AppendedData (hors caractere '_' initial)
  246. C ISIZNB=Taille (en octets) sur laquelle ecrire la variable NBYTES
  247. INTEGER NBYTES
  248. PARAMETER(ISIZNB=4)
  249.  
  250. C Formats numeriques predefinis pour l'ecriture de reels
  251. CHARACTER*8 FMR4,FMR8
  252. PARAMETER(FMR4='E14.6E2 ')
  253. PARAMETER(FMR8='E24.15E3')
  254.  
  255. C Variables a modifier selon la valeur de ZDOUB
  256. C - FMDAT=[FMR4|FMR8]
  257. C - FLDAT=['Float32'|'Float64']
  258. C - ISIZDA=[4|8]
  259. CHARACTER*8 FMDAT
  260. CHARACTER*7 FLDAT
  261. INTEGER ISIZDA
  262.  
  263. C Variables generiques de precision donnee
  264. INTEGER INT8
  265. REAL*4 XRE4,YRE4,ZRE4
  266. REAL*8 XRE8,YRE8,ZRE8
  267.  
  268. SEGACT,MCOORD
  269.  
  270. C (FIN DES DECLARATIONS)
  271. C *****************************************************************
  272. C *****************************************************************
  273.  
  274. C Numero de la sortie logique vers le fichier .vtu
  275. C (le numero de l'eventuel .bin sera renvoye par INITXDR)
  276. IOXML=IOPER
  277.  
  278. C Nombre max. de noeuds (pour dimensionner les tableaux)
  279. IDIM1=IDIM+1
  280. NPMAX=nbpts
  281.  
  282. C Nom de base des fichiers a sortir
  283. INQUIRE(UNIT=IOPER,OPENED=ZOPEN)
  284. IF (.NOT.ZOPEN) THEN
  285. CALL ERREUR(-212)
  286. WRITE(IOIMP,*) '(via OPTI "SORT")'
  287. MOTERR='VTK'
  288. CALL ERREUR(705)
  289. RETURN
  290. ENDIF
  291. INQUIRE(UNIT=IOPER,NAME=NOMFIC)
  292. CLOSE(UNIT=IOPER,STATUS='DELETE')
  293. C ---------------------------------------
  294. C /!\ On ferme immediatement le fichier ouvert par OPTI 'SORT'...
  295. C CE N'ETAIT PAS L'APPROCHE GENERALEMENT ADOPTEE quand on utilisait
  296. C l'operateur SORTir, mais ici il devient beaucoup plus commode de
  297. C proceder ainsi, pour plusieurs raisons :
  298. C - eventuellement plusieurs fichiers .vtu seront ecrits
  299. C - le fichier .pvd peut etre ou ne pas etre ecrit
  300. C - les fichiers .vtu peuvent etre en mode ASCII ou BINAIRE
  301. C - il faut rajouter l'extension !
  302. C ---------------------------------------
  303. C UNE AUTRE METHODE PLUS PRAGMATIQUE SERAIT DE RECUPERER LE NOM DE
  304. C BASE DIRECTEMENT EN PREMIER ARGUMENT DE L'OPERATEUR SORT :
  305. C CALL LIRCHA(NOMFIC,1,LNOM1)
  306. C IF (IERR.NE.0) RETURN
  307. C ---------------------------------------
  308.  
  309. C On isole le nom du repertoire dans NOM1, s'il existe
  310. C ON CONSIDERE QUE / ET \ SONT DES SEPARATEURS DE REPERTOIRES
  311. C (C'EST BIEN LE CAS SOUS WINDOWS MAIS PAS SOUS LINUX)
  312. IREP1=INDEX(NOMFIC,'/' ,BACK=.TRUE.)
  313. IREP2=INDEX(NOMFIC,CHAR(92),BACK=.TRUE.)
  314. IREP =MAX(IREP1,IREP2)
  315. NOM1='./'
  316. IF (IREP.GT.0) THEN
  317. NOM1=NOMFIC(1:IREP)
  318. NOMFIC=NOMFIC(IREP+1:LONG(NOMFIC))
  319. ENDIF
  320.  
  321.  
  322.  
  323.  
  324. C***********************************************************************
  325. C***********************************************************************
  326. C***********************************************************************
  327. C***********************************************************************
  328.  
  329.  
  330.  
  331.  
  332. C +---------------------------------------------------------------+
  333. C | |
  334. C | L E C T U R E D E S A R G U M E N T S |
  335. C | |
  336. C +---------------------------------------------------------------+
  337.  
  338.  
  339. C NBMAIL :: nombre d'objets 'MAILLAGE' lus
  340. C NBCHPO :: nombre d'objets 'CHPOINT' lus
  341. C NBCHML :: nombre d'objets 'MCHAML' lus
  342. NBMAIL=0
  343. NBCHPO=0
  344. NBCHML=0
  345. SEGINI,SMAIL,SCHPO,SCHML
  346.  
  347. C IPVD=0 :: option 'AUTO' => completion du .pvd si possible, creation d'un nouveau sinon
  348. C IPVD=1 :: option 'SUIT' => force la completion du .pvd (erreur s'il n'existe pas ou s'il est incompatible)
  349. C IPVD=2 :: option 'NOUV' => force l'ecriture d'un nouveau .pvd
  350. C IPVD=3 :: option 'NPVD' => pas de fichier .pvd
  351. IPVD=0
  352.  
  353. C IVTU=0 :: option 'FORMATE' => ecriture du .vtu en formate (ascii)
  354. C IVTU=1 :: option 'BINAIRE' => ecriture du .vtu en binaire (section AppendedData)
  355. C IVTU=2 :: option 'ZIP' => idem que 'BINA', avec compression zlib en plus
  356. IVTU=1
  357.  
  358. C ZTEMP :: option 'TEMP'
  359. XTPS=0.D0
  360. XTF1=XGRAND
  361. ZTEMP=.FALSE.
  362.  
  363. C ZDOUB :: option 'DOUBLE_PRECISION'
  364. ZDOUB=.FALSE.
  365. FMDAT=FMR4
  366. FLDAT='Float32'
  367. ISIZDA=4
  368.  
  369. C ZOPT1 evite les ambiguites sur la valeur de IPVD
  370. C ZOPT2 evite les ambiguites sur la valeur de IVTU
  371. ZOPT1=.FALSE.
  372. ZOPT2=.FALSE.
  373.  
  374.  
  375.  
  376. C (branchement vers les etiquettes de lecture d'objets =LIROBJ)
  377. 10 CONTINUE
  378.  
  379. CALL QUETYP(CHA8,0,IRETOU)
  380. IF (IRETOU.EQ.0) GOTO 99
  381.  
  382. ILAB=0
  383. IF (CHA8.EQ.'MAILLAGE') ILAB=1
  384. IF (CHA8.EQ.'CHPOINT' ) ILAB=2
  385. IF (CHA8.EQ.'MCHAML' ) ILAB=3
  386. IF (CHA8.EQ.'TABLE' ) ILAB=4
  387. IF (ILAB.GT.0) GOTO(20,30,40,50),ILAB
  388.  
  389. IF (CHA8.EQ.'MOT') THEN
  390. CALL LIRCHA(CHA4,1,LCHA)
  391. CALL CHRMOT(MCLE,LMCLE,CHA4,ICLE)
  392. IF (ICLE.GT.0) GOTO 11
  393.  
  394. C ERREUR CRITIQUE 7 (On ne comprend pas le mot %m1:4)
  395. MOTERR=CHA4
  396. CALL ERREUR(7)
  397. RETURN
  398. ENDIF
  399.  
  400. C ERREUR CRITIQUE 39 (On ne veut pas d'objet de type %m1:8)
  401. MOTERR=CHA8
  402. CALL ERREUR(39)
  403. RETURN
  404.  
  405.  
  406.  
  407. C (branchement vers les etiquettes de traitement des mots-cles)
  408. 11 GOTO( 70, 70, 70, 70, 71, 71, 71, 72, 73 ),ICLE
  409. C AUTO SUIT NOUV NPVD FORM BINA ZIP TEMP DOUB
  410.  
  411.  
  412.  
  413. C =============================================
  414. C LECTURE ET MEMORISATION D'UN OBJET 'MAILLAGE'
  415. C =============================================
  416.  
  417. 20 CONTINUE
  418.  
  419. C Lecture d'un nouveau MELEME
  420. CALL LIROBJ('MAILLAGE',IPT1,1,IRETOU)
  421. IF (IERR.NE.0) GOTO 999
  422.  
  423. C Verification que le MELEME n'est pas deja dans la liste
  424. DO I1=1,NBMAIL
  425. IF (IMAIL(I1).EQ.IPT1) GOTO 60
  426. ENDDO
  427. NBMAIL=NBMAIL+1
  428.  
  429. C Attribution d'un nom par defaut a l'objet lu
  430. CALL QUENOM(CNOM)
  431. IF (CNOM(1:1).EQ.'#'.OR.CNOM(1:1).EQ.' ')
  432. & WRITE(CNOM,FMT='("MAILLAGE_",I4.4)') NBMAIL
  433. C Memorisation des informations
  434. SEGADJ,SMAIL
  435. IMAIL(NBMAIL)=IPT1
  436. IPART(NBMAIL)=NBMAIL
  437. TMAIL(NBMAIL)=CNOM
  438. KMAIL(NBMAIL)=0
  439.  
  440. GOTO 60
  441.  
  442.  
  443. C ============================================
  444. C LECTURE ET MEMORISATION D'UN OBJET 'CHPOINT'
  445. C ============================================
  446.  
  447. 30 CONTINUE
  448.  
  449. C Lecture d'un nouveau CHPOINT
  450. CALL LIROBJ('CHPOINT',MCHPO1,1,IRETOU)
  451. IF (IERR.NE.0) GOTO 999
  452.  
  453. C Verification que le CHPOINT n'est pas deja dans la liste
  454. DO I1=1,NBCHPO
  455. IF (ICHPO(I1).EQ.MCHPO1) GOTO 60
  456. ENDDO
  457. NBCHPO=NBCHPO+1
  458.  
  459. C Attribution d'un nom par defaut a l'objet lu
  460. CALL QUENOM(CNOM)
  461. IF (CNOM(1:1).EQ.'#'.OR.CNOM(1:1).EQ.' ')
  462. & WRITE(CNOM,FMT='("CHPOINT_",I4.4)') NBCHPO
  463.  
  464. C Memorisation des informations
  465. SEGADJ,SCHPO
  466. ICHPO(NBCHPO)=MCHPO1
  467. TCHPO(NBCHPO)=CNOM
  468.  
  469. GOTO 60
  470.  
  471.  
  472. C ===========================================
  473. C LECTURE ET MEMORISATION D'UN OBJET 'MCHAML'
  474. C ===========================================
  475.  
  476. 40 CONTINUE
  477.  
  478. C Lecture d'un nouveau MCHAML
  479. CALL LIROBJ('MCHAML',MCHEL1,1,IRETOU)
  480. IF (IERR.NE.0) GOTO 999
  481.  
  482. C Verification que le MCHAML n'est pas deja dans la liste
  483. DO I1=1,NBCHML
  484. IF (ICHML(I1).EQ.MCHEL1) GOTO 60
  485. ENDDO
  486. NBCHML=NBCHML+1
  487.  
  488. C Attribution d'un nom par defaut a l'objet lu
  489. CALL QUENOM(CNOM)
  490. IF (CNOM(1:1).EQ.'#'.OR.CNOM(1:1).EQ.' ')
  491. & WRITE(CNOM,FMT='("CHAMELEM_",I4.4)') NBCHML
  492.  
  493. C Memorisation des informations
  494. SEGADJ,SCHML
  495. ICHML(NBCHML)=MCHEL1
  496. TCHML(NBCHML)=CNOM
  497.  
  498. GOTO 60
  499.  
  500.  
  501. C ===========================================
  502. C LECTURE ET DECOMPOSITION D'UN OBJET 'TABLE'
  503. C ===========================================
  504.  
  505. 50 CONTINUE
  506.  
  507. C Lecture d'une TABLE
  508. CALL LIROBJ('TABLE',MTABLE,1,IRETOU)
  509. IF (IERR.NE.0) GOTO 999
  510.  
  511. C Decomposition de la TABLE en objets MAILLAGE, CHPOINT et MCHAML
  512. SEGACT,MTABLE
  513. DO K=MLOTAB,1,-1
  514.  
  515. C Conversion de l'indice en chaine de caracteres
  516. CHA4=MTABTI(K)(1:4)
  517. IF (CHA4.EQ.'ENTI') WRITE(CNOM,FMT='(I8.8)') MTABII(K)
  518. IF (CHA4.EQ.'FLOT') WRITE(CNOM,FMT='(F8.4)') RMTABI(K)
  519. IF (CHA4.EQ.'MOT') THEN
  520. CNOM=' '
  521. IF (NBESC.NE.0) SEGACT IPILOC
  522. IMO1=IPCHAR(MTABII(K))
  523. IMO2=IPCHAR(MTABII(K)+1)
  524. ILON=MIN(LONOM,IMO2-IMO1)
  525. CNOM(1:ILON)=ICHARA(IMO1:IMO1+ILON-1)
  526. IF (NBESC.NE.0) SEGDES,IPILOC
  527. ENDIF
  528.  
  529. C Ecriture du nom puis du pointeur vers l'objet
  530. IF (MTABTV(K).EQ.'MAILLAGE'.OR.
  531. . MTABTV(K).EQ.'CHPOINT'.OR.
  532. . MTABTV(K).EQ.'MCHAML') THEN
  533. CALL ECRCHA(CNOM)
  534. CHA8=MTABTV(K)
  535. IPOB=MTABIV(K)
  536. CALL ECROBJ(CHA8,IPOB)
  537. ELSE
  538. C ERREUR CRITIQUE 763 (Dans la table %m1:8, l'objet d'indice %m9:16 n'est pas de type %m17:40)
  539. CALL QUENOM(CHA8)
  540. MOTERR=CHA8
  541. WRITE(MOTERR(9:16),FMT='("n=",I6)') K
  542. MOTERR(17:40)=' MAILLAGE/CHPOINT/MCHAML'
  543. CALL ERREUR(763)
  544. RETURN
  545. ENDIF
  546. ENDDO
  547. SEGDES,MTABLE
  548.  
  549. GOTO 10
  550.  
  551.  
  552. C ========================================
  553. C ATTRIBUTION D'UN NOM AU DERNIER OBJET LU
  554. C ========================================
  555.  
  556. 60 CONTINUE
  557.  
  558. CALL QUETYP(CHA8,0,IRETOU)
  559. IF (IRETOU.NE.0.AND.CHA8.EQ.'MOT') THEN
  560. CALL LIRCHA(CNOM,0,LCHA)
  561. CALL CHRMOT(MCLE,LMCLE,CNOM,ICLE)
  562. IF (ICLE.GT.0) GOTO 11
  563. C Remarque : On utilise le fait que I1 est incremente au passage sur ENDDO
  564. C Ainsi, I1 reste fige si on sort prematurement, et vaut bien N+1
  565. C si les N iterations se sont deroulees sans encombre
  566. IF (ILAB.EQ.1) TMAIL(I1)=CNOM
  567. IF (ILAB.EQ.2) TCHPO(I1)=CNOM
  568. IF (ILAB.EQ.3) TCHML(I1)=CNOM
  569. IF (ILAB.EQ.4) THEN
  570. CALL ERREUR(880)
  571. RETURN
  572. ENDIF
  573. ENDIF
  574.  
  575. GOTO 10
  576.  
  577.  
  578. C ====================
  579. C LECTURE D'UN MOT-CLE
  580. C ====================
  581.  
  582. C Mots-cles 'AUTO, 'NOUV', 'SUIT' ou 'NPVD'
  583. 70 CONTINUE
  584. ICLE1=ICLE-1
  585. IF (ZOPT1.AND.IPVD.NE.ICLE1) THEN
  586. C ERREUR CRITIQUE 880 (Syntaxe incorrecte, voir notice)
  587. CALL ERREUR(880)
  588. WRITE(IOIMP,*) '(options ',MCLE(IPVD),' et ',MCLE(ICLE),
  589. . ' incompatibles)'
  590. RETURN
  591. ENDIF
  592. ZOPT1=.TRUE.
  593. IPVD=ICLE1
  594. GOTO 10
  595.  
  596. C Mots-cles 'FORM, 'BINA' ou 'ZIP'
  597. 71 CONTINUE
  598. ICLE1=ICLE-5
  599. IF (ZOPT2.AND.IVTU.NE.ICLE1) THEN
  600. C ERREUR CRITIQUE 880 (Syntaxe incorrecte, voir notice)
  601. CALL ERREUR(880)
  602. WRITE(IOIMP,*) '(options ',MCLE(IVTU+4),' et ',MCLE(ICLE),
  603. . ' incompatibles)'
  604. RETURN
  605. ENDIF
  606. ZOPT2=.TRUE.
  607. IVTU=ICLE1
  608.  
  609. IF (IVTU.EQ.2) THEN
  610. C ERREUR CRITIQUE 251 (Tentative d'utilisation d'une option non implementee)
  611. CALL ERREUR(251)
  612. WRITE(IOIMP,*) '(option ZIP indisponible pour le moment)'
  613. RETURN
  614. ENDIF
  615. GOTO 10
  616.  
  617. C Mot-cle 'TEMP'
  618. 72 CONTINUE
  619. ZTEMP=.TRUE.
  620. CALL LIRREE(XTPS,0,IRETOU)
  621. IF (IRETOU.EQ.0) THEN
  622. C ERREUR CRITIQUE 166 (Le mot-cle %m1:4 n'est pas suivi de la donnee correspondante)
  623. MOTERR='TEMP'
  624. CALL ERREUR(166)
  625. RETURN
  626. ENDIF
  627. GOTO 10
  628.  
  629. C Mot-cle 'DOUB'
  630. 73 CONTINUE
  631. ZDOUB=.TRUE.
  632. FMDAT=FMR8
  633. FLDAT='Float64'
  634. ISIZDA=8
  635. GOTO 10
  636.  
  637.  
  638.  
  639.  
  640. 99 CONTINUE
  641.  
  642.  
  643. C Verification : il faut au moins 1 objet MAILLAGE pour continuer
  644. IF (NBMAIL.EQ.0) THEN
  645. C ERREUR CRITIQUE 37 (On ne trouve pas d'objet de type %m1:8)
  646. MOTERR='MAILLAGE'
  647. CALL ERREUR(37)
  648. RETURN
  649. ENDIF
  650.  
  651. C Il y a-t-il plusieurs objets MAILLAGE ?
  652. ZPART=(NBMAIL.GT.1)
  653.  
  654.  
  655.  
  656. C IMPRESSIONS POUR DEBOGAGE
  657. C #########################
  658. IF (IIMPI.NE.0) THEN
  659. WRITE(IOIMP,FMT='(I2,A)') NBMAIL,' MAILLAGE(s) lu(s)'
  660. WRITE(IOIMP,FMT='(5X,I7,2X,A24)') (IMAIL(I),TMAIL(I),I=1,NBMAIL)
  661.  
  662. WRITE(IOIMP,FMT='(I2,A)') NBCHPO,' CHPOINT(s) lu(s)'
  663. WRITE(IOIMP,FMT='(5X,I7,2X,A24)') (ICHPO(I),TCHPO(I),I=1,NBCHPO)
  664.  
  665. WRITE(IOIMP,FMT='(I2,A)') NBCHML,' MCHAML(s) lu(s)'
  666. WRITE(IOIMP,FMT='(5X,I7,2X,A24)') (ICHML(I),TCHML(I),I=1,NBCHML)
  667. ENDIF
  668. C #########################
  669.  
  670.  
  671.  
  672.  
  673. C***********************************************************************
  674. C***********************************************************************
  675. C***********************************************************************
  676. C***********************************************************************
  677.  
  678.  
  679.  
  680.  
  681. C +---------------------------------------------------------------+
  682. C | |
  683. C | V E R I F I C A T I O N S D A N S L E . P V D |
  684. C | |
  685. C +---------------------------------------------------------------+
  686.  
  687.  
  688. NOM3=NOM1(1:LONG(NOM1))//NOMFIC(1:LONG(NOMFIC))//'.pvd'
  689.  
  690. INQUIRE(FILE=NOM3,EXIST=ZEXIS)
  691.  
  692.  
  693. C Option 'AUTO' ou 'SUIT' : on verifie que le .pvd pre-existant
  694. C est compatible avec les donnees que l'on veut rajouter
  695. C (cette verification n'a pas vocation a etre infaillible, elle
  696. C permet seulement d'eviter aux etourdis de corrompre le .pvd)
  697. C
  698. C Apres lecture du .pvd : ITF=dernier indice enregistre
  699. C XTF=dernier instant enregistre
  700. ITF=0
  701. IF (IPVD.LT.2.AND.ZEXIS) THEN
  702. OPEN(UNIT = IOXML ,
  703. . FILE = NOM3 ,
  704. . STATUS = 'OLD' ,
  705. . FORM = 'FORMATTED' ,
  706. . ACCESS = 'SEQUENTIAL',
  707. . IOSTAT = IOS )
  708. CALL FINFIC(IOXML)
  709.  
  710.  
  711. C On remonte au-dela des balises de fermeture du .pvd
  712. DO NLFOOTER=1,5
  713. BACKSPACE(IOXML)
  714. READ(UNIT=IOXML,FMT='(A)') CBUF
  715. BACKSPACE(IOXML)
  716. IF (INDEX(CBUF,'</Collection>').GT.0) GOTO 150
  717. ENDDO
  718. GOTO 9004
  719.  
  720. 150 CONTINUE
  721.  
  722.  
  723. C a) Si 'TEMP' est specifie, on verifie que le .pvd contient un
  724. C champ 'timestep' et que la chronologie est respectee. Si en
  725. C outre plusieurs maillages sont fournis, on verifie que la
  726. C partition est identique (verif. du nom et du nombre seult.)
  727.  
  728. IF (ZTEMP) THEN
  729.  
  730. C On va devoir verifier les NBMAIL derniers items
  731. DO I1=1,NBMAIL
  732. BACKSPACE(IOXML)
  733. ENDDO
  734.  
  735. DO IMAI=1,NBMAIL
  736.  
  737. C Lecture de l'item puis recherche des champs 'timestep', 'part', 'name' et 'file'
  738. READ(UNIT=IOXML,FMT='(A)') CBUF
  739. II1=INDEX(CBUF,'timestep=')
  740. II2=INDEX(CBUF,'part=')
  741. II3=INDEX(CBUF,'name=')
  742. II4=INDEX(CBUF,'file="'//NOMFIC(1:LONG(NOMFIC)))
  743.  
  744.  
  745. C DECLENCHEMENT D'UNE ERREUR SI :
  746.  
  747. C - le champ 'file' ne contient pas le nom du fichier lu => 9004
  748. IF (II4.EQ.0) GOTO 9004
  749.  
  750. C - les NBMAIL derniers items n'ont pas le meme 'timestep' => 9001
  751. C - pas de champ 'timestep' trouve => 9002
  752. C - le 'timestep' lu est superieur a la valeur specifiee dans 'TEMP' => 9003
  753. C - le format du fichier n'est pas reconnu => 9004
  754. IF (II1.GT.0) THEN
  755. WRITE(MYFMT,FMT='("(",A8,")")') FMDAT
  756. II5=II1+INDEX(CBUF(II1+10:),'"')+8
  757. READ(CBUF(II1+10:II5),FMT=MYFMT,IOSTAT=IOS) XTF
  758. IF (IOS.NE.0) GOTO 9004
  759. IF (IMAI.GT.1 .AND. XTF1.NE.XTF) GOTO 9001
  760. IF (XTF.GE.XTPS) GOTO 9003
  761. XTF1=XTF
  762. ELSE
  763. GOTO 9002
  764. ENDIF
  765.  
  766. C - un seul maillage specifie alors qu'on a trouve un champ 'part' => 9001
  767. C - plusieurs maillages specifies alors qu'on ne trouve aucun champ 'part' => 9001
  768. C - le i-eme champ 'part' n'a pas le meme nom que le i-eme maillage specifie => 9001
  769. C - pas de champ 'name' associe au champ 'part' => 9004
  770. C - le format du fichier n'est pas reconnu => 9004
  771. JPART=1
  772. IF (ZPART.AND.(II2.GT.0)) THEN
  773. IF (II3.EQ.0) GOTO 9004
  774. READ(CBUF(II2+6:II3-3),FMT='(A4)',IOSTAT=IOS) CHA4
  775. IF (IOS.NE.0) GOTO 9004
  776. READ(CHA4,FMT='(I4)',IOSTAT=IOS) JPART
  777. IF (IOS.NE.0) GOTO 9004
  778. IF (JPART.GT.NBMAIL) GOTO 9001
  779. WRITE(MYFMT,FMT='("(A",I2,")")') LONOM
  780. CNOM=CBUF(II3+6:)
  781. II5=INDEX(CNOM,'"')
  782. IF (II5.GT.0) CNOM=CNOM(1:II5-1)
  783. IF (CNOM.NE.TMAIL(JPART)) GOTO 9001
  784. ELSEIF (ZPART.OR.(II2.GT.0)) THEN
  785. GOTO 9001
  786. ENDIF
  787. KMAIL(JPART)=1
  788.  
  789. ENDDO
  790.  
  791. C - un des maillages specifies n'etait pas present dans les fichiers .vtu => 9001
  792. DO IMAI=1,NBMAIL
  793. IF (KMAIL(IMAI).EQ.0) GOTO 9001
  794. ENDDO
  795.  
  796.  
  797. C PAS D'ERREUR : on recupere l'indice du dernier p.d.t.
  798. CALL LENCHA(NOMFIC,NC)
  799. READ(CBUF(II4+NC+7:II4+NC+15),FMT='(A9)',IOSTAT=IOS) CHA9
  800. II4=INDEX(CHA9,'.')-1
  801. WRITE(MYFMT,FMT='("(I",I1,".",I1,")")',IOSTAT=IOS) II4,II4
  802. READ(CHA9(1:II4),FMT=MYFMT,IOSTAT=IO3) ITF
  803. IF (IOS.NE.0.OR.IO3.NE.0.OR.II4.EQ.-1) GOTO 9004
  804.  
  805.  
  806. C b) Si 'TEMP' est absent, on verifie que le .pvd ne contient pas de
  807. C champ 'timestep' mais uniquement un champ 'part' et un champ 'name'
  808. ELSE
  809.  
  810. C Lecture du dernier item puis recherche des champs 'timestep', 'part' et 'name'
  811. BACKSPACE(IOXML)
  812. READ(UNIT=IOXML,FMT='(A)') CBUF
  813. II1=INDEX(CBUF,'timestep=')
  814. II2=INDEX(CBUF,'part=')
  815. II3=INDEX(CBUF,'name=')
  816.  
  817. C DECLENCHEMENT D'UNE ERREUR SI :
  818. C - un champ 'timestep' est trouve => 9005
  819. C - 'timestep' est absent mais 'part' et/ou 'name' manquent => 9004
  820. IF (II1.GT.0) GOTO 9005
  821. IF (II2.EQ.0.OR.II3.EQ.0) GOTO 9004
  822.  
  823. C On retient le numero de la derniere 'part' creee
  824. C et on incremente les futures partitions en consequence
  825. READ(CBUF(II2+6:II3-3),FMT='(A4)',IOSTAT=IOS) CHA4
  826. IF (IOS.NE.0) GOTO 9004
  827. READ(CHA4,FMT='(I4)',IOSTAT=IOS) OLDPAR
  828. IF (IOS.NE.0) GOTO 9004
  829. DO IMAI=1,NBMAIL
  830. IPART(IMAI)=IPART(IMAI)+OLDPAR
  831. ENDDO
  832.  
  833. ENDIF
  834.  
  835. CLOSE(UNIT=IOXML)
  836. ENDIF
  837.  
  838.  
  839. C Pas d'erreur => on passe a la suite
  840. GOTO 9000
  841.  
  842.  
  843. C MESSAGES D'ERREUR : fichier .pvd incompatible et option 'SUIT'
  844. C ***************************************************************
  845. C ERREUR CRITIQUE 26 (Tache impossible. Probablement donnees erronees)
  846.  
  847. 9001 CONTINUE
  848. IF (IPVD.EQ.0) GOTO 9050
  849. CALL ERREUR(26)
  850. WRITE(IOIMP,*) 'VTK ''SUIT'' : le fichier existe deja et la ',
  851. . 'partition specifiee differe du p.d.t. precedent'
  852. GOTO 999
  853.  
  854. 9002 CONTINUE
  855. IF (IPVD.EQ.0) GOTO 9050
  856. CALL ERREUR(26)
  857. WRITE(IOIMP,*) 'VTK ''SUIT'' : le fichier existe deja et ',
  858. . 'n''est pas compatible avec l''option ''TEMP'''
  859. GOTO 999
  860.  
  861. 9003 CONTINUE
  862. IF (IPVD.EQ.0) GOTO 9050
  863. CALL ERREUR(26)
  864. WRITE(IOIMP,*) 'VTK ''SUIT'' : le fichier existe deja et la ',
  865. . 'valeur specifiee pour ''TEMP'' est trop petite'
  866. GOTO 999
  867.  
  868. 9004 CONTINUE
  869. ZEXIS=.FALSE.
  870. IF (IPVD.EQ.0) GOTO 9050
  871. CALL ERREUR(26)
  872. WRITE(IOIMP,*) 'VTK ''SUIT'' : le fichier existe deja mais ',
  873. . 'il semble corrompu...'
  874. GOTO 999
  875.  
  876. 9005 CONTINUE
  877. IF (IPVD.EQ.0) GOTO 9050
  878. CALL ERREUR(26)
  879. WRITE(IOIMP,*) 'VTK ''SUIT'' : le fichier existe deja et ',
  880. . 'requiert l''utilisation du mot-cle ''TEMP'''
  881. GOTO 999
  882. C ***************************************************************
  883.  
  884.  
  885. C Fichier .pvd incompatible et option 'AUTO'
  886. C => on continue mais le .pvd existant sera ecrase
  887. 9050 ZEXIS=.FALSE.
  888.  
  889.  
  890.  
  891.  
  892. C***********************************************************************
  893. C***********************************************************************
  894. C***********************************************************************
  895. C***********************************************************************
  896.  
  897.  
  898.  
  899.  
  900. C +---------------------------------------------------------------+
  901. C | |
  902. C | E C R I T U R E D E S F I C H I E R S . V T U |
  903. C | |
  904. C +---------------------------------------------------------------+
  905.  
  906. 9000 CONTINUE
  907.  
  908. C Lorsqu'il y a deja deux unites logiques XDR ouvertes (REST et
  909. C SAUV en l'occurence), l'ouverture d'une troisieme unite engendre
  910. C un bug critique (redemarrage du jeu de donnees !). On s'assure
  911. C que le fichier de RESTitution est bien ferme pour eviter cela.
  912. IF (IVTU.GT.0.AND.IXDRR.NE.0) THEN
  913. IOS= IXDRCLOSE(IXDRR,.true.)
  914. IXDRR=0
  915. ENDIF
  916.  
  917.  
  918. C Preparation de l'entete des fichiers
  919. CALL GIBDAT(IJOUR,IMOIS,IANNEE)
  920. IANNEE=MOD(IANNEE,100)+2000
  921. CALL GIBNAM(CHA8)
  922. CALL NETCHA(CHA8)
  923. WRITE(CHEAD,FMT='(A,I2.2,A1,I2.2,A1,I4,A)')
  924. . '<!-- PROGRAMME=CASTEM/SORVTK'//
  925. . ' UTILISATEUR='//CHA8(1:LONG(CHA8))//
  926. . ' DATE=',IJOUR,'/',IMOIS,'/',IANNEE,
  927. . ' TITRE='//NOMFIC(1:LONG(NOMFIC))//' -->'
  928. CALL LENCHA(CHEAD,LHEAD)
  929.  
  930.  
  931. C ---------------------
  932. C NOM DES FICHIERS .vtu
  933. C ---------------------
  934. C
  935. C repetoire/ nom_de_base.XXXXxxxxx.YYYY.vtu
  936. C |__________||___________|
  937. C NOM1 NOMFIC |
  938. C |_____________________| |
  939. C NOM2 |
  940. C |______________________________|
  941. C NOM3
  942. C
  943. C - XXXXxxxx : /!\ SEULEMENT SI L'OPTION 'TEMP' EST PRESENTE
  944. C => entier ecrit sur 4 a 9 caracteres et incremente
  945. C a chaque pas de temps sorti
  946. C
  947. C - YYYY : /!\ SEULMENT SI PLUSIEURS MAILLAGES SONT FOURNIS
  948. C OU SI ON SORT UN .PVD SANS OPTION 'TEMP'
  949. C => entier ecrit sur 4 caracteres indiquant l'indice
  950. C de la partition geometrie sortie
  951. C
  952. NOM2=NOMFIC
  953. IF (ZTEMP) THEN
  954. IPDT=ITF+1
  955. WRITE(CHA9,FMT='(I9.9)') IPDT
  956. LPDT=MAX(4,INT(LOG10(DBLE(IPDT)))+1)
  957. NOM2=NOM2(1:LONG(NOM2))//'.'//CHA9(10-LPDT:9)
  958. ENDIF
  959.  
  960.  
  961. C (BOUCLE SUR LES MAILLAGES)
  962. DO 100 IMAI=1,NBMAIL
  963.  
  964. C =============================================================
  965. C 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
  966. C =============================================================
  967.  
  968. C Determination du nom complet du fichier .vtu
  969. NOM3=NOM1(1:LONG(NOM1))//NOM2
  970. IF ((.NOT.ZTEMP.AND.IPVD.LT.3).OR.ZPART) THEN
  971. WRITE(CHA4,FMT='(I4.4)') IPART(IMAI)
  972. NOM3=NOM3(1:LONG(NOM3))//'.'//CHA4
  973. ENDIF
  974. NOM3=NOM3(1:LONG(NOM3))//'.vtu'
  975.  
  976.  
  977. C Commande d'ouverture du fichier XML
  978. OPEN(UNIT = IOXML,
  979. . FILE = NOM3,
  980. . STATUS = 'UNKNOWN',
  981. . FORM = 'FORMATTED',
  982. . ACCESS = 'SEQUENTIAL',
  983. . IOSTAT = IOS)
  984.  
  985.  
  986. C Commande d'ouverture du fichier binaire
  987. IF (IVTU.GT.0) THEN
  988. IOBIN=INITXDR(NOM3(1:LONG(NOM3))//'.bin','w',.FALSE.)
  989.  
  990. C Debut de la section binaire AppendedData
  991. IOS= IXDRINT(IOBIN,IXDR1)
  992. IPOS=0
  993. ENDIF
  994.  
  995.  
  996. C Ecriture des entetes
  997. WRITE(UNIT=IOXML,FMT='(A)',IOSTAT=IOS)
  998. . '<?xml version="1.0"?>'
  999.  
  1000. WRITE(UNIT=IOXML,FMT='(A)',IOSTAT=IOS)
  1001. . CHEAD(1:LHEAD)
  1002.  
  1003. IF (IVTU.EQ.0) THEN
  1004. WRITE(UNIT=IOXML,FMT='(A)',IOSTAT=IOS)
  1005. . '<VTKFile type="UnstructuredGrid" version="0.1">'
  1006. ELSE
  1007. WRITE(UNIT=IOXML,FMT='(A)',IOSTAT=IOS)
  1008. . '<VTKFile type="UnstructuredGrid" version="0.1"'//
  1009. . ' byte_order="BigEndian">'
  1010. ENDIF
  1011.  
  1012. WRITE(UNIT=IOXML,FMT='(4X,A)',IOSTAT=IOS)
  1013. . '<UnstructuredGrid>'
  1014.  
  1015.  
  1016.  
  1017.  
  1018. C =============================================================
  1019. C D O N N E E S G E O M E T R I Q U E S
  1020. C =============================================================
  1021. C NEL = nombre d'elements du maillage au total
  1022. C NNO = nombre de noeuds du maillage au total
  1023. C NBSOU = nombre de sous-maillages (un par type d'element)
  1024.  
  1025. IPT1=IMAIL(IMAI)
  1026. SEGACT,IPT1
  1027. NBSOU=IPT1.LISOUS(/1)
  1028. NBSOU1=MAX(1,NBSOU)
  1029.  
  1030. C Pour chaque MAILLAGE passe en argument, on doit :
  1031. C - remplir les tables de correspondance LOCAL <--> GLOBAL
  1032. C - determiner le nombre de noeuds au total
  1033. C - determiner le nombre d'elements au total
  1034. C - memoriser les caracteristiques des cellules (connectivite,
  1035. C offset, type d'element VTK)
  1036. C - si des MCHAML sont a sortir, memoriser le type et le nombre
  1037. C d'elements dans chaque sous-maillage
  1038.  
  1039. NEL=0
  1040. NEL1=0
  1041. NNO=0
  1042. NBCON=0
  1043. IOF=0
  1044. SEGINI,IPOG2L,IOFFS,ITYEL,ICONN
  1045. IF (NBCHML.GT.0) SEGINI,ITYPII,INECUM
  1046.  
  1047. C (BOUCLE SUR LES SOUS-MAILLAGES)
  1048. IPT2=IPT1
  1049. DO ISOU=1,NBSOU1
  1050. IF (NBSOU.GT.0) THEN
  1051. IPT2=IPT1.LISOUS(ISOU)
  1052. SEGACT,IPT2
  1053. ENDIF
  1054.  
  1055. C L'element est-il representable par VTK ?
  1056. ITYP=IPT2.ITYPEL
  1057. ITY=ITYVTK(ITYP)
  1058. IF (ITY.EQ.0) THEN
  1059. C ERREUR CRITIQUE 21 (Donnees incompatibles)
  1060. CALL ERREUR(21)
  1061. WRITE(IOIMP,*) 'Le maillage ',TMAIL(IMAI),
  1062. . ' comporte des elements ',NOMS(ITYP),
  1063. . ' incompatibles avec VTK'
  1064. GOTO 999
  1065. ENDIF
  1066.  
  1067. C On memorise les infos ci-dessous pour aller plus vite
  1068. C lors du traitement ulterieur des MCHAML
  1069. IF (NBCHML.GT.0) THEN
  1070. ITYPII(ITYP)=ISOU
  1071. INECUM(ISOU)=NEL
  1072. ENDIF
  1073.  
  1074. C (BOUCLE SUR LES ELEMENTS DU SOUS-MAILLAGE)
  1075. NN1=IPT2.NUM(/1)
  1076. NN2=IPT2.NUM(/2)
  1077. NEL=NEL+NN2
  1078. NEL1=NEL
  1079. NBCON=NBCON+(NN1*NN2)
  1080. SEGADJ,ICONN,IOFFS,ITYEL
  1081.  
  1082. DO I2=1,NN2
  1083. DO I1=1,NN1
  1084. IF (ITY.GE.20) THEN
  1085. C Correction pour les elements quadratiques
  1086. I3 = INUVTK(I1,ITY-20)
  1087. ELSE
  1088. I3 = I1
  1089. ENDIF
  1090. INUM=IPT2.NUM(I3,I2)
  1091. IPOG2L(INUM)=1
  1092. ICONN(IOF+I1)=INUM
  1093. ENDDO
  1094. IOF=IOF+NN1
  1095. IOFFS(NEL-NN2+I2)=IOF
  1096. ITYEL(NEL-NN2+I2)=ITY
  1097. ENDDO
  1098.  
  1099. IF (NBSOU.GT.0) SEGDES,IPT2
  1100. ENDDO
  1101.  
  1102.  
  1103. C (BOUCLE SUR LA TABLE GLOBALE IPOG2L)
  1104. NNO=NBCON
  1105. SEGINI,IPOL2G
  1106. NNO=0
  1107. DO I3=1,NPMAX
  1108. IF (IPOG2L(I3).EQ.1) THEN
  1109. NNO=NNO+1
  1110. IPOL2G(NNO)=I3
  1111. IPOG2L(I3)=NNO
  1112. ENDIF
  1113. ENDDO
  1114. IF (NNO.NE.NBCON) SEGADJ,IPOL2G
  1115.  
  1116. c
  1117.  
  1118.  
  1119. C ECRITURE DANS LE FICHIER
  1120. C *************************************************************
  1121. C *************************************************************
  1122.  
  1123. WRITE(CNU1,FMT='(I15)') NNO
  1124. WRITE(CNU2,FMT='(I15)') NEL
  1125. CALL LIMCHA(CNU1,ID1,IF1)
  1126. CALL LIMCHA(CNU2,ID2,IF2)
  1127. WRITE(UNIT=IOXML,FMT='(8X,A)',IOSTAT=IOS)
  1128. . '<Piece NumberOfPoints="'//CNU1(ID1:IF1)//
  1129. . '" NumberOfCells="'//CNU2(ID2:IF2)//'">'
  1130.  
  1131.  
  1132.  
  1133. C *****************************************************
  1134. C S E C T I O N P O I N T S
  1135. C *****************************************************
  1136.  
  1137. WRITE(UNIT=IOXML,FMT='(12X,A)',IOSTAT=IOS)
  1138. . '<Points>'
  1139.  
  1140. C ===================== FORMATE =====================
  1141. IF (IVTU.EQ.0) THEN
  1142. WRITE(UNIT=IOXML,FMT='(16X,A)',IOSTAT=IOS)
  1143. . '<DataArray type="'//FLDAT//'" NumberOfComponents="3" '//
  1144. . 'format="ascii">'
  1145.  
  1146. DO IK=1,NNO
  1147. II=IPOL2G(IK)-1
  1148.  
  1149. XRE8=XCOOR(II*IDIM1+1)
  1150. YRE8=XCOOR(II*IDIM1+2)
  1151. ZRE8=0.D0
  1152. IF (IDIM.EQ.3) ZRE8=XCOOR(II*IDIM1+3)
  1153.  
  1154. WRITE(MYFMT,FMT='("(20X,3",A8,")")') FMDAT
  1155. WRITE(UNIT=IOXML,FMT=MYFMT,IOSTAT=IOS)
  1156. . XRE8,YRE8,ZRE8
  1157. ENDDO
  1158.  
  1159. WRITE(UNIT=IOXML,FMT='(16X,A)',IOSTAT=IOS)
  1160. . '</DataArray>'
  1161.  
  1162.  
  1163. C ===================== BINAIRE =====================
  1164. ELSE
  1165.  
  1166. NBYTES=(3*NNO)*ISIZDA
  1167.  
  1168. WRITE(CNU1,FMT='(I15)') IPOS
  1169. IPOS=IPOS+ISIZNB+NBYTES
  1170.  
  1171. CALL LIMCHA(CNU1,ID1,IF1)
  1172. WRITE(UNIT=IOXML,FMT='(16X,A)',IOSTAT=IOS)
  1173. . '<DataArray type="'//FLDAT//'" NumberOfComponents="3" '//
  1174. . 'format="appended" offset="'//CNU1(ID1:IF1)//'" />'
  1175.  
  1176. IOS= IXDRINT(IOBIN,NBYTES)
  1177.  
  1178. IF (ZDOUB) THEN
  1179. DO IK=1,NNO
  1180. II=IPOL2G(IK)-1
  1181.  
  1182. XRE8=XCOOR(II*IDIM1+1)
  1183. YRE8=XCOOR(II*IDIM1+2)
  1184. ZRE8=0.D0
  1185. IF (IDIM.EQ.3) ZRE8=XCOOR(II*IDIM1+3)
  1186.  
  1187. IOS= IXDRDOUBLE(IOBIN,XRE8)
  1188. IOS= IXDRDOUBLE(IOBIN,YRE8)
  1189. IOS= IXDRDOUBLE(IOBIN,ZRE8)
  1190. ENDDO
  1191. ELSE
  1192. DO IK=1,NNO
  1193. II=IPOL2G(IK)-1
  1194.  
  1195. XRE4=REAL(XCOOR(II*IDIM1+1),4)
  1196. YRE4=REAL(XCOOR(II*IDIM1+2),4)
  1197. ZRE4=REAL(0.D0)
  1198. IF (IDIM.EQ.3) ZRE4=REAL(XCOOR(II*IDIM1+3),4)
  1199.  
  1200. IOS= IXDRREAL(IOBIN,XRE4)
  1201. IOS= IXDRREAL(IOBIN,YRE4)
  1202. IOS= IXDRREAL(IOBIN,ZRE4)
  1203. ENDDO
  1204. ENDIF
  1205.  
  1206. ENDIF
  1207.  
  1208. WRITE(UNIT=IOXML,FMT='(12X,A)',IOSTAT=IOS)
  1209. . '</Points>'
  1210.  
  1211.  
  1212. C *****************************************************
  1213. C S E C T I O N C E L L S
  1214. C *****************************************************
  1215.  
  1216. WRITE(UNIT=IOXML,FMT='(12X,A)',IOSTAT=IOS)
  1217. . '<Cells>'
  1218.  
  1219. C ===================== FORMATE =====================
  1220. IF (IVTU.EQ.0) THEN
  1221. WRITE(UNIT=IOXML,FMT='(16X,A)',IOSTAT=IOS)
  1222. . '<DataArray type="Int32" Name="connectivity" '//
  1223. . 'format="ascii">'
  1224.  
  1225. WRITE(UNIT=IOXML,FMT='(20X,8I10)',IOSTAT=IOS)
  1226. . ((IPOG2L(ICONN(K))-1),K=1,ICONN(/1))
  1227.  
  1228. WRITE(UNIT=IOXML,FMT='(16X,A)',IOSTAT=IOS)
  1229. . '</DataArray>'
  1230.  
  1231. C ----------------------
  1232.  
  1233. WRITE(UNIT=IOXML,FMT='(16X,A)',IOSTAT=IOS)
  1234. . '<DataArray type="Int32" Name="offsets" format="ascii">'
  1235.  
  1236. WRITE(UNIT=IOXML,FMT='(20X,8I10)',IOSTAT=IOS)
  1237. . (IOFFS(K),K=1,NEL)
  1238.  
  1239. WRITE(UNIT=IOXML,FMT='(16X,A)',IOSTAT=IOS)
  1240. . '</DataArray>'
  1241.  
  1242. C ----------------------
  1243.  
  1244. WRITE(UNIT=IOXML,FMT='(16X,A)',IOSTAT=IOS)
  1245. . '<DataArray type="UInt8" Name="types" format="ascii">'
  1246.  
  1247. WRITE(UNIT=IOXML,FMT='(20X,20I4)',IOSTAT=IOS)
  1248. . (ITYEL(K),K=1,NEL)
  1249.  
  1250. WRITE(UNIT=IOXML,FMT='(16X,A)',IOSTAT=IOS)
  1251. . '</DataArray>'
  1252.  
  1253.  
  1254. C ===================== BINAIRE =====================
  1255. ELSE
  1256. NBYTES=ICONN(/1)*4
  1257.  
  1258. WRITE(CNU1,FMT='(I15)') IPOS
  1259. IPOS=IPOS+ISIZNB+NBYTES
  1260.  
  1261. CALL LIMCHA(CNU1,ID1,IF1)
  1262. WRITE(UNIT=IOXML,FMT='(16X,A)',IOSTAT=IOS)
  1263. . '<DataArray type="Int32" Name="connectivity" '//
  1264. . 'format="appended" offset="'//CNU1(ID1:IF1)//'" />'
  1265.  
  1266. IOS= IXDRINT(IOBIN,NBYTES)
  1267.  
  1268. DO K=1,ICONN(/1)
  1269. INT8=IPOG2L(ICONN(K))-1
  1270. IOS=IXDRINT(IOBIN,INT8)
  1271. ENDDO
  1272.  
  1273. C ----------------------
  1274.  
  1275. NBYTES=NEL*4
  1276.  
  1277. WRITE(CNU1,FMT='(I15)') IPOS
  1278. IPOS=IPOS+ISIZNB+NBYTES
  1279.  
  1280. CALL LIMCHA(CNU1,ID1,IF1)
  1281. WRITE(UNIT=IOXML,FMT='(16X,A)',IOSTAT=IOS)
  1282. . '<DataArray type="Int32" Name="offsets" '//
  1283. . 'format="appended" offset="'//CNU1(ID1:IF1)//'" />'
  1284.  
  1285. IOS=IXDRINT(IOBIN,NBYTES)
  1286.  
  1287. DO K=1,NEL
  1288. INT8=IOFFS(K)
  1289. IOS=IXDRINT(IOBIN,INT8)
  1290. ENDDO
  1291.  
  1292. C ----------------------
  1293.  
  1294. C Groupement de quatre UInt8 en un seul Int32
  1295. C (pour prendre moins de place !)
  1296. NBYTES=NEL
  1297. NBTROP=NEL-(NBYTES/4)*4
  1298. IF (NBTROP.GT.0) THEN
  1299. NEL1=NEL+4-NBTROP
  1300. SEGADJ,ITYEL
  1301. NBYTES=NEL1
  1302. ENDIF
  1303.  
  1304. WRITE(CNU1,FMT='(I15)') IPOS
  1305. IPOS=IPOS+ISIZNB+NBYTES
  1306.  
  1307. CALL LIMCHA(CNU1,ID1,IF1)
  1308. WRITE(UNIT=IOXML,FMT='(16X,A)',IOSTAT=IOS)
  1309. . '<DataArray type="UInt8" Name="types" '//
  1310. . 'format="appended" offset="'//CNU1(ID1:IF1)//'" />'
  1311.  
  1312. IOS=IXDRINT(IOBIN,NBYTES)
  1313.  
  1314. K20=0
  1315. DO K2=1,(NBYTES/4)
  1316. INT8=0
  1317. DO K1=1,4
  1318. INT8=INT8+(256**(4-K1))*ITYEL(K20+K1)
  1319. ENDDO
  1320. IOS=IXDRINT(IOBIN,INT8)
  1321. K20=K20+4
  1322. ENDDO
  1323.  
  1324. ENDIF
  1325.  
  1326. WRITE(UNIT=IOXML,FMT='(12X,A)',IOSTAT=IOS)
  1327. . '</Cells>'
  1328.  
  1329. C *************************************************************
  1330. C *************************************************************
  1331. C FIN D'ECRITURE DANS LE FICHIER
  1332.  
  1333.  
  1334. SEGSUP,IPOL2G,ICONN,IOFFS,ITYEL
  1335.  
  1336.  
  1337.  
  1338.  
  1339.  
  1340. C =============================================================
  1341. C G R A N D E U R S D E F I N I E S A U X N O E U D S
  1342. C =============================================================
  1343.  
  1344. WRITE(UNIT=IOXML,FMT='(12X,A)',IOSTAT=IOS)
  1345. . '<PointData>'
  1346.  
  1347. C (BOUCLE SUR LES CHAMPS PAR POINTS)
  1348. DO 200 ICHP=1,NBCHPO
  1349.  
  1350. MCHPO1=ICHPO(ICHP)
  1351. SEGACT,MCHPO1
  1352.  
  1353. C NSOUPO = Nombre de sous-champs
  1354. NSOUPO=MCHPO1.IPCHP(/1)
  1355. IF (NSOUPO.EQ.0) GOTO 200
  1356.  
  1357.  
  1358. C 1) CREATION DE LA LISTE DES COMPOSANTES DANS TCHCO
  1359. C On cree cette liste avant toute chose et non pas au fur
  1360. C et a mesure pour eviter de faire des SEGADJ sur le gros
  1361. C segment SCHPV
  1362. JGN=LOCOMP
  1363. JGM=0
  1364. SEGINI,TCHCO
  1365. DO I1=1,NSOUPO
  1366. MSOUP1=MCHPO1.IPCHP(I1)
  1367. SEGACT,MSOUP1
  1368. NC=MSOUP1.NOCOMP(/2)
  1369. JGM1=JGM
  1370. DO 210 I2=1,NC
  1371. MOCOMP=MSOUP1.NOCOMP(I2)
  1372. DO I3=1,JGM1
  1373. IF (TCHCO.MOTS(I3).EQ.MOCOMP) GOTO 210
  1374. ENDDO
  1375. JGM=JGM+1
  1376. SEGADJ,TCHCO
  1377. TCHCO.MOTS(JGM)=MOCOMP
  1378. 210 CONTINUE
  1379. SEGDES,MSOUP1
  1380. ENDDO
  1381.  
  1382.  
  1383. C 2) CONCATENATION DE TOUS LES VPOCHA DANS XPOCHA
  1384. C - on ecrase la structure compliquee du CHPOINT dans un simple tableau (no.comp.;no.noeud)
  1385. C - on passe de la numerotation globale a la numerotation locale
  1386. NCO=JGM
  1387. SEGINI,SCHPV,ICOOK
  1388. DO 220 ISOU=1,NSOUPO
  1389. MSOUP1=MCHPO1.IPCHP(ISOU)
  1390. SEGACT,MSOUP1
  1391.  
  1392. MPOVA1=MSOUP1.IPOVAL
  1393. IF (MPOVA1.EQ.0) GOTO 219
  1394. SEGACT,MPOVA1
  1395.  
  1396. IPT2=MSOUP1.IGEOC
  1397. IF (IPT2.EQ.0) GOTO 218
  1398. SEGACT,IPT2
  1399.  
  1400. NN1=MPOVA1.VPOCHA(/1)
  1401. NC1=MPOVA1.VPOCHA(/2)
  1402.  
  1403. DO I1=1,NC1
  1404. C Recherche de la composante dans la liste TCHCO
  1405. CHA4=MSOUP1.NOCOMP(I1)
  1406. DO ICO=1,NCO
  1407. IF (TCHCO.MOTS(ICO).EQ.CHA4) GOTO 240
  1408. ENDDO
  1409.  
  1410. C MISE A JOUR DE SCHPV
  1411. C - si un noeud du support du SOUPO n'appartient pas au maillage courant, on passe au suivant
  1412. C - si un noeud du MAILLAGE courant n'est pas present dans le support du SOUPO, sa valeur reste a zero
  1413. 240 NTROUV=0
  1414. DO 250 I2=1,NN1
  1415. INO=IPOG2L(IPT2.NUM(1,I2))
  1416. IF (INO.EQ.0) GOTO 250
  1417. SCHPV.XPOCHA(ICO,INO)=SCHPV.XPOCHA(ICO,INO)
  1418. & +MPOVA1.VPOCHA(I2,I1)
  1419. NTROUV=1
  1420. 250 CONTINUE
  1421. IF (NTROUV.EQ.1) CALL AJOU(ICOOK,ICO)
  1422. ENDDO
  1423.  
  1424. SEGDES,IPT2
  1425. 218 SEGDES,MPOVA1
  1426. 219 SEGDES,MSOUP1
  1427. 220 CONTINUE
  1428.  
  1429. SEGDES,MCHPO1
  1430.  
  1431.  
  1432. C S'il n'y a rien a sortir, on passe au CHPOINT suivant
  1433. NCOK=ICOOK(/1)
  1434. IF (NCOK.EQ.0) GOTO 299
  1435. IF (NCOK.LT.NCO) CALL ORDO02(ICOOK(1),NCOK,.TRUE.)
  1436.  
  1437.  
  1438.  
  1439. C ECRITURE DANS LE FICHIER
  1440. C *********************************************************
  1441. C *********************************************************
  1442.  
  1443. CNOM=TCHPO(ICHP)
  1444.  
  1445. C ===================== FORMATE =====================
  1446. IF (IVTU.EQ.0) THEN
  1447.  
  1448. WRITE(CNU1,FMT='(I15)') NCOK
  1449. CALL LIMCHA(CNU1,ID1,IF1)
  1450.  
  1451. WRITE(UNIT=IOXML,
  1452. . FMT='(16X,A)',
  1453. . IOSTAT=IOS,
  1454. . ADVANCE="NO")
  1455. . '<DataArray type="'//FLDAT//'" '//
  1456. . 'Name="'//CNOM(1:LONG(CNOM))//'" '//
  1457. . 'NumberOfComponents="'//CNU1(ID1:IF1)//'" '
  1458.  
  1459. DO K=1,NCOK
  1460. CHA4=TCHCO.MOTS(ICOOK(K))
  1461. CALL LIMCHA(CHA4,ID4,IF4)
  1462. WRITE(UNIT=IOXML,
  1463. . FMT='(A,I0,A,A,A)',
  1464. . IOSTAT=IOS,
  1465. . ADVANCE="NO")
  1466. . 'ComponentName',K-1,'="',CHA4(ID4:IF4),'" '
  1467. ENDDO
  1468.  
  1469. WRITE(UNIT=IOXML,FMT='(A)',IOSTAT=IOS)
  1470. . 'format="ascii">'
  1471.  
  1472. WRITE(MYFMT,FMT='("(20X,",I2,A8,")")') NCOK,FMDAT
  1473. WRITE(UNIT=IOXML,FMT=MYFMT,IOSTAT=IOS)
  1474. . ((SCHPV.XPOCHA(ICOOK(K),J),K=1,NCOK),J=1,NNO)
  1475.  
  1476. WRITE(UNIT=IOXML,FMT='(16X,A)',IOSTAT=IOS)
  1477. . '</DataArray>'
  1478.  
  1479.  
  1480. C ===================== BINAIRE =====================
  1481. ELSE
  1482. NBYTES=(NCOK*NNO)*ISIZDA
  1483.  
  1484. WRITE(CNU1,FMT='(I15)') IPOS
  1485. IPOS=IPOS+ISIZNB+NBYTES
  1486.  
  1487. WRITE(CNU2,FMT='(I15)') NCOK
  1488. CALL LIMCHA(CNU1,ID1,IF1)
  1489. CALL LIMCHA(CNU2,ID2,IF2)
  1490.  
  1491. WRITE(UNIT=IOXML,
  1492. . FMT='(16X,A)',
  1493. . IOSTAT=IOS,
  1494. . ADVANCE="NO")
  1495. . '<DataArray type="'//FLDAT//'" '//
  1496. . 'Name="'//CNOM(1:LONG(CNOM))//'" '//
  1497. . 'NumberOfComponents="'//CNU2(ID2:IF2)//'" '
  1498.  
  1499. DO K=1,NCOK
  1500. CHA4=TCHCO.MOTS(ICOOK(K))
  1501. CALL LIMCHA(CHA4,ID4,IF4)
  1502. WRITE(UNIT=IOXML,
  1503. . FMT='(A,I0,A,A,A)',
  1504. . IOSTAT=IOS,
  1505. . ADVANCE="NO")
  1506. . 'ComponentName',K-1,'="',CHA4(ID4:IF4),'" '
  1507. ENDDO
  1508.  
  1509. WRITE(UNIT=IOXML,FMT='(A)',IOSTAT=IOS)
  1510. . 'format="appended" offset="'//CNU1(ID1:IF1)//'" />'
  1511.  
  1512. IOS=IXDRINT(IOBIN,NBYTES)
  1513.  
  1514. IF (ZDOUB) THEN
  1515. DO J=1,NNO
  1516. DO K=1,NCOK
  1517. XRE8=SCHPV.XPOCHA(ICOOK(K),J)
  1518. IOS=IXDRDOUBLE(IOBIN,XRE8)
  1519. ENDDO
  1520. ENDDO
  1521. ELSE
  1522. DO J=1,NNO
  1523. DO K=1,NCOK
  1524. XRE4=REAL(SCHPV.XPOCHA(ICOOK(K),J),4)
  1525. IOS=IXDRREAL(IOBIN,XRE4)
  1526. ENDDO
  1527. ENDDO
  1528. ENDIF
  1529. ENDIF
  1530.  
  1531. C *********************************************************
  1532. C *********************************************************
  1533. C FIN D'ECRITURE DANS LE FICHIER
  1534.  
  1535.  
  1536. 299 SEGSUP,SCHPV,TCHCO,ICOOK
  1537.  
  1538.  
  1539. 200 CONTINUE
  1540. C (FIN DE LA BOUCLE SUR LES CHAMPS PAR POINTS)
  1541.  
  1542. WRITE(UNIT=IOXML,FMT='(12X,A)',IOSTAT=IOS)
  1543. . '</PointData>'
  1544.  
  1545.  
  1546. SEGSUP,IPOG2L
  1547.  
  1548.  
  1549.  
  1550.  
  1551.  
  1552. C =============================================================
  1553. C G R A N D E U R S D E F I N I E S P A R E L E M E N T
  1554. C =============================================================
  1555.  
  1556. WRITE(UNIT=IOXML,FMT='(12X,A)',IOSTAT=IOS)
  1557. . '<CellData>'
  1558.  
  1559. C (BOUCLE SUR LES CHAMPS PAR ELEMENTS)
  1560. DO 300 ICHE=1,NBCHML
  1561.  
  1562. MCHEL1=ICHML(ICHE)
  1563. SEGACT,MCHEL1
  1564.  
  1565. C NSOCHA = Nombre de sous-champs
  1566. NSOCHA=MCHEL1.ICHAML(/1)
  1567. IF (NSOCHA.EQ.0) GOTO 300
  1568.  
  1569.  
  1570. C 1) CREATION DE LA LISTE DES COMPOSANTES DANS TCHCO
  1571. C On cree cette liste avant toute chose et non pas au fur
  1572. C et a mesure pour eviter de faire des SEGADJ sur le gros
  1573. C segment SCHMV
  1574. C + VERIFICATIONS SUR LE TYPE DE MCHAML
  1575. JGN=LOCOMP
  1576. JGM=0
  1577. SEGINI,TCHCO
  1578. DO I1=1,NSOCHA
  1579. MCHAM1=MCHEL1.ICHAML(I1)
  1580. SEGACT,MCHAM1
  1581.  
  1582. NC1=MCHAM1.IELVAL(/1)
  1583. JGM1=JGM
  1584. DO 310 I2=1,NC1
  1585.  
  1586. C VERIFICATION 1 : composante de type scalaire ?
  1587. IF (MCHAM1.TYPCHE(I2).NE.'REAL*8') THEN
  1588. C ERREUR CRITIQUE 679 (Le type de la composante %m1:8 du MCHAML est incorrect)
  1589. MOTERR=MCHAM1.NOMCHE(I2)
  1590. CALL ERREUR(679)
  1591. WRITE(IOIMP,*) '(le champ par elements "',
  1592. . TCHML(ICHE),'" contient des ',
  1593. . 'composantes non scalaires'
  1594. GOTO 999
  1595. ENDIF
  1596.  
  1597. C VERIFICATION 2 : une seule valeur par cellule ?
  1598. MELVA1=MCHAM1.IELVAL(I2)
  1599. SEGACT,MELVA1
  1600. IF (MELVA1.VELCHE(/1).NE.1) THEN
  1601. C ERREUR CRITIQUE 707 (Le MCHAML doit contenir une valeur (de chaque composante) par element)
  1602. CALL ERREUR(707)
  1603. WRITE(IOIMP,*) '(le champ par elements "',
  1604. . TCHML(ICHE),'" n''est pas de',
  1605. . ' type "GRAVITE")'
  1606. GOTO 999
  1607. ENDIF
  1608. SEGDES,MELVA1
  1609.  
  1610. C CREATION DE LA LISTE TCHCO
  1611. MOCOMP=MCHAM1.NOMCHE(I2)
  1612. DO I3=1,JGM1
  1613. IF (TCHCO.MOTS(I3).EQ.MOCOMP) GOTO 310
  1614. ENDDO
  1615. JGM=JGM+1
  1616. SEGADJ,TCHCO
  1617. TCHCO.MOTS(JGM)=MOCOMP
  1618. 310 CONTINUE
  1619.  
  1620. SEGDES,MCHAM1
  1621. ENDDO
  1622.  
  1623.  
  1624.  
  1625. C 2) CONCATENATION DE TOUS LES VELCHE DANS XELCHE
  1626. C - on ecrase la structure compliquee du MCHAML dans un simple tableau (no.comp.;no.cell.)
  1627. C - on passe de la numerotation globale a la numerotation locale
  1628. NCO=JGM
  1629. SEGINI,SCHMV,ICOOK
  1630. DO 320 I1=1,NSOCHA
  1631. MCHAM1=MCHEL1.ICHAML(I1)
  1632. SEGACT,MCHAM1
  1633.  
  1634. C IPT2 = SUPPORT DU SOUS-CHAMP DU MCHAML
  1635. IPT2=MCHEL1.IMACHE(I1)
  1636. SEGACT,IPT2
  1637. ITYP2=IPT2.ITYPEL
  1638. ITY2=ITYVTK(ITYP2)
  1639. IF (ITY2.EQ.0) THEN
  1640. C ERREUR CRITIQUE 21 (Donnees incompatibles)
  1641. CALL ERREUR(21)
  1642. WRITE(IOIMP,*) 'Le champ "',TCHML(ICHE),
  1643. . '" s''appuye sur des elements ',
  1644. . NOMS(ITYP),' incompatibles avec VTK'
  1645. GOTO 999
  1646. ENDIF
  1647. NEL2=IPT2.NUM(/2)
  1648.  
  1649.  
  1650. C IPT3 = SOUS-MELEME DU MAILLAGE COURANT CONSTITUE DU
  1651. C MEME TYPE D'ELEMENTS QUE IPT2
  1652. I3=ITYPII(ITYP2)
  1653. IF (I3.EQ.0) GOTO 319
  1654. IPT3=IPT1
  1655. IF (NBSOU.GT.0) THEN
  1656. IPT3=IPT1.LISOUS(I3)
  1657. SEGACT,IPT3
  1658. ENDIF
  1659. NNN3=IPT3.NUM(/1)
  1660. NEL3=IPT3.NUM(/2)
  1661.  
  1662.  
  1663. C On cherche pour chaque element de IPT2 un element de
  1664. C IPT3 qui possede les memes noeuds, dans le meme ordre
  1665. SEGINI,IELL2G
  1666. DO 330 IEL2=1,NEL2
  1667. DO 331 IEL3=1,NEL3
  1668. DO INO=1,NNN3
  1669. INUM2=IPT2.NUM(INO,IEL2)
  1670. INUM3=IPT3.NUM(INO,IEL3)
  1671. IF (INUM2.NE.INUM3) GOTO 331
  1672. ENDDO
  1673.  
  1674. C ON A TROUVE UN ELEMENT COMMUN A IPT2 ET IPT3
  1675. IELL2G(IEL2)=INECUM(I3)+IEL3
  1676. GOTO 330
  1677. 331 CONTINUE
  1678. 330 CONTINUE
  1679.  
  1680.  
  1681. C Remplissage de SCHMV pour chaque composante du SOCHA
  1682. DO 340 J1=1,NCO
  1683. MELVA1=MCHAM1.IELVAL(J1)
  1684. IF (MELVA1.EQ.0) GOTO 340
  1685. SEGACT,MELVA1
  1686. NBVAL=MELVA1.VELCHE(/2)
  1687.  
  1688. C Recherche de la composante dans la liste TCHCO
  1689. MOCOMP=MCHAM1.NOMCHE(J1)
  1690. DO ICO=1,NCO
  1691. IF (TCHCO.MOTS(ICO).EQ.MOCOMP) GOTO 350
  1692. ENDDO
  1693.  
  1694. C MISE A JOUR DE SCHMV
  1695. C - si une cellule du support du SOCHA n'appartient pas au maillage courant, on passe a la suivante
  1696. C - si une cellule du MAILLAGE courant n'est pas presente dans le support du SOCHA, sa valeur reste a zero
  1697. 350 NTROUV=0
  1698. DO 360 J2=1,NEL2
  1699. IEL=IELL2G(J2)
  1700. IF (IEL.EQ.0) GOTO 360
  1701. IF (NBVAL.EQ.1) THEN
  1702. C ATTENTION, le MELVA1 est uniforme !
  1703. SCHMV.XELCHE(ICO,IEL)=MELVA1.VELCHE(1,1)
  1704. ELSE
  1705. SCHMV.XELCHE(ICO,IEL)=MELVA1.VELCHE(1,J2)
  1706. ENDIF
  1707. NTROUV=1
  1708. 360 CONTINUE
  1709. IF (NTROUV.EQ.1) CALL AJOU(ICOOK,ICO)
  1710.  
  1711. SEGDES,MELVA1
  1712. 340 CONTINUE
  1713.  
  1714.  
  1715. SEGSUP,IELL2G
  1716.  
  1717. C /!\ IPT2 et IPT3 peuvent etre egaux a IPT1, or IPT1 doit rester actif !!
  1718. IF (NBSOU.GT.0) SEGDES,IPT3
  1719. 319 IF (IPT2.NE.IPT1) SEGDES,IPT2
  1720.  
  1721. SEGDES,MCHAM1
  1722.  
  1723. 320 CONTINUE
  1724.  
  1725. SEGDES,MCHEL1
  1726.  
  1727.  
  1728. C S'il n'y a rien a sortir, on passe au MCHAML suivant
  1729. NCOK=ICOOK(/1)
  1730. IF (NCOK.EQ.0) GOTO 399
  1731. IF (NCOK.LT.NCO) CALL ORDO02(ICOOK(1),NCOK,.TRUE.)
  1732.  
  1733.  
  1734.  
  1735.  
  1736. C ECRITURE DANS LE FICHIER
  1737. C *********************************************************
  1738. C *********************************************************
  1739.  
  1740. CNOM=TCHML(ICHE)
  1741.  
  1742. C ===================== FORMATE =====================
  1743. IF (IVTU.EQ.0) THEN
  1744.  
  1745. WRITE(CNU1,FMT='(I15)') NCOK
  1746. CALL LIMCHA(CNU1,ID1,IF1)
  1747. C
  1748. WRITE(UNIT=IOXML,
  1749. . FMT='(16X,A)',
  1750. . IOSTAT=IOS,
  1751. . ADVANCE="NO")
  1752. . '<DataArray type="'//FLDAT//'" '//
  1753. . 'Name="'//CNOM(1:LONG(CNOM))//'" '//
  1754. . 'NumberOfComponents="'//CNU1(ID1:IF1)//'" '
  1755.  
  1756. DO K=1,NCOK
  1757. MOCOMP=TCHCO.MOTS(ICOOK(K))
  1758. CALL LIMCHA(MOCOMP,ID4,IF4)
  1759. WRITE(UNIT=IOXML,
  1760. . FMT='(A,I0,A,A,A)',
  1761. . IOSTAT=IOS,
  1762. . ADVANCE="NO")
  1763. . 'ComponentName',K-1,'="',MOCOMP(ID4:IF4),'" '
  1764. ENDDO
  1765.  
  1766. WRITE(UNIT=IOXML,FMT='(A)',IOSTAT=IOS)
  1767. . 'format="ascii">'
  1768.  
  1769. WRITE(MYFMT,FMT='("(20X,",I2,A8,")")') NCOK,FMDAT
  1770. WRITE(UNIT=IOXML,FMT=MYFMT,IOSTAT=IOS)
  1771. . ((SCHMV.XELCHE(ICOOK(K),J),K=1,NCOK),J=1,NEL)
  1772.  
  1773. WRITE(UNIT=IOXML,FMT='(16X,A)',IOSTAT=IOS)
  1774. . '</DataArray>'
  1775.  
  1776.  
  1777. C ===================== BINAIRE =====================
  1778. ELSE
  1779. NBYTES=(NCOK*NEL)*ISIZDA
  1780.  
  1781. WRITE(CNU1,FMT='(I15)') IPOS
  1782. IPOS=IPOS+ISIZNB+NBYTES
  1783.  
  1784. WRITE(CNU2,FMT='(I15)') NCOK
  1785. CALL LIMCHA(CNU1,ID1,IF1)
  1786. CALL LIMCHA(CNU2,ID2,IF2)
  1787.  
  1788. WRITE(UNIT=IOXML,
  1789. . FMT='(16X,A)',
  1790. . IOSTAT=IOS,
  1791. . ADVANCE="NO")
  1792. . '<DataArray type="'//FLDAT//'" '//
  1793. . 'Name="'//CNOM(1:LONG(CNOM))//'" '//
  1794. . 'NumberOfComponents="'//CNU2(ID2:IF2)//'" '
  1795.  
  1796. DO K=1,NCOK
  1797. MOCOMP=TCHCO.MOTS(ICOOK(K))
  1798. CALL LIMCHA(MOCOMP,ID4,IF4)
  1799. WRITE(UNIT=IOXML,
  1800. . FMT='(A,I0,A,A,A)',
  1801. . IOSTAT=IOS,
  1802. . ADVANCE="NO")
  1803. . 'ComponentName',K-1,'="',MOCOMP(ID4:IF4),'" '
  1804. ENDDO
  1805.  
  1806. WRITE(UNIT=IOXML,FMT='(A)',IOSTAT=IOS)
  1807. . 'format="appended" offset="'//CNU1(ID1:IF1)//'" />'
  1808.  
  1809. IOS=IXDRINT(IOBIN,NBYTES)
  1810.  
  1811. IF (ZDOUB) THEN
  1812. DO J=1,NEL
  1813. DO K=1,NCOK
  1814. XRE8=SCHMV.XELCHE(ICOOK(K),J)
  1815. IOS=IXDRDOUBLE(IOBIN,XRE8)
  1816. ENDDO
  1817. ENDDO
  1818. ELSE
  1819. DO J=1,NEL
  1820. DO K=1,NCOK
  1821. XRE4=REAL(SCHMV.XELCHE(ICOOK(K),J),4)
  1822. IOS=IXDRREAL(IOBIN,XRE4)
  1823. ENDDO
  1824. ENDDO
  1825. ENDIF
  1826. ENDIF
  1827.  
  1828. C *********************************************************
  1829. C *********************************************************
  1830. C FIN D'ECRITURE DANS LE FICHIER
  1831.  
  1832.  
  1833. 399 SEGSUP,SCHMV,TCHCO,ICOOK
  1834.  
  1835.  
  1836. 300 CONTINUE
  1837. C (FIN DE LA BOUCLE SUR LES CHAMPS PAR ELEMENTS)
  1838.  
  1839. WRITE(UNIT=IOXML,FMT='(12X,A)',IOSTAT=IOS)
  1840. . '</CellData>'
  1841.  
  1842.  
  1843.  
  1844. SEGDES,IPT1
  1845. IF (NBCHML.GT.0) SEGSUP,ITYPII,INECUM
  1846.  
  1847.  
  1848.  
  1849.  
  1850. C =============================================================
  1851. C F E R M E T U R E D U F I C H I E R . V T U
  1852. C =============================================================
  1853.  
  1854. WRITE(UNIT=IOXML,FMT='(8X,A)',IOSTAT=IOS)
  1855. . '</Piece>'
  1856.  
  1857. WRITE(UNIT=IOXML,FMT='(4X,A)',IOSTAT=IOS)
  1858. . '</UnstructuredGrid>'
  1859.  
  1860.  
  1861. C CAS DES FICHIERS BINAIRES (OPTIONS 'BINA' OU 'ZIP')
  1862. C On doit recopier le contenu du fichier .bin dans la balise
  1863. C <AppendedData> du fichier .vtu
  1864. IF (IVTU.GT.0) THEN
  1865.  
  1866. WRITE(UNIT=IOXML,FMT='(4X,A)',IOSTAT=IOS)
  1867. . '<AppendedData encoding="raw">'
  1868.  
  1869. C Changement de mode d'ecriture ASCII->BINAIRE pour le .vtu
  1870. CLOSE(UNIT=IOXML)
  1871. IOBIN2=INITXDR(NOM3,'a',.FALSE.)
  1872.  
  1873. C Relecture et copie du fichier binaire
  1874. C (par paquets de 4 octets, "brique de base" de XDR)
  1875. IOS=IXDRCLOSE(IOBIN,.true.)
  1876. IOBIN=INITXDR(NOM3(1:LONG(NOM3))//'.bin','r',.FALSE.)
  1877. DO I=1,(1+(IPOS/4))
  1878. IOS=IXDRINT(IOBIN ,INT8)
  1879. IOS=IXDRINT(IOBIN2,INT8)
  1880. ENDDO
  1881.  
  1882. C Suppression du fichier binaire temporaire
  1883. IOS=IXDRCLOSE(IOBIN,.true.)
  1884. OPEN(UNIT = IOBIN,
  1885. . FILE = NOM3(1:LONG(NOM3))//'.bin')
  1886. CLOSE(UNIT=IOBIN,STATUS='DELETE')
  1887.  
  1888. C Insertion des marqueurs EOR et EOF pour que le contenu de
  1889. C la section binaire ne soit pas ecrase lors de la fermeture
  1890. C de la balise </AppendedData> (effectuee ci-apres)
  1891. IOS=IXDRINT(IOBIN2,IXDR2)
  1892. IOS=IXDRINT(IOBIN2,IXDR2)
  1893.  
  1894. C Changement de mode d'ecriture BINAIRE->ASCII pour le .vtu
  1895. IOS=IXDRCLOSE(IOBIN2,.true.)
  1896. OPEN(UNIT = IOXML ,
  1897. . FILE = NOM3 ,
  1898. . STATUS = 'UNKNOWN' ,
  1899. . FORM = 'FORMATTED' ,
  1900. . ACCESS = 'SEQUENTIAL' ,
  1901. . IOSTAT = IOS )
  1902. CALL FINFIC(IOXML)
  1903.  
  1904. WRITE(UNIT=IOXML,FMT='(4X,A)',IOSTAT=IOS)
  1905. . '</AppendedData>'
  1906.  
  1907. ENDIF
  1908.  
  1909. WRITE(UNIT=IOXML,FMT='(A)',IOSTAT=IOS)
  1910. . '</VTKFile>'
  1911.  
  1912.  
  1913. CLOSE(UNIT=IOXML)
  1914.  
  1915.  
  1916. 100 CONTINUE
  1917. C (FIN DE LA BOUCLE SUR LES MAILLAGES)
  1918.  
  1919.  
  1920.  
  1921.  
  1922.  
  1923. C***********************************************************************
  1924. C***********************************************************************
  1925. C***********************************************************************
  1926. C***********************************************************************
  1927.  
  1928.  
  1929.  
  1930.  
  1931. C +---------------------------------------------------------------+
  1932. C | |
  1933. C | E C R I T U R E D U F I C H I E R . P V D |
  1934. C | |
  1935. C +---------------------------------------------------------------+
  1936.  
  1937. C Nom du fichier .pvd
  1938. NOM3=NOM1(1:LONG(NOM1))//NOMFIC(1:LONG(NOMFIC))//'.pvd'
  1939.  
  1940.  
  1941. C 1) Option 'NPVD'
  1942. C => fin de la subroutine
  1943. IF (IPVD.EQ.3) GOTO 999
  1944.  
  1945.  
  1946. C 2) Option 'AUTO' ou 'SUIT' quand le .pvd existe et est compatible
  1947. C => on complete le .pvd
  1948.  
  1949. IF (IPVD.LT.2.AND.ZEXIS) THEN
  1950.  
  1951. C On se place a la fin du fichier existant puis...
  1952. OPEN(UNIT = IOXML ,
  1953. . FILE = NOM3 ,
  1954. . STATUS = 'OLD' ,
  1955. . FORM = 'FORMATTED' ,
  1956. . ACCESS = 'SEQUENTIAL' ,
  1957. . IOSTAT = IOS )
  1958. CALL FINFIC(IOXML)
  1959.  
  1960. C ...on recule de NLFOOTER enregistrements pour ecraser les
  1961. C balises de fermeture
  1962. DO I1=1,NLFOOTER
  1963. BACKSPACE(IOXML)
  1964. ENDDO
  1965.  
  1966.  
  1967. C 3) Option 'NOUV', ou pas de fichier existant et compatible
  1968. C => on cree le .pvd (ou on l'ecrase)
  1969. ELSE
  1970. OPEN(UNIT = IOXML ,
  1971. . FILE = NOM3 ,
  1972. . STATUS = 'UNKNOWN' ,
  1973. . FORM = 'FORMATTED' ,
  1974. . ACCESS = 'SEQUENTIAL' ,
  1975. . IOSTAT = IOS )
  1976. REWIND(IOXML)
  1977.  
  1978. WRITE(UNIT=IOXML,FMT='(A)',IOSTAT=IOS)
  1979. . '<?xml version="1.0"?>'
  1980.  
  1981. WRITE(UNIT=IOXML,FMT='(A)',IOSTAT=IOS)
  1982. . CHEAD(1:LHEAD)
  1983.  
  1984. WRITE(UNIT=IOXML,FMT='(A)',IOSTAT=IOS)
  1985. . '<VTKFile type="Collection" version="0.1">'
  1986.  
  1987. WRITE(UNIT=IOXML,FMT='(4X,A)',IOSTAT=IOS)
  1988. . '<Collection>'
  1989. ENDIF
  1990.  
  1991.  
  1992. DO IMAI=1,NBMAIL
  1993.  
  1994. C Indice de la partition mis sous forme d'une chaine de 4 caracteres
  1995. WRITE(CHA4,FMT='(I4.4)') IPART(IMAI)
  1996.  
  1997. C Nom de chaque fichier .vtu cree par cette execution de la subroutine
  1998. NOM3=NOM2
  1999. IF ((.NOT.ZTEMP.AND.IPVD.LT.3).OR.ZPART) THEN
  2000. NOM3=NOM3(1:LONG(NOM3))//'.'//CHA4
  2001. ENDIF
  2002. NOM3=NOM3(1:LONG(NOM3))//'.vtu'
  2003.  
  2004. C ECRITURE DE LA LIGNE CORRESPONDANTE DANS LA COLLECTION
  2005. C - champ 'timestep' : seulement avec l'option 'TEMP'
  2006. C - champ 'part' : en l'absence de 'TEMP', ou si plusieurs maillages etaient fournis
  2007. C - champ 'name' : idem que 'part'
  2008. C - champ 'file' : toujours !!
  2009. IF (ZTEMP) THEN
  2010.  
  2011. WRITE(MYFMT,FMT='("(",A8,")")') FMDAT
  2012. WRITE(CNU1,FMT=MYFMT,IOSTAT=IOS) XTPS
  2013. CALL LIMCHA(CNU1,ID1,IF1)
  2014.  
  2015. IF (ZPART) THEN
  2016. CNOM=TMAIL(IMAI)
  2017. WRITE(UNIT=IOXML,FMT='(8X,A)',IOSTAT=IOS)
  2018. . '<DataSet timestep="'//CNU1(ID1:IF1)//'" '//
  2019. . 'part="'//CHA4//'" '//
  2020. . 'name="'//CNOM(1:LONG(CNOM))//'" '//
  2021. . 'file="'//NOM3(1:LONG(NOM3))//'"/>'
  2022. ELSE
  2023. WRITE(UNIT=IOXML,FMT='(8X,A)',IOSTAT=IOS)
  2024. . '<DataSet timestep="'//CNU1(ID1:IF1)//'" '//
  2025. . 'file="'//NOM3(1:LONG(NOM3))//'"/>'
  2026. ENDIF
  2027. ELSE
  2028. CNOM=TMAIL(IMAI)
  2029. WRITE(UNIT=IOXML,FMT='(8X,A)',IOSTAT=IOS)
  2030. . '<DataSet part="'//CHA4//
  2031. . '" name="'//CNOM(1:LONG(CNOM))//
  2032. . '" file="'//NOM3(1:LONG(NOM3))//'"/>'
  2033. ENDIF
  2034. ENDDO
  2035.  
  2036.  
  2037. WRITE(UNIT=IOXML,FMT='(4X,A)',IOSTAT=IOS) '</Collection>'
  2038. WRITE(UNIT=IOXML,FMT='(A)',IOSTAT=IOS) '</VTKFile>'
  2039.  
  2040. CLOSE(UNIT=IOXML)
  2041.  
  2042.  
  2043.  
  2044.  
  2045. C***********************************************************************
  2046. C***********************************************************************
  2047. C***********************************************************************
  2048. C***********************************************************************
  2049.  
  2050.  
  2051.  
  2052.  
  2053. C +---------------------------------------------------------------+
  2054. C | |
  2055. C | F I N D E L A S U B R O U T I N E |
  2056. C | |
  2057. C +---------------------------------------------------------------+
  2058.  
  2059.  
  2060. 999 CONTINUE
  2061. SEGDES,SMAIL,SCHPO,SCHML
  2062.  
  2063.  
  2064. RETURN
  2065.  
  2066. END
  2067.  
  2068.  
  2069.  
  2070.  
  2071.  
  2072.  
  2073.  
  2074.  
  2075.  
  2076.  
  2077.  
  2078.  
  2079.  
  2080.  
  2081.  
  2082.  
  2083.  
  2084.  

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