Projet

Général

Profil

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

version 1.033 (correction d'un bug sur l'option -merge) - Julien Troufflard, 02/10/2023 19:21

 
1
#!/usr/bin/env perl
2
use strict;
3
use warnings;
4
use English;
5
use File::Spec::Functions qw(rel2abs);
6
use Cwd qw(cwd abs_path);
7
use File::Basename;
8
my $NOM_PROG = basename $PROGRAM_NAME;
9

    
10

    
11
my $VERSION = '1.033';
12
#####################################################################################################
13
#  script pour visualiser un ou plusieurs maillages dans Gmsh                                       #
14
#  version 1.00 : version initiale                                                                  #
15
#                 (version testee sur : MacOSX Darwin, Linux Debian)                                #
16
#  version 1.01 : which du package File::Which n est plus utilise pour verifier l existence         #
17
#                 d une commande (pour eviter une erreur dans le cas ou ce package n est pas        #
18
#                 installe). A la place, on regarde la variable $PATH via la subroutine verif_cmd() #
19
#                 (version testee sur : MacOSX Darwin, Linux Debian, Linux Mint 16)                 #
20
#  version 1.02 : modification de la facon dont le calcul Herezh temporaire est lance de maniere    #
21
#                 a faciliter l arret du programme avec ctrl+c. Le signal ctrl+c est capture via    #
22
#                 $SIG{INT} et le calcul Herezh est lance dans un processus fils fork() pour        #
23
#                 permettre l application de la subroutine pointee par $SIG{INT}                    #
24
#                 ( cette modif permet de stopper l execution du programme dans le cas ou           #
25
#                   l utilisateur n a pas envie d attendre la fin d un calcul Herezh trop long )    #
26
#  version 1.021 : (((rien de special)))                                                            #
27
#                    1) il y a avait un "lectureCommandesVisu" inutile dans le calcul temporaire    #
28
#                       mais qui ne posait pas de souci. Il est supprime par securite               #
29
#                    2) ajout du pragma "use warnings;" et donc en consequence => legere modif de   #
30
#                       la subroutine lecture_mail_her() pour debugger quelques warnings            #
31
#  version 1.022 : ajout de ./ dans l appel system() d execution de Herezh via lien symbolique      #
32
#                  (car dans le cas ou le repertoire courant ne figure pas dans les PATH, ce lien   #
33
#                   symbolique qui est cree dans le repertoire courant n etait pas trouve et donc,  #
34
#                   Herezh n etait pas lance)                                                       #
35
#  version 1.023 : ajout de l option -quit (execution normale du script mais sans lancement de la   #
36
#                  visu gmsh). Typiquement, cette option est utilisee conjointement a -saveVisu, ce #
37
#                  qui permet de generer le fichier de visu, le sauvegarder et quitter              #
38
#  version 1.024 : ajout option -lis_[i] : ajout d un fichier .lis pour le maillage i               #
39
#                  exemple : -lis_2 toto.lis => ajoute les references de toto.lis pour le 2eme      #
40
#                                               maillage                                            #
41
#                  exemple : -lis_3 toto.lis -lis_3 titi.lis => ajoute les references de toto.lis   #
42
#                                                               et titi.lis pour le 3eme maillage   #
43
#  version 1.025 : ajout option -disable_F (desactivation des listes de reference de faces pour     #
44
#                    permettant de mieux voir les numeros d elements dans le cas des elements 2D)   #
45
#  version 1.026 : 1) ajout option -disable_lis_[i] (desactivation du fichier .lis du maillage i;   #
46
#                     ce qui n empeche d utiliser l option -lis_[i] pour activer d autres .lis)     #
47
#                  2) ajout option -wireframe (desactiver la vue des faces des elements 2D et 3D au #
48
#                     demarrage de gmsh)                                                            #
49
#  version 1.027 : ajout option -saveInfo (sauvegarde des fichiers de calcul herezh)                #
50
#  version 1.028 : correction d un bug graphique lie a gmsh en ajoutant 2 points de maniere a       #
51
#                  forcer gmsh a dezoomer au depart (ajout de 2 points Point() = {x,y,z,1} a la fin #
52
#                  du fichier .geo de visualisation)                                                #  
53
#  version 1.029 : modif de la maniere dont on repere les elements axisymetriques au moment du      #
54
#                  choix de la loi de comportement                                                  #
55
#                  changement de place du traitement de l option -saveInfo (deplace avant le        #
56
#                  lancement du calcul)                                                             #
57
#  version 1.03  : ajout option -disable_A (desactivation des listes de reference d aretes pour     #
58
#                    permettant de mieux voir les numeros d elements dans le cas des elements 1D)   #
59
#  version 1.031 : les fichiers temporaires de visualisation sont desormais crees dans un repertoire#
60
#                  temporaire sous /tmp au lieu de les creer dans le repertoire courant             #
61
#                  (et suppression adresse mail julien.troufflard@univ-ubs.fr dans l aide)          #
62
#  version 1.032 : ajout option -merge (possibilite d inclure un fichier a la visualisation)        #
63
#                    NB : pour l instant pour eviter diverses bugs, cette option est restreinte :   #
64
#                           - a un seul fichier (option utilisable une seule fois)                  #
65
#                           - aux types de fichier suivants : .geo, .step .stp                      #
66
#  version 1.033 : correction mineure sur la mise en oeuvre de l option -merge                      #
67
#                  (bug dans la reconnaissance de l extension du fichier a inclure)                 #
68
#####################################################################################################
69

    
70

    
71

    
72

    
73
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
74
# VARIABLES QUE L UTILISATEUR PEUT ETRE AMENE A RENSEIGNER  #
75
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
76
#
77
# les variables $exeHZ et $exeGMSH servent a imposer le choix des executables Herezh et Gmsh
78
#   (rq : les alias shell ne fonctionneront pas)
79
#
80
#commande HZ++ definie par l utilisateur (modifiable egalement avec l option -exeHZ)
81
my $exeHZ; # = 'mon_executable_a_moi';
82
#commande gmsh definie par l utilisateur (modifiable egalement avec l option -exeGMSH)
83
my $exeGMSH; # = 'mon_executable_a_moi';
84

    
85

    
86
#commande Herezh par defaut selon la plateforme
87
#  rq : ces variables seront utilisees uniquement si la variable $exeHZ n a pas ete definie
88
my $EXE_HZ_Linux64bits = 'HZppfast64';#linux 64 bits
89
my $EXE_HZ_MacOSX = 'HZppfast_Vn-1';#MacOSX
90
my $EXE_HZ_autres = 'HZppfast';#tous les autres systemes
91
#commande gmsh par defaut (quelque soit la plateforme)
92
#  rq : cette variable sera utilisee uniquement si la variable $exeGMSH n a pas ete definie
93
my $exeGMSH_defaut = 'gmsh';
94

    
95
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
96
# FIN VARIABLES UTILISATEUR                                 #
97
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
98

    
99

    
100

    
101

    
102

    
103

    
104

    
105

    
106

    
107
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
108
# VARIABLES GLOBALES (NE PAS MODIFIER : RESERVEES AUX DEVELOPPEURS) #
109
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
110
#option -merge : liste des extensions de fichier autorisees pour cette option
111
#                IMPORTANT : quand un type de fichier peut prendre plusieurs extensions, on les range toutes
112
#                            au sein d une meme chaine de caracteres separees par un ou plusieurs espaces
113
#                            (exemple : ".step .stp" pour un fichier STEP)
114
#                            (NB : la verification sera insensible a la casse => inutile de mettre des majuscules)
115
my @EXTENSION_OPT_MERGE = (".geo", ".step .stp");
116

    
117

    
118

    
119

    
120
sub affichage_aide {
121
  use Text::Wrap;
122
  #config du package Text::Wrap
123
  $Text::Wrap::columns = 81;#le nombre de caracteres maximum par ligne sera egal a ($Text::Wrap::columns - 1) dans le cas ou utilise wrap
124

    
125
  #indentation de longueur $NOM_PROG
126
  my $indent_NOM_PROG = ""; $indent_NOM_PROG .= " " for(1 .. length($NOM_PROG));
127

    
128
  print "----------------------------------------\n";
129
  print " script $NOM_PROG  (version $VERSION)\n";
130
  print "----------------------------------------\n";
131
  print "\n";
132
  print "But : visualiser des maillages Herezh avec Gmsh\n";
133
  print "\n";
134
  print "Usage 1 : mode interactif\n";
135
  print "          > $NOM_PROG\n";
136
  print "Usage 2 : lancement avec arguments\n";
137
  print wrap("          ","            $indent_NOM_PROG ", "> $NOM_PROG [-h|help] [-v] [-exeHZ path_HZ] [-exeGMSH path_GMSH] [-saveVisu] fher_1 [fher_2 .. fher_N]\n");
138
  print "\n";
139
  print "Arguments :\n";
140
  print "     o fic_1   : 1er maillage .her\n";
141
  print "     o [fher_2 .. fher_N] : maillages .her supplementaires eventuels\n";
142
  print "\n";
143
  print "Fonctionnement :\n";
144
  print wrap("      ", "    ", "$NOM_PROG lance un calcul herezh pour creer un fichier .msh ",
145
                               "qui est ensuite visualise dans Gmsh. La visualisation des references est ",
146
                               "desactivee a l ouverture (exceptee la derniere vue qui est specialement ",
147
                               "creee par ce script pour afficher les elements en vue solide) ",
148
                               "Le code couleur pour les references est :\n");
149
  print wrap("          ", "          ", "- reference de noeuds   => rouge\n",
150
                                      "- reference d  aretes   => jaune\n",
151
                                      "- reference de faces    => vert\n",
152
                                      "- reference d  elements => bleu\n",
153
                                      "- reference de points d integration => mauve\n");
154
  print wrap("      ", "    ", "Dans le cas de maillages avec beaucoup d elements, la preparation des fichiers ", 
155
  "peut prendre du temps. Il est alors conseille d utiliser l option -saveVisu pour ",
156
  "conserver les fichiers de visualisation pour pouvoir les reouvrir ulterieurment ",
157
  "sans avoir a reexecuter ce script.\n");
158
  print "\n";
159
  print "Options :\n";
160
  print "    -v : affichage du numero de version\n";
161
  print "\n";
162
  print wrap("    ", "                     ", "-exeHZ path_HZ : choisir l executable Herezh++. Le calcul Herezh se ",
163
                                                               "fera avec l executable path_HZ\n",
164
                                                               "par defaut : linux 64 bits   => path_HZ=HZppfast64\n", 
165
                                                               "             MacOSX (darwin) => path_HZ=HZppfast_Vn-1\n",
166
                                                               "             autres          => path_HZ=HZppfast\n",
167
                                                               "(a noter que les alias shell ne fonctionneront pas)\n",
168
                                                               "(a noter que cette option fonctionne aussi en mode interactif)\n");
169
  print "\n";
170
  print wrap("    ", "                         ", "-exeGMSH path_GMSH : choisir l executable Gmsh. La visualisation Gmsh se ",
171
                                                                       "fera avec l executable path_GMSH\n",
172
                                                                       "par defaut : path_GMSH=gmsh\n",
173
                                                                       "(a noter que les alias shell ne fonctionneront pas)\n",
174
                                                                       "(a noter que cette option fonctionne aussi en mode interactif)\n");
175
  print "\n";
176
  print wrap("    ", "                 ", "-saveVisu : sauvegarde des fichiers .geo et .msh de visu\n");
177
  print "\n";
178
  print wrap("    ", "                 ", "-saveInfo : sauvegarde des fichiers de calcul Herezh++ (.info et .CVisu)\n");
179
  print "\n";
180
  print wrap("    ", "            ", "-quit : executer le script sans lancer la visualisation Gmsh\n");
181
  print "\n";
182
  print wrap("    ", "                     ", "-lis_i fic.lis : ajout de fichiers de listes de reference pour le maillage f_her_i ",
183
                                                               "(cette option peut etre repetee autant de fois que necessaire)\n",
184
                                                               "exemple : $NOM_PROG -lis_1 mon_fic.lis maillage.her\n");
185
  print "\n";
186
  print wrap("    ", "                  ", "-disable_F  : desactiver l affichage des listes de reference de faces\n");
187
  print "\n";
188
  print wrap("    ", "                  ", "-disable_A  : desactiver l affichage des listes de reference d aretes\n");
189
  print "\n";
190
  print wrap("    ", "                  ", "-disable_lis_i  : desactiver le fichier .lis associe au maillage f_her_i \n",
191
                                                               "    exemple : $NOM_PROG -disable_lis_1 maillage.her\n",
192
                                                               "    **remarque : l option -lis_i reste disponible si besoin\n");
193
  print "\n";
194
  print wrap("    ", "                  ", "-wireframe  : desactiver la vue concernant l affichage des faces des elements 2D et 3D\n",
195
                                                               "**remarque : la vue reste disponible si besoin dans la visualition gmsh\n");
196
  print "\n";
197
  print wrap("    ", "                  ", "-merge fic : inclure le fichier fic a la visualisation\n");
198
  print wrap("                  ", "                  ", "  **remarque 1 : option utilisable une seule fois\n");
199
  print wrap("                  ", "                                   ", "  **remarque 2 : option restreinte aux types de fichier suivants :\n",);
200
  foreach my $extension (@EXTENSION_OPT_MERGE) {
201
    print wrap("                                   ", " ", "  > $extension\n");
202
  }
203
  print "\n";
204
  print "Exemples :\n";
205
  print wrap("    ", "      ", "o visualiser les maillages mail1.her et mail2.her :\n");
206
  print wrap("        ", "          $indent_NOM_PROG ", "> $NOM_PROG mail1.her mail2.her\n");
207
  print wrap("    ", "      ", "o visualiser le maillage mail1.her en choisissant l executable Herezh :\n");
208
  print wrap("        ", "          $indent_NOM_PROG ", "> $NOM_PROG -exeHZ HZpp_perso mail1.her\n");
209
  print wrap("    ", "      ", "o visualiser le maillage mail1.her et sauvegarder les fichiers de visu :\n");
210
  print wrap("        ", "          $indent_NOM_PROG ", "> $NOM_PROG -saveVisu  mail1.her\n");
211
  print wrap("    ", "      ", "o visualiser le maillage mail1.her en choisissant l executable Herezh et ",
212
                                 "l executable Gmsh (exemple dans le cas ou les executables se trouvent ",
213
                                 "quelque part dans le HOME) :\n");
214
  print wrap("        ", "          $indent_NOM_PROG ", "> $NOM_PROG -exeHZ ~/mon_rep_HZ/HZpp -exeGMSH ~/mon_rep_GMSH/gmsh  mail1.her\n");
215
  print wrap("    ", "      ", "o creer et sauvegarder les fichiers de visualisation sans lancer la visualisation :\n");
216
  print wrap("        ", "          $indent_NOM_PROG ", "> $NOM_PROG -saveVisu -quit  mail1.her\n");
217
  print wrap("    ", "      ", "o creer et sauvegarder les fichiers de calcul .info et .CVisu sans lancer la visualisation :\n");
218
  print wrap("        ", "          $indent_NOM_PROG ", "> $NOM_PROG -saveInfo -quit  mail1.her\n");
219
  print wrap("    ", "      ", "o visualiser 2 maillages en ajoutant 2 fichiers .lis supplementaires pour le 2eme maillage :\n");
220
  print wrap("        ", "          $indent_NOM_PROG ", "> $NOM_PROG -lis_2 ref_sup.lis -lis_2 autres_ref_sup.lis  mail1.her mail2.her\n");
221
  print wrap("    ", "      ", "o visualiser 1 maillage en ajoutant 1 fichier .lis supplementaire et en desactivant le .lis principal :\n");
222
  print wrap("        ", "          $indent_NOM_PROG ", "> $NOM_PROG -lis_1 ref_sup.lis -disable_lis_1 mail1.her\n");
223
  print "\n";
224
  print "Auteur :\n";
225
  print "   TROUFFLARD Julien\n";
226
  print "       julien.troufflard\@free.fr\n";
227
  print "----------------------------------------\n";
228
}
229

    
230

    
231

    
232
#------------------------------------
233
#option -h ou -help => affichage de l aide et arret
234
#------------------------------------
235
# rq : insensible a la casse
236
foreach my $arg (@ARGV) {
237
  if(($arg =~ /^-h$/i) or ($arg =~ /^-help$/i)) {
238
    affichage_aide();
239
    exit;
240
  }
241
}
242

    
243
#------------------------------------
244
#option -v => affichage de la version et arret
245
#------------------------------------
246
foreach my $arg (@ARGV) {
247
  if($arg eq '-v') {
248
    print "\n $NOM_PROG : version $VERSION\n\n";
249
    exit;
250
  }
251
}
252

    
253

    
254

    
255
#------------------------------------
256
#recuperation des arguments et options
257
#------------------------------------
258
my @liste_fher;#liste des maillages
259
my $is_opt_saveVisu = 0;#indicateur de l option -saveVisu (sauvegarde des fichiers .geo et _Gmsh.msh de visualisation)
260
my $is_opt_saveInfo = 0;#indicateur de l option -saveInfo (sauvegarde des fichiers de calcul Herezh++ (.info et .CVisu))
261
my $is_opt_quit = 0;#indicateur de l option -quit (execution normale du script excepte le fait que la visu Gmsh n est pas lancee)
262
my %FLIS_i;#table des .lis supplementaires indiques par une ou plusieurs options -lis_i
263
           #  fonctionnement de la variable :
