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
|