Gérard Rio
9692dbd130
- contient les éléments finis, métriques associées, déformations ... intégration du réperoire Géométrie: - contient les géométries 1D 2D et 3D, les frontières des éléments géométriques
175 lines
7.8 KiB
C++
175 lines
7.8 KiB
C++
// 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) <https://www.irdl.fr/>.
|
|
//
|
|
// Herezh++ is distributed under GPL 3 license ou ultérieure.
|
|
//
|
|
// Copyright (C) 1997-2021 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 <https://www.gnu.org/licenses/>.
|
|
//
|
|
// For more information, please consult: <https://herezh.irdl.fr/>.
|
|
|
|
|
|
# include <iostream>
|
|
using namespace std; //introduces namespace std
|
|
#include <math.h>
|
|
#include <stdlib.h>
|
|
#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<Noeud *>& ,const Vecteur& phi, int )
|
|
{ *M0 = *P0 + phi(1) * N_0;
|
|
};
|
|
void Met_PiPoCo::Calcul_Mt
|
|
(const Tableau<Noeud *>& ,const Vecteur& phi, int )
|
|
{ *Mt = *Pt + phi(1) * N_t;};
|
|
void Met_PiPoCo::Calcul_Mtdt
|
|
(const Tableau<Noeud *>& ,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<Noeud *>& ,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<Noeud *>& ,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<Noeud *>& ,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;
|
|
}
|
|
};
|
|
|