/*! \file Enum_TypeQuelconque.h
    \brief Définition de l'enuméré pour repérer un type quelconque
*/
// FICHIER : Enum_TypeQuelconque.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/>.


// Afin de realiser un gain en place memoire, les noms des types de grandeurs sont
// stockes a l'aide d'un type enumere. Les fonctions NomTypeQuelconque et Id_nomTypeQuelconque rendent
// possible le lien entre les noms des geometries et les identificateurs
// de type enumere correspondants.


#ifndef ENUMTYPEQUELCONQUE_H
#define ENUMTYPEQUELCONQUE_H
#include <iostream>
using namespace std;
#include <map>
#include "ParaGlob.h"
#include "EnumTypeGrandeur.h"
#include "Enum_dure.h"
#include "Tableau_T.h"

/// @addtogroup Group_types_enumeres
///  @{

/// Définition de l'enuméré pour repérer un type quelconque

enum EnumTypeQuelconque { RIEN_TYPEQUELCONQUE = 1, SIGMA_BARRE_BH_T
                         ,CONTRAINTE_INDIVIDUELLE_A_CHAQUE_LOI_A_T
                         ,CONTRAINTE_INDIVIDUELLE_A_CHAQUE_LOI_A_T_SANS_PROPORTION
                         ,CONTRAINTE_COURANTE,DEFORMATION_COURANTE,VITESSE_DEFORMATION_COURANTE
                         ,ALMANSI,GREEN_LAGRANGE,LOGARITHMIQUE,DELTA_DEF
                         ,ALMANSI_TOTAL,GREEN_LAGRANGE_TOTAL,LOGARITHMIQUE_TOTALE
                         ,DEF_PRINCIPALES,SIGMA_PRINCIPALES,VIT_PRINCIPALES,DEF_DUALE_MISES,DEF_DUALE_MISES_MAXI
                         ,CONTRAINTE_MISES,CONTRAINTE_MISES_T,CONTRAINTE_TRESCA,CONTRAINTE_TRESCA_T
                         ,ERREUR_Q,DEF_PLASTIQUE_CUMULEE
                         ,ERREUR_SIG_RELATIVE
                         ,TEMPERATURE_LOI_THERMO_PHYSIQUE, PRESSION_LOI_THERMO_PHYSIQUE
                         ,TEMPERATURE_TRANSITION, VOLUME_SPECIFIQUE
                         ,FLUXD, GRADT, DGRADT,DELTAGRADT
                         ,COEFF_DILATATION_LINEAIRE, CONDUCTIVITE, CAPACITE_CALORIFIQUE
                         ,MODULE_COMPRESSIBILITE,MODULE_CISAILLEMENT,COEFF_COMPRESSIBILITE
                         ,MODULE_COMPRESSIBILITE_TOTAL,MODULE_CISAILLEMENT_TOTAL
                         ,E_YOUNG,NU_YOUNG,MU_VISCO,MU_VISCO_SPHERIQUE
                         ,MODULE_TANGENT_1D,COMPRESSIBILITE_TANGENTE
                         ,NB_INVERSION,HYPER_CENTRE_HYSTERESIS,SIGMA_REF,Q_SIG_HYST_Oi_A_R,Q_SIG_HYST_R_A_T
                         ,Q_DELTA_SIG_HYST,COS_ALPHA_HYSTERESIS,COS3PHI_SIG_HYSTERESIS,COS3PHI_DELTA_SIG_HYSTERESIS
                         ,FCT_AIDE
                         ,NB_ITER_TOTAL_RESIDU,NB_INCRE_TOTAL_RESIDU,NB_APPEL_FCT,NB_STEP,ERREUR_RK
                         ,PRESSION_HYST_REF,PRESSION_HYST,PRESSION_HYST_REF_M1,PRESSION_HYST_T
								                 ,UN_DDL_ENUM_ETENDUE,ENERGIE_ELASTIQUE_INDIVIDUELLE_A_CHAQUE_LOI_A_T
                         ,ENERGIE_PLASTIQUE_INDIVIDUELLE_A_CHAQUE_LOI_A_T
                         ,ENERGIE_VISQUEUSE_INDIVIDUELLE_A_CHAQUE_LOI_A_T
                         ,PROPORTION_LOI_MELANGE, FONC_PONDERATION
								                 ,POSITION_GEOMETRIQUE,POSITION_GEOMETRIQUE_t,POSITION_GEOMETRIQUE_t0
                         ,CRISTALINITE
                         ,VOLUME_ELEMENT,VOLUME_PTI,EPAISSEUR_MOY_INITIALE, EPAISSEUR_MOY_FINALE
                         ,SECTION_MOY_INITIALE, SECTION_MOY_FINALE
                         ,EPAISSEUR_INITIALE, EPAISSEUR_FINALE,SECTION_INITIALE, SECTION_FINALE
								                 ,VOL_ELEM_AVEC_PLAN_REF,INTEG_SUR_VOLUME,INTEG_SUR_VOLUME_ET_TEMPS
                         ,STATISTIQUE,STATISTIQUE_ET_TEMPS
                         ,ENERGIE_HOURGLASS,PUISSANCE_BULK,ENERGIE_BULK,ENERGIE_STABMEMB_BIEL,FORCE_STABMEMB_BIEL
                         ,TENSEUR_COURBURE, COURBURES_PRINCIPALES, DIRECTIONS_PRINC_COURBURE
                         ,DIRECTIONS_PRINC_SIGMA,DIRECTIONS_PRINC_DEF,DIRECTIONS_PRINC_D
                         ,REPERE_LOCAL_ORTHO, REPERE_LOCAL_H, REPERE_LOCAL_B
                         ,REPERE_D_ANISOTROPIE,EPS_TRANSPORTEE_ANISO,SIGMA_DANS_ANISO
                         ,DELTA_EPS_TRANSPORTEE_ANISO,DELTA_SIGMA_DANS_ANISO
                         ,PARA_ORTHO
                         ,SPHERIQUE_EPS,Q_EPS,COS3PHI_EPS,SPHERIQUE_SIG,Q_SIG,COS3PHI_SIG
								                 ,SPHERIQUE_DEPS,V_vol,Q_DEPS,COS3PHI_DEPS,POTENTIEL,FCT_POTENTIEL_ND
                         ,INVAR_B1,INVAR_B2,INVAR_B3,INVAR_J1,INVAR_J2,INVAR_J3
                         ,DEF_EQUIVALENTE,DEF_EPAISSEUR,D_EPAISSEUR,DEF_LARGEUR,D_LARGEUR
                         ,DEF_MECANIQUE,DEF_ASSO_LOI,DEF_P_DANS_V_A
                         ,SIG_EPAISSEUR,SIG_LARGEUR
                         ,FORCE_GENE_EXT,FORCE_GENE_INT,FORCE_GENE_TOT,RESIDU_GLOBAL
                         ,FORCE_GENE_EXT_t,FORCE_GENE_INT_t
                         ,VECT_PRESSION,PRESSION_SCALAIRE,VECT_FORCE_VOLUM
                         ,VECT_DIR_FIXE,VECT_SURF_SUIV,VECT_HYDRODYNA_Fn,VECT_HYDRODYNA_Ft,VECT_HYDRODYNA_T
                         ,VECT_LINE,VECT_LINE_SUIV,VECT_REAC,VECT_REAC_N
                         ,NN_11,NN_22,NN_33,NN_12,NN_13,NN_23,MM_11,MM_22,MM_33,MM_12,MM_13,MM_23
                         ,DIRECTION_PLI,DIRECTION_PLI_NORMEE,INDIC_CAL_PLIS
                         ,NN_SURF,NN_SURF_t,NN_SURF_t0
                         ,NOEUD_PROJECTILE_EN_CONTACT,NOEUD_FACETTE_EN_CONTACT
                         ,GLISSEMENT_CONTACT,PENETRATION_CONTACT
                         ,GLISSEMENT_CONTACT_T,PENETRATION_CONTACT_T
                         ,FORCE_CONTACT,FORCE_CONTACT_T,CONTACT_NB_PENET
                         ,CONTACT_NB_DECOL,CONTACT_CAS_SOLIDE
                         ,CONTACT_ENERG_PENAL,CONTACT_COLLANT,NUM_ZONE_CONTACT
                         ,CONTACT_ENERG_GLISSE_ELAS,CONTACT_ENERG_GLISSE_PLAS,CONTACT_ENERG_GLISSE_VISQ
                         ,CONTACT_PENALISATION_N,CONTACT_PENALISATION_T
                         ,NORMALE_CONTACT
                         ,TEMPS_CPU_USER,TEMPS_CPU_LOI_COMP,TEMPS_CPU_METRIQUE
                         ,GENERIQUE_UNE_GRANDEUR_GLOBALE
                         ,GENERIQUE_UNE_CONSTANTE_GLOB_INT_UTILISATEUR
                         ,GENERIQUE_UNE_CONSTANTE_GLOB_DOUBLE_UTILISATEUR
                         ,GENERIQUE_UNE_VARIABLE_GLOB_DOUBLE_UTILISATEUR_0
                         ,GENERIQUE_UNE_VARIABLE_GLOB_DOUBLE_UTILISATEUR_T
                         ,GENERIQUE_UNE_VARIABLE_GLOB_DOUBLE_UTILISATEUR_TDT
                         ,DEPLACEMENT, VITESSE
                         ,DELTA_XI,XI_ITER_0,MASSE_RELAX_DYN
                         ,COMP_TORSEUR_REACTION
                         ,NUM_NOEUD,NUM_MAIL_NOEUD,NUM_ELEMENT,NUM_MAIL_ELEM,NUM_PTI
                         ,NUM_FACE,NUM_ARETE
                        };
