Herezh_dev/Resolin/Resolution_Condi/Condilineaire.h

232 lines
12 KiB
C++

// 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/>.
/************************************************************************
* DATE: 23/01/97 *
* $ *
* AUTEUR: G RIO (mailto:gerardrio56@free.fr) *
* $ *
* PROJET: Herezh++ *
* $ *
************************************************************************
* BUT: Definition d'un container pour une condition limite *
* lineaire. *
* $ *
* '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * *
* VERIFICATION: *
* *
* ! date ! auteur ! but ! *
* ------------------------------------------------------------ *
* ! ! ! ! *
* $ *
* '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' *
* MODIFICATIONS: *
* ! date ! auteur ! but ! *
* ------------------------------------------------------------ *
* $ *
************************************************************************/
#ifndef CONDILINEAIRE_H
#define CONDILINEAIRE_H
#include "Noeud.h"
#include "Nb_assemb.h"
#include <stdlib.h>
#ifdef UTILISATION_MPI
#include <boost/serialization/split_member.hpp>
#include <boost/serialization/string.hpp>
#include "mpi.h"
#include <boost/mpi/environment.hpp>
#include <boost/mpi/communicator.hpp>
#include <boost/serialization/string.hpp>
#include <boost/mpi.hpp>
namespace mpi = boost::mpi;
#endif
/// @addtogroup Les_classes_Matrices
/// @{
///
class Condilineaire
{ // surcharge de l'operator de lecture typée
// en fait ces fonctions ne doivent pas être utilisées, elles existent uniquement
// pour que Tableau_T puisse exister
friend istream & operator >> (istream & ent, Condilineaire &)
{ Sortie(1); return ent;}; // erreur
// surcharge de l'operator d'ecriture typée
friend ostream & operator << (ostream & sort , const Condilineaire &)
{ Sortie(1); return sort;}; // erreur
public :
// CONSTRUCTEURS :
// par defaut
Condilineaire () :
pt(),val(),beta(0.),t_noeud(),t_enu(),casAssemb()
,Uk_impose(ConstMath::tresgrand)
{} ;
// cas ou l'on connait toutes les infos, sauf Uk_impose, qui est une variable de stockage gérée indépendament
Condilineaire (Tableau <Enum_ddl>& t_enuu, const Tableau<int> & ptt, const Vecteur& vall
, double betar,int posiddl, const Tableau < Noeud *>& t_n) :
pt(ptt),val(vall),beta(betar),iddl(posiddl),t_noeud(t_n)
,t_enu(t_enuu),casAssemb()
,Uk_impose(ConstMath::tresgrand)
{};
// cas ou l'on connait les infos relatives uniquements aux noeuds, aux enum ddl
Condilineaire(Tableau <Enum_ddl>& t_enuu, const Tableau < Noeud *>& t_n) :
t_noeud(t_n),t_enu(t_enuu),casAssemb()
{};
// de copie
Condilineaire (const Condilineaire& a) :
pt(a.pt),val(a.val),beta(a.beta),iddl(a.iddl),t_noeud(a.t_noeud)
,t_enu(a.t_enu),casAssemb(a.casAssemb),Uk_impose(a.Uk_impose)
{ };
// DESTRUCTEUR :
~Condilineaire () {};
// METHODES PUBLIQUES :
// surcharge de l'opérateur =
Condilineaire& operator = (const Condilineaire& cond);
inline const Tableau<int>& Pt_t() const{ return pt;};
Tableau<int>& ChangePt() { return pt;}; // acces lecture / écriture
inline const Vecteur& Val() const{ return val;};
Vecteur& Valchange() {return val;}; // acces lecture / écriture
void ChangeCoeff(const Vecteur& v) {val=v;};
inline double Beta() const { return beta;};
double& BetaChange() { return beta;}; // acces lecture / écriture
void ChangeBeta(const double& x) { beta = x;};
// dans le cas de la mise en place de la CL à partir d'un changement de repère, on peut stocker la valeur imposée avant chg de repère
// cette valeur a imposer sur le ddl avant changement de repère, correspondra à beta après chg de repère
// Uk_impose sert uniquement de stockage, mais n'est pas forcément cohérent avec la CL, sa manipulation est faite en dehors de la classe
// via les deux méthodes qui suivent
void ChangeUk_impose(double Uk_new) {Uk_impose=Uk_new;};
// lorsque la valeur retourné par Val_Uk_impose() == ConstMath::tresgrand, cela signifie qu'elle n'est pas a considérer
const double & Val_Uk_impose() const {return Uk_impose;};
Noeud* Noe() {return t_noeud(1);}; // acces lecture / écriture
void Change_tab_enum(const Tableau <Enum_ddl> & t_enuu) {t_enu = t_enuu;};
// le tableau de noeuds associé
const Tableau < Noeud *>& TabNoeud() const { return t_noeud;};
void ChangeTabNoeud(const Tableau < Noeud *>& t_n) {t_noeud = t_n;};
// Iddl() -> le numéro d'ordre dans sa famille, du ddl bloqué
// NB: ce n'est pas la position du ddl dans le noeud !!, cette dernière est: Tab_Enum()(1)
inline const int& Iddl() const { return iddl;};
int& ChangeIddl() { return iddl;}; // acces lecture / écriture
// changement de la taille des tableaux de pointeur et valeurs
void Change_taille(int taille) {pt.Change_taille(taille); val.Change_taille(taille);};
// mise en place des pointeurs de ddl d'assemblage
const Condilineaire& ConditionPourPointeursAssemblage(const Nb_assemb& nb_casAssemb);
const Nb_assemb& CasAssemb() const {return casAssemb;};
// retour du tableau d'énuméré correspondant aux coefficients de la CLL
const Tableau <Enum_ddl >& Tab_Enum() const {return t_enu;};
// ramène la différence maxi qui existe entre les numéros de noeuds de la condition linéaire
// peut-être utilisé pour calculer une largeur de bande par exemple
// important: cette méthode n'est valide que si les numéros de noeuds sont tous différents
// donc que la numérotation interne des noeuds a été changé pour cela
// NB: en fonctionnement normal, ce n'est pas le cas ! sauf dans le cas où un seul maillage existe
// voir LesMaillages::Renumerotation( pour un exemple d'utilisation
int DiffMaxiNumeroNoeud()const;
// ramène la largeur de bande en ddl
// à cause de la condition linéaire
// casAssemb : donne le cas d'assemblage a prendre en compte
// les condi linéaires ne donnent pas des largeurs de bande sup et inf égales !!!
// I/O : demi = la demi largeur de bande maxi ,
// total = le maxi = la largeur sup + la largeur inf +1
void Largeur_Bande(int& demi,int& total,const Nb_assemb& casAssemb);
// affichage à l'écran des infos de la CL
void Affiche() const ;
//----- lecture écriture de restart -----
// la lecture ramène en retour le numéro de maillage et le numéro de
// noeud sur lequel s'applique la condition limite
// il est nécessaire ensuite d'utiliser la fonction Change_noeud pour`
// attibuer le noeud
void Lecture_base_info(Tableau <int>& numMaillage, ifstream& ent,Tableau <int>& numNoeud) ;
void Ecriture_base_info(ofstream& sort) ;
#ifdef UTILISATION_MPI // spécifique au calcul parallèle
// stockage dans un unique vecteur, des infos à partir de l'indice rang inclus
// correspond à une sérialisation des infos
// ramène le positionnement dans v pour un prochain enreg, sauf si > à la taille de v
// dans ce cas ramène 0
int Pack_vecteur(Vecteur& v,int rang) const;
// taille du conteneur actuel de la condition linéaire
int Taille_Pack() const;
// modification des infos à partir de l'indice rang inclus en fonction du vecteur passé en paramètre
// correspond à une désérialisation
// ramène le positionnement dans v pour un prochain enreg, sauf si > à la taille de v
// dans ce cas ramène 0
// on passe un pointeur de fonctions qui ramène un noeud en fonction d'un numéro de maillage et d'un
// numéro de noeud, ceci pour éviter de passer toute l'instance de la classe Les_maillages
template <class T> int UnPack_vecteur(T& instance,const Vecteur& v,int rang,
Noeud & (T::*Ptfonc) (int num_mail,int num_noeud) const );
#endif
protected :
// VARIABLES PROTEGEES :
Tableau<int> pt; //tableau des pointeurs de ddl concerne, pt(i) = la position du ddl i
// dans la matrice globale
Vecteur val; // tableau des coefficients de la condition lineaire
double beta; // valeur beta a laquelle est egale la condition lineaire
// dans le cas de la mise en place de la CL à partir d'un changement de repère, on peut stocker la valeur imposée avant chg de repère
double Uk_impose; // valeur a imposer sur le ddl avant changement de repère, qui correspondra à beta après chg de repère
// Uk_impose sert uniquement de stockage, mais n'est pas forcément cohérent avec la CL, sa manipulation est faite en dehors de la classe
// via : ChangeUk_impose et Val_Uk_impose
Nb_assemb casAssemb; // le cas d'assemblage associé
// le blocage de condition est appliquee sur le ddl numero "iddl" du noeud "noe"
Tableau <Enum_ddl > t_enu; // tableau des identificateur de ddl de la CLL
// t_enu(1) est l'identificateur du ddl qui est bloqué pour la CLL
// lorsque seul t_enu(1) existe, cela signifie qu'il faut construire
// les indices,
// iddl -> le numéro d'ordre dans sa famille, du ddl bloqué
// NB: ce n'est pas la position du ddl dans le noeud !!, cette dernière est: Tab_Enum()(1)
int iddl;
// le tableau des noeuds de la CLL, le premier contient la condition
Tableau < Noeud *> t_noeud;
// METHODES PROTEGEES :
};
// pour faire de l'inline: nécessaire avec les templates
// on n'inclut que les méthodes templates
#include "Condilineaire_2.cc"
#define Condilineaire_deja_inclus
/// @} // end of group
#endif