// 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) .
//
// 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 .
//
// For more information, please consult: .
/************************************************************************
* 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