// FICHIER : Met_Sfe1s3.cc // CLASSE : Met_Sfe1 // 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 using namespace std; //introduces namespace std #include #include #include "Sortie.h" #include "Util.h" #include "MathUtil.h" #include "Met_PiPoCo.h" // ========================================================================================= // vu la taille des executables le fichier est decompose en trois // le premier : Met_PiPoCo1.cp concerne les constructeurs, destructeur et // la gestion des variables // le second : Met_PiPoCo2.cp concerne le calcul des grandeurs publics // le troisieme : Met_PiPoCo3.cp concerne le calcul des grandeurs protegees // ========================================================================================= //==================== METHODES PROTEGEES=============================== // calcul des normales a la facette void Met_PiPoCo::Calcul_N_0 () { N_0 = (Util::ProdVec_coorBN((*aiB_0)(1),(*aiB_0)(2))).Normer(); }; void Met_PiPoCo::Calcul_N_t () { N_t = (Util::ProdVec_coorBN((*aiB_t)(1),(*aiB_t)(2))).Normer(); }; void Met_PiPoCo::Calcul_N_tdt () { N_tdt = (Util::ProdVec_coorBN((*aiB_tdt)(1),(*aiB_tdt)(2))).Normer(); }; // calcul des points, en fait dans phi(1) il y a la cote en Z calculee dans DeformationSfe1 // calcul du point a t0 void Met_PiPoCo::Calcul_M0 (const Tableau& ,const Vecteur& phi, int ) { *M0 = *P0 + phi(1) * N_0; }; void Met_PiPoCo::Calcul_Mt (const Tableau& ,const Vecteur& phi, int ) { *Mt = *Pt + phi(1) * N_t;}; void Met_PiPoCo::Calcul_Mtdt (const Tableau& ,const Vecteur& phi, int ) { *Mtdt = *Ptdt + phi(1) * N_tdt;}; // calcul de la base naturel a t0 // neccessite le calcul prealable de la courbure et de la base naturelle et duale de la facette void Met_PiPoCo::Calcul_giB_0 ( const Tableau& ,const Mat_pleine& , int ,const Vecteur& phi) { #ifdef MISE_AU_POINT if (giB_0 == NULL) { cout << "\nErreur : la base a t=0 n'est pas dimensionne !\n"; cout << "void Met_PiPoCo::Calcul_giB_0 \n"; Sortie(1); }; #endif // derivee du vecteur normal // l'écriture est un peu particulière pour éviter de mettre en oeuvre plein de constructeur CoordonneeB dN1; dN1.ConstructionAPartirDe_H(curb_0(1) * (*aiH_0)(1) + curb_0(2) * (*aiH_0)(2)); CoordonneeB dN2; dN2.ConstructionAPartirDe_H(curb_0(2) * (*aiH_0)(1) + curb_0(3) * (*aiH_0)(2)); // vecteur de base gi // le premier element de phi est en fait est = a : " z dans l'epaisseur " giB_0->CoordoB(1) = (*aiB_0)(1) + phi(1) * dN1; giB_0->CoordoB(2) = (*aiB_0)(2) + phi(1) * dN2; }; // calcul de la base naturel a t // neccessite le calcul prealable de la courbure et de la base naturelle et duale de la facette void Met_PiPoCo::Calcul_giB_t ( const Tableau& ,const Mat_pleine& , int,const Vecteur& phi) { #ifdef MISE_AU_POINT if (giB_t == NULL) { cout << "\nErreur : la base a t n'est pas dimensionne !\n"; cout << "void Met_PiPoCo::Calcul_giB_t \n"; Sortie(1); }; #endif // derivee du vecteur normal // l'écriture est un peu particulière pour éviter de mettre en oeuvre plein de constructeur CoordonneeB dN1; dN1.ConstructionAPartirDe_H(curb_t(1) * (*aiH_t)(1) + curb_t(2) * (*aiH_t)(2)); CoordonneeB dN2; dN2.ConstructionAPartirDe_H(curb_t(2) * (*aiH_t)(1) + curb_t(3) * (*aiH_t)(2)); // vecteur de base gi // le premier element de phi est en fait est = a : " z dans l'epaisseur " giB_t->CoordoB(1) = (*aiB_t)(1) + phi(1) * dN1; giB_t->CoordoB(2) = (*aiB_t)(2) + phi(1) * dN2; }; // calcul de la base naturel a tdt // neccessite le calcul prealable de la courbure et de la base naturelle et duale de la facette void Met_PiPoCo::Calcul_giB_tdt ( const Tableau& ,const Mat_pleine& , int,const Vecteur& phi) { #ifdef MISE_AU_POINT if (giB_tdt == NULL) { cout << "\nErreur : la base a t+dt n'est pas dimensionne !\n"; cout << "void Met_PiPoCo::Calcul_giB_tdt \n"; Sortie(1); }; #endif // derivee du vecteur normal // l'écriture est un peu particulière pour éviter de mettre en oeuvre plein de constructeur CoordonneeB dN1; dN1.ConstructionAPartirDe_H(curb_tdt(1) * (*aiH_tdt)(1) + curb_tdt(2) * (*aiH_tdt)(2)); CoordonneeB dN2; dN2.ConstructionAPartirDe_H(curb_tdt(2) * (*aiH_tdt)(1) + curb_tdt(3) * (*aiH_tdt)(2)); // vecteur de base gi // le premier element de phi est en fait est = a : " z dans l'epaisseur " giB_tdt->CoordoB(1) = (*aiB_tdt)(1) + phi(1) * dN1; giB_tdt->CoordoB(2) = (*aiB_tdt)(2) + phi(1) * dN2; }; //------------// variation des vecteurs de base void Met_PiPoCo::D_giB_t(const Mat_pleine& , int ,const Vecteur & phi) { for (int iddl=1;iddl<= 18;iddl++) { // variation de la derivee du vecteur normal // l'écriture est un peu particulière pour éviter de mettre en oeuvre plein de constructeur CoordonneeB ddN1; ddN1.ConstructionAPartirDe_H( dcurb_t(iddl)(1) * (*aiH_t)(1) + curb_t(1) * (*d_aiH_t)(iddl)(1) +dcurb_t(iddl)(2) * (*aiH_t)(2) + curb_t(2) * (*d_aiH_t)(iddl)(2)); CoordonneeB ddN2; ddN2.ConstructionAPartirDe_H( dcurb_t(iddl)(2) * (*aiH_t)(1) + curb_t(2) * (*d_aiH_t)(iddl)(1) + dcurb_t(iddl)(3) * (*aiH_t)(2) + curb_t(3) * (*d_aiH_t)(iddl)(2)); // vecteur de base gi // le premier element de phi est en fait est = a : " z * phi dans l'epaisseur " (*d_giB_t)(iddl).CoordoB(1) = (*d_aiB_t)(iddl)(1) + phi(1) * ddN1; (*d_giB_t)(iddl).CoordoB(2) = (*d_aiB_t)(iddl)(2) + phi(1) * ddN2; } }; void Met_PiPoCo::D_giB_tdt(const Mat_pleine& , int ,const Vecteur & phi) { for (int iddl=1;iddl<= 18;iddl++) { // variation de la derivee du vecteur normal // l'écriture est un peu particulière pour éviter de mettre en oeuvre plein de constructeur CoordonneeB ddN1; ddN1.ConstructionAPartirDe_H( dcurb_tdt(iddl)(1) * (*aiH_tdt)(1) + curb_tdt(1) * (*d_aiH_tdt)(iddl)(1) +dcurb_tdt(iddl)(2) * (*aiH_tdt)(2) + curb_tdt(2) * (*d_aiH_tdt)(iddl)(2)); CoordonneeB ddN2; ddN2.ConstructionAPartirDe_H( dcurb_tdt(iddl)(2) * (*aiH_tdt)(1) + curb_tdt(2) * (*d_aiH_tdt)(iddl)(1) + dcurb_tdt(iddl)(3) * (*aiH_tdt)(2) + curb_tdt(3) * (*d_aiH_tdt)(iddl)(2)); // vecteur de base gi // le premier element de phi est en fait est = a : " z * phi dans l'epaisseur " (*d_giB_tdt)(iddl).CoordoB(1) = (*d_aiB_tdt)(iddl)(1) + phi(1) * ddN1; (*d_giB_tdt)(iddl).CoordoB(2) = (*d_aiB_tdt)(iddl)(2) + phi(1) * ddN2; } };