// FICHIER : Loi_de_Tait.h // CLASSE : Loi_de_Tait // 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-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 . // // For more information, please consult: . /************************************************************************ * DATE: 16/10/2004 * * $ * * AUTEUR: G RIO (mailto:gerardrio56@free.fr) * * $ * * PROJET: Herezh++ * * $ * ************************************************************************ * BUT: Définition de la loi de Tait en considérant un comportement* * isotrope thermique. * * La loi est utilisable quelque soit la dimension. $ * * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * * * VERIFICATION: * * * * ! date ! auteur ! but ! * * ------------------------------------------------------------ * * ! ! ! ! * * $ * * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * * MODIFICATIONS: * * ! date ! auteur ! but ! * * ------------------------------------------------------------ * * $ * ************************************************************************/ #ifndef LOI_DE_TAIT_H #define LOI_DE_TAIT_H #include "CompThermoPhysiqueAbstraite.h" #include "CristaliniteAbstraite.h" #include "Bloc.h" /* prise en compte de la cristalinité 1) un indicateur dans la loi, qui donne les différents cas: =0 , pas de cristalinité, =1 cristalinité calculé et stockée, mais pas de modification des autres paramètres et calculs de la loi de tait, =2 forme particulière de la loi de tait qui utilise le taux de cristalinité Pour le stockage: 2 classes save_result : celle actuelle et une autre qui dérive et qui contient les éléments du taux taux précédent, taux en cours ?? a voir méthode: retour dans la loi thermoPhysique générale d'une grandeur: on utilise le conteneur ThermoDonnee */ /// @addtogroup Les_lois_concernant_thermique /// @{ /// class Loi_de_Tait : public CompThermoPhysiqueAbstraite { public : // CONSTRUCTEURS : // Constructeur par defaut Loi_de_Tait (); // Constructeur de copie Loi_de_Tait (const Loi_de_Tait& loi) ; // DESTRUCTEUR : ~Loi_de_Tait (); // Lecture des donnees de la classe sur fichier void LectureDonneesParticulieres (UtilLecture * ,LesCourbes1D& lesCourbes1D ,LesFonctions_nD& lesFonctionsnD); // affichage de la loi void Affiche() const ; // test si la loi est complete // = 1 tout est ok, =0 loi incomplete int TestComplet(); //----- 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) void Lecture_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 Ecriture_base_info_loi(ofstream& sort,const int cas); // création d'une loi à l'identique et ramène un pointeur sur la loi créée CompThermoPhysiqueAbstraite* Nouvelle_loi_identique() const { return (new Loi_de_Tait(*this)); }; // affichage et definition interactive des commandes particulières à chaques lois void Info_commande_LoisDeComp(UtilLecture& lec); // initialise les donnees particulieres a l'elements // de matiere traite ( c-a-dire au pt calcule) // Il y a creation d'une instance de SaveResul particuliere // a la loi concernee // la SaveResul classe est remplie par les instances heritantes // le pointeur de SaveResul est sauvegarde au niveau de l'element // c'a-d que les info particulieres au point considere sont stocke // au niveau de l'element et non de la loi. class SaveResul_Loi_de_Tait: public SaveResul { public : // le constructeur par défaut SaveResul_Loi_de_Tait(); // le constructeur courant // sCrista s'il est NULL, on en tient pas compte // s'il est non NULL, on cré l'instances saveCrista par défaut // idem pour stock SaveResul_Loi_de_Tait(CompThermoPhysiqueAbstraite::StockParaInt* stock ,CristaliniteAbstraite::SaveCrista* sCrista); // constructeur de copie SaveResul_Loi_de_Tait(const SaveResul_Loi_de_Tait& sav ); // destructeur ~SaveResul_Loi_de_Tait(); // définition d'une nouvelle instance identique // appelle du constructeur via new SaveResul * Nevez_SaveResul() const {return (new SaveResul_Loi_de_Tait(*this));}; // affectation virtual SaveResul & operator = ( const SaveResul & a); //============= 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); // affichage des infos void Affiche(); //changement de base de toutes les grandeurs internes tensorielles stockées // beta(i,j) represente les coordonnees de la nouvelle base naturelle gpB dans l'ancienne gB // gpB(i) = beta(i,j) * gB(j), i indice de ligne, j indice de colonne // ici il n'y a pas de données tensorielles donc rien n'a faire // gpH(i) = gamma(i,j) * gH(j) virtual void ChBase_des_grandeurs(const Mat_pleine& beta,const Mat_pleine& gamma){}; // procedure permettant de completer éventuellement les données particulières // de la loi stockées // au niveau du point d'intégration par exemple: exemple: un repère d'anisotropie // completer est appelé apres sa creation avec les donnees du bloc transmis // peut etre appeler plusieurs fois SaveResul* Complete_SaveResul(const BlocGen & bloc, const Tableau & tab_coor ,const CompThermoPhysiqueAbstraite* loi) {return NULL;}; // idem sur un ofstream void Affiche(ofstream& sort); // mise à jour des informations transitoires en définitif s'il y a convergence // par exemple (pour la plasticité par exemple) void TdtversT(); void TversTdt(); // données protégées // la liste des données protégées de chaque loi // IMPORTANT: a priori, la classe n'a pas à sauvegarder la pression et la température // ce n'est pas son boulot, mais il est plus facile et économique de sauvegarder ces grandeurs et // d'ensuite calculer les grandeurs spécifiques de la classe Loi_de_Tait, plutôt que de sauve // garder toutes les grandeurs spécifiques de la classe Loi_de_Tait CompThermoPhysiqueAbstraite::StockParaInt * stockParaInt; // pointeurs non nulles que s'il y a de la cristallinité CristaliniteAbstraite::SaveCrista* saveCrista; }; // def d'une instance de données spécifiques, et initialisation SaveResul * New_et_Initialise(); // affichage des donnees particulieres a l'elements // de matiere traite ( c-a-dire au pt calcule) virtual void AfficheDataSpecif(ofstream& sort,SaveResul * a) const { ((SaveResul_Loi_de_Tait*) a)->Affiche(sort);}; // récupération des grandeurs particulière (hors ddl ) // correspondant à liTQ // absolue: indique si oui ou non on sort les tenseurs dans la base absolue ou une base particulière virtual void Grandeur_particuliere(bool absolue,List_io& ,CompThermoPhysiqueAbstraite::SaveResul * ,list&); // récupération de la liste de tous les grandeurs particulières // ces grandeurs sont ajoutées à la liste passées en paramètres // absolue: indique si oui ou non on sort les tenseurs dans la base absolue ou une base particulière virtual void ListeGrandeurs_particulieres(bool absolue,List_io& ) ; //-------- dérivées de virtuelle pures ----------- // ramène les données thermiques défnies au point // P: la pression à l'énuméré temps, et P_t la pression au temps t void Cal_donnees_thermiques(const double& P_t,CompThermoPhysiqueAbstraite::SaveResul * saveTP ,const Deformation & def,const double& P,Enum_dure temps,ThermoDonnee& donneeThermique); protected : // donnée de la loi double alphaT; // coefficient de dilatation linéaire double compressibilite; // compressibilité = inverse du coefficient de compressibilité double lambda ; // conductivité Courbe1D* lambda_temperature; // courbe éventuelle d'évolution de lambda en fonction de la température double cp; // capacité calorifique Courbe1D* cp_temperature; // courbe éventuelle d'évolution de cp en fonction de la température // définition des différents coefficients double b1s,b2s,b3s,b4s; double b1m,b2m,b3m,b4m; double b5,b6,b7,b8,b9; int type_de_calcul; // =0: le plus simple et pas de cristalinité // =1: calcul du taux de cristalinité, mais pas de dépendance des variables de ThermoDonnee // avec la cristalinité // =2: calcul du taux de cristalinité, avec dépendance des variables de ThermoDonnee // cristalinité CristaliniteAbstraite* crista; // pointeur éventuellement sur le calcul de la cristalinité // indicateur bool sortie_post; // indique si oui ou non on réserve des infos pour le post-traitement // méthode interne // remontée aux différentes variables // taux_cris n'est calculé que si crista est non NULL void Calcul_diff_valeurs(const double& pression, double& temp_trans, double & vol_spec); protected : // 3) METHODES VIRTUELLES PURES protegees: // calcul des contraintes à un instant t+deltat // les indices t se rapporte au pas précédent, sans indice au temps actuel // virtual void Calcul_SigmaHH // (TenseurHH & sigHH_t,TenseurBB& DepsBB,DdlElement & tab_ddl // ,TenseurBB & gijBB_t,TenseurHH & gijHH_t,BaseB& giB,BaseH& gi_H,TenseurBB & epsBB // ,TenseurBB & delta_epsBB,TenseurBB & gijBB,TenseurHH & gijHH,Tableau & d_gijBB // ,double& jacobien_0,double& jacobien,TenseurHH & sigHH // ,EnergieMeca & energ,const EnergieMeca & energ_t,double& module_compressibilite,double& module_cisaillement // ,const Met_abstraite::Expli_t_tdt& ex) = 0; // calcul du flux et ses variations par rapport aux ddl a t+dt: stockage dans ptIntegThermi et dans d_flux // calcul également des paramètres thermiques dTP ainsi que des énergies mises en jeux // calcul des énergies thermiques // en entrée: température, gradient de temp, et grandeurs associées, métrique virtual void Calcul_DfluxH_tdt (const double & P_t,PtIntegThermiInterne& ptIntegThermi, const double & P,DdlElement & tab_ddl ,const Deformation & def // prévue pour servir pour l'interpolation , Tableau & d_gradTB,Tableau & d_flux,ThermoDonnee& dTP ,EnergieThermi & energ,const EnergieThermi & energ_t,const Met_abstraite::Impli& ex); }; /// @} // end of group #endif