1 /*============================================================================
2  *  Programme principal de l'Enveloppe du Code_Saturne
3  *============================================================================*/
4 
5 /*
6   This file is part of Code_Saturne, a general-purpose CFD tool.
7 
8   Copyright (C) 1998-2021 EDF S.A.
9 
10   This program is free software; you can redistribute it and/or modify it under
11   the terms of the GNU General Public License as published by the Free Software
12   Foundation; either version 2 of the License, or (at your option) any later
13   version.
14 
15   This program is distributed in the hope that it will be useful, but WITHOUT
16   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17   FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
18   details.
19 
20   You should have received a copy of the GNU General Public License along with
21   this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
22   Street, Fifth Floor, Boston, MA 02110-1301, USA.
23 */
24 
25 /*----------------------------------------------------------------------------*/
26 
27 
28 /*============================================================================
29  *                                 Visibilité
30  *============================================================================*/
31 
32 #include "cs_config.h"
33 
34 
35 /*----------------------------------------------------------------------------
36  *  Fichiers `include' librairie standard C
37  *----------------------------------------------------------------------------*/
38 
39 #include <assert.h>
40 #include <locale.h>
41 #include <stdlib.h>
42 #include <string.h>
43 
44 
45 /*----------------------------------------------------------------------------
46  *  Fichiers `include' système
47  *----------------------------------------------------------------------------*/
48 
49 
50 /*----------------------------------------------------------------------------
51  *  Fichiers `include' visibles du  paquetage global "Utilitaire"
52  *----------------------------------------------------------------------------*/
53 
54 #include "ecs_comm.h"
55 #include "ecs_def.h"
56 #include "ecs_file.h"
57 #include "ecs_mem.h"
58 #include "ecs_mem_usage.h"
59 #include "ecs_tab.h"
60 #include "ecs_timer.h"
61 
62 
63 /*----------------------------------------------------------------------------
64  *  Fichiers `include' visibles du  paquetage global "Pre-Post-Traitement"
65  *----------------------------------------------------------------------------*/
66 
67 #include "ecs_post.h"
68 #include "ecs_pre.h"
69 
70 
71 /*----------------------------------------------------------------------------
72  *  Fichiers `include' visibles des paquetages visibles
73  *----------------------------------------------------------------------------*/
74 
75 #include "ecs_maillage.h"
76 #include "ecs_maillage_post.h"
77 #include "ecs_maillage_ncs.h"
78 
79 
80 /*----------------------------------------------------------------------------
81  *  Fichiers `include' visibles du  paquetage courant
82  *----------------------------------------------------------------------------*/
83 
84 #include "ecs_cmd.h"
85 
86 
87 /*----------------------------------------------------------------------------
88  *  Fichier `include' du paquetage courant associé au fichier courant
89  *----------------------------------------------------------------------------*/
90 
91 
92 /*----------------------------------------------------------------------------
93  *  Fichiers `include' privés du  paquetage courant
94  *----------------------------------------------------------------------------*/
95 
96 
97 /*----------------------------------------------------------------------------
98  *  Variables globales statiques
99  *----------------------------------------------------------------------------*/
100 
101 
102 /*============================================================================
103  *                              Fonctions privées
104  *============================================================================*/
105 
106 /*----------------------------------------------------------------------------
107  *  Fonction affichant la taille théorique d'un maillage
108  *----------------------------------------------------------------------------*/
109 
110 static void
_aff_taille_maillage(const ecs_maillage_t * maillage)111 _aff_taille_maillage(const ecs_maillage_t *maillage)
112 {
113   size_t       pr_size;
114   double       f_size;
115   int          nb_div;
116   static char  unit_prefix[] = {' ', 'K', 'M', 'G'};
117 
118   f_size = ecs_maillage__ret_taille(maillage);
119 
120   for (nb_div = 0; f_size > 1024. && nb_div < 3; nb_div++)
121     f_size /= 1024.;
122 
123   printf(_("  Theoretical mesh size:       %15.3f %cb\n"),
124          f_size, unit_prefix[nb_div]);
125 
126   f_size = ecs_mem_size_current();
127 
128   for (nb_div = 1; f_size > 1024.0 && nb_div < 3; nb_div++)
129     f_size /= 1024.;
130 
131   printf(_("  Theoretical current memory:  %15.3f %cb\n"),
132          f_size, unit_prefix[nb_div]);
133 
134   f_size = ecs_mem_size_max();
135 
136   for (nb_div = 1; f_size > 1024.0 && nb_div < 3; nb_div++)
137     f_size /= 1024.;
138 
139   printf(_("  Theoretical peak memory:     %15.3f %cb\n"),
140          f_size, unit_prefix[nb_div]);
141 
142   pr_size = ecs_mem_usage_max_pr_size();
143 
144   if (pr_size > 0) {
145 
146     f_size = pr_size;
147 
148     for (nb_div = 1; f_size > 1024.0 && nb_div < 3; nb_div++)
149       f_size /= 1024.;
150 
151     printf(_("  Total memory used:           %15.3f %cb\n"),
152            f_size, unit_prefix[nb_div]);
153 
154   }
155 }
156 
157 /*----------------------------------------------------------------------------
158  *  Fonction qui lit les maillages sur fichiers
159  *
160  *  La fonction renvoie le maillage concaténé
161  *----------------------------------------------------------------------------*/
162 
163 static ecs_maillage_t *
_lit_maillage(const ecs_cmd_t * cmd)164 _lit_maillage(const ecs_cmd_t *cmd)
165 {
166   int              ific;
167 
168   ecs_maillage_t  *maillage = NULL;
169   ecs_maillage_t  *maillage_lu = NULL;
170 
171   /*xxxxxxxxxxxxxxxxxxxxxxxxxxx Instructions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
172 
173   for (ific = 0; ific < cmd->n_num_maillage; ific++) {
174 
175     /* Chargement de la structure */
176 
177     maillage_lu = ecs_pre__lit_maillage(cmd->fic_maillage,
178                                         cmd->fmt_maillage,
179                                         cmd->num_maillage[ific],
180                                         cmd->grp_cel_section,
181                                         cmd->grp_cel_zone,
182                                         cmd->grp_fac_section,
183                                         cmd->grp_fac_zone);
184 
185     if (ific == 0)
186       maillage = maillage_lu;
187 
188     else
189       ecs_maillage__concatene_nodal(maillage, maillage_lu);
190 
191   } /* Fin : boucle sur les fichiers de maillage à lire */
192 
193   if (cmd->n_num_maillage == 1)
194     printf (_("\nDone reading mesh"
195               "\n-----------------\n"));
196   else
197     printf (_("\nDone reading and concatenating meshes"
198               "\n-------------------------------------\n"));
199 
200   if (cmd->nbr_dump > 0)
201     ecs_maillage__imprime(maillage, cmd->nbr_dump);
202 
203   _aff_taille_maillage(maillage);
204 
205   /* Retour du maillage                                        */
206   /*  construit à partir de la concaténation des maillages lus */
207 
208   return maillage;
209 }
210 
211 /*----------------------------------------------------------------------------
212  *  Fonction qui prépare un cas de post traitement si nécessaire
213  *----------------------------------------------------------------------------*/
214 
215 static ecs_post_t *
_init_post(const ecs_cmd_t * cmd)216 _init_post(const ecs_cmd_t *cmd)
217 {
218   ecs_post_t     *cas_post;
219 
220   /*xxxxxxxxxxxxxxxxxxxxxxxxxxx Instructions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
221 
222   cas_post = ecs_post__cree_cas(cmd->nom_cas);
223 
224   if (!strcmp(cmd->post_err, "ens"))
225     cas_post->opt_ens[ECS_POST_TYPE_ERREUR] = true;
226   if (!strcmp(cmd->post_vol, "ens"))
227     cas_post->opt_ens[ECS_POST_TYPE_VOLUME] = true;
228 
229 #if defined(HAVE_CGNS)
230   if (!strcmp(cmd->post_err, "cgns"))
231     cas_post->opt_cgns[ECS_POST_TYPE_ERREUR] = true;
232   if (!strcmp(cmd->post_vol, "cgns"))
233     cas_post->opt_cgns[ECS_POST_TYPE_VOLUME] = true;
234 #endif
235 
236 #if defined(HAVE_MED)
237   if (!strcmp(cmd->post_err, "med"))
238     cas_post->opt_med[ECS_POST_TYPE_ERREUR] = true;
239   if (!strcmp(cmd->post_vol, "med"))
240     cas_post->opt_med[ECS_POST_TYPE_VOLUME] = true;
241 #endif
242 
243   return cas_post;
244 }
245 
246 /*----------------------------------------------------------------------------
247  *  Impression de cellules (ou faces pour une maillage de peau uniquement)
248  *   correspondant à un critère de sélection donné
249  *----------------------------------------------------------------------------*/
250 
251 static void
_post_ele_liste(ecs_maillage_t * maillage,const ecs_tab_int_t liste_filtre,const char * nom,ecs_post_type_t type_post,ecs_post_t * cas_post)252 _post_ele_liste(ecs_maillage_t       *maillage,
253                 const ecs_tab_int_t   liste_filtre,
254                 const char           *nom,
255                 ecs_post_type_t       type_post,
256                 ecs_post_t           *cas_post)
257 {
258   ecs_maillage_t  *maillage_post;
259 
260   /*xxxxxxxxxxxxxxxxxxxxxxxxxxx Instructions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
261 
262   maillage_post
263     = ecs_maillage__extrait(maillage,
264                             (   ecs_maillage__ret_entmail_max(maillage)
265                              == ECS_ENTMAIL_CEL ?
266                                 ECS_ENTMAIL_CEL : ECS_ENTMAIL_FAC),
267                             &liste_filtre);
268 
269   ecs_maillage_post__ecr(nom,
270                          maillage_post,
271                          type_post,
272                          cas_post);
273 
274   ecs_maillage__detruit(&maillage_post);
275 }
276 
277 /*----------------------------------------------------------------------------
278  *  Affiche les temps d'exécution
279  *----------------------------------------------------------------------------*/
280 
281 static void
_chrono_total(void)282 _chrono_total(void)
283 {
284   double  utime;
285   double  stime;
286   double  time_cpu;
287   double  time_tot;
288 
289   /*xxxxxxxxxxxxxxxxxxxxxxxxxxx Instructions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
290 
291   printf(_("\n\nTime and memory summary\n"
292            "-----------------------\n\n")) ;
293 
294   ecs_timer_cpu_times(&utime, &stime) ;
295 
296   if (utime > 0. || stime > 0.)
297     time_cpu = utime + stime;
298 
299   else
300     time_cpu = ecs_timer_cpu_time() ;
301 
302   /* (heure de fin d'execution) - (heure de debut d'execution) */
303 
304   if (utime > 0. || stime > 0.) {
305 
306     printf("  ") ;
307     ecs_print_padded_str(_("User CPU time                       (sec)"),
308                          ECS_LNG_AFF_STR) ;
309     printf(" : %*.*f\n",
310            ECS_LNG_AFF_REE_MANTIS, ECS_LNG_AFF_REE_PRECIS,
311            (float)utime);
312 
313     printf("  ") ;
314     ecs_print_padded_str(_("System CPU time                     (sec)"),
315                          ECS_LNG_AFF_STR) ;
316     printf(" : %*.*f\n",
317            ECS_LNG_AFF_REE_MANTIS, ECS_LNG_AFF_REE_PRECIS,
318            (float)stime);
319   }
320 
321   else if (time_cpu > 0.) {
322 
323     printf("  ") ;
324     ecs_print_padded_str(_("Total CPU time                      (sec)"),
325                          ECS_LNG_AFF_STR) ;
326     printf(" : %*.*f\n",
327            ECS_LNG_AFF_REE_MANTIS, ECS_LNG_AFF_REE_PRECIS,
328            (float)time_cpu);
329   }
330 
331   /* Durée d'exécution  */
332 
333   time_tot = ecs_timer_wtime();
334 
335   if (time_tot > 0.) {
336 
337     printf("  ") ;
338     ecs_print_padded_str(_("Total time                          (sec)"),
339                          ECS_LNG_AFF_STR) ;
340     printf(" : %*.*f\n",
341            ECS_LNG_AFF_REE_MANTIS, ECS_LNG_AFF_REE_PRECIS,
342            (float)time_tot);
343 
344     if (time_cpu > 0.) {
345 
346       printf("  ") ;
347       ecs_print_padded_str(_("Total CPU time / Total time              "),
348                            ECS_LNG_AFF_STR) ;
349       printf(" : %*.*f\n",
350              ECS_LNG_AFF_REE_MANTIS, ECS_LNG_AFF_REE_PRECIS,
351              (float)(time_cpu/time_tot));
352 
353     }
354 
355   }
356 }
357 
358 /*============================================================================
359  *                             Fonction principale
360  *============================================================================*/
361 
362 int
main(int argc,char * argv[])363 main(int    argc,
364      char  *argv[])
365 {
366   ecs_cmd_t         *cmd;
367 
368   /* Communication avec le noyau */
369 
370   bool               passe_verif;
371 
372   ecs_maillage_t    *maillage;
373 
374   ecs_post_t        *cas_post;
375 
376   ecs_tab_int_t      liste_cel_err;
377 
378   /*xxxxxxxxxxxxxxxxxxxxxxxxxxx Instructions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
379 
380   ecs_init_gestion_erreur();
381 
382 #if defined(ENABLE_NLS)
383 
384   if (getenv("LANG") != NULL)
385      setlocale(LC_ALL,"");
386   else
387      setlocale(LC_ALL,"C");
388   setlocale(LC_NUMERIC,"C");
389 
390   bindtextdomain (PACKAGE, LOCALEDIR);
391   textdomain(PACKAGE);
392 
393 #endif
394 
395   /* Initialisation comptage et gestion mémoire */
396 
397   ecs_mem_usage_init();
398 
399   ecs_mem_init(getenv("CS_PREPROCESS_MEM_LOG"));
400 
401 
402   /* Lecture de la ligne de commande */
403 
404   cmd = ecs_cmd__lit_arg(argc, argv);
405 
406 
407   /*==========================================================================*/
408   /* Lecture des fichiers d'entrée contenant les maillages                    */
409   /*==========================================================================*/
410 
411   maillage = _lit_maillage(cmd);
412 
413   ecs_maillage__calc_coo_ext(maillage);
414 
415 
416   /*==========================================================================*/
417   /* Tri des types géométriques pour post-traitement                          */
418   /*==========================================================================*/
419 
420   ecs_maillage__trie_typ_geo(maillage);
421   printf("\n");
422 
423   /*========================================================================*/
424   /* Passages des couleurs et groupes aux familles                          */
425   /* (se fait dès que tous les éléments pouvant porter des familles sont    */
426   /*  fusionnés)                                                            */
427   /*========================================================================*/
428 
429   printf(_("\n\n"
430            "Defining families\n"
431            "-----------------\n\n"));
432 
433   ecs_maillage__cree_famille(maillage);
434 
435 
436   /*==========================================================================*/
437   /* Préparation du Post-traitement                                           */
438   /*==========================================================================*/
439 
440   cas_post = _init_post(cmd);
441 
442 
443   /*==========================================================================*/
444   /* Vérification et correction éventuelle de l'orientation des éléments      */
445   /*==========================================================================*/
446 
447   liste_cel_err.nbr     = 0;
448   liste_cel_err.val     = NULL;
449 
450   ecs_maillage__orient_nodal(maillage,
451                              &liste_cel_err,
452                              cmd->correct_orient);
453 
454 
455   /*==========================================================================*/
456   /* Écriture de la connectivité nodale sur fichier pour Post-traitement      */
457   /*==========================================================================*/
458 
459   if (cas_post != NULL) {
460 
461     ecs_maillage_post__ecr(_("Fluid Domain"),
462                            maillage,
463                            ECS_POST_TYPE_VOLUME,
464                            cas_post);
465 
466     if (liste_cel_err.nbr > 0)
467       _post_ele_liste(maillage,
468                       liste_cel_err,
469                       _("Orientation Error"),
470                       ECS_POST_TYPE_ERREUR,
471                       cas_post);
472 
473   }
474 
475 
476   /* On libère les listes des éléments avec problème d'orientation */
477 
478   if (liste_cel_err.nbr > 0) {
479     ECS_FREE(liste_cel_err.val);
480     liste_cel_err.nbr = 0;
481   }
482 
483 
484   /*==========================================================================*/
485   /* Création de la table de connectivité descendante                         */
486   /*==========================================================================*/
487 
488   /* Passage en connectivité descendante */
489 
490   ecs_maillage__connect_descend(maillage);
491 
492   printf (_("\nEnd of conversion to descending connectivity"
493             "\n--------------------------------------------\n"));
494 
495   _aff_taille_maillage(maillage);
496 
497 
498   /*========================================================================*/
499   /* Vérification du maillage                                               */
500   /*========================================================================*/
501 
502   if (ecs_maillage__ret_entmail_max(maillage) == ECS_ENTMAIL_CEL) {
503 
504     passe_verif = ecs_maillage__verif(maillage, cas_post);
505 
506     if (passe_verif == false) {
507 
508       ecs_warn();
509       printf(_("The mesh has face -> cell connectivity errors.\n"
510                "We can go no further."));
511 
512     }
513 
514   }
515   else {
516 
517     passe_verif = false;
518 
519     ecs_warn();
520     printf(_("The mesh does not contain volume elements.\n"
521              "We can go no further."));
522 
523   }
524 
525 
526   /* Tous les post-traitements sont terminés à ce stade */
527 
528   ecs_post__detruit_cas(cas_post);
529 
530 
531   /*========================================================================*/
532   /* Envoi des informations pour le noyau                                   */
533   /*========================================================================*/
534 
535   if (passe_verif == true)
536     ecs_maillage_ncs__ecr(cmd->nom_out, maillage);
537 
538 
539   /*==========================================================================*/
540   /* Libération en mémoire des structures de maillage                         */
541   /*==========================================================================*/
542 
543   ecs_maillage__detruit(&maillage);
544 
545   ecs_cmd__detruit(cmd);
546 
547   _chrono_total();
548 
549   /* Bilan mémoire */
550 
551   {
552     int    nb_div;
553     double f_size;
554     size_t pr_size;
555     static char  unit_prefix[] = {'K', 'M', 'G'};
556 
557     printf(_("\nMemory use summary:\n\n"));
558 
559     pr_size = ecs_mem_usage_max_pr_size();
560 
561     if (pr_size > 0) {
562       f_size = pr_size;
563       for (nb_div = 0; f_size > 1024. && nb_div < 2; nb_div++)
564         f_size /= 1024.;
565       printf(_("  Total memory used:                         %15.3f %cb\n"),
566              f_size, unit_prefix[nb_div]);
567     }
568 
569     f_size = ecs_mem_size_max();
570     for (nb_div = 0; f_size > 1024. && nb_div < 2; nb_div++)
571       f_size /= 1024.;
572     printf(_("  Theoretical instrumented dynamic memory:   %15.3f %cb\n"),
573            f_size, unit_prefix[nb_div]);
574 
575   }
576 
577 
578   ecs_mem_end();
579   ecs_mem_usage_end();
580 
581   /*---------------------------------------------------------*/
582   /* Impression d'un message de fin normale du préprocesseur */
583   /*---------------------------------------------------------*/
584 
585   printf(_("\n\n"
586            "  .-----------------------.\n"
587            "  |                       |\n"
588            "  |  Preprocessor finish  |\n"
589            "  |                       |\n"
590            "  `-----------------------'\n"
591            "\n\n"));
592 
593 
594   if (passe_verif == false)
595     return EXIT_FAILURE;
596 
597   else
598     return EXIT_SUCCESS;
599 
600 }
601 
602 /*----------------------------------------------------------------------------*/
603