// 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: . #include "Hyper3DN.h" //#include "ComLoi_comp_abstraite.h" # include using namespace std; //introduces namespace std #include #include #include "Sortie.h" Hyper3DN::Hyper3DN () : // Constructeur par defaut HyperDN (RIEN_COMP,RIEN_CATEGORIE_LOI_COMP,3) {}; // Constructeur utile si l'identificateur du nom de la loi // de comportement est connu Hyper3DN::Hyper3DN (Enum_comp id_compor,Enum_categorie_loi_comp categorie_comp) : HyperDN (id_compor,categorie_comp,3) {} ; // Constructeur utile si l'identificateur du nom de la loi // de comportement est connu Hyper3DN::Hyper3DN (char* nom,Enum_categorie_loi_comp categorie_comp) : HyperDN (nom,categorie_comp,3) {} ; // Constructeur de copie Hyper3DN::Hyper3DN (const Hyper3DN& loi) : HyperDN (loi) {}; // =========== METHODES Protégées dérivant de virtuelles : ============== // Calcul des trois invariants et de epsBH, // retour de IdGBH qui pointe sur le bon tenseur Tenseur3BH* Hyper3DN::Invariants (TenseurBB& epsBB_t,TenseurBB& , TenseurHH & gijHH_t, double& jacobien_0,double& jacobien_t, double & Ieps, double & V,double& bIIb,Tenseur3BH & epsBH_t) { const Tenseur3BB & epsBB = *((Tenseur3BB*) &epsBB_t); // passage en dim 3 Tenseur3BH & epsBH = *((Tenseur3BH*) &epsBH_t); // passage en dim 3 const Tenseur3HH & gijHH = *((Tenseur3HH*) &gijHH_t); // passage en dim 3 epsBH = epsBB * gijHH; // deformation en mixte Ieps = epsBH.Trace(); // trace de la déformation Tenseur3BH eps_barreBH = epsBH - (Ieps/3.) * IdBH3; double IIb = eps_barreBH.II()/2.; // double IIIb = eps_barreBH.III()/3.; bIIb = IIb - Ieps*Ieps/6.; V = (jacobien_t/jacobien_0); return & IdBH3; }; // calcul des trois invariants et de leurs variations, de epsBH, // et de sa variation, puis retour de IdGBH qui pointe sur le bon tenseur Tenseur3BH* Hyper3DN::Invariants_et_var (TenseurBB& epsBB_tdt, TenseurBB& ,Tableau & d_gijBB_tdt, TenseurHH & gijHH_tdt,Tableau & d_gijHH_tdt, double& jacobien_0,double& jacobien_tdt,Vecteur& d_jacobien_tdt, double & Ieps,Tableau & dIeps,double & V,Tableau & dV, double& bIIb,Tableau & dbIIb, Tenseur3BH & epsBH_tdt,Tableau & depsBH_tdt) { const Tenseur3BB & epsBB = *((Tenseur3BB*) &epsBB_tdt); // passage en dim 3 Tenseur3BH & epsBH = *((Tenseur3BH*) &epsBH_tdt); // passage en dim 3 const Tenseur3HH & gijHH = *((Tenseur3HH*) &gijHH_tdt); // passage en dim 3 epsBH = epsBB * gijHH; // deformation en mixte Ieps = epsBH.Trace(); // trace de la déformation Tenseur3BH eps_barreBH = epsBH - (Ieps/3.) * IdBH3; double IIb = eps_barreBH.II()/2.; // double IIIb = eps_barreBH.III()/3.; bIIb = IIb - Ieps*Ieps/6.; V = (jacobien_tdt/jacobien_0); // cas les variations par rapport aux degrés de liberté int nbddl = d_gijBB_tdt.Taille(); Tenseur3BH deps_barreBH; // grandeurs intermédiaires for (int i = 1; i<= nbddl; i++) {const Tenseur3HH & dgijHH = *((Tenseur3HH*)(d_gijHH_tdt(i))) ; // pour simplifier l'ecriture const Tenseur3BB & dgijBB = *((Tenseur3BB*)(d_gijBB_tdt(i))); // passage en dim 3 depsBH_tdt(i) = 0.5 * dgijBB * gijHH_tdt + epsBB_tdt * dgijHH; double dIeps_i = (depsBH_tdt(i)).Trace(); dIeps(i) = dIeps_i ; deps_barreBH = depsBH_tdt(i) - (dIeps(i)/3.) * IdBH3; // en mixte les coordonnées de IdBH3 sont fixes dbIIb(i) = 2. * (eps_barreBH * deps_barreBH).Trace() - dIeps_i * Ieps /3. ; dV(i) = (d_jacobien_tdt(i)/jacobien_0) ; }; return & IdBH3; };