1 /*============================================================================
2 * Définitions des fonctions de base
3 * réalisant les sorties pour post-traitement Ensight
4 *============================================================================*/
5
6 /*
7 This file is part of Code_Saturne, a general-purpose CFD tool.
8
9 Copyright (C) 1998-2021 EDF S.A.
10
11 This program is free software; you can redistribute it and/or modify it under
12 the terms of the GNU General Public License as published by the Free Software
13 Foundation; either version 2 of the License, or (at your option) any later
14 version.
15
16 This program is distributed in the hope that it will be useful, but WITHOUT
17 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
18 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
19 details.
20
21 You should have received a copy of the GNU General Public License along with
22 this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
23 Street, Fifth Floor, Boston, MA 02110-1301, USA.
24 */
25
26 /*----------------------------------------------------------------------------*/
27
28
29 /*============================================================================
30 * Visibilité
31 *============================================================================*/
32
33 /*----------------------------------------------------------------------------
34 * Fichiers `include' librairie standard C
35 *----------------------------------------------------------------------------*/
36
37 #include <assert.h>
38 #include <ctype.h> /* toupper() */
39 #include <stdio.h>
40 #include <string.h>
41
42
43 /*----------------------------------------------------------------------------
44 * Fichiers `include' visibles du paquetage global "Utilitaire"
45 *----------------------------------------------------------------------------*/
46
47 #include "ecs_def.h"
48 #include "ecs_file.h"
49 #include "ecs_mem.h"
50
51
52 /*----------------------------------------------------------------------------
53 * Fichier `include' du paquetage courant associé au fichier courant
54 *----------------------------------------------------------------------------*/
55
56 #include "ecs_post_ens.h"
57
58
59 /*----------------------------------------------------------------------------
60 * Fichiers `include' privés du paquetage courant
61 *----------------------------------------------------------------------------*/
62
63 #include "ecs_post_ens_priv.h"
64
65
66 /*============================================================================
67 * Fonctions privées
68 *============================================================================*/
69
70 /*----------------------------------------------------------------------------
71 * Fonction écrivant un fichier Case
72 *
73 * Cette fonction crée le répertoire correspondant si nécessaire
74 *----------------------------------------------------------------------------*/
75
76 static void
ecs_loc_post_ens__ecr_case(ecs_post_ens_t * cas_ens)77 ecs_loc_post_ens__ecr_case(ecs_post_ens_t *cas_ens)
78 {
79 ecs_file_t *fic_case;
80
81 /*xxxxxxxxxxxxxxxxxxxxxxxxxxx Instructions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
82
83 if (cas_ens->nom_fic_case == NULL) {
84
85 size_t ind;
86 char *nom_base;
87
88 ECS_MALLOC(nom_base,
89 strlen(cas_ens->nom_cas) + 1 + strlen(".ensight") + 1,
90 char);
91 strcpy(nom_base, cas_ens->nom_cas);
92 strcat(nom_base, ".ensight");
93
94 for (ind = 0; ind < strlen(cas_ens->nom_cas); ind++) {
95 if (nom_base[ind] == ' ')
96 nom_base[ind] = '_';
97 else
98 nom_base[ind] = tolower(nom_base[ind]);
99 }
100
101 /* Création du répertoire si possible */
102 /*------------------------------------*/
103
104 if (ecs_file_mkdir_default(nom_base) == 0) {
105
106 /* Nom du répertoire */
107
108 ECS_MALLOC(cas_ens->prefixe_rep,
109 strlen(nom_base) + strlen("/") + 1,
110 char);
111
112 strcpy(cas_ens->prefixe_rep, nom_base);
113 strcat(cas_ens->prefixe_rep, "/");
114
115 /* Préfixe des noms de fichiers */
116
117 ECS_MALLOC(cas_ens->prefixe_fic, strlen("mesh") + 1, char);
118
119 strcpy(cas_ens->prefixe_fic, "mesh");
120
121 /* Cas du fichier ".case" (nom en majuscules) */
122
123 ECS_MALLOC(cas_ens->nom_fic_case,
124 strlen(cas_ens->prefixe_rep) + strlen(cas_ens->prefixe_fic)
125 + strlen(".case") + 1, char);
126
127 strcpy(cas_ens->nom_fic_case, cas_ens->prefixe_rep);
128 strcat(cas_ens->nom_fic_case, cas_ens->prefixe_fic);
129
130 for (ind = strlen(cas_ens->prefixe_rep);
131 cas_ens->nom_fic_case[ind] != '\0';
132 ind++)
133 cas_ens->nom_fic_case[ind] = toupper(cas_ens->nom_fic_case[ind]);
134
135 strcat(cas_ens->nom_fic_case, ".case");
136
137 }
138 else {
139
140 /* Nom du répertoire */
141
142 ECS_MALLOC(cas_ens->prefixe_rep, 1, char);
143
144 strcpy(cas_ens->prefixe_rep, "");
145
146 /* Préfixe des noms de fichiers */
147
148 ECS_MALLOC(cas_ens->prefixe_fic,
149 strlen(nom_base) + strlen("_") + 1,
150 char);
151
152 strcpy(cas_ens->prefixe_fic, nom_base);
153 strcat(cas_ens->prefixe_fic, "_");
154
155 /* Cas du fichier ".case" (nom en majuscules) */
156
157 ECS_MALLOC(cas_ens->nom_fic_case,
158 strlen(nom_base) + strlen(".case") + 1,
159 char);
160
161 for (ind = 0; nom_base[ind] != '\0'; ind++)
162 nom_base[ind] = toupper(nom_base[ind]);
163
164 strcpy(cas_ens->nom_fic_case, nom_base);
165 strcat(cas_ens->nom_fic_case, "_");
166
167 strcat(cas_ens->nom_fic_case, ".case");
168 }
169
170 ECS_FREE(nom_base);
171
172 /* Info sur la création du fichier Case */
173 /*--------------------------------------*/
174
175 printf(" %s %s\n", _("Creating file:"), cas_ens->nom_fic_case);
176
177 }
178
179 /* Ouverture du fichier Case */
180 /*---------------------------*/
181
182 fic_case = ecs_file_open(cas_ens->nom_fic_case,
183 ECS_FILE_MODE_WRITE,
184 ECS_FILE_TYPE_TEXT);
185
186 /* Écriture de la section FORMAT */
187 /*-------------------------------*/
188
189 ecs_file_printf(fic_case,
190 "FORMAT\n"
191 "type: ensight gold\n\n");
192
193 /* Écriture de la section GEOMETRY */
194 /*---------------------------------*/
195
196 ecs_file_printf(fic_case, "GEOMETRY\n");
197
198 ecs_file_printf(fic_case,
199 "model: %s.geo\n\n",
200 cas_ens->prefixe_fic);
201
202 /* Fermeture du fichier Case */
203 /*---------------------------*/
204
205 ecs_file_free(fic_case);
206 cas_ens->modifie = false;
207 }
208
209 /*----------------------------------------------------------------------------
210 * Fonction vidant une structure `ecs_post_ens_part_t`
211 *----------------------------------------------------------------------------*/
212
213 static ecs_post_ens_part_t *
ecs_loc_post_ens__detruit_part(ecs_post_ens_part_t * this_part)214 ecs_loc_post_ens__detruit_part(ecs_post_ens_part_t *this_part)
215 {
216 ecs_int_t ind;
217
218 /*xxxxxxxxxxxxxxxxxxxxxxxxxxx Instructions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
219
220 ECS_FREE(this_part->nom_part);
221
222 this_part->num_part = 0;
223 this_part->nbr_som = 0;
224
225 if (this_part->nbr_typ_ele > 0) {
226
227 for (ind = 0; ind < this_part->nbr_typ_ele; ind ++)
228 ECS_FREE(this_part->nom_typ_ele[ind]);
229
230 ECS_FREE(this_part->nbr_ele_typ);
231 ECS_FREE(this_part->nom_typ_ele);
232
233 }
234
235 if (this_part->lst_parents != NULL)
236 ECS_FREE(this_part->lst_parents);
237
238 ECS_FREE(this_part);
239
240 return NULL;
241 }
242
243 /*============================================================================
244 * Fonctions publiques
245 *============================================================================*/
246
247 /*----------------------------------------------------------------------------
248 * Fonction initialisant une structure `ecs_post_ens_t`.
249 *----------------------------------------------------------------------------*/
250
251 ecs_post_ens_t *
ecs_post_ens__cree_cas(const char * nom_cas)252 ecs_post_ens__cree_cas(const char *nom_cas)
253 {
254 ecs_post_ens_t *cas_ens;
255
256 /*xxxxxxxxxxxxxxxxxxxxxxxxxxx Instructions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
257
258 /* Création de la structure `ecs_post_ens_t` */
259 /*-------------------------------------------*/
260
261 ECS_MALLOC(cas_ens, 1, ecs_post_ens_t);
262
263 /* Construction du nom */
264 /*---------------------*/
265
266 ECS_MALLOC(cas_ens->nom_cas, strlen(nom_cas) + 1, char);
267 strcpy(cas_ens->nom_cas, nom_cas);
268
269 /* Noms qui seront initialisés à la première écriture du fichier case */
270
271 cas_ens->prefixe_rep = NULL;
272 cas_ens->prefixe_fic = NULL;
273 cas_ens->nom_fic_case = NULL;
274
275 /* Champs relatifs au fichier géométrie */
276 /*--------------------------------------*/
277
278 cas_ens->nbr_part = 0;
279 cas_ens->tab_part = NULL;
280 cas_ens->fic_geo = NULL;
281
282 cas_ens->modifie = false;
283
284 return cas_ens;
285 }
286
287 /*----------------------------------------------------------------------------
288 * Fonction détruisant une structure `ecs_post_ens_t`.
289 *----------------------------------------------------------------------------*/
290
291 ecs_post_ens_t *
ecs_post_ens__detruit_cas(ecs_post_ens_t * cas_ens)292 ecs_post_ens__detruit_cas(ecs_post_ens_t *cas_ens)
293 {
294 ecs_int_t ind;
295
296 /*xxxxxxxxxxxxxxxxxxxxxxxxxxx Instructions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
297
298 if (cas_ens != NULL) {
299
300 /* Destruction du cas */
301
302 ECS_FREE(cas_ens->nom_cas);
303
304 ECS_FREE(cas_ens->prefixe_rep);
305 ECS_FREE(cas_ens->prefixe_fic);
306 ECS_FREE(cas_ens->nom_fic_case);
307
308 for (ind = 0; ind < cas_ens->nbr_part; ind ++)
309 ecs_loc_post_ens__detruit_part(cas_ens->tab_part[ind]);
310
311 if (cas_ens->nbr_part != 0)
312 ECS_FREE(cas_ens->tab_part);
313
314 if (cas_ens->fic_geo != NULL)
315 ecs_file_free(cas_ens->fic_geo);
316
317 ECS_FREE(cas_ens);
318 }
319
320 return cas_ens;
321 }
322
323 /*----------------------------------------------------------------------------
324 * Écriture d'une chaîne de caractères dans un fichier EnSight Gold.
325 *----------------------------------------------------------------------------*/
326
327 void
ecs_post_ens__ecr_chaine(const ecs_file_t * fic,const char * chaine)328 ecs_post_ens__ecr_chaine(const ecs_file_t *fic,
329 const char *chaine)
330 {
331 char ligne[83];
332 size_t ind;
333
334 strncpy(ligne, chaine, 80);
335
336 for (ind = strlen(chaine); ind < 80; ind++)
337 ligne[ind] = ' ';
338 ecs_file_write(ligne, sizeof(char), 80, fic);
339 }
340
341 /*----------------------------------------------------------------------------
342 * Écriture d'un entier dans un fichier EnSight Gold.
343 *----------------------------------------------------------------------------*/
344
345 void
ecs_post_ens__ecr_int(const ecs_file_t * fic,int val)346 ecs_post_ens__ecr_int(const ecs_file_t *fic,
347 int val)
348 {
349 int32_t _val = val;
350
351 ecs_file_write(&_val, sizeof(int32_t), 1, fic);
352 }
353
354 /*----------------------------------------------------------------------------
355 * Fonction écrivant le fichier contenant la géométrie
356 *----------------------------------------------------------------------------*/
357
358 ecs_file_t *
ecs_post_ens__ecrit_fic_geo(ecs_post_ens_t * cas_ens)359 ecs_post_ens__ecrit_fic_geo(ecs_post_ens_t *cas_ens)
360 {
361 char ligne_cas[81];
362 char *nom_cas;
363 char *nom_fic_geo;
364
365 /*xxxxxxxxxxxxxxxxxxxxxxxxxxx Instructions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
366
367 /* Si le répertoire et le fichier .case n'ont pas encore été
368 crées, on les crée. */
369
370 ecs_loc_post_ens__ecr_case(cas_ens);
371
372 /* Si le fichier géométrie est simplement fermé, on le réouvre */
373 /*-------------------------------------------------------------*/
374
375 if (cas_ens->fic_geo != NULL) {
376 ecs_file_open_stream(cas_ens->fic_geo, ECS_FILE_MODE_APPEND);
377 return cas_ens->fic_geo;
378 }
379
380 /* Construction du nom du fichier contenant la géométrie */
381 /*-------------------------------------------------------*/
382
383 ECS_MALLOC(nom_fic_geo,
384 strlen(cas_ens->prefixe_rep) + strlen(cas_ens->prefixe_fic)
385 + strlen(".geo") + 1,
386 char);
387
388 strcpy(nom_fic_geo, cas_ens->prefixe_rep);
389 strcat(nom_fic_geo, cas_ens->prefixe_fic);
390 strcat(nom_fic_geo, ".geo");
391
392 /* Ouverture du fichier contenant la géométrie */
393 /*---------------------------------------------*/
394
395 cas_ens->fic_geo = ecs_file_open(nom_fic_geo,
396 ECS_FILE_MODE_WRITE,
397 ECS_FILE_TYPE_BINARY);
398
399 ecs_post_ens__ecr_chaine(cas_ens->fic_geo, "C binary");
400
401 /* Info sur la création du fichier contenant la géométrie */
402 /*--------------------------------------------------------*/
403
404 printf(" %s %s\n", _("Creating file:"), nom_fic_geo);
405
406 /* Écriture des 2 premières lignes de commentaires */
407 /*-------------------------------------------------*/
408
409 ECS_MALLOC(nom_cas, strlen(cas_ens->prefixe_rep) + 1, char);
410 strcpy(nom_cas, cas_ens->prefixe_rep);
411 strtok(nom_cas, ".");
412
413 ecs_post_ens__ecr_chaine(cas_ens->fic_geo,
414 "EnSight Gold output by Code_Saturne Preprocessor");
415
416 strcpy(ligne_cas, "Case name: ");
417 strncpy(ligne_cas + strlen(ligne_cas), nom_cas, 80 - strlen(ligne_cas));
418
419 ecs_post_ens__ecr_chaine(cas_ens->fic_geo, ligne_cas);
420
421 ECS_FREE(nom_cas);
422
423 ECS_FREE(nom_fic_geo);
424
425 /* Ensight se chargera d'affecter des labels */
426 /*-------------------------------------------*/
427
428 ecs_post_ens__ecr_chaine(cas_ens->fic_geo, "node id assign");
429 ecs_post_ens__ecr_chaine(cas_ens->fic_geo, "element id assign");
430
431 return cas_ens->fic_geo;
432 }
433
434 /*----------------------------------------------------------------------------*/
435
436
437