

// 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/>.

/************************************************************************
 *     DATE:        23/01/97                                            *
 *                                                                $     *
 *     AUTEUR:      G RIO   (mailto:gerardrio56@free.fr)                *
 *                                                                $     *
 *     PROJET:      Herezh++                                            *
 *                                                                $     *
 ************************************************************************
 *     BUT:    Classe de base de tous les lois de comportement, permet  *
 *             la definition de fonctions generiques dans la class      *
 *             Element.
 *                                                                $     *
 *     ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''     *                                                                      *
 *     VERIFICATION:                                                    *
 *                                                                      *
 *     !  date  !   auteur   !       but                          !     *
 *     ------------------------------------------------------------     *
 *     !        !            !                                    !     *
 *                                                                $     *
 *     ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''     *
 *     MODIFICATIONS:                                                   *
 *     !  date  !   auteur   !       but                          !     *
 *     ------------------------------------------------------------     *
 *                                                                $     *
 ************************************************************************/


#ifndef LOIABSTRAITEGENERAL_H
#define LOIABSTRAITEGENERAL_H


#include "Enum_comp.h"
#include "Tableau_T.h"
#include "UtilLecture.h"
#include "LesCourbes1D.h"
#include "Enum_categorie_loi_comp.h"
#include "LesReferences.h"
#include "Enum_ddl.h"
#include "LesFonctions_nD.h"
#include "Enum_GrandeurGlobale.h"


class LoiAbstraiteGeneral
{

	public :

		// CONSTRUCTEURS :
		// Constructeur par defaut
		LoiAbstraiteGeneral() ;
		
		// Constructeur utile si l'identificateur du nom de la loi
		// de comportement  et la dimension sont connus ainsi que la catégorie de la loi
		// ddl : identificateur donnant le type de degré de liberté 
		//       de base, ou est calculé la loi, par défaut pt integ mécanique : SIG11

		LoiAbstraiteGeneral(Enum_comp id_compor,int dimension,Enum_categorie_loi_comp id_categorie
		                     ,Enum_ddl ddl = SIG11);
		
		// Constructeur utile si l'identificateur du nom de la loi
		// de comportement et la dimension sont connus ainsi que la catégorie de la loi
		LoiAbstraiteGeneral(string nom, int dimension,Enum_categorie_loi_comp id_categorie
		                     ,Enum_ddl ddl = SIG11);

  // Constructeur de copie	
		LoiAbstraiteGeneral(const LoiAbstraiteGeneral& a);
	
		// DESTRUCTEUR :
	
		virtual ~LoiAbstraiteGeneral();
		

		
		
// 1) METHODES NON VIRTUELLES :
		
		void Change_comport(string nouveau_nom) {	id_comp=Id_nom_comp(nouveau_nom); };
		// Remplace le nom de la loi de comportement par nouveau_nom
		// (par l'intermediaire du type enumere associe)
		// ATTENTION : Les modifications liees au changement de la loi de 
		// comportement sont a la charge de l'utilisateur.

		void Change_comport(Enum_comp nouveau_id) { id_comp=nouveau_id;};
		// Remplace l'identificateur de la loi de comportement
		// ATTENTION : Les modifications liees au changement de la loi de 
		// comportement sont a la charge de l'utilisateur.

		// Retourne l'identificateur de la loi de comportement (de type enumere) 
		Enum_comp Id_comport()const {	return id_comp; };
		
		// Retourne le nom de la loi de comportement
		string Nom_comport() const {	return Nom_comp(id_comp); };
		
		// retourne la catégorie de la loi de comportement
		Enum_categorie_loi_comp Id_categorie() {return categorie_loi_comp;};
		// ramène l'identificateur donnant le type de degré de liberté 
		// de base, ou est calculé la loi, par exemple pour une loi mécanique
		// pt d'integ SIG11
		Enum_ddl EnumDdlTypePt() const {return enu_ddl_type_pt;};
		// changement de l'identificateur de type de ddl de base ou est calculé la loi
		void Change_EnumDdlTypePt(Enum_ddl enu) {enu_ddl_type_pt=enu;};

		
// 2) METHODES VIRTUELLES pures public:

