Herezh_dev/References/LesReferences.h
2023-05-03 17:23:49 +02:00

249 lines
12 KiB
C++

// 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-2022 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/>.
/************************************************************************
* DATE: 23/01/97 *
* $ *
* AUTEUR: G RIO (mailto:gerardrio56@free.fr) *
* $ *
* PROJET: Herezh++ *
* $ *
************************************************************************
* BUT: Gestion des listes de references. *
* $ *
* '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * *
* VERIFICATION: *
* *
* ! date ! auteur ! but ! *
* ------------------------------------------------------------ *
* ! ! ! ! *
* $ *
* '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' *
* MODIFICATIONS: *
* ! date ! auteur ! but ! *
* ------------------------------------------------------------ *
* $ *
************************************************************************/
#ifndef LESREFERENCES_H
#define LESREFERENCES_H
#include "Reference.h"
#include <list>
#include <map>
#include "UtilLecture.h"
#include "MotCle.h"
/// @addtogroup Les_classes_Reference
/// @{
///
/// Gestion des listes de references.
///
/// \author Gérard Rio
/// \version 1.0
/// \date 23/01/97
//-------- une méthode permettant d'utiliser des tableaux de map de références -----
// surcharge de l'operator d'ecriture
ostream & operator << (ostream & sort, const map < string, Reference*, std::less <string> > & );
//----------- fin de la méthode permettant d'utiliser des tableaux de map de références -----
/// @} // end of group
/// @addtogroup Les_classes_Reference
/// @{
///
/// Gestion des listes de references.
///
/// \author Gérard Rio
/// \version 1.0
/// \date 23/01/97
class LesReferences
{
public :
// CONSTRUCTEURS :
LesReferences (); // par defaut
// DESTRUCTEUR :
~LesReferences ();
// METHODES PUBLIQUES :
// def du numero de maillage courant, utilise avant la lecture
void NbMaille(int nb);
// def du type de reference a lire, utilise avant la lecture
// type peut-être : noeud,element,surface,arete
void Indic(string type);
// lecture des references
void Lecture(UtilLecture & entreePrinc);
// ajout d'une référence déjà construite par ailleurs
void Ajout_reference(Reference * refi);
// suppression d'une référence
void SupprimeReference(const string & st1,int num_mail);
// suppression de tous les référence d'un maillage donné
// si avec_diminution_num_maillage = true:
// tous les numéros de maillage, > num_mail, associé aux maillages qui restent
// sont diminués de un, pour tenir compte de la disparition du maillage et donc
// d'une nouvelle numérotation des maillages
// si avec_diminution_num_maillage = false, le conteneur des ref de maillage num_mail
// est vidé, mais il continu à exister: on considère qu'il y a toujours un maillage num_mail potentiel
void Supprime_tour_lesRef_un_maillage(int num_mail, bool avec_diminution_num_maillage);
// affichage des informations contenu dans les references
// par défaut affiche toutes les infos
// si niveau = 1 : affiche que les noms des ref
void Affiche(int niveau=0) const ;
// affichage des informations contenu dans les references d'un certain type
// défini par indic :
// indic = 1 -> noeud, =2 -> element
// =3 -> surface associée à un élément , =4 -> arete associée à un élément
// =5 -> noeud associée à un élément
// =6 -> point d'intégration associée à un élément
// =7 -> de points d'intégrations relatifs à des surfaces d'éléments
// =8 -> de points d'intégrations relatifs à des arete d'éléments
// =0 -> rien_actuellement
// par défaut affiche toutes les infos
// si niveau = 1 : affiche que les noms des ref
void Affiche(int indic, int niveau) const ;
// Affiche les donnees des références pour le maillage imail dans un fichier
// dont le nom est construit à partir du nom du maillage au format ".lis"
void Affiche_dans_lis(const string& nom_maillage,int imail);
// affichage et definition interactive des commandes
// nbMaxiNoeud: nombre maxi de noeud pour les exemples
// nbMaxiElem : nombre maxi d'éléments pour les exemples
// cas : =1 premier passage, il s'agit de références de noeuds uniquement
// cas : =2 second passage, il s'agit de l'ensemble des possibilités de références
void Info_commande_lesRef(int nbMaxiNoeud,int nbMaxiElem,UtilLecture * entreePrinc,int cas);
//--- utilisation d'une boucle pour balayer l'ensemble des références existantes:
// ***** très important: ce balaiyage ne fonctionne que si on ne modifie pas le stockage
// ***** par exemple en supprimant une référence existante ou en ajoutant une nouvelle référence
// ***** ou en lisant des références (donc ajout !!)
// ***** par contre on peut changer le contenu des références existantes
// initialise le questionnement de la récupération de référence et
// retourne la première référence si elle existe sinon un pointeur nul
const Reference* Init_et_Premiere();
// retourne la référence suivante ou, s'il n'y en n'a plus, retourne
// un pointeur nul
const Reference* Reference_suivante();
//--- fin méthode pour faire une boucle pour balayer l'ensemble des références existantes:
// test si la reference existe reellement
// retourne false si n'existe pas , true sinon
bool Existe(const string & st1,int num_mail) const ;
bool Existe(const string & st1,const string* nom_mail) const;
// retourne la reference correspondant a une cle
const Reference& Trouve(const string & st1,int num_mail) const ;
const Reference& Trouve(const string & st1,const string* nom_mail) const ;
// mise à jour de la map qui fait la liaison nom de maillage <=> numéro de maillage
void MiseAJourMap( const map < string, int , std::less <string> >& listNomMail)
{ listeNomMail = & listNomMail;};
// mise à jour des références de noeud, dans le cas où les numéros de noeuds ont changés
//1) cas où l'on supprime éventuellement des noeuds de la référence, qui ne sont plus référencé
// nv_tab est tel que : nv_tab(i) est le nouveau numéro qui avait auparavant le numéro "i"
// non_referencer(i) : = true signifie qu'il ne faut plus tenir compte de ce noeud
// = false indique qu'il continue d'être actif
void Mise_a_jour_ref_noeud(Tableau <int >& nv_tab,int num_mail,Tableau <bool>& non_referencer);
//2) cas où on considère tous les noeuds
// nv_tab est tel que : nv_tab(i) est le nouveau numéro qui avait auparavant le numéro "i"
void Mise_a_jour_ref_noeud(Tableau <int >& nv_tab,int num_mail);
// mise à jour des références d'élément, dans le cas où les numéros d'élément ont changés
//1) cas où l'on supprime éventuellement des éléments de la référence, qui ne sont plus référencé
// nv_tab est tel que : nv_tab(i) est le nouveau numéro qui avait auparavant le numéro "i"
// non_referencer(i) : = true signifie qu'il ne faut plus tenir compte de cet élément
// = false indique qu'il continue d'être actif
void Mise_a_jour_ref_element(Tableau <int >& nv_tab,int num_mail,Tableau <bool>& non_referencer);
// mise à jour du numéro de maillage d'une référence
void Mise_a_jour_num_maillage_ref(const string nom_ref, int old_num_maill, int new_num_maill)
{ Trouve_interne(nom_ref,old_num_maill).Change_Nbmaille(new_num_maill);};
//----- lecture écriture dans base info -----
// cas donne le niveau de la récupération
// = 1 : on récupère tout
// = 2 : on récupère uniquement les données variables (supposées comme telles)
void Lecture_base_info(ifstream& ent,const int cas);
// cas donne le niveau de sauvegarde
// = 1 : on sauvegarde tout
// = 2 : on sauvegarde uniquement les données variables (supposées comme telles)
void Ecriture_base_info(ofstream& sort,const int cas);
protected :
// variable transitoires utilise pendant la lecture
int nbMaille; // nb courant de maillage
int indic ; // type courant de reference : = 1 -> noeud, =2 -> element
// =3 -> surface associée à un élément , =4 -> arete associée à un élément
// =5 -> noeud associée à un élément
// =6 -> point d'intégration associée à un élément
// =7 -> de points d'intégrations relatifs à des surfaces d'éléments
// =8 -> de points d'intégrations relatifs à des arrete d'éléments
// =0 -> rien_actuellement
Reference * ref; // une variable de travail
// VARIABLES PROTEGEES :
// list <Reference*> listeDeRef; // liste des references
// on utilise une map pour récupérer plus rapidemment une référence à partir d'un nom
// t_mapDeRef (i) est la map relative au maillage i
Tableau < map < string, Reference*, std::less <string> > > t_mapDeRef;
// liste des noms de maillages associée à un numéro sous forme d'un arbre pour faciliter la recherche
const map < string, int , std::less <string> >* listeNomMail;
// a utiliser avec Existe et Trouve, mais pas avant la lecture, seulement après
static MotCle motCle; // liste des mots clés
//list <Reference*>::const_iterator iref;
// deux variables intermédiaires pour les méthodes Init_et_Premiere et Reference_suivante
map < string, Reference*, std::less <string> >::const_iterator iref;
int num_mail_presuivant;
// METHODES PROTEGEES :
// lecture d'une reference
bool LectureReference(UtilLecture & entreePrinc);
// retourne la reference correspondant a une cle, en non constant
Reference& Trouve_interne(const string & st1,int num_mail) const ;
Reference& Trouve_interne(const string & st1,const string* nom_mail) const ;
};
/// @} // end of group
#endif