/// @}  // end of group

//------****-----
// en fonction des ajouts voir pour mettre à jour éventuellement
// EnumTypeQuelconque Equi_Enum_ddl_en_enu_quelconque(Enum_ddl a);
//------****-----

/// @addtogroup Group_types_enumeres
///  @{

/// def de la map qui fait la liaison entre les string et les énumérés

class ClassPourEnumTypeQuelconque
{ public:
  // def de la map qui fait la liaison entre les string et les énumérés 
  static map < string, EnumTypeQuelconque , std::less < string> > map_EnumTypeQuelconque;
  // def de la grandeur statique qui permet de remplir la map
  static ClassPourEnumTypeQuelconque remplir_map;
  // le constructeur qui rempli effectivement la map
  ClassPourEnumTypeQuelconque();
  // indique le type d'expression de la grandeur
  static Tableau < int > tt_GLOB;  // = 1 indique si la grandeur est naturellement exprimé dans le repère globale
                                   // = 0 indique que la grandeur est dans le repère naturelle (ou une combinaison)
  // indique à quel temps la grandeur est calculée
  static Tableau < Enum_dure > tt_TQ_temps;
  // nombre de grandeur énumérée existante
  static int NombreEnumTypeQuelconque() {return tt_GLOB.Taille();};
  };
