// 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: .
/************************************************************************
* DATE: 23/01/97 *
* $ *
* AUTEUR: G RIO (mailto:gerardrio56@free.fr) *
* $ *
* PROJET: Herezh++ *
* $ *
************************************************************************
* BUT: Gestion des differentes conditions limites *
* $ *
* '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' *
* VERIFICATION: *
* *
* ! date ! auteur ! but ! *
* ------------------------------------------------------------ *
* ! ! ! ! *
* $ *
* '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' *
* MODIFICATIONS: *
* ! date ! auteur ! but ! *
* ------------------------------------------------------------ *
* $ *
************************************************************************/
#ifndef LESCONDLIM_H
#define LESCONDLIM_H
#include "LectBloc_T.h"
#include "Tableau_T.h"
#include "DdlLim.h"
#include "UtilLecture.h"
#include "LesReferences.h"
#include "MotCle.h"
#include "LesMaillages.h"
#include "CondLim.h"
#include "Condilineaire.h"
#include "Nb_assemb.h"
#include "LesCourbes1D.h"
#include "LesFonctions_nD.h"
#include "ReferenceNE.h"
#include "ReferenceAF.h"
#include "Basiques.h"
#include "I_O_Condilineaire.h"
#include "Temps_CPU_HZpp.h"
/** @defgroup Les_classes_relatives_aux_conditions_limites
*
* BUT:Gestion des differentes conditions limites
*
* \author Gérard Rio
* \version 1.0
* \date 23/01/97
* \brief Gestion des differentes conditions limites
*
*/
/// @addtogroup Les_classes_relatives_aux_conditions_limites
/// @{
///
class LesCondLim
{
public :
// CONSTRUCTEURS :
LesCondLim (); // par defaut
// DESTRUCTEUR :
~LesCondLim ();
// METHODES PUBLIQUES :
// lecture des conditions limites : ddl bloque
void Lecture1(UtilLecture & entreePrinc,LesReferences& lesRef);
// lecture des conditions limites linéaires
void Lecture2(UtilLecture & entreePrinc,LesReferences& lesRef);
// lecture des conditions limites : initialisation
void Lecture3(UtilLecture & entreePrinc,LesReferences& lesRef);
// affichage des informations concernant les conditions limites
void Affiche() const ; // affichage de tous les infos
void Affiche1() const ; // affichage des ddl bloques
void Affiche2() const ; // affichage des conditions limites linéaires
void Affiche3() const ; // affichage des ddl d'initialisation
// introduction des données et variables pour leurs emplois futures, avec init par défaut
void IntroductionDonnees (LesMaillages * lesMail,LesReferences* lesRef
,LesCourbes1D* lesCourbes1D,LesFonctions_nD* lesFonctionsnD);
// initialisation des ddl avec le tableau de ddl d'init
// verif de l'existence de tous les ddl (initialisation et imposes)
// ajout si necessaire, dans ce dernier cas l'initialisation est a zero
// choix = false : indique qu'il faut initialiser que les ddl a t
// choix = true : indique qu'il faut initialiser les ddl a t et t+dt
// vérification de l'existence des courbes de charge adoc si nécessaire
// cas : indique le cas d'association de ddl en cours, ces ddl sont gérés globalement, c-a-d lorsque
// le statut d'un ddl est modifié (de bloqué à non bloqué par exemple) tous les ddl associés ont
// leur statut modifié de manière équivalente
// =0 pas d'association
// =1 association X V GAMMA
void Initial(LesMaillages * lesMail,LesReferences* lesRef,LesCourbes1D* lesCourbes1D
,LesFonctions_nD* lesFonctionsnD,bool choix,int cas);
// // mise à jour de l'initialisation, par exemple après un restart
// // même paramètres que Initial, par contre ici il n'y a aucune création
// void Re_initial(LesMaillages * lesMail,LesReferences* lesRef,LesCourbes1D* lesCourbes1D,bool choix,int cas);
// initialisation du nombre de cas d'assemblage
// si inf au nombre actuel, aucune action
void InitNombreCasAssemblage(int nb_cas)
{ if (nb_cas > condlim.Taille())
condlim.Change_taille(nb_cas);
};
// incrementation des coordonnees a t+dt et des ddl en fonctions des ddl imposes
// et du chargement
// coef: est un facteur multiplicatif des ddl sans courbes de charge,
// est suposé intégrer déjà le multiplicateur général
// en fait du chargement impose
// mult_gene : multiplicateur général de tous les chargements
// deltat : incrément de temps actuel
// temps : le temps courant où sont calculées les conditions
// ch_statut : indique s'il y a changement ou non de statut des conditions limites (pour les ddl aux noeuds)
// c-a-d un ddl qui passe de bloqué à non bloqué ou inversement: il s'agit uniquement des ddl aux noeuds
// c-a-d ceux qui ont une influence sur la mise en place des cl sur la raideur et le résidu
// cas : indique le cas d'association de ddl en cours, ces ddl sont gérés globalement, c-a-d lorsque
// le statut d'un ddl est modifié (de bloqué à non bloqué par exemple) tous les ddl associés ont
// leur statut modifié de manière équivalente
// =0 pas d'association
// =1 association X V GAMMA
// lorsque en_ddl est égal à NU_DDL, cela signifie que l'on met les conditions limites sur tous les
// ddl de noeud actifs
// lorsque en_ddl est différent de NU_DDL, il donne le type des seules ddl pour lesquels on met les
// conditions de blocage: par exemple X1 -> blocage sur X1,X2,X3 selon la dimension
void MiseAJour_tdt
(const double& mult_gene,LesMaillages * lesMail,const double& deltat,const LesReferences* lesRef
,const double& temps,LesCourbes1D* lesCourbes1D,LesFonctions_nD* lesFonctionsnD
,const double& coef,bool& ch_statut
,int cas , Enum_ddl en_ddl = NU_DDL);
// mise en place de la répercussion sur les noeuds des conditions linéaires imposées externes (par les données d'entrées),
// ne prend pas en charge par exemple les CL dues aux contacts(gérés par CL)
// pour les paramètres: voir MiseAJour_tdt
void MiseAJour_condilineaire_tdt
(const double& mult_gene,LesMaillages * lesMail,const double& deltat,LesReferences* lesRef
,const double& temps,LesCourbes1D* lesCourbes1D,LesFonctions_nD* lesFonctionsnD
,const double& coef,bool& ch_statut
,int cas ,Enum_ddl en_ddl = NU_DDL);
// validation des conditions de blocages et des conditions linéaire, pour l'incrément.
// concernant l'activité des ddlLim, elle est enregistrée en fonction du temps
// idem pour les conditions linéaires
void Validation_blocage (LesReferences* lesRef,const double& temps);
// test s'il y a changement de statut pour le temps indiqué par rapport à la situation actuelle ou pas
// n'effectue aucune autre opération
// si en_ddl est différent de NU_DDL on test le changement de statut uniquement pour le ddl en_ddl
bool Changement_statut(const LesMaillages * lesMail,const LesReferences* lesRef
,LesFonctions_nD* lesFonctionsnD
,const double& temps,const Enum_ddl en_ddl = NU_DDL) ;
// récupération des tableaux d'indices généraux des ddl bloqués
// cas : donne le type d'association de ddl que l'on veut
// =0 -> pas d'association
// =1 -> association de Xi avec Vi avec Gammai
// t_assemb: donne pour chaque type d'association, le numéro d'assemblage correspondant au different ddl
// de l'association
// cas=1 -> numéro d'assemblage de X1 puis V1 puis GAMMA1
// : en sortie une liste de Gene_asso, correspondant à tous les ddl bloqués et les
// les ddl associés
// définition d'un conteneur pour la routine Tableau_indice
class Gene_asso
{ public :
Gene_asso () : ty_prin(NU_DDL),pointe() {};
Gene_asso (Enum_ddl ty_prin,const Tableau & pointes) :
ty_prin(ty_prin),pointe(pointes) {};
Gene_asso (const Gene_asso& a) : ty_prin(a.ty_prin),pointe(a.pointe) {};
Gene_asso& operator= (const Gene_asso& a)
{ty_prin=a.ty_prin;pointe=a.pointe;return (*this);};
bool operator== (const Gene_asso& a) const
{if((ty_prin==a.ty_prin)&&(pointe==a.pointe)) return true;else return false;};
bool operator!= (const Gene_asso& a) const
{if ( (*this)==a ) return true; else return false;};
Enum_ddl ty_prin; // le ddl principal bloqué
Tableau pointe; // la position générale des ddl, principal et secondaire
// pour le cas 1 : pointe(k) -> la position du ddl Xi , puis Vi puis Gammai
};
list Tableau_indice(const LesMaillages * lesMail,const Tableau & t_assemb
,const LesReferences* lesRef,const double& temps,int cas );
// mise en place des conditions limites sur les matrices et second membres
// (autres que les conditions linéaires)
// nb_casAssemb : le cas d'assemblage
// cas : indique un type d'association de ddl
// = 0 -> pas d'association, seules les ddl fournis par l'utilisateur sont considéré
// = 1 -> association de Xi Vi Gammai, qui sont pris en compte dès lors que l'un
// a été fixé par l'utilisateur
// vec2 : est un second vecteur éventuel (si != NULL) sur lequel on impose les mêmes CL que vecglob
// mais sans sauvegarde (correspond par exemple à une partie de vecglob)
void ImposeConLimtdt(LesMaillages * lesMail,LesReferences* lesRef,
Mat_abstraite & matglob,Vecteur& vecglob
,const Nb_assemb& nb_casAssemb,int cas,Vecteur* vec2);
// mise en place des conditions limites sur le second membres
// nb_casAssemb : le cas d'assemblage
// cas : indique un type d'association de ddl
// = 0 -> pas d'association, seules les ddl fournis par l'utilisateur sont considéré
// = 1 -> association de Xi Vi Gammai, qui sont pris en compte dès lors que l'un
// a été fixé par l'utilisateur
// vec2 : est un second vecteur éventuel (si != NULL) sur lequel on impose les mêmes CL que vecglob
// mais sans sauvegarde (correspond par exemple à une partie de vecglob)
void ImposeConLimtdt(LesMaillages * lesMail,LesReferences* lesRef,
Vecteur& vecglob,const Nb_assemb& nb_casAssemb,int cas,Vecteur* vec2);
// mise en place des conditions limites sur deux matrices
// utilisé par exemple pour le flambement
// la première matrice est initialisée avec des 1 sur la diagonale
// la seconde avec des 0 sur la diagonale
// nb_casAssemb : le cas d'assemblage
// cas : indique un type d'association de ddl
// = 0 -> pas d'association, seules les ddl fournis par l'utilisateur sont considéré
// = 1 -> association de Xi Vi Gammai, qui sont pris en compte dès lors que l'un
// a été fixé par l'utilisateur
void ImpConLimtdt2Mat(LesMaillages * lesMail,LesReferences* lesRef,
Mat_abstraite & matglob,Mat_abstraite & matgeom
,const Nb_assemb& nb_casAssemb,int cas);
// retourne la valeur absolu du maxi des efforts exterieurs
// et le numero ili du ddl correspondant dans l'assemblage global
double MaxEffort(int & ili,const Nb_assemb& nb_casAssemb)
{ return condlim(nb_casAssemb.n).MaxEffort(ili);};
// calcul des reactions et stockage des valeurs
// ceci dans le cas ou il n'y a pas de conditions lineaires appliquee
// on se sert des valeurs sauvegardees lors de la mise en place des CL bloquees
// nb_casAssemb : le cas d'assemblage
// cas : indique un type d'association de ddl
// = 0 -> pas d'association, seules les ddl fournis par l'utilisateur sont considéré
// = 1 -> association de Xi Vi Gammai, qui sont pris en compte dès lors que l'un
// a été fixé par l'utilisateur
void CalculReaction(LesMaillages * lesMail,LesReferences* lesRef
,const Nb_assemb& nb_casAssemb,int cas);
// récupération des reactions initiales, avant les rotations dues aux conditions linéaires
// il s'agit des réactions dues aux ddl bloqués et dues aux conditions linéaires
// et calcul des torseurs de réaction
void ReacAvantCHrepere(Vecteur& residu,LesMaillages * lesMail,
LesReferences* lesRef,const Nb_assemb& nb_casAssemb,int cas);
// récupération des reactions= residu et stockage des valeurs
// NB: après changement de repère, il n'y a plus que des ddl bloqués
// cas : indique un type d'association de ddl
// = 0 -> pas d'association, seules les ddl fournis par l'utilisateur sont considéré
// = 1 -> association de Xi Vi Gammai, qui sont pris en compte dès lors que l'un
// a été fixé par l'utilisateur
void ReacApresCHrepere(Vecteur& residu,LesMaillages * lesMail,
LesReferences* lesRef,const Nb_assemb& nb_casAssemb,int cas);
// affichage sur la sortie sort des reactions
void Affiche_reaction(ofstream& sort,const LesMaillages * lesMail) const ;
// ------------------ conditions linéaires externes ----------------------------------------------
// mise en place de condition externe lineaires
// expression de la raideur et du second membre dans un nouveau repere
// ramène si oui ou non, il y a eu un changement effectué
// vec2 : est un second vecteur éventuel (si != NULL) sur lequel on impose les mêmes CL que vecglob
// mais sans sauvegarde (correspond par exemple à une partie de vecglob)
bool CoLinCHrepere_ext(Mat_abstraite & matglob,Vecteur& vecglob
,const Tableau & tabCondLine
,const Nb_assemb& nb_casAssemb,Vecteur* vec2);
// blocage des seconds membres pour les conditions lineaires
// vec2 : est un second vecteur éventuel (si != NULL) sur lequel on impose les mêmes CL que vecglob
// mais sans sauvegarde (correspond par exemple à une partie de vecglob)
inline void CoLinBlocage(Mat_abstraite & matglob,Vecteur& vecglob
,const Nb_assemb& nb_casAssemb,Vecteur* vec2)
{ condlim(nb_casAssemb.n).CondlineaireImpose ( matglob, vecglob,vec2);};
// retour des ddl dans le repere general, ceci dans le cas d'utilisation
// de conditions lineaires
inline void RepInitiaux( Vecteur& sol,const Nb_assemb& nb_casAssemb)
{ condlim(nb_casAssemb.n).RepInitiaux(sol); };
// mise en place de condition externe lineaires en une opération
// retour de la raideur et du second membre sans changement de repere
// ramène si oui ou non, il y a eu un changement effectué
// vec2 : est un second vecteur éventuel (si != NULL) sur lequel on impose les mêmes CL que vecglob
// mais sans sauvegarde (correspond par exemple à une partie de vecglob)
bool CoLinUneOpe_ext(Mat_abstraite & matglob,Vecteur& vecglob
,const Tableau & tabCondLine
,const Nb_assemb& nb_casAssemb,Vecteur* vec2);
// -------- conditions linéaires internes: imposées par les conditions limites en entrée -----------
// mise en place des conditions linéaires imposées par les données d'entrée
// expression de la raideur et du second membre dans un nouveau repere
// ramène si oui ou non, il y a eu un changement effectué
// vec2 : est un second vecteur éventuel (si != NULL) sur lequel on impose les mêmes CL que vecglob
// mais sans sauvegarde (correspond par exemple à une partie de vecglob)
bool CoLinCHrepere_int(Mat_abstraite & matglob,Vecteur& vecglob,const Nb_assemb& nb_casAssemb,Vecteur* vec2);
// effacement du marquage de ddl bloque du au conditions lineaire imposées par les conditions d'entrée
void EffMarque();
// def de la largeur de bande en fonction des conditions linéaire limite en entrée
// casAssemb : donne le cas d'assemblage en cours
// les condi linéaires ne donnent pas des largeurs de bande sup et inf égales !!!
// demi = la demi largeur de bande ,
// total = le maxi = la largeur sup + la largeur inf +1
// cumule = la somme des maxis, ce qui donnera la largeur finale, due à des multiples multiplications: une par conditions linéaires
// dans le cas où on tiens compte des conditions linéaires par rotation (c-a-d sans multiplicateur ou pénalisation)
// en retour, ramène un booleen qui :
// = true : si la largeur de bande en noeud est supérieure à 1
// = false : si non, ce qui signifie dans ce cas qu'il n'y a pas d'augmentation de la largeur
// en noeud
bool Largeur_Bande(int& demi,int& total,const Nb_assemb& casAssemb,LesMaillages * lesMail,LesReferences* lesRef
,int& cumule);
// création d'un tableau de condition linéaire, correspondant à toutes les conditions linéaires d'entrées
// qu'elles soient actives ou pas (a prior cette méthode est conçu pour donner des infos relativement à la largeur
// de bandes en noeuds due aux CLL)
// chacune des condition ne contient "d'exploitable" que le tableau de noeuds associés à la CLL,
Tableau > ConnectionCLL(const LesMaillages * lesMail,const LesReferences* lesRef) const;
// idem ConnectionCLL avec une liste, mais spécifiquement les conditions de type "stricte_egalite" entre ddl de noeud
// correspondant à toutes les conditions linéaires d'entrées actives uniquement
// (a priori cette méthode est conçu pour donner des infos pour condenser les pointeurs d'assemblages:
// LesMaillages::MiseAJourPointeurAssemblage() )
// chacune des condition ne contient "d'exploitable" que le tableau de noeuds associés à la CLL, et le type enumere de ddl
list ConnectionCLL_stricte_egalite
(const LesMaillages * lesMail,const LesReferences* lesRef) const;
// récupération du tableau de conditions linéaires en cours
//résultant de l'application des conditions lues (indépendamment du contact par exemple)
// mis à jour après la méthode: MiseAJour_condilineaire_tdt
const Tableau < Tableau >& Tab_CLinApplique() const {return tab_CLinApplique;};
// indique si oui ou non il y a des conditions limites linéaires en entrée
bool ExisteCondiLimite() const {return tab_iocondiline.Taille();};
// ----------------------- fin conditions linéaires -------------------------------------------
//initialisation, mise a zero des sauvegarde
void InitSauve(const Nb_assemb& nb_casAssemb);
// lecture de donnée en fonction d'un indicateur : int type
// pour l'instant ne fait rien
void LectureDonneesExternes(UtilLecture& ,LesReferences& ,const int ,const string&) {};
// affichage et definition interactive des commandes pour les conditions limites CL
void Info_commande_LesCondLim1(UtilLecture & entreePrinc);
// affichage et definition interactive des commandes pour les conditions limites CLL
void Info_commande_LesCondLim2(UtilLecture & entreePrinc);
// affichage et definition interactive des commandes pour les initialisations
void Info_commande_LesCondLim3(UtilLecture & entreePrinc);
//----- lecture écriture de restart -----
// cas donne le niveau de la récupération
// = 1 : on récupère tout
// = 2 : on récupère uniquement les données variables (supposées comme telles)
void Lecture_base_info(ifstream& ent,const int cas,LesReferences& lesRef,LesCourbes1D& lesCourbes1D
,LesFonctions_nD& lesFonctionsnD);
// cas donne le niveau de sauvegarde
// = 1 : on sauvegarde tout
// = 2 : on sauvegarde uniquement les données variables (supposées comme telles)
void Ecriture_base_info(ofstream& sort,const int cas);
//------- temps cpu -----
// retourne temps cumulé pour imposer les CL imposées
const Temps_CPU_HZpp& Temps_cpu_CL() const {return tempsCL;};
// retourne le temps cumulé pour imposer les CLL
const Temps_CPU_HZpp& Temps_cpu_CLL() const {return tempsCLL;};
// --- conteneur pour les réactions -----
class ReactStoc
{ public :
// surcharge de l'operator de lecture typée
friend istream & operator >> (istream &, ReactStoc &);
// surcharge de l'operator d'ecriture typée
friend ostream & operator << (ostream &, const ReactStoc &);
//Surcharge d'operateur logique
bool operator == ( const ReactStoc& a) const
{ return ((numMail==a.numMail)&&(numNoeud==a.numNoeud)
&&(ddl==a.ddl)&&(casAss==a.casAss));
};
bool operator != ( const ReactStoc& a) const { return !(*this == a);};
// !*!*!*! classement uniquement sur le numéro de noeud !*!*!*!
// --->> non: changement 3/1/2018
bool operator < ( const ReactStoc& a) const
{if (numMail < a.numMail) return true;
else if (numMail == a.numMail) return (numNoeud < a.numNoeud);
else // cas où numMail > a.numMail
return false;
//return (numNoeud < a.numNoeud);
};
bool operator > ( const ReactStoc& a) const { return !(*this < a);};;
public : int numMail; // numero de maillage
int numNoeud ; // numero de noeud
Ddl ddl; // le ddl bloque
int casAss; // cas d'assemblage
};
class TorseurReac
{// surcharge de l'operator de lecture typée
friend istream & operator >> (istream &, TorseurReac &);
// surcharge de l'operator d'ecriture typée
friend ostream & operator << (ostream &, const TorseurReac &);
public :
// constructeurs
TorseurReac():existe_torseur_reac(false),resultante(),moment(),bloque_ou_CLL(true) {};
TorseurReac(const TorseurReac& a):
existe_torseur_reac(a.existe_torseur_reac),resultante(a.resultante)
,moment(a.moment),bloque_ou_CLL(a.bloque_ou_CLL) {};
// méthodes
void Activation(int dima) {existe_torseur_reac=true;resultante.Change_dim(dima);
moment.Change_dim(dima);};
void Zero_init_torseur() {resultante.Zero();moment.Zero();};
// données
bool existe_torseur_reac; // indique si le Torseur doit-être calculé ou non
Coordonnee resultante; // la résultante du torseur
Coordonnee moment; // le moment du torseur par rapport à l'origine
bool bloque_ou_CLL; // true provient d'un ddl bloqué, false provient d'une CLL
};
// retourne les réactions aux conditions limites à un noeud noe d'un maillage mail
// s'il n'y a pas de conditions limites : retour d'une liste vide
// const list& Reaction_noeud_mail(int mail,int noeud) const ;
// retourne la liste des types de ddl actuellement imposés
// aux noeuds pour chaque maillage, la liste est exhaustive
// elle contiend tous les types au moins une fois utilisée
// cela ne signifie pas que le ddl en question soit présent
// pour tous les noeud du maillage considéré
// - le tableau de retour est indicé par le numéro de maillage correspondant
// - il y a une liste par maillage
Tableau > Les_type_de_ddl_en_reaction() const;
// retourne la liste des torseurs de réaction actuellement actif pour les maillages
// appelons tab_lili la liste:
// - tab_lili(i) concerne le maillage nb i
// - les éléments de tab_lili(i) sont les noms des références qui conduisent à un torseur de réaction
// actif, et un indice de gestion utilisé par LesCondLim pour retrouver
// rapidemment les informations
Tableau < List_io > TabListTorseurReaction(const LesMaillages & lesmail) const;
// retourne le torseur de réaction correspondant à l'indice i
const TorseurReac & Torseur_de_reaction(int i) const {return tab_torseurReac(i);};
private :
// VARIABLES PROTEGEES :
Tableau tabBloq; // tableau des ddl bloques
Tableau tab_torseurReac; // tableau des torseurs de réaction
// relatif aux ddl bloqués et aux conditions linéaires
// de 1 à ttRG.Taille() on a les torseurs relatifs à tabBloq
// puis de ttRG.Taille() à la fin c-a-d ttRG.Taille()+ttRGCLL.Taille(),
// on a les torseurs relatifs à tab_iocondiline
// un tableau, qui permet de passer de tabBloq à tab_torseurReac
Tableau ttRG; // tabBloq(i) contribue au torseur tab_torseurReac(ttRG(i))
// ttorBloq(i) contient tous les numéros de tabBloq qui contribue au torseur i
Tableau < List_io > ttorBloq;
Tableau tabInit; // tableau des ddl d'initialisation
Tableau reaction; // les reactions pour les ddl bloqués
Tableau reaction_CLin; // les reactions pour les conditions linéaires
Tableau reactionApresCHrepere; // les reactions après CHrepere
// tableau des conditions linéaires a imposer par les données d'entrée
Tableau tab_iocondiline;
Tableau < Tableau > tab_CLinApplique; // tableau des conditions linéaires
//résultant de l'application de tab_iocondiline
// un tableau à deux dim, qui permet de passer de tab_CLinApplique à tab_torseurReac
Tableau < Tableau > ttRGCLL; // tab_CLinApplique(i)(j) contribue au torseur tab_torseurReac(ttRGCLL(i)(j))
// ttorCLL(i) contient tous les numéros de tab_iocondiline qui contribue au torseur i, avec
// le premier élément de l'instantce DeuxEntiers = le numéros dans tab_iocondiline, le second élement = le rang de
// la référence dans la condition linéaire
Tableau < List_io > ttorCLL;
//deux liste de noms de ref qui servent pour accèder aux grandeurs globales correspondantes
// aux composantes des torseurs de réaction
// voir: DimensionneTorseurs() :
// ttRG_noms_ref + _Re_ + i -> ième composante de Re a tdt
// et à la place de Re -> Mo pour le moment
Tableau ttRG_noms_ref; // nom générique associé aux torseurs de ddl bloqué
Tableau ttRGCLL_noms_ref; // idem pour les CLL
// une map pour faire l'association entre numéro de maillage et numéro de noeud d'une part
// et le tableau de réaction pour un accès quasi-directe
// map < string, list , std::less > map_reaction;
int nb_maillage; // sauvegarde du nombre de maillage
Tableau < CondLim > condlim; // les fonctions et données qui permettent d'imposer les cl
// aux matrices, aux second membres, de remonter aux efforts apres
// resolution etc ..., le tableau est indicé par le numéro de cas d'assemblage
//------- temps cpu -----
Temps_CPU_HZpp tempsCL; // temps cumulé pour imposer les CL imposées
Temps_CPU_HZpp tempsCLL; // temps cumulé pour imposer les CLL
// ----fonctions internes pour simplifier
// cas de l'initialisation: prise en compte de l'appartenance à un groupe
// fixe : donne le type d'initialisation que l'on veut
// une_variable: indique si le ddl est une variable (=true) ou une donnée (=false)
void Init_appart_groupe(bool une_variable,Enum_ddl a,bool fixe,Noeud& noe, int cas,bool choix);
//cas courant: mise en place du blocage sur un ddl ou un groupe si besoin est
void Mise_cl(int nd,DdlLim& ddl,Enum_ddl a,Noeud& noe, int cas);
// cas courant : on retire le blocage sur un ddl ou un groupe si besoin est
void Retire_cl(int nd,DdlLim& ddlbloqu,Enum_ddl enu,Noeud& noe, int cas);
// vérification qu'il n'y a pas de surcharge de blocage
// choix indique si l'on vérifie à t ou à tdt
void Verif_surcharge_blocage(const LesMaillages * lesMail,const LesReferences* lesRef,const double& temps,int cas) ;
// fourni la liste des ddl associé de même dim, pour un du groupe et en fonction du cas d'association
// ramène une référence sur tab_travail qui est mis à jour
Tableau & Ddl_associe( Ddl& ddl,Noeud& noe,Tableau & tab_travail,int cas);
// cas particulier des mouvements solides, dans le second passage pour la méthode MiseAJour_tdt
void MiseAjour_tdt_second_passage_mvtSolide(const double& mult_gene,LesMaillages * lesMail
,const double& deltat,int cas
,LesCourbes1D* lesCourbes1D,LesFonctions_nD* lesFonctionsnD,const double& coef
,DdlLim& tabBloq_i,const ReferenceNE & ref,const double& temps,Enum_ddl en_ddl);
// mise à jour et calcul éventuel du torseur de réaction: uniquement pour les ddl X1, X2, X3
// --> pour au final obtenir le torseur des efforts globaux résultant de l'application d'un DdlLim
void CalculTorseurReaction(TorseurReac& tr, const Noeud& noe, ReactStoc& reac);
// récupération de valeurs à un noeud pour les grandeur enu
// ici il s'agit de grandeur scalaires
Tableau Valeur_multi_interpoler_ou_calculer
(const Noeud& noe, Enum_dure temps,const List_io& enu);
// récupération de valeurs à un noeud pour les grandeur enu
// ici il s'agit de grandeurs tensorielles
void Valeurs_Tensorielles_interpoler_ou_calculer
(const Noeud& noe, Enum_dure temps,List_io& enu);
// dimensionnement du tableau des torseurs ainsi que des tableaux ttRG et ttorBloq
// en fonction de tabBloq (utilisé plusieurs fois), puis de ttRGCLL en fonction de tab_iocondiline
void DimensionneTorseurs();
// DdlLim à un noeud: mise à jour des temps min et temps max, lorsque ceci dépendent de fonction nD
void Mise_a_jour_t_minmax_ddlLim(Noeud& noe,DdlLim& ddlLim,LesFonctions_nD* lesFonctionsnD);
// DdlLim général: mise à jour des temps min et temps max, lorsque ceci dépendent de fonction nD
// ici les fct nD doivent dépendre uniquement de grandeur générale
void Mise_a_jour_t_minmax_ddlLim(DdlLim& ddlLim,LesFonctions_nD* lesFonctionsnD);
};
/// @} // end of group
#endif