// 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: 4/06/98 * * $ * * AUTEUR: G RIO (mailto:gerardrio56@free.fr) * * $ * * PROJET: Herezh++ * * $ * ************************************************************************ * BUT: Définir une classe de base pour les plaques et poutres. * * Entre autres, cela permet d'avoir des fonctions et du stockage * * générales. * * $ * * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * * * VERIFICATION: * * * * ! date ! auteur ! but ! * * ------------------------------------------------------------ * * ! ! ! ! * * $ * * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * * MODIFICATIONS: * * ! date ! auteur ! but ! * * ------------------------------------------------------------ * * $ * ************************************************************************/ #ifndef PIPOCO_H #define PIPOCO_H #include "ElemMeca.h" #include "DeformationPP.h" class ConstrucElementbiel; class PiPoCo : public ElemMeca { public : // CONSTRUCTEURS : // Constructeur par defaut fonction eventuellement de numeros d'identification PiPoCo (int num_mail=0,int num_id=-3) : ElemMeca (num_mail,num_id) {}; // Constructeur : un numero de maillage et d'identification et le tableau de connexite des noeuds PiPoCo (int num_mail,int num_id,const Tableau& tab) : ElemMeca (num_mail, num_id, tab) {}; // Constructeur : un numero de maillage, d'identification ,la geometrie ,le type d'interpolation PiPoCo (int num_mail,int num_id,Enum_interpol id_interp_elt,Enum_geom id_geom_elt) : ElemMeca (num_mail,num_id,id_interp_elt,id_geom_elt) {}; // Constructeur idem si-dessus mais des chaines de caractères PiPoCo (int num_mail,int num_id,char* nom_interpol,char* nom_geom) : ElemMeca (num_mail,num_id,nom_interpol,nom_geom) {}; // Constructeur utile quand toutes les donnees de la classe Element sont connues // 1) avec des identificateurs d'énumétation PiPoCo (int num_mail,int num_id,const Tableau& tab,Enum_interpol id_interp_elt, Enum_geom id_geom_elt) : ElemMeca (num_mail,num_id,tab,id_interp_elt,id_geom_elt) {}; // 2) avec des identificateurs = chaines de caractères PiPoCo (int num_mail,int num_id,const Tableau& tab,char* nom_interpol,char* nom_geom) : ElemMeca (num_mail,num_id,tab,nom_interpol,nom_geom) {} ; // Constructeur de copie PiPoCo (const PiPoCo& ps) : ElemMeca (ps) {}; // DESTRUCTEUR : // =========================== methodes publiques =============================== // ramene vrai si la surface numéro ns existe pour l'élément // dans le cas des poutres il n'y a pas de surface bool SurfExiste(int ) const { return false;}; // ramene vrai si l'arête numéro na existe pour l'élément bool AreteExiste(int na) const {if (na==1) return true; else return false;}; // calcul si un point est a l'interieur de l'element ou non // il faut que M est la dimension globale // les trois fonctions sont pour l'etude a t=0, t et tdt // retour : =0 le point est externe, =1 le point est interne , // = 2 le point est sur la frontière à la précision près // coor_locales : s'il est différent de NULL, est affecté des coordonnées locales calculées, // uniquement précises si le point est interne int Interne_0(const Coordonnee& M,Coordonnee* coor_locales=NULL); int Interne_t(const Coordonnee& M,Coordonnee* coor_locales=NULL); int Interne_tdt(const Coordonnee& M,Coordonnee* coor_locales=NULL); //1) methodes virtuelles // définition du nombre maxi de point d'intégration dans l'épaisseur virtual int Nb_pt_int_epai() = 0; // définition du nombre maxi de point d'intégration sur la surface ou // dans l'axe de la poutre virtual int Nb_pt_int_surf() = 0; // récupération de l'épaisseur virtual double H() = 0; // ------- affichage ou récupération d'informations -------------- // retourne un numero d'ordre d'un point le plus près ou est exprimé la grandeur enum // par exemple un point d'intégration, mais n'est utilisable qu'avec des méthodes particulières // par exemple CoordPtInteg, ou Valeur_a_diff_temps // car le numéro d'ordre peut-être différent du numéro d'intégration au sens classique // temps: dit si c'est à 0 ou t ou tdt int PointLePlusPres(Enum_dure temps,Enum_ddl enu, const Coordonnee& M) {// méthode ici à faire, car ici spécifique au fait d'avoir des pt d'integ dans l'épaisseur cout << "\n non implanté , PiPoCo::PointLePlusPres(Enum_dure..."; Sortie(1); return PtLePlusPres(temps,enu,M); }; // recuperation des coordonnées du point de numéro d'ordre iteg pour // la grandeur enu // temps: dit si c'est à 0 ou t ou tdt // si erreur retourne erreur à true Coordonnee CoordPtInteg(Enum_dure temps,Enum_ddl enu,int iteg,bool& erreur) {// méthode ici à faire, car ici spécifique au fait d'avoir des pt d'integ dans l'épaisseur cout << "\n non implanté , PiPoCo::CoordPtInteg(Enum_dure..."; Sortie(1); return CoordPtInt(temps,enu,iteg,erreur); }; // récupération des valeurs au numéro d'ordre = iteg pour // les grandeur enu // absolue: indique si oui ou non on sort les tenseurs dans la base absolue ou une base particulière Tableau Valeur_a_diff_temps(bool absolue,Enum_dure enu_t,const List_io& enu,int iteg) { // méthode ici à faire, car ici spécifique au fait d'avoir des pt d'integ dans l'épaisseur cout << "\n non implanté , PiPoCo::Valeur_a_diff_temps(Enum_dure..."; Sortie(1); return ElemMeca::Valeur_multi(absolue,enu_t,enu,iteg,1); // " }; // récupération des valeurs au numéro d'ordre = iteg pour les grandeurs enu // ici il s'agit de grandeurs tensorielles, le retour s'effectue dans la liste // de conteneurs quelconque associée void ValTensorielle_a_diff_temps(bool absolue,Enum_dure ,List_io& ,int ) { // méthode ici à faire, car ici spécifique au fait d'avoir des pt d'integ dans l'épaisseur cout << "\n non implanté , PiPoCo::ValTensorielle_a_diff_temps(Enum_dure..."; Sortie(1); }; // 2) methodes découlant de virtuelles // --------- calculs utils dans le cadre de la recherche du flambement linéaire // Calcul de la matrice géométrique et initiale ElemMeca::MatGeomInit MatricesGeometrique_Et_Initiale (const ParaAlgoControle & pa); // 3) methodes propres a l'element // les coordonnees des points d'integration dans l'epaisseur virtual double KSIepais(int i) =0; // ========= methodes protégées utilisables par les classes derivees :====================== protected : // 4) non virtuelles // Calcul du residu local et de la raideur locale, pour le schema implicite // cald_Dvirtuelle = indique si l'on doit calculer la dérivée de la vitesse de déformation virtuelle void Cal_implicitPiPoCo (DdlElement & tab_ddl,Tableau & d_epsBB ,Tableau < Tableau2 > d2_epsBB,Tableau & d_sigHH ,int nbintS,Vecteur& poidsS,int nbintH,Vecteur& poidsH ,const ParaAlgoControle & pa,bool cald_Dvirtuelle); // Calcul du residu local a l'instant t ou tdt // atdt = true : calcul à tdt, valeur par défaut // = false: calcul à t void Cal_explicitPiPoCo (DdlElement & tab_ddl,Tableau & d_epsBB,int nbintS ,Vecteur& poidsS,int nbintH,Vecteur& poidsH,const ParaAlgoControle & pa,bool atdt); // Calcul de la matrice géométrique et de la matrice initiale // cette fonction est éventuellement appelée par les classes dérivées // ddl represente les degres de liberte specifiques a l'element // epsBB = deformation, sigHH = contrainte, d_epsbb = variation des def // nbint = nb maxi de pt d'integration , poids = poids d'integration // S pour surface et H pour épaisseur -> nbint et poids // cald_Dvirtuelle = indique si l'on doit calculer la dérivée de la vitesse de déformation virtuelle void Cal_matGeom_InitPiPoCo (Mat_pleine & matGeom, Mat_pleine & matInit,DdlElement & tab_ddl ,Tableau & d_epsBB, Tableau < Tableau2 > d2_epsBB ,Tableau & d_sigHH,int nbintS,Vecteur& poidsS,int nbintH,Vecteur& poidsH ,const ParaAlgoControle & pa,bool cald_Dvirtuelle); private: // pour éviter les modifications par les classes dérivées static TenseurHH * sig_bulk_pourPiPoCo_HH; // variable de travail pour le bulk }; #endif