/// @}  // end of group


// Retourne le nom du type de grandeur a partir de son identificateur de
// type enumere id_TypeQuelconque correspondant
string NomTypeQuelconque (EnumTypeQuelconque id_TypeQuelconque);
// idem mais en version courte (sur quelques caractères)
string NomTypeQuelconque_court (EnumTypeQuelconque id_TypeQuelconque);
// nom générique, lorsqu'il s'agit de composantes
string NomGeneriqueTypeQuelconque(EnumTypeQuelconque id_TypeQuelconque);

// indique si le string correspond à un type quelconque reconnu ou non
bool Existe_typeQuelconque(const string& nom);

// Retourne l'identificateur de type enumere associe au nom du type de grandeur
// nom_TypeQuelconque
EnumTypeQuelconque Id_nomTypeQuelconque (const char* nom_TypeQuelconque);
EnumTypeQuelconque Id_nomTypeQuelconque (const string& nom_TypeQuelconque);

// Retourne le type de grandeur associée au type quelconque
EnumTypeGrandeur Type_de_grandeur_associee(EnumTypeQuelconque typa);
// retourne le temps auquel la grandeur est définie
Enum_dure EnumTypeQuelconqueTemps(EnumTypeQuelconque typa); 
// retour du type d'expression de la grandeur 
// = 1 indique si la grandeur est naturellement exprimé dans le repère globale
// = 0 indique que la grandeur est dans le repère naturelle (ou une combinaison)
int EnumTypeQuelconqueGlobale(EnumTypeQuelconque typa); 
// surcharge de l'operator de lecture
istream & operator >> (istream & entree, EnumTypeQuelconque& a);  
// surcharge de l'operator d'ecriture
ostream & operator << (ostream & sort, const EnumTypeQuelconque& a);

#endif