264
           #             $FLIS_i{no maillage}{'IS_LIS_SUP'} = 1 ou non defini (sert d indicateur pour savoir si il y a des .lis supplementaires)
265
           #             @{ $FLIC_i{no maillage}{'LISTE'} } = (liste des fichiers .lis supplementaires)
266
my $is_opt_disable_F = 0;#indicateur de l option -disable_F (desactiver l affichage des listes de reference de faces)
267
my $is_opt_disable_A = 0;#indicateur de l option -disable_A (desactiver l affichage des listes de reference d aretes)
268
my @DISABLE_LIS_i;#liste des .lis a activer en fonction du numero du maillage (option -disable_lis_i)
269
my $is_opt_wireframe = 0;#indicateur de l option -wireframe (desactiver la vue des faces des elements 2D et 3D au demarrage de gmsh)
270
my $fic_opt_merge;#fichier a inclure a la visualisation (option -merge) NB : utilisation de "Merge" dans Gmsh
271

    
272

    
273
#on parcourt la liste des arguments (on traite les options connues et on stocke les autres dans @args)
274
my $opt;
275
my @args;
276
while($#ARGV != -1) {
277
  $opt = shift(@ARGV);
278

    
279
  #option -exeHZ
280
  if($opt eq '-exeHZ') {
281
    ($#ARGV >= 0) or die "\nErreur (prog:$NOM_PROG,opt:-exeHZ) : pas assez d arguments donnes pour cette option...\n\n";
282
    $exeHZ = shift(@ARGV);
283
  }
284
  #option -exeGMSH
285
  elsif($opt eq '-exeGMSH') {
286
    ($#ARGV >= 0) or die "\nErreur (prog:$NOM_PROG,opt:-exeGMSH) : pas assez d arguments donnes pour cette option...\n\n";
287
    $exeGMSH = shift(@ARGV);
288
  }
289
  #option -saveVisu
290
  elsif($opt eq '-saveVisu') {
291
    $is_opt_saveVisu = 1;
292
  }
293
  #option -saveInfo
294
  elsif($opt eq '-saveInfo') {
295
    $is_opt_saveInfo = 1;
296
  }
297
  #option -quit
298
  elsif($opt eq '-quit') {
299
    $is_opt_quit = 1;
300
  }
301
  #option -lis_i
302
  elsif($opt =~ /^-lis_(\d+)$/) {
303
    my $no_maillage = $1;
304
    ($#ARGV >= 0) or die "\nErreur (prog:$NOM_PROG,opt:-lis_$no_maillage) : pas assez d arguments donnes pour cette option...\n\n";
305
    my $flis_sup = shift(@ARGV);
306
    (-e $flis_sup) or die "\nErreur (prog:$NOM_PROG,opt:-lis_$no_maillage) : fichier $flis_sup introuvable...\n\n";
307
    #on retranche 1 au numero de maillage car plus loin dans le script, les numeros de maillage commence a 0 (liste de 0 a N-1 maillages)
308
    $no_maillage--;
309
    #indicateur de presence d au moins 1 fichier .lis supplementaire pour le maillage n? $no_maillage
310
    $FLIS_i{$no_maillage}{'IS_LIS_SUP'} = 1;
311
    #ajout du fichier dans la liste
312
    push(@{ $FLIS_i{$no_maillage}{'LISTE'} }, $flis_sup);
313
  }
314
  #option -disable_F
315
  elsif($opt eq '-disable_F') {
316
    $is_opt_disable_F = 1;
317
  }
318
  #option -disable_A
319
  elsif($opt eq '-disable_A') {
320
    $is_opt_disable_A = 1;
321
  }
322
  #option -disable_lis_i
323
  elsif($opt =~ /^-disable_lis_(\d+)$/) {
324
    my $no_maillage = $1;
325
    #on retranche 1 au numero de maillage car plus loin dans le script, les numeros de maillage commence a 0 (liste de 0 a N-1 maillages)
326
    $no_maillage--;
327
    $DISABLE_LIS_i[$no_maillage] = 1;
328
  }
329
  #option -wireframe
330
  elsif($opt eq '-wireframe') {
331
    $is_opt_wireframe = 1;
332
  }
333
  #option -merge
334
  elsif($opt eq "-merge") {
335
    #verification => cette option est utilisable une seule fois
336
    (not defined $fic_opt_merge) or die "\nErreur (prog:$NOM_PROG,opt:-merge) : appels multiples a l option -merge. Cette option ne peut etre utilisee qu une seule fois... \n\n";
337

    
338
    ($#ARGV >= 0) or die "\nErreur (prog:$NOM_PROG,opt:-merge) : pas assez d arguments pour cette option...\n\n";
339
    $fic_opt_merge = shift(@ARGV);
340

    
341
    #existence fichier
342
    (-e $fic_opt_merge) or die "\nErreur (prog:$NOM_PROG,opt:-merge) : fichier $fic_opt_merge introuvable...\n\n";
343

    
344
    #verification de la validite de l extension du fichier (doit figurer dans la liste @EXTENSION_OPT_MERGE)
345
    $_ = basename $fic_opt_merge;
346
    /(\.\S+)$/ or die "\nErreur (prog:$NOM_PROG,opt:-merge) : impossible de saisir l extension du fichier $fic_opt_merge (le fichier doit finir par l une des extensions suivantes : @EXTENSION_OPT_MERGE )...\n\n";
347
    my $ext = $1;
348
    $ext =~ tr/A-Z/a-z/;
349
    my $is_ext_ok = 0;
350
    foreach my $extension_autorisee (split(/\s+/, "@EXTENSION_OPT_MERGE")) {
351
      (my $extension_autorisee_ = $extension_autorisee) =~ tr/A-Z/a-z/;#on passe en minuscule au cas ou, mais normalement les elements de la liste @EXTENSION_OPT_MERGE sont deja en minuscule
352
      next if($ext ne $extension_autorisee_);
353
      $is_ext_ok = 1;
354
      last;
355
    }
356
    $is_ext_ok or die "\nErreur (prog:$NOM_PROG,opt:-merge) : le fichier $fic_opt_merge n est pas d un type supporte par l option -merge. Il doit finir par l une des extensions suivantes : @EXTENSION_OPT_MERGE ...\n\n";
357

    
358
    #on passe le fichier en chemin absolu pour le retrouver depuis n importe ou
359
    $fic_opt_merge = abs_path($fic_opt_merge);
360
  }
361

    
362
  #cas d une option inconnue
363
  elsif($opt =~ /^-/) {
364
    warn "**Attention : option $opt inconnue (on ignore cette option)...\n";
365
  }
366

    
367
  #autres arguments
368
  else {
369
    push(@args,$opt);
370
  }
371
}#while($#ARGV != -1)
372

    
373

    
374
#---------------------
375
#verif de l executable Herezh
376
#---------------------
377
#si la variable $exeHZ n a pas ete renseigne au prealable => on selectionne l executable par defaut en fonction de la plateforme
378
if(not defined($exeHZ)) {
379
  #- - - - - -
380
  #type de plateforme
381
  #- - - - - -
382
  my $type_OS = ' ';
383
  #-avec uname
384
  if(verif_cmd('uname')) {
385
    $type_OS = qx(uname -a);
386
    chomp($type_OS);
387
  }
388
  #-sinon : warning (OS inconnue)
389
  else {warn "**Attention : impossible de saisir le type de systeme d exploitation avec uname -a ...\n";}
390

    
391
  #selection de l executable Herezh
392
  #-linux 64 bits
393
  if($type_OS =~ /linux/i and $type_OS =~ /x86_64/i) {$exeHZ = $EXE_HZ_Linux64bits;}
394
  #-MacOSX (darwin)
395
  elsif($type_OS =~ /darwin/i) {$exeHZ = $EXE_HZ_MacOSX;}
396
  #-tous les autres (y compris linux 32 bits)
397
  else{$exeHZ = $EXE_HZ_autres;}
398
}
399
#verif de l executable Herezh
400
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";
401

    
402
#---------------------
403
#verif de l executable Gmsh
404
#---------------------
405
#si la variable $exeGMSH n a pas ete renseigne au prealable => on selectionne l executable par defaut
406
$exeGMSH = $exeGMSH_defaut if(not defined($exeGMSH));
407
#verif de l executable Gmsh
408
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";
409

    
410

    
411

    
412

    
413

    
414
#---------------------
415
#liste des maillages (on en profite pour faire des verifs sur la validite du fichier)
416
#---------------------
417
#
418
# la liste @args va servir de liste temporaire pour la saisie des noms de fichier
419
#
420
#cas avec arguments
421
if($#args >= 0) {
422
  #rien a faire pour l instant (la liste @args a deja ete remplie par les arguments)
423
}
424
#cas en mode interactif (on remplit la liste @args avec un menu interactif)
425
else {
426
  print "\nChoix des maillages a visualiser :\n";
427
  print "    (taper liste pour afficher la liste actuelle)\n";
428
  my $choix = -1;
429
  while() {
430
    print "  Donner un nom de maillage (f pour finir) : ";
431
    $choix = <STDIN>; chomp($choix);
432
    next if($choix eq '');#cas ou l utilisateur a tape "Entree"
433

    
434
    #choix f => on arrete la saisie
435
    last if($choix eq 'f');
436

    
437
    if($choix eq 'liste') {
438
      print "  Liste actuelle :\n @args\n\n" if($choix eq 'liste');
439
      next;
440
    }
441

    
442
    push(@args, $choix);
443
  }
444
  print "\n";
445
}
446
#-verif de la validite des maillages
447
foreach my $arg (@args) {
448
  $arg .= '.her' if(not $arg =~ /\.her$/);#rajout de l extension .her si manquante
449
  #existence du fichier
450
  (-e $arg) or do {warn "**Attention : fichier $arg introuvable (on ignore ce fichier)...\n"; next;};
451
  #ouverture du fichier
452
  open(FIC, "<$arg") or do {warn "**Attention : impossible d ouvrir le fichier $arg (on ignore ce fichier)...\n"; next;};
453
  #est-ce un maillage Herezh ? (verif par la presence des mots noeuds et NOEUDS)
454
  my ($is_noeuds, $is_NOEUDS) = (0,0);
455
  while(<FIC>) {
456
    $is_noeuds = 1 if(/^\s*noeuds/o);
457
    $is_NOEUDS = 1 if(/^\s*\d+\s+NOEUDS/o);
458
    last if($is_NOEUDS);
459
  }
460
  close(FIC);
461
  $is_noeuds or do {warn "**Attention : le fichier $arg ne contient pas le mot \"noeuds\" (on ignore ce fichier)...\n"; next;};
462
  $is_NOEUDS or do {warn "**Attention : le fichier $arg ne contient pas le mot \"NOEUDS\" (on ignore ce fichier)...\n"; next;};
463

    
464
  #fichier ok => ajout a la liste
465
  push(@liste_fher, $arg);
466
}
467

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

    
471

    
472

    
473
#---------------------
474
#verif des maillages (constitution de la liste des noms de maillage)
475
#---------------------
476
print "  verification des maillages...\n";
477
my @liste_nom_maillage;
478
#-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
479
if($#liste_fher == 0) {
480
  my $nom_maillage = '';
481
  open(FIC, "<$liste_fher[0]") or die "\n**Erreur (prog:$NOM_PROG) : impossible d ouvrir le fichier $liste_fher[0] ...\n\n";
482
  while(<FIC>) {
483
    last if(/^\s*noeuds/o);
484
    next if(not /^\s*nom_maillage\s+(\S+)/o);
485
    $nom_maillage = $1;
486
    last;
487
  }
488
  close(FIC);
489
  $nom_maillage = 'premier_maillage' if($nom_maillage eq '');
490
  push(@liste_nom_maillage, $nom_maillage);
491
}
492

    
493
#-verif 2 : si il y a plusieurs maillages, il faut qu ils aient chacun un nom_maillage different (sinon arret du programme)
494
if($#liste_fher > 0) {
495
  my $is_maillage_ok = 1;
496
  foreach my $fher (@liste_fher) {
497
    my $nom_maillage = '';
498
    open(FIC, "<$fher") or die "\n**Erreur (prog:$NOM_PROG) : impossible d ouvrir le fichier $fher ...\n\n";;
499
    while(<FIC>) {
500
      next if(not /^\s*nom_maillage\s+(\S+)/o);
501
      $nom_maillage = $1;
502
      last;
503
    }
504
    close(FIC);
505
    push(@liste_nom_maillage, $nom_maillage);
506
  }
507

    
508
  my @maillages_deja_traites; for(my $i=0; $i<=$#liste_nom_maillage; $i++) {$maillages_deja_traites[$i] = 0;}
509
  for(my $i=0; $i<=$#liste_nom_maillage; $i++) {
510
    next if($maillages_deja_traites[$i]);
511

    
512
    #cas d un maillage sans nom
513
    if($liste_nom_maillage[$i] eq '') {
514
      warn "**Erreur (prog:$NOM_PROG) : le maillage $liste_fher[$i] n a pas de nom (nom_maillage non specifie)...\n";
515
      $is_maillage_ok = 0;
516
      next;
517
    }
518

    
519
    #cas d un maillage ayant le meme nom qu un ou plusieurs autres maillages
520
    my @liste_maillages_meme_nom = ();
521
    for(my $j=$i+1; $j<=$#liste_nom_maillage; $j++) {
522
      if($liste_nom_maillage[$i] eq $liste_nom_maillage[$j]) {
523
        $maillages_deja_traites[$j] = 1;
524
        push(@liste_maillages_meme_nom, $liste_fher[$j]);
525
      }
526
    }
527
    if($#liste_maillages_meme_nom > -1) {
528
      warn "**Erreur (prog:$NOM_PROG) : les maillages suivants ont le meme nom => $liste_fher[$i] @liste_maillages_meme_nom\n";
529
      $is_maillage_ok = 0;
530
    }
531
  }
532

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

    
537

    
538
#---------------------
539
#listes des elements 1D, 2D et 3D (pour affecter des lois de type LOI_RIEN)
540
#  rq : modif version 1.028 => on en profite pour saisir les dimensions max parmi les maillages
541
#---------------------
542
print "  preparation du calcul Herezh...\n";
543
#-prefixes et suffixe pour la reconnaissance des elements 1D, 2D et axisymetriques
544
my @PREFIXE_1D = qw(POUT SEG);
545
my @PREFIXE_2D = qw(TRIA QUAD);
546
my @SUFFIXE_AXI = qw(_AXI);
547

    
548
#coordonnees mini et maxi parmi tous les maillages
549
my ($Xmin,$Xmax) = (1.e90, -1.e90);
550
my ($Ymin,$Ymax) = (1.e90, -1.e90);
551
my ($Zmin,$Zmax) = (1.e90, -1.e90);
552

    
553
#-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)
554
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)
555

    
556
#on boucle sur les maillages pour constituer les listes d elements par dimension de loi de comportement pour chaque maillage
557
# 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)
558
my $is_elt_1D = 0;#indicateur de la presence d au moins 1 element 1D
559
my $is_elt_2D = 0;#indicateur de la presence d au moins 1 element 2D
560
my $nb_elts_tot = 0;
561
for(my $no_mail=0; $no_mail<=$#liste_fher; $no_mail++) {
562
  #saisie des elements
563
  my ($nb_noeuds, $ref_noeuds, $nb_elts, $ref_elements);
564
  ($_, $nb_noeuds, $ref_noeuds, $nb_elts, $ref_elements) = lecture_mail_her($liste_fher[$no_mail]);
565

    
566
  #dimension max
567
  for(my $i=1; $i<=$nb_noeuds; $i++) {
568
    $Xmin = $ref_noeuds->[$i][0] if($Xmin > $ref_noeuds->[$i][0]);
569
    $Ymin = $ref_noeuds->[$i][1] if($Ymin > $ref_noeuds->[$i][1]);
570
    $Zmin = $ref_noeuds->[$i][2] if($Zmin > $ref_noeuds->[$i][2]);
571
    $Xmax = $ref_noeuds->[$i][0] if($Xmax < $ref_noeuds->[$i][0]);
572
    $Ymax = $ref_noeuds->[$i][1] if($Ymax < $ref_noeuds->[$i][1]);
573
    $Zmax = $ref_noeuds->[$i][2] if($Zmax < $ref_noeuds->[$i][2]);
574
  }
575

    
576
  $nb_elts_tot += $nb_elts;
577
  my @ELEM_1D = ();
578
  my @ELEM_2D = ();
579
  my @ELEM_3D = ();
580
  ELEM:for(my $i=1; $i<=$nb_elts; $i++) {
581
    #verif si element 1D (=> loi LOI_RIEN1D ou LOI_RIEN2D_C si element axisymetrique)
582
    foreach my $prefixe (@PREFIXE_1D) {
583
      if($ref_elements->{$i}{'TYPE'} =~ /^\s*$prefixe/) {
584
        #cas element 1D axisymetrique
585
        foreach my $suffixe (@SUFFIXE_AXI) {
586
          @_ = split(/\s+/, $ref_elements->{$i}{'TYPE'});
587
          if($_[0] =~ /$suffixe\s*$/) {
588
            push(@ELEM_2D, $i);
589
            $is_elt_2D = 1;
590
            next ELEM;
591
          }
592
        }
593
        #cas element 1D classique
594
        push(@ELEM_1D, $i);
595
        $is_elt_1D = 1;
596
        next ELEM;
597
      }
598
    }
599
    #verif si element 2D (=> loi LOI_RIEN2D_C ou LOI_RIEN3D si element axisymetrique)
600
    foreach my $prefixe (@PREFIXE_2D) {
601
      if($ref_elements->{$i}{'TYPE'} =~ /^\s*$prefixe/) {
602
        #cas element 2D axisymetrique
603
        foreach my $suffixe (@SUFFIXE_AXI) {
604
          @_ = split(/\s+/, $ref_elements->{$i}{'TYPE'});
605
          if($_[0] =~ /$suffixe\s*$/) {
606
            push(@ELEM_3D, $i);
607
            next ELEM;
608
          }
609
        }
610
        #cas element 2D classique
611
        push(@ELEM_2D, $i);
612
        $is_elt_2D = 1;
613
        next ELEM;
614
      }
615
    }
616
    #sinon, c est un element 3D (=> loi LOI_RIEN3D )
617
    push(@ELEM_3D, $i);
618
  }#FIN BOUCLE SUR LES ELEMENTS DU MAILLAGE indice $no_mail
619

    
620
  #remplissage de la table pour ce maillage
621
  push(@{$TAB_DIM_LOI{$no_mail}{'1D'}}, @ELEM_1D);
622
  push(@{$TAB_DIM_LOI{$no_mail}{'2D'}}, @ELEM_2D);
623
  push(@{$TAB_DIM_LOI{$no_mail}{'3D'}}, @ELEM_3D);
624

    
625
}#FIN BOUCLE SUR LES MAILLAGES
626

    
627

    
628

    
629
#--------------------
630
#fichiers .info, .CVisu, _Gmsh.msh et .geo temporaires
631
#  creation d un repertoire temporaire sous /tmp (on s assure qu il n existe pas deja)
632
#--------------------
633
my $rep_tmp = '/tmp/'.$NOM_PROG; $rep_tmp =~ s/\.\S+$//;
634
$rep_tmp .= "_$PID";
635
while(-e $rep_tmp) {$rep_tmp .= $PID;}
636
mkdir $rep_tmp;
637
(-d $rep_tmp) or die "\n**Erreur (prog:$NOM_PROG) : impossible de creer le repertoire $rep_tmp ...\n\n";
638

    
639

    
640
#depuis version 1.031 => NE PAS MODIFIER le nommage des fichiers suivants (sinon il y aura des incoherences
641
# dans le traitement des options -saveInfo et -saveInfo)
642
my $racine_fic_tmp = $NOM_PROG; $racine_fic_tmp =~ s/\.\S+$//;
643
my $finfo = "$racine_fic_tmp.info";#fichier de calcul temporaire
644
my $fCVisu = "$racine_fic_tmp.CVisu";#.CVisu associe
645
my $fGmsh = "$racine_fic_tmp\_Gmsh.msh";#.msh qui va etre cree apres calcul
646
my $fgeo = "$racine_fic_tmp.geo";#.geo qui sera utilise pour lancer la visu
647

    
648

    
649

    
650

    
651

    
652
#pour travailler dans le repertoire local, il faut garder en memoire le chemin absolu vers les fichiers suivants :
653
#  - les fichiers .her
654
#  - les eventuels fichiers .lis supplementaires (option -lis_i)
655
#
656
# => on convertit tous les chemins en chemin absolu dans les variables @liste_fher et @FLIS_i
657
for(my $no_mail=0; $no_mail<=$#liste_fher; $no_mail++) {
658
  #fichier .her
659
  $liste_fher[$no_mail] = abs_path($liste_fher[$no_mail]);
660

    
661
  #eventuels fichiers .lis supplementaires
662
  if(defined $FLIS_i{$no_mail}{'IS_LIS_SUP'}) {
663
    foreach my $flis_sup (@{ $FLIS_i{$no_mail}{'LISTE'} }) {
664
      $flis_sup = abs_path($flis_sup);
665
    }
666
  }
667
}
668

    
669

    
670
#memorisation du repertoire actuel
671
my $rep_origine = cwd();
672

    
673

    
674
#******************************************************************************************
675
#*******************     IMPORTANT IMPORTANT IMPORTANT    *********************************
676
#******************************************************************************************
677
#
678
#on travaille desormais dans le repertoire temporaire
679
chdir $rep_tmp;
680
#
681
#******************************************************************************************
682
#*******************     IMPORTANT IMPORTANT IMPORTANT    *********************************
683
#******************************************************************************************
684

    
685

    
686

    
687

    
688

    
689
#####################################################################
690
# a partir de maintenant, le signal ctrl+c est recupere et gere par une subroutine pour s assurer d effacer tous les fichiers
691
#   temporaires et de tuer l eventuel processus Herezh si l utilisateur fait un ctrl+c (typiquement pour arreter un calcul Herezh trop long)
692
#####################################################################
693

    
694
#-on reperera le processus Herezh via un nom de lien symbolique genere a partir du PID du processus de ce script Perl $PID (qui sera donc unique a priori)
695
my $HZ_symbolic_link = 'HZppfast_'.$PID.'_hz_visuMail';
696
my $absolute_path_cmd = absolute_path_cmd($exeHZ);
697
#-creation du lien symbolique
698
system("ln -s $absolute_path_cmd $HZ_symbolic_link");
699
#-capture du signal ctrl+c
700
$SIG{INT} = sub {
701
  #kill des processus Herezh (on les repere grace au nom du lien symbolique $HZ_symbolic_link
702
  foreach my $processus (qx(ps -U $ENV{USER} -o pid,%cpu,command | grep $HZ_symbolic_link | grep -v grep)) {
703
    next if(not $processus =~ /^\s*(\d+)/);
704
    kill("TERM", $1);
705
  }
706

    
707
  #retour au repertoire origine
708
  chdir $rep_origine;
709

    
710
  #destruction des fichiers temporaires
711
  efface_fic_temporaires();
712

    
713
  die "\nArret du programme a cause d un ctrl+c ...\n\n";
714
};
715

    
716

    
717

    
718

    
719
#---------------------
720
#ecriture du .info
721
#---------------------
722
open(FIC, ">$finfo");
723
print FIC "dimension 3\n\n";
724

    
725
print FIC "niveau_commentaire 1\n\n";
726

    
727
#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)
728
print FIC "TYPE_DE_CALCUL\ndynamique_explicite\n";
729

    
730
#ecriture des maillages et de references d elements speciales
731
for(my $no_mail=0; $no_mail<=$#liste_fher; $no_mail++) {
732
  my $fher = $liste_fher[$no_mail];
733
  my $flis = $fher; $flis =~ s/.her$/.lis/;
734
  print FIC "\n< $fher\n";
735
  print FIC "< $flis\n" if(-e $flis and not defined $DISABLE_LIS_i[$no_mail]);#inclusion du .lis si il existe (et si l option -disable_lis_i n a pas ete utilisee pour ce maillage)
736
  #ajout de .lis supplementaire si l option -lis_i a ete utilisee
737
  if(defined $FLIS_i{$no_mail}{'IS_LIS_SUP'}) {
738
    print FIC "< $_\n" for @{ $FLIS_i{$no_mail}{'LISTE'} };
739
  }
740
  #set d elements speciaux en fonction de la dimension de la loi de comportement
741
  #  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)
742
  foreach my $dim ('1D', '2D', '3D') {
743
    next if($#{$TAB_DIM_LOI{$no_mail}{$dim}} == -1);#pas d ecriture si aucun element de dimension $dim
744
    ecrire_liste_N_E(*FIC, "E_tmp_visu_elem_$dim", @{$TAB_DIM_LOI{$no_mail}{$dim}});
745
  }
746
}
747

    
748
print FIC "\nchoix_materiaux\n";
749
for(my $no_mail=0; $no_mail<=$#liste_fher; $no_mail++) {
750
  #choix materiau par dimension de loi
751
  foreach my $dim ('1D', '2D', '3D') {
752
    next if($#{$TAB_DIM_LOI{$no_mail}{$dim}} == -1);#pas d ecriture si aucun element de dimension $dim
753
    print FIC "nom_mail= $liste_nom_maillage[$no_mail] E_tmp_visu_elem_$dim MAT$dim\n";
754
  }
755
}
756

    
757
print FIC "\nmateriaux\n";
758
print FIC "MAT1D LOI_RIEN1D\nMAT2D LOI_RIEN2D_C\nMAT3D LOI_RIEN3D\n\n";
759

    
760
print FIC "masse_volumique\n";
761
for(my $no_mail=0; $no_mail<=$#liste_fher; $no_mail++) {
762
  foreach my $dim ('1D', '2D', '3D') {
763
    next if($#{$TAB_DIM_LOI{$no_mail}{$dim}} == -1);#pas d ecriture si aucun element de dimension $dim
764
    print FIC "nom_mail= $liste_nom_maillage[$no_mail] E_tmp_visu_elem_$dim 1.\n";
765
  }
766
}
767

    
768
#sections pour les eventuels elements 1D
769
if($is_elt_1D) {
770
  print FIC "\nsections\n";
771
  for(my $no_mail=0; $no_mail<=$#liste_fher; $no_mail++) {
772
    next if($#{$TAB_DIM_LOI{$no_mail}{'1D'}} == -1);#pas d ecriture si aucun element de dimension $dim
773
    print FIC "nom_mail= $liste_nom_maillage[$no_mail] E_tmp_visu_elem_1D 1.\n";
774
  }
775
}
776

    
777
#epaisseurs pour les eventuels elements 2D
778
if($is_elt_2D) {
779
  print FIC "\nepaisseurs\n";
780
  for(my $no_mail=0; $no_mail<=$#liste_fher; $no_mail++) {
781
    next if($#{$TAB_DIM_LOI{$no_mail}{'2D'}} == -1);#pas d ecriture si aucun element de dimension $dim
782
    print FIC "nom_mail= $liste_nom_maillage[$no_mail] E_tmp_visu_elem_2D 1.\n";
783
  }
784
}
785

    
786
print FIC "\ncharges\n\n";
787
print FIC "blocages\n\n";
788

    
789
#controle => un seul increment
790
print FIC "controle\n";
791
print FIC "DELTAt 1.\n";
792
print FIC "TEMPSFIN 1.\n";
793
print FIC "SAUVEGARDE 0\n";
794
print FIC "MAXINCRE 1\n";
795

    
796
print FIC "\npara_pilotage_equi_global\n\n";
797

    
798
print FIC "para_syteme_lineaire\n\n";
799

    
800
print FIC "para_affichage\nFREQUENCE_SORTIE_FIL_DU_CALCUL 1\n\n";
801

    
802
print FIC "resultats pas_de_sortie_finale_\nCOPIE 0\n\n";
803

    
804
print FIC "_fin_point_info_\n";
805
close(FIC);
806

    
807

    
808
#---------------------
809
#ecriture du .CVisu
810
#---------------------
811
open(FIC, ">$fCVisu");
812
print FIC "
813
debut_fichier_commande_visu
814

    
815
  debut_visualisation_Gmsh
816
    debut_maillage_initial
817
      actif 1
818
      pseudo-homothetie_sur_les_maillages_ 0
819
      visualisation_references_sur_les_maillages_ 1
820
    fin_maillage_initial
821

    
822
    debut_choix_maillage
823
      actif 0
824
      1";
825
for(my $i=1; $i<=$#liste_fher; $i++) {$_ = $i + 1; print FIC " $_";}
826
print FIC " fin_choix_maillage
827
  fin_visualisation_Gmsh
828

    
829
fin_fichier_commande_visu
830
";
831
close(FIC);
832

    
833

    
834
#---------------------
835
#lancement du calcul
836
#---------------------
837
#cas de l option -saveInfo (sauvegarde des fichiers .info et .CVisu)
838
if($is_opt_saveInfo) {
839

    
840
  #systeme de numero pour nommer les fichiers et eviter d ecraser des fichiers deja existants
841
  my $no = 0;
842
  my $racine_fic_save = $racine_fic_tmp."_$no";
843
  while(-e "$rep_origine/$racine_fic_save.info" or -e "$rep_origine/$racine_fic_save.CVisu") {
844
    $no++;
845
    $racine_fic_save = $racine_fic_tmp."_$no";
846
  }
847

    
848
  system("cp $finfo $rep_origine/$racine_fic_save.info");
849
  system("cp $fCVisu $rep_origine/$racine_fic_save.CVisu");
850

    
851
  print "\nopt -saveInfo => Les fichiers $racine_fic_save.info et $racine_fic_save.CVisu ont ete sauvegardes...\n\n";
852
}
853

    
854

    
855

    
856
#-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)
857
my $fredir = "$racine_fic_tmp.log";
858
print "  creation du fichier _Gmsh.msh (calcul Herezh en cours)...\n";
859
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
860
#-lancement de Herezh dans un processus fils pour permettre un ctrl+c a l utilisateur (et donc le traitement de la subroutine pointee par $SIG{INT})
861
my $pid_fils = fork();
862
#---------- processus fils
863
            if($pid_fils == 0) {
864
              system("echo n | ./$HZ_symbolic_link -f $finfo >> $fredir");#on lance avec "echo n" pour repondre automatiquement "non" au cas ou il y a une erreur de calcul Herezh
865
              exit;
866
            }
867
#---------- fin du processus fils
868
#attente de la fin du processus fils par son pere
869
waitpid($pid_fils, 0);
870

    
871

    
872
#cas ou le calcul n a pas fonctionne (si le fichier _Gmsh.msh n a pas ete cree)
873
#  => on propose a l utilisateur de visualiser le .log pour savoir ce qui s est passe
874
if(not -e $fGmsh) {
875
  print "\n**Erreur (prog:$NOM_PROG) : le calcul Herezh++ n a pas fonctionne (le fichier pour Gmsh n a pas ete cree)...\n\n";
876
  my $choix = -1;
877
  while($choix ne 'o' and $choix ne 'n') {
878
    print "  Voulez-vous visualiser l affichage Herezh++ du calcul ? (o/n) ";
879
    $choix = <STDIN>; chomp($choix); $choix = lc($choix);
880
  }
881

    
882
  if($choix eq 'o') {
883
    #systeme de numero pour nommer les fichiers et eviter d ecraser un fichiers deja existant
884
    my $no = 0;
885
    my $racine_fic_save = $racine_fic_tmp."_$no";
886
    while(-e "$rep_origine/$racine_fic_save.log") {
887
      $no++;
888
      $racine_fic_save = $racine_fic_tmp."_$no";
889
    }
890

    
891
    system("cp $fredir $rep_origine/$racine_fic_save.log");
892

    
893
    print "  => voir fichier $racine_fic_save.log\n";
894
  }
895

    
896
  #destruction des fichiers temporaires
897
  efface_fic_temporaires();
898

    
899
  #arret du programme
900
  die "\nArret du programme a cause d un probleme d execution Herezh++...\n\n";
901
}
902

    
903

    
904

    
905

    
906
#---------------------
907
#lecture du .msh et reecriture pour modifier les couleurs selon le type de reference (noeud, arete, face, element)
908
#  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
909
#---------------------
910

    
911
#on affecte une isovaleur par couleur :
912
#   - 0 => gris    (dedie a l affichage du maillage)
913
#   - 1 => bleu    (dedie a l affichage des refs d  elements)
914
#   - 2 => vert    (dedie a l affichage des refs de faces)
915
#   - 3 => jaune   (dedie a l affichage des refs d  aretes)
916
#   - 4 => rouge   (dedie a l affichage des refs de noeuds)
917
#   - 5 => mauve   (dedie a l affichage des refs de points d integration)
918
my $couleur_RGB_maillage = '{190, 190, 190, 255}';#gris
919
my $couleur_RGB_element  = '{  0,   150, 255, 255}';#bleu
920
my $couleur_RGB_face     = '{  0, 255,   0, 255}';#vert
921
my $couleur_RGB_arete    = '{240, 200,   0, 255}';#jaune
922
my $couleur_RGB_noeud    = '{255,   0,   0, 255}';#rouge
923
my $couleur_RGB_pti      = '{238, 130,   238, 255}';#mauve
924

    
925
#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)
926
#  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
927
my %table_couleur_type_ref = ('pt_integr'=>5, 'noeud'=>4, 'arete'=>3, 'face'=>2, 'element'=>1);
928

    
929
#on va lister les types de ref
930
my @liste_type_reference;#liste des types de references
931

    
932

    
933

    
934
#cas de l option -disable_A : on suuprime les listes de reference d aretes
935
#if($is_opt_disable_A) {
936
#  print "  opt:-disable_A => suppression des listes d aretes\n";
937
#  suppr_liste_aretes();
938
#}
939

    
940
#cas de l option -disable_F : on suuprime les listes de reference de faces
941
if($is_opt_disable_F) {
942
  print "  opt:-disable_F => suppression des listes de faces\n";
943
  suppr_liste_faces();
944
}
945

    
946
#cas de l option -disable_A : on suuprime les listes de reference d aretes
947
if($is_opt_disable_A) {
948
  print "  opt:-disable_A => suppression des listes d aretes\n";
949
  suppr_liste_aretes();
950
}
951

    
952

    
953

    
954
#fichier temporaire
955
my $ftmp = $fGmsh.rand(9999999); while(-e $ftmp) {$ftmp = $fGmsh.rand(9999999);}
956
open(FIC, "<$fGmsh");
957
open(Ftmp, ">$ftmp");
958
my $is_Element_data = 0;
959
my $couleur_type_ref;
960
print "  modification du fichier _Gmsh.msh...\n";
961
while(my $ligne = <FIC>) {
962

    
963
  #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)
964
  if($ligne =~ /^\s*\$ElementData\s*$/io) {
965
    my $entete = $ligne;
966
    #on lit jusqu au nom de la reference
967
    while($ligne = <FIC>) {
968
      $entete .= $ligne;
969
      last if($ligne =~ /^\s*\"/o);
970
    }
971

    
972
    #selection de l isovaleur en fonction du type de reference
973
    #-ref de noeuds
974
    if($ligne =~ /^\s*\"\s*N(\S+)/o) {
975
      push(@liste_type_reference, 'noeud');
976
      $couleur_type_ref = $table_couleur_type_ref{'noeud'};
977
    }
978
    #-ref d aretes
979
    elsif($ligne =~ /^\s*\"\s*A(\S+)/o) {
980
      push(@liste_type_reference, 'arete');
981
      $couleur_type_ref = $table_couleur_type_ref{'arete'};
982
    }
983
    #-ref de faces
984
    elsif($ligne =~ /^\s*\"\s*F(\S+)/o) {
985
      push(@liste_type_reference, 'face');
986
      $couleur_type_ref = $table_couleur_type_ref{'face'};
987
    }
988
    #-ref d elements
989
    elsif($ligne =~ /^\s*\"\s*E(\S+)/o) {
990
      push(@liste_type_reference, 'element');
991
      $couleur_type_ref = $table_couleur_type_ref{'element'};
992
    }
993
    #-ref de points d integration
994
    elsif($ligne =~ /^\s*\"\s*G(\S+)/o) {
995
      push(@liste_type_reference, 'pt_integr');
996
      $couleur_type_ref = $table_couleur_type_ref{'pt_integr'};
997
    }
998

    
999
    #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
1000
    if($ligne =~ /E_tmp_visu_elem_/o) {
1001
      while($ligne = <FIC>) {last if($ligne =~ /^\s*\$EndElementData\s*$/io);}
1002
      pop(@liste_type_reference);#suppression du dernier element de la liste
1003
    }
1004
    #si c est une reference reellement dans le maillage, on recopie l en-tete actuel et on recopie l element data avec l isovaleur
1005
    else {
1006
      $is_Element_data = 1;
1007
      print Ftmp $entete;
1008
      while($ligne = <FIC>) {
1009
        $ligne = "$1 $couleur_type_ref\n" if ($ligne =~ /^\s*(\d+)\s+\d+\s*$/o);
1010
        print Ftmp $ligne;
1011
        last if($ligne =~ /^\s*\$EndElementData\s*$/io);
1012
      }
1013
    }
1014
  }#if($ligne =~ /^\s*\$ElementData\s*$/io)
1015

    
1016
  #cas general : on recopie simplement la ligne courante
1017
  else {
1018
    print Ftmp $ligne;
1019
  }
1020
}
1021
close(FIC);
1022

    
1023
#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)
1024
#  rq : les elements 1D se retrouvent egalement dans cette ref
1025
print Ftmp "\$ElementData
1026
1
1027
\"Activer/Desactiver vue elements 2D 3D\"
1028
0
1029
3
1030
0
1031
1
1032
$nb_elts_tot\n";
1033
for(my $i=1; $i<=$nb_elts_tot; $i++) {
1034
  print Ftmp "$i 0\n";#isovaleur 0
1035
}
1036
print Ftmp "\$EndElementData\n";
1037
close(Ftmp);
1038
system("mv -f $ftmp $fGmsh");
1039

    
1040

    
1041

    
1042
#---------------------
1043
#lancement de la visu Gmsh
1044
#---------------------
1045
#-on cree un fichier .geo pour y ecrire dans l ordre :
1046
#  - des options generales a toutes les vues
1047
#  - un Merge du .msh
1048
#  - des options au cas par cas par type de reference
1049
open(FIC, ">$fgeo");
1050

    
1051
#variable donnant le nom du fichier .msh
1052
print FIC "//nom du fichier .msh\n";
1053
print FIC "fichier_msh = \"$fGmsh\";\n\n";
1054

    
1055
#-options generales
1056
print FIC '
1057
Geometry.Light = 0;     //desactivation de la lumiere (geometrie)
1058
Mesh.Light = 0;         //desactivation de la lumiere (maillage)
1059
View.Light = 0;         //desactivation de la lumiere (vue)
1060
Mesh.ColorCarousel = 0; //type de couleur (0=by element type, 1=by elementary entity, 2=by physical entity, 3=by partition)
1061
Geometry.Points = 0;    //affichage des points (=0 desactiver, =1 activer)
1062
Mesh.Points = 0;        //affichage des noeuds (=0 desactiver, =1 activer)
1063
Mesh.Lines = 1;         //affichage des lignes (elements 1D) (=0 desactiver, =1 activer)
1064
Mesh.SurfaceEdges = 1;  //affichage des aretes des elements 2D (=0 desactiver, =1 activer)
1065
Mesh.SurfaceFaces = 0;  //affichage des faces des elements 2D (=0 desactiver, =1 activer)
1066
Mesh.VolumeEdges = 1;   //affichage des aretes des elements 3D (=0 desactiver, =1 activer)
1067
Mesh.VolumeFaces = 0;   //affichage des faces des elements 3D (=0 desactiver, =1 activer)
1068
View.Visible = 0;       //desactivation de toutes les vues au demarrage
1069
View.ShowScale = 0;     //desactivation de la vue de l echelle d isovaleur
1070
View.RangeType = 2;     //type de bornes des isovaleurs (2=Custom)
1071
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)
1072
View.CustomMax = 5;     //borne maxi isovaleur
1073
View.PointType = 1;     //type d affichage des points (1=3D sphere)
1074
View.PointSize = 4.;    //taille des points
1075
View.LineType = 1;      //type d affichage des lignes (1=3D cylinder)
1076
View.LineWidth = 3.;    //taille des lignes
1077

    
1078
Mesh.PointSize = 3.;   //taille des noeuds
1079
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
1080
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
1081
Mesh.Color.Triangles = {0,0,0};
1082
Mesh.Color.Quadrangles = {0,0,0};
1083
Mesh.Color.Tetrahedra = {0,0,0};
1084
Mesh.Color.Hexahedra = {0,0,0};
1085
Mesh.Color.Prisms = {0,0,0};
1086
Mesh.Color.Pyramids = {0,0,0};
1087
';
1088

    
1089
#echelle de couleur des isovaleurs
1090
print FIC "//couleur isovaleur :  couleur 1 (gris)  => isovaleur=0 (maillage)\n";
1091
print FIC "//                     couleur 2 (bleu)  => isovaleur=1 (ref elements)\n";
1092
print FIC "//                     couleur 3 (vert)  => isovaleur=2 (ref faces)\n";
1093
print FIC "//                     couleur 4 (jaune) => isovaleur=3 (ref aretes)\n";
1094
print FIC "//                     couleur 5 (rouge) => isovaleur=4 (ref noeuds)\n";
1095
print FIC "//                     couleur 6 (mauve) => isovaleur=5 (ref points integration)\n";
1096
#             valeur isovaleur      0                        1                    2                  3                   4                    5
1097
print FIC "View.ColorTable = {$couleur_RGB_maillage, $couleur_RGB_element, $couleur_RGB_face, $couleur_RGB_arete, $couleur_RGB_noeud, $couleur_RGB_pti};\n";
1098

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

    
1102
#on indique d afficher la vue speciale qui sert a afficher les faces des elements 2D 3D (la derniere qui a ete cree)
1103
#  rq : pour cette vue, on remet l affichage classique pour les points et les lignes
1104
print FIC "//options speciales pour la derniere vue qui sert a l affichage des faces des elements 2D et 3D\n";
1105
my $no_derniere_vue = $#liste_type_reference + 1;#cette vue n est pas enregistree dans la liste, son numero est donc egal a la derniere + 1
1106
#gestion option -wireframe (affichage ou non des faces des elements 2D et 3D au demarrage de gmsh)
1107
if($is_opt_wireframe) {
1108
  print FIC "View[$no_derniere_vue].Visible = 0;\n";
1109
}
1110
else {
1111
  print FIC "View[$no_derniere_vue].Visible = 1;\n";
1112
}
1113
print FIC "View[$no_derniere_vue].PointType = 0;     //type d affichage des points (0=Color dot)\n";
1114
print FIC "View[$no_derniere_vue].PointSize = 3.;    //taille des points\n";
1115
print FIC "View[$no_derniere_vue].LineType = 0;		//type d affichage des lignes (0=Color segment)\n";
1116
print FIC "View[$no_derniere_vue].LineWidth = 1.; 	//taille des lignes\n";
1117
print FIC "View[$no_derniere_vue].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";
1118

    
1119

    
1120
#modif version 1.028 : ajout de 2 points pour eviter bug graphique
1121
print FIC "\n";
1122
print FIC "//points pour eviter bug graphique (on aide gmsh a retrouver les dimensions min et max pour eviter l espece de clipping bizarre qu il y a parfois)\n";
1123
$_[0] = $Xmin - 0.01*abs($Xmax-$Xmin);
1124
$_[1] = $Ymin - 0.01*abs($Ymax-$Ymin);
1125
$_[2] = $Zmin - 0.01*abs($Zmax-$Zmin);
1126
print FIC "p = newp; Point(p) = {$_[0],$_[1],$_[2],1};\n";
1127
$_[0] = $Xmax + 0.01*abs($Xmax-$Xmin);
1128
$_[1] = $Ymax + 0.01*abs($Ymax-$Ymin);
1129
$_[2] = $Zmax + 0.01*abs($Zmax-$Zmin);
1130
print FIC "p = newp; Point(p) = {$_[0],$_[1],$_[2],1};\n";
1131

    
1132

    
1133
#option -merge => inclusion du fichier $fic_opt_merge defini par option -merge
1134
if(defined $fic_opt_merge) {
1135
  print FIC "\n";
1136
  print FIC "//inclusion du fichier declare via option -merge\n";
1137
  #rappel : le fichier a ete passe en chemin absolu pour le retrouver depuis le repertoire temporaire $rep_tmp
1138
  print FIC "Merge \'$fic_opt_merge\';\n";
1139
}
1140

    
1141
close(FIC);
1142

    
1143

    
1144
#cas de l option -saveVisu (sauvegarde des fichiers .geo et _Gmsh.msh)
1145
if($is_opt_saveVisu) {
1146
  
1147
  #systeme de numero pour nommer les fichiers et eviter d ecraser des fichiers deja existants
1148
  my $no = 0;
1149
  my $racine_fic_save = $racine_fic_tmp."_$no";
1150
  while(-e "$rep_origine/$racine_fic_save.geo" or -e "$rep_origine/$racine_fic_save\_Gmsh.msh") {
1151
    $no++;
1152
    $racine_fic_save = $racine_fic_tmp."_$no";
1153
  }
1154

    
1155
  #creation temporaire d un fichier .geo (comme ca, on evite que d autres processus hz_visuMail.pl
1156
  # ne cree ce fichier le temps de faire quelques modifs dans le .geo)
1157
  system("echo 1 > $rep_origine/$racine_fic_save.geo");
1158

    
1159
  #modif du .geo (il faut changer le nom du fichier .msh dans la variable fichier_msh
1160
  open(FIC, "<$fgeo");
1161
  open(FIC2, ">$fgeo.modif");
1162
  while(<FIC>) {
1163
    if(/^fichier_msh = /) {
1164
      print FIC2 "fichier_msh = \"$racine_fic_save\_Gmsh.msh\";\n";
1165
    }
1166
    else {
1167
      print FIC2;
1168
    }
1169
  }
1170
  close(FIC2);
1171
  close(FIC);
1172

    
1173
  system("rm -f $rep_origine/$racine_fic_save.geo; cp $fgeo.modif $rep_origine/$racine_fic_save.geo");
1174
  system("cp $fGmsh $rep_origine/$racine_fic_save\_Gmsh.msh");
1175

    
1176
  print "\nopt -saveVisu => Les fichiers $racine_fic_save.geo et $racine_fic_save\_Gmsh.msh ont ete sauvegardes...\n\n";
1177
}#if($is_opt_saveVisu)
1178

    
1179

    
1180

    
1181

    
1182
#lancement de la visualisation (sauf si l option -quit a ete utilisee)
1183
if($is_opt_quit) {
1184
  print "\nopt -quit : pas de visualisation Gmsh...\n\n";
1185
}
1186
else {
1187
  print "  visu Gmsh en cours (via fichiers $rep_tmp/$fgeo et $rep_tmp/$fGmsh)...\n";
1188
  system("$exeGMSH $fgeo");
1189
}
1190

    
1191

    
1192
#destruction des fichiers temporaires
1193
efface_fic_temporaires();
1194

    
1195

    
1196

    
1197

    
1198

    
1199

    
1200
#rq : cette subroutine utilise la variable globale $rep_tmp
1201
sub efface_fic_temporaires {
1202
  #on efface le repertoire temporaire
1203
  system("rm -rf $rep_tmp");
1204
}
1205

    
1206

    
1207
#cette subroutine verifie l existence d une commande dans $PATH (remplace l utilisation de which depuis la version 1.01)
1208
sub verif_cmd {
1209
  my $cmd = shift;
1210

    
1211
  #verif directe : est-ce que le fichier existe et est executable
1212
  return 1 if(-x $cmd);
1213

    
1214
  #sinon, on regarde dans les path
1215
  foreach my $path (split(/\s*:\s*/, $ENV{PATH})) {
1216
    return 1 if(-x "$path/$cmd");
1217
  }
1218

    
1219
  #cas ou la commande n existe pas
1220
  return 0;
1221
}
1222

    
1223
#cette subroutine renvoie le chemin absolu vers une commande (renvoie 0 si commande introuvable ou non executable)
1224
#  strategie :
1225
#     1- si la commande commence par "." ou "/" => on renvoie simplement son path absolu
1226
#     2- ensuite, on donne la priorite aux commandes presentes dans $PATH
1227
#      par exemple, si la commande toto.x est presente a la fois dans le repertoire courant et dans le repertoire de $PATH /Users/Dupont/bin :
1228
#                   alors si on passe la commande "toto.x" a cette subroutine, elle va renvoyer le path absolu vers le fichier present dans
1229
#                   /Users/Dupont/bin. Ce qui force l utilisateur a presciser par un "./" si il veut la commande du repertoire courant "./toto.x"
1230
sub absolute_path_cmd {
1231
  my $cmd = shift;
1232

    
1233
  my $absolute_cmd = 0;
1234

    
1235
  #1- commande commence par "." ou "/" => on renvoie simplement son path absolu
1236
  if(($cmd =~ /^\./ or $cmd =~ /^\//) and -e $cmd) {
1237
    $absolute_cmd = rel2abs($cmd);
1238
  }
1239

    
1240
  #2-
1241
    #2-a : d abord dans les $PATH
1242
    foreach my $path (split(/\s*:\s*/, $ENV{PATH})) {
1243
      if(-e "$path/$cmd") {
1244
        $absolute_cmd = rel2abs("$path/$cmd");
1245
        last;
1246
      }
1247
    }
1248
    #2-b : ensuite dans les repertoires hors $PATH
1249
    if(-e $cmd) {
1250
      $absolute_cmd = rel2abs($cmd);
1251
    }
1252

    
1253

    
1254
  if($absolute_cmd ne "0" and not -x $absolute_cmd) {
1255
    warn "**Attention (sub:verif_commande) : la commande $cmd existe ($absolute_cmd) mais le fichier n est pas executable...\n";
1256
    return 0;
1257
  }
1258

    
1259
  return $absolute_cmd;
1260
}#sub absolute_path_cmd
1261

    
1262

    
1263
#ecrire une liste de noeuds ou d elements
1264
#  rq : a priori, si on met trop de noeuds/elements sur une meme ligne, Herezh plante (donc on se limite 15 nombres par ligne)
1265
sub ecrire_liste_N_E {
1266
  my $handle = shift;#le handle de fichier est passe par une variable
1267
  my $nom_liste = shift;
1268
  my @liste_no = @_;#liste des noeuds ou d elements
1269

    
1270
  my $cpt; my $cpt_max = 15; my $nb_blancs;
1271

    
1272
  $nb_blancs = ""; $nb_blancs .= " " for(1 .. length($nom_liste));
1273
  $_ = shift(@liste_no);
1274
  print $handle " $nom_liste $_";
1275
  $cpt = 1;
1276
  foreach my $no (@liste_no) {
1277
    $cpt++;
1278
    if($cpt == 1) {print $handle " $nb_blancs $no";}
1279
    elsif($cpt == $cpt_max) {print $handle " $no\n"; $cpt = 0;}
1280
    else {print $handle " $no";}
1281
  }
1282
  print $handle "\n" if($cpt != $cpt_max);
1283
}#sub ecrire_liste_noeuds
1284

    
1285

    
1286
#----------------
1287
#sub qui lit un maillage herezh++ pour recuperer les noeuds, les elements et les listes de references
1288
#et les renvoier sous forme de reference (lecture du .her et d un .lis si il existe)
1289
#
1290
# exemple d appel :
1291
#  my ($nom_maillage, $nb_noeuds, $ref_tab_noeuds, $nb_elts, $ref_tab_elements, @ref_listes) = lecture_mail_her("fic_her");
1292
#
1293
#  avec - $nom_maillage     : nom du maillage (si il y en a un. sinon $nom_maillage sera egal a undef
1294
#       - $nb_noeuds        : nombre de noeuds (entier)
1295
#       - $ref_tab_noeuds   : reference vers un tableau de noeuds => $ref_tab_noeuds->[no noeud][0] : coordonnee x
1296
#                                                                    $ref_tab_noeuds->[no noeud][1] : coordonnee y
1297
#                                                                    $ref_tab_noeuds->[no noeud][2] : coordonnee z)
1298
#       - $nb_elts          : nombre d elements (entier)
1299
#       - $ref_tab_elements : reference vers une table de hashage => $ref_tab_elements->{no elt}{'TYPE'}      : type d element
1300
#                                                                    @{$ref_tab_elements->{no elt}{'CONNEX'}} : (liste des noeuds)
1301
#       - @ref_listes       : liste de references vers les tables de hashage contenant les listes de references de noeuds, aretes, faces et elements
1302
#                             => $ref_listes[0] : reference vers la table de hashage des listes de noeuds  => @{$ref_listes[0]->{'nom liste'}} : (liste des noeuds)
1303
#                                $ref_listes[1] : reference vers la table de hashage des listes d aretes   => @{$ref_listes[1]->{'nom liste'}} : (liste des aretes)
1304
#                                $ref_listes[2] : reference vers la table de hashage des listes de faces   => @{$ref_listes[2]->{'nom liste'}} : (liste des faces)
1305
#                                $ref_listes[3] : reference vers la table de hashage des listes d elements => @{$ref_listes[3]->{'nom liste'}} : (liste des elements)
1306
#                                $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)
1307
#                                
1308
sub lecture_mail_her {
1309
  my $fher = shift;
1310

    
1311
  my $nom_maillage;
1312

    
1313
  #------------------------
1314
  # lecture du maillage .her
1315
  #------------------------
1316
  #-lecture de noeuds
1317
  my @tab_noeuds; my $nb_noeuds;
1318
  my $no_noeud = 0;
1319
  open(Fher, "<$fher");
1320
  while(<Fher>) {
1321
    if(/^\s*nom_maillage\s+(\S+)/o) {$nom_maillage = $1; next;}
1322
    next if(not /(\d+)\s+NOEUDS/o);
1323
    $nb_noeuds = $1;
1324
    last;
1325
  }
1326
  while(<Fher>) {
1327
    last if($no_noeud == $nb_noeuds);
1328
    next if(not /^\s*(\d+)\s+(\S+)\s+(\S+)\s+(\S+)\s*$/o);
1329
    $no_noeud = $1;
1330
    @{$tab_noeuds[$no_noeud]} = ($2,$3,$4);
1331
  }
1332

    
1333
  #-lecture des elements
1334
  my %tab_elements; my $nb_elts;
1335
  my $no_elt = 0;
1336
  while(<Fher>) {
1337
    next if(not /(\d+)\s+ELEMENTS/o);
1338
    $nb_elts = $1;
1339
    last;
1340
  }
1341
  while(<Fher>) {
1342
    last if($no_elt == $nb_elts);
1343
    next if(not /^\s*\d+\s+\w+\s+\w+/o);
1344
    s/^\s+//;s/\s+$//;
1345
    $_ =~ /^(\d+)\s+/;
1346
    $no_elt = $1; s/^(\d+)\s+//;
1347
    $_ =~ /\s+(\d+(?:\s+\d+)*)$/;
1348
    @{$tab_elements{$no_elt}{'CONNEX'}} = split(/\s+/, $1); s/\s+(\d+(?:\s+\d+)*)$//;
1349
    $tab_elements{$no_elt}{'TYPE'} = $_; $tab_elements{$no_elt}{'TYPE'} =~ s/\s+/ /g;
1350
  }
1351
  close(Fher);
1352

    
1353

    
1354
  #------------------------
1355
  # lecture des references (dans le .her et dans un eventuel .lis)
1356
  #------------------------
1357
  my $flis = $fher; $flis =~ s/.her$/.lis/;
1358
  my $nom_liste;
1359
  my $is_liste_en_cours;
1360
  my %listes_NOEUDS;
1361
  my %listes_ARETES;
1362
  my %listes_FACES;
1363
  my %listes_ELEMENTS;
1364
  my %listes_PTI;
1365

    
1366
  #-dans le .her
1367
  open(Fher, "<$fher");
1368
  $is_liste_en_cours = 0;
1369
  while(<Fher>) {
1370
    chomp;
1371
    if(/^\s*(N\S+)/o) {
1372
      $nom_liste = $1;
1373
      $is_liste_en_cours = 1;
1374
      s/^\s*N\S+\s+//; s/\s+$//;
1375
      push(@{$listes_NOEUDS{$nom_liste}},split(/\s+/,$_));
1376
    }
1377
    elsif(/^\s*noeuds/io or /^\s*elements/i or /^\s*[AFEG]/o) {
1378
      $is_liste_en_cours = 0;
1379
    }
1380
    elsif($is_liste_en_cours and /^\s*\d+(\s+\d+)*\s*$/io) {
1381
      s/^\s+//; s/\s+$//;
1382
      push(@{$listes_NOEUDS{$nom_liste}},split(/\s+/,$_));
1383
    }
1384
  }
1385
  close(Fher);
1386

    
1387
  open(Fher, "<$fher");
1388
  $is_liste_en_cours = 0;
1389
  while(<Fher>) {
1390
    chomp;
1391
    if(/^\s*(A\S+)/o) {
1392
      $nom_liste = $1;
1393
      $is_liste_en_cours = 1;
1394
      s/^\s*A\S+\s+//; s/\s+$//;
1395
      push(@{$listes_ARETES{$nom_liste}},split(/\s+/,$_));
1396
    }
1397
    elsif(/^\s*noeuds/io or /^\s*elements/i or /^\s*[NFEG]/o) {
1398
      $is_liste_en_cours = 0;
1399
    }
1400
    elsif($is_liste_en_cours and /^\s*\d+(\s+\d+)*\s*$/io) {
1401
      s/^\s+//; s/\s+$//;
1402
      push(@{$listes_ARETES{$nom_liste}},split(/\s+/,$_));
1403
    }
1404
  }
1405
  close(Fher);
1406

    
1407
  open(Fher, "<$fher");
1408
  $is_liste_en_cours = 0;
1409
  while(<Fher>) {
1410
    chomp;
1411
    if(/^\s*(F\S+)/) {
1412
      $nom_liste = $1;
1413
      $is_liste_en_cours = 1;
1414
      s/^\s*F\S+\s+//; s/\s+$//;
1415
      push(@{$listes_FACES{$nom_liste}},split(/\s+/,$_));
1416
    }
1417
    elsif(/^\s*noeuds/io or /^\s*elements/i or /^\s*[NAEG]/o) {
1418
      $is_liste_en_cours = 0;
1419
    }
1420
    elsif($is_liste_en_cours and /^\s*\d+(\s+\d+)*\s*$/io) {
1421
      s/^\s+//; s/\s+$//;
1422
      push(@{$listes_FACES{$nom_liste}},split(/\s+/,$_));
1423
    }
1424
  }
1425
  close(Fher);
1426

    
1427
  open(Fher, "<$fher");
1428
  $is_liste_en_cours = 0;
1429
  while(<Fher>) {
1430
    chomp;
1431
    if(/^\s*(E\S+)/o) {
1432
      $nom_liste = $1;
1433
      $is_liste_en_cours = 1;
1434
      s/^\s*E\S+\s+//; s/\s+$//;
1435
      push(@{$listes_ELEMENTS{$nom_liste}},split(/\s+/,$_));
1436
    }
1437
    elsif(/^\s*noeuds/io or /^\s*elements/io or /^\s*[NAFG]/o) {
1438
      $is_liste_en_cours = 0;
1439
    }
1440
    elsif($is_liste_en_cours and /^\s*\d+(\s+\d+)*\s*$/io) {
1441
      s/^\s+//; s/\s+$//;
1442
      push(@{$listes_ELEMENTS{$nom_liste}},split(/\s+/,$_));
1443
    }
1444
  }
1445
  close(Fher);
1446

    
1447
  open(Fher, "<$fher");
1448
  $is_liste_en_cours = 0;
1449
  while(<Fher>) {
1450
    chomp;
1451
    if(/^\s*(G\S+)/o) {
1452
      $nom_liste = $1;
1453
      $is_liste_en_cours = 1;
1454
      s/^\s*G\S+\s+//; s/\s+$//;
1455
      push(@{$listes_PTI{$nom_liste}},split(/\s+/,$_));
1456
    }
1457
    elsif(/^\s*noeuds/io or /^\s*elements/io or /^\s*[NAFE]/o) {
1458
      $is_liste_en_cours = 0;
1459
    }
1460
    elsif($is_liste_en_cours and /^\s*\d+(\s+\d+)*\s*$/io) {
1461
      s/^\s+//; s/\s+$//;
1462
      push(@{$listes_PTI{$nom_liste}},split(/\s+/,$_));
1463
    }
1464
  }
1465
  close(Fher);
1466

    
1467

    
1468
  #dans le .lis (si il existe)
1469
  if(-e $flis) {
1470

    
1471
  open(Flis, "<$flis");
1472
  $is_liste_en_cours = 0;
1473
  while(<Flis>) {
1474
    chomp;
1475
    if(/^\s*(N\S+)/o) {
1476
      $nom_liste = $1;
1477
      $is_liste_en_cours = 1;
1478
      s/^\s*N\S+\s+//; s/\s+$//;
1479
      push(@{$listes_NOEUDS{$nom_liste}},split(/\s+/,$_));
1480
    }
1481
    elsif(/^\s*noeuds/io or /^\s*elements/io or /^\s*[AFEG]/o) {
1482
      $is_liste_en_cours = 0;
1483
    }
1484
    elsif($is_liste_en_cours and /^\s*\d+(\s+\d+)*\s*$/i) {
1485
      s/^\s+//; s/\s+$//;
1486
      push(@{$listes_NOEUDS{$nom_liste}},split(/\s+/,$_));
1487
    }
1488
  }
1489
  close(Flis);
1490

    
1491
  open(Flis, "<$flis");
1492
  $is_liste_en_cours = 0;
1493
  while(<Flis>) {
1494
    chomp;
1495
    if(/^\s*(A\S+)/o) {
1496
      $nom_liste = $1;
1497
      $is_liste_en_cours = 1;
1498
      s/^\s*A\S+\s+//; s/\s+$//;
1499
      push(@{$listes_ARETES{$nom_liste}},split(/\s+/,$_));
1500
    }
1501
    elsif(/^\s*noeuds/io or /^\s*elements/io or /^\s*[NFEG]/o) {
1502
      $is_liste_en_cours = 0;
1503
    }
1504
    elsif($is_liste_en_cours and /^\s*\d+(\s+\d+)*\s*$/io) {
1505
      s/^\s+//; s/\s+$//;
1506
      push(@{$listes_ARETES{$nom_liste}},split(/\s+/,$_));
1507
    }
1508
  }
1509
  close(Flis);
1510

    
1511
  open(Flis, "<$flis");
1512
  $is_liste_en_cours = 0;
1513
  while(<Flis>) {
1514
    chomp;
1515
    if(/^\s*(F\S+)/o) {
1516
      $nom_liste = $1;
1517
      $is_liste_en_cours = 1;
1518
      s/^\s*F\S+\s+//; s/\s+$//;
1519
      push(@{$listes_FACES{$nom_liste}},split(/\s+/,$_));
1520
    }
1521
    elsif(/^\s*noeuds/io or /^\s*elements/io or /^\s*[NAEG]/o) {
1522
      $is_liste_en_cours = 0;
1523
    }
1524
    elsif($is_liste_en_cours and /^\s*\d+(\s+\d+)*\s*$/io) {
1525
      s/^\s+//; s/\s+$//;
1526
      push(@{$listes_FACES{$nom_liste}},split(/\s+/,$_));
1527
    }
1528
  }
1529
  close(Flis);
1530

    
1531
  open(Flis, "<$flis");
1532
  $is_liste_en_cours = 0;
1533
  while(<Flis>) {
1534
    chomp;
1535
    if(/^\s*(E\S+)/o) {
1536
      $nom_liste = $1;
1537
      $is_liste_en_cours = 1;
1538
      s/^\s*E\S+\s+//; s/\s+$//;
1539
      push(@{$listes_ELEMENTS{$nom_liste}},split(/\s+/,$_));
1540
    }
1541
    elsif(/^\s*noeuds/io or /^\s*elements/io or /^\s*[NAFG]/o) {
1542
      $is_liste_en_cours = 0;
1543
    }
1544
    elsif($is_liste_en_cours and /^\s*\d+(\s+\d+)*\s*$/io) {
1545
      s/^\s+//; s/\s+$//;
1546
      push(@{$listes_ELEMENTS{$nom_liste}},split(/\s+/,$_));
1547
    }
1548
  }
1549
  close(Flis);
1550

    
1551
  open(Flis, "<$flis");
1552
  $is_liste_en_cours = 0;
1553
  while(<Flis>) {
1554
    chomp;
1555
    if(/^\s*(G\S+)/o) {
1556
      $nom_liste = $1;
1557
      $is_liste_en_cours = 1;
1558
      s/^\s*G\S+\s+//; s/\s+$//;
1559
      push(@{$listes_PTI{$nom_liste}},split(/\s+/,$_));
1560
    }
1561
    elsif(/^\s*noeuds/io or /^\s*elements/io or /^\s*[NAFE]/o) {
1562
      $is_liste_en_cours = 0;
1563
    }
1564
    elsif($is_liste_en_cours and /^\s*\d+(\s+\d+)*\s*$/io) {
1565
      s/^\s+//; s/\s+$//;
1566
      push(@{$listes_PTI{$nom_liste}},split(/\s+/,$_));
1567
    }
1568
  }
1569
  close(Flis);
1570

    
1571
  }#if(-e $flis)
1572

    
1573
  #AFFICHAGE DES LISTES DE NOEUDS
1574
  #foreach my $nom (keys(%listes_NOEUDS)) {
1575
  #  print "$nom : @{$listes_NOEUDS{$nom}}\n";
1576
  #}
1577
  #AFFICHAGE DES LISTES D ARETES
1578
  #foreach my $nom (keys(%listes_ARETES)) {
1579
  #  print "$nom : @{$listes_ARETES{$nom}}\n";
1580
  #}
1581
  #AFFICHAGE DES LISTES DE FACES
1582
  #foreach my $nom (keys(%listes_FACES)) {
1583
  #  print "$nom : @{$listes_FACES{$nom}}\n";
1584
  #}
1585
  #AFFICHAGE DES LISTES D ELEMENTS
1586
  #foreach my $nom (keys(%listes_ELEMENTS)) {
1587
  #  print "$nom : @{$listes_ELEMENTS{$nom}}\n";
1588
  #}
1589
  #AFFICHAGE DES LISTES DE POINTS D INTEGRATION
1590
  #foreach my $nom (keys(%listes_PTI)) {
1591
  #  print "$nom : @{$listes_PTI{$nom}}\n";
1592
  #}
1593

    
1594
  return($nom_maillage, $nb_noeuds, \@tab_noeuds, $nb_elts, \%tab_elements,
1595
         \%listes_NOEUDS, \%listes_ARETES,
1596
         \%listes_FACES, \%listes_ELEMENTS, \%listes_PTI);
1597
}#sub lecture_mail_her
1598

    
1599

    
1600

    
1601

    
1602

    
1603
#cette subroutine est associee a l option -disable_F. Le but est de scruter le fichier .msh et de supprimer les 
1604
# listes de faces et les elements en lien avec ces listes de reference de faces
1605
#  **rq 1 : cette sub utilise la variable globale $fGmsh
1606
#  **rq 2 : cette sub modifie definitivement le fichier $fGmsh
1607
#
1608
sub suppr_liste_faces {
1609
  my $nb_elts;#nombre d elements original qui sera modifie en fonction du nombre d elements a supprimer
1610

    
1611
  #saisie du nombre d elements original
1612
  my @liste_elts_a_supprimer;
1613
  open(my $Hlocal, "<$fGmsh");
1614
  while(<$Hlocal>) {
1615
    if(not defined $nb_elts and /^\s*\$Elements/io) {
1616
      $_ = <$Hlocal>;
1617
      ($nb_elts) = $_ =~ /(\d+)/;
1618
      last;
1619
    }
1620
  }
1621

    
1622
  #constitution d une table d indicateur de suppression d un element (par defaut : pas de suppression, donc => $elt_a_supprimer[no elt] = 0
1623
  my @elt_a_supprimer; for(1 .. $nb_elts) {$elt_a_supprimer[$_] = 0;}
1624
  MAIN_WHILE:while(<$Hlocal>) {
1625
    next if(not /^\s*\$ElementData\s*$/io);
1626

    
1627
    #par cette boucle, on ne va traiter que les listes de faces (reperees par une ligne commencant par "F)
1628
    #  pour les autres types de ref, on recommencera un nouveau tour de MAIN_WHILE
1629
    while(<$Hlocal>) {
1630
      next MAIN_WHILE if(/^\s*\$EndElementData\s*$/io);
1631
      last if(/^\s*\"\s*F\S+/o);#on passe a la boucle suivante si c est une liste de faces
1632
    }
1633

    
1634
    #on traite la liste de faces : les elements de cet ElementData seront a supprimer (on l indique en mettant 1 dans la table d indicateur)
1635
    while(<$Hlocal>) {
1636
      last if(/^\s*\$EndElementData\s*$/io);
1637
      next if(not /^\s*(\d+)\s+\d+\s*$/o);
1638
      $elt_a_supprimer[$1] = 1;#on indique que c est un element a supprimer
1639
    }
1640
  }
1641
  close($Hlocal);
1642

    
1643
  #constitution d une table de correspondance entre ancien numero et nouveau numero d elements
1644
  #et du nouveau nombre d element
1645
  my @tab_corresp_elt_old_new;
1646
  my $nb_elts_new = 0;
1647
  for(my $i=1; $i<=$nb_elts; $i++) {
1648
    next if($elt_a_supprimer[$i]);#on passe si l element est a supprimer
1649

    
1650
    #element a conserver => on incremente le nouveau nombre d elements et on fait la correspondance entre l ancien numero ($i) et le nouveau ($nb_elts_new)
1651
    $nb_elts_new++;
1652
    $tab_corresp_elt_old_new[$i] = $nb_elts_new;#nouveau numero pour cet element
1653
  }
1654

    
1655
  #desormais, on a toutes les infos pour reecrire le fichier $fGmsh en supprimant les references de faces et en renumerotant
1656
  # les elements en fonction de @tab_corresp_elt_old_new
1657
  open($Hlocal, "<$fGmsh");
1658
  open(my $Htmp, ">$fGmsh.tmp");
1659

    
1660
  #traitement de la liste des elements
1661
  while(<$Hlocal>) {
1662
    print $Htmp $_;
1663
    next if(not /^\s*\$Elements/io);
1664
    <$Hlocal>;
1665
    print $Htmp "$nb_elts_new\n";
1666
    while(<$Hlocal>) {
1667
      if(/^\s*\$EndElements\s*$/io) {
1668
        print $Htmp $_;
1669
        last;
1670
      }
1671

    
1672
      next if(not /^\s*(\d+)/o);
1673
      my $no_elt = $1;
1674
      next if(not defined $tab_corresp_elt_old_new[$no_elt]);#rq : les elements a supprimer n ont pas de correspondance
1675
      s/^(\s*)$no_elt/$1$tab_corresp_elt_old_new[$no_elt]/;
1676
      print $Htmp $_;
1677
    }
1678
    last;
1679
  }
1680

    
1681
  #traitement des ElementData
1682
  while(my $ligne = <$Hlocal>) {
1683

    
1684
    #cas d un ElementData
1685
    if($ligne =~ /^\s*\$ElementData\s*$/io) {
1686
      my $entete = $ligne;
1687
      #on lit jusqu au nom de la reference
1688
      while($ligne = <$Hlocal>) {
1689
        $entete .= $ligne;
1690
        last if($ligne =~ /^\s*\"/o);
1691
      }
1692

    
1693
      #pas de recopie si c est une reference de faces
1694
      if($ligne =~ /^\s*\"\s*F\S+/o) {
1695
        while($ligne = <$Hlocal>) {
1696
          last if($ligne =~ /^\s*\$EndElementData\s*$/io);
1697
        }
1698
      }
1699
      #si c est autre chose qu une reference de faces, on modifie les numeros d elements en fonction de la table de correspondance
1700
      else {
1701
        print $Htmp $entete;
1702
        while($ligne = <$Hlocal>) {
1703
          if($ligne =~ /^\s*(\d+)\s+\d+\s*$/o) {
1704
            my $no_elt = $1;
1705
            $ligne =~ s/^(\s*)\d+/$1$tab_corresp_elt_old_new[$no_elt]/;
1706
          }
1707
          print $Htmp $ligne;
1708
          last if($ligne =~ /^\s*\$EndElementData\s*$/io);
1709
        }
1710
      }
1711

    
1712
    }
1713

    
1714
    #autre chose qu un ElementData
1715
    else {
1716
      print $Htmp $ligne;
1717
    }
1718
  }
1719
  close($Htmp);
1720
  close($Hlocal);
1721

    
1722
  system("mv -f $fGmsh.tmp $fGmsh");
1723
}#sub suppr_liste_faces
1724

    
1725
#cette subroutine est associee a l option -disable_A. Le but est de scruter le fichier .msh et de supprimer les 
1726
# listes d aretes et les elements en lien avec ces listes de reference d aretes
1727
#  **rq 1 : cette sub utilise la variable globale $fGmsh
1728
#  **rq 2 : cette sub modifie definitivement le fichier $fGmsh
1729
#
1730
sub suppr_liste_aretes {
1731
  my $nb_elts;#nombre d elements original qui sera modifie en fonction du nombre d elements a supprimer
1732

    
1733
  #saisie du nombre d elements original
1734
  my @liste_elts_a_supprimer;
1735
  open(my $Hlocal, "<$fGmsh");
1736
  while(<$Hlocal>) {
1737
    if(not defined $nb_elts and /^\s*\$Elements/io) {
1738
      $_ = <$Hlocal>;
1739
      ($nb_elts) = $_ =~ /(\d+)/;
1740
      last;
1741
    }
1742
  }
1743

    
1744
  #constitution d une table d indicateur de suppression d un element (par defaut : pas de suppression, donc => $elt_a_supprimer[no elt] = 0
1745
  my @elt_a_supprimer; for(1 .. $nb_elts) {$elt_a_supprimer[$_] = 0;}
1746
  MAIN_WHILE:while(<$Hlocal>) {
1747
    next if(not /^\s*\$ElementData\s*$/io);
1748

    
1749
    #par cette boucle, on ne va traiter que les listes d aretes (reperees par une ligne commencant par "A)
1750
    #  pour les autres types de ref, on recommencera un nouveau tour de MAIN_WHILE
1751
    while(<$Hlocal>) {
1752
      next MAIN_WHILE if(/^\s*\$EndElementData\s*$/io);
1753
      last if(/^\s*\"\s*A\S+/o);#on passe a la boucle suivante si c est une liste d aretes
1754
    }
1755

    
1756
    #on traite la liste d aretes : les elements de cet ElementData seront a supprimer (on l indique en mettant 1 dans la table d indicateur)
1757
    while(<$Hlocal>) {
1758
      last if(/^\s*\$EndElementData\s*$/io);
1759
      next if(not /^\s*(\d+)\s+\d+\s*$/o);
1760
      $elt_a_supprimer[$1] = 1;#on indique que c est un element a supprimer
1761
    }
1762
  }
1763
  close($Hlocal);
1764

    
1765
  #constitution d une table de correspondance entre ancien numero et nouveau numero d elements
1766
  #et du nouveau nombre d element
1767
  my @tab_corresp_elt_old_new;
1768
  my $nb_elts_new = 0;
1769
  for(my $i=1; $i<=$nb_elts; $i++) {
1770
    next if($elt_a_supprimer[$i]);#on passe si l element est a supprimer
1771

    
1772
    #element a conserver => on incremente le nouveau nombre d elements et on fait la correspondance entre l ancien numero ($i) et le nouveau ($nb_elts_new)
1773
    $nb_elts_new++;
1774
    $tab_corresp_elt_old_new[$i] = $nb_elts_new;#nouveau numero pour cet element
1775
  }
1776

    
1777
  #desormais, on a toutes les infos pour reecrire le fichier $fGmsh en supprimant les references d aretes et en renumerotant
1778
  # les elements en fonction de @tab_corresp_elt_old_new
1779
  open($Hlocal, "<$fGmsh");
1780
  open(my $Htmp, ">$fGmsh.tmp");
1781

    
1782
  #traitement de la liste des elements
1783
  while(<$Hlocal>) {
1784
    print $Htmp $_;
1785
    next if(not /^\s*\$Elements/io);
1786
    <$Hlocal>;
1787
    print $Htmp "$nb_elts_new\n";
1788
    while(<$Hlocal>) {
1789
      if(/^\s*\$EndElements\s*$/io) {
1790
        print $Htmp $_;
1791
        last;
1792
      }
1793

    
1794
      next if(not /^\s*(\d+)/o);
1795
      my $no_elt = $1;
1796
      next if(not defined $tab_corresp_elt_old_new[$no_elt]);#rq : les elements a supprimer n ont pas de correspondance
1797
      s/^(\s*)$no_elt/$1$tab_corresp_elt_old_new[$no_elt]/;
1798
      print $Htmp $_;
1799
    }
1800
    last;
1801
  }
1802

    
1803
  #traitement des ElementData
1804
  while(my $ligne = <$Hlocal>) {
1805

    
1806
    #cas d un ElementData
1807
    if($ligne =~ /^\s*\$ElementData\s*$/io) {
1808
      my $entete = $ligne;
1809
      #on lit jusqu au nom de la reference
1810
      while($ligne = <$Hlocal>) {
1811
        $entete .= $ligne;
1812
        last if($ligne =~ /^\s*\"/o);
1813
      }
1814

    
1815
      #pas de recopie si c est une reference d aretes
1816
      if($ligne =~ /^\s*\"\s*A\S+/o) {
1817
        while($ligne = <$Hlocal>) {
1818
          last if($ligne =~ /^\s*\$EndElementData\s*$/io);
1819
        }
1820
      }
1821
      #si c est autre chose qu une reference d aretes, on modifie les numeros d elements en fonction de la table de correspondance
1822
      else {
1823
        print $Htmp $entete;
1824
        while($ligne = <$Hlocal>) {
1825
          if($ligne =~ /^\s*(\d+)\s+\d+\s*$/o) {
1826
            my $no_elt = $1;
1827
            $ligne =~ s/^(\s*)\d+/$1$tab_corresp_elt_old_new[$no_elt]/;
1828
          }
1829
          print $Htmp $ligne;
1830
          last if($ligne =~ /^\s*\$EndElementData\s*$/io);
1831
        }
1832
      }
1833

    
1834
    }
1835

    
1836
    #autre chose qu un ElementData
1837
    else {
1838
      print $Htmp $ligne;
1839
    }
1840
  }
1841
  close($Htmp);
1842
  close($Hlocal);
1843

    
1844
  system("mv -f $fGmsh.tmp $fGmsh");
1845
}#sub suppr_liste_aretes
(23-23/24)
Redmine Appliance - Powered by TurnKey Linux