// 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 "HyperDN.h" // Constructeur par defaut template HyperDN::HyperDN () : Loi_comp_abstraite() {} // Constructeur utile si l'identificateur du nom de la loi // de comportement et la dimension sont connus template HyperDN ::HyperDN (Enum_comp id_compor,Enum_categorie_loi_comp categorie_comp,int dimension) : Loi_comp_abstraite(id_compor,categorie_comp,dimension) {} // Constructeur utile si l'identificateur du nom de la loi // de comportement et la dimension sont connus template HyperDN ::HyperDN (char* nom,Enum_categorie_loi_comp categorie_comp,int dimension) : Loi_comp_abstraite(nom,categorie_comp,dimension) {} // DESTRUCTEUR : template HyperDN ::~HyperDN () {} // constructeur de copie template HyperDN ::HyperDN (const HyperDN & a) : Loi_comp_abstraite (a) {} // ========== codage des METHODES VIRTUELLES protegees:================ // calcul des contraintes a tdt template void HyperDN ::Calcul_SigmaHH (TenseurHH& ,TenseurBB& ,DdlElement & tab_ddl, TenseurBB & ,TenseurHH & ,BaseB& ,BaseH& ,TenseurBB & epsBB_,TenseurBB & , TenseurBB & gijBB_,TenseurHH & gijHH_,Tableau & d_gijBB_, double& jacobien_0,double& jacobien_,TenseurHH & sigHH ,EnergieMeca & energ,const EnergieMeca & energ_t,double& module_compressibilite,double& module_cisaillement ,const Met_abstraite::Expli_t_tdt& ) { #ifdef MISE_AU_POINT if (tab_ddl.NbDdl() != d_gijBB_.Taille()) { cout << "\nErreur : le nb de ddl est != de la taille de d_gijBB_ !\n"; cout << " HyperDN::Calcul_SigmaHH\n"; Sortie(1); }; #endif TensBH epsBH; // la déformation en mixte TensBH * IdGBH; // l'identitée double alpha_0,alpha_1,alpha_2; // coefficients pour le calcul de la loi de comportement // Calcul des 3 invariants , de epsBH, // retour de IdGBH qui pointe sur le bon tenseur double Ieps,V,bIIb; IdGBH = Invariants (epsBB_,gijBB_,gijHH_,jacobien_0,jacobien_,Ieps,V,bIIb,epsBH); // calcul du potentiel et de ses dérivées premières double E,EV,EbIIb,EIeps; // potentiel et dérivées Potentiel(jacobien_0,Ieps,V,bIIb,E,EV,EbIIb,EIeps); // calcul des alphas Alpha(E,EV,EbIIb,EIeps,jacobien_0,Ieps,V,bIIb,alpha_0,alpha_1,alpha_2); // calcul des contraintes finales TensBH sigBH = alpha_0 * (*IdGBH) + alpha_1 * epsBH + alpha_2 * (epsBH * epsBH); sigHH = gijHH_ * sigBH; // en deux fois contravariants } // calcul des contraintes et de ses variations a t+dt template void HyperDN ::Calcul_DsigmaHH_tdt (TenseurHH& ,TenseurBB& ,DdlElement & tab_ddl ,BaseB& ,TenseurBB & ,TenseurHH & , BaseB& ,Tableau & ,BaseH& ,Tableau & , TenseurBB & epsBB_tdt,Tableau & d_epsBB, TenseurBB & ,TenseurBB & gijBB_tdt,TenseurHH & gijHH_tdt, Tableau & d_gijBB_tdt, Tableau & d_gijHH_tdt,double& jacobien_0,double& jacobien_tdt, Vecteur& d_jacobien_tdt,TenseurHH& sigHH,Tableau & d_sigHH ,EnergieMeca & energ,const EnergieMeca & energ_t,double& module_compressibilite,double& module_cisaillement ,const Met_abstraite::Impli& ) { #ifdef MISE_AU_POINT if (tab_ddl.NbDdl() != d_gijBB_tdt.Taille()) { cout << "\nErreur : le nb de ddl est != de la taille de d_gijBB_t !\n"; cout << " HyperDN::Calcul_DsigmaHH_tdt\n"; Sortie(1); }; #endif int nbddl = tab_ddl.NbDdl(); TensBH epsBH; // la déformation en mixte Tableau depsBH(nbddl); TensBH * IdGBH; // l'identitée // def des alphas double alpha_0,alpha_1,alpha_2; Tableau dalpha_0(nbddl),dalpha_1(nbddl),dalpha_2(nbddl); // calcul des trois invariants et de leurs variations, de epsBH, // et de sa variation, puis retour de IdGBH qui pointe sur le bon tenseur double Ieps,V,bIIb; Tableau dIeps(nbddl),dV(nbddl),dbIIb(nbddl); IdGBH = Invariants_et_var (epsBB_tdt,gijBB_tdt,d_gijBB_tdt, gijHH_tdt,d_gijHH_tdt,jacobien_0,jacobien_tdt,d_jacobien_tdt, Ieps,dIeps,V,dV,bIIb,dbIIb,epsBH,depsBH); // calcul du potentiel et de ses dérivées premières et secondes double E,EV,EbIIb,EIeps,EVV,EbIIb2,EIeps2,EVbIIb,EVIeps,EbIIbIeps; // potentiel et variations Potentiel_et_var(jacobien_0,Ieps,V,bIIb,E,EV,EbIIb,EIeps,EVV,EbIIb2,EIeps2, EVbIIb,EVIeps,EbIIbIeps ); // calcul des coefficients alpha et de leurs variations par rapport aux degrés de libertés Tableau dE(nbddl),dEV(nbddl),dEbIIb(nbddl),dEVV(nbddl),dEQQ(nbddl),dEVQ(nbddl); Alpha_var ( E, EV, EbIIb, EIeps,EVV, EbIIb2, EIeps2, EVbIIb, EVIeps, EbIIbIeps, jacobien_0,Ieps,dIeps,V,dV,bIIb,dbIIb,alpha_0,dalpha_0,alpha_1,dalpha_1,alpha_2,dalpha_2); // calcul des contraintes finales TensBH epsepsBH = epsBH * epsBH; // epsBH:epsBH TensBH sigBH = alpha_0 * (*IdGBH) + alpha_1 * epsBH + alpha_2 * epsepsBH; sigHH = gijHH_tdt * sigBH; // en deux fois contravariants // cas le la variation du tenseur des contraintes for (int i = 1; i<= nbddl; i++) { const TensHH & dgijHH = (*(d_gijHH_tdt(i))) ; // pour simplifier l'ecriture TensHH& dsigHH = *((TensHH*) (d_sigHH(i))); // TensBB depsBB = 0.5 * (*(d_gijBB_tdt(i))); TensBH depsBH = epsBB_tdt * dgijHH + depsBB * gijHH_tdt ; TensBH dsigBH = dalpha_0(i) * (*IdGBH) + dalpha_1(i) * epsBH + dalpha_2(i) * epsepsBH + alpha_1 * depsBH + alpha_2 * (depsBH*epsBH + epsBH*depsBH); dsigHH = dgijHH * sigBH + gijHH_tdt * dsigBH; } } // ------------------------------------------------------------------------------------------------------------- // METHODES PROTEGEES : // ------------------------------------------------------------------------------------------------------------- // calcul des coefficients alpha template inline void HyperDN ::Alpha (double& ,double& EV,double& EbIIb,double& EIeps, double& jacobien_0,double & Ieps,double & V,double& , double & alpha_0,double & alpha_1,double & alpha_2) { double unsurrgOV = 1./(jacobien_0*V); alpha_0 = unsurrgOV * ( EIeps + V * EV - Ieps/3. * EbIIb); alpha_1 = unsurrgOV * ( -2. * EIeps + (2 * Ieps/3. + 1.) * EbIIb); alpha_2 = unsurrgOV * ( - 2. * EbIIb); } // calcul des coefficients alpha et de leurs variations par rapport aux degrés de libertés template inline void HyperDN :: Alpha_var ( double& ,double& EV,double& EbIIb,double& EIeps, double& EVV,double& EbIIb2,double& EIeps2, double& EVbIIb,double& EVIeps,double& EbIIbIeps, double& jacobien_0,double& Ieps,Tableau & dIeps,double& V,Tableau & dV, double& ,Tableau & dbIIb, double& alpha_0,Tableau & dalpha_0, double& alpha_1,Tableau & dalpha_1, double& alpha_2,Tableau & dalpha_2) { // calcul des coefficients alpha double unsurrgOV = 1./(jacobien_0*V); double al1 = ( EIeps + V * EV - Ieps/3. * EbIIb); // pour optimiser les calculs de variations alpha_0 = unsurrgOV * al1; double al2 = ( -2. * EIeps + (2 * Ieps/3. + 1.) * EbIIb); // pour optimiser les calculs de variations alpha_1 = unsurrgOV * al2; double al3 = ( - 2. * EbIIb); // pour optimiser les calculs de variations alpha_2 = unsurrgOV * al3; // cas le la variation des coefficients alpha int nbddl = dIeps.Taille(); for (int i=1; i<= nbddl; i++) { // variation de unsurrgOV double d_unsurrgOV = - unsurrgOV* unsurrgOV * (jacobien_0 * dV(i)); // variations des alphas dalpha_0(i) = d_unsurrgOV * al1 + unsurrgOV * ( dIeps(i) * EIeps2 + dbIIb(i) * EbIIbIeps + dV(i) * EVIeps); dalpha_1(i) = d_unsurrgOV * al2 + unsurrgOV * ( dIeps(i) * EbIIbIeps + dbIIb(i) * EbIIb2 + dV(i) * EVbIIb); dalpha_2(i) = d_unsurrgOV * al3 + unsurrgOV * ( dIeps(i) * EVIeps + dbIIb(i) * EVbIIb + dV(i) * EVV); }; }