// 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: Calcul des differentes grandeurs liee a la deformation * * des elements sfe1 * * La classe fonctionne comme une boite a outil. On y choisit ce * * dont on a besoin. Bien faire attention a l'ordre d'appel des * * differentes methodes lorsque il faut suivre une chronologie. * * Cette classe calcul mais ne stock pas. * * $ * * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * * * VERIFICATION: * * * * ! date ! auteur ! but ! * * ------------------------------------------------------------ * * ! ! ! ! * * $ * * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * * MODIFICATIONS: * * ! date ! auteur ! but ! * * ------------------------------------------------------------ * * $ * ************************************************************************/ #ifndef DEFORMATIONSFE1_H #define DEFORMATIONSFE1_H #include "Tableau_T.h" #include "Met_abstraite.h" #include "Deformation.h" #include "Met_Sfe1.h" #include "EnuTypeCL.h" #include "Epai.h" /// @addtogroup groupe_des_deformations /// @{ /// /// BUT: Calcul des differentes grandeurs liee a la deformation /// des elements sfe1 /// La classe fonctionne comme une boite a outil. On y choisit ce /// dont on a besoin. Bien faire attention a l'ordre d'appel des /// differentes methodes lorsque il faut suivre une chronologie. /// Cette classe calcul mais ne stock pas. /// /// /// \author Gérard Rio /// \version 1.0 /// \date 23/01/97 class DeformationSfe1 : public Deformation { public : // CONSTRUCTEURS : DeformationSfe1 () ; // par defaut ne doit pas etre utilise -> message // d'erreur en phase de mise au point // constructeur normal dans le cas d'un ou de plusieurs pt d'integration // tabDphi et tabPhi sont relatifs aux fonctions d'interpolation // la terminaison H est relative aux grandeurs d'épaisseur, S pour la surface DeformationSfe1 (Met_abstraite & ,Tableau& tabnoeud ,Tableau const & tabDphiH,Tableau const & tabPhiH ,Tableau const & tabDphiS,Tableau const & tabPhiS); // constructeur de copie DeformationSfe1 (const DeformationSfe1 &); // DESTRUCTEUR : virtual ~DeformationSfe1 (); // METHODES PUBLIQUES : //------------------------------------------------------------------------------------ // // définition d'une classe conteneur spécifique à chaque point ou la déformation // // est calculée class SaveDefResulSfe1 : public Deformation::SaveDefResul { friend class Deformation ;friend class DeformationSfe1; public : // Constructeurs SaveDefResulSfe1(); // constructeur par défaut-> à ne pas utiliser -> message d'erreur SaveDefResulSfe1(const Met_abstraite& meta); // le constructeur recevable SaveDefResulSfe1(const SaveDefResulSfe1& a); // constructeur de copie ~SaveDefResulSfe1(); // destructeur // surcharge de l'optérateur d'affectation virtual SaveDefResul& operator= (const SaveDefResul& a); // surcharge d'affectation // affichage des infos virtual void Affiche(); // idem sur un ofstream virtual void Affiche(ofstream& sort); //============= 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) virtual 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) virtual void Ecriture_base_info(ofstream& sort,const int cas); // mise à jour des informations transitoires en définitif, ou l'inverse virtual void TdtversT() {meti_a_t = meti_a_tdt;}; virtual void TversTdt() {meti_a_tdt = meti_a_t;}; // mise à jour des grandeurs meti_00 virtual void MiseAJourGrandeurs_a_0(const Met_abstraite * metrique); // mise à jour des grandeurs meti_tdt virtual void MiseAJourGrandeurs_a_tdt(const Met_abstraite * metrique,const TenseurBB& Deps_BB); // il n'y a pas de mise à jour des grandeurs à t, car celles-ci sont mise à jour à l'aide // de la méthode TdtversT !! // lecture des infos des métriques const Deformation::Stmet& Meti_a_00() const {return meti_a_00;} const Deformation::Stmet& Meti_a_t() const {return meti_a_t;} const Deformation::Stmet& Meti_a_tdt() const {return meti_a_tdt;} protected : // VARIABLES PROTEGEES : // ici il s'agit des données de la facette, et dans SaveDefResul on met les infos // correspondant aux métriques dans l'épaisseur // en fait ne sert à rien d'une manière pratique !! si pour les calculs de variation d'épaisseur !!! Deformation::Stmet meti_a_00,meti_a_t,meti_a_tdt; // les infos à 0 à t et à tdt }; // création d'une instance de SaveDefResulSfe1 et initialisation. virtual SaveDefResul * New_et_Initialise() {return (new SaveDefResulSfe1(*metrique));}; // affichage des donnees particulieres a l'elements // de matiere traite ( c-a-dire au pt calcule) virtual void AfficheDataSpecif(ofstream& sort,SaveDefResul * a) const {a->Affiche(sort);}; // met à jour les données spécifiques du point considéré void Mise_a_jour_data_specif(Deformation::SaveDefResul* don) {saveDefResul=don;}; // // fin de définition relatif à la classe conteneur spécifique à chaque point // // ou la déformation est calculée //------------------------------------------------------------------------------------ // ========== changement de grandeurs stockees ========================= // définition du déformation du même type, permet d'utiliser des types dérivée surchargé virtual Deformation * Nevez_deformation(Tableau & tabN) const { DeformationSfe1* def = new DeformationSfe1(*this);def->PointeurTableauNoeud(tabN);return def;} ; // Surcharge de l'operateur = : realise l'affectation // fonction virtuelle inline Deformation& operator= (const Deformation& def) { return (Deformation::operator=(def));}; // on renseigne les conditions limites éventuelles void RenseigneCondLim(const Tableau & arTypeCL,const Tableau & vpla ) {tabTypeCL = &arTypeCL; vplan = &vpla;}; // ==== affichage ==== // affichage des informations virtual void Affiche() const; // ========== calcul des raideurs ========================= // calcul explicit à t : tous les parametres sont des resultats virtual const Met_abstraite::Expli& Cal_explicit_t ( const Tableau & def_equi_t,TenseurBB & epsBB_t,Tableau & d_epsBB ,Tableau & def_equi,TenseurBB& DepsBB,TenseurBB& DeltaEpsBB,bool premier_calcul); // calcul explicit à tdt : tous les parametres sont des resultats virtual const Met_abstraite::Expli_t_tdt& Cal_explicit_tdt (const Tableau & def_equi_t, TenseurBB & epsBB_tdt,Tableau & d_epsBB ,Tableau & def_equi,TenseurBB& DepsBB,TenseurBB& delta_epsBB_tdt,bool premier_calcul); // cas implicite const Met_abstraite::Impli& Cal_implicit (const Tableau & def_equi_t,TenseurBB & epsBB_tdt,Tableau & d_epsBB ,Tableau & def_equi,TenseurBB& DepsBB,TenseurBB& delta_epsBB,bool premier_calcul); // ---------------- calcul des variables primaires autre que pour la mécanique -------- // ------------ donc par de retour relatif aux déformations // calcul explicit à t : tous les parametres sont des resultats virtual const Met_abstraite::Expli& Cal_explicit_t(bool premier_calcul); // calcul explicit à tdt : tous les parametres sont des resultats virtual const Met_abstraite::Expli_t_tdt& Cal_explicit_tdt(bool premier_calcul); // cas implicite const Met_abstraite::Impli& Cal_implicit(bool premier_calcul); // --------------- test sur la courbure ------------------------------ // test si la courbure est anormalement trop grande // inf_normale : indique en entrée le det mini pour la courbure en locale // retour 1: si tout est ok, // 0: une courbure trop grande a été détecté int Test_courbure_anormale(Enum_dure temps,double inf_normale) {return (((Met_Sfe1*) metrique)->Test_courbure_anormale) (temps,inf_normale, *tabnoeud,(*tabDphi)(numInteg_surf),nbNoeud,(*tabPhi)(numInteg_surf)); }; // ========== remontee aux informations ========================= // calcul : // M0 : point d'integration numInteg a t = 0 // Mt ou Mtdt : point d'integration final // Aa0 et Aafin : matrice de passage initiale et finale dans un repere ortho tel que // la nouvelle base Aa est calculee par projection de "Ipa" sur Gi // gijHH et gijBB : metrique finale // Aa(i,a) = Aa^i_{.a}, avec g^i = Aa^i_{.a} * Ip^a // tout ce passe comme si Ip^a est la nouvelle base vers laquelle on veut évoluer // cas sortie d'un calcul implicit virtual const Met_abstraite::InfoImp RemontImp(bool absolue,Mat_pleine& Aa0,Mat_pleine& Aafin); // idem sans le calcul des matrices de passage virtual const Met_abstraite::InfoImp RemontImp(); // cas sortie d'un calcul explicit à t virtual const Met_abstraite::InfoExp_t RemontExp_t(bool absolue,Mat_pleine& Aa0,Mat_pleine& Aafin); // idem sans le calcul des matrices de passage virtual const Met_abstraite::InfoExp_t RemontExp_t(); // cas sortie d'un calcul explicit à tdt virtual const Met_abstraite::InfoExp_tdt RemontExp_tdt(bool absolue,Mat_pleine& Aa0,Mat_pleine& Aafin); // idem sans le calcul des matrices de passage virtual const Met_abstraite::InfoExp_tdt RemontExp_tdt(); // cas sortie d'un calcul à 0, t et tdt virtual const Met_abstraite::Info0_t_tdt Remont0_t_tdt(bool absolue,Mat_pleine& Aa0,Mat_pleine& Aat,Mat_pleine& Aatdt); // idem sans le calcul des matrices de passage virtual const Met_abstraite::Info0_t_tdt Remont0_t_tdt(); // récupération des infos relatives à la courbure pour 0, t et tdt virtual const Met_Sfe1::Courbure_t_tdt& RecupCourbure0_t_tdt()const {return ((Met_Sfe1*) metrique)->RecupCourbure();}; // change le numero d'integration courant virtual void ChangeNumInteg(int ni); // change les numeros d'integration de surface et d'epaisseur courant // nisurf : nouveau point de surface // niepaiss : nouveau point d'epaisseur void ChangeNumIntegSfe1(int nisurf, int niepaiss); // gestion du parcours de tous les points d'integration void PremierPtInteg(); bool DernierPtInteg(); void NevezPtInteg(); // méthode pour revenir au pti précédant virtual void Retour_pti_precedant(); int Nb_pt_int_surf()const {return (tabPhi->Taille());}; int Nb_pt_int_epai()const {return (tabPhiH->Taille());}; // change l'épaisseur stockée, et préparation du stockage si nécessaire void Change_epaisseur(const Epai& epaisse) {*epais=epaisse;}; // calcul de la position dans le repère absolu du point d'intégration virtual const Coordonnee& Position_0() // à t=0 {return ((Met_Sfe1*) metrique)->PointSfe1M_0(*tabnoeud,(*tabPhi)(numInteg_surf) ,(*tabDphi)(numInteg_surf),epais,(*tabPhiH)(numInteg_ep));}; virtual const Coordonnee& Position_t() // à t {return ((Met_Sfe1*) metrique)->PointSfe1M_t(*tabnoeud,(*tabPhi)(numInteg_surf) ,(*tabDphi)(numInteg_surf),epais,(*tabPhiH)(numInteg_ep));}; virtual const Coordonnee& Position_tdt() // à t+dt {return ((Met_Sfe1*) metrique)->PointSfe1M_tdt(*tabnoeud,(*tabPhi)(numInteg_surf) ,(*tabDphi)(numInteg_surf),epais,(*tabPhiH)(numInteg_ep));}; /* // calcul de la variation dans le repère absolu du point d'intégration virtual const Tableau & Der_Pos_t() // à t {return metrique->D_PointM_t(*tabnoeud,(*tabPhi)(numInteg));}; virtual const Tableau & Der_Posi_tdt() // à t+dt {return metrique->D_PointM_tdt(*tabnoeud,(*tabPhi)(numInteg));}; */ // détermination des bases de passages (seules les données en entrées et sortie // sont utilisées ) virtual void BasePassage(bool absolue,const BaseB & giB0,const BaseB & giB,const BaseH & giH0, const BaseH & giH, Mat_pleine& Aa0,Mat_pleine& Aafin); // cas où l'on veut les matrices de passages à 0 t et tdt virtual void BasePassage(bool absolue,const BaseB & giB0,const BaseB & giB_t,const BaseB & giB_tdt ,const BaseH & giH0,const BaseH & giH_t,const BaseH & giH_tdt ,Mat_pleine& Aa0,Mat_pleine& Aa_t,Mat_pleine& Aa_tdt); protected : // VARIABLES PROTEGEES : Tableau const * tabDphiH; // derivees des fonctions d'interpolation suivant H Tableau const * tabPhiH; // les fonctions d'interpolation suivant H // les tableaux tabDphi et tabPhi définis dans la classe mère Deformation, sont utilisés // pour le stockage de l'interpolation suivant l'axe ou le plan. Epai * epais; // != NULL s'il y a des épaisseurs courantes stocké à l'élément et donc // relayées ici, sinon = NULL // information concernant des conditions limites éventuelles, qui ont des répercutions sur // le calcul de la métrique Tableau const * tabTypeCL; // tabTypeCL(i) : si différent de RIEN_TYPE_CL, indique le type de condition // limite de l'arête i Tableau const * vplan; // util pour des conditions de symétrie ou d'encastrement // si tabTypeCL(i) = TANGENTE_CL , alors vplan(i) contient // un vecteur du plan normal à la tangente, // l'arête donne un second vecteur // +++++ des variables qui vont varier au cours du calcul: variables transitoires int numInteg_ep; // numero du point d'integration en cours dans l'epaisseur int numInteg_surf; // numero du point d'integration en cours sur la surface // numInteg de la class mère, est égal à numinteg_surf // méthode pour la gestion d'un changement momentané de pti int sauve_numInteg_ep; /// sauvegarde pour un retour au pti précédant avec la méthode Retour_pti_precedant(); int sauve_numInteg_surf; // +++++ fin des variables qui vont varier au cours du calcul: variables transitoires // METHODES PROTEGEES : // --- méthodes de vérifications ---- // méthode de vérification par différences finies du calcul des différentes dérivées void VerifCal_def(bool gradV_instantane,const Met_abstraite::Impli & ex,TenseurBB& epsBB_tdt ,Tableau & d_epsBB_tdt); void VerifCal_implicit(bool gradV_instantane,const Met_abstraite::Impli & ex); // indicateur utilisé par Verif_par différences finis static int indic_VerifCal_implicitSfe1; }; /// @} // end of group #endif