1
/*============================================================================
2
* Définition de la fonction
3
* de lecture d'un fichier de maillage au format Gmsh
4
*============================================================================*/
7
This file is part of Code_Saturne, a general-purpose CFD tool.
9
Copyright (C) 1998-2011 EDF S.A.
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
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
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.
26
/*----------------------------------------------------------------------------*/
28
/*----------------------------------------------------------------------------
29
* Fichiers `include' librairie standard C
30
*----------------------------------------------------------------------------*/
38
/*----------------------------------------------------------------------------
39
* Fichiers `include' visibles du paquetage global "Utilitaire"
40
*----------------------------------------------------------------------------*/
43
#include "ecs_elt_typ_liste.h"
49
/*----------------------------------------------------------------------------
50
* Fichiers `include' visibles des paquetages visibles
51
*----------------------------------------------------------------------------*/
53
#include "ecs_descr.h"
54
#include "ecs_maillage.h"
55
#include "ecs_maillage_priv.h"
58
/*----------------------------------------------------------------------------
59
* Fichiers `include' visibles du paquetage courant
60
*----------------------------------------------------------------------------*/
62
#include "ecs_maillage_pre.h"
65
/*----------------------------------------------------------------------------
66
* Fichier `include' du paquetage courant associé au fichier courant
67
*----------------------------------------------------------------------------*/
69
#include "ecs_pre_gmsh.h"
72
/*----------------------------------------------------------------------------
73
* Fichiers `include' privés du paquetage courant
74
*----------------------------------------------------------------------------*/
77
/*============================================================================
78
* Définitions de paramètres-macros
79
*============================================================================*/
81
#define ECS_GMSH_NBR_TYP_ELT 15 /* Nombre de types d'éléments Gmsh */
82
#define ECS_GMSH_NBR_MAX_SOM 27 /* Nombre max de noeuds par élément
83
(27 pour hexaèdre parabolique) */
86
/* Valeurs associées aux dimensionnements pour la lecture des lignes */
88
#define ECS_LOC_LNG_MAX_CHAINE_GMSH 514 /* Dimension des chaînes de réception
91
/*============================================================================
92
* Définitions de types
93
*============================================================================*/
96
GMSH_SEG2 = 1, /* 1 */
106
GMSH_TETRA10, /* 11 */
107
GMSH_HEXA27, /* 12 */
108
GMSH_PENTA18, /* 13 */
109
GMSH_PYRA14, /* 14 */
111
} ecs_gmsh_elt_typ_t;
115
ecs_gmsh_elt_typ_t gmsh_typ ; /* Type Gmsh de l'élément */
116
ecs_elt_typ_t ecs_typ ; /* Type ECS de l'élément */
117
ecs_int_t nbr_som ; /* Nombre de sommets */
118
/* Liste des numéros de sommet ECS */
119
ecs_int_t num_som[ECS_GMSH_NBR_MAX_SOM];
123
/*============================================================================
124
* Définitions de variables globales statiques
125
*============================================================================*/
127
const ecs_gmsh_elt_t ecs_gmsh_elt_liste_c[ECS_GMSH_NBR_TYP_ELT] = {
136
ECS_ELT_TYP_FAC_TRIA ,
142
ECS_ELT_TYP_FAC_QUAD ,
148
ECS_ELT_TYP_CEL_TETRA ,
154
ECS_ELT_TYP_CEL_HEXA ,
156
{ 1, 2, 3, 4, 5, 6, 7, 8 } ,
160
ECS_ELT_TYP_CEL_PRISM ,
166
ECS_ELT_TYP_CEL_PYRAM ,
178
ECS_ELT_TYP_FAC_TRIA ,
184
ECS_ELT_TYP_FAC_QUAD ,
190
ECS_ELT_TYP_CEL_TETRA ,
196
ECS_ELT_TYP_CEL_HEXA ,
198
{ 1, 2, 3, 4, 5, 6, 7, 8 } ,
202
ECS_ELT_TYP_CEL_PRISM ,
208
ECS_ELT_TYP_CEL_PYRAM ,
220
/*============================================================================
222
*============================================================================*/
224
/*----------------------------------------------------------------------------
225
* Lecture et vérification de la version du format (pour version 2.0)
226
*----------------------------------------------------------------------------*/
229
ecs_loc_pre_gmsh__lit_vers_format(ecs_file_t *fic_maillage,
234
char chaine[ECS_LOC_LNG_MAX_CHAINE_GMSH];
239
/* Décodage de la chaine de version */
241
ecs_file_gets(chaine, ECS_LOC_LNG_MAX_CHAINE_GMSH, fic_maillage, num_ligne);
243
retour = sscanf(chaine,"%f %d %d", &fversion, type, &taille_coo);
246
ecs_error(__FILE__, __LINE__, 0,
247
_("The Gmsh version specification of file\n"
248
"\"%s\" is invalid or unreadable.)"));
250
if (*type != 0 && *type != 1)
251
ecs_error(__FILE__, __LINE__, 0,
252
_("The Gmsh type specification of file\n"
253
"\"%s\" is neither 0 (text file) nor 1 (binary file).\n"
254
"This case is currently not handled."));
256
printf(_(" Gmsh format version: %2.1f\n"
257
" Size given for real numbers: %d\n\n"),
258
fversion, taille_coo);
260
*version = (int) fversion;
266
ecs_file_set_type(fic_maillage, ECS_FILE_TYPE_BINARY);
267
ecs_file_read(&un, 4, 1, fic_maillage);
269
ecs_file_set_swap_endian(fic_maillage, 1);
271
ecs_file_set_type(fic_maillage, ECS_FILE_TYPE_TEXT);
272
ecs_file_gets(chaine, 2, fic_maillage, num_ligne);
276
/* Ligne de fin de rubrique */
278
ecs_file_gets(chaine, ECS_LOC_LNG_MAX_CHAINE_GMSH, fic_maillage, num_ligne);
280
if (strncmp(chaine, "$EndMeshFormat", strlen("$EndMeshFormat")) != 0)
281
ecs_error(__FILE__, __LINE__, 0,
282
_("The Gmsh format version specification end for file\n"
283
"\"%s\" is not present at the expected place.)"));
286
/*----------------------------------------------------------------------------
287
* Lecture des coordonnées des noeuds
288
*----------------------------------------------------------------------------*/
291
ecs_loc_pre_gmsh__lit_nodes(ecs_maillage_t *maillage,
292
ecs_file_t *fic_maillage,
295
ecs_int_t **som_val_label)
297
char chaine[ECS_LOC_LNG_MAX_CHAINE_GMSH];
300
/* Variables Gmsh lues */
308
/* Stockage avant transfert */
310
ecs_int_t ind_nod = 0;
312
ecs_coord_t * som_val_coord;
314
/*xxxxxxxxxxxxxxxxxxxxxxxxxxx Instructions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
316
/* Initialisations */
317
/*=================*/
319
/* Décodage du nombre de noeuds */
321
ecs_file_gets(chaine, ECS_LOC_LNG_MAX_CHAINE_GMSH, fic_maillage, num_ligne);
323
nbr_nod = (ecs_int_t)(atol(chaine));
325
/* Allocation mémoire associée */
327
ECS_MALLOC(som_val_coord, nbr_nod * 3, ecs_coord_t);
328
ECS_MALLOC(*som_val_label, nbr_nod, ecs_int_t);
330
/* Boucle de lecture des noeuds */
331
/*==============================*/
333
if (type_fmt_gmsh == 0) {
335
for (ind_nod = 0; ind_nod < nbr_nod; ind_nod++) {
337
ecs_file_gets(chaine,
338
ECS_LOC_LNG_MAX_CHAINE_GMSH,
342
retour = sscanf(chaine,"%ld %lg %lg %lg",
343
&label, coord, coord+1, coord+2);
346
ecs_error(__FILE__, __LINE__, 0,
347
_("Error decoding line %ld of file\n\"%s\" :\n"
348
"The description of point <%ld> was expected in the form "
350
(long)(*num_ligne), ecs_file_get_name(fic_maillage),
353
/* Étiquette du noeud lu */
355
(*som_val_label)[ind_nod] = (ecs_int_t)label;
357
/* Coordonnées du noeud lu */
359
for (icoo = 0; icoo < 3; icoo++)
360
som_val_coord[ind_nod * 3 + icoo] = (ecs_coord_t)(coord[icoo]);
367
ecs_file_set_type(fic_maillage, ECS_FILE_TYPE_BINARY);
369
for (ind_nod = 0; ind_nod < nbr_nod; ind_nod++) {
373
ecs_file_read(&((*som_val_label)[ind_nod]), sizeof(int), 1, fic_maillage);
374
ecs_file_read(&xyz, sizeof(double), 3, fic_maillage);
376
for (icoo = 0; icoo < 3; icoo++)
377
som_val_coord[ind_nod * 3 + icoo] = xyz[icoo];
381
ecs_file_set_type(fic_maillage, ECS_FILE_TYPE_TEXT);
383
ecs_file_gets(chaine, 2, fic_maillage, num_ligne);
387
/* Ligne de fin de rubrique */
389
ecs_file_gets(chaine, ECS_LOC_LNG_MAX_CHAINE_GMSH, fic_maillage, num_ligne);
391
if ( (strncmp(chaine, "$EndNodes", strlen("$EndNodes")) != 0)
392
&& (strncmp(chaine, "$ENDNOD", strlen("$ENDNOD")) != 0))
393
ecs_error(__FILE__, __LINE__, 0,
394
_("The end of the points list specification of file\n"
395
"\"%s\" is not present at the expected place.)"),
396
ecs_file_get_name(fic_maillage));
398
/* Transfert des valeurs lues dans la structure d'entité de maillage */
399
/*===================================================================*/
401
ecs_maillage_pre__cree_som(maillage,
406
/*----------------------------------------------------------------------------
407
* Lecture de la table de connectivité
408
*----------------------------------------------------------------------------*/
411
ecs_loc_pre_gmsh__lit_elements(ecs_maillage_t *maillage,
412
ecs_file_t *fic_maillage,
413
int version_fmt_gmsh,
417
ecs_int_t **som_val_label)
419
char chaine[ECS_LOC_LNG_MAX_CHAINE_GMSH];
422
/* Variables Gmsh lues */
429
ecs_int_t nbr_elt_lus;
430
ecs_int_t nbr_elt_tot;
431
ecs_int_t ind_nod_elt;
432
ecs_int_t ind_som_elt;
433
ecs_int_t nbr_som_elt;
434
ecs_int_t ind_tag_elt;
435
ecs_int_t nbr_tag_elt;
441
ecs_int_t nbr_nod_elt_gmsh;
442
ecs_int_t num_nod_elt_gmsh[ECS_GMSH_NBR_MAX_SOM];
448
ecs_int_t cpt_coul_ent[ECS_N_ENTMAIL]; /* Compteur de couleurs */
449
ecs_int_t *val_coul_ent[ECS_N_ENTMAIL]; /* Tableau valeurs des couleurs */
450
ecs_size_t *cpt_elt_coul_ent[ECS_N_ENTMAIL];
452
/* Stockage avant transfert */
453
/*--------------------------*/
455
size_t cpt_elt_ent [ECS_N_ENTMAIL]; /* Nombre d'elems/entite */
457
ecs_size_t *elt_pos_som_ent [ECS_N_ENTMAIL]; /* Positions numeros som */
458
ecs_int_t *elt_val_som_ent [ECS_N_ENTMAIL]; /* Numeros des sommets */
459
ecs_int_t *elt_val_color_ent [ECS_N_ENTMAIL]; /* Couleurs */
461
ecs_int_t cpt_are = 0;
462
ecs_int_t cpt_point = 0;
464
bool ligne_decodee = true;
466
/*xxxxxxxxxxxxxxxxxxxxxxxxxxx Instructions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
468
/* Initialisations */
469
/*=================*/
471
/* Décodage du nombre d'éléments (toutes dimensions confondues */
473
ecs_file_gets(chaine, ECS_LOC_LNG_MAX_CHAINE_GMSH, fic_maillage, num_ligne);
475
nbr_elt = (ecs_int_t)(atol(chaine));
477
/* Allocations des tableaux locaux */
478
/*=================================*/
480
/* Attention au decalage de `1' !!! */
481
/* On n'alloue pas les tableaux locaux pour */
482
/* `ECS_ENTMAIL_DEB = ECS_ENTMAIL_SOM' */
484
for (ient = ECS_ENTMAIL_FAC; ient < ECS_N_ENTMAIL; ient++) {
486
cpt_elt_ent [ient] = 0;
488
cpt_coul_ent [ient] = 0 ;
489
cpt_elt_coul_ent [ient] = NULL;
490
val_coul_ent [ient] = NULL;
495
On surdimensionne les tableaux de lecture des éléments; on les
496
redimensionnera à la fin.
499
for (ient = ECS_ENTMAIL_FAC; ient < ECS_N_ENTMAIL; ient++) {
501
ECS_MALLOC(elt_val_color_ent[ient], nbr_elt, ecs_int_t);
502
ECS_MALLOC(elt_pos_som_ent[ient], nbr_elt, ecs_size_t);
504
elt_pos_som_ent[ient][0] = 1;
508
Plus "gros" élément linéaire disponible :
509
- quadrangle (4 sommets) pour les faces
510
- hexaèdre (8 sommets) pour les cellules.
513
ECS_MALLOC(elt_val_som_ent[ECS_ENTMAIL_FAC], nbr_elt * 4, ecs_int_t);
514
ECS_MALLOC(elt_val_som_ent[ECS_ENTMAIL_CEL], nbr_elt * 8, ecs_int_t);
517
/* Boucle de lecture des éléments */
518
/*================================*/
520
if (type_fmt_gmsh == 0) {
522
for (ind_elt = 0; ind_elt < nbr_elt; ind_elt++) {
524
if (ligne_decodee == false)
527
ligne_decodee = false;
529
ecs_file_gets(chaine, ECS_LOC_LNG_MAX_CHAINE_GMSH,
530
fic_maillage, num_ligne);
532
/* Au format Gmsh 1.0, pour chaque élément, on a les entiers suivants :
533
label type num_ent_phys num_ent_elem nb_sommets <liste_sommets> */
535
/* Au format Gmsh 2.0, pour chaque élément, on a les entiers suivants :
536
label type nb_tags <tag> <liste_sommets> */
538
/* Lecture du label de l'élément courant */
540
ssch = strtok(chaine, " ");
546
/* Lecture du type de l'élément courant */
548
ssch = strtok(NULL, " ");
552
type_gmsh = atoi(ssch);
554
if (type_gmsh < (int)GMSH_SEG2 || type_gmsh > (int) GMSH_POINT1)
555
ecs_error(__FILE__, __LINE__, 0,
556
_("Error reading a Gmsh mesh file:\n"
557
"at line %ld of file \"%s\".\n"
558
"Type identifier <%d> for element <%ld> is not recognized."),
559
(long)(*num_ligne), ecs_file_get_name(fic_maillage),
560
(int)type_gmsh, (long)label);
562
type_ecs = ecs_gmsh_elt_liste_c[type_gmsh - 1].ecs_typ;
563
nbr_nod_elt_gmsh = ecs_gmsh_elt_liste_c[type_gmsh - 1].nbr_som;
564
nbr_som_elt = ecs_fic_elt_typ_liste_c[type_ecs].nbr_som;
566
if (type_gmsh == GMSH_POINT1) {
568
ligne_decodee = true;
571
else if (type_gmsh == GMSH_SEG2 || type_gmsh == GMSH_SEG3) {
573
ligne_decodee = true;
577
/* Lecture des "tags" de l'élément courant */
581
if (version_fmt_gmsh == 2) {
583
ssch = strtok(NULL, " ");
587
nbr_tag_elt = (ecs_int_t)(atol(ssch));
589
for (ind_tag_elt = 0; ind_tag_elt < nbr_tag_elt; ind_tag_elt++) {
591
ssch = strtok(NULL, " ");
595
/* Par défaut, Gmsh écrit des fichiers avec 2 "tags",
596
le premier correspondant à un numéro d'entité physique,
597
le second à une entité géométrique élémentaire;
598
on associe le premier à une couleur */
600
if (ind_tag_elt == 0)
601
coul_elt = (ecs_int_t)(atol(ssch));
605
if (ssch == NULL && ind_tag_elt < nbr_tag_elt)
609
else { /* Ancienne version 1 du format Gmsh */
611
/* On interprête reg-phys (numéro d'entité physique) comme
614
ssch = strtok(NULL, " ");
618
coul_elt = (ecs_int_t)(atol(ssch));
620
/* On saute la valeur reg-elem (numéro d'entité élémentaire) */
622
ssch = strtok(NULL, " ");
626
/* On saute le nombre de noeuds, redondant */
628
ssch = strtok(NULL, " ");
634
/* Lecture des numéros des sommets de l'élément courant */
636
for (ind_nod_elt = 0; ind_nod_elt < nbr_nod_elt_gmsh; ind_nod_elt++) {
638
ssch = strtok(NULL, " ");
642
num_nod_elt_gmsh[ind_nod_elt] = (ecs_int_t)(atol(ssch));
645
if (ssch == NULL && ind_nod_elt < nbr_nod_elt_gmsh)
648
ligne_decodee = true;
650
/* Stockage des valeurs avant transfert dans la structure `maillage' */
651
/*===================================================================*/
653
/* Identification de l'entité concernée */
655
ent_num = ecs_maillage_pre__ret_typ_geo(type_ecs);
657
/* Position des numéros de sommets du prochain élément */
659
elt_pos_som_ent[ent_num][cpt_elt_ent[ent_num] + 1] =
660
elt_pos_som_ent[ent_num][cpt_elt_ent[ent_num]] + nbr_som_elt;
662
/* Connectivité de l'élément par ses numéros de sommets */
664
for (ind_som_elt = 0; ind_som_elt < nbr_som_elt; ind_som_elt++) {
668
[elt_pos_som_ent[ent_num][cpt_elt_ent[ent_num]] - 1 + ind_som_elt]
670
[ecs_gmsh_elt_liste_c[type_gmsh - 1].num_som[ind_som_elt] - 1];
674
/* Couleur (tag) de l'élément lu */
677
while (icoul < cpt_coul_ent[ent_num] &&
678
val_coul_ent[ent_num][icoul] != coul_elt)
681
if (icoul == cpt_coul_ent[ent_num]) {
683
/* La valeur de la couleur n'a pas encore été stockée */
685
ECS_REALLOC(val_coul_ent[ent_num] , cpt_coul_ent[ent_num] + 1,
687
ECS_REALLOC(cpt_elt_coul_ent[ent_num], cpt_coul_ent[ent_num] + 1,
689
cpt_elt_coul_ent[ent_num][icoul] = 0;
690
val_coul_ent[ent_num][icoul] = coul_elt;
691
cpt_coul_ent[ent_num]++;
695
cpt_elt_coul_ent[ent_num][icoul]++;
696
elt_val_color_ent[ent_num][cpt_elt_ent[ent_num]] = icoul + 1;
698
/* Incrémentation du nombre d'éléments lus */
700
cpt_elt_ent[ent_num]++;
704
/* Fin de la boucle de lecture sur les éléments
705
(et sur les lignes du fichier) */
707
if (ligne_decodee == false)
708
ecs_error(__FILE__, __LINE__, 0,
709
_("Error decoding line %ld "
710
"(corresponding to element <%ld>) of file\n"
712
(long)(*num_ligne), (long)(ind_elt+1),
713
ecs_file_get_name(fic_maillage));
718
ecs_file_set_type(fic_maillage, ECS_FILE_TYPE_BINARY);
721
nbr_elt_tot = nbr_elt;
723
while (nbr_elt_lus != nbr_elt_tot) {
725
ecs_file_read(&header, 4, 3, fic_maillage);
727
type_gmsh = header[0];
729
nbr_tag_elt = header[2];
731
if (type_gmsh < (int)GMSH_SEG2 || type_gmsh > (int) GMSH_POINT1)
732
ecs_error(__FILE__, __LINE__, 0,
733
_("Error reading a Gmsh mesh file:\n"
734
"Type identifier <%d> is not recognized."),
735
ecs_file_get_name(fic_maillage), (int)type_gmsh);
737
type_ecs = ecs_gmsh_elt_liste_c[type_gmsh - 1].ecs_typ;
738
nbr_nod_elt_gmsh = ecs_gmsh_elt_liste_c[type_gmsh - 1].nbr_som;
739
nbr_som_elt = ecs_fic_elt_typ_liste_c[type_ecs].nbr_som;
741
for (ind_elt = 0; ind_elt < nbr_elt; ind_elt++) {
743
ecs_file_read(&data, sizeof(int),
744
1 + nbr_tag_elt + nbr_nod_elt_gmsh, fic_maillage);
746
if (type_gmsh == GMSH_POINT1) {
750
else if (type_gmsh == GMSH_SEG2 || type_gmsh == GMSH_SEG3) {
755
/* Par défaut, Gmsh écrit des fichiers avec 2 "tags",
756
le premier correspondant à un numéro d'entité physique,
757
le second à une entité géométrique élémentaire;
758
on associe le premier à une couleur */
763
/* Lecture des numéros des sommets de l'élément courant */
765
for (ind_nod_elt = 0; ind_nod_elt < nbr_nod_elt_gmsh; ind_nod_elt++)
766
num_nod_elt_gmsh[ind_nod_elt] = data[1 + nbr_tag_elt + ind_nod_elt];
768
/* Stockage des valeurs avant transfert dans la structure `maillage' */
769
/*===================================================================*/
771
/* Identification de l'entité concernée */
773
ent_num = ecs_maillage_pre__ret_typ_geo(type_ecs);
775
/* Position des numéros de sommets du prochain élément */
777
elt_pos_som_ent[ent_num][cpt_elt_ent[ent_num] + 1] =
778
elt_pos_som_ent[ent_num][cpt_elt_ent[ent_num]] + nbr_som_elt;
780
/* Connectivité de l'élément par ses numéros de sommets */
782
for (ind_som_elt = 0; ind_som_elt < nbr_som_elt; ind_som_elt++) {
786
[elt_pos_som_ent[ent_num][cpt_elt_ent[ent_num]] - 1 + ind_som_elt]
788
[ecs_gmsh_elt_liste_c[type_gmsh - 1].num_som[ind_som_elt] - 1];
792
/* Couleur (tag) de l'élément lu */
795
while (icoul < cpt_coul_ent[ent_num] &&
796
val_coul_ent[ent_num][icoul] != coul_elt)
799
if (icoul == cpt_coul_ent[ent_num]) {
801
/* La valeur de la couleur n'a pas encore été stockée */
803
ECS_REALLOC(val_coul_ent[ent_num] , cpt_coul_ent[ent_num] + 1,
805
ECS_REALLOC(cpt_elt_coul_ent[ent_num], cpt_coul_ent[ent_num] + 1,
807
cpt_elt_coul_ent[ent_num][icoul] = 0;
808
val_coul_ent[ent_num][icoul] = coul_elt;
809
cpt_coul_ent[ent_num]++;
813
cpt_elt_coul_ent[ent_num][icoul]++;
814
elt_val_color_ent[ent_num][cpt_elt_ent[ent_num]] = icoul + 1;
816
/* Incrémentation du nombre d'éléments lus */
818
cpt_elt_ent[ent_num]++;
822
nbr_elt_lus += nbr_elt;
825
ecs_file_set_type(fic_maillage, ECS_FILE_TYPE_TEXT);
827
ecs_file_gets(chaine, 2, fic_maillage, num_ligne);
833
if (cpt_point > -1 || cpt_are > 0)
836
printf(_(" %ld elements of type \"point\" ignored\n"),
839
printf(_(" %ld elements of type \"edge\" ignored\n"),
841
if (cpt_point > -1 || cpt_are > 0)
844
/* Ligne de fin de rubrique */
846
ecs_file_gets(chaine, ECS_LOC_LNG_MAX_CHAINE_GMSH, fic_maillage, num_ligne);
848
if ( (strncmp(chaine, "$EndElements", strlen("$EndElements")) != 0)
849
&& (strncmp(chaine, "$ENDELM", strlen("$ENDELM")) != 0))
850
ecs_error(__FILE__, __LINE__, 0,
851
_("The end of the elements list specification of file\n"
852
"\"%s\" is not present at the expected place.)"),
853
ecs_file_get_name(fic_maillage));
855
/* Réallocations des tableaux locaux */
856
/*===================================*/
858
/* Reallocations des tableaux locaux et mise à jour des références */
859
/*=================================================================*/
861
for (ient = ECS_ENTMAIL_FAC; ient < ECS_N_ENTMAIL; ient++) {
863
if (cpt_elt_ent[ient] != 0) {
864
ECS_REALLOC(elt_pos_som_ent[ient] ,
865
cpt_elt_ent[ient] + 1 , ecs_size_t);
866
ECS_REALLOC(elt_val_som_ent[ient] ,
867
elt_pos_som_ent[ient][cpt_elt_ent[ient]] - 1, ecs_int_t);
868
ECS_REALLOC(elt_val_color_ent[ient] ,
869
cpt_elt_ent[ient] , ecs_int_t);
872
ecs_maillage_pre__label_en_indice
874
elt_pos_som_ent[ient][cpt_elt_ent[ient]] - 1,
876
elt_val_som_ent[ient]);
880
ECS_FREE(*som_val_label);
883
/* Transfert des valeurs lues dans les structures d'entités de maillage */
884
/*======================================================================*/
886
ecs_maillage_pre__cree_elt(maillage,
897
/*============================================================================
898
* Fonctions publiques
899
*============================================================================*/
901
/*----------------------------------------------------------------------------
902
* Lecture d'un fichier de maillage au format Gmsh
903
* et affectation des donnees dans la structure de maillage
904
*----------------------------------------------------------------------------*/
907
ecs_pre_gmsh__lit_maillage(const char *nom_fic_maillage)
909
ecs_file_t *fic_maillage; /* Descripteur du fichier */
910
char chaine[ECS_LOC_LNG_MAX_CHAINE_GMSH]; /* Ligne lue */
911
int num_ligne; /* Compteur des lignes lues */
912
int version_fmt_gmsh;
914
ecs_int_t *som_val_label;
915
int dim_e; /* Dimension spatiale */
916
bool bool_elements = false;
917
bool bool_noeuds = false;
919
/* Création d'un maillage initialement vide (valeur de retour) */
921
ecs_maillage_t *maillage = ecs_maillage__cree_nodal();
923
/*xxxxxxxxxxxxxxxxxxxxxxxxxxx Instructions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
925
/* Affichage du titre */
926
/*====================*/
929
"Reading mesh from file in Gmsh format\n"
930
"----------------------\n"));
932
printf(_(" Mesh file: %s\n\n\n"),
935
/* Initialisations */
936
/*=================*/
941
som_val_label = NULL;
943
/* Par défaut, la version est 1.0 en ASCII */
945
version_fmt_gmsh = 1;
948
/* Ouverture du fichier Gmsh en lecture */
949
/*---------------------------------------*/
951
fic_maillage = ecs_file_open(nom_fic_maillage,
955
/*================================================*/
956
/* Boucle sur les lignes du fichier de maillage : */
957
/* tant qu'on n'a pa atteint la fin du fichier */
958
/*================================================*/
961
while (ecs_file_gets_try(chaine, ECS_LOC_LNG_MAX_CHAINE_GMSH,
962
fic_maillage, &num_ligne) != NULL) {
964
/* Si la chaine lue est un descripteur de format */
966
if (strncmp(chaine, "$MeshFormat", strlen("$MeshFormat")) == 0)
968
ecs_loc_pre_gmsh__lit_vers_format(fic_maillage,
973
/* Si la chaine lue marque le début de la section des noeuds */
975
else if (strncmp(chaine,
977
strlen("$ParametricNodes")) == 0)
979
(__FILE__, __LINE__, 0,
980
_("Error reading file\n\"%s\" :\n"
981
"Nodes are defined in the \"ParametricNodes\" variant, which\n"
982
"is not handled (and not documented as of Gmsh 2.4.0)."),
983
ecs_file_get_name(fic_maillage));
985
/* Si la chaine lue marque le début de la section des noeuds */
987
else if ( (strncmp(chaine, "$Nodes", strlen("$Nodes")) == 0)
988
|| (strncmp(chaine, "$NOD", strlen("$NOD")) == 0)) {
990
ecs_loc_pre_gmsh__lit_nodes(maillage,
1000
/* Si la chaine lue marque le début de la section des éléments */
1002
else if ( (strncmp(chaine, "$Elements", strlen("$Elements")) == 0)
1003
|| (strncmp(chaine, "$ELM", strlen("$ELM")) == 0)) {
1005
ecs_loc_pre_gmsh__lit_elements(maillage,
1010
maillage->n_vertices,
1013
bool_elements = true;
1018
if (ecs_file_eof(fic_maillage) == 0)
1019
ecs_error(__FILE__, __LINE__, errno,
1020
_("Error reading line %ld of file \"%s\"."),
1021
(long)num_ligne, ecs_file_get_name(fic_maillage));
1023
/* else : la fin de fichier a bien ete atteinte */
1026
/* On verifie qu'on a bien lu des noeuds et des elements */
1028
if (bool_noeuds == false)
1029
ecs_error(__FILE__, __LINE__, 0,
1030
_("Error reading a Gmsh mesh file:\n"
1031
"at line %ld of file \"%s\".\n"
1032
"The points definition was not found."),
1033
(long)num_ligne, ecs_file_get_name(fic_maillage));
1035
if (bool_elements == false)
1036
ecs_error(__FILE__, __LINE__, 0,
1037
_("Error reading a Gmsh mesh file:\n"
1038
"at line %ld of file \"%s\".\n"
1039
"The elements definition was not found."),
1040
(long)num_ligne, ecs_file_get_name(fic_maillage));
1043
/* Fermeture du fichier de maillage */
1044
/*----------------------------------*/
1046
ecs_file_free(fic_maillage);
1054
/*----------------------------------------------------------------------------*/