Projet

Général

Profil

Perl script : viewing Herezh meshes in Gmsh » hz_visuMail.pl

version 1.01 (légère modif dans la vérification des commandes Herezh et Gmsh) - Julien Troufflard, 25/03/2015 11:29

 
1
#!/usr/bin/perl
2
#!/usr/local/bin/perl
3
use strict;
4
use English;
5
use File::Basename;
6
my $NOM_PROG = basename $PROGRAM_NAME;
7

    
8

    
9
my $VERSION = '1.01';
10
#####################################################################################################
11
#  script pour visualiser un ou plusieurs maillages dans Gmsh                                       #
12
#  version 1.00 : version initiale                                                                  #
13
#                 (version testee sur : MacOSX Darwin, Linux Debian)                                #
14
#  version 1.01 : which du package File::Which n est plus utilise pour verifier l existence         #
15
#                 d une commande (pour eviter une erreur dans le cas ou ce package n est pas        #
16
#                 installe). A la place, on regarde la variable $PATH via la subroutine verif_cmd() #
17
#                 (version testee sur : MacOSX Darwin, Linux Debian, Linux Mint 16)                 #
18
#####################################################################################################
19

    
20

    
21

    
22

    
23
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
24
# VARIABLES QUE L UTILISATEUR PEUT ETRE AMENE A RENSEIGNER  #
25
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
26
#
27
# les variables $exeHZ et $exeGMSH servent a imposer le choix des executables Herezh et Gmsh
28
#   (rq : les alias shell ne fonctionneront pas)
29
#
30
#commande HZ++ definie par l utilisateur (modifiable egalement avec l option -exeHZ)
31
my $exeHZ; # = 'mon_executable_a_moi';
32
#commande gmsh definie par l utilisateur (modifiable egalement avec l option -exeGMSH)
33
my $exeGMSH; # = 'mon_executable_a_moi';
34

    
35

    
36
#commande Herezh par defaut selon la plateforme
37
#  rq : ces variables seront utilisees uniquement si la variable $exeHZ n a pas ete definie
38
my $EXE_HZ_Linux64bits = 'HZppfast64';#linux 64 bits
39
my $EXE_HZ_MacOSX = 'HZppfast_Vn-1';#MacOSX
40
my $EXE_HZ_autres = 'HZppfast';#tous les autres systemes
41
#commande gmsh par defaut (quelque soit la plateforme)
42
#  rq : cette variable sera utilisee uniquement si la variable $exeGMSH n a pas ete definie
43
my $exeGMSH_defaut = 'gmsh';
44

    
45
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
46
# FIN VARIABLES UTILISATEUR                                 #
47
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
48

    
49

    
50

    
51

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

    
57
  #indentation pour l affichage de Usage 2
58
  my $indent_Usage2 = ""; $indent_Usage2 .= " " for(1 .. length("          > $NOM_PROG "));
59

    
60
  print "--------------------------------\n";
61
  print " script $NOM_PROG\n";
62
  print "--------------------------------\n";
63
  print "\n";
64
  print "But : visualiser des maillages Herezh avec Gmsh\n";
65
  print "\n";
66
  print "Usage 1 : mode interactif\n";
67
  print "          > $NOM_PROG\n";
68
  print "Usage 2 : lancement avec arguments\n";
69
  print wrap("          ",$indent_Usage2, "> $NOM_PROG [-h|help] [-v] [-exeHZ path_HZ] [-exeGMSH path_GMSH] [-saveVisu] fher_1 [fher_2 .. fher_N]\n");
70
  print "\n";
71
  print "Arguments :\n";
72
  print "     - fic_1   : 1er maillage .her\n";
73
  print "     - [fher_2 .. fher_N] : maillages .her supplementaires eventuels\n";
74
  print "\n";
75
  print "Fonctionnement :\n";
76
  print "     $NOM_PROG lance un calcul herezh pour creer un fichier .msh\n";
77
  print "   qui est ensuite visualise dans Gmsh. La visualisation des references est\n";
78
  print "   desactivee a l ouverture (exceptee la derniere vue qui est specialement\n";
79
  print "   creee par ce script pour afficher les elements en vue solide)\n";
80
  print "     Le code couleur pour les references est :\n";
81
  print "                - reference de noeuds   => rouge\n";
82
  print "                - reference d  aretes   => jaune\n";
83
  print "                - reference de faces    => vert\n";
84
  print "                - reference d  elements => bleu\n";
85
  print "                - reference de points d integration => mauve\n";
86
  print "     Dans le cas de maillages avec beaucoup d elements, la preparation des fichiers\n";
87
  print "   peut prendre du temps. Il est alors conseille d utiliser l option -saveVisu pour\n";
88
  print "   conserver les fichiers de visualisation pour pouvoir les reouvrir ulterieurment\n";
89
  print "   sans avoir a reexecuter ce script.\n";
90
  print "\n";
91
  print "Options :\n";
92
  print "   -v : affichage du numero de version\n";
93
  print "\n";
94
  print "   -exeHZ path_HZ : choisir l executable Herezh++. Le calcul Herezh se\n";
95
  print "                    fera avec l executable path_HZ\n";
96
  print "                       par defaut : linux 64 bits   => path_HZ=HZppfast64\n";
97
  print "                                    MacOSX (darwin) => path_HZ=HZppfast_Vn-1\n";
98
  print "                                    autres          => path_HZ=HZppfast\n";
99
  print "                    (a noter que les alias shell ne fonctionneront pas)\n";
100
  print "                    (a noter que cette option fonctionne aussi en mode interactif)\n";
101
  print "\n";
102
  print "   -exeGMSH path_GMSH : choisir l executable Gmsh. La visualisation Gmsh se\n";
103
  print "                        fera avec l executable path_GMSH\n";
104
  print "                         par defaut : path_GMSH=gmsh (quelque soit la plateforme)\n";
105
  print "                        (a noter que les alias shell ne fonctionneront pas)\n";
106
  print "                        (a noter que cette option fonctionne aussi en mode interactif)\n";
107
  print "\n";
108
  print "   -saveVisu  : sauvegarde des fichiers .geo et .msh de visu\n";
109
  print "\n";
110
  print "Exemples :\n";
111
  print "   o visualiser les maillages mail1.her et mail2.her :\n";
112
  print "       > $NOM_PROG mail1.her mail2.her\n";
113
  print "   o visualiser le maillage mail1.her en choisissant l executable Herezh :\n";
114
  print "       > $NOM_PROG -exeHZ HZpp_perso mail1.her\n";
115
  print "   o visualiser le maillage mail1.her et sauvegarder les fichiers de visu :\n";
116
  print "       > $NOM_PROG -saveVisu  mail1.her\n";
117
  print "   o visualiser le maillage mail1.her en choisissant l executable Herezh et\n";
118
  print "     et l executable Gmsh (exemple dans le cas ou les executables se trouvent\n";
119
  print "     quelque part dans le HOME)\n";
120
  print "       > $NOM_PROG -exeHZ ~/mon_rep_HZ/HZpp -exeGMSH ~/mon_rep_GMSH/gmsh  mail1.her\n";
121
  print "\n";
122
  print "Auteur :\n";
123
  print "   TROUFFLARD Julien\n";
124
  print "       julien.troufflard\@univ-ubs.fr\n";
125
  print "       julien.troufflard\@free.fr\n";
126
  print "--------------------------------\n";
