Projet

Général

Profil

Perl script : viewing the integration points of an element » hz_ptiElt.pl

Julien Troufflard, 06/11/2016 12:18

 
1
#!/usr/bin/env perl
2
use strict;
3
use warnings;
4
use English;
5
use File::Basename;
6
use File::Spec::Functions qw(rel2abs);
7
use Cwd;
8
my $NOM_PROG = basename $PROGRAM_NAME;
9
#pattern d un reel pour les regex
10
my $format_reel = '[+-]?[\.]?\d+[\.]?\d*(?:[eE][+-]?\d*)?';
11

    
12

    
13
my $VERSION = '1.00';
14
#####################################################################################################
15
#  script pour visualiser un ou plusieurs maillages dans Gmsh                                       #
16
#  version 1.00 : version initiale                                                                  #
17
#####################################################################################################
18

    
19

    
20

    
21

    
22

    
23

    
24

    
25

    
26

    
27

    
28

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

    
41

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

    
51
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
52
# FIN VARIABLES UTILISATEUR                                 #
53
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
54

    
55

    
56

    
57

    
58

    
59

    
60
sub affichage_aide {
61
  use Text::Wrap;
62
  #config du package Text::Wrap
63
  $Text::Wrap::columns = 81;#le nombre de caracteres maximum par ligne sera egal a ($Text::Wrap::columns - 1) dans le cas ou utilise wrap
64

    
65
  #indentation de longueur $NOM_PROG
66
  my $indent_NOM_PROG = ""; $indent_NOM_PROG .= " " for(1 .. length($NOM_PROG));
67

    
68
  print "----------------------------------------\n";
69
  print " script $NOM_PROG (version $VERSION)\n";
70
  print "----------------------------------------\n";
71
  print "\n";
72
  print "But : visualiser la position des points d integration d un\n";
73
  print "      element avec Gmsh\n";
74
  print "\n";
75
  print "Usage : $NOM_PROG [-h|help] [-exeHZ path_HZ] [-exeGMSH path_GMSH] fher no_elt\n";
76
  print "\n";
77
  print "Dependance :\n";
78
  print "    > script hz_splitMail.pl\n";
79
  print "\n";
80
  print "Fonctionnement :\n";
81
  print wrap("      ", "    ", "$NOM_PROG lance des calculs herezh pour lire la ",
82
                               "position des points d integration dans le .maple et ",
83
                               "cree une visu Gmsh de l element et ses points ",
84
                               "d integration\n");
85
  print "\n";
86
  print "Arguments :\n";
87
  print "     o fher   : fichier .her\n";
88
  print "     o no_elt : numero de l element\n";
89
  print "\n";
90
  print "Options :\n";
91
  print "    -v : affichage du numero de version\n";
92
  print "\n";
93
  print wrap("    ", "                     ", "-exeHZ path_HZ : choisir l executable Herezh++. Le calcul Herezh se ",
94
                                                               "fera avec l executable path_HZ\n",
95
                                                               "par defaut : linux 64 bits   => path_HZ=HZppfast64\n", 
96
                                                               "             MacOSX (darwin) => path_HZ=HZppfast_Vn-1\n",
97
                                                               "             autres          => path_HZ=HZppfast\n",
98
                                                               "(a noter que les alias shell ne fonctionneront pas)\n");
99
  print "\n";
100
  print wrap("    ", "                         ", "-exeGMSH path_GMSH : choisir l executable Gmsh. La visualisation Gmsh se ",
101
                                                                       "fera avec l executable path_GMSH\n",
102
                                                                       "par defaut : path_GMSH=gmsh\n",
103
                                                                       "(a noter que les alias shell ne fonctionneront pas)\n");
104
  print "\n";
105
  print "Remarque :\n";
106
  print "    Liste des elements supportes par ce script :\n";
107
  foreach my $type_elt (conversion_eltType_her2gmsh('-liste_elts',0)) {
108
    print "      > $type_elt\n";
109
  }
110
  print "\n";
111
  print "Auteur :\n";
112
  print "   TROUFFLARD Julien\n";
113
  print "       julien.troufflard\@univ-ubs.fr\n";
114
  print "       julien.troufflard\@free.fr\n";
115
  print "----------------------------------------\n";
116
  exit;
117
}
118

    
119

    
120

    
121
#------------------------------------
122
#premier balayage des arguments
123
# => si option du style -h ou -help => affichage aide
124
#------------------------------------
125
my $isOpt_help = 0;
126
foreach my $arg (@ARGV) {
127
  if(($arg =~ /^-h$/i) or ($arg =~ /^-help$/i)) {
128
    $isOpt_help = 1;
129
  }
130
}
131
#si option -h|-help ou pas d arguments => affichage aide
132
if($isOpt_help or ($#ARGV == -1)) {
133
  affichage_aide();
134
}
135

    
136
#------------------------------------
137
#recuperation des arguments et options
138
#------------------------------------
139
my $fher;#fichier .her
140
my $no_elt;#numero de l element
141

    
142
my $opt;
143
my @args;
144
while($#ARGV != -1) {
145
  $opt = shift(@ARGV);
146

    
147
  #affichage numero version
148
  if($opt eq '-v') {
149
    print "\n $NOM_PROG : version $VERSION\n\n";
150
    exit;
151
  }
152
  #option -exeHZ
153
  elsif($opt eq '-exeHZ') {
154
    ($#ARGV >= 0) or die "\nErreur (prog:$NOM_PROG,opt:-exeHZ) : pas assez d arguments donnes pour cette option...\n\n";
155
    $exeHZ = shift(@ARGV);
156
  }
157
  #option -exeGMSH
158
  elsif($opt eq '-exeGMSH') {
159
    ($#ARGV >= 0) or die "\nErreur (prog:$NOM_PROG,opt:-exeGMSH) : pas assez d arguments donnes pour cette option...\n\n";
160
    $exeGMSH = shift(@ARGV);
161
  }
162

    
163
  #arguments obligatoires
164
  else {
165
    push(@args,$opt);
166
  }
167
}#while($#ARGV != -1)
168

    
169
($#args >= 1) or die "\nErreur (prog:$NOM_PROG) : arguments manquants...\n\n";
170
$fher = shift(@args);
171
$no_elt = shift(@args);
172

    
173

    
174
#---------------------
175
#verif de l executable Herezh
176
#---------------------
177
#si la variable $exeHZ n a pas ete renseigne au prealable => on selectionne l executable par defaut en fonction de la plateforme
178
if(not defined($exeHZ)) {
179
  #- - - - - -
180
  #type de plateforme
181
  #- - - - - -
182
  my $type_OS;
183
  #-avec uname
184
  if(verif_commande('uname')) {
185
    $type_OS = qx(uname -a);
186
    chomp($type_OS);
187
  }
188
  #-sinon : warning (OS inconnue)
189
  else {warn "**Attention : impossible de saisir le type de systeme d exploitation avec uname -a ...\n";}
190

    
191
  #selection de l executable Herezh
192
  #-linux 64 bits
193
  if($type_OS =~ /linux/i and $type_OS =~ /x86_64/i) {$exeHZ = $EXE_HZ_Linux64bits;}
194
  #-MacOSX (darwin)
195
  elsif($type_OS =~ /darwin/i) {$exeHZ = $EXE_HZ_MacOSX;}
196
  #-tous les autres (y compris linux 32 bits)
197
  else{$exeHZ = $EXE_HZ_autres;}
198
}
199
#verif de l executable Herezh
200
verif_commande($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";
201

    
202
#---------------------
203
#verif de l executable Gmsh
204
#---------------------
205
#si la variable $exeGMSH n a pas ete renseigne au prealable => on selectionne l executable par defaut
206
$exeGMSH = $exeGMSH_defaut if(not defined($exeGMSH));
207
#verif de l executable Gmsh
208
verif_commande($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";
209

    
210

    
211

    
212

    
213

    
214

    
215

    
216
#existence du fichier .info
217
(-e $fher) or die "\nErreur (prog:$NOM_PROG) : fichier $fher introuvable...\n\n";
218
#extension du fichier .her
219
($fher =~ /\.her$/) or die "\nErreur (prog:$NOM_PROG) : fichier $fher n a pas l extension .her ...\n\n";
220

    
221
#verif de l exe HZ++
222
defined(( verif_commande($exeHZ) )[0]) or die "\nErreur (prog:$NOM_PROG) : l executable HZ++ ($exeHZ) est introuvable dans les \$PATH ...\n\n";
223
#verif de hz_splitMail.pl
224
defined(( verif_commande("hz_splitMail.pl") )[0]) or die "\nErreur (prog:$NOM_PROG) : l executable hz_splitMail.pl est introuvable dans les \$PATH ...\n\n";
225

    
226

    
227
#verif du numero d element
228
($_, $_, $_, $_[0]) = lecture_mail_her($fher);
229
$_[1] = 'element'; $_[1] .= 's' if($_[0] > 1);#petite bidouille pour afficher "element" sans "s" si il y a un seul element dans le maillage
230
($no_elt <= $_[0]) or die "\nErreur (prog:$NOM_PROG) : element $no_elt n existe pas dans le maillage $fher (qui contient $_[0] $_[1]) ...\n\n";
231

    
232

    
233
#racine fichier visu Gmsh
234
my $racine_fvisu = "visu_Gmsh";
235

    
236
#repertoire temporaire
237
my $rep_tmp = "/tmp/$NOM_PROG\_$PID";
238
mkdir $rep_tmp or die "\nErreur (prog:$NOM_PROG) : impossible de creer le repertoire $rep_tmp (message d erreur : $!)\n\n";
239

    
240
#recopie du maillage vers le repertoire temporaire
241
system("cp $fher $rep_tmp/.");
242
#-- et son eventuel .lis
243
($_ = $fher) =~ s/.her$/.lis/;
244
system("cp $_ $rep_tmp/.") if(-e $_);
245

    
246
#deplacement vers le repertoire temporaire
247
my $rep_original = cwd;#repertoire d origine ...
248
$rep_original = rel2abs($rep_original);#... en chemin absolu
249
chdir $rep_tmp;
250

    
251

    
252

    
253
#
254
# pour l instant, on travaille sur un maillage reduit au seul element $no_elt
255
#  on retabliera le maillage original par la suite
256
#
257
my $no_elt_original = $no_elt;
258
my $fher_original = basename $fher;
259
$no_elt = 1;
260
$fher = "$racine_fvisu.her";
261

    
262
#constitution des listes des elements 1D, 2D et 3D
263
my @PREFIXE_1D = qw(POUT);
264
my @PREFIXE_2D = qw(TRIA QUAD);
265
my @SUFFIXE_AXI = qw(_AXI);
266
#-maillage de l element $no_elt uniquement (on utilise $racine_fvisu pour nommer ce maillage)
267
system("hz_splitMail.pl $fher_original $no_elt_original > redir.txt");
268
#-recuperation du .her qui nous interesse en sortie de hz_splitMail.pl 
269
my @fic_generes_par_split;
270
open(FIC, "<redir.txt");
271
while(<FIC>) {
272
  if(/\b(\S+.her)\b/) {
273
    push(@fic_generes_par_split, $1);
274
  }
275
}
276
close(FIC);
277
system("mv $fic_generes_par_split[0] $fher");
278
my ($nom_maillage, $nb_noeuds, $ref_noeuds, $nb_elts, $ref_elements, @ref_listes) = lecture_mail_her($fher);
279
my (@ELEM_1D, @ELEM_2D, @ELEM_3D);
280
ELEM:for(my $i=1; $i<=$nb_elts; $i++) {
281
  #verif si element AXI (donc loi 3D)
282
  foreach my $suffixe (@SUFFIXE_AXI) {
283
    @_ = split(/\s+/, $ref_elements->{$i}{'TYPE'});
284
    if($_[0] =~ /$suffixe\s*$/) {
285
      push(@ELEM_3D, $i);
286
      next ELEM;
287
    }
288
  }
289
  #verif si element 1D
290
  foreach my $prefixe (@PREFIXE_1D) {
291
    if($ref_elements->{$i}{'TYPE'} =~ /^\s*$prefixe/) {
292
      push(@ELEM_1D, $i);
293
      next ELEM;
294
    }
295
  }
296
  #verif si element 2D
297
  foreach my $prefixe (@PREFIXE_2D) {
298
    if($ref_elements->{$i}{'TYPE'} =~ /^\s*$prefixe/) {
299
      push(@ELEM_2D, $i);
300
      next ELEM;
301
    }
302
  }
303
  #sinon, c est un element 3D
304
  push(@ELEM_3D, $i);
305
}
306

    
307

    
308
#saisie des coordonnees des points d integration de l element (on incremente $no_pti jusqu a ce que le calcul soit echec)
309
my $no_pti = 0;
310
my @COORD_PTI;
311
print "\n... calcul HZ++ pour connaitre les coord des points d integration ...\n";
312
print "     (rq : c est normal que le dernier calcul genere une erreur de segmentation)\n";
313
while() {
314
  $no_pti++;
315

    
316
  #preparation du calcul
317
  my $racine_fher = $fher; $racine_fher =~ s/\.her$//;
318
  my $racine_tmp = $racine_fher.int(rand(9999999)); while(-e "$racine_tmp.info") {$racine_tmp = $racine_fher.int(rand(9999999));}
319
  my $finfo = $racine_tmp.'.info';
320
  my $fCVisu = $racine_tmp.'.CVisu';
321
  my $fmaple = $racine_tmp.'_princ.maple';
322
  print_finfo($finfo);
323
  print_fCVisu($fCVisu);
324

    
325
  #lancement du calcul
326
  system("$exeHZ -f $finfo > /dev/null");
327

    
328

    
329
  #lecture du .maple
330
  my ($col_X, $col_Y, $col_Z);
331
  open(FIC, "<$fmaple");
332
  while(<FIC>) {
333
    next if(not (/element_/ and /pt_integ_/));
334
    $col_X = $1 if(/\[\s*(\d+)\s*\]\s*X /);
335
    $col_Y = $1 if(/\[\s*(\d+)\s*\]\s*Y /);
336
    $col_Z = $1 if(/\[\s*(\d+)\s*\]\s*Z /);
337
    last;
338
  }
339
  my ($X,$Y,$Z);
340
  while(<FIC>) {
341
    next if(not /^\s*$format_reel/);
342
    s/^\s+//;
343
    @_ = split(/\s+/, $_);
344
    $X = $_[$col_X-1] if(defined $col_X);
345
    $Y = $_[$col_Y-1] if(defined $col_Y);
346
    $Z = $_[$col_Z-1] if(defined $col_Z);
347
    last;
348
  }
349
  close(FIC);
350

    
351
  #destruction des fichiers de calcul
352
  system("rm -f $finfo $fCVisu $fmaple");
353

    
354
  if(defined $Z) {
355
    #print "\ncoord (X Y Z) elt $no_elt pti $no_pti : $X $Y $Z\n\n";
356
    @{$COORD_PTI[$no_pti]} = ($X, $Y, $Z);
357
  }
358
  elsif(defined $Y) {
359
    #print "\ncoord (X Y) elt $no_elt pti $no_pti : $X $Y\n\n";
360
    @{$COORD_PTI[$no_pti]} = ($X, $Y, 0);
361
  }
362
  elsif(defined $X) {
363
    #print "\ncoord (X) elt $no_elt pti $no_pti : $X\n\n";
364
    @{$COORD_PTI[$no_pti]} = ($X, 0, 0);
365
  }
366
  #fin de la boucle while() infinie
367
  else {$no_pti--; last;}
368
}
369

    
370
#on retablit le maillage original
371
system("rm -f $racine_fvisu.her $racine_fvisu.lis");
372
$no_elt = $no_elt_original;
373
$fher = $fher_original;
374
($nom_maillage, $nb_noeuds, $ref_noeuds, $nb_elts, $ref_elements, @ref_listes) = lecture_mail_her($fher);
375

    
376
#conversion des types d elements de herezh vers gmsh
377
conversion_eltType_her2gmsh($nb_elts,$ref_elements);
378

    
379

    
380
#creation d un fichier de visu Gmsh de l element $no_elt
381
# rq : en gardant la numerotation du maillage original
382
#-- on va ecrire seulement les $no_noeud_max premiers noeuds (c est a dire le no de noeud max parmi ceux de l element $no_elt)
383
my $no_noeud_max = 0;
384
foreach my $noeud_old (@{$ref_elements->{$no_elt}{'CONNEX'}}) {
385
  next if($noeud_old < $no_noeud_max);
386
  $no_noeud_max = $noeud_old;
387
}
388
open(Fmsh, ">$racine_fvisu.msh");
389
print Fmsh <<"_FIN_";
390
\$MeshFormat
391
2 0 8
392
\$EndMeshFormat
393
\$Nodes
394
$no_noeud_max
395
_FIN_
396
for(my $i=1; $i<=$no_noeud_max; $i++) {
397
  print Fmsh "$i  @{$ref_noeuds->[$i]}\n";
398
}
399
print Fmsh <<"_FIN_";
400
\$EndNodes
401
\$Elements
402
1
403
_FIN_
404
print Fmsh "1  $ref_elements->{$no_elt}{'TYPE'}   @{$ref_elements->{$no_elt}{'CONNEX'}}\n";
405
print Fmsh <<'_FIN_';
406
$EndElements
407
_FIN_
408
close(Fmsh);
409

    
410
#creation d un .geo pour y ecrire les points d integration sous forme de Point()
411
open(Fgeo, ">$racine_fvisu.geo");
412
for(my $i=1; $i<=$no_pti; $i++) {
413
  print Fgeo "Point($i) = {$COORD_PTI[$i][0], $COORD_PTI[$i][1], $COORD_PTI[$i][2], 1.e+22};\n";
414
}
415
print Fgeo '
416
Geometry.Light = 0;     //desactivation de la lumiere (geometrie)
417
Mesh.Light = 0;         //desactivation de la lumiere (maillage)
418
View.Light = 0;         //desactivation de la lumiere (vue)
419
Mesh.ColorCarousel = 0; //type de couleur (0=by element type, 1=by elementary entity, 2=by physical entity, 3=by partition)
420
Geometry.Points = 1;    //affichage des points (=0 desactiver, =1 activer)
421
Geometry.Color.Points = {255,0,0};
422
Geometry.PointNumbers = 1;//affichage des numeros de points (=0 desactiver, =1 activer)
423
Mesh.Points = 1;        //affichage des noeuds (=0 desactiver, =1 activer)
424
Mesh.Lines = 1;         //affichage des lignes (elements 1D) (=0 desactiver, =1 activer)
425
Mesh.SurfaceEdges = 1;  //affichage des aretes des elements 2D (=0 desactiver, =1 activer)
426
Mesh.SurfaceFaces = 0;  //affichage des faces des elements 2D (=0 desactiver, =1 activer)
427
Mesh.VolumeEdges = 1;   //affichage des aretes des elements 3D (=0 desactiver, =1 activer)
428
Mesh.VolumeFaces = 0;   //affichage des faces des elements 3D (=0 desactiver, =1 activer)
429
Mesh.PointSize = 3.;   //taille des noeuds
430
Mesh.PointNumbers = 1;//affichage des numeros de noeuds (=0 desactiver, =1 activer)
431
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
432
Mesh.Color.Lines = {0,0,0};
433
Mesh.Color.Triangles = {0,0,0};
434
Mesh.Color.Quadrangles = {0,0,0};
435
Mesh.Color.Tetrahedra = {0,0,0};
436
Mesh.Color.Hexahedra = {0,0,0};
437
Mesh.Color.Prisms = {0,0,0};
438
Mesh.Color.Pyramids = {0,0,0};
439
';
440

    
441
$_ = rel2abs("$racine_fvisu.msh");
442
print Fgeo "Merge \"$_\";\n";
443
close(Fgeo);
444

    
445

    
446
#lancement gmsh
447
system("$exeGMSH $racine_fvisu.geo");
448

    
449

    
450

    
451
#effacement repertoire temporaire
452
chdir $rep_original;
453
system("rm -rf $rep_tmp");
454

    
455

    
456

    
457
sub conversion_eltType_her2gmsh {
458
  my $premier_arg = shift;
459
  my $ref_elts = shift;
460

    
461
  my %table_conversion_elt;
462
  #elements 1D lineaire
463
  $table_conversion_elt{'POUT BIE1'}{'TYPE'} = "1 3 0 0 0";
464
  @{$table_conversion_elt{'POUT BIE1'}{'CONNEX'}} = (0, 1);
465
  #elements 2D lineaire
466
  $table_conversion_elt{'TRIANGLE LINEAIRE'}{'TYPE'} = "2 3 0 0 0";
467
  @{$table_conversion_elt{'TRIANGLE LINEAIRE'}{'CONNEX'}} = (0, 1, 2);
468
  $table_conversion_elt{'QUADRANGLE LINEAIRE'}{'TYPE'} = "3 3 0 0 0";
469
  @{$table_conversion_elt{'QUADRANGLE LINEAIRE'}{'CONNEX'}} = (0, 1, 2, 3);
470
  #elements 2D axisymetriques lineaire
471
  $table_conversion_elt{'TRIA_AXI LINEAIRE'}{'TYPE'} = "2 3 0 0 0";
472
  @{$table_conversion_elt{'TRIA_AXI LINEAIRE'}{'CONNEX'}} = (0, 1, 2);
473
  $table_conversion_elt{'QUAD_AXI LINEAIRE'}{'TYPE'} = "3 3 0 0 0";
474
  @{$table_conversion_elt{'QUAD_AXI LINEAIRE'}{'CONNEX'}} = (0, 1, 2, 3);
475
  #elements 2D quadratique
476
  $table_conversion_elt{'TRIANGLE QUADRACOMPL'}{'TYPE'} = "9 3 0 0 0";
477
  @{$table_conversion_elt{'TRIANGLE QUADRACOMPL'}{'CONNEX'}} = (0, 1, 2, 3, 4, 5);
478
  $table_conversion_elt{'QUADRANGLE QUADRACOMPL'}{'TYPE'} = "10 3 0 0 0";#quadrangle quadratique complet 9 noeuds
479
  @{$table_conversion_elt{'QUADRANGLE QUADRACOMPL'}{'CONNEX'}} = (0, 1, 2, 3, 4, 5, 6, 7, 8);
480
  $table_conversion_elt{'QUADRANGLE QUADRATIQUE'}{'TYPE'} = "16 3 0 0 0";#quadrangle quadratique incomplet 8 noeuds
481
  @{$table_conversion_elt{'QUADRANGLE QUADRACOMPL'}{'CONNEX'}} = (0, 1, 2, 3, 4, 5, 6, 7);
482
  #elements 2D axisymetriques quadratique
483
  $table_conversion_elt{'TRIA_AXI QUADRACOMPL'}{'TYPE'} = "9 3 0 0 0";
484
  @{$table_conversion_elt{'TRIA_AXI QUADRACOMPL'}{'CONNEX'}} = (0, 1, 2, 3, 4, 5);
485
  $table_conversion_elt{'QUAD_AXI QUADRACOMPL'}{'TYPE'} = "10 3 0 0 0";
486
  @{$table_conversion_elt{'QUAD_AXI QUADRACOMPL'}{'CONNEX'}} = (0, 1, 2, 3, 4, 5, 6, 7, 8);
487
  $table_conversion_elt{'QUAD_AXI QUADRATIQUE'}{'TYPE'} = "16 3 0 0 0";
488
  @{$table_conversion_elt{'QUAD_AXI QUADRATIQUE'}{'CONNEX'}} = (0, 1, 2, 3, 4, 5, 6, 7);
489
  #elements 3D lineaire
490
  $table_conversion_elt{'TETRAEDRE LINEAIRE'}{'TYPE'} = "4 3 0 0 0";
491
  @{$table_conversion_elt{'TETRAEDRE LINEAIRE'}{'CONNEX'}} = (0, 1, 2, 3);
492
  $table_conversion_elt{'HEXAEDRE LINEAIRE'}{'TYPE'} = "5 3 0 0 0";
493
  @{$table_conversion_elt{'HEXAEDRE LINEAIRE'}{'CONNEX'}} = (0, 1, 2, 3, 4, 5, 6, 7);
494
  $table_conversion_elt{'PENTAEDRE LINEAIRE'}{'TYPE'} = "6 3 0 0 0";
495
  @{$table_conversion_elt{'PENTAEDRE LINEAIRE'}{'CONNEX'}} = (0, 1, 2, 3, 4, 5);
496
  #elements 3D quadratiques
497
  $table_conversion_elt{'PENTAEDRE QUADRATIQUE'}{'TYPE'} = "18 3 0 0 0";#pentaedre quadratique incomplet 15 noeuds
498
  @{$table_conversion_elt{'PENTAEDRE QUADRATIQUE'}{'CONNEX'}} = (0, 1, 2, 3, 4, 5, 6, 8, 9, , 7, 10, 11, 12, 14, 13);
499
  $table_conversion_elt{'PENTAEDRE QUADRACOMPL'}{'TYPE'} = "13 3 0 0 0";#pentaedre quadratique complet 18 noeuds
500
  @{$table_conversion_elt{'PENTAEDRE QUADRACOMPL'}{'CONNEX'}} = (0, 1, 2, 3, 4, 5, 6, 8, 9, 7, 10, 11, 12, 14, 13);
501
  $table_conversion_elt{'HEXAEDRE QUADRATIQUE'}{'TYPE'} = "17 3 0 0 0";
502
  @{$table_conversion_elt{'HEXAEDRE QUADRATIQUE'}{'CONNEX'}} = (0, 1, 2, 3, 4, 5, 6, 7, 8, 11, 12, 9, 13, 10, 14, 15, 16, 19, 17, 18);
503
  $table_conversion_elt{'HEXAEDRE QUADRACOMPL'}{'TYPE'} = "12 3 0 0 0";
504
  @{$table_conversion_elt{'HEXAEDRE QUADRACOMPL'}{'CONNEX'}} = (0, 1, 2, 3, 4, 5, 6, 7, 8, 11, 12, 9, 13, 10, 14, 15, 16, 19, 17, 18, 20, 21, 24, 22, 23, 25, 26);
505

    
506

    
507
  #option -liste_elts (on renvoie la liste des elements supportes par conversion_eltType_her2gmsh()
508
  my @LISTE_ELTS_SUPPORTES = keys %table_conversion_elt;
509
  if($premier_arg eq '-liste_elts') {
510
    return @LISTE_ELTS_SUPPORTES;
511
  }
512

    
513
  #sinon $premier_arg est un numero d element
514
  my $nb_elts = $premier_arg;
515

    
516
  my $type;
517
  my @connex_msh;
518
  my $ind;
519
  for(my $i=1; $i<=$nb_elts; $i++) {
520
    $type = $ref_elts->{$i}{'TYPE'};
521
    $type =~ s/_cm\d+pti//;#suppression d un eventuel changement du nombre de points d integration de l element
522
    $type =~ s/^\s+//; $type =~ s/\s+$//;
523
    $type =~ s/\s+/ /g;
524

    
525
    defined($table_conversion_elt{$type}{'TYPE'}) or die "\nErreur (prog:$NOM_PROG) : type d element \"$type\" non supporte...\n\n";
526

    
527
    $ref_elts->{$i}{'TYPE'} = $table_conversion_elt{$type}{'TYPE'};
528
    @connex_msh = ();
529
    for(my $j=0; $j<=$#{$table_conversion_elt{$type}{'CONNEX'}}; $j++) {
530
      $ind = $table_conversion_elt{$type}{'CONNEX'}[$j];
531
      push(@connex_msh, $ref_elts->{$i}{'CONNEX'}[$ind]);
532
    }
533
    for(my $j=0; $j<=$#{$table_conversion_elt{$type}{'CONNEX'}}; $j++) {
534
      $ref_elts->{$i}{'CONNEX'}[$j] = $connex_msh[$j];
535
    }
536
  }
537
}#sub conversion_her2gmsh
538

    
539

    
540

    
541
#####################################################################################################
542
#subroutine qui recherche l existence d une commande et renvoie le premier path trouve (renvoie 0 si commande introuvable)
543
#####################################################################################################
544
# en entree :
545
#    - nom de la commande
546
#
547
# en sortie :
548
#    - chemin absolu de la commande (0 si commande introuvable)
549
#
550
sub verif_commande {
551
  my $cmd = shift;#nom de la commande
552

    
553
  #cas d un chemin absolu ou relatif (si la commande commence par . ou /. Par exemple : ./HZpp ../HZppfast ou /Users/dupont/bin/HZppfast)
554
  if($cmd =~ /^\./ or $cmd =~ /^\//) {
555
    #on passe la commande en chemin absolu
556
    $cmd = rel2abs($cmd);
557
    return $cmd;
558
  }
559

    
560
  #sinon on regarde dans la variable environnement $PATH
561
  foreach my $path (split(/\s*:\s*/, $ENV{PATH})) {
562
    if(-x "$path/$cmd") {
563
      #on s assure que c est un chemin absolu
564
      $cmd = rel2abs("$path/$cmd");
565
      return $cmd;
566
    }
567
  }
568

    
569
  #on regarde a nouveau si la commande est en chemin absolu ou relatif
570
  #  (cas d une commande qui ne commence pas par . ou / et qui n est pas dans les PATH. Par exemple : rep/HZpp)
571
  if(-x $cmd) {
572
    #on passe la commande en chemin absolu
573
    $cmd = rel2abs($cmd);
574
    return $cmd;
575
  }
576

    
577
  #cas ou la commande est introuvable
578
  return 0;
579
}#sub verif_commande
580

    
581

    
582

    
583

    
584
#rq : on cree un calcul de dynamique explicite (plus rapide pour faire un increment)
585
sub print_finfo {
586

    
587
my $fic = shift;
588
open(FIC, ">$fic");
589
print FIC '
590
dimension   3
591

    
592
niveau_commentaire   3
593

    
594
TYPE_DE_CALCUL
595

    
596
dynamique_explicite   avec plus lectureCommandesVisu
597
';
598

    
599
print FIC "< $fher\n";
600

    
601
print FIC "ELEM_1D @ELEM_1D\n" if($#ELEM_1D > -1);
602
print FIC "ELEM_2D @ELEM_2D\n" if($#ELEM_2D > -1);
603
print FIC "ELEM_3D @ELEM_3D\n" if($#ELEM_3D > -1);
604

    
605
print FIC '
606
les_courbes_1D ----------------------------------------------
607

    
608
courbe_traction COURBEPOLYLINEAIRE_1_D
609
  Debut_des_coordonnees_des_points
610
    Coordonnee dim= 2 0. 0.
611
    Coordonnee dim= 2 1.  -0.30
612
  Fin_des_coordonnees_des_points
613

    
614
choix_materiaux ----------
615
';
616

    
617
print FIC "ELEM_1D MAT_1D\n" unless($#ELEM_1D == -1);
618
print FIC "ELEM_2D MAT_2D\n" unless($#ELEM_2D == -1);
619
print FIC "ELEM_3D MAT_3D\n" unless($#ELEM_3D == -1);
620

    
621
print FIC '
622
materiaux ----------------------------------------------
623

    
624
MAT_1D     LOI_RIEN1D
625
MAT_2D     LOI_RIEN2D_C
626
MAT_3D     LOI_RIEN3D
627

    
628
masse_volumique ----------------------------
629

    
630
E_tout  1
631
';
632

    
633
print FIC "\nsections\n\nELEM_1D 1\n\n" unless($#ELEM_1D == -1);
634
print FIC "\nepaisseurs\n\nELEM_2D 1\n" unless($#ELEM_2D == -1);
635

    
636
print FIC '
637
charges ------------------------------------
638

    
639
blocages ---------------------------------
640

    
641
controle ---------------------------------------
642

    
643
DELTAtMAXI   1
644
TEMPSFIN     1
645
DELTAt       1
646
ITERATIONS   15
647
PRECISION    1e-3
648
SAUVEGARDE   1
649
MAXINCRE     1
650

    
651
para_pilotage_equi_global ---------------------------------
652

    
653
para_syteme_lineaire ------------
654

    
655
para_affichage ------------
656

    
657
resultats  pas_de_sortie_finale_
658
COPIE 0
659

    
660
_fin_point_info_
661
';
662
close(FIC);
663
}
664

    
665
sub print_fCVisu {
666

    
667
my $fic = shift;
668
open(FIC, ">$fic");
669
print FIC '
670
     debut_fichier_commande_visu   # >>>>>> le mot cle: <debut_fichier_commande_visu> 
671
                                   # permet au programme de se positionner au debut du fichier, il est indispensable 
672
 #  =================================================================================
673
 #  ||       *****         demande dune visualisation maple:      *****           || 
674
 #  =================================================================================
675
 #  un mot cle de debut (debut_visualisation_maple)
676
 #  un mot cle de fin ( fin_visualisation_maple)
677
 #  la seule presence de ces deux mots cle suffit a activer la visualisation maple
678
 debut_visualisation_maple 
679

    
680
 #  ----------------------------- definition de la liste des increments a balayer: ---------------- 
681
 debut_list_increment #  un mot cle de debut de liste 
682
 actif 1   # <0 ou 1> indique si lordre est actif ou non 
683
 # une liste dentier separee par des blancs, ou le mot cle (tous_les_increments) 
684
 #   un mot cle de fin de liste ( fin_list_increment)
685
 dernier_increment    fin_list_increment 
686

    
687
 #  ----------------------------- choix des maillages a visualiser: ---------------- 
688
 #  la liste est facultative, par defaut la visualisation concerne le premier maillage
689
 debut_choix_maillage #  un mot cle de debut,
690
 actif 0   # <0 ou 1> indique si lordre est actif ou non 
691
 #  une liste dentiers , puis <fin_choix_maillage>, sur une meme ligne
692
 1  fin_choix_maillage 
693

    
694
 #  ----------------------------- definition des grandeurs a visualiser (maple): ---------------- 
695
 debut_grandeurs_maple  #  un mot cle de debut (debut_grandeurs_maple),
696
 actif 1   # <0 ou 1> indique si lordre est actif ou non 
697
 # les grandeurs globales (energie, puissance ....) un mot cle de debut, le nom des grandeurs puis un mot de fin
698
 debut_grandeurs_globales     fin_grandeurs_globales  
699
 #  ensuite pour chaque maillage:,
700
 #    le numero du maillage <un entier>,  
701
 #    les infos pour la visualisation eventuelle des torseurs de reaction,
702
 #    les infos pour la visualisation eventuelle aux noeud,
703
 #         - tout dabord les ddl principaux (position, deplacements, temperature etc.)
704
 #         - puis les ddl etendus et particulieres qui peuvent representer des grandeurs diverses 
705
 #    les infos pour la visualisation eventuelle aux elements,
706
 #         - tout dabord les grandeurs generiques (deformations, contraintes etc.)
707
 #         - puis les grandeurs particulieres, par exemple specifique a une loi de comp ou une mesure de def 
708
 #  enfin un mot cle de fin ( fin_grandeurs_maple)
709
 1 # le numero de maillage
710
 # les torseurs de reaction:  un mot cle de debut:  debut_list_torseur_reaction
711
 # une liste de nom  <chaine de caracteres >, puis <fin_list_torseur_reaction>
712
 debut_list_torseur_reaction   fin_list_torseur_reaction  
713
 debut_liste_ddl_et_noeud     # ** debut des ddl principaux aux noeuds 
714
 #  debut de la liste de noeuds,  puis une liste de numero de noeud <entier>, puis <fin_list_noeud>
715
 deb_list_noeud   fin_list_noeud  
716
 #  debut de la liste des ref de noeuds,  puis une liste de nom  <chaine de caracteres >, puis <fin_list_ref_noeud>
717
 deb_list_ref_noeud  fin_list_ref_noeud  
718
 #   debut de la liste des ddl a considerer aux noeuds, (une liste de ddl), puis <fin_list_ddl_noeud>
719
 deb_list_ddl_noeud          fin_list_ddl_noeud   
720
 type_sortie_ddl_retenue= 0
721
 #   debut de la liste des ddl etendus a considerer aux noeuds, (une liste de ddl), puis <fin_list_ddl_etendu_noeud>
722
 deb_list_ddl_etendu_noeud         fin_list_ddl_etendu_noeud    # fin des ddl etendu aux noeuds
723
 #   debut de la liste des grandeurs particulieres a considerer aux noeuds, (une liste de string), puis <fin_list_GrandParticuliere_noeud>
724
 deb_list_GrandParticuliere_noeud         fin_list_GrandParticuliere_noeud    # fin des grandeurs particulieres aux noeuds
725
 fin_liste_ddl_et_noeud      # fin des grandeurs aux noeuds
726
 debut_liste_ddl_ptinteg  # ** debut des grandeurs aux elements 
727
 #  debut de la liste des elements et points dintegration, une liste de   (un element, un numero de pt dinteg), puis <fin_list_NbElement_NbPtInteg>
728
';
729

    
730
print FIC " deb_list_NbElement_NbPtInteg $no_elt $no_pti  fin_list_NbElement_NbPtInteg  \n";
731

    
732
print FIC '
733
 #  debut de la liste des ref delements,  puis une liste de: nom  <chaine de caracteres > + numero dinteg, puis <fin_list_ref_element>
734
 deb_list_ref_element  fin_list_ref_element  
735
 #  debut de la liste des ref de ptinteg delements,  puis une liste de: nom  <chaine de caracteres >  puis <fin_list_ref_ptinteg_element>
736
 deb_list_ref_ptinteg_element    fin_list_ref_ptinteg_element  
737
 # debut de la liste des ddl a considerer pour les elements, (une liste de ddl),    puis <fin_list_ddl_element>
738
 deb_list_ddl_element  contrainte_mises       fin_list_ddl_element          # fin de la liste de ddl a considerer pour les elements
739
 #   debut de la liste des grandeurs particulieres a considerer pour les elements, (une liste de string), puis <fin_list_GrandParticuliere_element>
740
 deb_list_GrandParticuliere_element         fin_list_GrandParticuliere_element    # fin des grandeurs particulieres aux elements
741
 #   tableau de grandeurs evoluees  aux elements a visualiser, un par maillage
742
 deb_list_GrandEvoluee_element  fin_list_GrandEvoluee_element 
743
 fin_liste_ddl_ptinteg   # fin des grandeurs aux elements 
744
# informations particuliere dans le cas ou il y a une animation
745
# type_xi indique si oui ou non les grandeurs a tracer sont aux noeuds (sinon cest au elements)
746
# x1 et x2 indiquent les noms des ddls des grandeurs en x et y. accroi_x1 et accroi_x2 indiquent 
747
# si oui ou non x1 et x2 represente laccroissement entre 0 et t de la grandeur ou bien la grandeur elle meme.
748
 debut_info_particulier  grandeur_au_noeud? 1  x1=  NU_DDL x2=  NU_DDL accroi_x1= 0 accroi_x2= 1  fin_info_particulier 
749
# un parametre de pilotage du style de sortie
750
 parametre_style_de_sortie 1
751
# un parametre indiquant si les tenseurs sont en absolue (rep 1) ou suivant un repere ad hoc
752
# (tangent pour les coques, suivant la fibre moyenne pour les element 1D ) 
753
 tenseur_en_absolue_  0
754
 fin_grandeurs_maple  # fin des grandeurs a visualiser au format maple 
755

    
756
 #  ----------------------------- definition des parametres danimation: ---------------- 
757
 debut_animation #  un mot cle de debut de liste (debut_animation)
758
 actif 0   # <0 ou 1> indique si lordre est actif ou non 
759
 #  des parametres avec des valeurs: (sur une meme ligne) 
760
 cycleInterval 8 # cycleInterval  <un reel> (indique le temps en seconde du cycle de lanimation)
761
 fin_animation  #   un mot cle de fin  
762

    
763
 fin_visualisation_maple 
764
 #  =================================================================================
765
 #  ||                          fin de la  visualisation maple                     || 
766
 #  =================================================================================
767
     fin_fichier_commande_visu   # <<<<<<  le mot cle <fin_fichier_commande_visu> permet
768
                                 #  larret de la lecture des commandes, apres ce mot cle, aucune commande nest lu, de plus 
769
                                 #  sans le mot cle de fin de fichier, le fichier nest pas valide  
770
';
771
close(FIC);
772
}
773

    
774

    
775

    
776

    
777

    
778
#----------------
779
#sub qui lit un maillage herezh++ pour recuperer les noeuds, les elements et les listes de references
780
#et les renvoier sous forme de reference (lecture du .her et d un .lis si il existe)
781
#
782
# exemple d appel :
783
#  my ($nom_maillage, $nb_noeuds, $ref_tab_noeuds, $nb_elts, $ref_tab_elements, @ref_listes) = lecture_mail_her("fic_her");
784
#
785
#  avec - $nom_maillage     : nom du maillage (si il y en a un. sinon $nom_maillage sera egal a undef
786
#       - $nb_noeuds        : nombre de noeuds (entier)
787
#       - $ref_tab_noeuds   : reference vers un tableau de noeuds => $ref_tab_noeuds->[no noeud][0] : coordonnee x
788
#                                                                    $ref_tab_noeuds->[no noeud][1] : coordonnee y
789
#                                                                    $ref_tab_noeuds->[no noeud][2] : coordonnee z)
790
#       - $nb_elts          : nombre d elements (entier)
791
#       - $ref_tab_elements : reference vers une table de hashage => $ref_tab_elements->{no elt}{'TYPE'}      : type d element
792
#                                                                    @{$ref_tab_elements->{no elt}{'CONNEX'}} : (liste des noeuds)
793
#       - @ref_listes       : liste de references vers les tables de hashage contenant les listes de references de noeuds, aretes, faces et elements
794
#                             => $ref_listes[0] : reference vers la table de hashage des listes de noeuds  => @{$ref_listes[0]->{'nom liste'}} : (liste des noeuds)
795
#                                $ref_listes[1] : reference vers la table de hashage des listes d aretes   => @{$ref_listes[1]->{'nom liste'}} : (liste des aretes)
796
#                                $ref_listes[2] : reference vers la table de hashage des listes de faces   => @{$ref_listes[2]->{'nom liste'}} : (liste des faces)
797
#                                $ref_listes[3] : reference vers la table de hashage des listes d elements => @{$ref_listes[3]->{'nom liste'}} : (liste des elements)
798
#                                $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)
799
#                                
800
sub lecture_mail_her {
801
  my $fher = shift;
802

    
803
  my $nom_maillage;
804

    
805
  #------------------------
806
  # lecture du maillage .her
807
  #------------------------
808
  #-lecture de noeuds
809
  my @tab_noeuds; my $nb_noeuds;
810
  my $no_noeud = 0;
811
  open(Fher, "<$fher");
812
  while(<Fher>) {
813
    if(/^\s*nom_maillage\s+(\S+)/) {$nom_maillage = $1; next;}
814
    next if(not /(\d+)\s+NOEUDS/);
815
    $nb_noeuds = $1;
816
    last;
817
  }
818
  while(<Fher>) {
819
    last if($no_noeud == $nb_noeuds);
820
    next if(not /^\s*(\d+)\s+(\S+)\s+(\S+)\s+(\S+)\s*$/);
821
    $no_noeud = $1;
822
    @{$tab_noeuds[$no_noeud]} = ($2,$3,$4);
823
  }
824

    
825
  #-lecture des elements
826
  my %tab_elements; my $nb_elts;
827
  my $no_elt = 0;
828
  while(<Fher>) {
829
    next if(not /(\d+)\s+ELEMENTS/);
830
    $nb_elts = $1;
831
    last;
832
  }
833
  while(<Fher>) {
834
    last if($no_elt == $nb_elts);
835
    next if(not /^\s*\d+\s+\w+\s+\w+/);
836
    s/^\s+//;s/\s+$//;
837
    $_ =~ /^(\d+)\s+/;
838
    $no_elt = $1; s/^(\d+)\s+//;
839
    $_ =~ /\s+(\d+(?:\s+\d+)*)$/;
840
    @{$tab_elements{$no_elt}{'CONNEX'}} = split(/\s+/, $1); s/\s+(\d+(?:\s+\d+)*)$//;
841
    $tab_elements{$no_elt}{'TYPE'} = $_; $tab_elements{$no_elt}{'TYPE'} =~ s/\s+/ /g;
842
  }
843
  close(Fher);
844

    
845

    
846
  #------------------------
847
  # lecture des references (dans le .her et dans un eventuel .lis)
848
  #------------------------
849
  my $flis = $fher; $flis =~ s/.her$/.lis/;
850
  my $nom_liste;
851
  my $is_liste_en_cours;
852
  my %listes_NOEUDS;
853
  my %listes_ARETES;
854
  my %listes_FACES;
855
  my %listes_ELEMENTS;
856
  my %listes_PTI;
857

    
858
  #-dans le .her
859
  open(Fher, "<$fher");
860
  $is_liste_en_cours = 0;
861
  while(<Fher>) {
862
    chomp;
863
    if(/^\s*(N\S+)/) {
864
      $nom_liste = $1;
865
      $is_liste_en_cours = 1;
866
      s/^\s*N\S+\s+//; s/\s+$//;
867
      push(@{$listes_NOEUDS{$nom_liste}},split(/\s+/,$_));
868
    }
869
    elsif(/^\s*noeuds/i or /^\s*elements/i or /^\s*[AFEG]/) {
870
      $is_liste_en_cours = 0;
871
    }
872
    elsif($is_liste_en_cours and /^\s*\d+(\s+\d+)*\s*$/i) {
873
      s/^\s+//; s/\s+$//;
874
      push(@{$listes_NOEUDS{$nom_liste}},split(/\s+/,$_));
875
    }
876
  }
877
  close(Fher);
878

    
879
  open(Fher, "<$fher");
880
  $is_liste_en_cours = 0;
881
  while(<Fher>) {
882
    chomp;
883
    if(/^\s*(A\S+)/) {
884
      $nom_liste = $1;
885
      $is_liste_en_cours = 1;
886
      s/^\s*A\S+\s+//; s/\s+$//;
887
      push(@{$listes_ARETES{$nom_liste}},split(/\s+/,$_));
888
    }
889
    elsif(/^\s*noeuds/i or /^\s*elements/i or /^\s*[NFEG]/) {
890
      $is_liste_en_cours = 0;
891
    }
892
    elsif($is_liste_en_cours and /^\s*\d+(\s+\d+)*\s*$/i) {
893
      s/^\s+//; s/\s+$//;
894
      push(@{$listes_ARETES{$nom_liste}},split(/\s+/,$_));
895
    }
896
  }
897
  close(Fher);
898

    
899
  open(Fher, "<$fher");
900
  $is_liste_en_cours = 0;
901
  while(<Fher>) {
902
    chomp;
903
    if(/^\s*(F\S+)/) {
904
      $nom_liste = $1;
905
      $is_liste_en_cours = 1;
906
      s/^\s*F\S+\s+//; s/\s+$//;
907
      push(@{$listes_FACES{$nom_liste}},split(/\s+/,$_));
908
    }
909
    elsif(/^\s*noeuds/i or /^\s*elements/i or /^\s*[NAEG]/) {
910
      $is_liste_en_cours = 0;
911
    }
912
    elsif($is_liste_en_cours and /^\s*\d+(\s+\d+)*\s*$/i) {
913
      s/^\s+//; s/\s+$//;
914
      push(@{$listes_FACES{$nom_liste}},split(/\s+/,$_));
915
    }
916
  }
917
  close(Fher);
918

    
919
  open(Fher, "<$fher");
920
  $is_liste_en_cours = 0;
921
  while(<Fher>) {
922
    chomp;
923
    if(/^\s*(E\S+)/) {
924
      $nom_liste = $1;
925
      $is_liste_en_cours = 1;
926
      s/^\s*E\S+\s+//; s/\s+$//;
927
      push(@{$listes_ELEMENTS{$nom_liste}},split(/\s+/,$_));
928
    }
929
    elsif(/^\s*noeuds/i or /^\s*elements/i or /^\s*[NAFG]/) {
930
      $is_liste_en_cours = 0;
931
    }
932
    elsif($is_liste_en_cours and /^\s*\d+(\s+\d+)*\s*$/i) {
933
      s/^\s+//; s/\s+$//;
934
      push(@{$listes_ELEMENTS{$nom_liste}},split(/\s+/,$_));
935
    }
936
  }
937
  close(Fher);
938

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

    
959

    
960
  #dans le .lis (si il existe)
961
  if(-e $flis) {
962

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

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

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

    
1023
  open(Flis, "<$flis");
1024
  $is_liste_en_cours = 0;
1025
  while(<Flis>) {
1026
    chomp;
1027
    if(/^\s*(E\S+)/) {
1028
      $nom_liste = $1;
1029
      $is_liste_en_cours = 1;
1030
      s/^\s*E\S+\s+//; s/\s+$//;
1031
      push(@{$listes_ELEMENTS{$nom_liste}},split(/\s+/,$_));
1032
    }
1033
    elsif(/^\s*noeuds/i or /^\s*elements/i or /^\s*[NAFG]/) {
1034
      $is_liste_en_cours = 0;
1035
    }
1036
    elsif($is_liste_en_cours and /^\s*\d+(\s+\d+)*\s*$/i) {
1037
      s/^\s+//; s/\s+$//;
1038
      push(@{$listes_ELEMENTS{$nom_liste}},split(/\s+/,$_));
1039
    }
1040
  }
1041
  close(Flis);
1042

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

    
1063
  }#if(-e $flis)
1064

    
1065
  #AFFICHAGE DES LISTES DE NOEUDS
1066
  #foreach my $nom (keys(%listes_NOEUDS)) {
1067
  #  print "$nom : @{$listes_NOEUDS{$nom}}\n";
1068
  #}
1069
  #AFFICHAGE DES LISTES D ARETES
1070
  #foreach my $nom (keys(%listes_ARETES)) {
1071
  #  print "$nom : @{$listes_ARETES{$nom}}\n";
1072
  #}
1073
  #AFFICHAGE DES LISTES DE FACES
1074
  #foreach my $nom (keys(%listes_FACES)) {
1075
  #  print "$nom : @{$listes_FACES{$nom}}\n";
1076
  #}
1077
  #AFFICHAGE DES LISTES D ELEMENTS
1078
  #foreach my $nom (keys(%listes_ELEMENTS)) {
1079
  #  print "$nom : @{$listes_ELEMENTS{$nom}}\n";
1080
  #}
1081
  #AFFICHAGE DES LISTES DE POINTS D INTEGRATION
1082
  #foreach my $nom (keys(%listes_PTI)) {
1083
  #  print "$nom : @{$listes_PTI{$nom}}\n";
1084
  #}
1085

    
1086
  return($nom_maillage, $nb_noeuds, \@tab_noeuds, $nb_elts, \%tab_elements,
1087
         \%listes_NOEUDS, \%listes_ARETES,
1088
         \%listes_FACES, \%listes_ELEMENTS, \%listes_PTI);
1089
}#sub lecture_mail_her
    (1-1/1)
    Redmine Appliance - Powered by TurnKey Linux