Projet

Général

Profil

Perl script : viewing Gmsh results produced by Herezh++ » hz_visuGmsh.pl

version 1.00 - Julien Troufflard, 22/09/2025 14:32

 
#!/usr/bin/env perl
use strict;
use English;
use File::Basename;
my $NOM_PROG = basename $PROGRAM_NAME;

my $VERSION = '1.00';
#####################################################################################################
# script pour visualiser un resultat Gmsh (exploitation du repertoire _Gmsh cree par Herezh++) #
# version 1.00 : version initiale #
# (version testee sur : MacOSX Darwin, Linux Xubuntu) #
#####################################################################################################



# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# VARIABLES QUE L UTILISATEUR PEUT ETRE AMENE A RENSEIGNER #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#
# le variable $exeGMSH sert a imposer le choix de l executable Gmsh
# (rq : les alias shell ne fonctionneront pas)
#
#commande gmsh definie par l utilisateur (modifiable egalement avec l option -exeGMSH)
my $exeGMSH = 'gmsh';
#commande gmsh par defaut (quelque soit la plateforme)
# rq : cette variable sera utilisee uniquement si la variable $exeGMSH n a pas ete definie
my $exeGMSH_defaut = 'gmsh';

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# FIN VARIABLES UTILISATEUR #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #



# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# VARIABLES DEVELOPPEUR (NE PAS MODIFIER : RESERVEES AUX DEVELOPPEURS)#
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#pattern d un reel pour les regex
my $format_reel = '[+-]?[\.]?\d+[\.]?\d*(?:[eE][+-]?\d*)?';

#option -merge : liste des extensions de fichier autorisees pour cette option
# IMPORTANT : quand un type de fichier peut prendre plusieurs extensions, on les range toutes
# au sein d une meme chaine de caracteres separees par un ou plusieurs espaces
# (exemple : ".step .stp" pour un fichier STEP)
# (NB : la verification sera insensible a la casse => inutile de mettre des majuscules)
my @EXTENSION_OPT_MERGE = (".geo", ".step .stp");

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# FIN VARIABLES DEVELOPPEUR #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #



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

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

print "----------------------------------------\n";
print " script $NOM_PROG (version $VERSION)\n";
print "----------------------------------------\n";
print "\n";
print "But : visualiser des resultats Herezh Gmsh\n";
print "\n";
print wrap(""," $indent_NOM_PROG ",
"Usage : $NOM_PROG [-h|help] rep_gmsh [nom_isoval1 ... nom_isovalN]\n",
"[-v] [-exeGMSH path_GMSH] [-l] [-tps val_temps] [-factor fact]",
"[-adaptVisu nb_recur] [-line_ini] [-iso_per_step] [-time] [-gris]",
"[-noGrid] [-noLight] [-saveVisu nom_geo] [-quit] [-merge fic]",
"[-line_width val]",
"\n");
print "\n";
print "--------------------------------------------\n";
print "Arguments\n";
print "--------------------------------------------\n";
print " o rep_gmsh : repertoire Gmsh cree par un calcul Herezh++\n";
print " o [nom_isoval1 .. nom_isovalN] : liste des isovaleurs a visualiser\n";
print " (ou \"all\" pour voir toutes les\n";
print " isovaleurs disponibles)\n";
print " **NB : voir rubrique \"Remarques sur le choix des isovaleurs\"\n";
print "\n";
print "--------------------------------------------\n";
print "Fonctionnement\n";
print "--------------------------------------------\n";
print wrap(" ", " ", "$NOM_PROG permet d afficher les resultats Gmsh avec les choix de visualisation suivants :\n");
print " - visualisation des isovaleurs sur le maillage deforme\n";
print " - desactivation du maillage initial\n";
print " - activation du maillage deforme (desactivable avec option -noGrid)\n";
print " - affichage des isovaleurs en mode \"displacement\" (sauf pour\n";
print " les grandeurs de type vecteur)\n";
print " - affichage du dernier increment disponible par defaut\n";
print " (modifiable avec option -tps)\n";
print " - desactivation des vues (View) hors \"deplace\" au lancement\n";
print "\n";
print wrap(" ", " ", " voir egalement rubrique \"Remarques sur le choix des isovaleurs\" pour plus d infos sur le lancement de $NOM_PROG\n");
print "\n";