127
}
128

    
129

    
130

    
131
#------------------------------------
132
#option -h ou -help => affichage de l aide et arret
133
#------------------------------------
134
# rq : insensible a la casse
135
foreach my $arg (@ARGV) {
136
  if(($arg =~ /^-h$/i) or ($arg =~ /^-help$/i)) {
137
    affichage_aide();
138
    exit;
139
  }
140
}
141

    
142
#------------------------------------
143
#option -v => affichage de la version et arret
144
#------------------------------------
145
foreach my $arg (@ARGV) {
146
  if($arg eq '-v') {
147
    print "\n $NOM_PROG : version $VERSION\n\n";
148
    exit;
149
  }
150
}
151

    
152

    
153

    
154
#------------------------------------
155
#recuperation des arguments et options
156
#------------------------------------
157
my @liste_fher;#liste des maillages
158
my $is_opt_saveVisu = 0;#indicateur de l option -saveVisu (sauvegarde des fichiers .geo et _Gmsh.msh de visualisation)
159

    
160
#on parcourt la liste des arguments (on traite les options connues et on stocke les autres dans @args)
161
my $opt;
162
my @args;
163
while($#ARGV != -1) {
164
  $opt = shift(@ARGV);
165

    
166
  #option -exeHZ
167
  if($opt eq '-exeHZ') {
168
    $exeHZ = shift(@ARGV);
169
  }
170
  #option -exeGMSH
171
  elsif($opt eq '-exeGMSH') {
172
    $exeGMSH = shift(@ARGV);
173
  }
174
  #option -saveVisu
175
  elsif($opt eq '-saveVisu') {
176
    $is_opt_saveVisu = 1;
177
  }
178

    
179
  #cas d une option inconnue
180
  elsif($opt =~ /^-/) {
181
    warn "**Attention : option $opt inconnue (on ignore cette option)...\n";
182
  }
183

    
184
  #autres arguments
185
  else {
186
    push(@args,$opt);
187
  }
188
}#while($#ARGV != -1)
189

    
190

    
191
#---------------------
192
#verif de l executable Herezh
193
#---------------------
194
#si la variable $exeHZ n a pas ete renseigne au prealable => on selectionne l executable par defaut en fonction de la plateforme
195
if(not defined($exeHZ)) {
196
  #- - - - - -
197
  #type de plateforme
198
  #- - - - - -
199
  my $type_OS;
200
  #-avec uname
201
  if(verif_cmd('uname')) {
202
    $type_OS = qx(uname -a);
203
    chomp($type_OS);
204
  }
205
  #-sinon : warning (OS inconnue)
206
  else {warn "**Attention : impossible de saisir le type de systeme d exploitation avec uname -a ...\n";}
207

    
208
  #selection de l executable Herezh
209
  #-linux 64 bits
210
  if($type_OS =~ /linux/i and $type_OS =~ /x86_64/i) {$exeHZ = $EXE_HZ_Linux64bits;}
211
  #-MacOSX (darwin)
212
  elsif($type_OS =~ /darwin/i) {$exeHZ = $EXE_HZ_MacOSX;}
213
  #-tous les autres (y compris linux 32 bits)
214
  else{$exeHZ = $EXE_HZ_autres;}
215
}
216
#verif de l executable Herezh
217
verif_cmd($exeHZ) or die "\n**Erreur (prog:$NOM_PROG) : executable Herezh ($exeHZ) introuvable (pour eviter cette erreur : vous pouvez soit utiliser l option -exeHZ, soit renseigner directement la commande Herezh dans la variable \$exeHZ au debut du script)...\n\n";
218

    
219
#---------------------
220
#verif de l executable Gmsh
221
#---------------------
222
#si la variable $exeGMSH n a pas ete renseigne au prealable => on selectionne l executable par defaut
223
$exeGMSH = $exeGMSH_defaut if(not defined($exeGMSH));
224
#verif de l executable Gmsh
225
verif_cmd($exeGMSH) or die "\n**Erreur (prog:$NOM_PROG) : executable Gmsh ($exeGMSH) introuvable (pour eviter cette erreur : vous pouvez soit utiliser l option -exeGMSH, soit renseigner directement la commande Gmsh dans la variable \$exeGMSH au debut du script)...\n\n";
226

    
227

    
228

    
229

    
230

    
231
#---------------------
232
#liste des maillages (on en profite pour faire des verifs sur la validite du fichier)
233
#---------------------
234
#
235
# la liste @args va servir de liste temporaire pour la saisie des noms de fichier
236
#
237
#cas avec arguments
238
if($#args >= 0) {
239
  #rien a faire pour l instant (la liste @args a deja ete remplie par les arguments)
240
}
241
#cas en mode interactif (on remplit la liste @args avec un menu interactif)
242
else {
243
  print "\nChoix des maillages a visualiser :\n";
244
  print "    (taper liste pour afficher la liste actuelle)\n";
245
  my $choix = -1;
246
  while() {
247
    print "  Donner un nom de maillage (f pour finir) : ";
248
    $choix = <STDIN>; chomp($choix);
249
    next if($choix eq '');#cas ou l utilisateur a tape "Entree"
250

    
251
    #choix f => on arrete la saisie
252
    last if($choix eq 'f');
253

    
254
    if($choix eq 'liste') {
255
      print "  Liste actuelle :\n @args\n\n" if($choix eq 'liste');
256
      next;
257
    }
258

    
259
    push(@args, $choix);
260
  }
261
  print "\n";
262
}
263
#-verif de la validite des maillages
264
foreach my $arg (@args) {
265
  $arg .= '.her' if(not $arg =~ /\.her$/);#rajout de l extension .her si manquante
266
  #existence du fichier
267
  (-e $arg) or do {warn "**Attention : fichier $arg introuvable (on ignore ce fichier)...\n"; next;};
268
  #ouverture du fichier
269
  open(FIC, "<$arg") or do {warn "**Attention : impossible d ouvrir le fichier $arg (on ignore ce fichier)...\n"; next;};
270
  #est-ce un maillage Herezh ? (verif par la presence des mots noeuds et NOEUDS)
271
  my ($is_noeuds, $is_NOEUDS) = (0,0);
272
  while(<FIC>) {
273
    $is_noeuds = 1 if(/^\s*noeuds/);
274
    $is_NOEUDS = 1 if(/^\s*\d+\s+NOEUDS/);
275
    last if($is_NOEUDS);
276
  }
277
  close(FIC);
278
  $is_noeuds or do {warn "**Attention : le fichier $arg ne contient pas le mot \"noeuds\" (on ignore ce fichier)...\n"; next;};
279
  $is_NOEUDS or do {warn "**Attention : le fichier $arg ne contient pas le mot \"NOEUDS\" (on ignore ce fichier)...\n"; next;};
280

    
281
  #fichier ok => ajout a la liste
282
  push(@liste_fher, $arg);
283
}
284

    
285
#si a ce stade, la liste des maillages est vide => on arrete le programme
286
($#liste_fher > -1) or die "\nArret du programme car aucun maillage valide n a ete fourni...\n\n";
287

    
288

    
289

    
290
#---------------------
291
#verif des maillages (constitution de la liste des noms de maillage)
292
#---------------------
293
print "  verification des maillages...\n";
294
my @liste_nom_maillage;
295
#-verif 1 : si il y a un seul maillage et qu il n a pas de nom, on indique "premier_maillage" dans la liste des noms de maillages
296
if($#liste_fher == 0) {
297
  my $nom_maillage = '';
298
  open(FIC, "<$liste_fher[0]") or die "\n**Erreur (prog:$NOM_PROG) : impossible d ouvrir le fichier $liste_fher[0] ...\n\n";
299
  while(<FIC>) {
300
    last if(/^\s*noeuds/);
301
    next if(not /^\s*nom_maillage\s+(\S+)/);
302
    $nom_maillage = $1;
303
    last;
304
  }
305
  close(FIC);
306
  $nom_maillage = 'premier_maillage' if($nom_maillage eq '');
307
  push(@liste_nom_maillage, $nom_maillage);
308
}
309

    
310
#-verif 2 : si il y a plusieurs maillages, il faut qu il ait chacun un nom_maillage different (sinon arret du programme)
311
if($#liste_fher > 0) {
312
  my $is_maillage_ok = 1;
313
  foreach my $fher (@liste_fher) {
314
    my $nom_maillage = '';
315
    open(FIC, "<$fher") or die "\n**Erreur (prog:$NOM_PROG) : impossible d ouvrir le fichier $fher ...\n\n";;
316
    while(<FIC>) {
317
      next if(not /^\s*nom_maillage\s+(\S+)/);
318
      $nom_maillage = $1;
319
      last;
320
    }
321
    close(FIC);
322
    push(@liste_nom_maillage, $nom_maillage);
323
  }
324

    
325
  my @maillages_deja_traites; for(my $i=0; $i<=$#liste_nom_maillage; $i++) {$maillages_deja_traites[$i] = 0;}
326
  for(my $i=0; $i<=$#liste_nom_maillage; $i++) {
327
    next if($maillages_deja_traites[$i]);
328

    
329
    #cas d un maillage sans nom
330
    if($liste_nom_maillage[$i] eq '') {
331
      warn "**Erreur (prog:$NOM_PROG) : le maillage $liste_fher[$i] n a pas de nom (nom_maillage non specifie)...\n";
332
      $is_maillage_ok = 0;
333
      next;
334
    }
335

    
336
    #cas d un maillage ayant le meme nom qu un ou plusieurs autres maillages
337
    my @liste_maillages_meme_nom = ();
338
    for(my $j=$i+1; $j<=$#liste_nom_maillage; $j++) {
339
      if($liste_nom_maillage[$i] eq $liste_nom_maillage[$j]) {
340
        $maillages_deja_traites[$j] = 1;
341
        push(@liste_maillages_meme_nom, $liste_fher[$j]);
342
      }
343
    }
344
    if($#liste_maillages_meme_nom > -1) {
345
      warn "**Erreur (prog:$NOM_PROG) : les maillages suivants ont le meme nom => $liste_fher[$i] @liste_maillages_meme_nom\n";
346
      $is_maillage_ok = 0;
347
    }
348
  }
349

    
350
  #arret du programme si on a trouve des maillages sans nom ou des noms utilises plusieurs fois
351
  $is_maillage_ok or die "\nArret du programme a cause d un probleme sur les noms de maillages...\n\n";
352
}
353

    
354

    
355
#---------------------
356
#listes des elements 1D, 2D et 3D (pour affecter des lois de type LOI_RIEN)
357
#---------------------
358
print "  preparation du calcul Herezh...\n";
359
#-prefixes et suffixe pour la reconnaissance des elements 1D, 2D et axisymetriques
360
my @PREFIXE_1D = qw(POUT);
361
my @PREFIXE_2D = qw(TRIA QUAD);
362
my @SUFFIXE_AXI = qw(_AXI);
363

    
364
#-table de hachage pour definir pour chaque maillage, la liste des elements 1D, 2D, 3D (rq : les elements AXI sont consideres comme 3D car il necessite une loi 3D)
365
my %TAB_DIM_LOI;#@{$TAB_DIM_LOI{indice maillage}{dim loi}} = (liste elements) (par exemple, pour le premier maillage => @{$TAB_DIM_LOI{0}{'3D'}} = (1,5,10)
366

    
367
#on boucle sur les maillages pour constituer les listes d elements par dimension de loi de comportement pour chaque maillage
368
# rq : on en profite pour reperer si il y a au moins 1 element 1D et au moins un element 2D (pour savoir si il faudra renseigner le mot-cle sections et epaisseurs)
369
my $is_elt_1D = 0;#indicateur de la presence d au moins 1 element 1D
370
my $is_elt_2D = 0;#indicateur de la presence d au moins 1 element 2D
371
my $nb_elts_tot = 0;
372
for(my $no_mail=0; $no_mail<=$#liste_fher; $no_mail++) {
373
  #saisie des elements
374
  my ($nb_elts, $ref_elements);
375
  ($_, $_, $_, $nb_elts, $ref_elements) = lecture_mail_her($liste_fher[$no_mail]);
376
  $nb_elts_tot += $nb_elts;
377
  my @ELEM_1D = ();
378
  my @ELEM_2D = ();
379
  my @ELEM_3D = ();
380
  ELEM:for(my $i=1; $i<=$nb_elts; $i++) {
381
    #verif si element AXI (=> loi LOI_RIEN3D )
382
    foreach my $suffixe (@SUFFIXE_AXI) {
383
      @_ = split(/\s+/, $ref_elements->{$i}{'TYPE'});
384
      if($_[0] =~ /$suffixe\s*$/) {
385
        push(@ELEM_3D, $i);
386
        next ELEM;
387
      }
388
    }
389
    #verif si element 1D (=> loi LOI_RIEN1D )
390
    foreach my $prefixe (@PREFIXE_1D) {
391
      if($ref_elements->{$i}{'TYPE'} =~ /^\s*$prefixe/) {
392
        push(@ELEM_1D, $i);
393
        $is_elt_1D = 1;
394
        next ELEM;
395
      }
396
    }
397
    #verif si element 2D (=> loi LOI_RIEN2D_C )
398
    foreach my $prefixe (@PREFIXE_2D) {
399
      if($ref_elements->{$i}{'TYPE'} =~ /^\s*$prefixe/) {
400
        push(@ELEM_2D, $i);
401
        $is_elt_2D = 1;
402
        next ELEM;
403
      }
404
    }
405
    #sinon, c est un element 3D (=> loi LOI_RIEN3D )
406
    push(@ELEM_3D, $i);
407
  }#FIN BOUCLE SUR LES ELEMENTS DU MAILLAGE indice $no_mail
408

    
409
  #remplissage de la table pour ce maillage
410
  push(@{$TAB_DIM_LOI{$no_mail}{'1D'}}, @ELEM_1D);
411
  push(@{$TAB_DIM_LOI{$no_mail}{'2D'}}, @ELEM_2D);
412
  push(@{$TAB_DIM_LOI{$no_mail}{'3D'}}, @ELEM_3D);
413

    
414
}#FIN BOUCLE SUR LES MAILLAGES
415

    
416

    
417

    
418
#--------------------
419
#nom des fichiers .info, .CVisu, _Gmsh.msh et .geo temporaires (on s assure qu ils n existent pas deja)
420
#--------------------
421
my $racine_fic_tmp = $NOM_PROG; $racine_fic_tmp =~ s/\.\S+$//;
422
my $no = 0;
423
$racine_fic_tmp .= "_$no";
424
my $finfo = "$racine_fic_tmp.info";#fichier de calcul temporaire
425
my $fCVisu = "$racine_fic_tmp.CVisu";#.CVisu associe
426
my $fGmsh = "$racine_fic_tmp\_Gmsh.msh";#.msh qui va etre cree apres calcul
427
my $fgeo = "$racine_fic_tmp.geo";#.geo qui sera utilise pour lancer la visu
428

    
429
while(-e $finfo or -e $fCVisu or -e $fGmsh or -e $fgeo) {
430
  $no++;
431
  $racine_fic_tmp = $NOM_PROG; $racine_fic_tmp =~ s/\.\S+$//;
432
  $racine_fic_tmp .= "_$no";
433
  $finfo = "$racine_fic_tmp.info";
434
  $fCVisu = "$racine_fic_tmp.CVisu";
435
  $fGmsh = "$racine_fic_tmp\_Gmsh.msh";
436
  $fgeo = "$racine_fic_tmp.geo";
437
}
438
#-memorisation des eventuels fichiers deja existants qui commencent comme le fichier .info (pour ne pas les effacer a la fin du script)
439
my @liste_fic_a_ne_pas_effacer = glob("$racine_fic_tmp*");
440

    
441

    
442
#---------------------
443
#ecriture du .info
444
#---------------------
445
open(FIC, ">$finfo");
446
print FIC "dimension 3\n\n";
447

    
448
print FIC "niveau_commentaire 1\n\n";
449

    
450
#on choisit de lancer le calcul en dynamique_explicite en prevision des maillages a grand nombre de noeuds (plus rapide que non_dynamique pour faire un increment)
451
print FIC "TYPE_DE_CALCUL\ndynamique_explicite avec plus lectureCommandesVisu\n";
452

    
453
#ecriture des maillages et de references d elements speciales
454
for(my $no_mail=0; $no_mail<=$#liste_fher; $no_mail++) {
455
  my $fher = $liste_fher[$no_mail];
456
  my $flis = $fher; $flis =~ s/.her$/.lis/;
457
  print FIC "\n< $fher\n";
458
  print FIC "< $flis\n" if(-e $flis);#inclusion du .lis si il existe
459
  #set d elements speciaux en fonction de la dimension de la loi de comportement
460
  #  rq : on utilise une subroutine qui ecrit les references avec 15 elements max par ligne (sinon bug Herezh si il y a trop d elements par ligne)
461
  foreach my $dim ('1D', '2D', '3D') {
462
    next if($#{$TAB_DIM_LOI{$no_mail}{$dim}} == -1);#pas d ecriture si aucun element de dimension $dim
463
    ecrire_liste_N_E(*FIC, "E_tmp_visu_elem_$dim", @{$TAB_DIM_LOI{$no_mail}{$dim}});
464
  }
465
}
466

    
467
print FIC "\nchoix_materiaux\n";
468
for(my $no_mail=0; $no_mail<=$#liste_fher; $no_mail++) {
469
  #choix materiau par dimension de loi
470
  foreach my $dim ('1D', '2D', '3D') {
471
    next if($#{$TAB_DIM_LOI{$no_mail}{$dim}} == -1);#pas d ecriture si aucun element de dimension $dim
472
    print FIC "nom_mail= $liste_nom_maillage[$no_mail] E_tmp_visu_elem_$dim MAT$dim\n";
473
  }
474
}
475

    
476
print FIC "\nmateriaux\n";
477
print FIC "MAT1D LOI_RIEN1D\nMAT2D LOI_RIEN2D_C\nMAT3D LOI_RIEN3D\n\n";
478

    
479
print FIC "masse_volumique\n";
480
for(my $no_mail=0; $no_mail<=$#liste_fher; $no_mail++) {
481
  foreach my $dim ('1D', '2D', '3D') {
482
    next if($#{$TAB_DIM_LOI{$no_mail}{$dim}} == -1);#pas d ecriture si aucun element de dimension $dim
483
    print FIC "nom_mail= $liste_nom_maillage[$no_mail] E_tmp_visu_elem_$dim 1.\n";
484
  }
485
}
486

    
487
#sections pour les eventuels elements 1D
488
if($is_elt_1D) {
489
  print FIC "\nsections\n";
490
  for(my $no_mail=0; $no_mail<=$#liste_fher; $no_mail++) {
491
    next if($#{$TAB_DIM_LOI{$no_mail}{'1D'}} == -1);#pas d ecriture si aucun element de dimension $dim
492
    print FIC "nom_mail= $liste_nom_maillage[$no_mail] E_tmp_visu_elem_1D 1.\n";
493
  }
494
}
495

    
496
#epaisseurs pour les eventuels elements 2D
497
if($is_elt_2D) {
498
  print FIC "\nepaisseurs\n";
499
  for(my $no_mail=0; $no_mail<=$#liste_fher; $no_mail++) {
500
    next if($#{$TAB_DIM_LOI{$no_mail}{'2D'}} == -1);#pas d ecriture si aucun element de dimension $dim
501
    print FIC "nom_mail= $liste_nom_maillage[$no_mail] E_tmp_visu_elem_2D 1.\n";
502
  }
503
}
504

    
505
print FIC "\ncharges\n\n";
506
print FIC "blocages\n\n";
507

    
508
#controle => un seul increment
509
print FIC "controle\n";
510
print FIC "DELTAt 1.\n";
511
print FIC "TEMPSFIN 1.\n";
512
print FIC "SAUVEGARDE 0\n";
513
print FIC "MAXINCRE 1\n";
514

    
515
print FIC "\npara_pilotage_equi_global\n\n";
516

    
517
print FIC "para_syteme_lineaire\n\n";
518

    
519
print FIC "para_affichage\nFREQUENCE_SORTIE_FIL_DU_CALCUL 1\n\n";
520

    
521
print FIC "resultats pas_de_sortie_finale_\nCOPIE 0\n\n";
522

    
523
print FIC "_fin_point_info_\n";
524
close(FIC);
525

    
526

    
527
#---------------------
528
#ecriture du .CVisu
529
#---------------------
530
open(FIC, ">$fCVisu");
531
print FIC "
532
debut_fichier_commande_visu
533

    
534
  debut_visualisation_Gmsh
535
    debut_maillage_initial
536
      actif 1
537
      pseudo-homothetie_sur_les_maillages_ 0
538
      visualisation_references_sur_les_maillages_ 1
539
    fin_maillage_initial
540

    
541
    debut_choix_maillage
542
      actif 0
543
      1";
544
for(my $i=1; $i<=$#liste_fher; $i++) {$_ = $i + 1; print FIC " $_";}
545
print FIC " fin_choix_maillage
546
  fin_visualisation_Gmsh
547

    
548
fin_fichier_commande_visu
549
";
550
close(FIC);
551

    
552

    
553

    
554
#---------------------
555
#lancement du calcul
556
#---------------------
557
#-on lance le calcul avec redirection dans un fichier .log (au cas ou le calcul a plante => on propose la lecture de ce .log a l utilisateur)
558
my $fredir = "$racine_fic_tmp.log";
559
print "  creation du fichier _Gmsh.msh (calcul Herezh en cours)...\n";
560
system("rm -f $fGmsh $fredir");
561
system("echo \'#\' > $fredir; echo \'#fichier genere suite a l execution du script $NOM_PROG\' >> $fredir; echo \'#\' >> $fredir; echo \'\' >> $fredir");#affichage d un en-tete dans le fichier .log pour indiquer que ce fichier a ete cree lors de l execution de ce script
562
system("echo n | $exeHZ -f $finfo >> $fredir");#on lance avec "echo n" pour repondre automatiquement "non" au cas ou il y a une erreur de calcul Herezh
563

    
564
#cas ou la calcul n a pas fonctionne (si le fichier _Gmsh.msh n a pas ete cree)
565
#  => on propose a l utilisateur de visualiser le .log pour savoir ce qui s est passe
566
if(not -e $fGmsh) {
567
  print "\n**Erreur (prog:$NOM_PROG) : le calcul Herezh++ n a pas fonctionne (le fichier pour Gmsh n a pas ete cree)...\n\n";
568
  my $choix = -1;
569
  while($choix ne 'o' and $choix ne 'n') {
570
    print "  Voulez-vous visualiser l affichage Herezh++ du calcul ? (o/n) ";
571
    $choix = <STDIN>; chomp($choix); $choix = lc($choix);
572
  }
573
  if($choix eq 'o') {
574
    print "  => voir fichier $fredir\n";
575
    #on ajoute le fichier .log a la liste de fichiers a ne pas effacer
576
    push(@liste_fic_a_ne_pas_effacer, $fredir);
577
  }
578

    
579
  #destruction des fichiers de calcul
580
  efface_fic_herezh();
581

    
582
  #arret du programme
583
  die "\nArret du programme a cause d un probleme d execution Herezh++...\n\n";
584
}
585

    
586

    
587
#---------------------
588
#lecture du .msh et reecriture pour modifier les couleurs selon le type de reference (noeud, arete, face, element)
589
#  et pour saisir la liste des types de reference dans l ordre du fichier .msh pour affecter des options Gmsh suivant le type de reference
590
#---------------------
591

    
592
#on affecte une isovaleur par couleur :
593
#   - 0 => gris    (dedie a l affichage du maillage)
594
#   - 1 => bleu    (dedie a l affichage des refs d  elements)
595
#   - 2 => vert    (dedie a l affichage des refs de faces)
596
#   - 3 => jaune   (dedie a l affichage des refs d  aretes)
597
#   - 4 => rouge   (dedie a l affichage des refs de noeuds)
598
#   - 5 => mauve   (dedie a l affichage des refs de points d integration)
599
my $couleur_RGB_maillage = '{190, 190, 190, 255}';#gris
600
my $couleur_RGB_element  = '{  0,   150, 255, 255}';#bleu
601
my $couleur_RGB_face     = '{  0, 255,   0, 255}';#vert
602
my $couleur_RGB_arete    = '{240, 200,   0, 255}';#jaune
603
my $couleur_RGB_noeud    = '{255,   0,   0, 255}';#rouge
604
my $couleur_RGB_pti      = '{238, 130,   238, 255}';#mauve
605

    
606
#jeu de couleur par type de reference (on utilise les isovaleur gmsh qui vont du bleu fonce au rouge fonce en passant par le vert et le jaune)
607
#  rq : pour donner une idee des couleur, si on fixe les bornes d isovaleur entre [1:4], on a : 1.7=bleu clair, 2.5=vert, 3=>jaune, 3.6=rouge fonce
608
my %table_couleur_type_ref = ('pt_integr'=>5, 'noeud'=>4, 'arete'=>3, 'face'=>2, 'element'=>1);
609

    
610
#on va lister les types de ref
611
my @liste_type_reference;#liste des types de references
612

    
613
#fichier temporaire
614
my $ftmp = $fGmsh.rand(9999999); while(-e $ftmp) {$ftmp = $fGmsh.rand(9999999);}
615
open(FIC, "<$fGmsh");
616
open(Ftmp, ">$ftmp");
617
my $is_Element_data = 0;
618
my $couleur_type_ref;
619
print "  modification du fichier _Gmsh.msh...\n";
620
while(my $ligne = <FIC>) {
621

    
622
  #cas d un element data => on le recopie si il s agit d une reference existant reellement dans les maillages (avec la bonne isovaleur suivant le type de reference)
623
  if($ligne =~ /^\s*\$ElementData\s*$/i) {
624
    my $entete = $ligne;
625
    #on lit jusqu au nom de la reference
626
    while($ligne = <FIC>) {
627
      $entete .= $ligne;
628
      last if($ligne =~ /^\s*\"/);
629
    }
630

    
631
    #selection de l isovaleur en fonction du type de reference
632
    #-ref de noeuds
633
    if($ligne =~ /^\s*\"\s*N(\S+)/) {
634
      push(@liste_type_reference, 'noeud');
635
      $couleur_type_ref = $table_couleur_type_ref{'noeud'};
636
    }
637
    #-ref d aretes
638
    elsif($ligne =~ /^\s*\"\s*A(\S+)/) {
639
      push(@liste_type_reference, 'arete');
640
      $couleur_type_ref = $table_couleur_type_ref{'arete'};
641
    }
642
    #-ref de faces
643
    elsif($ligne =~ /^\s*\"\s*F(\S+)/) {
644
      push(@liste_type_reference, 'face');
645
      $couleur_type_ref = $table_couleur_type_ref{'face'};
646
    }
647
    #-ref d elements
648
    elsif($ligne =~ /^\s*\"\s*E(\S+)/) {
649
      push(@liste_type_reference, 'element');
650
      $couleur_type_ref = $table_couleur_type_ref{'element'};
651
    }
652
    #-ref de points d integration
653
    elsif($ligne =~ /^\s*\"\s*G(\S+)/) {
654
      push(@liste_type_reference, 'pt_integr');
655
      $couleur_type_ref = $table_couleur_type_ref{'pt_integr'};
656
    }
657

    
658
    #si le nom est une reference d elements creee par ce script => on ne l ecrit pas, on lit jusqu a la fin de l element data et on supprime cette ref de la liste @liste_type_reference
659
    if($ligne =~ /E_tmp_visu_elem_/) {
660
      while($ligne = <FIC>) {last if($ligne =~ /^\s*\$EndElementData\s*$/i);}
661
      pop(@liste_type_reference);#suppression du dernier element de la liste
662
    }
663
    #si c est une reference reellement dans le maillage, on recopie l en-tete actuel et on recopie l element data avec l isovaleur
664
    else {
665
      $is_Element_data = 1;
666
      print Ftmp $entete;
667
      while($ligne = <FIC>) {
668
        $ligne = "$1 $couleur_type_ref\n" if ($ligne =~ /^\s*(\d+)\s+\d+\s*$/);
669
        print Ftmp $ligne;
670
        last if($ligne =~ /^\s*\$EndElementData\s*$/i);
671
      }
672
    }
673
  }#if($ligne =~ /^\s*\$ElementData\s*$/i)
674

    
675
  #cas general : on recopie simplement la ligne courante
676
  else {
677
    print Ftmp $ligne;
678
  }
679
}
680
close(FIC);
681

    
682
#rajout d une ref supplementaire contenant tous les elements pour affichage des faces des elements 2D et 3D (on leur affecte l isovaleur 0, c est a dire couleur gris)
683
#  rq : les elements 1D se retrouvent egalement dans cette ref
684
print Ftmp "\$ElementData 
685
1 
686
\"Activer/Desactiver vue elements 2D 3D\"
687
0  
688
3 
689
0
690
1 
691
$nb_elts_tot\n";
692
for(my $i=1; $i<=$nb_elts_tot; $i++) {
693
  print Ftmp "$i 0\n";#isovaleur 0
694
}
695
print Ftmp "\$EndElementData\n";
696
close(Ftmp);
697
system("mv -f $ftmp $fGmsh");
698

    
699

    
700
#---------------------
701
#lancement de la visu Gmsh
702
#---------------------
703
#-on cree un fichier .geo pour y ecrire dans l ordre :
704
#  - des options generales a toutes les vues
705
#  - un Merge du .msh
706
#  - des options au cas par cas par type de reference
707
open(FIC, ">$fgeo");
708

    
709
#variable donnant le nom du fichier .msh
710
print FIC "//nom du fichier .msh\n";
711
print FIC "fichier_msh = \"$fGmsh\";\n\n";
712

    
713
#-options generales
714
print FIC '
715
Geometry.Light = 0;     //desactivation de la lumiere (geometrie)
716
Mesh.Light = 0;         //desactivation de la lumiere (maillage)
717
View.Light = 0;         //desactivation de la lumiere (vue)
718
Mesh.ColorCarousel = 0; //type de couleur (0=by element type, 1=by elementary entity, 2=by physical entity, 3=by partition)
719
Geometry.Points = 0;    //affichage des points (=0 desactiver, =1 activer)
720
Mesh.Points = 0;        //affichage des noeuds (=0 desactiver, =1 activer)
721
Mesh.Lines = 1;         //affichage des lignes (elements 1D) (=0 desactiver, =1 activer)
722
Mesh.SurfaceEdges = 1;  //affichage des aretes des elements 2D (=0 desactiver, =1 activer)
723
Mesh.SurfaceFaces = 0;  //affichage des faces des elements 2D (=0 desactiver, =1 activer)
724
Mesh.VolumeEdges = 1;   //affichage des aretes des elements 3D (=0 desactiver, =1 activer)
725
Mesh.VolumeFaces = 0;   //affichage des faces des elements 3D (=0 desactiver, =1 activer)
726
View.Visible = 0;       //desactivation de toutes les vues au demarrage
727
View.ShowScale = 0;     //desactivation de la vue de l echelle d isovaleur
728
View.RangeType = 2;     //type de bornes des isovaleurs (2=Custom)
729
View.CustomMin = 0;     //borne mini isovaleur (rappel de la convention adoptee pour $NOM_PROG : 0=>maillage, 1=>element, 2=>face, 3=>arete, 4=>noeud, 5=>point integration)
730
View.CustomMax = 5;     //borne maxi isovaleur
731
View.PointType = 1;     //type d affichage des points (1=3D sphere)
732
View.PointSize = 4.;    //taille des points
733
View.LineType = 1;      //type d affichage des lignes (1=3D cylinder)
734
View.LineWidth = 3.;    //taille des lignes
735

    
736
Mesh.PointSize = 3.;   //taille des noeuds
737
Mesh.Color.Points = {0,0,0};          //on met toutes les couleurs des elements en noir pour que les noeuds et les aretes des elements soient en noir
738
Mesh.Color.Lines = {0,0,0};           // la couleur des faces des elements 2D et 3D sera geree par l isovaleur 0 (gris) de la derniere View intitulee : Activer/Desactiver vue elements 2D 3D
739
Mesh.Color.Triangles = {0,0,0};
740
Mesh.Color.Quadrangles = {0,0,0};
741
Mesh.Color.Tetrahedra = {0,0,0};
742
Mesh.Color.Hexahedra = {0,0,0};
743
Mesh.Color.Prisms = {0,0,0};
744
Mesh.Color.Pyramids = {0,0,0};
745
';
746

    
747
#echelle de couleur des isovaleurs
748
print FIC "//couleur isovaleur :  couleur 1 (gris)  => isovaleur=0 (maillage)\n";
749
print FIC "//                     couleur 2 (bleu)  => isovaleur=1 (ref elements)\n";
750
print FIC "//                     couleur 3 (vert)  => isovaleur=2 (ref faces)\n";
751
print FIC "//                     couleur 4 (jaune) => isovaleur=3 (ref aretes)\n";
752
print FIC "//                     couleur 5 (rouge) => isovaleur=4 (ref noeuds)\n";
753
print FIC "//                     couleur 6 (mauve) => isovaleur=5 (ref points integration)\n";
754
#             valeur isovaleur      0                        1                    2                  3                   4                    5
755
print FIC "View.ColorTable = {$couleur_RGB_maillage, $couleur_RGB_element, $couleur_RGB_face, $couleur_RGB_arete, $couleur_RGB_noeud, $couleur_RGB_pti};\n";
756

    
757
#-Merge du fichier .msh (rq : on passe par Sprintf pour utiliser la variable fichier_msh definie au debut)
758
print FIC "\nMerge Sprintf(fichier_msh);\n\n";
759

    
760
#on indique d afficher la vue speciale qui sert a afficher les faces des elements 2D 3D (la derniere qui a ete cree)
761
#  rq : pour cette vue, on remet l affichage classique pour les points et les lignes
762
print FIC "//options speciales pour la derniere vue qui sert a l affichage des faces des elements 2D et 3D\n";
763
$_ = $#liste_type_reference + 1;#cette vue n est pas enregistree dans la liste, son numero est donc egal a la derniere + 1
764
print FIC "View[$_].Visible = 1;\n";
765
print FIC "View[$_].PointType = 0;     //type d affichage des points (0=Color dot)\n";
766
print FIC "View[$_].PointSize = 3.;    //taille des points\n";
767
print FIC "View[$_].LineType = 0;		//type d affichage des lignes (0=Color segment)\n";
768
print FIC "View[$_].LineWidth = 1.; 	//taille des lignes\n";
769
print FIC "View[$_].Explode = 0.999;   //on reduit legerement la taille de cette vue pour eviter un conflit de couleur quand on affiche des ref de faces ou d elements par dessus\n";
770

    
771
close(FIC);
772

    
773
print "  visu Gmsh en cours (via fichiers $fgeo et $fGmsh)...\n";
774
system("$exeGMSH $fgeo");
775

    
776
#cas de l option -saveVisu (sauvegarde des fichiers .geo et _Gmsh.msh)
777
if($is_opt_saveVisu) {
778
  #on ajoute les fichiers .geo et _Gmsh.msh a la liste des fichiers a ne pas effacer
779
  push(@liste_fic_a_ne_pas_effacer, $fgeo, $fGmsh);
780
  print "\nopt -saveVisu => Les fichiers $fgeo et $fGmsh ont ete sauvegardes...\n\n";
781
}
782

    
783
#destruction des fichiers de calcul
784
efface_fic_herezh();
785

    
786

    
787

    
788

    
789

    
790

    
791
#rq : cette subroutine utilise les variables globales $racine_fic_tmp et @liste_fic_a_ne_pas_effacer
792
sub efface_fic_herezh {
793
  #on transforme la liste des fichiers a ne pas effacer en table d indicateur (liste @liste_fic_a_ne_pas_effacer)
794
  my %NE_PAS_EFFACER;
795
  foreach my $fic (@liste_fic_a_ne_pas_effacer) {$NE_PAS_EFFACER{$fic} = 1;}
796
  #on saisit la liste actuelle des fichiers qui commencent comme le fichier .info
797
  my @liste_fic_actuelle = glob("$racine_fic_tmp*");
798
  #on efface seulement ceux qui n ont pas d indicateur %NE_PAS_EFFACER
799
  foreach my $fic (@liste_fic_actuelle) {
800
    system("rm -rf $fic") if(not defined($NE_PAS_EFFACER{$fic}));
801
  }
802
}
803

    
804

    
805
#surcouche de which pour traiter le cas d une commande en chemin absolu (cas qui apparemment ne marche pas avec la sub which d origine du package File::Which ??!!?!??!!!)
806
# N EST PLUS UTILISE DEPUIS LA VERSION 1.01 => A LA PLACE, ON UTILISE LA SUB verif_cmd()
807
##sub which_absolute {
808
##  use File::Which;
809
##  my $cmd = shift;
810
##  my @path;
811
##  #cas d une commande avec chemin absolu
812
##  if($cmd =~ /^\// and -x $cmd) {
813
##    @path = ($cmd);
814
##  }
815
##  #commande which classique
816
##  push(@path, which($cmd));
817
##  return(@path);
818
##}
819

    
820
#cette subroutine verifie l existence d une commande dans $PATH (remplace l utilisation de which depuis la version 1.01)
821
sub verif_cmd {
822
  my $cmd = shift;
823

    
824
  #verif directe : est-ce que le fichier existe et est executable
825
  return 1 if(-x $cmd);
826

    
827
  #sinon, on regarde dans les path
828
  foreach my $path (split(/\s*:\s*/, $ENV{PATH})) {
829
    return 1 if(-x "$path/$cmd");
830
  }
831

    
832
  #cas ou la commande n existe pas
833
  return 0;
834
}
835

    
836

    
837
#ecrire une liste de noeuds ou d elements
838
#  rq : a priori, si on met trop de noeuds/elements sur une meme ligne, Herezh plante (donc on se limite 15 nombres par ligne)
839
sub ecrire_liste_N_E {
840
  my $handle = shift;#le handle de fichier est passe par une variable
841
  my $nom_liste = shift;
842
  my @liste_no = @_;#liste des noeuds ou d elements
843

    
844
  my $cpt; my $cpt_max = 15; my $nb_blancs;
845

    
846
  $nb_blancs = ""; $nb_blancs .= " " for(1 .. length($nom_liste));
847
  $_ = shift(@liste_no);
848
  print $handle " $nom_liste $_";
849
  $cpt = 1;
850
  foreach my $no (@liste_no) {
851
    $cpt++;
852
    if($cpt == 1) {print $handle " $nb_blancs $no";}
853
    elsif($cpt == $cpt_max) {print $handle " $no\n"; $cpt = 0;}
854
    else {print $handle " $no";}
855
  }
856
  print $handle "\n" if($cpt != $cpt_max);
857
}#sub ecrire_liste_noeuds
858

    
859

    
860
#----------------
861
#sub qui lit un maillage herezh++ pour recuperer les noeuds, les elements et les listes de references
862
#et les renvoier sous forme de reference (lecture du .her et d un .lis si il existe)
863
#
864
# exemple d appel :
865
#  my ($nom_maillage, $nb_noeuds, $ref_tab_noeuds, $nb_elts, $ref_tab_elements, @ref_listes) = lecture_mail_her("fic_her.her");
866
#
867
#  avec - $nom_maillage     : nom du maillage (si il y en a un. sinon $nom_maillage sera egal a undef
868
#       - $nb_noeuds        : nombre de noeuds (entier)
869
#       - $ref_tab_noeuds   : reference vers un tableau de noeuds => $ref_tab_noeuds->[no noeud][0] : coordonnee x
870
#                                                                    $ref_tab_noeuds->[no noeud][1] : coordonnee y
871
#                                                                    $ref_tab_noeuds->[no noeud][2] : coordonnee z)
872
#       - $nb_elts          : nombre d elements (entier)
873
#       - $ref_tab_elements : reference vers une table de hashage => $ref_tab_elements->{no elt}{'TYPE'}      : type d element
874
#                                                                    @{$ref_tab_elements->{no elt}{'CONNEX'}} : (liste des noeuds)
875
#       - @ref_listes       : liste de references vers les tables de hashage contenant les listes de references de noeuds, aretes, faces et elements
876
#                             => $ref_listes[0] : reference vers la table de hashage des listes de noeuds  => @{$ref_listes[0]->{'nom liste'}} : (liste des noeuds)
877
#                                $ref_listes[1] : reference vers la table de hashage des listes d aretes   => @{$ref_listes[1]->{'nom liste'}} : (liste des aretes)
878
#                                $ref_listes[2] : reference vers la table de hashage des listes de faces   => @{$ref_listes[2]->{'nom liste'}} : (liste des faces)
879
#                                $ref_listes[3] : reference vers la table de hashage des listes d elements => @{$ref_listes[3]->{'nom liste'}} : (liste des elements)
880
#
881
sub lecture_mail_her {
882
  my $fher = shift;
883

    
884
  $fher .= '.her' if(not $fher =~ /\.her$/);
885

    
886
  my $nom_maillage;
887

    
888
  #------------------------
889
  # lecture du maillage .her
890
  #------------------------
891
  #-lecture de noeuds
892
  my @tab_noeuds; my $nb_noeuds;
893
  my $no_noeud;
894
  open(Fher, "<$fher") or die "\nErreur (sub:lecture_mail_her) : impossible d ouvrir le fichier $fher ...\n\n";
895
  while(<Fher>) {
896
    if(/^\s*nom_maillage\s+(\S+)/) {$nom_maillage = $1; next;}
897
    next if(not /(\d+)\s+NOEUDS/);
898
    $nb_noeuds = $1;
899
    last;
900
  }
901
  while(<Fher>) {
902
    last if($no_noeud == $nb_noeuds);
903
    next if(not /^\s*(\d+)\s+(\S+)\s+(\S+)\s+(\S+)\s*$/);
904
    $no_noeud = $1;
905
    @{$tab_noeuds[$no_noeud]} = ($2,$3,$4);
906
  }
907

    
908
  #-lecture des elements
909
  my %tab_elements; my $nb_elts;
910
  my $no_elt;
911
  while(<Fher>) {
912
    next if(not /(\d+)\s+ELEMENTS/);
913
    $nb_elts = $1;
914
    last;
915
  }
916
  while(<Fher>) {
917
    last if($no_elt == $nb_elts);
918
    next if(not /^\s*\d+\s+\w+\s+\w+/);
919
    s/^\s+//;s/\s+$//;
920
    $_ =~ /^(\d+)\s+/;
921
    $no_elt = $1; s/^(\d+)\s+//;
922
    $_ =~ /\s+(\d+(?:\s+\d+)*)$/;
923
    @{$tab_elements{$no_elt}{'CONNEX'}} = split(/\s+/, $1); s/\s+(\d+(?:\s+\d+)*)$//;
924
    $tab_elements{$no_elt}{'TYPE'} = $_; $tab_elements{$no_elt}{'TYPE'} =~ s/\s+/ /g;
925
  }
926
  close(Fher);
927

    
928

    
929
  #------------------------
930
  # lecture des references (dans le .her et dans un eventuel .lis)
931
  #------------------------
932
  my $flis = $fher; $flis =~ s/.her$/.lis/;
933
  my $nom_liste;
934
  my $is_liste_en_cours;
935
  my %listes_NOEUDS;
936
  my %listes_ARETES;
937
  my %listes_FACES;
938
  my %listes_ELEMENTS;
939

    
940
  #-dans le .her
941
  open(Fher, "<$fher");
942
  $is_liste_en_cours = 0;
943
  while(<Fher>) {
944
    chomp;
945
    if(/^\s*(N\S+)/) {
946
      $nom_liste = $1;
947
      $is_liste_en_cours = 1;
948
      s/^\s*N\S+\s+//; s/\s+$//;
949
      push(@{$listes_NOEUDS{$nom_liste}},split(/\s+/,$_));
950
    }
951
    elsif(/^\s*noeuds/i or /^\s*elements/i or /^\s*[AFE]/) {
952
      $is_liste_en_cours = 0;
953
    }
954
    elsif($is_liste_en_cours and /^\s*\d+(\s+\d+)*\s*$/i) {
955
      s/^\s+//; s/\s+$//;
956
      push(@{$listes_NOEUDS{$nom_liste}},split(/\s+/,$_));
957
    }
958
  }
959
  close(Fher);
960

    
961
  open(Fher, "<$fher");
962
  $is_liste_en_cours = 0;
963
  while(<Fher>) {
964
    chomp;
965
    if(/^\s*(A\S+)/) {
966
      $nom_liste = $1;
967
      $is_liste_en_cours = 1;
968
      s/^\s*A\S+\s+//; s/\s+$//;
969
      push(@{$listes_ARETES{$nom_liste}},split(/\s+/,$_));
970
    }
971
    elsif(/^\s*noeuds/i or /^\s*elements/i or /^\s*[NFE]/) {
972
      $is_liste_en_cours = 0;
973
    }
974
    elsif($is_liste_en_cours and /^\s*\d+(\s+\d+)*\s*$/i) {
975
      s/^\s+//; s/\s+$//;
976
      push(@{$listes_ARETES{$nom_liste}},split(/\s+/,$_));
977
    }
978
  }
979
  close(Fher);
980

    
981
  open(Fher, "<$fher");
982
  $is_liste_en_cours = 0;
983
  while(<Fher>) {
984
    chomp;
985
    if(/^\s*(F\S+)/) {
986
      $nom_liste = $1;
987
      $is_liste_en_cours = 1;
988
      s/^\s*F\S+\s+//; s/\s+$//;
989
      push(@{$listes_FACES{$nom_liste}},split(/\s+/,$_));
990
    }
991
    elsif(/^\s*noeuds/i or /^\s*elements/i or /^\s*[NAE]/) {
992
      $is_liste_en_cours = 0;
993
    }
994
    elsif($is_liste_en_cours and /^\s*\d+(\s+\d+)*\s*$/i) {
995
      s/^\s+//; s/\s+$//;
996
      push(@{$listes_FACES{$nom_liste}},split(/\s+/,$_));
997
    }
998
  }
999
  close(Fher);
1000

    
1001
  open(Fher, "<$fher");
1002
  $is_liste_en_cours = 0;
1003
  while(<Fher>) {
1004
    chomp;
1005
    if(/^\s*(E\S+)/) {
1006
      $nom_liste = $1;
1007
      $is_liste_en_cours = 1;
1008
      s/^\s*E\S+\s+//; s/\s+$//;
1009
      push(@{$listes_ELEMENTS{$nom_liste}},split(/\s+/,$_));
1010
    }
1011
    elsif(/^\s*noeuds/i or /^\s*elements/i or /^\s*[NAF]/) {
1012
      $is_liste_en_cours = 0;
1013
    }
1014
    elsif($is_liste_en_cours and /^\s*\d+(\s+\d+)*\s*$/i) {
1015
      s/^\s+//; s/\s+$//;
1016
      push(@{$listes_ELEMENTS{$nom_liste}},split(/\s+/,$_));
1017
    }
1018
  }
1019
  close(Fher);
1020

    
1021

    
1022
  #dans le .lis (si il existe)
1023
  if(-e $flis) {
1024

    
1025
  open(Flis, "<$flis") or die "\nErreur (sub:lecture_mail_her) : impossible d ouvrir le fichier $flis ...\n\n";
1026
  $is_liste_en_cours = 0;
1027
  while(<Flis>) {
1028
    chomp;
1029
    if(/^\s*(N\S+)/) {
1030
      $nom_liste = $1;
1031
      $is_liste_en_cours = 1;
1032
      s/^\s*N\S+\s+//; s/\s+$//;
1033
      push(@{$listes_NOEUDS{$nom_liste}},split(/\s+/,$_));
1034
    }
1035
    elsif(/^\s*noeuds/i or /^\s*elements/i or /^\s*[AFE]/) {
1036
      $is_liste_en_cours = 0;
1037
    }
1038
    elsif($is_liste_en_cours and /^\s*\d+(\s+\d+)*\s*$/i) {
1039
      s/^\s+//; s/\s+$//;
1040
      push(@{$listes_NOEUDS{$nom_liste}},split(/\s+/,$_));
1041
    }
1042
  }
1043
  close(Flis);
1044

    
1045
  open(Flis, "<$flis");
1046
  $is_liste_en_cours = 0;
1047
  while(<Flis>) {
1048
    chomp;
1049
    if(/^\s*(A\S+)/) {
1050
      $nom_liste = $1;
1051
      $is_liste_en_cours = 1;
1052
      s/^\s*A\S+\s+//; s/\s+$//;
1053
      push(@{$listes_ARETES{$nom_liste}},split(/\s+/,$_));
1054
    }
1055
    elsif(/^\s*noeuds/i or /^\s*elements/i or /^\s*[NFE]/) {
1056
      $is_liste_en_cours = 0;
1057
    }
1058
    elsif($is_liste_en_cours and /^\s*\d+(\s+\d+)*\s*$/i) {
1059
      s/^\s+//; s/\s+$//;
1060
      push(@{$listes_ARETES{$nom_liste}},split(/\s+/,$_));
1061
    }
1062
  }
1063
  close(Flis);
1064

    
1065
  open(Flis, "<$flis");
1066
  $is_liste_en_cours = 0;
1067
  while(<Flis>) {
1068
    chomp;
1069
    if(/^\s*(F\S+)/) {
1070
      $nom_liste = $1;
1071
      $is_liste_en_cours = 1;
1072
      s/^\s*F\S+\s+//; s/\s+$//;
1073
      push(@{$listes_FACES{$nom_liste}},split(/\s+/,$_));
1074
    }
1075
    elsif(/^\s*noeuds/i or /^\s*elements/i or /^\s*[NAE]/) {
1076
      $is_liste_en_cours = 0;
1077
    }
1078
    elsif($is_liste_en_cours and /^\s*\d+(\s+\d+)*\s*$/i) {
1079
      s/^\s+//; s/\s+$//;
1080
      push(@{$listes_FACES{$nom_liste}},split(/\s+/,$_));
1081
    }
1082
  }
1083
  close(Flis);
1084

    
1085
  open(Flis, "<$flis");
1086
  $is_liste_en_cours = 0;
1087
  while(<Flis>) {
1088
    chomp;
1089
    if(/^\s*(E\S+)/) {
1090
      $nom_liste = $1;
1091
      $is_liste_en_cours = 1;
1092
      s/^\s*E\S+\s+//; s/\s+$//;
1093
      push(@{$listes_ELEMENTS{$nom_liste}},split(/\s+/,$_));
1094
    }
1095
    elsif(/^\s*noeuds/i or /^\s*elements/i or /^\s*[NAF]/) {
1096
      $is_liste_en_cours = 0;
1097
    }
1098
    elsif($is_liste_en_cours and /^\s*\d+(\s+\d+)*\s*$/i) {
1099
      s/^\s+//; s/\s+$//;
1100
      push(@{$listes_ELEMENTS{$nom_liste}},split(/\s+/,$_));
1101
    }
1102
  }
1103
  close(Flis);
1104

    
1105
  }#if(-e $flis)
1106

    
1107
  #AFFICHAGE DES LISTES DE NOEUDS
1108
  #foreach my $nom (keys(%listes_NOEUDS)) {
1109
  #  print "$nom : @{$listes_NOEUDS{$nom}}\n";
1110
  #}
1111
  #AFFICHAGE DES LISTES D ARETES
1112
  #foreach my $nom (keys(%listes_ARETES)) {
1113
  #  print "$nom : @{$listes_ARETES{$nom}}\n";
1114
  #}
1115
  #AFFICHAGE DES LISTES DE FACES
1116
  #foreach my $nom (keys(%listes_FACES)) {
1117
  #  print "$nom : @{$listes_FACES{$nom}}\n";
1118
  #}
1119
  #AFFICHAGE DES LISTES D ELEMENTS
1120
  #foreach my $nom (keys(%listes_ELEMENTS)) {
1121
  #  print "$nom : @{$listes_ELEMENTS{$nom}}\n";
1122
  #}
1123

    
1124
  return($nom_maillage, $nb_noeuds, \@tab_noeuds, $nb_elts, \%tab_elements,
1125
         \%listes_NOEUDS, \%listes_ARETES,
1126
         \%listes_FACES, \%listes_ELEMENTS);
1127
}#sub lecture_mail_her
(2-2/24)
Redmine Appliance - Powered by TurnKey Linux