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
|