print "--------------------------------------------\n";
print "Options\n";
print "--------------------------------------------\n";
my $_4espaces = " ";

$_ = $_4espaces.chaine2espaces("-v : ");
print wrap($_4espaces, $_, "-v : affichage du numero de version\n");

print "\n";
$_ = $_4espaces.chaine2espaces("-exeGMSH path_GMSH : ");
print wrap($_4espaces, $_, "-exeGMSH path_GMSH : choisir l executable Gmsh. La visualisation Gmsh se ",
"fera avec l executable path_GMSH\n",
"par defaut : path_GMSH=$exeGMSH_defaut\n",
"(a noter que les alias shell ne fonctionneront pas)\n");

print "\n";
$_ = $_4espaces.chaine2espaces("-l : ");
print wrap($_4espaces, $_, "-l : affichage de la liste des isovaleurs disponibles dans le repertoire Gmsh\n");

print "\n";
$_ = $_4espaces.chaine2espaces("-tps val_temps : ");
print wrap($_4espaces, $_, "-tps val_temps : affichage de l increment le plus proche du temps \"val_temps\"\n",
"(par defaut : le dernier increment)\n",
"(rq : affichage dans le terminal du temps reellement selectionne)\n");
print "\n";
$_ = $_4espaces.chaine2espaces("-factor fact : ");
print wrap($_4espaces, $_, "-factor fact : facteur d amplification de la deformee (par defaut : fact=1)\n");

print "\n";
$_ = $_4espaces.chaine2espaces("-adaptVisu nb_recur : ");
print wrap($_4espaces, $_, "-adaptVisu nb_recur : utiliser l option \"Adapt visualization grid\"",
"avec un nombre de recursion egal a nb_recur (typiquement nb_recur=1 ou 2 devrait suffir)\n");
$_ = $_4espaces.chaine2espaces("**Avertissement : ");
print wrap($_4espaces.$_4espaces, $_4espaces.$_,
"**Avertissement : avec cette option, la transformation pour afficher",
"les isovaleurs sur la deformee n est valide que pour",
"l increment selectionne dans la vue \"deplace\". Donc,",
"quand on utilise cette option, la vue \"deplace\" est activee",
"au demarrage et doit rester active pour que les numeros",
"d increments soient synchrones entre \"deplace\" et l isovaleur",
"que l on souhaite voir sur le maillage deforme\n");

print "\n";
$_ = $_4espaces.chaine2espaces("-line_ini : ");
print wrap($_4espaces, $_, "-line_ini : affichage du maillage initial (seulement les aretes)\n");

print "\n";
$_ = $_4espaces.chaine2espaces("-iso_per_step : ");
print wrap($_4espaces, $_, "-iso_per_step : affichage des isovaleurs en mode \"Per time step\"\n",
"(option : View[...]->General->Range mode->Per time step)\n");

print "\n";
$_ = $_4espaces.chaine2espaces("-time : ");
print wrap($_4espaces, $_, "-time : affichage du temps au lieu du numero d increment\n");

print "\n";
$_ = $_4espaces.chaine2espaces("-gris : ");
print wrap($_4espaces, $_, "-gris : isovaleurs en niveaux de gris de 0 a 255\n");

print "\n";
$_ = $_4espaces.chaine2espaces("-noGrid : ");
print wrap($_4espaces, $_, "-noGrid : desactiver l affichage des lignes des elements\n",
"(option : View[...]->Visibility->Draw elements outlines)\n");

print "\n";
$_ = $_4espaces.chaine2espaces("-noLight : ");
print wrap($_4espaces, $_, "-noLight : desactiver les reflets de lumiere\n(option : color->enable lightning)\n");

print "\n";
$_ = $_4espaces.chaine2espaces("-saveVisu nom_geo : ");
print wrap($_4espaces, $_, "-saveVisu nom_geo : sauvegarder le fichier de visualisation sous le nom nom_geo\n");

print "\n";
$_ = $_4espaces.chaine2espaces("-quit : ");
print wrap($_4espaces, $_, "-quit : executer le script sans lancer la visualisation Gmsh\n");

