Projet

Général

Profil

perl script : convert Gmsh results into a .maple format » hz_gmsh2maple.pl

version 1.01 : remaniement important du code et syntaxe du fichier de commande (but : corriger un mauvais choix inital => désormais, le script est capable de gérer le cas d'une sortie sur une zone concernant plusieurs maillages) - Julien Troufflard, 02/02/2023 11:50

 
1
#!/usr/bin/env perl
2
use strict;
3
use warnings;
4
use English;
5
use File::Glob qw(bsd_glob);
6
use File::Basename;
7
use IO::File;
8
use List::MoreUtils qw(uniq);
9
my $NOM_PROG = basename $PROGRAM_NAME;
10
#pattern d un reel pour les regex (desormais redondant avec $RE{num}{real} de Regexp::Common)
11
my $format_reel = '[+-]?[\.]?\d+[\.]?\d*(?:[eE][+-]?\d*)?';
12

    
13

    
14
my $VERSION = '1.01';
15
#####################################################################################################
16
#  script pour visualiser un ou plusieurs maillages dans Gmsh                                       #
17
#  version 1.00 : version initiale (version testee sur : MacOSX Darwin)                             #
18
#  version 1.01 : modif majeure de la lecture des "no_maillage ref_noeud" pour chaque sortie        #
19
#                 (on fait plutot le choix de lire un ensemble de paires "no_maillage ref_noeud"    #
20
#                  sur la premiere ligne, puis la liste des grandeurs (avec ou sans STAT) sur la    #
21
#                  seconde ligne => permettra de gerer le cas ou on veut une sortie sur une zone    #
22
#                  qui concerne plusieurs maillages a la fois)                                      #
23
#####################################################################################################
24

    
25

    
26

    
27
#
28
# note :
29
#     l une des difficultes du traitement est que la numerotation des noeuds dans le fichier Gmsh n est pas
30
#  la meme que les fichiers maillage .her dans le cas ou il y a plusieurs maillages.
31
#
32
#    On doit donc connaitre les maillages .her, et en particulier connaitre l ordre dans lequel ils ont ete
33
#  declares dans la sortie Gmsh (fichier .CVisu). En general, c est le meme ordre que dans le fichier .info du calcul.
34
#  La connaissance des fichiers maillages et de leur ordre permettra de se baser sur les listes de references
35
#  existantes pour ces maillages et de determiner la correspondance entre numero de noeud du fichier .her et 
36
#  numero de noeud qui lui correspond dans le fichier Gmsh .pos
37
#
38
#  Cette problematique est a l origine du choix de passer par un fichier de commande (voir aide du script).
39
#  De toute facon, il est egalement plus simple de passer par un fichier de commande pour definir les sorties (qui peuvent
40
#  etre nombreuses)
41
#
42

    
43

    
44

    
45

    
46

    
47

    
48

    
49
sub affichage_aide {
50
  use Text::Wrap;
51
  #config du package Text::Wrap
52
  $Text::Wrap::columns = 101;#le nombre de caracteres maximum par ligne sera egal a ($Text::Wrap::columns - 1) dans le cas ou utilise wrap
53

    
54
  #indentation de longueur $NOM_PROG
55
  my $indent_NOM_PROG = ""; $indent_NOM_PROG .= " " for(1 .. length($NOM_PROG));
56

    
57
  print "----------------------------------------\n";
58
  print " script $NOM_PROG  (version $VERSION)\n";
59
  print "----------------------------------------\n";
60
  print "\n";
61
  print "But : convertir des donnees Gmsh (fichiers .pos) en fichier de type .maple\n";
62
  print "\n";
63
  print "Usage :\n";
64
  print wrap("  ","    $indent_NOM_PROG ", " $NOM_PROG [-h|help] [-v] [-l] [-trame nom_fic]\n", 
65
                                                     "rep_Gmsh fic_cmd fic_maple\n");
66
  print "\n";
67
  print "Arguments :\n";
68
  print "     o rep_Gmsh  : repertoire Gmsh\n";
69
  print "     o fic_cmd   : fichier de commande de sortie (voir \"Fonctionnement\")\n";
70
  print "     o fic_maple : fichier de type .maple a creer\n";
71
  print "\n";
72
  print "Fonctionnement :\n";
73
  print wrap("    ", "  ",
74
     "$NOM_PROG lit le fichier \"fic_cmd\" qui contient les mots-cles MAILLAGES et SORTIES. ",
75
   "Il produira le fichier \"fic_maple\" ",
76
   "qui contiendra un certain nombre de colonnes dans l ordre de ce qui est indique au mot-cle SORTIES.\n",
77
   "\n",
78
   "Le fichier \"fic_cmd\" aura la structure suivante :\n",
79
   "---------------------------------------------------------\n",
80
   "MAILLAGES #(mot-cle de declaration des maillages dans l ordre du .CVisu)\n",
81
   "nom_fichier #(fichier .her maillage 1)\n",
82
   "nom_fichier #(fichier .her maillage 2)\n",
83
   "...\n",
84
   "nom_fichier #(fichier .her maillage N)\n",
85
   "\n",
86
   "\n",
87
   "SORTIES #(mot-cle de declaration des grandeurs a sortir)\n",
88
   "\n",
89
   "#sortie 1\n",
90
   "no_mail_1 ref_n_1  no_mail_2 ref_n_2 ... #liste des no_maillage/ref_noeud\n",
91
   "[STAT ] var_1 var_2 ... var_N #liste des grandeurs voulues\n",
92
   "                              #(eventuellement precede du mot-cle STAT)\n",
93
   "#sortie 2\n",
94
   "no_mail_1 ref_n_1  no_mail_2 ref_n_2 ... #liste des no_maillage/ref_noeud\n",
95
   "[STAT ] var_1 var_2 ... var_N #liste des grandeurs voulues\n",
96
   "                              #(eventuellement precede du mot-cle STAT)\n",
97
   "...\n",
98
   "#sortie N\n",
99
   "no_mail_1 ref_n_1  no_mail_2 ref_n_2 ... #liste des no_maillage/ref_noeud\n",
100
   "[STAT ] var_1 var_2 ... var_N #liste des grandeurs voulues\n",
101
   "                              #(eventuellement precede du mot-cle STAT)\n",
102
   "---------------------------------------------------------\n",
103
   "\n",
104
   "L option -trame permet de generer un exemple de fichier de commande (voir Options).\n",
105
   "\n",
106
   "Le symbole \"#\" permet d ecrire des commentaires.\n", 
107
   "\n", 
108
   "Le mot-cle MAILLAGES permet de declarer les fichiers maillage (fichier .her). ",
109
   "Dans le cas a plusieurs maillages, il est tres important de les declarer dans le meme ordre que\n", 
110
   "celui dans le fichier .CVisu du calcul qui a cree le repertoire Gmsh.\n",
111
   "\n", 
112
   "Le mot-cle SORTIES permet de declarer les sorties. Une sortie est definie par un ensemble de paires \"no_maillage ref_noeud\" sur la premiere ligne. ",
113
   "Le numero de maillage (\"no_mail_...\") correspond a l ordre de declaration au mot-cle MAILLAGES. On indiquera comme reference ",
114
   "de noeud (\"ref_n_...\") soit un numero de noeud, soit une liste de reference de noeuds.\n",
115
   "  **remarque : une reference N_tout (tous les noeuds) est automatiquement generee pour chaque maillage\n",
116
   "               si elle n existe pas deja\n",
117
   "Sur une seconde ligne, on indique la liste de grandeurs (\"var_...\") a sortir. L option -l permet de connaitre les ",
118
   "grandeurs disponibles. Le mot-cle \"STAT\" permet d indiquer que l on souhaite une statistique (somme, moyenne, min, max) sur ",
119
   "l ensemble des noeuds plutot que les valeurs par noeud.\n"
120
  );
121
  print "\n";
122
  print "Options :\n";
123
  print "    -v : affichage du numero de version\n";
124
  print "\n";
125
  print "    -l : affichage des grandeurs disponibles dans le repertoire \"rep_Gmsh\"\n";
126
  print "         **NB : dans ce cas, on peut lancer le script de la maniere suivante :\n";
127
  print "                  > $NOM_PROG -l rep_Gmsh\n";
128
  print "\n";
129
  print "    -trame nom_fic : genere une trame de fichier de commande\n";
130
  print "                     **NB : dans ce cas, on peut lancer le script de la\n";
131
  print "                            maniere suivante :\n";
132
  print "                              > $NOM_PROG -trame nom_fic\n";
133
  print "\n";
134
  print "Auteur :\n";
135
  print "   TROUFFLARD Julien\n";
136
  print "       julien.troufflard\@free.fr\n";
137
  print "----------------------------------------\n";
138
}
139

    
140

    
141

    
142
#------------------------------------
143
#pas d arguments ou option -h ou -help => affichage de l aide et arret du programme
144
#------------------------------------
145
#cas sans argument
146
if($#ARGV == -1) {
147
  affichage_aide();
148
  exit;
149
}
150
# cas option -h/-help (rq : insensible a la casse)
151
foreach my $arg (@ARGV) {
152
  if(($arg =~ /^-h$/i) or ($arg =~ /^-help$/i)) {
153
    affichage_aide();
154
    exit;
155
  }
156
}
157

    
158
#------------------------------------
159
#option -v => affichage de la version et arret du programme
160
#------------------------------------
161
foreach my $arg (@ARGV) {
162
  if($arg eq '-v') {
163
    print "\n $NOM_PROG : version $VERSION\n\n";
164
    exit;
165
  }
166
}
167

    
168
#------------------------------------
169
#option -trame => creation du fichier de commande et arret du programme
170
#------------------------------------
171
for(my $i=0; $i<=$#ARGV; $i++) {
172
  if($ARGV[$i] eq '-trame') {
173
    defined($ARGV[$i+1]) or die "\n**Erreur (prog:$NOM_PROG,opt:-trame) : argument manquant (voir aide -h|-help)...\n\n";
174
    print_fic_cmd($ARGV[$i+1]);
175
    print "\nFichier cree : $ARGV[$i+1]\n\n";
176
    exit;
177
  }
178
}
179

    
180

    
181

    
182

    
183
#------------------------------------
184
#recuperation des arguments et options
185
#------------------------------------
186
my $rep_Gmsh;#repertoire Gmsh
187
my $fic_cmd;#fichier de commande
188
my $fic_maple_a_creer;#fichier de type .maple a creer
189

    
190
my $is_opt_l = 0;#indicateur de l option -l (affichage de la liste des grandeurs dispo dans le repertoire $rep_Gmsh)
191

    
192
#on parcourt la liste des arguments (on traite les options connues et on stocke les autres dans @args)
193
my $opt;
194
my @args;
195
while($#ARGV != -1) {
196
  $opt = shift(@ARGV);
197

    
198
  #option -l
199
  if($opt eq '-l') {
200
    $is_opt_l = 1;
201
  }
202

    
203
  #cas d une option inconnue
204
  elsif($opt =~ /^-/) {
205
    warn "**Attention : option $opt inconnue (on ignore cette option)...\n";
206
  }
207

    
208
  #autres arguments
209
  else {
210
    push(@args,$opt);
211
  }
212
}#while($#ARGV != -1)
213

    
214

    
215

    
216
#recuperation des arguments obligatoires
217
#
218
#-on recupere d abord le repertoire Gmsh (pour appliquer directement une eventuelle option -l)
219
($#args >= 0) or die "\n**Erreur (prog:$NOM_PROG) : arguments manquants (voir aide : option -h ou -help)...\n\n";
220
$rep_Gmsh = shift(@args);
221
$rep_Gmsh =~ s/\/+$//;
222

    
223
#verif existence repertoire Gmsh
224
(-d $rep_Gmsh) or die "\n**Erreur (prog:$NOM_PROG) : repertoire Gmsh ($rep_Gmsh/) introuvable...\n\n";
225

    
226
#construction de la table des grandeurs et fichiers associes dans le repertoire Gmsh
227
my %table_grandeurs_rep_Gmsh;
228
#table de hashage : @{$table_grandeurs_rep_Gmsh{'liste_grandeurs'}} = (liste des noms de grandeur)
229
#
230
#                   $table_grandeurs_rep_Gmsh{nom grandeur}{'fichier'} = fichier .pos correspondant a la grandeur
231
#                   $table_grandeurs_rep_Gmsh{nom grandeur}{'nb_composantes'} = nombre de composantes de la grandeur
232
#
233
make_table_grandeurs_Gmsh($rep_Gmsh, \%table_grandeurs_rep_Gmsh);
234

    
235

    
236
#cas particulier : aucune grandeurs dispo
237
if($#{$table_grandeurs_rep_Gmsh{'liste_grandeurs'}} == -1) {
238
  die "\n**Erreur (prog:$NOM_PROG) : aucune grandeur n a ete trouve dans le repertoire Gmsh ($rep_Gmsh/) (plus precisement, aucun fichier d extension .pos n existe dans ce repertoire)...\n\n";
239
}
240

    
241

    
242

    
243
#option -l => affichage des grandeurs disponibles et sortie du programme
244
if($is_opt_l) {
245
  print "\n";
246
  print "--------------------------------------------------------------\n";
247
  print "Liste des grandeurs dans le repertoire $rep_Gmsh/ :\n";
248
  print "--------------------------------------------------------------\n";
249
  foreach my $grandeur (@{$table_grandeurs_rep_Gmsh{'liste_grandeurs'}}) {
250
    my $fpos = basename $table_grandeurs_rep_Gmsh{$grandeur}{'fichier'};
251
    print "  - $grandeur    ( fichier : $fpos )\n";
252
  }
253
  print "\n";
254
  exit;
255
}
256

    
257

    
258
#-on recupere le fichier de commande et le fichier .maple a creer
259
($#args >= 1) or die "\n**Erreur (prog:$NOM_PROG) : arguments manquants (voir aide : option -h ou -help)...\n\n";
260
$fic_cmd = shift(@args);
261
$fic_maple_a_creer = shift(@args);
262

    
263

    
264
#verif existence fichier commande
265
(-e $fic_cmd) or die "\n**Erreur (prog:$NOM_PROG) : fichier de commande ($fic_cmd) introuvable...\n\n";
266

    
267

    
268

    
269
#saisie des infos dans le fichier de commande
270
#
271
# - table des fichiers maillage
272
my %FHER;
273
#  table de hashage : $FHER{'nb_maillages'} = nombre de maillages
274
#
275
#                     $FHER{i}{'nb_noeuds'} = nombre de noeuds du maillage i
276
#                     $FHER{i}{'fichier'} = fichier .her du maillage i
277
#
278
$FHER{'nb_maillages'} = 0;
279

    
280

    
281
my $is_mot_cle_MAILLAGES_ok = 0;
282
my $is_mot_cle_SORTIES_ok = 0;
283

    
284
open(FIC, "<$fic_cmd");
285
my $nb_ligne_cmd = 0;
286
while(<FIC>) {
287
  $nb_ligne_cmd++;
288

    
289
  next if(/^\s*\#/);
290
  s/\s*#.*$//;
291
  next if(/^\s*$/);
292
  next if(not /^\s*MAILLAGES\s*$/);
293

    
294
  $is_mot_cle_MAILLAGES_ok = 1;
295

    
296
  while(<FIC>) {
297
    $nb_ligne_cmd++;
298

    
299
    next if(/^\s*\#/);
300
    s/\s*#.*$//;
301
    next if(/^\s*$/);
302
    if(/^\s*SORTIES\s*$/) {
303
      $is_mot_cle_SORTIES_ok = 1;
304
      last;
305
    }
306

    
307
    my ($fher) = split;
308
    my $nb_noeuds = nb_noeuds_maillage($fher);
309
    ($nb_noeuds > 0) or die "\n**Erreur (prog:$NOM_PROG) : (ligne $nb_ligne_cmd fichier $fic_cmd) le fichier de maillage $fher n est pas valide (impossible d y saisir le nombre de noeuds)...\n\n";
310
    $FHER{'nb_maillages'}++;
311
    $FHER{$FHER{'nb_maillages'}}{'fichier'} = $fher;
312
    $FHER{$FHER{'nb_maillages'}}{'nb_noeuds'} = $nb_noeuds;
313
  }
314
  last;
315
}
316

    
317
$is_mot_cle_MAILLAGES_ok or die "\n**Erreur (prog:$NOM_PROG) : le mot-cle MAILLAGES n a pas ete trouve dans le fichier $fic_cmd ...\n\n";
318
$is_mot_cle_SORTIES_ok or die "\n**Erreur (prog:$NOM_PROG) : le mot-cle SORTIES n a pas ete trouve dans le fichier $fic_cmd ...\n\n";
319

    
320

    
321
# - table des grandeurs a sortir
322
my %SORTIES;
323
# table de hashage : $SORTIES{'nb_sorties'} = nombre de commandes de sortie
324
#
325
#                    @{$SORTIES{i}{'no_maillage'}} = liste des numeros de maillage de la commande
326
#                    @{$SORTIES{i}{'ref_noeud'}} = liste des noeud ou nom de la liste de ref
327
#                    @{$SORTIES{i}{'no_maillage'}{'liste_noeuds_her'} = liste des noeuds numerotation .her par maillage
328
#                    @{$SORTIES{i}{'no_maillage'}{'liste_noeuds_Gmsh'} = liste des noeuds numerotation Gmsh par maillage
329
#                    @{$SORTIES{i}{'liste_grandeurs'}} = liste des grandeurs a sortir pour ce/ces noeud(s)
330
#
331
#                    $SORTIES{i}{'STAT'} : indicateur d une sortie de type STATISTIQUE
332
#
333
while(<FIC>) {
334
  $nb_ligne_cmd++;
335

    
336
  next if(/^\s*\#/);
337
  s/\s*#.*$//;
338
  next if(/^\s*$/);
339
  next if(not /^\s*(\d+)\s+/);
340

    
341
  @_ = split;
342
  (($#_+1) % 2 == 0) or die "\n**Erreur (prog:$NOM_PROG) : (ligne $nb_ligne_cmd fichier $fic_cmd) ligne non conforme (on doit y trouver des paires \"no_maillage  ref_noeud\")...\n\n";
343

    
344
  $SORTIES{'nb_sorties'}++;
345
  my $no_sortie = $SORTIES{'nb_sorties'};
346

    
347
  while($#_ != -1) {
348
    my $no_maillage = shift(@_);
349
    my $ref_noeud = shift(@_);
350

    
351
    ($no_maillage =~ /^\d+$/) or die "\n**Erreur (prog:$NOM_PROG) : (ligne $nb_ligne_cmd fichier $fic_cmd) la paire maillage/ref noeud ($no_maillage $ref_noeud) n est pas conforme (le no maillage n est pas un entier)...\n\n";
352
    ($ref_noeud =~ /^\d+$/ or $ref_noeud =~ /^N/) or die "\n**Erreur (prog:$NOM_PROG) : (ligne $nb_ligne_cmd fichier $fic_cmd) la paire maillage/ref noeud ($no_maillage $ref_noeud) n est pas conforme (ref noeud n est pas un entier ou une liste de reference de noeuds)...\n\n";
353

    
354
    push(@{$SORTIES{$no_sortie}{'no_maillage'}}, $no_maillage);
355
    push(@{$SORTIES{$no_sortie}{'ref_noeud'}}, $ref_noeud);
356
  }
357

    
358
  #verif maillage, existence ref noeud et remplissage des listes de noeuds (her et gmsh)
359
  for(my $i=0; $i<=$#{$SORTIES{$no_sortie}{'no_maillage'}}; $i++) {
360
    my $no_maillage = $SORTIES{$no_sortie}{'no_maillage'}[$i];
361
    my $ref_noeud = $SORTIES{$no_sortie}{'ref_noeud'}[$i];
362

    
363
    #existence maillage
364
    ($no_maillage <= $FHER{'nb_maillages'}) or die "\n**Erreur (prog:$NOM_PROG) : (ligne $nb_ligne_cmd fichier $fic_cmd) le numero de maillage ($no_maillage) est plus grand que le nombre total de maillages ($FHER{'nb_maillages'}...\n\n";
365

    
366
    #-- cas d un numero de noeud
367
    if($ref_noeud =~ /^\d+$/) {
368
      ($ref_noeud <= $FHER{$no_maillage}{'nb_noeuds'}) or die "\n**Erreur (prog:$NOM_PROG) : (ligne $nb_ligne_cmd fichier $fic_cmd) le noeud $ref_noeud n existe pas dans le maillage $no_maillage (fichier $FHER{$no_maillage}{'fichier'})...\n\n";
369
      @{$SORTIES{$no_sortie}{'liste_noeuds_her'}[$i]} = ($ref_noeud);
370
    }
371
    #-- cas d une liste de reference
372
    else {
373
      #lecture du maillage concerne
374
      my ($nom_maillage, $nb_noeuds, $ref_tab_noeuds, $nb_elts, $ref_tab_elements, @ref_listes) = lecture_mail_her($FHER{$no_maillage}{'fichier'});
375
      #-on ajoute automatiquement la reference N_tout (tous les noeuds) si elle n existe pas
376
      if(not defined $ref_listes[0]->{'N_tout'}[0]) {
377
        push(@{$ref_listes[0]->{'N_tout'}}, 1 .. $nb_noeuds);
378
      }
379

    
380
      #verif existence reference
381
      (defined $ref_listes[0]->{$ref_noeud}[0]) or die "\nErreur (prog:$NOM_PROG) : (ligne $nb_ligne_cmd fichier $fic_cmd) liste de reference $ref_noeud n existe pas dans le maillage $no_maillage (fichier $FHER{$no_maillage}{'fichier'})...\n\n";
382
      @{$SORTIES{$no_sortie}{'liste_noeuds_her'}[$i]} = @{$ref_listes[0]->{$ref_noeud}};
383
    }
384

    
385
    #conversion de la liste de noeuds en numerotation Gmsh
386
    # (on applique un decalage egal a la somme des noeuds des maillages precedant le maillage $no_maillage)
387
    my $decalage_no_noeud_Gmsh = 0;
388
    for(my $j=1; $j<=$no_maillage-1; $j++) {$decalage_no_noeud_Gmsh += $FHER{$j}{'nb_noeuds'};}
389
    foreach my $noeud_her (@{$SORTIES{$no_sortie}{'liste_noeuds_her'}[$i]}) {
390
      push(@{$SORTIES{$no_sortie}{'liste_noeuds_Gmsh'}[$i]}, $noeud_her + $decalage_no_noeud_Gmsh);
391
    }
392

    
393
  }
394

    
395
  while(<FIC>) {
396
    $nb_ligne_cmd++;
397

    
398
    next if(/^\s*\#/);
399
    s/\s*#.*$//;
400
    next if(/^\s*$/);
401
    next if(not /^\s*(STAT)?\s*\S+/);
402

    
403
    #on repere si une STATISTIQUE a ete demandee
404
    if(/^\s*STAT\s+/) {
405
      s/\s*STAT\s+//;
406
      $SORTIES{$SORTIES{'nb_sorties'}}{'STAT'} = 1;
407
    }
408

    
409
    my @grandeurs = split;
410
    
411
    #verif des grandeurs demandees
412
    foreach my $grandeur (@grandeurs) {
413
      (defined $table_grandeurs_rep_Gmsh{$grandeur}) or die "\nErreur (prog:$NOM_PROG) : (ligne $nb_ligne_cmd fichier $fic_cmd) grandeur $grandeur n existe pas dans le repertoire Gmsh $rep_Gmsh/ ...\n\n";
414
      push(@{$SORTIES{$no_sortie}{'liste_grandeurs'}}, $grandeur);
415
    }
416

    
417
    last;
418
  }#while(<FIC>)
419

    
420
}#while(<FIC>)
421
close(FIC);
422

    
423

    
424
($SORTIES{'nb_sorties'} > 0) or die "\nErreur (prog:$NOM_PROG) : aucune sortie n a ete trouve dans le fichier $fic_cmd ...\n\n";
425

    
426

    
427

    
428
#ecriture de l en-tete du fichier .maple
429
#
430
#
431
#
432
open(Fmaple, ">$fic_maple_a_creer");
433

    
434
print Fmaple "#fichier cree par le script : $NOM_PROG\n";
435
print Fmaple "#fichier de commande : $fic_cmd\n";
436
print Fmaple "#repertoire Gmsh : $rep_Gmsh/\n";
437
print Fmaple "#\n";
438
print Fmaple "#--------------------------------------\n";
439
print Fmaple "#lien entre grandeur et fichier .pos\n";
440
print Fmaple "#--------------------------------------\n";
441
foreach my $grandeur (@{$table_grandeurs_rep_Gmsh{'liste_grandeurs'}}) {
442
  print Fmaple "#  - $grandeur   ==>  fichier : $table_grandeurs_rep_Gmsh{$grandeur}{'fichier'}\n";
443
}
444
print Fmaple "#\n";
445
print Fmaple "#----------------------------\n";
446
print Fmaple "#description des colonnes\n";
447
print Fmaple "#----------------------------\n";
448
print Fmaple "#\n";
449
my $nb_colonnes = 1;
450
print Fmaple "#[$nb_colonnes] temps\n";
451
print Fmaple "#\n";
452
for(my $no_sortie=1; $no_sortie<=$SORTIES{'nb_sorties'}; $no_sortie++) {
453

    
454
  my @grandeurs = @{$SORTIES{$no_sortie}{'liste_grandeurs'}};
455
  my $is_STAT = 0; $is_STAT = 1 if(defined $SORTIES{$no_sortie}{'STAT'});
456

    
457
  print Fmaple "#\n";
458
  print Fmaple "#-- sortie $no_sortie --\n";
459
  print Fmaple "#  ----------------------------------\n";
460
  print Fmaple "#  > liste grandeurs : @grandeurs\n";
461
  print Fmaple "#     ==> STATISTIQUE (somme, moyenne, min, max)\n" if($is_STAT);
462
  print Fmaple "#  > listes noeuds  :\n";
463
  for(my $i=0; $i<=$#{$SORTIES{$no_sortie}{'no_maillage'}}; $i++) {
464
    print Fmaple "#      - maillage : $FHER{$SORTIES{$no_sortie}{'no_maillage'}[$i]}{'fichier'} / liste noeuds : $SORTIES{$no_sortie}{'ref_noeud'}[$i]\n";
465
  }
466
  print Fmaple "#  ----------------------------------\n";
467

    
468
  #cas d une STATISTIQUE
469
  if($is_STAT) {
470
    print Fmaple "# STATISTIQUE :";
471
    foreach my $grandeur (@grandeurs) {
472
      print Fmaple " ";
473
      my $nb_comp = $table_grandeurs_rep_Gmsh{$grandeur}{'nb_composantes'};
474
      if($nb_comp == 1) {
475
        $nb_colonnes++;
476
        print Fmaple " [$nb_colonnes] $grandeur(SOMME)";
477
        $nb_colonnes++;
478
        print Fmaple " [$nb_colonnes] $grandeur(MOYENNE)";
479
        $nb_colonnes++;
480
        print Fmaple " [$nb_colonnes] $grandeur(MIN)";
481
        $nb_colonnes++;
482
        print Fmaple " [$nb_colonnes] $grandeur(MAX)";
483
      }
484
      else {
485
        for(my $i=1; $i<=$nb_comp; $i++) {
486
          $nb_colonnes++;
487
          print Fmaple " [$nb_colonnes] $grandeur(comp_$i, SOMME)";
488
          $nb_colonnes++;
489
          print Fmaple " [$nb_colonnes] $grandeur(comp_$i, MOYENNE)";
490
          $nb_colonnes++;
491
          print Fmaple " [$nb_colonnes] $grandeur(comp_$i, MIN)";
492
          $nb_colonnes++;
493
          print Fmaple " [$nb_colonnes] $grandeur(comp_$i, MAX)";
494

    
495
          print Fmaple "\n#             : " if($i != $nb_comp);
496
        }
497
      }
498
    }
499
    print Fmaple "\n";
500
  }
501

    
502
  #cas normal
503
  else {
504
    for(my $i=0; $i<=$#{$SORTIES{$no_sortie}{'no_maillage'}}; $i++) {
505
      my @liste_noeuds_her = @{$SORTIES{$no_sortie}{'liste_noeuds_her'}[$i]};
506

    
507
      foreach my $no_noeud_her (@liste_noeuds_her) {
508
        print Fmaple "# noeud\_$no_noeud_her  :";
509
        foreach my $grandeur (@grandeurs) {
510
          print Fmaple " ";
511
          my $nb_comp = $table_grandeurs_rep_Gmsh{$grandeur}{'nb_composantes'};
512
          if($nb_comp == 1) {
513
            $nb_colonnes++;
514
            print Fmaple " [$nb_colonnes] $grandeur";
515
          }
516
          else {
517
            for(my $i=1; $i<=$nb_comp; $i++) {
518
              $nb_colonnes++;
519
              print Fmaple " [$nb_colonnes] $grandeur(comp_$i)";
520
            }
521
          }
522
        }
523
        print Fmaple "\n";
524
      }
525
    }
526
  }
527

    
528
}#for(my $no_sortie=1; $no_sortie<=$SORTIES{'nb_sorties'}; $no_sortie++)
529

    
530
print Fmaple "#\n";
531
print Fmaple "#\n";
532
print Fmaple "\n";
533

    
534

    
535

    
536
#---------------------------
537
#ecriture des donnees
538
#---------------------------
539

    
540
#-d abord : saisie du temps (on se base sur le fichier .pos de la premiere grandeur de la table des grandeurs)
541
my @liste_temps;
542
$_ = $table_grandeurs_rep_Gmsh{'liste_grandeurs'}[0];
543
my $fic = $table_grandeurs_rep_Gmsh{$_}{'fichier'};
544
open(FIC, "<$fic");
545
while(<FIC>) {
546
  next if(not /^\s*\$nodedata\s*$/io);
547
  for(1 .. 3) {<FIC>;}
548
  $_ = <FIC>;
549
  my ($temps) = split;
550
  ($temps =~ /^$format_reel$/) or die "\nErreur (prog:$NOM_PROG) : temps non conforme ($temps) ligne $. du fichier $fic ...\n\n";
551
  push(@liste_temps, $temps);
552
}
553
close(FIC);
554

    
555

    
556

    
557
#-ensuite comme on va lire les fichiers nodedata par nodedata simultanement
558
# => on les ouvre tous via un hash de handle de fichiers
559
my %handle;
560
# => on cree la liste de noeuds (numerotation Gmsh) concernes pour chaque grandeur parmi toutes les sorties
561
my %liste_noeuds_Gmsh_grandeur;# @{$liste_noeuds_Gmsh_grandeur{nom grandeur}} = (liste de noeuds triee ordre croissant)
562
# => on creera un hash de valeur que l on rangera correctement dans l ordre des colonnes prevu
563
my %hash_valeurs;# $hash_valeurs{no noeud Gmsh}{grandeur}{no composante} = valeur
564
#                    (NB : no noeud Gmsh vient de la liste @{$SORTIES{no_sortie}{'liste_noeuds_Gmsh'})
565

    
566
#creation du handle de fichier pour chaque grandeur demandee
567
my %table_tmp_grandeurs_demandees;
568
my @liste_grandeurs_demandees;
569
my %handle_line_number;#  (NB : hash permettant de connaitre la ligne courante de chaque fichier pour plus tard)
570
for(my $no_sortie=1; $no_sortie<=$SORTIES{'nb_sorties'}; $no_sortie++) {
571
  foreach my $grandeur (@{$SORTIES{$no_sortie}{'liste_grandeurs'}}) {
572
    if(not defined $table_tmp_grandeurs_demandees{$grandeur}) {
573
      $table_tmp_grandeurs_demandees{$grandeur} = 1;
574
      push(@liste_grandeurs_demandees, $grandeur);
575
      $handle{$grandeur} = IO::File->new();
576
      $handle{$grandeur}->open("<$table_grandeurs_rep_Gmsh{$grandeur}{'fichier'}");
577
      $handle_line_number{$grandeur} = 0;
578
    }
579
  }
580
}
581

    
582
#liste de noeuds (numerotation Gmsh) concernes pour chaque grandeur parmi toutes les sorties
583
for(my $no_sortie=1; $no_sortie<=$SORTIES{'nb_sorties'}; $no_sortie++) {
584
  my @grandeurs = @{$SORTIES{$no_sortie}{'liste_grandeurs'}};
585

    
586
  for(my $i=0; $i<=$#{$SORTIES{$no_sortie}{'no_maillage'}}; $i++) {
587
    my @liste_noeuds_Gmsh = @{$SORTIES{$no_sortie}{'liste_noeuds_Gmsh'}[$i]};
588

    
589
    foreach my $grandeur (@grandeurs) {
590
      push(@{$liste_noeuds_Gmsh_grandeur{$grandeur}}, @liste_noeuds_Gmsh);
591
    }
592
  }
593
}
594
#tri ordre croissant et suppression des doublons eventuels
595
foreach my $grandeur (@liste_grandeurs_demandees) {
596
  @{$liste_noeuds_Gmsh_grandeur{$grandeur}} = sort {$a <=> $b} @{$liste_noeuds_Gmsh_grandeur{$grandeur}};
597
  @{$liste_noeuds_Gmsh_grandeur{$grandeur}} = uniq @{$liste_noeuds_Gmsh_grandeur{$grandeur}};
598
}
599

    
600

    
601
#debut de la lecture
602
foreach my $temps (@liste_temps) {
603

    
604
  #positionnement de tous les fichiers sur le prochain $nodedata (et verif du temps)
605
  #  plus exactement : on se positionnera juste avant le debut des valeurs noeud composantes... du nodedata
606
  foreach my $grandeur (@liste_grandeurs_demandees) { 
607
    while($_ = $handle{$grandeur}->getline) {
608
      $handle_line_number{$grandeur}++;
609
      last if(/^\s*\$nodedata\s*$/io);
610
    }
611
    #verif temps
612
    for(1 .. 3) {$handle{$grandeur}->getline; $handle_line_number{$grandeur}++;}
613
    $_ = $handle{$grandeur}->getline; $handle_line_number{$grandeur}++;
614
    my ($temps_) = split;
615
    ($temps_ = $temps) or die "\nErreur (prog:$NOM_PROG) : temps non conforme ($temps) ligne $handle_line_number{$grandeur} du fichier $table_grandeurs_rep_Gmsh{$grandeur}{'fichier'} ...\n\n";
616
    #positionnement final juste avant le debut des valeurs du nodedata
617
    for(1 .. 4) {$handle{$grandeur}->getline; $handle_line_number{$grandeur}++;}
618
  }
619

    
620

    
621
  #parcours de chaque grandeur
622
  #pour l instant on parcours les noeuds de chaque sortie dans l ordre croissant et dans la numerotation Gmsh
623
  #==> remplissage de $hash_valeurs{no noeud Gmsh}{grandeur}{no composante}
624
  foreach my $grandeur (@liste_grandeurs_demandees) {
625
    foreach my $no_noeud_Gmsh (@{$liste_noeuds_Gmsh_grandeur{$grandeur}}) {
626
      while($_ = $handle{$grandeur}->getline) {
627
        $handle_line_number{$grandeur}++;
628
        @_ = split;
629
        next if($_[0] != $no_noeud_Gmsh);
630

    
631
        for(my $no_comp=1; $no_comp<=$#_; $no_comp++) {
632
          $hash_valeurs{$no_noeud_Gmsh}{$grandeur}{$no_comp} = $_[$no_comp];
633
        }
634
        last;
635
      }
636
    }
637
  }
638

    
639
  #parcours de chaque sortie dans le meme ordre que l en-tete afin d ecrire les colonnes dans le bon ordre
640
  #-ecriture du temps
641
  print Fmaple "$temps";
642

    
643
  #-ecriture des grandeurs pour chaque sortie
644
  for(my $no_sortie=1; $no_sortie<=$SORTIES{'nb_sorties'}; $no_sortie++) {
645

    
646
    my @grandeurs = @{$SORTIES{$no_sortie}{'liste_grandeurs'}};
647
    my $is_STAT = 0; $is_STAT = 1 if(defined $SORTIES{$no_sortie}{'STAT'});
648

    
649
    #cas d une STATISTIQUE
650
    if($is_STAT) {
651
      foreach my $grandeur (@grandeurs) {
652

    
653
        my $nb_comp = $table_grandeurs_rep_Gmsh{$grandeur}{'nb_composantes'};
654

    
655
        if($nb_comp == 1) {
656
          my $somme = 0.;
657
          my $moyenne;
658
          my ($min,$max);
659
          my $nb_val = 0;
660
          for(my $i=0; $i<=$#{$SORTIES{$no_sortie}{'no_maillage'}}; $i++) {
661
            my @liste_noeuds_Gmsh = @{$SORTIES{$no_sortie}{'liste_noeuds_Gmsh'}[$i]};
662
            $nb_val += $#liste_noeuds_Gmsh + 1;
663

    
664
            foreach my $no_noeud_Gmsh (@liste_noeuds_Gmsh) {
665
              my $val = $hash_valeurs{$no_noeud_Gmsh}{$grandeur}{1};
666
              $somme += $val;
667
              $min = $max = $val if(not defined $min);
668
              $min = $val if($val < $min);
669
              $max = $val if($val > $max);
670
            }
671
          }
672
          $moyenne = $somme/$nb_val;
673
          print Fmaple " $somme $moyenne $min $max";
674
        }
675
        else {
676
          for(my $i=1; $i<=$nb_comp; $i++) {
677
            my $somme = 0.;
678
            my $moyenne;
679
            my ($min,$max);
680
            my $nb_val = 0;
681
            for(my $j=0; $j<=$#{$SORTIES{$no_sortie}{'no_maillage'}}; $j++) {
682
              my @liste_noeuds_Gmsh = @{$SORTIES{$no_sortie}{'liste_noeuds_Gmsh'}[$j]};
683
              $nb_val += $#liste_noeuds_Gmsh + 1;
684

    
685
              foreach my $no_noeud_Gmsh (@liste_noeuds_Gmsh) {
686
                my $val = $hash_valeurs{$no_noeud_Gmsh}{$grandeur}{$i};
687
                $somme += $val;
688
                $min = $max = $val if(not defined $min);
689
                $min = $val if($val < $min);
690
                $max = $val if($val > $max);
691
              }
692
            }
693
            $moyenne = $somme/$nb_val;
694
            print Fmaple " $somme $moyenne $min $max";
695
          }#for(my $i=1; $i<=$nb_comp; $i++)
696
        }#else
697
      }#foreach my $grandeur (@grandeurs)
698
    }#if($is_STAT)
699

    
700
    #cas normal
701
    else {
702
      for(my $i=0; $i<=$#{$SORTIES{$no_sortie}{'no_maillage'}}; $i++) {
703
        my @liste_noeuds_Gmsh = @{$SORTIES{$no_sortie}{'liste_noeuds_Gmsh'}[$i]};
704

    
705
        foreach my $no_noeud_Gmsh (@liste_noeuds_Gmsh) {
706
          foreach my $grandeur (@grandeurs) {
707
            my $nb_comp = $table_grandeurs_rep_Gmsh{$grandeur}{'nb_composantes'};
708
            if($nb_comp == 1) {
709
              print Fmaple " $hash_valeurs{$no_noeud_Gmsh}{$grandeur}{1}";
710
            }
711
            else {
712
              for(my $j=1; $j<=$nb_comp; $j++) {
713
                print Fmaple " $hash_valeurs{$no_noeud_Gmsh}{$grandeur}{$j}";
714
              }
715
            }
716
          }#foreach my $grandeur (@grandeurs)
717
        }#foreach my $no_noeud_Gmsh (@liste_noeuds_Gmsh)
718
      }#for(my $i=0; $i<=$#{$SORTIES{$no_sortie}{'no_maillage'}}; $i++)
719
    }#else
720
  }#for(my $no_sortie=1; $no_sortie<=$SORTIES{'nb_sorties'}; $no_sortie++)
721
  print Fmaple "\n";
722

    
723

    
724
}#foreach my $temps (@liste_temps)
725

    
726

    
727

    
728
close(Fmaple);
729

    
730
#fermeture des fichiers .pos
731
foreach my $grandeur (@liste_grandeurs_demandees) {
732
  close($handle{$grandeur});
733
}
734

    
735
print "\nFichier cree : $fic_maple_a_creer\n\n";
736

    
737

    
738

    
739

    
740

    
741
#----------------
742
#subroutine make_table_grandeurs_Gmsh
743
#
744
#  construction de la table de hashage des grandeurs d un repertoire Gmsh
745
#
746
#  entree :
747
#    - repertoire Gmsh
748
#    - reference vers la table de hashage des grandeurs du repertoire Gmsh
749
#
750
sub make_table_grandeurs_Gmsh {
751
  my $rep_Gmsh = shift;
752
  my $ref_table_grandeurs = shift;
753

    
754
  my @fpos;
755
  foreach my $fichier (bsd_glob("$rep_Gmsh/*_Gmsh.pos")) {
756
    (-T $fichier) or next;
757
    is_fic_pos_valide($fichier) or next;
758

    
759
    my $fichier_bn = basename $fichier;
760
    push(@fpos, $fichier_bn);
761
  }
762

    
763
  my $racine_commune = chaine_commune(@fpos);
764

    
765
  foreach my $fpos (@fpos) {
766
    my $grandeur = $fpos;
767
    $grandeur =~ s/^$racine_commune//;
768
    $grandeur =~ s/_Gmsh.pos$//;
769
    $grandeur =~ s/_ddl_noe$//;
770
    $grandeur =~ s/_pti$//;
771
    $grandeur =~ s/_evolue_noe$//;
772
    $grandeur =~ s/_ddl_etendu_noe$//;
773

    
774
    $ref_table_grandeurs->{$grandeur}{'fichier'} = "$rep_Gmsh/$fpos";
775
    $ref_table_grandeurs->{$grandeur}{'nb_composantes'} = get_nb_comp_fpos("$rep_Gmsh/$fpos");
776

    
777
    push(@{$ref_table_grandeurs->{'liste_grandeurs'}}, $grandeur);
778
  }
779

    
780
}#sub make_table_grandeurs_Gmsh
781
#----------------
782

    
783

    
784
#----------------
785
#subroutine get_nb_comp_fpos
786
#
787
#  saisie du nombre de composantes d une grandeur dans un fichier Gmsh .pos
788
#
789
#  entree :
790
#    - nom fichier .pos
791
#
792
#  sortie :
793
#    - nombre de composantes
794
#
795
sub get_nb_comp_fpos {
796
  my $fpos = shift;
797

    
798
  open(my $Hlocal, "<$fpos");
799
  while(<$Hlocal>) {
800
    next if(not /^\s*\$nodedata\s*$/io);
801
    for(1 .. 6) {<$Hlocal>;}
802
    $_ = <$Hlocal>;
803
    my ($nb_comp) = split;
804
    ($nb_comp =~ /^\d+$/) or die "\nErreur (prog:$NOM_PROG) : impossible de lire le nombre de composantes dans le fichier $fpos ...\n\n";
805
    close($Hlocal);
806
    return $nb_comp;
807
  }
808
  close($Hlocal);
809

    
810
  die "\nErreur (prog:$NOM_PROG) : impossible de lire le nombre de composantes dans le fichier $fpos ...\n\n";
811
}#sub get_nb_comp_fpos
812
#----------------
813

    
814

    
815

    
816
#----------------
817
#subroutine print_fic_cmd
818
#
819
#  ecriture d un fichier exemple de commande
820
#
821
#  entree :
822
#    - nom fichier a creer
823
sub print_fic_cmd {
824
  my $fic_cmd = shift;
825

    
826
  open(my $Hlocal, ">$fic_cmd");
827
  print $Hlocal 'MAILLAGES #mot-cle de declaration des fichiers maillage
828
nom_fichier_1.her
829
nom_fichier_2.her
830

    
831

    
832
SORTIES #mot-cle de declaration des sorties de grandeurs
833

    
834
#sortie des grandeurs EPS11 et SIG11
835
# pour les noeuds de la liste N_tout du maillage 1 
836
1 N_tout
837
EPS11 SIG11
838

    
839
#sortie des grandeurs Def_principaleI et Sigma_principaleI
840
# pour le noeud 129 du maillage 2
841
2 129
842
Def_principaleI Sigma_principaleI
843

    
844
#sortie des grandeurs def_duale_mises et contrainte_mises
845
# pour les noeuds de la liste N_S du maillage 1 
846
1 N_S
847
def_duale_mises contrainte_mises
848

    
849
#sortie des grandeurs def_duale_mises et contrainte_mises
850
# statistiques sur les valeurs aux noeuds de la liste N_S du maillage 1 
851
1 N_S
852
STAT  def_duale_mises contrainte_mises
853

    
854
#sortie de la grandeur deplace
855
# statistiques sur les valeurs aux noeuds de la liste N_E du maillage 1 
856
# et de la liste N_O du maillage 2
857
1 N_E  2 N_O
858
STAT   deplace
859
';
860

    
861
  close($Hlocal);
862
}#sub print_fic_cmd
863
#----------------
864

    
865

    
866
#----------------
867
#subroutine is_fic_pos_valide
868
#
869
#  verification rapide de la valide d un fichier .pos (par une heuristique : presence du mot-cle $nodedata au moins une fois)
870
#
871
#  entree :
872
#    - nom fichier a verifier
873
#
874
#  sortie :
875
#    - indicateur (1 si fichier valide, sinon 0)
876
#
877
sub is_fic_pos_valide {
878
  my $fic = shift;
879

    
880
  open(my $Hlocal, "<$fic");
881
  while(<$Hlocal>) {
882
    next if(not /^\s*\$nodedata\s*$/io);
883
    close($Hlocal);
884
    return 1;
885
  }
886
  close($Hlocal);
887

    
888
  return 0;
889
}#sub is_fic_pos_valide
890

    
891

    
892
#----------------
893
#subroutine nb_noeuds_maillage
894
#
895
#  renvoie le nombre de noeuds si le fichier est un maillage .her valide (par une heuristique sur NOEUDS)
896
#  sinon 0
897
#
898
#  entree :
899
#    - nom fichier
900
#
901
#  sortie :
902
#    - nombre de noeuds (ou 0 si le maillage n est pas valide)
903
sub nb_noeuds_maillage {
904
  my $fher = shift;
905

    
906
  my $nb_noeuds = 0;
907

    
908
  open(my $Hlocal, "<$fher");
909
  while(<$Hlocal>) {
910
    next if(not /^\s*(\d+)\s+NOEUDS/o);
911
    $nb_noeuds = $1;
912
    last;
913
  }
914
  close($Hlocal);
915

    
916
  return $nb_noeuds;
917
}#sub nb_noeuds_maillage
918

    
919

    
920
#----------------
921
#subroutine chaine_commune
922
#
923
#  determine la chaine de caracteres commune a une liste de chaine de caractere (en commencant par le debut des chaines)
924
#
925
#  entree :
926
#    - liste de chaines de caracteres
927
#
928
#  sortie :
929
#    - chaine commune
930
#
931
sub chaine_commune {
932
  my @liste = @_;
933

    
934
  return '' if($#liste == -1);
935

    
936
  my $chaine_commune = '';
937
  MAIN:while(length($liste[0]) > 0) {
938
    $liste[0] =~ s/^(.)//;
939
    my $lettre_commune = $1;
940
    for(my $i=1; $i<=$#liste; $i++) {
941
      last MAIN if(length($liste[$i]) == 0);
942
      $liste[$i] =~ s/^(.)//;
943
      my $lettre = $1;
944
      last MAIN if($lettre ne $lettre_commune);
945
    }
946
    $chaine_commune .= $lettre_commune;
947
  }
948

    
949
  return $chaine_commune;
950
}#sub chaine_commune
951

    
952

    
953

    
954
#----------------
955
#sub qui lit un maillage herezh++ pour recuperer les noeuds, les elements et les listes de references
956
#et les renvoier sous forme de reference (lecture du .her et d un .lis si il existe)
957
#
958
# exemple d appel :
959
#  my ($nom_maillage, $nb_noeuds, $ref_tab_noeuds, $nb_elts, $ref_tab_elements, @ref_listes) = lecture_mail_her("fic_her");
960
#
961
#  avec - $nom_maillage     : nom du maillage (si il y en a un. sinon $nom_maillage sera egal a undef
962
#       - $nb_noeuds        : nombre de noeuds (entier)
963
#       - $ref_tab_noeuds   : reference vers un tableau de noeuds => $ref_tab_noeuds->[no noeud][0] : coordonnee x
964
#                                                                    $ref_tab_noeuds->[no noeud][1] : coordonnee y
965
#                                                                    $ref_tab_noeuds->[no noeud][2] : coordonnee z)
966
#       - $nb_elts          : nombre d elements (entier)
967
#       - $ref_tab_elements : reference vers une table de hashage => $ref_tab_elements->{no elt}{'TYPE'}      : type d element
968
#                                                                    @{$ref_tab_elements->{no elt}{'CONNEX'}} : (liste des noeuds)
969
#       - @ref_listes       : liste de references vers les tables de hashage contenant les listes de references de noeuds, aretes, faces et elements
970
#                             => $ref_listes[0] : reference vers la table de hashage des listes de noeuds  => @{$ref_listes[0]->{'nom liste'}} : (liste des noeuds)
971
#                                $ref_listes[1] : reference vers la table de hashage des listes d aretes   => @{$ref_listes[1]->{'nom liste'}} : (liste des aretes)
972
#                                $ref_listes[2] : reference vers la table de hashage des listes de faces   => @{$ref_listes[2]->{'nom liste'}} : (liste des faces)
973
#                                $ref_listes[3] : reference vers la table de hashage des listes d elements => @{$ref_listes[3]->{'nom liste'}} : (liste des elements)
974
#                                $ref_listes[4] : reference vers la table de hashage des listes de points d integration => @{$ref_listes[4]->{'nom liste'}} : (liste des points d integration)
975
#                                
976
sub lecture_mail_her {
977
  my $fher = shift;
978

    
979
  my $nom_maillage;
980

    
981
  #------------------------
982
  # lecture du maillage .her
983
  #------------------------
984
  #-lecture de noeuds
985
  my @tab_noeuds; my $nb_noeuds;
986
  my $no_noeud = 0;
987
  open(Fher, "<$fher");
988
  while(<Fher>) {
989
    if(/^\s*nom_maillage\s+(\S+)/o) {$nom_maillage = $1; next;}
990
    next if(not /(\d+)\s+NOEUDS/o);
991
    $nb_noeuds = $1;
992
    last;
993
  }
994
  while(<Fher>) {
995
    last if($no_noeud == $nb_noeuds);
996
    next if(not /^\s*(\d+)\s+(\S+)\s+(\S+)\s+(\S+)\s*$/o);
997
    $no_noeud = $1;
998
    @{$tab_noeuds[$no_noeud]} = ($2,$3,$4);
999
  }
1000

    
1001
  #-lecture des elements
1002
  my %tab_elements; my $nb_elts;
1003
  my $no_elt = 0;
1004
  while(<Fher>) {
1005
    next if(not /(\d+)\s+ELEMENTS/o);
1006
    $nb_elts = $1;
1007
    last;
1008
  }
1009
  while(<Fher>) {
1010
    last if($no_elt == $nb_elts);
1011
    next if(not /^\s*\d+\s+\w+\s+\w+/o);
1012
    s/^\s+//;s/\s+$//;
1013
    $_ =~ /^(\d+)\s+/;
1014
    $no_elt = $1; s/^(\d+)\s+//;
1015
    $_ =~ /\s+(\d+(?:\s+\d+)*)$/;
1016
    @{$tab_elements{$no_elt}{'CONNEX'}} = split(/\s+/, $1); s/\s+(\d+(?:\s+\d+)*)$//;
1017
    $tab_elements{$no_elt}{'TYPE'} = $_; $tab_elements{$no_elt}{'TYPE'} =~ s/\s+/ /g;
1018
  }
1019
  close(Fher);
1020

    
1021

    
1022
  #------------------------
1023
  # lecture des references (dans le .her et dans un eventuel .lis)
1024
  #------------------------
1025
  my $flis = $fher; $flis =~ s/.her$/.lis/;
1026
  my $nom_liste;
1027
  my $is_liste_en_cours;
1028
  my %listes_NOEUDS;
1029
  my %listes_ARETES;
1030
  my %listes_FACES;
1031
  my %listes_ELEMENTS;
1032
  my %listes_PTI;
1033

    
1034
  #-dans le .her
1035
  open(Fher, "<$fher");
1036
  $is_liste_en_cours = 0;
1037
  while(<Fher>) {
1038
    chomp;
1039
    if(/^\s*(N\S+)/o) {
1040
      $nom_liste = $1;
1041
      $is_liste_en_cours = 1;
1042
      s/^\s*N\S+\s+//; s/\s+$//;
1043
      push(@{$listes_NOEUDS{$nom_liste}},split(/\s+/,$_));
1044
    }
1045
    elsif(/^\s*noeuds/io or /^\s*elements/i or /^\s*[AFEG]/o) {
1046
      $is_liste_en_cours = 0;
1047
    }
1048
    elsif($is_liste_en_cours and /^\s*\d+(\s+\d+)*\s*$/io) {
1049
      s/^\s+//; s/\s+$//;
1050
      push(@{$listes_NOEUDS{$nom_liste}},split(/\s+/,$_));
1051
    }
1052
  }
1053
  close(Fher);
1054

    
1055
  open(Fher, "<$fher");
1056
  $is_liste_en_cours = 0;
1057
  while(<Fher>) {
1058
    chomp;
1059
    if(/^\s*(A\S+)/o) {
1060
      $nom_liste = $1;
1061
      $is_liste_en_cours = 1;
1062
      s/^\s*A\S+\s+//; s/\s+$//;
1063
      push(@{$listes_ARETES{$nom_liste}},split(/\s+/,$_));
1064
    }
1065
    elsif(/^\s*noeuds/io or /^\s*elements/i or /^\s*[NFEG]/o) {
1066
      $is_liste_en_cours = 0;
1067
    }
1068
    elsif($is_liste_en_cours and /^\s*\d+(\s+\d+)*\s*$/io) {
1069
      s/^\s+//; s/\s+$//;
1070
      push(@{$listes_ARETES{$nom_liste}},split(/\s+/,$_));
1071
    }
1072
  }
1073
  close(Fher);
1074

    
1075
  open(Fher, "<$fher");
1076
  $is_liste_en_cours = 0;
1077
  while(<Fher>) {
1078
    chomp;
1079
    if(/^\s*(F\S+)/) {
1080
      $nom_liste = $1;
1081
      $is_liste_en_cours = 1;
1082
      s/^\s*F\S+\s+//; s/\s+$//;
1083
      push(@{$listes_FACES{$nom_liste}},split(/\s+/,$_));
1084
    }
1085
    elsif(/^\s*noeuds/io or /^\s*elements/i or /^\s*[NAEG]/o) {
1086
      $is_liste_en_cours = 0;
1087
    }
1088
    elsif($is_liste_en_cours and /^\s*\d+(\s+\d+)*\s*$/io) {
1089
      s/^\s+//; s/\s+$//;
1090
      push(@{$listes_FACES{$nom_liste}},split(/\s+/,$_));
1091
    }
1092
  }
1093
  close(Fher);
1094

    
1095
  open(Fher, "<$fher");
1096
  $is_liste_en_cours = 0;
1097
  while(<Fher>) {
1098
    chomp;
1099
    if(/^\s*(E\S+)/o) {
1100
      $nom_liste = $1;
1101
      $is_liste_en_cours = 1;
1102
      s/^\s*E\S+\s+//; s/\s+$//;
1103
      push(@{$listes_ELEMENTS{$nom_liste}},split(/\s+/,$_));
1104
    }
1105
    elsif(/^\s*noeuds/io or /^\s*elements/io or /^\s*[NAFG]/o) {
1106
      $is_liste_en_cours = 0;
1107
    }
1108
    elsif($is_liste_en_cours and /^\s*\d+(\s+\d+)*\s*$/io) {
1109
      s/^\s+//; s/\s+$//;
1110
      push(@{$listes_ELEMENTS{$nom_liste}},split(/\s+/,$_));
1111
    }
1112
  }
1113
  close(Fher);
1114

    
1115
  open(Fher, "<$fher");
1116
  $is_liste_en_cours = 0;
1117
  while(<Fher>) {
1118
    chomp;
1119
    if(/^\s*(G\S+)/o) {
1120
      $nom_liste = $1;
1121
      $is_liste_en_cours = 1;
1122
      s/^\s*G\S+\s+//; s/\s+$//;
1123
      push(@{$listes_PTI{$nom_liste}},split(/\s+/,$_));
1124
    }
1125
    elsif(/^\s*noeuds/io or /^\s*elements/io or /^\s*[NAFE]/o) {
1126
      $is_liste_en_cours = 0;
1127
    }
1128
    elsif($is_liste_en_cours and /^\s*\d+(\s+\d+)*\s*$/io) {
1129
      s/^\s+//; s/\s+$//;
1130
      push(@{$listes_PTI{$nom_liste}},split(/\s+/,$_));
1131
    }
1132
  }
1133
  close(Fher);
1134

    
1135

    
1136
  #dans le .lis (si il existe)
1137
  if(-e $flis) {
1138

    
1139
  open(Flis, "<$flis");
1140
  $is_liste_en_cours = 0;
1141
  while(<Flis>) {
1142
    chomp;
1143
    if(/^\s*(N\S+)/o) {
1144
      $nom_liste = $1;
1145
      $is_liste_en_cours = 1;
1146
      s/^\s*N\S+\s+//; s/\s+$//;
1147
      push(@{$listes_NOEUDS{$nom_liste}},split(/\s+/,$_));
1148
    }
1149
    elsif(/^\s*noeuds/io or /^\s*elements/io or /^\s*[AFEG]/o) {
1150
      $is_liste_en_cours = 0;
1151
    }
1152
    elsif($is_liste_en_cours and /^\s*\d+(\s+\d+)*\s*$/i) {
1153
      s/^\s+//; s/\s+$//;
1154
      push(@{$listes_NOEUDS{$nom_liste}},split(/\s+/,$_));
1155
    }
1156
  }
1157
  close(Flis);
1158

    
1159
  open(Flis, "<$flis");
1160
  $is_liste_en_cours = 0;
1161
  while(<Flis>) {
1162
    chomp;
1163
    if(/^\s*(A\S+)/o) {
1164
      $nom_liste = $1;
1165
      $is_liste_en_cours = 1;
1166
      s/^\s*A\S+\s+//; s/\s+$//;
1167
      push(@{$listes_ARETES{$nom_liste}},split(/\s+/,$_));
1168
    }
1169
    elsif(/^\s*noeuds/io or /^\s*elements/io or /^\s*[NFEG]/o) {
1170
      $is_liste_en_cours = 0;
1171
    }
1172
    elsif($is_liste_en_cours and /^\s*\d+(\s+\d+)*\s*$/io) {
1173
      s/^\s+//; s/\s+$//;
1174
      push(@{$listes_ARETES{$nom_liste}},split(/\s+/,$_));
1175
    }
1176
  }
1177
  close(Flis);
1178

    
1179
  open(Flis, "<$flis");
1180
  $is_liste_en_cours = 0;
1181
  while(<Flis>) {
1182
    chomp;
1183
    if(/^\s*(F\S+)/o) {
1184
      $nom_liste = $1;
1185
      $is_liste_en_cours = 1;
1186
      s/^\s*F\S+\s+//; s/\s+$//;
1187
      push(@{$listes_FACES{$nom_liste}},split(/\s+/,$_));
1188
    }
1189
    elsif(/^\s*noeuds/io or /^\s*elements/io or /^\s*[NAEG]/o) {
1190
      $is_liste_en_cours = 0;
1191
    }
1192
    elsif($is_liste_en_cours and /^\s*\d+(\s+\d+)*\s*$/io) {
1193
      s/^\s+//; s/\s+$//;
1194
      push(@{$listes_FACES{$nom_liste}},split(/\s+/,$_));
1195
    }
1196
  }
1197
  close(Flis);
1198

    
1199
  open(Flis, "<$flis");
1200
  $is_liste_en_cours = 0;
1201
  while(<Flis>) {
1202
    chomp;
1203
    if(/^\s*(E\S+)/o) {
1204
      $nom_liste = $1;
1205
      $is_liste_en_cours = 1;
1206
      s/^\s*E\S+\s+//; s/\s+$//;
1207
      push(@{$listes_ELEMENTS{$nom_liste}},split(/\s+/,$_));
1208
    }
1209
    elsif(/^\s*noeuds/io or /^\s*elements/io or /^\s*[NAFG]/o) {
1210
      $is_liste_en_cours = 0;
1211
    }
1212
    elsif($is_liste_en_cours and /^\s*\d+(\s+\d+)*\s*$/io) {
1213
      s/^\s+//; s/\s+$//;
1214
      push(@{$listes_ELEMENTS{$nom_liste}},split(/\s+/,$_));
1215
    }
1216
  }
1217
  close(Flis);
1218

    
1219
  open(Flis, "<$flis");
1220
  $is_liste_en_cours = 0;
1221
  while(<Flis>) {
1222
    chomp;
1223
    if(/^\s*(G\S+)/o) {
1224
      $nom_liste = $1;
1225
      $is_liste_en_cours = 1;
1226
      s/^\s*G\S+\s+//; s/\s+$//;
1227
      push(@{$listes_PTI{$nom_liste}},split(/\s+/,$_));
1228
    }
1229
    elsif(/^\s*noeuds/io or /^\s*elements/io or /^\s*[NAFE]/o) {
1230
      $is_liste_en_cours = 0;
1231
    }
1232
    elsif($is_liste_en_cours and /^\s*\d+(\s+\d+)*\s*$/io) {
1233
      s/^\s+//; s/\s+$//;
1234
      push(@{$listes_PTI{$nom_liste}},split(/\s+/,$_));
1235
    }
1236
  }
1237
  close(Flis);
1238

    
1239
  }#if(-e $flis)
1240

    
1241
  #AFFICHAGE DES LISTES DE NOEUDS
1242
  #foreach my $nom (keys(%listes_NOEUDS)) {
1243
  #  print "$nom : @{$listes_NOEUDS{$nom}}\n";
1244
  #}
1245
  #AFFICHAGE DES LISTES D ARETES
1246
  #foreach my $nom (keys(%listes_ARETES)) {
1247
  #  print "$nom : @{$listes_ARETES{$nom}}\n";
1248
  #}
1249
  #AFFICHAGE DES LISTES DE FACES
1250
  #foreach my $nom (keys(%listes_FACES)) {
1251
  #  print "$nom : @{$listes_FACES{$nom}}\n";
1252
  #}
1253
  #AFFICHAGE DES LISTES D ELEMENTS
1254
  #foreach my $nom (keys(%listes_ELEMENTS)) {
1255
  #  print "$nom : @{$listes_ELEMENTS{$nom}}\n";
1256
  #}
1257
  #AFFICHAGE DES LISTES DE POINTS D INTEGRATION
1258
  #foreach my $nom (keys(%listes_PTI)) {
1259
  #  print "$nom : @{$listes_PTI{$nom}}\n";
1260
  #}
1261

    
1262
  return($nom_maillage, $nb_noeuds, \@tab_noeuds, $nb_elts, \%tab_elements,
1263
         \%listes_NOEUDS, \%listes_ARETES,
1264
         \%listes_FACES, \%listes_ELEMENTS, \%listes_PTI);
1265
}#sub lecture_mail_her
(3-3/6)
Redmine Appliance - Powered by TurnKey Linux