// 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: 24/01/2008 * * $ * * AUTEUR: G RIO (mailto:gerardrio56@free.fr) * * $ * * PROJET: Herezh++ * * $ * ************************************************************************ * BUT: Calcul de la constante cinétique à l'aide de la loi * * d'Hoffman. Cette constante est ensuite utilisée pour * * le calcul de la cristalinité à l'aide de la forme de Nakamura.* * la loi de Hoffman2 permet le calcul de K(T,P), puis du taux c * * la loi necessite 9 coefficients * * n,invt012, Ustar,Tinf,Kg,Tm,alphaP,betaP,X_inf * * le calcul de K(T,P) s'effectue alors suivant la formule: * * K(T,P) = (log(2))**(1/n) * invt012 * exp(- Ustar/(R*(Tcorr - Tinf))) * * * exp(- Kg/(Tcorr * (Tm - Tcorr) * f)) * * avec f=2*Tcorr/(Tcorr + Tm) et * * Tcorr = T (en Kelvin) - P*(alphaP + betaP*P) + 273 * * avec les relations: * * DTcorr_Pres = P*(alphaP + betaP*P); * * Tcorr = T - DTcorr_Pres + 273.; * * N0 = exp(N01*(Tm - Tcorr) + N02); * * et: P la pression relative, T la temperature celsius * * R la constante des gaz parfaits * * $ * * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * * VERIFICATION: * * * * ! date ! auteur ! but ! * * ------------------------------------------------------------ * * ! ! ! ! * * $ * * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * * MODIFICATIONS: * * ! date ! auteur ! but ! * * ------------------------------------------------------------ * * $ * ************************************************************************/ #ifndef HOFFMAN2_H #define HOFFMAN2_H #include "UtilLecture.h" #include "LesCourbes1D.h" #include "CristaliniteAbstraite.h" #include "Algo_Integ1D.h" /// @addtogroup Les_lois_concernant_thermique /// @{ /// class Hoffman2 : public CristaliniteAbstraite { public : // CONSTRUCTEURS : // constructeur par défaut Hoffman2(); // constructeur de copie Hoffman2(const Hoffman2& co ); // DESTRUCTEUR : ~Hoffman2() {}; // METHODES PUBLIQUES : // 2) METHODES VIRTUELLES public: // --------- données spécifiques éventuelles de la loi -------------- // initialise les donnees particulieres a l'elements // de matiere traite ( c-a-dire au pt calcule) // Il y a creation d'une instance de SaveCrista particuliere // a la loi concernee // la SaveCrista classe est remplie par les instances heritantes // le pointeur de SaveCrista 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 SaveCrista_Hoffman2: public SaveCrista { public : SaveCrista_Hoffman2(); // le constructeur courant SaveCrista_Hoffman2(const double & I_Kcinetique_t,const double & I_Kcinetique); // constructeur de copie SaveCrista_Hoffman2(const SaveCrista_Hoffman2& sav ); // destructeur ~SaveCrista_Hoffman2() {}; // définition d'une nouvelle instance identique // appelle du constructeur via new SaveCrista * Nevez_SaveCrista() const {return (new SaveCrista_Hoffman2(*this));}; //============= 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(); // 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() {I_Kcinetique_t = I_Kcinetique;}; void TversTdt() {I_Kcinetique = I_Kcinetique_t;}; // Surcharge de l'operateur = SaveCrista& operator= (const SaveCrista& a); // données protégées // c'est l'intégrale de la constante cinétique que l'on sauvegarde double I_Kcinetique_t,I_Kcinetique; }; // def d'une instance de données spécifiques, et initialisation SaveCrista * New_et_Initialise() {return (new SaveCrista_Hoffman2());}; // --------- fin données spécifiques éventuelles de la loi -------------- // Lecture des donnees de la classe sur fichier void LectureDonneesLoiCrista (UtilLecture * entreePrinc,LesCourbes1D& ,LesFonctions_nD&); // affichage de la loi void Affiche() const; // affichage et definition interactive des paramètres void Info_commande_LoisCrista(UtilLecture& entreePrinc); // calcul de la fonction K(T,P) double fct_KT(const double& P, const double& T ) const; // calcul du taux de cristalinité // P_t, P : pression à t et, t+deltat (= actuelle) // T_t, T : température à t et, t+deltat (=actuelle) double Cristalinite(const double& P_t, const double& T_t ,CristaliniteAbstraite::SaveCrista * saveTP ,const double& P, const double& T,Enum_dure temps); // calcul du taux de cristalinité à tdt à partir des grandeurs à tdt // P : pression à t+deltat (= actuelle) // T : température à t+deltat (=actuelle) double Cristalinite (CristaliniteAbstraite::SaveCrista * saveTP,const double& P, const double& T); //----- lecture écriture de restart spécifique aux données de la classe ----- // 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_don_base_info(ifstream& ,const int cas ,LesCourbes1D& ,LesFonctions_nD&) ; // cas donne le niveau de sauvegarde // = 1 : on sauvegarde tout // = 2 : on sauvegarde uniquement les données variables (supposées comme telles) void Ecriture_don_base_info(ofstream& sort,const int cas) const ; private : // VARIABLES PROTEGEES : // coefficients de la loi double n,invt012,Ustar,Tinf,Kg,Tm,alphaP,betaP,X_inf; // classe pour l'intégration Algo_Integ1D* algo_integ; // variable pour passage à la fonction d'intégration fct_KT_ double Te_t,Te_tdt,Pr_t,Pr_tdt; // METHODES PROTEGEES : // calcul de la fonction K(t) en fonction du temps et des variables // définit par ailleurs: Te_t,Te_tdt,Pr_t,Pr_tdt double fct_KT_(const double& t ); }; /// @} // end of group #endif