Télécharger sorvtk.eso

Retour à la liste

Numérotation des lignes :

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

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