	    // Lecture des donnees de la classe sur fichier
		virtual void LectureDonneesParticulieres 
		   (UtilLecture * ,LesCourbes1D& lesCourbes1D
                                             ,LesFonctions_nD& lesFonctionsnD) = 0;
		
        // affichage de la loi
		virtual void Affiche()  const = 0;
		
	 //----- lecture écriture de restart -----
	 // 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)
	 virtual void Lecture_base_info_loi
	     (ifstream& ent,const int cas,LesReferences& lesRef,LesCourbes1D& lesCourbes1D
                                             ,LesFonctions_nD& lesFonctionsnD) = 0;
     // cas donne le niveau de sauvegarde
     // = 1 : on sauvegarde tout
     // = 2 : on sauvegarde uniquement les données variables (supposées comme telles)
	 virtual void Ecriture_base_info_loi(ofstream& sort,const int cas) =0;
         
  // affichage et definition interactive des commandes particulières à chaques lois
  virtual void Info_commande_LoisDeComp(UtilLecture& lec) = 0;

// 2) METHODES VIRTUELLES  public:

		// test si la loi est complete
		// = 1 tout est ok, =0 loi incomplete
		virtual int TestComplet();

		// retourne la dimension de la loi: en général 1 ou 2 ou 3
		// si ramène 4 => valable quelque soit la dimension
		virtual int Dimension_loi() const { return dim;};
		  	
		// modification de l'indicateur de comportement tangent
		virtual void Modif_comp_tangent_simplifie(bool )
		  { // doit être def dans les classes dérivées
		    cout << "erreur, non défini pour cette loi ";
		    Affiche();
		    Sortie(1);
    };

  // test pour connaître l'état du comportement : simplifié ou non
  virtual bool Test_loi_simplife()
		  { // doit être def dans les classes dérivées
		    cout << "erreur, non défini pour cette loi ";
		    Affiche(); Sortie(1); return false; // pour éviter le warning
    };
 
  // indique le type Enum_comp_3D_CP_DP_1D correspondant à une  loi de comportement
  // la fonction est simple dans le cas d'une loi basique, par contre dans le cas
  // d'une loi combinée, la réponse dépend des lois internes donc c'est redéfini
  // dans les classes dérivées
  virtual Enum_comp_3D_CP_DP_1D  Comportement_3D_CP_DP_1D() {return Comp_3D_CP_DP_1D(id_comp);};

	protected :
	
        // ---- donnees protegees		
		Enum_comp id_comp;	// identificateur de la loi de comportement
		int dim ; // dimension de la loi
		Enum_categorie_loi_comp categorie_loi_comp;
		// identificateur donnant le type de degré de liberté 
		// de base, ou est calculé la loi, par exemple pour une loi mécanique
		// pt d'integ SIG11
		Enum_ddl enu_ddl_type_pt;

		// ---- fonctions protégées appelées par les classes dérivées
	 // 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 Lect_base_info_loi
	     (ifstream& ent,const int cas,LesReferences& lesRef,LesCourbes1D& lesCourbes1D
                                             ,LesFonctions_nD& lesFonctionsnD);
     // cas donne le niveau de sauvegarde
     // = 1 : on sauvegarde tout
     // = 2 : on sauvegarde uniquement les données variables (supposées comme telles)
	 void Ecrit_base_info_loi(ofstream& sort,const int cas) const;
	 // change la catégorie de la loi de comportement
		void ChangeCategorie(Enum_categorie_loi_comp new_categorie) 
		    {categorie_loi_comp=new_categorie;};
	    // change la dimension de la loi de comportement
		void Change_dimension(int dime) 
		    {dim=dime;};
  // fonction utilitaire pour lire une grandeur qui dépend d'une fonction
  // si la courbe existe déjà dans LesCourbes1D, ramène un pointeur dessus
  // si la courbe n'exite pas déjà, création indépendamment de LesCourbes (donc via un new)
  // et ramène un pointeur dessus
  Courbe1D * Lecture_courbe(UtilLecture * entreePrinc,LesCourbes1D& lesCourbes1D);
 
};


#endif
