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