print "\n";
$_ = $_4espaces.chaine2espaces("-merge nom_fic : ");
print wrap($_4espaces, $_, "-merge nom_fic : inclure un fichier compatible avec gmsh (avec la fonction Merge)\n",
"(pour inclure des fichiers .geo et .msh; cette option peut etre repetee autant de fois que necessaire)\n");

print "\n";
$_ = $_4espaces.chaine2espaces("-line_width val : ");
print wrap($_4espaces, $_, "-line_width val : epaisseur de ligne pour afficher les elements\n",
"(par defaut : val=1)\n");

print "\n";
print "--------------------------------------------\n";
print "Remarques sur le choix des isovaleurs\n";
print "--------------------------------------------\n";
print " 1) un repertoire Gmsh produit par Herezh++ contient des fichiers dont\n";
print " les noms sont, par exemple pour un fichier .info \"mon_calcul.info\" :\n";
print " - mon_calcul_deplace_Gmsh.pos\n";
print " - mon_calcul_EPS11_pti_Gmsh.pos\n";
print " - mon_calcul_contrainte_mises_pti_Gmsh.pos\n";
print " - etc...\n";
print " c est-a-dire des noms de la forme \"mon_calcul_[nom isoval]_Gmsh.pos\"\n";
print "\n";
print " => un nom d isovaleur \"nom_isoval\" est donc la chaine de caracteres\n";
print " situee entre le prefixe \"mon_calcul_\" et le suffixe \"_Gmsh.pos\",\n";
print " y compris les eventuels \"_pti\", \"_ddl_noe\", etc...\n";
print "\n";
print " Exemples : EPS11_pti X1_ddl_noe contrainte_mises_pti\n";
print "\n";
print " 2) la grandeur \"deplace\" doit obligatoirement exister dans le repertoire\n";
print " Gmsh/. Il n y a pas besoin de l indiquer dans la liste.\n";
print "\n";
print " 3) si aucune isovaleur n est demandee => affichage des deplacements\n";
print " (grandeur \"deplace\")\n";
print "\n";
print " 4) l option -l permet de voir la liste des isovaleurs disponibles.\n";
print "\n";
print " 5) si on indique \"all\" a la place d une liste d isovaleurs, toutes les\n";
print " isovaleurs disponibles seront affichees.\n";
print "\n";
print " Exemples :\n";
print " 1) visualiser les isovaleurs de deformation EPS11 et contrainte SIG11 :\n";
print " $NOM_PROG mon_calcul_Gmsh/ EPS11_pti SIG11_pti\n";
print "\n";
print " 2) visualiser toutes les isovaleurs :\n";
print " $NOM_PROG mon_calcul_Gmsh/ all\n";
print "\n";
print "Auteur :\n";
print " TROUFFLARD Julien\n";
print " julien.troufflard\@free.fr\n";
print "----------------------------------------\n";
exit;
}


