// 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: Met_PiPoCo constitue une boite a outil comme met_abstraite, * * mais ici c'est particulièrement dédié aux poutres, plaques et * * coques, qui nécessitent deux interpolations, une dans le plan ou * * l'axe , et une suivant l'épaisseur. * $ * * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * * * VERIFICATION: * * * * ! date ! auteur ! but ! * * ------------------------------------------------------------ * * ! ! ! ! * * $ * * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * * MODIFICATIONS: * * ! date ! auteur ! but ! * * ------------------------------------------------------------ * * $ * ************************************************************************/ #ifndef MET_PIPOCO_H #define MET_PIPOCO_H #include "Met_abstraite.h" #include "TabOper_T.h" /// @addtogroup groupe_des_metrique /// @{ /// class Met_PiPoCo : public Met_abstraite { public : // CONSTRUCTEUR : // Constructeur par defaut Met_PiPoCo (); // constructeur permettant de dimensionner les variables // dim = dimension de l'espace, nbvec = nombre de vecteur de la base naturelle // tab = liste des variables a initialiser, nomb_noeud: le nombre de noeud Met_PiPoCo (int dim_base,int nbvec,const DdlElement& tabddl, const Tableau & tab,int nomb_noeud); // constructeur de copie Met_PiPoCo (const Met_PiPoCo&); // DESTRUCTEUR : ~Met_PiPoCo (); // METHODES PUBLIQUES : // Surcharge de l'operateur = : realise l'affectation // dérivant de virtuel, a ne pas employer -> message d'erreur Met_abstraite& operator= (const Met_abstraite& met); // normale virtual Met_PiPoCo& operator= (const Met_PiPoCo& met); // ------------------------ calculs ---------------------------------------- // cas explicite à t, toutes les grandeurs sont a 0 ou t // calcul des termes : gijBB_0, gijBB_t, gijHH_t, d_gijBB_t,jacobien_t // gradV_instantane : true : calcul du gradient de vitesse instantannée // premier_calcul : true : cas d'un premier calcul -> toutes les grandeurs sont calculées // false: uniquement les grandeurs à t+dt sont calculées const Met_abstraite::Expli& Cal_explicit_t ( const Tableau& tab_noeud,bool gradV_instantane, Tableau& tabdphi,int nombre_noeud, Tableau& tabphi,bool premier_calcul); // calcul simplifie, a utiliser lorsque l'on se sert des grandeurs // liers a la facette deja calculee, ainsi que la courbure // gradV_instantane : true : calcul du gradient de vitesse instantannée // premier_calcul : true : cas d'un premier calcul -> toutes les grandeurs sont calculées // false: uniquement les grandeurs à t+dt sont calculées const Met_abstraite::Expli& Cal_explicit_simple_t ( const Tableau& tab_noeud,bool gradV_instantane, Tableau& tabdphi,int nombre_noeud, Tableau& tabphi,bool premier_calcul); // cas explicite à tdt, toutes les grandeurs sont a 0 ou tdt // calcul des termes : gijBB_0, gijBB_tdt, gijHH_tdt, d_gijBB_tdt,jacobien_tdt // gradV_instantane : true : calcul du gradient de vitesse instantannée // premier_calcul : true : cas d'un premier calcul -> toutes les grandeurs sont calculées // false: uniquement les grandeurs à t+dt sont calculées const Met_abstraite::Expli_t_tdt& Cal_explicit_tdt ( const Tableau& tab_noeud,bool gradV_instantane, Tableau& tabdphi,int nombre_noeud, Tableau& tabphi,bool premier_calcul); // calcul simplifie, a utiliser lorsque l'on se sert des grandeurs // liers a la facette deja calculee, ainsi que la courbure // gradV_instantane : true : calcul du gradient de vitesse instantannée // premier_calcul : true : cas d'un premier calcul -> toutes les grandeurs sont calculées // false: uniquement les grandeurs à t+dt sont calculées const Met_abstraite::Expli_t_tdt& Cal_explicit_simple_tdt ( const Tableau& tab_noeud,bool gradV_instantane, Tableau& tabdphi,int nombre_noeud, Tableau& tabphi,bool premier_calcul); // cas implicite // calcul des termes de la classe impli // gradV_instantane : true : calcul du gradient de vitesse instantannée // premier_calcul : true : cas d'un premier calcul -> toutes les grandeurs sont calculées // false: uniquement les grandeurs à t+dt sont calculées const Met_abstraite::Impli& Cal_implicit ( const Tableau& tab_noeud,bool gradV_instantane, Tableau& tabdphi,int nombre_noeud, Tableau& tabphi,bool premier_calcul); // calcul simplifie, a utiliser lorsque l'on se sert des grandeurs // liers a la facette deja calculee, ainsi que la courbure et sa variation // gradV_instantane : true : calcul du gradient de vitesse instantannée // premier_calcul : true : cas d'un premier calcul -> toutes les grandeurs sont calculées // false: uniquement les grandeurs à t+dt sont calculées const Met_abstraite::Impli& Cal_implicit_simple ( const Tableau& tab_noeud,bool gradV_instantane, Tableau& tabdphi,int nombre_noeud, Tableau& tabphi,bool premier_calcul); // -------------- remontee aux informations -------------------------- // cas sortie d'infoImp // calcul des termes de la classe InfoImp const Met_abstraite::InfoImp& Cal_InfoImp( const Tableau& tab_noeud, Tableau& tabdphi, Tableau& tabphi, int nombre_noeud); // cas sortie d'infoExp // calcul des termes de la classe InfoExp_t const Met_abstraite::InfoExp_t& Cal_InfoExp_t( const Tableau& tab_noeud, Tableau& tabdphi, Tableau& tabphi, int nombre_noeud); // calcul des termes de la classe InfoExp_tdt const Met_abstraite::InfoExp_tdt& Cal_InfoExp_tdt( const Tableau& tab_noeud, Tableau& tabdphi, Tableau& tabphi, int nombre_noeud); // ------------------------ gestion de la memoire -------------------------- // Ajout d'initialisation de differentes variables : liste dans tab void PlusInitVariables(Tableau& tab) ; // ============================ protege =========================== protected : // METHODES protegees: // calcul des normales a la facette virtual void Calcul_N_0 (); virtual void Calcul_N_t (); virtual void Calcul_N_tdt (); //==calcul des points, arguments identiques a ceux de Met_abstraite // calcul du point a différent temps void Calcul_M0 ( const Tableau& , const Vecteur& phi, int ); void Calcul_Mt ( const Tableau& , const Vecteur& phi, int ); void Calcul_Mtdt ( const Tableau& , const Vecteur& phi, int ); //== les fonctions de calcul de base sont donc redefini // calcul de la base naturel a t0 // pendant le traitement il y a calcul de la base aiB et aiH de la facette plane // la fonction contiend un argument de plus que la routine dans met_abstraite virtual void Calcul_giB_0 ( const Tableau& , const Mat_pleine& , int, const Vecteur& phi); // calcul de la base naturel a t virtual void Calcul_giB_t ( const Tableau& , const Mat_pleine& , int, const Vecteur& phi); // calcul de la base naturel a t+dt virtual void Calcul_giB_tdt ( const Tableau& , const Mat_pleine& , int, const Vecteur& phi); //== calcul de la variation des bases virtual void D_giB_t( const Mat_pleine& , int , const Vecteur & phi); virtual void D_giB_tdt( const Mat_pleine& , int , const Vecteur & phi); //-----------// calcul du tenseur de courbure dans la base naturelle // plusieurs cas sont etudies suivant l'instant considere // a l'instant t = 0 virtual Vecteur& courbure_0 ( const Tableau& tab_noeud) = 0; // a l'instant t virtual Vecteur& courbure_t ( const Tableau& tab_noeud) = 0; // a l'instant t+dt virtual Vecteur& courbure_tdt ( const Tableau& tab_noeud) = 0; //--------------// calcul du tenseur de courbure et de sa variation // plusieurs cas sont etudies suivant l'instant considere // a l'instant t virtual void Dcourbure_t ( const Tableau& tab_noeud,Vecteur& curb,TabOper& dcurb) = 0; // a l'instant tdt virtual void Dcourbure_tdt ( const Tableau& tab_noeud,Vecteur& curb,TabOper& dcurb) = 0; // DONNEES PROTEGEES Tableau Ia; // base absolue // calcul de la courbure et de sa variation eventuelle Vecteur curb_0,curb_t,curb_tdt; TabOper dcurb_t,dcurb_tdt; // calcul de la normale Coordonnee N_0,N_t,N_tdt; //il s'agit ici des infos concernant la partie médiane ( axe ou facette) Coordonnee * P0; // point a t=0 Coordonnee * Pt ; // point a l'instant t Coordonnee * Ptdt; // point a l'instant t+dt BaseB Ia; // la base absolu Tableau * d_Pt ; // derivées au point a l'instant t, par rapport aux ddl Tableau * d_Ptdt; // derivées au point a l'instant t+dt, par rapport aux ddl BaseB * aiB_0 ; // base naturelle a t=0 BaseB * aiB_t ; // base naturelle a t BaseB * aiB_tdt ; // base naturelle a t+dt BaseH * aiH_0; // vecteur de la base duale a 0 BaseH * aiH_t; // vecteur de la base duale a t BaseH * aiH_tdt; // vecteur de la base duale a t+dt TenseurBB * aijBB_0; // composantes de la metrique de la base naturelle a t TenseurBB * aijBB_t; // composantes de la metrique de la base naturelle a t TenseurBB * aijBB_tdt; // composantes de la metrique de la base naturelle a tdt TenseurHH * aijHH_0; // composantes de la metrique de la base duale a t=0 TenseurHH * aijHH_t; // composantes de la metrique de la base duale a t TenseurHH * aijHH_tdt; // composantes de la metrique de la base duale a t+dt double ajacobien_0; // jacobien a l'instant t=0 double ajacobien_t; // jacobien a l'instant t double ajacobien_tdt; // jacobien a l'instant t+dt Tableau * d_aiB_t; // derivees de la base naturelle par rapport // aux degres de liberte a t Tableau * d_aiB_tdt; // derivees de la base naturelle par rapport // aux degres de liberte a t+dt Tableau * d_aiH_t; // derivees de la base duale par rapport // aux degres de liberte a t Tableau * d_aiH_tdt; // derivees de la base duale par rapport // aux degres de liberte a t+dt Tableau d_aijBB_t;// derivees de la metrique de la base naturelle // a t par rapport aux degres de liberte Tableau d_aijBB_tdt;// derivees de la metrique de la base naturelle // a t+dt par rapport aux degres de liberte Tableau d_aijHH_t; // derivees de la metrique de la base duale a t Tableau d_aijHH_tdt; // derivees de la metrique de la base duale a t+dt Vecteur d_ajacobien_t ; // derivees du jacobien par rapport aux degres de liberte // par rapport aux degres de liberte a t Vecteur d_ajacobien_tdt ; // derivees du jacobien par rapport aux degres de liberte // par rapport aux degres de liberte a tdt // fonctions privees // allocation de la memoire void AllocPiPoCo (); // deallocation de la memoire complète, uniquement des grandeurs spécifiques // à Met_PiPoCo void DeAllocPiPoCo(); // uniquement des grandeurs de tib void DeAllocPiPoCo(Tableau& tib); // copie en fonction de l'instance passée // concerne que les grandeurs pointées void Copie_metPiPoCo(const Met_PiPoCo& a); }; /// @} // end of group #endif