Herezh_dev/herezh_pp/Elements/Mecanique/SFE/Met_Sfe1.h

684 lines
40 KiB
C++
Executable file

// FICHIER : Met_Sfe1.h
// 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/>.
/************************************************************************
* DATE: 04/10/2007 *
* $ *
* AUTEUR: G RIO (mailto:gerardrio56@free.fr) *
* $ *
* PROJET: Herezh++ *
* $ *
************************************************************************
* BUT: La classe Met_Sfe1 est une classe derivee de la classe *
* Met_abstraite et permet de realiser tous les calculs *
* particuliers lies a la metrique d'un element Sfe. *
* N.B. : La dimension de l'espace des points est 3, *
* et le nombre de vecteur est : *
* - uniquement 2, les 2 vecteurs de surfaces, s'il n'y *
* pas de degré de liberté d'épaisseur aux noeuds *
* - 3 = 2 vecteurs de surfaces + un vecteur parallèle *
* à la normale : cas où il *
* y a un degré de liberté d'épaisseur. *
* $ *
* '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' *
* VERIFICATION: *
* *
* ! date ! auteur ! but ! *
* ------------------------------------------------------------ *
* ! ! ! ! *
* $ *
* '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' *
* MODIFICATIONS: *
* ! date ! auteur ! but ! *
* ------------------------------------------------------------ *
* $ *
************************************************************************/
#ifndef MET_SFE1_H
#define MET_SFE1_H
#include "Met_abstraite.h"
#include "TabOper_T.h"
#include "Coordonnee3.h"
#include "Tenseur2.h"
#include "Enum_interpol.h"
#include "EnuTypeCL.h"
#include "Epai.h"
#include "Util.h"
#include "MathUtil.h"
/// @addtogroup groupe_des_metrique
/// @{
///
class Met_Sfe1 : public Met_abstraite
{
public :
// CONSTRUCTEUR :
// Constructeur par defaut
Met_Sfe1 ();
// constructeur permettant de dimensionner uniquement certaine variables
// dim = dimension de l'espace, ici forcément = 3
// nbvec = nb de vecteur des bases, tab = liste des variables a initialiser
Met_Sfe1 ( const DdlElement& tabddl,int nbvec
,const Tableau<Enum_variable_metrique>& tabb, Enum_interpol enui
,int nb_noeud_central);
// constructeur de copie
Met_Sfe1 ( const Met_Sfe1&);
// DESTRUCTEUR :
virtual ~Met_Sfe1 ();
// 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_Sfe1& operator= (const Met_Sfe1& met);
// affichage minimale des éléments de métrique de base
virtual void Affiche() const;
// attribution de l'indicateur de type de calcul de jacobien:
// =1: le jacobien = celui de la facette médiane sans courbure
// =2: le jacobien = celui de la facette médiane + la courbure actuelle
void ChangeTypeCalculJacobien(int nouveau_type);
//==================================================================================================
// définition de différentes classes conteneurs, utilisés pour ramener les résultats après calcul |
// ici spécifique au cas des éléments sfe (en plus des conteneurs déjà définis dans Met_abstraite.h)
#include "Met_Sfe1_struc_donnees.h"
//==================================================================================================
// ------------------------ 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
// il y a l'interpolation d'épaisseur en plus par rapport à la fonction originale ds met_abstraite
// 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& CalSfe1_explicit_t( const Tableau<Noeud *>& tab_noeud,bool gradV_instantane
,Mat_pleine const & tabdphiS,int nombre_noeud,Vecteur const & tabphiS
,bool premier_calcul,Mat_pleine const & tabdphiH,Vecteur const& tabphiH,const Epai* epais
,Tableau <EnuTypeCL> const & tabTypeCL,Tableau <Coordonnee3> const & vplan);
// 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& CalSfe1_explicit_simple_t( const Tableau<Noeud *>& tab_noeud,bool gradV_instantane
,Mat_pleine const & tabdphiS,int nombre_noeud,Vecteur const & tabphiS
,bool premier_calcul,Mat_pleine const & tabdphiH,Vecteur const& tabphiH,const Epai* epais);
// cas explicite à tdt, toutes les grandeurs sont a 0 ou t
// calcul des termes : gijBB_0, gijBB_t, gijHH_t, d_gijBB_t,jacobien
// il y a un parametre de plus (phi) que dans la fonction originale ds met_abstraite
// 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& CalSfe1_explicit_tdt( const Tableau<Noeud *>& tab_noeud,bool gradV_instantane
,Mat_pleine const & tabdphiS,int nombre_noeud,Vecteur const & tabphiS
,bool premier_calcul,Mat_pleine const & tabdphiH,Vecteur const& tabphiH,const Epai* epais
,Tableau <EnuTypeCL> const & tabTypeCL,Tableau <Coordonnee3> const & vplan);
// 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& CalSfe1_explicit_simple_tdt( const Tableau<Noeud *>& tab_noeud,bool gradV_instantane
,Mat_pleine const & tabdphiS,int nombre_noeud,Vecteur const & tabphiS
,bool premier_calcul,Mat_pleine const & tabdphiH,Vecteur const& tabphiH,const Epai* epais);
// récup du conteneur Expli_t_dtFac : c'est-à-dire des infos de la FACETTE !!!
virtual const Expli_t_tdt& Conteneur_Expli_tdtFac() const {return ex_expli_t_tdtFac;};
// 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& CalSfe1_implicit( const Tableau<Noeud *>& tab_noeud,bool gradV_instantane
,Mat_pleine const & tabdphiS,int nombre_noeud,Vecteur const & tabphiS
,bool premier_calcul,Mat_pleine const & tabdphiH,Vecteur const& tabphiH,const Epai* epais
,Tableau <EnuTypeCL> const & tabTypeCL,Tableau <Coordonnee3> const & vplan);
// 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& CalSfe1_implicit_simple( const Tableau<Noeud *>& tab_noeud,bool gradV_instantane
,Mat_pleine const & tabdphiS,int nombre_noeud,Vecteur const & tabphiS
,bool premier_calcul,Mat_pleine const & tabdphiH,Vecteur const& tabphiH,const Epai* epais);
// ---------------- cas de la dynamique ----------------------------
// calcul pour la matrice masse
virtual const Dynamiq& Cal_pourMatMass(const Tableau<Noeud *>& tab_noeud, const Mat_pleine& tabDphi
,int nombre_noeud,const Vecteur& phi);
// --------------- test sur la courbure ------------------------------
// test si la courbure est anormalement trop grande
// inf_normale : indique en entrée le det mini pour la courbure en locale
// retour 1: si tout est ok,
// 0: une courbure trop grande a été détecté
int Test_courbure_anormale(Enum_dure temps,double inf_normale, const Tableau<Noeud *>& tab_noeud
,const Mat_pleine& dphiS,int nombre_noeud,const Vecteur& phiS);
// -------------- remontee aux informations --------------------------
// cas sortie d'infoImp
// calcul des termes de la classe InfoImp
const Met_abstraite::InfoImp& CalSfe1_InfoImp( const Tableau<Noeud *>& tab_noeud
,Mat_pleine const & tabdphiS,int nombre_noeud,Vecteur const & tabphiS
,Mat_pleine const & tabdphiH,Vecteur const & tabphiH,const Epai* epais
,Tableau <EnuTypeCL> const & tabTypeCL,Tableau <Coordonnee3> const & vplan);
// cas sortie d'infoExp
// calcul des termes de la classe InfoExp_t
const Met_abstraite::InfoExp_t& CalSfe1_InfoExp_t( const Tableau<Noeud *>& tab_noeud
,Mat_pleine const & tabdphiS,int nombre_noeud,Vecteur const & tabphiS
,Mat_pleine const & tabdphiH,Vecteur const & tabphiH,const Epai* epais
,Tableau <EnuTypeCL> const & tabTypeCL,Tableau <Coordonnee3> const & vplan);
// calcul des termes de la classe InfoExp_tdt
const Met_abstraite::InfoExp_tdt& CalSfe1_InfoExp_tdt( const Tableau<Noeud *>& tab_noeud
,Mat_pleine const & tabdphiS,int nombre_noeud,Vecteur const & tabphiS
,Mat_pleine const & tabdphiH,Vecteur const & tabphiH,const Epai* epais
,Tableau <EnuTypeCL> const & tabTypeCL,Tableau <Coordonnee3> const & vplan);
// calcul des termes de la classe Info0_t_tdt
virtual const Info0_t_tdt& CalSfe1_Info0_t_tdt( const Tableau<Noeud *>& tab_noeud
,Mat_pleine const & tabdphiS,int nombre_noeud,Vecteur const & tabphiS
,Mat_pleine const & tabdphiH,Vecteur const & tabphiH,const Epai* epais
,Tableau <EnuTypeCL> const & tabTypeCL,Tableau <Coordonnee3> const & vplan);
// cas du calcul de la déformation d'Almansi uniquement
virtual const Pour_def_Almansi CalSfe1_pour_def_Almansi_au_temps
(Enum_dure temps,const Tableau<Noeud *>& tab_noeud
,Mat_pleine const & tabdphiS,int nombre_noeud,Vecteur const & tabphiS
,Mat_pleine const & tabdphiH,Vecteur const & tabphiH,const Epai* epais
,Tableau <EnuTypeCL> const & tabTypeCL,Tableau <Coordonnee3> const & vplan);
// cas du calcul de la déformation logarithmique uniquement
virtual const Pour_def_log CalSfe1_pour_def_log_au_temps
(Enum_dure temps,const Tableau<Noeud *>& tab_noeud
,Mat_pleine const & tabdphiS,int nombre_noeud,Vecteur const & tabphiS
,Mat_pleine const & tabdphiH,Vecteur const & tabphiH,const Epai* epais
,Tableau <EnuTypeCL> const & tabTypeCL,Tableau <Coordonnee3> const & vplan);
// ========== utilise par le contact et autres =========================
// calcul d'un point M en fonction des phi et des coordonnees a 0
virtual const Coordonnee & PointSfe1M_0 // ( stockage a t=0)
(const Tableau<Noeud *>& tab_noeud, const Vecteur& phiS,Mat_pleine const & dphiS
,const Epai* epais, const Vecteur& phiH);
// calcul d'un point M en fonction des phi et des coordonnees a t
virtual const Coordonnee & PointSfe1M_t // ( stockage a t=t)
(const Tableau<Noeud *>& tab_noeud, const Vecteur& phiS,Mat_pleine const & dphiS
,const Epai* epais, const Vecteur& phiH);
/*
// calcul de la variation d'un point M par rapport aux ddl ,
// en fonction des phi et des coordonnees a t
virtual const Tableau<Coordonnee> & D_PointSfe1M_t // ( stockage a t)
( const Tableau<Noeud *>& tab_noeud, const Vecteur& phiS,Mat_pleine const & dphiS
,const double& epais_t, const Vecteur& phiH)
*/
// calcul d'un point M en fonction des phi et des coordonnees a tdt
virtual const Coordonnee & PointSfe1M_tdt // ( stockage a tdt)
(const Tableau<Noeud *>& tab_noeud, const Vecteur& phiS,Mat_pleine const & dphiS
,const Epai* epais, const Vecteur& phiH);
/*
// calcul de la variation d'un point M par rapport aux ddl ,
// en fonction des phi et des coordonnees a tdt
virtual const Tableau<Coordonnee> & D_PointSfe1M_tdt // ( stockage a tdt)
(const Tableau<Noeud *>& tab_noeud,const Vecteur& phi);
// calcul de la vitesse du point M en fonction de phi et des coordonnees a 0
// dans le cas où les ddl de vitesse existent, ils sont directement interpolés
// dans le cas où ils n'existent pas, on utilise les vitesses moyennes : delta M / delta t
virtual const Coordonnee & VitesseSfe1M_0 // ( stockage a t=0)
(const Tableau<Noeud *>& tab_noeud,const Vecteur& phi);
// idem mais au noeud passé en paramètre
virtual const Coordonnee & VitesseSfe1M_0 (const Noeud* noeud);
// calcul de la vitesse du point M en fonction de phi et des coordonnees a t
// dans le cas où les ddl de vitesse existent, ils sont directement interpolés
// dans le cas où ils n'existent pas, on utilise les vitesses moyennes : delta M / delta t
virtual const Coordonnee & VitesseSfe1M_t // ( stockage a t=t)
(const Tableau<Noeud *>& tab_noeud,const Vecteur& phi);
// idem mais au noeud passé en paramètre
virtual const Coordonnee & VitesseSfe1M_t (const Noeud* noeud);
// calcul de la variation de la vitesse du point M par rapport aux ddl ,
// en fonction de phi et des coordonnees a t
// dans le cas où les ddl de vitesse existent, ils sont directement interpolés
// dans le cas où ils n'existent pas, on utilise les vitesses moyennes : delta M / delta t
// ddl_vitesse : indique si oui ou non il s'agit de variation par rapport
// aux ddl de vitesse ou au ddl de position
virtual const Tableau<Coordonnee> & D_VitesseSfe1M_t // ( stockage a t)
(const Tableau<Noeud *>& tab_noeud,const Vecteur& phi,bool ddl_vitesse);
// idem mais au noeud passé en paramètre
virtual const Tableau<Coordonnee> & D_VitesseSfe1M_t (const Noeud* noeud,bool ddl_vitesse);
// calcul de la vitesse du point M en fonction de phi et des coordonnees a tdt
// dans le cas où les ddl de vitesse existent, ils sont directement interpolés
// dans le cas où ils n'existent pas, on utilise les vitesses moyennes : delta M / delta t
// ddl_vitesse : indique si oui ou non il s'agit de variation par rapport
// aux ddl de vitesse ou au ddl de position
virtual const Coordonnee & VitesseSfe1M_tdt // ( stockage a tdt)
(const Tableau<Noeud *>& tab_noeud,const Vecteur& phi);
// idem mais au noeud passé en paramètre
virtual const Coordonnee & VitesseSfe1M_tdt (const Noeud* noeud);
// calcul de la variation de la vitesse du point M par rapport aux ddl ,
// en fonction de phi et des coordonnees a tdt
// dans le cas où les ddl de vitesse existent, ils sont directement interpolés
// dans le cas où ils n'existent pas, on utilise les vitesses moyennes : delta M / delta t
// ddl_vitesse : indique si oui ou non il s'agit de variation par rapport
// aux ddl de vitesse ou au ddl de position
virtual const Tableau<Coordonnee> & D_VitesseM_tdt // ( stockage a tdt)
(const Tableau<Noeud *>& tab_noeud,const Vecteur& phi,bool ddl_vitesse);
// idem mais au noeud passé en paramètre
virtual const Tableau<Coordonnee> & D_VitesseSfe1M_tdt (const Noeud* noeud,bool ddl_vitesse);
// calcul de la base naturel , au point correspondant au dphi en fonction des coord a t=0
virtual const BaseB& BaseSfe1Nat_0 // ( stockage a t=0)
(const Tableau<Noeud *>& tab_noeud,const Mat_pleine& tabDphi,const Vecteur& phi);
// calcul de la base naturel , au point correspondant au dphi en fonction des coord a t
virtual const BaseB& BaseSfe1Nat_t // ( stockage a t)
(const Tableau<Noeud *>& tab_noeud,const Mat_pleine& tabDphi,const Vecteur& phi);
// calcul de la base naturel , au point correspondant au dphi en fonction des coord a tdt
virtual const BaseB& BaseSfe1Nat_tdt // ( stockage a tdt)
(const Tableau<Noeud *>& tab_noeud,const Mat_pleine& tabDphi,const Vecteur& phi);
// calcul de la base naturelle et duale ( stockage a t=0) en fonction des coord a 0
virtual void BaseSfe1ND_0(const Tableau<Noeud *>& tab_noeud,const Mat_pleine& tabDphi,
const Vecteur& phi,BaseB& bB,BaseH& bH);
// calcul de la base naturelle et duale ( stockage a t) en fonction des coord a t
virtual void BaseSfe1ND_t(const Tableau<Noeud *>& tab_noeud,const Mat_pleine& tabDphi,
const Vecteur& phi,BaseB& bB,BaseH& bH);
// calcul de la base naturelle et duale ( stockage a tdt) en fonction des coord a tdt
virtual void BaseSfe1ND_tdt(const Tableau<Noeud *>& tab_noeud,const Mat_pleine& tabDphi,
const Vecteur& phi,BaseB& bB,BaseH& bH);
// ====== informations diverses (mais cohérentes, c-a-d, peuvent être appelées directement sans init) ====
double JacobienInitial(const Tableau<Noeud *>& tab_noeud,const Mat_pleine& tabDphi
,int nombre_noeud,const Vecteur& phi);
*/
// ------------------------ gestion de la memoire --------------------------
// Ajout d'initialisation de differentes variables : liste dans tab
void PlusInitVariables(Tableau<Enum_variable_metrique>& tab) ;
// ---------- récupération particulière à la courbure -------------
// doit être utilisé après une méthode qui calcul toutes les grandeurs en questions !!!!!
const Met_Sfe1::Courbure_t_tdt& RecupCourbure () const {return courbure_t_tdt;};
// ============================ protege ===========================
protected :
// METHODES protegees:
// calcul des normales a la facette
void Calcul_N_0();
void Calcul_N_t();
void Calcul_N_tdt();
//== calcul des variations de la normales
void Cal_d_N_t(); // il faut avant le calcul des ap_alpha_t et de épaisseur à t
void Cal_d_N_tdt(); // il faut avant le calcul des ap_alpha_tdt et de épaisseur à tdt
//== calcul de N,alpha (sur la surface courbe) pour les différents temps
void Cal_N_alpha_0()
{N_alpha_0_1.ConstructionAPartirDe_H( -(curb_0(1,1) * (*aiH_0)(1) + curb_0(1,2) * (*aiH_0)(2)));
N_alpha_0_2.ConstructionAPartirDe_H( -(curb_0(2,1) * (*aiH_0)(1) + curb_0(2,2) * (*aiH_0)(2)));};
void Cal_N_alpha_t()
{N_alpha_t_1.ConstructionAPartirDe_H( -(curb_t(1,1) * (*aiH_t)(1) + curb_t(1,2) * (*aiH_t)(2)));
N_alpha_t_2.ConstructionAPartirDe_H( -(curb_t(2,1) * (*aiH_t)(1) + curb_t(2,2) * (*aiH_t)(2)));};
void Cal_N_alpha_tdt()
{N_alpha_tdt_1.ConstructionAPartirDe_H( -(curb_tdt(1,1) * (*aiH_tdt)(1) + curb_tdt(1,2) * (*aiH_tdt)(2)));
N_alpha_tdt_2.ConstructionAPartirDe_H( -(curb_tdt(2,1) * (*aiH_tdt)(1) + curb_tdt(2,2) * (*aiH_tdt)(2)));};
//== calcul de la variation de N,alpha
void Cal_d_N_alpha_t(); // il faut la courbure, la variation de la courbure, aH et d_aH
void Cal_d_N_alpha_tdt();
//==calcul des points, identique a Met_abstraite
// calcul du point a t0
void Calcul_M0 ( const Tableau<Noeud *>& , const Vecteur& phi, int );
void Calcul_Mt ( const Tableau<Noeud *>& , const Vecteur& phi, int );
void Calcul_Mtdt ( const Tableau<Noeud *>& , const Vecteur& phi, int );
//== le nombre de vecteur de base pour les Sfe1 est soit 2: cas historique, sans ddl d'épaisseur
// soit 3: cas avec ddl d'épaisseurs à chaque noeud
//== certaines fonctions de calcul de base sont donc redefini
// -- calcul des bases médianes : tout d'abord la partie a_alpha
void Calcul_a_alpha_B_0(const Tableau<Noeud *>& tab_noeud
, const Mat_pleine& tabDphi, int nombre_noeud,const Vecteur& phi);
void Calcul_a_alpha_B_t(const Tableau<Noeud *>& tab_noeud
, const Mat_pleine& tabDphi, int nombre_noeud,const Vecteur& phi);
void Calcul_a_alpha_B_tdt(const Tableau<Noeud *>& tab_noeud
, const Mat_pleine& tabDphi, int nombre_noeud,const Vecteur& phi);
// -- calcul du vecteur a3 des bases médianes
// nécessite auparavant d'avoir calculé la normale et l'épaisseur
void Calcul_a_3_B_0() {(aiB_0)->CoordoB(3) = N_0 * (epais.epaisseur0 * 0.5);};
void Calcul_a_3_B_t() {(aiB_t)->CoordoB(3) = N_t * (epais.epaisseur_t * 0.5);};
void Calcul_a_3_B_tdt() {(aiB_tdt)->CoordoB(3) = N_tdt * (epais.epaisseur_tdt * 0.5);};
//== calcul de la variation des bases sur la surface médiane
// ici il ne s'agit uniquement que de la variation de a_alpha et pas a_3
void D_a_alpha_B_t( const Mat_pleine& tabDphi,
int nbnoeu,const Vecteur & phi); // avant calcul de : a_alpha_B_t
void D_a_alpha_B_tdt( const Mat_pleine& tabDphi,
int nbnoeu,const Vecteur & phi); // avant calcul de : a_alpha_B_tdt
//== calcul de la variation de a_3_B
void D_a_3_B_t();
void D_a_3_B_tdt();
// -- calcul des bases dans l'épaisseur
// calcul de la base naturel a t0
// pendant le traitement il y a calcul de la base aiB et aiH de la facette plane, et éventuellement
// les 3ième vecteur (proportionnelle à la normale) s'il y a un ddl d'épaisseur
// la fonction contiend un argument de plus que la routine dans met_abstraite
void Calcul_giB_0 ( const Tableau<Noeud *>& , const Mat_pleine& ,
int, const Vecteur& phi);
// calcul de la base naturel a t
void Calcul_giB_t ( const Tableau<Noeud *>& , const Mat_pleine& ,
int, const Vecteur& phi);
// calcul de la base naturel a t+dt
void Calcul_giB_tdt ( const Tableau<Noeud *>& , const Mat_pleine& ,
int, const Vecteur& phi);
//== calcul de la variation des bases
void D_giB_t( const Mat_pleine& , int , const Vecteur & phi);
void D_giB_tdt( const Mat_pleine& , int , const Vecteur & phi);
// cas des épaisseurs interpolées
void Calcul_epaisseur_0(const Tableau<Noeud *>& tab_noeud, const Vecteur& phiS);
void Calcul_epaisseur_t(const Tableau<Noeud *>& tab_noeud, const Vecteur& phiS);
void Calcul_epaisseur_tdt(const Tableau<Noeud *>& tab_noeud, const Vecteur& phiS);
// calcul de la variation de l'épaisseur par rapport aux ddl
void D_epaisseur_t(const Vecteur& phiS);
void D_epaisseur_tdt(const Vecteur& phiS);
//-----------// calcul du tenseur de courbure dans la base naturelle
// on utilise un tenseur non symétrique, bien qu'en théorie la courbure est symétrique
// suivant les différentes méthodes de calcul, le tenseur en sortie est symétrique ou pas
// on peut toujours le symétriser, si l'on veut un tenseur symétrique
// on a : N,al = - b_{al be} . a^{be}
// plusieurs cas sont etudies suivant l'instant considere
// a l'instant t = 0
Tenseur_ns2BB& courbure_0 ( const Tableau<Noeud *>& tab_noeud
,Tableau <EnuTypeCL> const & tabTypeCL,Tableau <Coordonnee3> const & vplan);
// a l'instant t
Tenseur_ns2BB& courbure_t ( const Tableau<Noeud *>& tab_noeud
,Tableau <EnuTypeCL> const & tabTypeCL,Tableau <Coordonnee3> const & vplan);
// a l'instant t+dt
Tenseur_ns2BB& courbure_tdt ( const Tableau<Noeud *>& tab_noeud
,Tableau <EnuTypeCL> const & tabTypeCL,Tableau <Coordonnee3> const & vplan);
//--------------// calcul du tenseur de courbure et de sa variation
// plusieurs cas sont etudies suivant l'instant considere
// a l'instant t
void Dcourbure_t( const Tableau<Noeud *>& tab_noeud,Tenseur_ns2BB& curb,TabOper<Tenseur_ns2BB>& dcurb
,Tableau <EnuTypeCL> const & tabTypeCL,Tableau <Coordonnee3> const & vplan);
// a l'instant tdt
void Dcourbure_tdt( const Tableau<Noeud *>& tab_noeud,Tenseur_ns2BB& curb,TabOper<Tenseur_ns2BB>& dcurb
,Tableau <EnuTypeCL> const & tabTypeCL,Tableau <Coordonnee3> const & vplan);
// DONNEES PROTEGEES
Tableau <Coordonnee3> Ia; // base absolue
// calcul de la courbure et de sa variation eventuelle
Tenseur_ns2BB curb_0,curb_t,curb_tdt;
TabOper<Tenseur_ns2BB> dcurb_t,dcurb_tdt;
// calcul de la normale
Coordonnee3B N_0,N_t,N_tdt;
double norme_N_t, norme_N_tdt; // norme des normales
// variation de N_t et N_tdt
Tableau < CoordonneeB > * d_N_t, * d_N_tdt;
//N,alpha pour les différents temps
CoordonneeB N_alpha_0_1,N_alpha_0_2,N_alpha_t_1,N_alpha_t_2,N_alpha_tdt_1,N_alpha_tdt_2;
// variation de N,alpha
Tableau < CoordonneeB > * d_N_alpha_t_1, * d_N_alpha_t_2; // variation par rapport aux Xi de N(t),1 et ,2
Tableau < CoordonneeB > * d_N_alpha_tdt_1, * d_N_alpha_tdt_2; // idem pour N(tdt)
int nbNoeudCentral; // nombre de noeud de l'élément central
bool tCalEpais; // indique le type de prise en compte de l'épaisseur
// = 0 : épaisseur constante (n'est pas un ddl) passée en paramètre
// = 1 : épaisseur = un ddl stocké au noeud
// épaisseurs : soit contient les épaisseurs passées en paramètres d'entrée (tCalEpais = 0)
// soit contient les épaisseurs données interpolées aux noeuds (tCalEpais = 1)
Epai epais; // le conteneur d'épaisseur à 0, t et tdt
Tableau <Epai> * d_epais; // variation des épaisseurs
// indicateur de type de calcul de jacobien finale :
// =1: le jacobien = celui de la facette médiane sans courbure
// =2: le jacobien = celui de la facette médiane + la courbure actuelle
// =3: le jacobien = celui du volume = facette * épaisseur, cas d'une métrique 3D
int type_calcul_jacobien;
//il s'agit ici des infos concernant l'élément centrale, et sur la surface médiane
Coordonnee3 * P0; // point a t=0
Coordonnee3 * Pt ; // point a l'instant t
Coordonnee3 * Ptdt; // point a l'instant t+dt BaseB Ia; // la base absolu
Tableau <Coordonnee3> * d_Pt ; // derivées au point a l'instant t, par rapport aux ddl
Tableau <Coordonnee3> * 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 de la facette centrale sans courbure a l'instant t=0
double ajacobien_t; // jacobien de la facette centrale sans courbure a l'instant t
double ajacobien_tdt; // jacobien de la facette centrale sans courbure a l'instant t+dt
Tableau <BaseB> * d_aiB_t; // derivees de la base naturelle par rapport
// aux degres de liberte a t
Tableau <BaseB> * d_aiB_tdt; // derivees de la base naturelle par rapport
// aux degres de liberte a t+dt
Tableau <BaseH> * d_aiH_t; // derivees de la base duale par rapport
// aux degres de liberte a t
Tableau <BaseH> * d_aiH_tdt; // derivees de la base duale par rapport
// aux degres de liberte a t+dt
Tableau <TenseurBB * > d_aijBB_t;// derivees de la metrique de la base naturelle
// a t par rapport aux degres de liberte
Tableau <TenseurBB * > d_aijBB_tdt;// derivees de la metrique de la base naturelle
// a t+dt par rapport aux degres de liberte
Tableau <TenseurHH * > d_aijHH_t; // derivees de la metrique de la base duale a t
Tableau <TenseurHH * > d_aijHH_tdt; // derivees de la metrique de la base duale a t+dt
Vecteur d_ajacobien_t ; // derivees a t du jacobien de la facette centrale sans courbure
// par rapport aux degres de liberte
Vecteur d_ajacobien_tdt ; // derivees a tdt du jacobien de la facette centrale sans courbure
// par rapport aux degres de liberte
// maintenant définition des différents conteneurs de retour des méthodes globales
// **** ici il s'agit de contenir les infos liées à la facette !!!! *******
// maintenant définition des différents conteneurs de retour des méthodes globales
// contrairement au cas de metabstraite
Courbure_t_tdt courbure_t_tdt; // cas du calcul de la courbure
Impli ex_impliFac; // cas d'un calcul implicite
Expli ex_expliFac; // calcul explicite 0 t
Expli_t_tdt ex_expli_t_tdtFac; // calcul explicite 0 t tdt
gijHH_0_et_giH_0 ex_aijHH_0_et_aiH_0Fac; // comme le nom l'indique !
Dynamiq ex_DynamiqFac; // calcul pour la dynamique (partie spécifique à quelques grandeurs)
flambe_lin ex_flambe_linFac; // grandeurs pour le flambement linéaire
Umat_cont umat_contFac; // calcul relatif aux Umat
InfoImp ex_InfoImpFac; // sortie d'info en implicite
InfoExp_t ex_InfoExp_tFac; // sortie d'info en explicite à t
InfoExp_tdt ex_InfoExp_tdtFac; // sortie d'info en explicite à tdt
Info0_t_tdt ex_Info0_t_tdtFac; // sortie d'info à 0 t et tdt
// quelques variables statiques
static Tableau <int> indi; // pour de l'indiçage indirecte
// indicateur utilisé par Verif_Dcourbure
static int indic_Verif_DcourbureSFE;
// pointeurs des fonctions en cours
Tenseur_ns2BB (Met_Sfe1::*PtCourbure) ( const Tableau<Coordonnee3>& tab_coor, const BaseB & aiB , const BaseH & aiH
,Tableau <EnuTypeCL> const & tabTypeCL,Tableau <Coordonnee3> const & vplan);
void (Met_Sfe1::*PtDcourbure) ( const Tableau<Coordonnee3>& tab_coor, const BaseB & aiB
, const Tableau <BaseB>& DaiB,const BaseH & aiH
, const Tableau <BaseH>& DaiH,Tenseur_ns2BB& curb,TabOper <Tenseur_ns2BB>& dcurb
,Tableau <EnuTypeCL> const & tabTypeCL,Tableau <Coordonnee3> const & vplan);
// test si la courbure est anormalement trop grande
// inf_normale : indique en entrée le det mini pour la courbure en locale
// retour 1: si tout est ok,
// 0: une courbure trop grande a été détecté
int (Met_Sfe1::*PtTest_courbure_anormale)(double inf_normale,const Tableau<Coordonnee3>& tab_coor
, const BaseB & aiB , const BaseH & aiH);
// fonctions privees
// allocation de la memoire
void AllocSfe1 ();
// deallocation de la memoire complète, uniquement des grandeurs spécifiques
// à Met_Sfe1
void DeallocSfe1();
// uniquement des grandeurs de tib
void DeallocSfe1(Tableau<Enum_variable_metrique>& tib);
// copie en fonction de l'instance passée
// concerne que les grandeurs pointées
void Copie_metSfe1(const Met_Sfe1& a);
// ----------- routines internes pour calculer les différentes formes de courbures
// routines (1) generales de calcul de la courbure
// cas 1: calcul des 3 courbures suivant les 3 cotés
Tenseur_ns2BB Courbure1
( const Tableau<Coordonnee3>& tab_coor, const BaseB & aiB , const BaseH & aiH
,Tableau <EnuTypeCL> const & tabTypeCL,Tableau <Coordonnee3> const & vplan);
// routine generale de calcul de la courbure et de sa variation
// en sortie : curb , la courbure b11,b12,b22
// dcurb , la variation de courbure.
// cas 1: calcul des 3 courbures suivant les 3 cotés
void Dcourbure1 ( const Tableau<Coordonnee3>& tab_coor, const BaseB & aiB
, const Tableau <BaseB>& DaiB,const BaseH & aiH
, const Tableau <BaseH>& DaiH,Tenseur_ns2BB& curb,TabOper <Tenseur_ns2BB>& dcurb
,Tableau <EnuTypeCL> const & tabTypeCL,Tableau <Coordonnee3> const & vplan);
// test si la courbure est anormalement trop grande
// inf_normale : indique en entrée le det mini pour la courbure en locale
// retour 1: si tout est ok,
// 0: une courbure trop grande a été détecté
int Test_courbure_anormale1(double inf_normale,const Tableau<Coordonnee3>& tab_coor
, const BaseB & aiB , const BaseH & aiH);
// routine (2) generale de calcul de la courbure
// cas 2: moyenne des normales de part et autres des arrêtes
Tenseur_ns2BB Courbure2
( const Tableau<Coordonnee3>& tab_coor, const BaseB & aiB , const BaseH & aiH
,Tableau <EnuTypeCL> const & tabTypeCL,Tableau <Coordonnee3> const & vplan);
// routine generale de calcul de la courbure et de sa variation
// en sortie : curb , la courbure b11,b12,b22
// dcurb , la variation de courbure.
// cas 2: moyenne des normales de part et autres des arrêtes
void Dcourbure2 ( const Tableau<Coordonnee3>& tab_coor, const BaseB & aiB
, const Tableau <BaseB>& DaiB,const BaseH & aiH
, const Tableau <BaseH>& DaiH,Tenseur_ns2BB& curb,TabOper <Tenseur_ns2BB>& dcurb
,Tableau <EnuTypeCL> const & tabTypeCL,Tableau <Coordonnee3> const & vplan);
// test si la courbure est anormalement trop grande
// inf_normale : indique en entrée le det mini pour la courbure en locale
// retour 1: si tout est ok,
// 0: une courbure trop grande a été détecté
int Test_courbure_anormale2(double inf_normale,const Tableau<Coordonnee3>& tab_coor
, const BaseB & aiB , const BaseH & aiH);
// routine (3) generale de calcul de la courbure
// cas 3: moyenne pondérée des normales de part et autres des arrêtes, et localisation du point sur l'arrête
Tenseur_ns2BB Courbure3
( const Tableau<Coordonnee3>& tab_coor, const BaseB & aiB , const BaseH & aiH
,Tableau <EnuTypeCL> const & tabTypeCL,Tableau <Coordonnee3> const & vplan);
// routine (3) generale de calcul de la courbure et de sa variation
// en sortie : curb , la courbure b11,b12,b22
// dcurb , la variation de courbure.
// cas 3: moyenne pondérée des normales de part et autres des arrêtes, et localisation du point sur l'arrête
void Dcourbure3 ( const Tableau<Coordonnee3>& tab_coor, const BaseB & aiB
, const Tableau <BaseB>& DaiB,const BaseH & aiH
, const Tableau <BaseH>& DaiH,Tenseur_ns2BB& curb,TabOper <Tenseur_ns2BB>& dcurb
,Tableau <EnuTypeCL> const & tabTypeCL,Tableau <Coordonnee3> const & vplan);
// test si la courbure est anormalement trop grande
// inf_normale : indique en entrée le det mini pour la courbure en locale
// retour 1: si tout est ok,
// 0: une courbure trop grande a été détecté
int Test_courbure_anormale3(double inf_normale,const Tableau<Coordonnee3>& tab_coor
, const BaseB & aiB , const BaseH & aiH);
// routine (4) generale de calcul de la courbure
// cas 4: calcul de la courbure à partir d'un polynôme passant par les 6 points
Tenseur_ns2BB Courbure4
( const Tableau<Coordonnee3>& tab_coor, const BaseB & aiB , const BaseH & aiH
,Tableau <EnuTypeCL> const & tabTypeCL,Tableau <Coordonnee3> const & vplan);
// routine (4) generale de calcul de la courbure et de sa variation
// en sortie : curb , la courbure b11,b12,b22
// dcurb , la variation de courbure.
// cas 4: calcul de la courbure à partir d'un polynôme passant par les 6 points
void Dcourbure4 ( const Tableau<Coordonnee3>& tab_coor, const BaseB & aiB
, const Tableau <BaseB>& DaiB,const BaseH & aiH
, const Tableau <BaseH>& DaiH,Tenseur_ns2BB& curb,TabOper <Tenseur_ns2BB>& dcurb
,Tableau <EnuTypeCL> const & tabTypeCL,Tableau <Coordonnee3> const & vplan);
// test si la courbure est anormalement trop grande
// inf_normale : indique en entrée le det mini pour la courbure en locale
// retour 1: si tout est ok,
// 0: une courbure trop grande a été détecté
int Test_courbure_anormale4(double inf_normale,const Tableau<Coordonnee3>& tab_coor
, const BaseB & aiB , const BaseH & aiH);
// programme de vérification par différences finies des dérivées
void Verif_Dcourbure( const Tableau<Noeud *>& tab_noeud,bool gradV_instantane
,Mat_pleine const & tabdphiS,int nombre_noeud,Vecteur const & tabphiS
,Mat_pleine const & tabdphiH,Vecteur const& tabphiH,const Epai* epais
,Tableau <EnuTypeCL> const & tabTypeCL,Tableau <Coordonnee3> const & vplan);
// initialisation des conteneurs de retour des méthodes
void Init_conteneur_de_retour_pourFacette();
};
/// @} // end of group
#endif