#------------------------------------
#premier balayage des arguments
# => si option du style -h ou -help => affichage aide
#------------------------------------
my $isOpt_help = 0;
foreach my $arg (@ARGV) {
if(($arg =~ /^-h$/i) or ($arg =~ /^-help$/i)) {
$isOpt_help = 1;
}
}
#si option -h|-help ou pas d arguments => affichage aide
if($isOpt_help or ($#ARGV == -1)) {
affichage_aide();
}

#option -v => affichage de la version et arret
foreach my $arg (@ARGV) {
if($arg eq '-v') {
print "\n $NOM_PROG : version $VERSION\n\n";
exit;
}
}

#------------------------------------
#recuperation des arguments et options
#------------------------------------
my $rep_Gmsh;#repertoire Gmsh
my $is_opt_l = 0;#indicateur de l option -l (affichage de la liste des isovaleurs disponibles pour les fichiers commencant par $racine_fic
my @liste_isoval_demandees = ();#liste des isovaleurs a visualiser
my $temps_requis = -1;#numero de l increment a afficher le plus proche de $temps_requis
#(par defaut le dernier increment, modifiable avec option -tps)
my $incr_temps_requis = -1;#numero de l increment a afficher
my $facteur_ampli = 1.;#facteur d amplification de la deformee (par defaut : 1, modifiable avec option -factor)
my $adaptvizu_high_order = 0;#nombre de recursion pour utiliser l option adaptvisualizationgrid (subdivision pour ameliorer le rendu des isovaleurs des elements d ordre eleve)
my $is_opt_line_ini = 0;#indicateur de l option -line_ini (affichage des aretes du maillage initial)
my $is_opt_iso_per_step = 0;#indicateur de l option -iso_per_step (les echelles des isovaleurs seront "Per time step")
my $is_opt_time = 0;#indicateur de l option -time (affichage du temps au lieu du numero d increment)
my $is_opt_gris = 0;#indicateur de l option -gris (isovaleurs en niveaux de gris de 0 a 255)
my $is_opt_noGrid = 0;#indicateur de l option -noGrid (desactiver l affichage des lignes des elements)
my $is_opt_noLight = 0;#indicateur de l option -noLight (desactiver les reflets de lumiere (color->enable lightning))
my $is_opt_saveVisu = 0;#indicateur de l option -saveVisu (sauvegarder les fichiers de visualisation)
my $opt_saveVisu_nom_geo;#nom du fichier de visu pour l option -saveVisu
my $is_opt_quit = 0;#indicateur de l option -quit (executer le script sans lancer la visualisation Gmsh)
my @opt_merge_fic;#liste des fichiers a inclure via Merge (option -merge)
my $line_width = 1.;#epaisseur de ligne des elements dans les "view" (modifiable avec option -line_width)


my $opt;
my @args;
while($#ARGV != -1) {
$opt = shift(@ARGV);

#option -exeGMSH
if($opt eq '-exeGMSH') {
($#ARGV >= 0) or die "\nErreur (prog:$NOM_PROG,opt:-exeGMSH) : pas assez d arguments donnes pour cette option...\n\n";
$exeGMSH = shift(@ARGV);
}
#option -l
elsif($opt eq "-l") {
$is_opt_l = 1;
}
#option -tps
elsif($opt eq "-tps") {
($#ARGV >= 0) or die "\nErreur (prog:$NOM_PROG,opt:-tps) : pas assez d arguments pour cette option...\n\n";
$temps_requis = shift(@ARGV);
($temps_requis =~ /^$format_reel$/ and $temps_requis >= 0.) or die "\nErreur (prog:$NOM_PROG, opt -tps) : la valeur ($temps_requis) doit etre un reel positif...\n\n";
}
#option -factor
elsif($opt eq "-factor") {
($#ARGV >= 0) or die "\nErreur (prog:$NOM_PROG,opt:-factor) : pas assez d arguments pour cette option...\n\n";
$facteur_ampli = shift(@ARGV);
($facteur_ampli =~ /^$format_reel$/ and $facteur_ampli >= 0.) or die "\nErreur (prog:$NOM_PROG, opt -factor) : la valeur ($facteur_ampli) doit etre un reel positif...\n\n";
}
#option -adaptVisu
elsif($opt eq "-adaptVisu") {
($#ARGV >= 0) or die "\nErreur (prog:$NOM_PROG,opt:-adaptVisu) : pas assez d arguments pour cette option...\n\n";
$adaptvizu_high_order = shift(@ARGV);
($adaptvizu_high_order =~ /^\d+/ and $adaptvizu_high_order >= 0) or die "\nErreur (prog:$NOM_PROG, opt -adaptVisu) : la valeur ($adaptvizu_high_order) doit etre un entier positif...\n\n";
warn "**Attention (prog:$NOM_PROG, opt:-adaptVisu) : voir information sur cette option dans l aide (-h/help)...\n";
}
#option -line_ini
elsif($opt eq "-line_ini") {
$is_opt_line_ini = 1;
}
#option -iso_per_step
elsif($opt eq "-iso_per_step") {
$is_opt_iso_per_step = 1;
}
#option -time
elsif($opt eq "-time") {
$is_opt_time = 1;
}
#option -gris
elsif($opt eq "-gris") {
$is_opt_gris = 1;
}
#option -noGrid
elsif($opt eq "-noGrid") {
$is_opt_noGrid = 1;
}
#option -noLight
elsif($opt eq "-noLight") {
$is_opt_noLight = 1;
}
#option -saveVisu
elsif($opt eq "-saveVisu") {
$is_opt_saveVisu = 1;
($#ARGV >= 0) or die "\nErreur (prog:$NOM_PROG, opt -saveVisu) : pas assez d arguments pour cette option...\n\n";
$opt_saveVisu_nom_geo = shift(@ARGV);
}
#option -quit
elsif($opt eq '-quit') {
$is_opt_quit = 1;
}
#option -merge
elsif($opt eq "-merge") {
($#ARGV >= 0) or die "\nErreur (prog:$NOM_PROG,opt:-merge) : pas assez d arguments pour cette option...\n\n";
my $fic = shift(@ARGV);

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

#verification de la validite de l extension du fichier (doit figurer dans la liste @EXTENSION_OPT_MERGE)
$_ = basename $fic;
/(\.\S+)$/ or die "\nErreur (prog:$NOM_PROG,opt:-merge) : impossible de saisir l extension du fichier $fic (le fichier doit finir par l une des extensions suivantes : @EXTENSION_OPT_MERGE )...\n\n";
my $ext = $1;
$ext =~ tr/A-Z/a-z/;
my $is_ext_ok = 0;
foreach my $extension_autorisee (split(/\s+/, "@EXTENSION_OPT_MERGE")) {
(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
next if($ext ne $extension_autorisee_);
$is_ext_ok = 1;
last;
}
$is_ext_ok or die "\nErreur (prog:$NOM_PROG,opt:-merge) : le fichier $fic 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";

#ajout a la liste des fichiers a merger
push(@opt_merge_fic, $fic);
}
#option -line_width
elsif($opt eq "-line_width") {
($#ARGV >= 0) or die "\nErreur (prog:$NOM_PROG,opt:-line_width) : pas assez d arguments pour cette option...\n\n";
$line_width = shift(@ARGV);
($line_width =~ /^$format_reel$/ and $line_width > 0) or die "\nErreur (prog:$NOM_PROG,opt:-line_width) : epaisseur de ligne ($line_width) doit etre un reel positif...\n\n";
}

#arguments obligatoires
else {
push(@args,$opt);
}
}#while($#ARGV != -1)

($#args > -1) or die "\nErreur (prog:$NOM_PROG) : arguments manquants...\n\n";
$rep_Gmsh = shift(@args);
@liste_isoval_demandees = @args;



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




#---------------------
#verif du repertoire Gmsh
# => il doit contenir au moins la grandeur "deplace", i.e un
# fichier de la forme $rep_Gmsh/[...]_deplace_Gmsh.pos
#
# **NB : on en profite pour saisir la racine du nom des fichiers .pos
# les fichiers .pos ont tous un format tel que :
# [racine_fic][nom_isoval]_Gmsh.pos
#---------------------
#-on saisit la liste des fichiers qui contiendrait le suffixe "deplace_Gmsh.pos"
# normalement, il ne doit y en avoir qu un seul
# => si on en trouve aucun ou plus que 1 => erreur et arret
my @liste_fic_deplace = glob("$rep_Gmsh/*deplace_Gmsh.pos");
($#liste_fic_deplace != -1) or die "\nErreur (prog:$NOM_PROG) : aucun fichier \"deplace_Gmsh.pos\" n a ete trouve dans le repertoire $rep_Gmsh (la presence de ce fichier est obligatoire)...\n\n";
($#liste_fic_deplace < 2) or die "\nErreur (prog:$NOM_PROG) : il ne doit y avoir qu un seul fichier \"deplace_Gmsh.pos\" dans le repertoire $rep_Gmsh. Plusieurs fichiers \"deplace_Gmsh.pos\" ont ete trouves (liste : @liste_fic_deplace)...\n\n";
my $fic_deplace = shift(@liste_fic_deplace);
#racine des fichiers (on la saisit en exploitant le fichier deplace)
my ($racine_fic) = $fic_deplace =~ /(.+)deplace_Gmsh.pos/;





#---------------------
#liste des isovaleurs disponibles pour les fichiers commencant par $racine_fic
#---------------------
my @liste_isoval_disponibles = ();
my @liste_fic = glob("$racine_fic*_Gmsh.pos");
foreach my $fic (@liste_fic) {
$fic =~ /${racine_fic}(\S+)_Gmsh.pos/ or die "\nErreur (prog:$NOM_PROG) : fichier $fic n est pas un fichier de resultats...\n\n";
next if($1 =~ /deplace/);#on ne tient pas compte du fichier "deplace" (il est considere comme present obligatoirement)
push(@liste_isoval_disponibles, $1);
}

#---------------------
#verif de la presence eventuelle de "all" dans les isovaleurs demandees
# (dans ce cas, on prend toutes les isoval de @liste_isoval_disponibles)
#---------------------
foreach my $isoval (@liste_isoval_demandees) {
if($isoval =~ /^all$/) {
@liste_isoval_demandees = @liste_isoval_disponibles;
last;
}
}


#---------------------
#suppression de la grandeur "deplace" dans la liste des isovaleurs demandees
# (si l utilisateur l a indiquee dans la liste, ca va creer un bug
# car cette grandeur aura un traitement special par la suite)
#
# on en profite pour reperer toute isovaleur inconnue et la supprimer de la liste
# => si des isovaleurs demandees n existent pas, on affiche un warning
# avec la liste des isovaleurs inconnues (mais pas d arret du programme)
#---------------------
my @liste_isoval_inconnues;
my @tmp_liste_isoval = @liste_isoval_demandees;
@liste_isoval_demandees = ();
foreach my $isoval (@tmp_liste_isoval) {
#on ne garde pas "deplace"
next if($isoval eq "deplace");

#on regarde si l isovaleur existe
#-- si oui => ajout a la liste definitive
if(" @liste_isoval_disponibles " =~ / $isoval /) {
push(@liste_isoval_demandees, $isoval);
}
#-- si non => ajout a la liste des isoval inconnues
else {
push(@liste_isoval_inconnues, $isoval);
}
}
@tmp_liste_isoval = ();
#affichage warning si des isoval sont inconnues
if($#liste_isoval_inconnues != -1) {
warn "\nAttention (prog:$NOM_PROG) : certaines isovaleurs demandees n ont pas ete trouvees\n";
warn " Liste des isovaleurs inconnues :\n";
warn " - $_\n" for @liste_isoval_inconnues;
warn "\n";
}




#---------------------
#cas de l option -l : affichage des isovaleurs disponibles (et arret du programme)
#---------------------
if($is_opt_l) {
print "\n";
print "--------------------------------\n";
print "liste des isovaleurs disponibles\n";
print "--------------------------------\n";
print "$_\n" for @liste_isoval_disponibles;
print "--------------------------------\n";
print "\n";
exit;
}






#---------------------
#cas de l option -tps : on verifie que le temps demande existe et on recherche le numero d increment le plus proche (par defaut le dernier increment)
#---------------------
if($temps_requis != -1) {
my $incr_lu;
my $temps_lu;
my $alarme_incr_valide;
my $PREC = 1e-5;
my $norme;
my $norme_min = 1e90;
my $incr_norme_min = -1;
my $temps_norme_min = -1;
open(FIC, "<${racine_fic}deplace_Gmsh.pos");
while(<FIC>) {
chomp;
next if(not /^\s*\$\S*Nodedata\s*$/io);
$incr_lu = -1;
$temps_lu = -1;
$alarme_incr_valide = 0;
#lecture du temps
$_ = <FIC>; $_ = <FIC>; $_ = <FIC>; $_ = <FIC>; chomp; s/^\s+//; s/\s+$//; $temps_lu = $_;
#lecture du numero d increment
$_ = <FIC>; $_ = <FIC>; chomp; s/^\s+//; s/\s+$//; $incr_lu = $_;
#verif que l increment est valide (valide si on a la presence du mot-cle $End\S*NodeData)
while(<FIC>) {if(/^\s*\$End\S*Nodedata\s*$/i) {$alarme_incr_valide = 1; last;}}
#on regarde si le temps voulu avec l option -tps est superieur ou egal au temps lu $temps_lu : si oui, on selectionne l increment comme etant celui que l on recherche
if($alarme_incr_valide) {
$norme = abs($temps_requis-$temps_lu);
if($norme < $norme_min) {
$norme_min = $norme;
$incr_norme_min = $incr_lu;
$temps_norme_min = $temps_lu;
}
}#if($alarme_incr_valide)
}#while(<FIC>)
close(FIC);

#on selectionne l increment le plus proche dans $incr_temps_requis
$incr_temps_requis = $incr_norme_min;

#afficahge du temps reel
print "option -tps : temps requies : $temps_requis => temps reel : $temps_norme_min (increment $incr_norme_min)\n";
}#if($temps_requis != -1)


#---------------------
#on ecrit un .geo temporaire dans le repertoire courant qui va "Merge" les fichiers .pos
# et contiendra les divers options Gmsh
#---------------------
my $racine_fic_basename = basename ${racine_fic};
my $fvisu = $racine_fic_basename.rand(999999).'.geo'; while(-e $fvisu) {$fvisu = $racine_fic_basename.rand(999999).'.geo';}
#cas de l option -saveVisu : nom du fichier de visu impose
if($is_opt_saveVisu) {
$fvisu = $opt_saveVisu_nom_geo;
$fvisu .= '.geo' if(not $fvisu =~ /\.geo$/);
}


my $no_view_deplace = $#liste_isoval_demandees + 1;#numero de la vue "deplace" (on la mettra en dernier)

open(Fgeo, ">$fvisu");
print Fgeo "Mesh.NumSubEdges = 10;\n";
print Fgeo "Mesh.Points = 0;\n";
print Fgeo "Mesh.Lines = $is_opt_line_ini;\n";
print Fgeo "Mesh.SurfaceEdges = $is_opt_line_ini;\n";
print Fgeo "Mesh.SurfaceFaces = 0;\n";
print Fgeo "Mesh.VolumeEdges = $is_opt_line_ini;\n";
print Fgeo "Mesh.VolumeFaces = 0;\n";

#les parametres suivants sont generaux a toutes les vues
print Fgeo "View.GeneralizedRaiseView = $no_view_deplace;\n";#numero de la vue pour la transfo (on met $no_view_deplace car "deplace" est en $no_view_deplace)
print Fgeo "View.ShowElement = 1;\n";#affichage des elements en mode deformee
print Fgeo "View.TimeStep = $incr_temps_requis;\n";#visu de l increment $incr_temps_requis (par defaut : $incr_temps_requis = -1)
print Fgeo "View.UseGeneralizedRaise = 1;\n";#activation de la transfo
print Fgeo "View.GeneralizedRaiseFactor = $facteur_ampli;\n";#facteur d amplification de la deformee
print Fgeo "View.VectorType = 5;\n";#affichage des isovaleurs en type "displacement"
#echelle des isovaleurs (par defaut : View[...]->General->Range mode->Default)
# (peut etre modifie avec option -iso_per_step)
if($is_opt_iso_per_step == 0) {
print Fgeo "View.RangeType = 1;\n";#mode par defaut
}
else {
print Fgeo "View.RangeType = 3;\n";#cas de l option -iso_per_step => View[...]->General->Range mode->Per time step
}
print Fgeo "View.Visible = 0;\n";#desactivation des vues au demarrage
#option -time : affichage du temps a la place du no increment
print Fgeo "View.ShowTime = 1;\n" if($is_opt_time);#par defaut : 3
#option -gris : isovaleurs en niveaux de gris
if($is_opt_gris) {
print Fgeo "View.ColorTable = {{0, 0, 0, 255}";
for(my $i=1; $i<=255; $i++) {
print Fgeo ", {$i, $i, $i, 255}";
}
print Fgeo "};\n";
}
#option -noGrid : desactiver l affichage des lignes des elements
if($is_opt_noGrid) {
print Fgeo "View.ShowElement = 0;\n";
}
#option -noLight : desactiver les reflets de lumiere (color->enable lightning)
if($is_opt_noLight) {
print Fgeo "View.Light = 0;\n";
}
#option -line_width : epaisseur de ligne
print Fgeo "View.LineWidth = $line_width;\n";


#on charge toutes les vues (une par fichier .pos, sauf "deplace" qui sera chargee en dernier)
my $fpos;
for(my $i=0; $i<=$#liste_isoval_demandees; $i++) {
my $nom_isoval = $liste_isoval_demandees[$i];
$fpos = "${racine_fic}${nom_isoval}_Gmsh.pos";
print Fgeo "Merge \"$fpos\";\n";
}
#ajout de la vue "deplace" en dernier
$fpos = "${racine_fic}deplace_Gmsh.pos";
print Fgeo "Merge \"$fpos\";\n";



#application de AdaptVisualizationGrid (en cas d option -adaptVisu)
if($adaptvizu_high_order >= 1) {
for(my $i=0; $i<=$#liste_isoval_demandees+1; $i++) {
print Fgeo "View[$i].AdaptVisualizationGrid = 1;\n";
print Fgeo "View[$i].MaxRecursionLevel = $adaptvizu_high_order;\n";
print Fgeo "View[$i].TargetError = -0.0001;\n";
}
}

#modif du cas special : "deplace" (View[0])
# =>pour "deplace", on retranche 1 au facteur d ampli car le fait de l afficher en mode "displacement" applique deja une fois le deplacement
$_ = $facteur_ampli - 1.;
print Fgeo "View[$no_view_deplace].GeneralizedRaiseFactor = $_;\n";#facteur d amplification de la deformee
#-la vue "deplace" sera la seule vue active au lancement de Gmsh
print Fgeo "View[$no_view_deplace].Visible = 1;\n";


#modif du mode de visu pour les resu vectoriels (sauf "deplace")
for(my $i=0; $i<=$#liste_isoval_demandees; $i++) {
my $nom_isoval = $liste_isoval_demandees[$i];

next if($nom_isoval eq 'deplace');#on saute la grandeur "deplace"

#saisie du nombre de composantes dans le .pos dans le 1er $\S*NodeData du fichier
my $is_VECTEUR = 0;#indicateur d une grandeur vectorielle : =0 si pas un vecteur, =1 si 3 composantes i.e un vecteur
open(FIC, "<${racine_fic}${nom_isoval}_Gmsh.pos");
while(<FIC>) {
next if(not /^\s*\$\S*NodeData\b/io);
for(my $i=1; $i<=6; $i++) {$_ = <FIC>;}
$_ = <FIC>; @_ = split;
$is_VECTEUR = 1 if($_[0] eq '3');
last;
}
close(FIC);

#modif des options si c est une grandeur vectorielle
if($is_VECTEUR) {
print Fgeo "View[$i].VectorType = 4;\n";#affichage de type "3D arrow"
print Fgeo "View[$i].ArrowSizeMax = 100;\n";#taille max de fleche \
print Fgeo "View[$i].ArrowSizeMin = 1;\n";#taille min de fleche / ce sont les bornes pour regler la taille des vecteurs les uns par rapport aux autres (selon leur norme)
print Fgeo "View[$i].GlyphLocation = 2;\n";#position des fleche (2= aux sommets i.e aux noeuds)
print Fgeo "View[$i].CenterGlyphs = 0;\n";#alignement (0= Left-aligned i.e la fleche demarre depuis la GlyphLocation)

#on affiche toujours le maillage pour les vecteurs
# meme si il y a une eventuelle option -noGrid
print Fgeo "View[$i].ShowElement = 1;\n";
}
}


#ajout des fichiers a merger (option : -merge)
if($#opt_merge_fic != -1) {
print Fgeo "\n";
print Fgeo "//ajout de fichiers option -merge\n";
foreach my $fic (@opt_merge_fic) {
print Fgeo "Merge \"$fic\";\n";
}
}


close(Fgeo);


#lancement de la visualisation (sauf si l option -quit a ete utilisee)
if($is_opt_quit) {
print "\n($NOM_PROG,opt:-quit) pas de visualisation Gmsh...\n\n";
}
else {
system("$exeGMSH $fvisu");
}


#destruction du fichier de visu (sauf si option -saveVisu)
if($is_opt_saveVisu) {
print "\n($NOM_PROG,opt:-saveVisu) fichier de visualisation $fvisu a ete sauvegarde...\n\n";
}
else {
system("rm -f $fvisu") ;
}




#prend en argument une chaine de caracteres et renvoie
#une chaine de caracteres de meme longueur constituee d espaces
sub chaine2espaces {
my $chaine = shift;
(my $chaine_espaces = $chaine) =~ s/./ /g;
return $chaine_espaces;
}

#cette subroutine verifie l existence d une commande dans $PATH
sub verif_cmd {
my $cmd = shift;

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

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

#cas ou la commande n existe pas
return 0;
}
    (1-1/1)
    Redmine Appliance - Powered by TurnKey Linux