// 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: 25/05/98 * * $ * * AUTEUR: G RIO (mailto:gerardrio56@free.fr) * * $ * * PROJET: Herezh++ * * $ * ************************************************************************ * BUT: Calcul des differentes grandeurs liee a la deformation * * d'élements poutres et plaques classiques. * * Par rapport à la classe Deformation de base, ici on considère * * deux directions : l'épaisseur, et l'axe ou le plan * * dans ces deux directions, il y a des fcts d'interpolation parti- * * culières. * 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 DEFORMATIONPP_H #define DEFORMATIONPP_H #include "Tableau_T.h" #include "Met_abstraite.h" #include "Deformation.h" /// @addtogroup groupe_des_deformations /// @{ /// /// BUT: Calcul des differentes grandeurs liee a la deformation /// d'élements poutres et plaques classiques. /// Par rapport à la classe Deformation de base, ici on considère /// deux directions : l'épaisseur, et l'axe ou le plan /// dans ces deux directions, il y a des fcts d'interpolation parti- /// culières. /// 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 25/05/98 class DeformationPP : public Deformation { public : // CONSTRUCTEURS : DeformationPP () ; // 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 DeformationPP (Met_abstraite & ,Tableau& tabnoeud ,Tableau const & tabDphiH,Tableau const & tabPhiH ,Tableau const & tabDphiS,Tableau const & tabPhiS); // constructeur de copie DeformationPP (const DeformationPP &); // DESTRUCTEUR : virtual ~DeformationPP (); // 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 { DeformationPP* def = new DeformationPP(*this);def->PointeurTableauNoeud(tabN);return def;} ; // METHODES PUBLIQUES : // Surcharge de l'operateur = : realise l'affectation // fonction virtuelle, normalement ne devrait pas être utilisé // si c'est le cas -> affichage d'un message d'erreur Deformation& operator= (const Deformation& def); // fonction normale virtual DeformationPP& operator= (const DeformationPP& def); // ========== changement de grandeurs stockees ========================= // change les numeros d'integration de l'axe ou du plan et d'epaisseur courant // ntotalaxpl : nombre total de pt d'integ de l'axe ou du plan // niaxpl : nouveau point de l'axe ou du plan // niepaiss : nouveau point d'epaisseur // epaisseur : l'epaisseur courante virtual void ChangeNumIntegSH(int niaxpl, int niepaiss); // ========== calcul des raideurs ========================= // calcul explicit à t : tous les parametres sont de resultats 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 de resultats 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,Tableau2 & d2_epsBB_tdt,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 const Met_abstraite::Expli& Cal_explicit_t(bool premier_calcul); // calcul explicit à tdt : tous les parametres sont des resultats const Met_abstraite::Expli_t_tdt& Cal_explicit_tdt(bool premier_calcul); // cas implicite const Met_abstraite::Impli& Cal_implicit(bool premier_calcul); // ========== 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 const Met_abstraite::InfoImp RemontImp(bool absolue,Mat_pleine& Aa0,Mat_pleine& Aafin); // idem sans le calcul des matrices de passage const Met_abstraite::InfoImp RemontImp(); // cas sortie d'un calcul explicit à t const Met_abstraite::InfoExp_t RemontExp_t(bool absolue,Mat_pleine& Aa0,Mat_pleine& Aafin); // idem sans le calcul des matrices de passage const Met_abstraite::InfoExp_t RemontExp_t(); // cas sortie d'un calcul explicit à tdt const Met_abstraite::InfoExp_tdt RemontExp_tdt(bool absolue,Mat_pleine& Aa0,Mat_pleine& Aafin); // idem sans le calcul des matrices de passage const Met_abstraite::InfoExp_tdt RemontExp_tdt(); // gestion du parcours de tous les points d'integration virtual void PremierPtInteg(); virtual bool DernierPtInteg(); virtual void NevezPtInteg(); // méthode virtuelle : détermination des bases de passages // (seules les données en entrées et sortie sont utilisées ) void BasePassage(bool absolue,const BaseB & giB0,const BaseB & giB,const BaseH & giH0, const BaseH & giH, Mat_pleine& Aa0,Mat_pleine& Aafin); 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. // +++++ des variables qui vont varier au cours du calcul: variables transitoires // on les définit en static pour qui n'encombre pas la mémoire, et on les définit // dans la classe pour qui soient accessibles à tous les méthodes static int numInteg_ep; // numero du point d'integration en cours dans l'epaisseur // numInteg défini dans la classe mère représente le numero du point d'integration // en cours sur l'axe ou sur le plan static int nbtotalep; // nombre total de pt integ de epaisseur static int nbtotalaxpl; // nombre total de pt integ de sur l'axe ou sur le plan // nbNoeud défini dans la classe mère, représente le nombre de noeud de l'axe ou du plan // mais pas de l'épaisseur static Vecteur theta_z; // vecteur intermediaire dont l'element 1 = la cote du point courant // +++++ fin des variables qui vont varier au cours du calcul: variables transitoires static Tableau < Mat_pleine const *> taDphi; // derivees des fonctions d'interpolation courantes static Tableau taPhi; // les fonctions d'interpolation courantes // METHODES PROTEGEES : void BasePassage(BaseB & giB0,BaseB & giB,BaseH & giH0,BaseH & giH, Mat_pleine& Aa0,Mat_pleine& Aafin); // applique les conséquences d'un changement de numéro de point d'intégration // par exemple effectué via NevezPtInteg() ou ChangeNumIntegSH void AppliquePtInteg(); }; /// @} // end of group #endif