diff --git a/Maillage/BlocDdlLim.h b/Maillage/BlocDdlLim.h
new file mode 100644
index 0000000..4b93340
--- /dev/null
+++ b/Maillage/BlocDdlLim.h
@@ -0,0 +1,230 @@
+/*! \file BlocDdlLim.h
+ \brief def classe et fonctions template pour la lecture de ddl lim.
+*/
+
+// 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-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 .
+//
+// For more information, please consult: .
+
+/************************************************************************
+ * DATE: 28/03/2004 *
+ * $ *
+ * AUTEUR: G RIO (mailto:gerardrio56@free.fr) *
+ * $ *
+ * PROJET: Herezh++ *
+ * $ *
+ ************************************************************************
+ * BUT: Gestion de divers bloc courant du fichier de lecture . *
+ * Cas où ces blocs sont relatif aux conditions limites, *
+ * et héritent de bloc classiques. *
+ * par rapport au bloc, l'apport est la gestion d'un nom_de maillage*
+ * éventuellement en plus du nom de référence. *
+ * $ *
+ * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' *
+ * *
+ * VERIFICATION: *
+ * *
+ * ! date ! auteur ! but ! *
+ * ------------------------------------------------------------ *
+ * ! ! ! ! *
+ * $ *
+ * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' *
+ * MODIFICATIONS: *
+ * ! date ! auteur ! but ! *
+ * ------------------------------------------------------------ *
+ * $ *
+ ************************************************************************/
+#ifndef BLOC_DDLLIM_T_H
+#define BLOC_DDLLIM_T_H
+
+#include "Bloc.h"
+#include "ConstMath.h"
+
+/// @addtogroup Les_classes_Ddl_en_tout_genre
+/// @{
+///
+
+///
+///
+///================================================
+/// cas d'un bloc template avec conditions limites
+///================================================
+template
+class BlocDdlLim : public Bloc_particulier
+{
+ // surcharge de l'operator de lecture
+ friend istream & operator >> (istream & entree, BlocDdlLim & coo)
+ { // lecture d'un nom de maillage éventuel
+ bool existe_nom_maillage; entree >> existe_nom_maillage;
+ if (existe_nom_maillage)
+ { string nom; entree >> nom;
+ if (coo.nom_maillage == NULL)
+ coo.nom_maillage = new string(nom);
+ else
+ *(coo.nom_maillage) = nom;
+ };
+ // puis la classe mère
+ entree >> ((Bloc_particulier&)(coo));
+ return entree;
+ }
+
+ // surcharge de l'operator d'ecriture
+ friend ostream & operator << (ostream & sort, const BlocDdlLim & coo)
+ { // tout d'abord le maillage éventuelle
+ if (coo.nom_maillage == NULL)
+ sort << false << " ";
+ else
+ sort << true << " " << *(coo.nom_maillage) << " ";
+ // puis la classe mère
+ sort << ((const Bloc_particulier&)(coo));
+ return sort;
+ }
+
+ public :
+ // VARIABLES PUBLIQUES :
+ // stockage d'un element
+ // class conforme a la specif de T de la class LectBloc_T
+
+ // Constructeur
+ BlocDdlLim () : // par defaut
+ nom_maillage(NULL),Bloc_particulier()
+ {};
+ // fonction d'une instance de Bloc_particulier
+ BlocDdlLim (const Bloc_particulier& a) : Bloc_particulier(a),nom_maillage(NULL) {};
+ // fonction d'une instance et d'un string
+ BlocDdlLim (const string& nom_mail,const Bloc_particulier& a) :
+ Bloc_particulier(a),nom_maillage(new string (nom_mail)) {};
+ // fonction d'une instance et d'un pointeur de string
+ BlocDdlLim (const string* nom_mail,const Bloc_particulier& a) :
+ Bloc_particulier(a),nom_maillage(NULL)
+ { if (nom_mail != NULL) nom_maillage = new string (*nom_mail);};
+ // de copie
+ BlocDdlLim (const BlocDdlLim& a) :
+ nom_maillage(NULL),Bloc_particulier(a)
+ {if (a.nom_maillage != NULL) nom_maillage = new string (*(a.nom_maillage));};
+ // destructeur
+ ~BlocDdlLim () {if (nom_maillage != NULL) delete nom_maillage;};
+ // retourne un pointeur de string donnant le nom du maillage associé
+ // = NULL si aucun maillage
+ const string* NomMaillage() const {return nom_maillage;};
+ // change le nom de maillage
+ // ATTENTION : Les modifications liees au changement du nom de maillage
+ // sont a la charge de l'utilisateur.
+ // le nouveau nom ne doit pas être vide !! sinon erreur
+ void Change_nom_maillage(const string& nouveau);
+ // lecture d'un bloc
+ void Lecture(UtilLecture & entreePrinc);
+ // affichage des informations
+ void Affiche() const ;
+ // surcharge des operateurs
+ bool operator == ( const BlocDdlLim& a) const;
+ BlocDdlLim& operator = (const BlocDdlLim& a);
+ bool operator != ( const BlocDdlLim& a) const { return !(*this == a);};
+
+ protected :
+ string* nom_maillage; // nom d'un maillage
+};
+/// @} // end of group
+
+
+/// lecture d'un bloc
+template
+void BlocDdlLim::Lecture(UtilLecture & entreePrinc)
+ { // on regarde tout d'abord si il y a un nom de maillage, qui doit être le premier nom
+ string nom;
+ if (strstr(entreePrinc.tablcar,"nom_mail=")!=NULL)
+ { // cas où il y a un nom de maillage
+ *(entreePrinc.entree) >> nom >> nom; // lecture du mot_clé et du nom
+ if (nom_maillage == NULL) { nom_maillage = new string(nom);}
+ else { *nom_maillage = nom;};
+ }
+ // puis lecture de la classe mère
+ Bloc_particulier::Lecture(entreePrinc);
+ }
+
+/// affichage des infos
+template
+void BlocDdlLim::Affiche() const
+ { // affichage éventuelle du nom de maillage
+ if (nom_maillage != NULL)
+ { cout << "\n nom_mail= " << *nom_maillage;} else cout << "\n";
+ // puis affichage des infos de la classe mère
+ Bloc_particulier::Affiche();
+ }
+
+/// surcharge de l'operateur ==
+template
+bool BlocDdlLim::operator == ( const BlocDdlLim& a) const
+ { if (nom_maillage == NULL)
+ { if (a.nom_maillage != NULL) return false;
+ }
+ else
+ { if (a.nom_maillage == NULL) return false;
+ // sinon les deux sont non null: on test leur égalité
+ if (*nom_maillage != *(a.nom_maillage)) return false;
+ };
+ // puis la classe mère
+ if (((Bloc_particulier&)(*this)).operator==(a))
+ return true;
+ else
+ { return false; };
+ }
+
+/// surcharge de l'operateur =
+template
+BlocDdlLim& BlocDdlLim::operator
+ = ( const BlocDdlLim& a)
+ { if (a.nom_maillage == NULL)
+ { if (nom_maillage != NULL) {delete nom_maillage;nom_maillage=NULL;}}
+ else
+ { if (nom_maillage == NULL) nom_maillage = new string(*(a.nom_maillage));
+ else *nom_maillage = *(a.nom_maillage);
+ };
+ // puis la classe mère
+ ((Bloc_particulier&)(*this)).operator=(a);
+ return *this;
+ }
+
+/// change le nom de maillage
+/// ATTENTION : Les modifications liees au changement du nom de maillage
+/// sont a la charge de l'utilisateur.
+/// le nouveau nom ne doit pas être vide !! sinon erreur
+template
+void BlocDdlLim::Change_nom_maillage(const string& nouveau)
+ { if (nouveau.length() == 0)
+ { cout << "\nErreur : reference de nom de maillage non valide car de longueur nulle ! "
+ << " nom_mail= " << nouveau << "\n";
+ cout << "BlocDdlLim::Change_nom_maillage(....) \n";
+ Sortie(1);
+ }
+ if (nom_maillage == NULL)
+ { nom_maillage = new string(nouveau);}
+ else
+ { *nom_maillage = nouveau;};
+ }
+
+#endif
diff --git a/Maillage/Ddl.cc b/Maillage/Ddl.cc
new file mode 100644
index 0000000..296470d
--- /dev/null
+++ b/Maillage/Ddl.cc
@@ -0,0 +1,514 @@
+// FICHIER : Ddl.cp
+// CLASSE : Ddl
+
+// 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-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 .
+//
+// For more information, please consult: .
+
+
+
+#include "Ddl.h"
+
+
+# include
+using namespace std; //introduces namespace std
+
+#include
+#include "Sortie.h"
+
+#ifndef Ddl_deja_inclus
+
+#ifndef MISE_AU_POINT
+ inline
+#endif
+Ddl::Ddl (Enum_ddl id_nom_ddl,double val,Enum_boolddl val_fixe) :
+ id_nom(id_nom_ddl),val_ddl(val),fixe(val_fixe)
+// Constructeur utile quand l'identificateur de nom du degre de
+// liberte sont connus
+// ( N.B. : Tous les parametres de ce constructeur ont des valeurs par defaut.
+// Ce constructeur peut donc servir de constructeur par defaut. )
+{};
+
+#ifndef MISE_AU_POINT
+ inline
+#endif
+Ddl::Ddl (char* nom,double val,Enum_boolddl val_fixe) :
+ val_ddl(val),fixe(val_fixe)
+// Constructeur utile quand le nom et la valeur du degre de liberte sont
+// connus
+// ( N.B. : val et val_fixe ont des valeurs par defaut, il n'est par consequent
+// pas obligatoire de leur donner des valeurs a l'appel de ce constructeur )
+{ id_nom=Id_nom_ddl(nom);
+};
+
+#ifndef MISE_AU_POINT
+ inline
+#endif
+Ddl::Ddl (const Ddl& d)
+// Constructeur de copie
+{ id_nom=d.id_nom;
+ val_ddl=d.val_ddl;
+ fixe=d.fixe;
+};
+
+#ifndef MISE_AU_POINT
+ inline
+#endif
+Ddl::~Ddl ()
+// Destructeur
+{ };
+
+
+#ifndef MISE_AU_POINT
+ inline
+#endif
+// Retourne 1 si le degre de liberte a une valeur fixée tout au long du calcul
+// Retourne 0 sinon
+// ne concerne que les variables (par exemple ne concerne pas les données)
+bool Ddl::Fixe() const
+{switch (fixe)
+ { case FIXE : case SURFIXE: case LISIBLE_FIXE: case LISIBLE_SURFIXE:
+ case HS_LISIBLE_FIXE: case HS_SURFIXE: case HS_LISIBLE_SURFIXE:
+ case HSFIXE: return true;break;
+ case LIBRE : case SOUSLIBRE: case LISIBLE_LIBRE: case LISIBLE_SOUSLIBRE:
+ case HS_LISIBLE_LIBRE: case HS_SOUSLIBRE: case HS_LISIBLE_SOUSLIBRE:
+ case HSLIBRE: return false;break;
+
+ default :
+ #ifdef MISE_AU_POINT
+ cout << "\nErreur : valeur incorrecte du type ddl !\n";
+ cout << "Ddl.Fixe(): val= " << fixe;
+ Sortie(1);
+ #endif
+ break;
+ }
+ // la ligne suivante ne sert pas mais c'est pour ne pas avoir de Warning
+ return false ;
+};
+
+#ifndef MISE_AU_POINT
+ inline
+#endif
+// test pour savoir si le ddl est une variable ou une donnée
+bool Ddl::UneVariable() const
+ { switch (fixe)
+ { case LIBRE: case FIXE : case SOUSLIBRE: case SURFIXE:
+ case HSLIBRE: case HSFIXE: case HS_SOUSLIBRE: case HS_SURFIXE:
+ return true; break;
+ case LISIBLE_LIBRE: case LISIBLE_FIXE :
+ case LISIBLE_SOUSLIBRE: case LISIBLE_SURFIXE:
+ case HS_LISIBLE_LIBRE: case HS_LISIBLE_FIXE:
+ case HS_LISIBLE_SOUSLIBRE: case HS_LISIBLE_SURFIXE:
+ return false;break;
+ default :
+ cout << "\nErreur : degre de liberte non defini !\n";
+ cout << "\n UneVariable() " << fixe;
+ Sortie(1);
+ };
+ // la ligne suivante ne sert pas mais c'est pour ne pas avoir de Warning
+ return false ;
+ };
+
+#ifndef MISE_AU_POINT
+ inline
+#endif
+// changement du statut de variable à donnée
+void Ddl::ChangeVariable_a_Donnee()
+ { switch (fixe)
+ { case LIBRE: fixe = LISIBLE_LIBRE; break;
+ case FIXE : fixe = LISIBLE_FIXE; break;
+ case SOUSLIBRE: fixe = LISIBLE_SOUSLIBRE; break;
+ case SURFIXE: fixe = LISIBLE_SURFIXE; break;
+ case HSLIBRE: fixe = HS_LISIBLE_LIBRE; break;
+ case HSFIXE: fixe = HS_LISIBLE_FIXE; break;
+ case HS_SOUSLIBRE: fixe = HS_LISIBLE_SOUSLIBRE; break;
+ case HS_SURFIXE: fixe = HS_LISIBLE_SURFIXE; break;
+ // cas déjà une variable on ne fait rien
+ case LISIBLE_LIBRE: case LISIBLE_FIXE :
+ case LISIBLE_SOUSLIBRE: case LISIBLE_SURFIXE:
+ case HS_LISIBLE_LIBRE: case HS_LISIBLE_FIXE:
+ case HS_LISIBLE_SOUSLIBRE: case HS_LISIBLE_SURFIXE: break;
+
+ default :
+ cout << "\nErreur : degre de liberte non defini !\n";
+ cout << "\n Ddl::ChangeVariable_a_Donnee() " << fixe;
+ Sortie(1);
+ }
+ };
+
+#ifndef MISE_AU_POINT
+ inline
+#endif
+// changement du statut de donnée à variable
+void Ddl::ChangeDonnee_a_Variable()
+ { switch (fixe)
+ { case LISIBLE_LIBRE : fixe = LIBRE; break;
+ case LISIBLE_FIXE : fixe = FIXE; break;
+ case LISIBLE_SOUSLIBRE : fixe = SOUSLIBRE; break;
+ case LISIBLE_SURFIXE : fixe = SURFIXE; break;
+ case HS_LISIBLE_LIBRE : fixe = HSLIBRE; break;
+ case HS_LISIBLE_FIXE : fixe = HSFIXE; break;
+ case HS_LISIBLE_SOUSLIBRE: fixe = HS_SOUSLIBRE; break;
+ case HS_LISIBLE_SURFIXE: fixe = HS_SURFIXE; break;
+ // cas déjà une variable on ne fait rien
+ case LIBRE: case FIXE : case SOUSLIBRE: case SURFIXE:
+ case HSLIBRE: case HSFIXE:
+ case HS_SOUSLIBRE: case HS_SURFIXE: break;
+ default :
+ cout << "\nErreur : degre de liberte non defini !\n";
+ cout << "\n ChangeDonnee_a_Variable() " << fixe;
+ Sortie(1);
+ }
+ };
+
+#ifndef MISE_AU_POINT
+ inline
+#endif
+// Modifie la valeur de fixe, si val est vrai -> blocage , sinon libre
+void Ddl::Change_fixe(bool val)
+{ if (val)
+ {switch (fixe) // cas ou on veut fixer
+ { case SOUSLIBRE : fixe = LIBRE ;break;
+ case LIBRE : fixe = FIXE ;break;
+ case FIXE : fixe = SURFIXE ;break;
+ case HSLIBRE : fixe = HSFIXE;break;
+ case LISIBLE_SOUSLIBRE : fixe = LISIBLE_LIBRE;break;
+ case LISIBLE_LIBRE : fixe = LISIBLE_FIXE;break;
+ case LISIBLE_FIXE : fixe = LISIBLE_SURFIXE;break;
+ case HS_LISIBLE_LIBRE : fixe = HS_LISIBLE_FIXE;break;
+ case HS_SOUSLIBRE : fixe = HSLIBRE;break;
+ case HS_LISIBLE_SOUSLIBRE : fixe = HS_LISIBLE_LIBRE;break;
+ case HSFIXE : fixe = HS_SURFIXE;break;
+ case HS_LISIBLE_FIXE : fixe = HS_LISIBLE_SURFIXE;break;
+ // pour tous les surfixes, on ne fait rien
+ case SURFIXE: case LISIBLE_SURFIXE: case HS_SURFIXE: case HS_LISIBLE_SURFIXE:
+ break;
+ default :
+ cout << "\nErreur : degre de liberte non defini !\n";
+ cout << "\n Ddl::Change_fixe(.. " << fixe;
+ Sortie(1);
+ };
+ }
+ else
+ { switch (fixe) // cas ou on veut rendre libre
+ { case SURFIXE : fixe = FIXE ;break;
+ case FIXE : fixe = LIBRE ;break;
+ case LIBRE : fixe = SOUSLIBRE ;break;
+ case HSFIXE : fixe = HSLIBRE;break;
+ case LISIBLE_SURFIXE : fixe = LISIBLE_FIXE;break;
+ case LISIBLE_FIXE : fixe = LISIBLE_LIBRE;break;
+ case LISIBLE_LIBRE : fixe = LISIBLE_SOUSLIBRE;break;
+ case HS_LISIBLE_FIXE : fixe = HS_LISIBLE_LIBRE;break;
+ case HS_SURFIXE : fixe = HSFIXE;break;
+ case HS_LISIBLE_SURFIXE : fixe = HS_LISIBLE_FIXE;break;
+ case HSLIBRE : fixe = HS_SOUSLIBRE;break;
+ case HS_LISIBLE_LIBRE : fixe = HS_LISIBLE_SOUSLIBRE;break;
+ // pour tous les sous libre on ne fait rien
+ case SOUSLIBRE: case LISIBLE_SOUSLIBRE: case HS_SOUSLIBRE:
+ case HS_LISIBLE_SOUSLIBRE: break;
+ default :
+ cout << "\nErreur : degre de liberte non defini !\n";
+ cout << "\n Ddl::Change_fixe(.. " << fixe;
+ Sortie(1);
+ };
+ }
+ };
+
+#ifndef MISE_AU_POINT
+ inline
+#endif
+// test si le ddl est SOUSLIBRE ou SURFIXE, ramène true si oui
+bool Ddl::SousSurFixe() const
+{ switch (fixe)
+ { case SOUSLIBRE : case SURFIXE : case LISIBLE_SOUSLIBRE :
+ case LISIBLE_SURFIXE : case HS_SOUSLIBRE : case HS_SURFIXE :
+ case HS_LISIBLE_SOUSLIBRE : case HS_LISIBLE_SURFIXE :
+ return true; break;
+ // pour les autres retour false
+ case LIBRE : case FIXE : case HSLIBRE : case HSFIXE : case LISIBLE_LIBRE :
+ case LISIBLE_FIXE : case HS_LISIBLE_LIBRE : case HS_LISIBLE_FIXE:
+ return false; break;
+ default :
+ cout << "\nErreur : degre de liberte non defini !\n";
+ cout << "\n Ddl::SousSurFixe(.. " << fixe;
+ Sortie(1);
+ };
+};
+
+
+#ifndef MISE_AU_POINT
+ inline
+#endif
+// remise à normal si le ddl est en souslibre ou surfixe
+// s'il est en souslibre il passe en libre et s'il est en surfixe il passe en fixe
+// sinon on ne fait rien
+void Ddl::Retour_normal_sur_ou_sous_fixe()
+{switch (fixe) // cas ou on veut rendre libre
+ { case SURFIXE : fixe = FIXE ;break;
+ case LISIBLE_SURFIXE : fixe = LISIBLE_FIXE ;break;
+ case HS_SURFIXE: fixe = HSFIXE;break;
+ case HS_LISIBLE_SURFIXE: fixe = HS_LISIBLE_FIXE;break;
+ case SOUSLIBRE : fixe = LIBRE ;break;
+ case LISIBLE_SOUSLIBRE : fixe = LISIBLE_LIBRE;break;
+ case HS_SOUSLIBRE : fixe = HSLIBRE;break;
+ case HS_LISIBLE_SOUSLIBRE: fixe = HS_LISIBLE_LIBRE;break;
+ // pour les autres on ne fait rien
+ case LIBRE : case FIXE : case HSLIBRE : case HSFIXE :
+ case LISIBLE_LIBRE : case LISIBLE_FIXE : case HS_LISIBLE_LIBRE:
+ case HS_LISIBLE_FIXE : break;
+ default :
+ cout << "\nErreur : degre de liberte non defini !\n";
+ cout << "\n Ddl::Retour_normal_sur_ou_sous_fixe(.. " << fixe;
+ Sortie(1);
+ };
+};
+
+#ifndef MISE_AU_POINT
+ inline
+#endif
+void Ddl::Met_hors_service()
+// met hors_service le ddl, cela signifie que momentanément il ne sert plus
+ { switch (fixe) // cas ou on veut rendre libre
+ { case LIBRE : fixe = HSLIBRE ;break;
+ case SOUSLIBRE : fixe = HS_SOUSLIBRE ;break;
+ case FIXE : fixe = HSFIXE ;break;
+ case SURFIXE : fixe = HS_SURFIXE ;break;
+ case LISIBLE_LIBRE : fixe = HS_LISIBLE_LIBRE ;break;
+ case LISIBLE_SOUSLIBRE : fixe = HS_LISIBLE_SOUSLIBRE ;break;
+ case LISIBLE_FIXE : fixe = HS_LISIBLE_FIXE;break;
+ case LISIBLE_SURFIXE : fixe = HS_LISIBLE_SURFIXE;break;
+ case HSLIBRE: case HSFIXE: case HS_LISIBLE_LIBRE: case HS_LISIBLE_FIXE:
+ case HS_SOUSLIBRE : case HS_SURFIXE : case HS_LISIBLE_SOUSLIBRE : case HS_LISIBLE_SURFIXE :
+ break; // cas déjà HS
+ default:
+ cout << "\n erreur cas non prevu pour le ddl "; this->Affiche();
+ cout << "\n Ddl::Met_hors_service() ";
+ Sortie(1);
+ };
+ };
+
+#ifndef MISE_AU_POINT
+ inline
+#endif
+// met en service le ddl
+void Ddl::Met_en_service()
+ { switch (fixe) // cas ou on veut rendre libre
+ { case HSLIBRE : fixe = LIBRE ;break;
+ case HSFIXE : fixe = FIXE ;break;
+ case HS_LISIBLE_LIBRE : fixe = LISIBLE_LIBRE ;break;
+ case HS_LISIBLE_FIXE : fixe = LISIBLE_FIXE;break;
+ case HS_SOUSLIBRE : fixe = SOUSLIBRE;break;
+ case HS_SURFIXE : fixe = SURFIXE;break;
+ case HS_LISIBLE_SOUSLIBRE : fixe = LISIBLE_SOUSLIBRE;break;
+ case HS_LISIBLE_SURFIXE :fixe = LISIBLE_SURFIXE;break;
+
+ case LIBRE: case FIXE: case SOUSLIBRE: case SURFIXE:
+ case LISIBLE_LIBRE: case LISIBLE_FIXE:
+ case LISIBLE_SOUSLIBRE: case LISIBLE_SURFIXE:
+ break; // cas déjà OK
+ default:
+ cout << "\n erreur cas non prevu pour le ddl "; this->Affiche();
+ cout << "\n Ddl::Met_hors_service() ";
+ Sortie(1);
+ };
+ };
+
+
+#ifndef MISE_AU_POINT
+ inline
+#endif
+void Ddl::Met_hors_service_ddl()
+// met hors_service le ddl, cela signifie que momentanément il ne sert plus
+// ne concerne pas les données
+ { switch (fixe) // cas ou on veut rendre libre
+ { case LIBRE : fixe = HSLIBRE ;break;
+ case SOUSLIBRE : fixe = HS_SOUSLIBRE ;break;
+ case FIXE : fixe = HSFIXE ;break;
+ case SURFIXE : fixe = HS_SURFIXE ;break;
+ // --- cas déjà HS on ne change rien
+ case HSLIBRE: case HSFIXE: case HS_LISIBLE_LIBRE: case HS_LISIBLE_FIXE:
+ case HS_SOUSLIBRE : case HS_SURFIXE : case HS_LISIBLE_SOUSLIBRE : case HS_LISIBLE_SURFIXE :
+ break; // cas déjà HS
+ // --- cas des données, on ne fait rien
+ case LISIBLE_LIBRE : case LISIBLE_SOUSLIBRE :
+ case LISIBLE_FIXE : case LISIBLE_SURFIXE :
+ break; // pour les données, on ne change rien
+ default:
+ cout << "\n erreur cas non prevu pour le ddl "; this->Affiche();
+ cout << "\n Ddl::Met_hors_service_ddl() ";
+ Sortie(1);
+ };
+ };
+
+#ifndef MISE_AU_POINT
+ inline
+#endif
+// met en service le ddl, ne concerne pas les données
+void Ddl::Met_en_service_ddl()
+ { switch (fixe) // cas ou on veut rendre libre
+ { case HSLIBRE : fixe = LIBRE ;break;
+ case HSFIXE : fixe = FIXE ;break;
+ case HS_SOUSLIBRE : fixe = SOUSLIBRE;break;
+ case HS_SURFIXE : fixe = SURFIXE;break;
+
+ // --- déjà libre, on ne change rien
+ case LIBRE: case FIXE: case SOUSLIBRE: case SURFIXE:
+ case LISIBLE_LIBRE: case LISIBLE_FIXE:
+ case LISIBLE_SOUSLIBRE: case LISIBLE_SURFIXE:
+ break; // cas déjà OK
+
+ // --- on n'intervient pas sur les données
+ case HS_LISIBLE_SOUSLIBRE : case HS_LISIBLE_SURFIXE :
+ case HS_LISIBLE_LIBRE : case HS_LISIBLE_FIXE :
+ break;
+
+ default:
+ cout << "\n erreur cas non prevu pour le ddl "; this->Affiche();
+ cout << "\n Ddl::Met_en_service_ddl() ";
+ Sortie(1);
+ };
+ };
+
+#ifndef MISE_AU_POINT
+ inline
+#endif
+// surcharge de l'operateur d'ecriture
+ostream & operator << (ostream & sort,const Ddl & a)
+ { // écriture du type
+ sort << "Ddl ";
+ // les données
+ sort << a.id_nom << " " << a.fixe << " " ;
+ sort << setprecision(ParaGlob::NbdigdoCA()) << a.val_ddl << " ";
+ return sort;
+ };
+
+#ifndef MISE_AU_POINT
+ inline
+#endif
+ // surcharge de l'operator de lecture
+istream & operator >> (istream & entree, Ddl& a)
+ { // vérification du type
+ string type;
+ entree >> type;
+ if (type != "Ddl")
+ {Sortie (1);
+ return entree;
+ }
+ // entrée des données
+ entree >> a.id_nom;
+ entree >> a.fixe;
+ entree >> a.val_ddl;
+
+ return entree;
+ };
+
+
+#ifndef MISE_AU_POINT
+ inline
+#endif
+// Affiche les donnees liees au degre de liberte
+void Ddl::Affiche () const
+{
+ cout << " " << Nom_ddl(id_nom) ;
+ cout << " = " << val_ddl ;
+ switch (fixe)
+ { case LIBRE : cout << " val_libre, "; break;
+ case FIXE : cout << " val_fixe, "; break;
+ case SOUSLIBRE : cout << " val_sous_libre, "; break;
+ case SURFIXE : cout << " val_sur_fixe, "; break;
+ case LISIBLE_LIBRE : cout << " lisible_libre, "; break;
+ case LISIBLE_FIXE : cout << " lisible_fixe, "; break;
+ case LISIBLE_SOUSLIBRE : cout << " lisible_sous_libre, "; break;
+ case LISIBLE_SURFIXE : cout << " lisible_sur_fixe, "; break;
+ // pour les autres ils sont hors services
+ case HSLIBRE :
+ case HSFIXE :
+ case HS_LISIBLE_LIBRE :
+ case HS_LISIBLE_FIXE :
+ case HS_SOUSLIBRE :
+ case HS_SURFIXE :
+ case HS_LISIBLE_SOUSLIBRE :
+ case HS_LISIBLE_SURFIXE :
+ cout << " hors service, "; break;
+/*
+ case LIBRE : result="LIBRE"; break;
+ case FIXE : result="FIXE"; break;
+ case HSLIBRE : result="HSLIBRE"; break;
+ case HSFIXE : result="HSFIXE"; break;
+ case SOUSLIBRE : result="SOUSLIBRE"; break;
+ case SURFIXE : result="SURFIXE"; break;
+ case LISIBLE_LIBRE : result="LISIBLE_LIBRE"; break;
+ case LISIBLE_FIXE : result="LISIBLE_FIXE"; break;
+ case LISIBLE_SOUSLIBRE : result="LISIBLE_SOUSLIBRE"; break;
+ case LISIBLE_SURFIXE : result="LISIBLE_SURFIXE"; break;
+ case HS_LISIBLE_LIBRE : result="HS_LISIBLE_LIBRE"; break;
+ case HS_LISIBLE_FIXE : result="HS_LISIBLE_FIXE"; break;
+ case HS_SOUSLIBRE : result="HS_SOUSLIBRE"; break;
+ case HS_SURFIXE : result="HS_SURFIXE"; break;
+ case HS_LISIBLE_SOUSLIBRE : result="HS_LISIBLE_SOUSLIBRE"; break;
+ case HS_LISIBLE_SURFIXE : result="HS_LISIBLE_SURFIXE"; break;
+*/
+
+ default:
+ cout << "\n erreur cas non prevu pour le ddl "; this->Affiche();
+ cout << "\n Ddl::Affiche(.. ";
+ Sortie(1);
+ };
+ };
+
+#ifndef MISE_AU_POINT
+ inline
+#endif
+//Surcharge d'operateur logique
+bool Ddl::operator == (const Ddl& a) const
+ { if ( (id_nom==a.id_nom)
+ && (val_ddl == a.val_ddl) && (fixe == a.fixe))
+ return true;
+ else return false;
+ };
+
+#ifndef MISE_AU_POINT
+ inline
+#endif
+bool Ddl::operator != (const Ddl& a) const
+ { return !(*this == a);};
+
+#ifndef MISE_AU_POINT
+ inline
+#endif
+// test si le degre de liberte est complet
+// = 1 tout est ok, =0 element incomplet
+int Ddl::TestComplet() const
+ { if (id_nom == NU_DDL)
+ { cout << "\n pb !! ddl non defini ";
+ return false;
+ }
+ return true;
+ };
+
+
+#endif // fin de l'inclusion totale
diff --git a/Maillage/Ddl.h b/Maillage/Ddl.h
new file mode 100644
index 0000000..548b073
--- /dev/null
+++ b/Maillage/Ddl.h
@@ -0,0 +1,279 @@
+// FICHIER : Ddl.h
+// CLASSE : Ddl
+
+// 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-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 .
+//
+// For more information, please consult: .
+
+/************************************************************************
+* DATE: 23/01/97 *
+* $ *
+* AUTEUR: G RIO (mailto:gerardrio56@free.fr) *
+* $ *
+* PROJET: Herezh++ *
+* $ *
+************************************************************************
+* La classe Ddl permet de declarer des degres de liberte.
+* soit c'est une variable ou soit c'est une données qui peuvent être soit active
+* soit hors-service
+* ensuite soit il est fixe ou soit il est bloqué
+* 1) libre, fixe, ou 2) hors service libre ou hors service fixe ===> une variable
+* 3) lisible libre ou fixe ou 4) hors service libre ou fixe ===> une donnée
+* 1) c'est pour les ddl qui sont des variables que le calcul va déterminer,
+* 2) sont les variables qui sont hors service: on ne les considères pas
+* 3) sont des variables que l'on peut utiliser mais que le calcul ne
+* cherche pas à déterminer: elle sont en lecture seule en quelque sorte
+* 4) se sont des données qui ne sont pas dispon pour la consultation (par exemple hors temps)
+* $ *
+* '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' *
+* *
+* VERIFICATION: *
+* *
+* ! date ! auteur ! but ! *
+* ------------------------------------------------------------ *
+* ! ! ! ! *
+* $ *
+* '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' *
+* MODIFICATIONS: *
+* ! date ! auteur ! but ! *
+* ------------------------------------------------------------ *
+* $ *
+************************************************************************/
+
+// La classe Ddl permet de declarer des degres de liberte.
+// soit c'est une variable ou soit c'est une données qui peuvent être soit active
+// soit hors-service
+// ensuite soit il est fixe ou soit il est bloqué
+// 1) libre, fixe, ou 2) hors service libre ou hors service fixe ===> une variable
+// 3) lisible libre ou fixe ou 4) hors service libre ou fixe ===> une donnée
+// 1) c'est pour les ddl qui sont des variables que le calcul va déterminer,
+// 2) sont les variables qui sont hors service: on ne les considères pas
+// 3) sont des variables que l'on peut utiliser mais que le calcul ne
+// cherche pas à déterminer: elle sont en lecture seule en quelque sorte
+// 4) se sont des données qui ne sont pas dispon pour la consultation (par exemple hors temps)
+
+
+#ifndef DDL_H
+#define DDL_H
+
+
+#include "Enum_ddl.h"
+#include "Enum_boolddl.h"
+
+
+#include
+#include
+#include "Sortie.h"
+#include
+// #include
+
+/** @defgroup Les_classes_Ddl_en_tout_genre
+*
+* BUT:def de classes relatives aux ddl en tout genre
+* Ddl, Ddl_etendu, DdlElement, DdlLim etc.
+*
+* \author Gérard Rio
+* \version 1.0
+* \date 23/01/97
+* \brief Def de classes relatives aux ddl en tout genre
+*
+*/
+
+/// @addtogroup Les_classes_Ddl_en_tout_genre
+/// @{
+///
+
+
+/// BUT: La classe Ddl permet de declarer des degres de liberte.
+/// soit c'est une variable ou soit c'est une données qui peuvent être soit active
+/// soit hors-service
+/// ensuite soit il est fixe ou soit il est bloqué
+/// 1) libre, fixe, ou 2) hors service libre ou hors service fixe ===> une variable
+/// 3) lisible libre ou fixe ou 4) hors service libre ou fixe ===> une donnée
+/// 1) c'est pour les ddl qui sont des variables que le calcul va déterminer,
+/// 2) sont les variables qui sont hors service: on ne les considères pas
+/// 3) sont des variables que l'on peut utiliser mais que le calcul ne
+/// cherche pas à déterminer: elle sont en lecture seule en quelque sorte
+/// 4) se sont des données qui ne sont pas dispon pour la consultation (par exemple hors temps)
+///
+/// \author Gérard Rio
+/// \version 1.0
+/// \date 23/01/97
+///
+///
+
+
+class Ddl
+{
+ // surcharge de l'operator de lecture
+ friend istream & operator >> (istream & entree, Ddl& a);
+ // surcharge de l'operator d'ecriture
+ friend ostream & operator << (ostream & sort, const Ddl& a);
+
+ public:
+
+
+ // CONSTRUCTEURS :
+
+ // Constructeur eventuellement par defaut
+ Ddl (Enum_ddl id_nom_ddl=NU_DDL,double val=0.0,Enum_boolddl val_fixe=HS_LISIBLE_LIBRE);
+
+ // Constructeur se servant d'un nom
+ // ( N.B. : val et val_fixe ont des valeurs par defaut, il n'est par consequent
+ // pas obligatoire de leur donner des valeurs a l'appel de ce constructeur )
+ Ddl (char* nom,double val=0.0,Enum_boolddl val_fixe=HS_LISIBLE_LIBRE);
+
+
+ // Constructeur de copie
+ Ddl (const Ddl& d);
+
+
+ // DESTRUCTEUR :
+
+ ~Ddl ();
+
+
+ // METHODES :
+
+ // Retourne 1 si le degre de liberte a une valeur fixée tout au long du calcul
+ // Retourne 0 sinon
+ // ne concerne que les variables (par exemple ne concerne pas les données)
+ bool Fixe() const;
+
+ // test pour savoir si le ddl est une variable ou une donnée
+ bool UneVariable() const;
+
+ // changement du statut de variable à donnée
+ void ChangeVariable_a_Donnee();
+
+ // changement du statut de donnée à variable
+ void ChangeDonnee_a_Variable();
+
+ // Retourne la valeur de fixe en lecture uniquement
+ inline const Enum_boolddl Retour_Fixe() const { return fixe ; };
+
+ // Modifie la valeur de fixe, si val est vrai -> blocage , sinon libre
+ void Change_fixe(bool val);
+
+ // modifie toute les conditions sauf la valeur: c-a-d:
+ // le fixage, le fait que c'est une variable ou une donnée, le fait
+ // d'être en service ou non etc..
+ void CopieToutesLesConditions( Enum_boolddl en) {fixe = en;};
+
+ // test pour savoir si le ddl est en service ou pas
+ inline bool Service() const
+ { return (!(Est_HS(fixe)));};
+
+ // test si le ddl est SOUSLIBRE ou SURFIXE, ramène true si oui
+ bool SousSurFixe() const;
+
+ // remise à normal si le ddl est en souslibre ou surfixe
+ // s'il est en souslibre il passe en libre et s'il est en surfixe il passe en fixe
+ // sinon on ne fait rien
+ void Retour_normal_sur_ou_sous_fixe();
+
+ // met hors_service le ddl ou la donnée, cela signifie que momentanément il ne sert plus
+ void Met_hors_service();
+ // met en service le ddl ou la donnée
+ void Met_en_service();
+
+ // met hors_service le ddl, cela signifie que momentanément il ne sert plus
+ // ne concerne pas les données
+ void Met_hors_service_ddl();
+ // met en service le ddl, ne concerne pas les données
+ void Met_en_service_ddl();
+
+ // Retourne la valeur associee au degre de liberte
+ inline double& Valeur() { return val_ddl; };
+
+ // Retourne le nom associe au degre de liberte
+ inline const string Nom() const { return Nom_ddl(id_nom); };
+
+ // Retourne la variable de type enumere associee au nom du degre de liberte
+ inline Enum_ddl Id_nom() const { return id_nom; };
+
+ // Remplace le nom du degre de liberte par nouveau_nom
+ // (par l'intermediaire du type enumere associe)
+ // ATTENTION : Les modifications liees au changement de nom du degre
+ // de liberte sont a la charge de l'utilisateur.
+ inline void Change_nom(char* nouveau_nom)
+ { id_nom=Id_nom_ddl(nouveau_nom); };
+
+ // Remplace l'identificateur de nom du degre de liberte par
+ // nouveau_id
+ // ATTENTION : Les modifications liees au changement de nom du degre
+ // de liberte sont a la charge de l'utilisateur.
+ inline void Change_nom(Enum_ddl nouveau_id)
+ { id_nom=nouveau_id; };
+
+ // Affiche les donnees liees au degre de liberte
+ void Affiche() const ;
+
+ inline Ddl& operator= (const Ddl& d)
+ // Realise l'egalite entre deux degres de liberte
+ { id_nom=d.id_nom;
+ val_ddl=d.val_ddl;
+ fixe=d.fixe;
+ return (*this);
+ };
+
+ //Surcharge d'operateur logique
+ bool operator == ( const Ddl& a) const ;
+
+ bool operator != ( const Ddl& a) const;
+
+
+ // test si le degre de liberte est complet
+ // = 1 tout est ok, =0 element incomplet
+ int TestComplet() const;
+
+
+ protected :
+
+ Enum_ddl id_nom; // identificateur du nom
+
+ // bool fixe; // booleen pour savoir si la valeur associee au
+ // degre de liberte est fixe pendant tout le calcul
+ Enum_boolddl fixe; // 1) libre, fixe, ou 2) hors service libre ou hors service fixe
+ // ou 3) lisible libre ou fixe
+ // cf. l'énuméré
+
+ double val_ddl; // valeur associee
+
+
+};
+/// @} // end of group
+
+// pour faire de l'inline
+#ifndef MISE_AU_POINT
+ #include "Ddl.cc"
+ #define Ddl_deja_inclus
+#endif
+
+
+
+#endif
diff --git a/Maillage/DdlElement.cc b/Maillage/DdlElement.cc
new file mode 100644
index 0000000..5c1fe98
--- /dev/null
+++ b/Maillage/DdlElement.cc
@@ -0,0 +1,329 @@
+
+// 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-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 .
+//
+// For more information, please consult: .
+
+
+
+#include "DdlElement.h"
+
+
+ // CONSTRUCTEURS :
+// par defaut
+DdlElement::DdlElement () :
+ te(),nbddl(0),tab_enum_famille() {};
+// definition du tableau pour n noeuds vide
+DdlElement::DdlElement (int n) :
+ te(n),nbddl(0),tab_enum_famille()
+ { };
+// definition du tableau pour n noeuds et m ddl par noeud
+// utile lorsque tous les noeuds ont le meme nombre de ddl
+// par contre ici aucun ddl n'est encore défini
+DdlElement::DdlElement (int n, int m) :
+ te(n),nbddl(n*m),tab_enum_famille()
+ { for (int i=1; i<= n;i++)
+ { Tableau & tb=te(i).tb;
+ tb.Change_taille (m);
+ for (int j=1;j<=m;j++)
+ tb(j)=NU_DDL;
+ };
+ // def du nombre des types particuliers de ddl, ici il s'agit de NU_DDL
+ Calcul_NbDdl_typer();
+ };
+// definition du tableau pour n noeuds et un nombre de ddl par noeud
+// stocke dans le tableau mddl qui doit avoir la dimension n
+// par contre ici aucun ddl n'est encore défini
+DdlElement::DdlElement (int n,const Tableau & mddl) :
+ te(n),tab_enum_famille()
+ { if (mddl.Taille() == n)
+ for (int i=1; i<= n;i++)
+ { Tableau & tb=te(i).tb;
+ int m = mddl(i);
+ tb.Change_taille (m);
+ for (int j=1;j<=m;j++)
+ tb(j)=NU_DDL;
+ }
+ else
+ { cout << "\n erreur de dimension pour le tableau mddl, il doit avoir la ";
+ cout << " dimension : " << n << ", alors qu\'il a la dimension : "
+ << mddl.Taille() << "\nDdlElement (int n, Tableau mddl)" << endl;
+ Sortie (1);
+ }
+ // def du nombre total et des types particuliers de ddl
+ Calcul_NbDdl(); Calcul_NbDdl_typer();
+ };
+
+// definition du tableau pour n noeuds et une meme liste de ddl pour chaque
+// noeud identique au second argument
+DdlElement::DdlElement (int n, DdlNoeudElement d) :
+ te(n,d),nbddl(n * d.tb.Taille()),tab_enum_famille()
+ { // def du nombre total et des types particuliers de ddl
+ Calcul_NbDdl(); Calcul_NbDdl_typer();
+ };
+
+DdlElement::DdlElement (const DdlElement& a) :
+ te(a.te),nbddl(a.nbddl),tab_enum_famille(a.tab_enum_famille)
+ {}; // de copie
+ // DESTRUCTEUR :
+DdlElement::~DdlElement () {};
+
+// acces en modification au ddl j du noeud i
+void DdlElement::Change_Enum(int i,int j,const Enum_ddl enu)
+ {tab_enum_famille[PremierDdlFamille((te(i)).tb(j))]--;
+ (te(i)).tb(j) = enu;
+ tab_enum_famille[PremierDdlFamille(enu)]++;
+ };
+
+// nombre de ddl du noeudElement i contenu
+int DdlElement::NbDdl(int i) const
+ { return (te(i)).tb.Taille();};
+
+// change la dimension du tableau de ddl pour n noeuds et m ddl par noeud
+//dans le cas ou tous les noeuds ont le meme nombre de ddl
+// si la nouvelle taille est plus petite: suppression
+// si la nouvelle dimension est plus grande on met les ddl suplémentaires à NU_DDL
+void DdlElement::Change_taille(int n,int m)
+ { int oldTaille = te.Taille();
+ te.Change_taille(n);
+ int deltataille = n-oldTaille;
+ if (deltataille > 0)
+ { // cas où on augmente la taille
+ // 1) on traite différemment les anciens ddl et les nouveaux
+ for (int i=1;i<=oldTaille;i++)
+ { Tableau & tb=te(i).tb;
+ int otaille = tb.Taille();
+ if (m<=otaille)
+ {// on supprime sans pb
+ tb.Change_taille(m);
+ }
+ else // on augmente avec des ddl NU_DDL
+ {tb.Change_taille(m);
+ for (int j=otaille+1;j<=m;j++)
+ tb(j)=NU_DDL;
+ };
+ };
+ // 2) les nouveaux DdlNoeudElement sont mis à NU_DDL
+ for (int i1=oldTaille+1;i1<= n;i1++)
+ { Tableau & tb=te(i1).tb;
+ for (int j1=1;j1<=m;j1++)
+ tb(j1)=NU_DDL;
+ };
+ }
+ else // si on diminue
+ { for (int i=1;i<=oldTaille;i++)
+ { Tableau & tb=te(i).tb;
+ int otaille = tb.Taille();
+ if (m<=otaille)
+ {// on supprime sans pb
+ tb.Change_taille(m);
+ }
+ else // on augmente avec des ddl NU_DDL
+ {tb.Change_taille(m);
+ for (int j=otaille+1;j<=m;j++)
+ tb(j)=NU_DDL;
+ };
+ };
+ };
+ nbddl = n*m;
+ Calcul_NbDdl_typer(); // mise à jour du nombre de ddl de chaque type
+ };
+
+// change la dimension du tableau de ddl pour n noeuds et un nombre de ddl par noeud
+// stocke dans le tableau mddl qui doit avoir la dimension n
+// si la nouvelle taille est plus petite: suppression
+// si la nouvelle dimension est plus grande on met les ddl suplémentaires à NU_DDL
+void DdlElement::Change_taille(int n,Tableau mddl)
+ { int oldTaille = te.Taille();
+ te.Change_taille(n);
+ nbddl = 0;
+ if (mddl.Taille() == n)
+ {int deltataille = n-oldTaille;
+ if (deltataille > 0)
+ { // cas où on augmente la taille
+ // 1) on traite différemment les anciens ddl et les nouveaux
+ for (int i=1;i<=oldTaille;i++)
+ { Tableau & tb=te(i).tb;
+ int otaille = tb.Taille();
+ int m = mddl(i);nbddl += m;
+ if (m<=otaille)
+ {// on supprime sans pb
+ tb.Change_taille(m);
+ }
+ else // on augmente avec des ddl NU_DDL
+ {tb.Change_taille(m);
+ for (int j=otaille+1;j<=m;j++)
+ tb(j)=NU_DDL;
+ };
+ };
+ // 2) les nouveaux DdlNoeudElement sont mis à NU_DDL
+ for (int i1=oldTaille+1;i1<= n;i1++)
+ { Tableau & tb=te(i1).tb;
+ int m = mddl(i1);nbddl += m;
+ for (int j1=1;j1<=m;j1++)
+ tb(j1)=NU_DDL;
+ };
+ }
+ else // si on diminue
+ { for (int i=1;i<=oldTaille;i++)
+ { Tableau & tb=te(i).tb;
+ int otaille = tb.Taille();
+ int m = mddl(i); nbddl += m;
+ if (m<=otaille)
+ {// on supprime sans pb
+ tb.Change_taille(m);
+ }
+ else // on augmente avec des ddl NU_DDL
+ {tb.Change_taille(m);
+ for (int j=otaille+1;j<=m;j++)
+ tb(j)=NU_DDL;
+ };
+ };
+ };
+ }
+ else
+ { cout << "\n erreur de dimension pour le tableau mddl, il doit avoir la ";
+ cout << " dimension : " << n << ", alors qu\'il a la dimension : "
+ << mddl.Taille() << "\nChange_taille(int n,Tableau mddl)" << endl;
+ Sortie (1);
+ }
+ Calcul_NbDdl_typer(); // mise à jour du nombre de ddl de chaque type
+ };
+
+ // met le tableau de ddl a zero
+void DdlElement::TailleZero()
+ { int maxi_elem = te.Taille();
+ for (int i=1; i<=maxi_elem;i++)
+ (te(i)).tb.Change_taille (0);
+ te.Change_taille(0);
+ nbddl = 0;
+ tab_enum_famille.erase(tab_enum_famille.begin(),tab_enum_famille.end());
+ };
+// change un des ddlNoeudElements
+void DdlElement::Change_un_ddlNoeudElement(int i,const DdlNoeudElement& add)
+ { int nbdold = te(i).tb.Taille();
+ nbddl -= nbdold;
+ int nbdnew = add.tb.Taille();
+ nbddl += nbdnew;
+ // mise en place de add
+ te(i)=add;
+ // mise à jour des ddl par famille
+ Calcul_NbDdl_typer(); // mise à jour du nombre de ddl de chaque type
+ /*Tableau & tb=te(i).tb;
+ for (int j=1;j<=nbdold;j++)
+ (tab_enum_famille[PremierDdlFamille(tb(j))])--;
+ for (int i=1;i<= nbdnew;i++)
+ (tab_enum_famille[PremierDdlFamille(add.tb(i))])++;*/
+ };
+
+// surcharge de l'operateur d'affectation
+DdlElement& DdlElement::operator = (const DdlElement & a)
+ { int nb = a.NbNoeud();
+ this->te.Change_taille(nb);
+ for (int i=1;i<= nb;i++)
+ this->te(i) = a(i);
+ // mise à jour du nombre de ddl
+ nbddl = a.nbddl; tab_enum_famille = a.tab_enum_famille;
+ return *this;
+ };
+// surcharge des operator de test
+bool DdlElement::operator == (const DdlElement & a) const
+ { int nb = a.NbNoeud();
+ for (int i=1;i<=nb;i++)
+ if (this->te(i) != a(i)) return false;
+ return true;
+ };
+bool DdlElement::operator != (const DdlElement & a) const
+ { if (*this == a) return false; else return true;
+ };
+
+ // surcharge de l'operator de lecture
+istream & operator >> (istream & entree, DdlElement& a)
+ { // vérification du type
+ string type;
+ entree >> type;
+ if (type != "DdlElement")
+ {Sortie (1);
+ return entree;
+ }
+ // entrée du tableau
+ entree >> a.te;
+ // puis def du nombre total de ddl
+ a.Calcul_NbDdl();
+ a.Calcul_NbDdl_typer(); // mise à jour du nombre de ddl de chaque type
+ return entree;
+ };
+ // surcharge de l'operator d'ecriture
+ostream & operator << (ostream & sort, const DdlElement& a)
+ { // tout d'abord un indicateur donnant le type
+ sort << "DdlElement " ;
+ // puis le tableau
+ sort << a.te;
+ return sort;
+ };
+
+// retour du nombre de ddl d'une famille donnée
+int DdlElement::NbDdl_famille(Enum_ddl enu) const
+ { // pour l'instant on sort la totalité des ddl ce qui est faux mais permet de fonctionner comme avant
+// return nbddl;
+ map < Enum_ddl, Int_initer , std::less >::const_iterator il = tab_enum_famille.find(enu);
+ if (il == tab_enum_famille.end()) return 0; else return (*il).second.vali;
+ };
+
+//================================= methodes proteges ==================
+
+ // calcul du nb de ddl
+void DdlElement::Calcul_NbDdl()
+ { nbddl = 0;
+ int tetaille = te.Taille();
+ for (int i=1; i<= tetaille;i++)
+ nbddl += (te(i)).tb.Taille();
+ };
+
+ // calcul du nb de ddl de chaque type contenu
+void DdlElement::Calcul_NbDdl_typer()
+ { // méthode en utilisant "tab_enum_famille"
+ // qui est un tableau associatif
+ // on commence par initialiser le tableau
+ tab_enum_famille.erase(tab_enum_famille.begin(),tab_enum_famille.end());
+ // on passe en revue tous les ddl
+ int tetaille = te.Taille();
+ for (int i=1; i<= tetaille;i++)
+ { Tableau & tb=te(i).tb;
+ int nbd= tb.Taille();
+ for (int j=1;j<=nbd;j++)
+ (tab_enum_famille[PremierDdlFamille(tb(j))])++;
+ }
+ /* // pour vérif
+ map < Enum_ddl, Int_initer , std::less >::iterator il,ilfin=tab_enum_famille.end();
+ for (il=tab_enum_famille.begin();il != ilfin;il++)
+ cout << "\n ddl= " << (*il).first << " nombre " << (*il).second.vali << endl;
+
+ cout << "toto ?";
+ int toto; cin >> toto; */
+ };
+
+
diff --git a/Maillage/DdlElement.h b/Maillage/DdlElement.h
new file mode 100644
index 0000000..c059f73
--- /dev/null
+++ b/Maillage/DdlElement.h
@@ -0,0 +1,171 @@
+
+// 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-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 .
+//
+// For more information, please consult: .
+
+/************************************************************************
+ * DATE: 23/01/97 *
+ * $ *
+ * AUTEUR: G RIO (mailto:gerardrio56@free.fr) *
+ * $ *
+ * PROJET: Herezh++ *
+ * $ *
+ ************************************************************************
+ * BUT: Definition, gestion et stockage des ddl de l'element. *
+ * $ *
+ * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * *
+ * VERIFICATION: *
+ * *
+ * ! date ! auteur ! but ! *
+ * ------------------------------------------------------------ *
+ * ! ! ! ! *
+ * $ *
+ * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' *
+ * MODIFICATIONS: *
+ * ! date ! auteur ! but ! *
+ * ------------------------------------------------------------ *
+ * $ *
+ ************************************************************************/
+#ifndef DDLELEMENT_H
+#define DDLELEMENT_H
+
+#include "Tableau_T.h"
+#include "DdlNoeudElement.h"
+//#ifdef SYSTEM_MAC_OS_X
+// #include // a priori ce n'est pas portable
+//#el
+#if defined SYSTEM_MAC_OS_CARBON
+ #include // a priori ce n'est pas portable
+#else
+ #include // pour le flot en memoire centrale
+#endif
+#include
+#include