// FICHIER : Loi_iso_thermo.h // CLASSE : Loi_iso_thermo // 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: 14/04/2004 * * $ * * AUTEUR: G RIO (mailto:gerardrio56@free.fr) * * $ * * PROJET: Herezh++ * * $ * ************************************************************************ * BUT: Définition d'une loi isotrope thermique simple. * * La loi est utilisable quelque soit la dimension. $ * * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * * * VERIFICATION: * * * * ! date ! auteur ! but ! * * ------------------------------------------------------------ * * ! ! ! ! * * $ * * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * * MODIFICATIONS: * * ! date ! auteur ! but ! * * ------------------------------------------------------------ * * $ * ************************************************************************/ #ifndef LOI_ISO_THERMO_H #define LOI_ISO_THERMO_H #include "CompThermoPhysiqueAbstraite.h" #include "CristaliniteAbstraite.h" /** @defgroup Les_lois_concernant_thermique * * BUT: groupe des lois concernant la thermique * * * \author Gérard Rio * \version 1.0 * \date 14/04/2004 * \brief Définition des lois concernant la thermique * */ /// @addtogroup Les_lois_concernant_thermique /// @{ /// class Loi_iso_thermo : public CompThermoPhysiqueAbstraite { public : // CONSTRUCTEURS : // Constructeur par defaut Loi_iso_thermo (); // Constructeur de copie Loi_iso_thermo (const Loi_iso_thermo& loi) ; // DESTRUCTEUR : ~Loi_iso_thermo (); // 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_iso_thermo(*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_iso_thermo: public SaveResul {public : SaveResul_Loi_iso_thermo(); // constructeur par défaut (a ne pas utiliser) // le constructeur courant SaveResul_Loi_iso_thermo(CompThermoPhysiqueAbstraite::StockParaInt* stock ,CristaliniteAbstraite::SaveCrista* sCrista); // constructeur de copie SaveResul_Loi_iso_thermo(const SaveResul_Loi_iso_thermo& sav ); // destructeur ~SaveResul_Loi_iso_thermo(); // définition d'une nouvelle instance identique // appelle du constructeur via new SaveResul * Nevez_SaveResul() const {return (new SaveResul_Loi_iso_thermo(*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) {}; // 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_iso_thermo, plutôt que de sauve // garder toutes les grandeurs spécifiques de la classe Loi_iso_thermo 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_iso_thermo*) 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 : // calcul du flux et ses variations par rapport aux ddl a t+dt: stockage dans ptIntegThermi et dans d_flux // 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); protected : // donnée de la loi double alphaT; // coefficient de dilatation Courbe1D* alphaT_temperature; // courbe éventuelle d'évolution de alphaT en fonction de la température double compressibilite; // compressibilité Courbe1D* compressibilite_temperature; // courbe éventuelle d'évolution de la compressibilité //en fonction de la température 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 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 private : }; /// @} // end of group #endif