Herezh_dev/Elements/Mecanique/ElemPoint/Met_ElemPoint.cc
2023-05-03 17:23:49 +02:00

121 lines
4.7 KiB
C++

// FICHIER : Met_ElemPoint.cc
// CLASSE : Met_ElemPoint
// 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-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 <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 "Met_ElemPoint.h"
// -Constructeur par defaut
Met_ElemPoint::Met_ElemPoint () :
metrique_imposee(false)
{};
// constructeur permettant de dimensionner uniquement certaine variables
// dim = dimension de l'espace, tab = liste
// des variables a initialiser
Met_ElemPoint::Met_ElemPoint (int dim_base,int nbvec,const DdlElement& tabddl,
const Tableau<Enum_variable_metrique>& tab,int nomb_noeud) :
Met_abstraite (dim_base,nbvec,tabddl,tab, nomb_noeud)
,metrique_imposee(false)
{// par défaut les composantes des gi sont définit unitaire (cf. Met_abstraite)
};
// constructeur spécifique pour un point avec une métrique imposée
// ici on ne donne pas le nombre de noeud ce qui permet de faire la différence
// avec le constructeur précédent
Met_ElemPoint::Met_ElemPoint (int dim_base,int nbvec,const DdlElement& tabddl,
const Tableau<Enum_variable_metrique>& tab) :
Met_abstraite (dim_base,nbvec,tabddl,tab, 0)
,metrique_imposee(true)
{};
// constructeur de copie
Met_ElemPoint::Met_ElemPoint (const Met_ElemPoint& a) :
Met_abstraite (a)
,metrique_imposee(a.metrique_imposee)
{};
// destructeur
Met_ElemPoint::~Met_ElemPoint () {};
//------------------ méthodes spécifiques ------------------------
// cas explicite à tdt, toutes les grandeurs sont a 0 ou tdt
// 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 sont calculées
const Met_abstraite::Umat_cont& Met_ElemPoint::Calcul_grandeurs_Umat
(bool premier_calcul)
{
// ------ pour l'instant on ne calcul rien --------
// mais ça fonctionne ensuite, cependant pour gagner du temps on courcircuite !
// return umat_cont;
if (premier_calcul)
{ // la base initiale est fixe donc pas de calcul des giB_0
// calcul de la base a t doit déjà avoir été effectué avec la méthode Mise_a_jour
Calcul_gijBB_0 (); // metrique base naturelle
Calcul_gijHH_0 (); // composantes controvariantes à 0
Jacobien_0(); // jacobien initiale
/// Calcul_gradVBB_moyen_t(tab_noeud,dphi,nombre_noeud); // gradient de vitesse moyen
Calcul_gijBB_t (); // metrique à t
Calcul_gijHH_t (); // metrique à t
};
// --- calcul des grandeurs à tdt
// calcul de la base a tdt: doit déjà avoir été effectué avec la méthode Mise_a_jour
/// Calcul_gradVBB_moyen_tdt(tab_noeud,dphi,nombre_noeud); // gradient de vitesse moyen
Calcul_gijBB_tdt (); // "
Calcul_gijHH_tdt (); // composantes controvariantes à tdt
Jacobien_tdt(); // calcul du jacobien a tdt
Calcul_giH_tdt(); // base duale à tdt
// liberation des tenseurs intermediaires
LibereTenseur();
return umat_cont;
};
// mise à jour de grandeur via les infos d'umat
// il s'agit des grandeurs suivantes: giB à 0 t et tdt,
void Met_ElemPoint::Mise_a_jour(const UmatAbaqus& umat)
{ // les giB_0 sont identiquent à la matrice identité, on ne les recalcule pas
// récup des giB_t
*giB_t = umat.giB_t;
// récup des giB_tdt
*giB_tdt = umat.giB_tdt;
};