// 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: 04/05/2006 * * $ * * AUTEUR: G RIO (mailto:gerardrio56@free.fr) * * $ * * PROJET: Herezh++ * * $ * ************************************************************************ * BUT: Lois de frottement de coulomb généralisé ou non * * $ * * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * * * VERIFICATION: * * * * ! date ! auteur ! but ! * * ------------------------------------------------------------ * * ! ! ! ! * * $ * * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * * MODIFICATIONS: * * ! date ! auteur ! but ! * * ------------------------------------------------------------ * * $ * ************************************************************************/ // FICHIER : CompFrotCoulomb.h // CLASSE : CompFrotCoulomb #ifndef COMP_FROT_COULOMB_H #define COMP_FROT_COULOMB_H #include "CompFrotAbstraite.h" class CompFrotCoulomb : public CompFrotAbstraite { public : // CONSTRUCTEURS : // Constructeur par defaut CompFrotCoulomb () ; // Constructeur utile si l'identificateur du nom de la loi // de comportement et la dimension sont connus CompFrotCoulomb (Enum_comp id_compor,Enum_categorie_loi_comp categorie_comp,int dimension); // Constructeur utile si l'identificateur du nom de la loi // de comportement et la dimension sont connus CompFrotCoulomb (char* nom,Enum_categorie_loi_comp categorie_comp,int dimension); // Constructeur de copie CompFrotCoulomb (const CompFrotCoulomb & a ); // DESTRUCTEUR VIRTUEL : ~CompFrotCoulomb (); // 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(); // 2) METHODES public: //----- 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 CompFrotAbstraite* Nouvelle_loi_identique() const { return (new CompFrotCoulomb(*this)); }; // affichage et definition interactive des commandes particulières à chaques lois void Info_commande_LoisDeComp(UtilLecture& lec); //-------- dérivées de virtuelle pures ----------- protected : // affichage et definition interactive des commandes particulières à la classe CompFrotCoulomb void Info_commande_don_LoisDeComp(UtilLecture& ) const {}; //----- 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 ,LesReferences& ,LesCourbes1D& ) ; // 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& ,const int ) const ; // VARIABLES PROTEGEES : double mu_statique; // coefficient de coulomb statique double* mu_cine; // coefficient de coulomb cinematique (peut ne pas exister) double* x_c; // coefficient qui permet de contrôler le passage de mu_statique à mu_cine // en fonction de la vitesse int regularisation; // = 0 : pas de régularisation // = 1: régularisation quadratique; = 2: régularisation en tangent hyperbolique // = 3: régularisation par morceau de droite // = 4: régularisation par une fonction donnée par l'utilisateur Courbe1D* fonc_regul; // courbe éventuelle de régularisation (=4) fonction de la vitesse double epsil; // paramètre de contrôle de l'ampleur de la régularisation // 3) METHODES VIRTUELLES PURES protegees: // calcul des efforts de frottement à un instant t+deltat // les indices t se rapporte au pas précédent, sans indice au temps actuel // vit_T : vitesse, force_normale: force normale (à la cible) agissant sur le noeud projectile // force_tangente: force tangente (à la cible) agissant sur le noeud projectile // normale: la normale de contact normée // energie_frottement: l'énergie échangée: élas=la totalité, viqueux et plas= uniquement le pas de temps // delta_t : le pas de temps // F_frot: force de frottement calculé, // retour glisse: indique si oui ou non le noeud glisse bool Calcul_Frottement(const Coordonnee& vit_T, const Coordonnee& normale ,const Coordonnee& force_normale,const Coordonnee& force_tangente ,EnergieMeca& energie_frottement,const double delta_t ,Coordonnee& F_frot) ; // calcul des efforts de frottement à un instant t+deltat // et ses variations par rapport aux ddl de vitesse // vit_T : vitesse, force_normale: force normale (à la cible) agissant sur le noeud projectile // force_tangente: force tangente (à la cible) agissant sur le noeud projectile // energie_frottement: l'énergie échangée: élas=la totalité, viqueux et plas= uniquement le pas de temps // delta_t : le pas de temps // F_frot: force de frottement calculé, // d_F_frot_vit: variation de la force de frottement par rapport aux coordonnées de vitesse // retour glisse: indique si oui ou non le noeud glisse bool Calcul_DFrottement_tdt (const Coordonnee& vit_T, const Coordonnee& normale ,const Coordonnee& force_normale,const Coordonnee& force_tangente ,EnergieMeca& energie_frottement,const double delta_t ,Coordonnee& F_frot,Tableau & d_F_frot_vit) ; }; #endif