Herezh_dev/Util/Handler_exception.cc

138 lines
6 KiB
C++
Raw Normal View History

#include "Handler_exception.h"
// This file is part of the Herezh++ application.
//
// The finite element software Herezh++ is dedicated to the field
// of mechanics for large transformations of solid structures.
// It is developed by Gérard Rio (APP: IDDN.FR.010.0106078.000.R.P.2006.035.20600)
// INSTITUT DE RECHERCHE DUPUY DE LÔME (IRDL) <https://www.irdl.fr/>.
//
// Herezh++ is distributed under GPL 3 license ou ultérieure.
//
// Copyright (C) 1997-2021 Université Bretagne Sud (France)
// AUTHOR : Gérard Rio
// E-MAIL : gerardrio56@free.fr
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License,
// or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
//
// For more information, please consult: <https://herezh.irdl.fr/>.
#include "CharUtil.h"
#include "ParaGlob.h"
#include "ParaAlgoControle.h"
// méthode utilitaire, utilisable par les classes dérivées, permettant d'agir si un controle-c est émis
// où une autre interruption générée par un kill
// intervient sur des paramètres stockés dans ParaAlgoControle, qui sont actuellement actif (accessible via ParaGlob)
// c'est donc via ces paramètres que les autres programmes peuvent récupérer les infos et agir
// en conséquence éventuellement
void Handler_signal(int theSignal)
{
// cout << "\n Je receptionne le signal " << theSignal << endl ;
// cout << "\n tappez sur quelque chose pour continuer ";
// string toto;
// cin >> toto;
// // dans le cas d'un controle c on génère une exception
// // qui est reprise par herezh.c
if (theSignal == SIGINT )
{ Sortie(0); // *** test
// sauvegarde de l'etat actuel dans le .BI
// et également le .PI !! ce qui est bigrement utile pour la reprise sur des gros calculs
// on modifie les paramètres dans ParaAlgoControle
ParaGlob::param->ParaAlgoContActifs().ChangeSortieEtatActuelDansBI(true);
ParaGlob::param->ParaAlgoContActifs().ChangeSortieEquilibreGlobal(true);
// ErrSortieFinale toto;
cout << "\n Je receptionne le signal " << theSignal << endl ;
cout << "\n tappez sur quelque chose pour continuer ";
// throw (toto);
}
else // les autres cas
{ //On va proposer un menu
string rep=" ";
cout << "\n --- definition des parametres de controle ------ ";
while ((Minuscules(rep) != "f")&&(Minuscules(rep) != "0"))
{// on met une boucle de surveillance pour l'interactif au cas où
try
{
cout << "\n choix : "
<< "\n (0 ou f) (defaut) fin immediate d'execution "
<< "\n (1 ou c) continue l'execution "
<< "\n (2) lecture de donnees secondaire dans le .info"
<< "\n (3) sortie de la recherche d'equilibre global "
<< "\n (4) sauvegarde de l'etat actuel dans le .BI "
<< "\n (5) sauvegarde post-traitement (CVisu) actuel"
<< "\n (6) affiche nom grandeurs actuelles accessibles globalement "
<< "\n (7) modification d'une constante globale utilisateur "
<< "\n ";
int nb_choix=7; // maxi du num de choix actuel
rep = lect_return_defaut(false,"f");
if ((Minuscules(rep) == "f") || (Minuscules(rep) == "0"))// sortie directe
Sortie(0);
if ((Minuscules(rep) == "c") || (Minuscules(rep) == "1"))// sortie directe
return;
int num = ChangeEntier(rep);
if (!((num >= 0)&&(num<=nb_choix)))
{ cout << "\n Erreur on attendait un entier entre 0 et "<<nb_choix<<" !!, "
<< "\n redonnez une bonne valeur"
<< "\n ou taper f ou 0 pour arreter le programme";
};
switch (num)
{ case 0: // sortie
{ Sortie(0);break;} // normalement cela a déjà été filtré avant
case 1: // on continue l'exécution
{ return;break;
}
case 2: // lecture de donnees secondaire dans le .info
{ // on modifie les paramètres dans ParaAlgoControle
ParaGlob::param->ChangeDemandeLectureSecondaireInPointInfo(1);
break;
}
case 3: // sortie d'une boucle d'iteration d'equilibre global
{ // on modifie les paramètres dans ParaAlgoControle
ParaGlob::param->ParaAlgoContActifs().ChangeSortieEquilibreGlobal(true);
break;
}
case 4: // sauvegarde de l'etat actuel dans le .BI
{ // on modifie les paramètres dans ParaAlgoControle
ParaGlob::param->ParaAlgoContActifs().ChangeSortieEtatActuelDansBI(true);
break;
}
case 5: // sauvegarde de l'etat actuel dans le .BI
{ // on modifie les paramètres dans ParaAlgoControle
ParaGlob::param->ParaAlgoContActifs().ChangeSortieEtatActuelDansCVisu(true);
break;
}
case 6: // affichage des grandeurs actuelles accessibles globalement
{ // on affiche directement
ParaGlob::param->Affiche_GrandeurGlobal(cout);
break;
}
case 7: // modification d'une constante globale utilisateur
{ ParaGlob::param->Modif_interactive_constante_utilisateur();
break;
}
};
}
catch ( ... )
{ cout << "\n *** erreur inconnue, on continue " << endl;
};
};
};
};