introduction du répertoire Tableaux : correspond aux tableaux génériques et template

This commit is contained in:
Gérard Rio 2021-09-28 17:59:27 +02:00
parent f43e5da7ec
commit 0e0f950eef
13 changed files with 2628 additions and 0 deletions

321
Tableaux/TabOper_T.h Normal file
View file

@ -0,0 +1,321 @@
// 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: 23/01/97 *
* $ *
* AUTEUR: G RIO (mailto:gerardrio56@free.fr) *
* $ *
* PROJET: Herezh++ *
* $ *
************************************************************************
* BUT: une spécialisation du tableau en incluant une *
* surchage d'opérateurs courants. Le template n'est pas utilisable *
* par tous les objets: ces derniers doivent posséder également *
* les surcharges correspondantes. *
* $ *
* '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' *
* VERIFICATION: *
* *
* ! date ! auteur ! but ! *
* ------------------------------------------------------------ *
* ! ! ! ! *
* *
* $ *
* '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' *
* MODIFICATIONS:
* *
* ! date ! auteur ! but ! *
* ------------------------------------------------------------ *
* *
* $ *
* *
************************************************************************/
#ifndef TABOPER_T_H
#define TABOPER_T_H
#include "Tableau_T.h"
/// @addtogroup Les_Tableaux_generiques
/// @{
///
template <class T>
class TabOper : public Tableau<T>
{
public :
// CONSTRUCTEURS :
// Constructeur par defaut
TabOper () : Tableau<T>() {};
// Constructeur fonction de la taille du tableau
TabOper (int nb) : Tableau<T>(nb) {};
// Constructeur fonction de la taille du tableau et d'une
// valeur d'initialisation pour les composantes
TabOper (int nb,T val) : Tableau<T>(nb,val) {};
// Constructeur fonction d'un tableau de composantes de type T
TabOper (int nb,T* tab) : Tableau<T>(nb,tab) {} ;
// Constructeur de copie
TabOper (const TabOper<T> & tab) : Tableau<T>(tab) {} ;
// DESTRUCTEUR :
~TabOper (){};
// METHODES :
// Surcharge de l'operateur + : addition entre deux tableaux
TabOper<T> operator+ (const TabOper<T>& vec);
// Surcharge de l'operateur - : soustraction entre deux tableaux
TabOper<T> operator- (const TabOper<T>& vec);
// Surcharge de l'operateur - : oppose d'un tableau
//TabOper operator- ();
TabOper<T> operator- ();
// Surcharge de l'operateur +=
void operator+= (const TabOper<T>& vec);
// Surcharge de l'operateur -=
void operator-= (const TabOper<T>& vec);
// Surcharge de l'operateur *= : multiplication d'un scalaire par un tableau
void operator*= (double val);
// Surcharge de l'operateur * : multiplication d'un vecteur par un scalaire
//TabOper<T> operator* (double val);
inline TabOper<T> operator* (double val);
// Surcharge de l'operateur / : division des composantes d'un vecteur par un scalaire
TabOper<T> operator/ (double val);
// Surcharge de l'operateur /= : division des composantes d'un vecteur par un scalaire
void operator/= (double val);
// mise a zero d'un vecteur
void Zero();
};
/// @} // end of group
template <class T>
TabOper<T> operator* (double val,TabOper<T>& vec)
// Surcharge de l'operateur * : multiplication entre un scalaire et un tableau
{ return (vec*val); };
template <class T> TabOper<T>
TabOper<T>::operator+ (const TabOper<T>& vec)
// Surcharge de l'operateur + : addition entre deux tableaux
// N.B.: Les tableaux doivent etre de meme taille
{
#ifdef MISE_AU_POINT
if ( this->taille!=vec.taille )
{ cout << "\nErreur : tailles non egales !\n";
cout << "TabOper::OPERATOR+ (TabOper ) \n";
Sortie(1);
};
#endif
TabOper result(this->taille);
T* ptr1=this->t;
T* ptr2=vec.t;
T* ptr3=result.t;
for (int i=0;i<this->taille;i++)
// somme des composantes des deux tableaux vec et v, puis stockage
// dans le tableau result
(*ptr3++)=(*ptr1++)+(*ptr2++);
return result;
}
template <class T> TabOper<T>
TabOper<T>::operator- (const TabOper<T>& vec)
// Surcharge de l'operateur - : soustraction entre deux tableaux
// N.B.: Les tableaux doivent etre de meme taille
{
#ifdef MISE_AU_POINT
if ( this->taille!=vec.taille )
{ cout << "\nErreur : tailles non egales !\n";
cout << "TabOper::OPERATOR- (TabOper ) \n";
Sortie(1);
};
#endif
TabOper result(this->taille);
T* ptr1=this->t;
T* ptr2=vec.t;
T* ptr3=result.t;
for (int i=0;i<this->taille;i++)
// soustraction des composantes des tableaux vec et v, puis stockage
// dans le tableau result
(*ptr3++)=(*ptr1++)-(*ptr2++);
return result;
}
template <class T> TabOper<T>
TabOper<T>::operator- ()
// Surcharge de l'operateur - : oppose d'un tableau
{ TabOper result(this->taille);
T* ptr1=this->t;
T* ptr2=result.t;
for (int i=0;i<this->taille;i++)
(*ptr2++)=-(*ptr1++);
return result;
}
template <class T> void
TabOper<T>::operator+= (const TabOper<T>& vec)
// Surcharge de l'operateur += : additionne au tableau courant le tableau vec
// N.B.: Les tableaux doivent etre de meme taille
{
#ifdef MISE_AU_POINT
if ( this->taille!=vec.taille )
{ cout << "\nErreur : tailles non egales !\n";
cout << "TabOper::OPERATOR+= (TabOper ) \n";
Sortie(1);
};
#endif
T* ptr1=this->t;
T* ptr2=vec.t;
for (int i=0;i<this->taille;i++)
(*ptr1++)+=(*ptr2++);
}
template <class T> void
TabOper<T>::operator-= (const TabOper<T>& vec)
// Surcharge de l'operateur -= : soustrait au tableau courant le tableau vec
// N.B.: Les tableaux doivent etre de meme taille
{
#ifdef MISE_AU_POINT
if ( this->taille!=vec.taille )
{ cout << "\nErreur : tailles non egales !\n";
cout << "TabOper::OPERATOR-= (TabOper ) \n";
Sortie(1);
};
#endif
T* ptr1=this->t;
T* ptr2=vec.t;
for (int i=0;i<this->taille;i++)
(*ptr1++)-=(*ptr2++);
}
template <class T> void
TabOper<T>::operator*= (double val)
// Surcharge de l'operateur *= : multiplie les composantes du tableau courant par
// le scalaire val
// N.B.: Les tableaux doivent etre de meme taille
{ T* ptr=this->t;
for (int i=0;i<this->taille;i++)
(*ptr++)*=val;
}
template <class T> TabOper <T>
TabOper<T>::operator* (double val)
// Surcharge de l'operateur * : multiplication d'un tableau par un scalaire
{
#ifdef MISE_AU_POINT
if ( this->taille==0 )
{ cout << "\nErreur : taille nulle !\n";
cout << "TabOper::OPERATOR* (T ) \n";
Sortie(1);
};
#endif
TabOper result(this->taille);
T* ptr1=this->t;
T* ptr2=result.t;
for (int i=1;i<=this->taille;i++)
// stockage dans le tableau result du produit des composantes du tableau courant
// avec val
(*ptr2++)=val*(*ptr1++);
return result;
}
template <class T> TabOper<T>
TabOper<T>::operator/ (double val)
// Surcharge de l'operateur / : division des composantes d'un tableau par un scalaire
{
#ifdef MISE_AU_POINT
if ( (this->taille==0) || (val==0) )
{ cout << "\nErreur : taille nulle ou division par zero !\n";
cout << "TabOper::OPERATOR/ (T ) \n";
Sortie(1);
};
#endif
TabOper result(this->taille);
T* ptr1=this->t;
T* ptr2=result.t;
for (int i=1;i<=this->taille;i++)
// stockage dans le tableau result de la division des composantes du tableau courant
// avec val
(*ptr2++)=(*ptr1++)/val;
return result;
}
template <class T> void
TabOper<T>::operator/= (double val)
// Surcharge de l'operateur / : division des composantes d'un tableau par un scalaire
{
#ifdef MISE_AU_POINT
if ( (this->taille==0) || (val==0) )
{ cout << "\nErreur : taille nulle ou division par zero !\n";
cout << "TabOper::OPERATOR/ (T ) \n";
Sortie(1);
};
#endif
T* ptr=this->t;
for (int i=0;i<this->taille;i++)
(*ptr++) /= val;
}
template <class T>
// mise a zero d'un tableau
void TabOper<T>::Zero()
{ T* ptr=this->t;
for (int i=0;i<this->taille;i++)
// affectation des composantes du tableau a 0
(*ptr++)=0.0;
}
#endif

325
Tableaux/Tableau2_T.h Normal file
View file

@ -0,0 +1,325 @@
// 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: 23/01/97 *
* $ *
* AUTEUR: G RIO (mailto:gerardrio56@free.fr) *
* $ *
* PROJET: Herezh++ *
* $ *
************************************************************************
* BUT: définir un tableau template de dimension 2. *
* $ *
* '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * *
* VERIFICATION: *
* *
* ! date ! auteur ! but ! *
* ------------------------------------------------------------ *
* ! ! ! ! *
* $ *
* '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' *
* MODIFICATIONS: *
* ! date ! auteur ! but ! *
* ------------------------------------------------------------ *
* $ *
************************************************************************/
#ifndef TABLEAU2_T_H
#define TABLEAU2_T_H
#include "Tableau_T.h"
/// @addtogroup Les_Tableaux_generiques
/// @{
///
template <class T>
class Tableau2 : public Tableau <T>
{
public :
// CONSTRUCTEURS :
// Constructeur par defaut
Tableau2 ();
// Constructeur fonction de la taille du tableau
// dans le cas d'une taille il s'agit d'un tableau carré
Tableau2 (const int nb);
// cas de deux dimensions différentes
Tableau2 (const int nb1,const int nb2);
// Constructeur fonction de la taille du tableau et d'une
// valeur d'initialisation pour les composantes
//1) tableau carré
Tableau2 (const int nb,const T& val);
//2) tableau rectangulaire
Tableau2 (const int nb1,const int nb2,const T& val);
// Constructeur de copie
Tableau2 (const Tableau2<T> & tab);
// DESTRUCTEUR :
~Tableau2 ();
// METHODES :
inline int Taille1 () const
// Retourne la première taille du tableau
{ return taille1; };
inline int Taille2 () const
// Retourne la seconde taille du tableau
{ return taille2; };
// gestion d'erreur
// cette fonction n'est plus valable d'où la surcharge pour filtrer les
// appels éventuels
inline int Taille () const
{
cout << "\nErreur : fonction non disponible \n" ;
cout << "TABLEAU2_T::Taille () \n";
Sortie(1);
return 0; // pour éviter le warning
};
inline T& operator() (int i, int j)
// Retourne la (ieme,jeme) composante du tableau : acces en lecture et ecriture
{
#ifdef MISE_AU_POINT
if ( (i<1) || (i>taille1) || (j<1) || (j>taille2) )
{ cout << "\nErreur : composante inexistante !, (i,j) demandé = (" << i
<< ',' << j << ")" << '\n';
cout << "TABLEAU2_T::OPERATOR() (int, int ) \n";
Sortie(1);
};
#endif
return this->t[(i-1)*taille2 + j-1];
};
inline T operator() (int i, int j) const
// Retourne la (ieme,jeme) composante du tableau : acces en lecture uniquement
{
#ifdef MISE_AU_POINT
if ( (i<1) || (i>taille1) || (j<1) || (j>taille2) )
{ cout << "\nErreur : composante inexistante !, (i,j) demandé = (" << i
<< ',' << j << ")" << '\n';
cout << "TABLEAU2_T::OPERATOR() (int, int ) \n";
Sortie(1);
};
#endif
return this->t[(i-1)*taille2 + j-1];
};
inline int operator!= (const Tableau2<T>& tab) const
// Surcharge de l'operateur !=
// Renvoie 1 si les deux tableaux ne sont pas egaux
// Renvoie 0 sinon
{ if ( (*this)==tab ) // test de l'egalite des deux tableaux a l'aide
// de l'operateur surcharge ==
return 0;
else
return 1;
};
// Surcharge de l'operateur ==
int operator== (const Tableau2<T>& tab) const ;
// const {return ((*this)==tab); };
// Surcharge de l'operateur d'affectation =
Tableau2<T>& operator= (const Tableau2<T>& tab);
// Change la taille du tableau (la nouvelle taille est n)
// uniquement valable pour les tableaux carrés
// N.B. : Si la nouvelle taille est superieure a l'ancienne alors le tableau est
// complete par defaut
void Change_taille (int n);
// idem et initialisation de toutes les valeurs, anciennes et nouvelles à tb
void Change_taille (int n,const T& tb);
// Change la taille du tableau (les nouvelles tailles sont n1 et n2)
void Change_taille (int n1, int n2);
// Change la taille du tableau (les nouvelles tailles sont n1 et n2)
// et initialisation de toutes les valeurs, anciennes et nouvelles à tb
void Change_taille (int n1, int n2,const T& tb);
// Permet de desallouer l'ensemble des elements du tableau
void Libere ();
protected :
int taille1; // la première taille du tableau
int taille2; // seconde taille du tableau
};
/// @} // end of group
//================================= def des differents elements ==================
// Constructeur par defaut
template <class T>
inline Tableau2<T>::Tableau2 () :
Tableau<T> ()
{ taille1=0;taille2=0;
}
// Constructeur fonction de la taille du tableau
// dans le cas d'une taille il s'agit d'un tableau carré
template <class T>
inline Tableau2<T>::Tableau2 (const int nb) :
Tableau<T> (nb*nb)
{ taille1=nb;taille2=nb;
}
// cas de deux dimensions différentes
template <class T>
inline Tableau2<T>::Tableau2 (const int nb1,const int nb2) :
Tableau<T> (nb1*nb2)
{ taille1=nb1;taille2=nb2;
}
// Constructeur fonction de la taille du tableau et d'une
// valeur d'initialisation pour les composantes
//1) tableau carré
template <class T>
inline Tableau2<T>::Tableau2 (const int nb,const T& val) :
Tableau<T> (nb*nb,val)
{ taille1=nb;taille2=nb;
}
//2) tableau rectangulaire
template <class T>
inline Tableau2<T>::Tableau2 (const int nb1,const int nb2,const T& val) :
Tableau<T> (nb1*nb2,val)
{ taille1=nb1;taille2=nb2;
}
// Constructeur de copie
template <class T>
inline Tableau2<T>::Tableau2 (const Tableau2<T> & tab) :
Tableau<T> (tab)
{ taille1 = tab.taille1;
taille2 = tab.taille2;
}
// DESTRUCTEUR :
template <class T>
inline Tableau2<T>::~Tableau2 ()
{ Libere(); }
// METHODES :
template <class T>
inline Tableau2<T> & Tableau2<T>::operator= (const Tableau2<T> & tab)
// Surcharge de l'operateur = : realise l'egalite entre deux tableaux de pointeurs
{ Tableau<T> & T1 = *this;
//this->Tableau<T>::operator= (T1,T2);
T1 = (Tableau<T>) tab;
taille1 = tab.taille1;
taille2 = tab.taille2;
return (*this);
}
// Change la taille du tableau (la nouvelle taille est n)
// uniquement valable pour les tableaux carrés
// N.B. : Si la nouvelle taille est superieure a l'ancienne alors le tableau est
// complete par defaut
template <class T>
inline void Tableau2<T>::Change_taille (int n)
{
#ifdef MISE_AU_POINT
if (taille1 != taille2)
{ cout << "\nErreur : le changement de taille demandé n'est valide que pour des tableaux carrés,"
<< " ici taille 1= " << taille1 << " et taille2 = " << taille2 << '\n';
cout << "Tableau2<T>::Change_taille (int n) \n";
Sortie(1);
};
if ( n < 0)
{ cout << "\nErreur : la nouvelle taille demandée est négative , n= " << n << '\n';
cout << "Tableau2<T>::Change_taille (int n) \n";
Sortie(1);
};
#endif
this->Tableau<T>::Change_taille (n*n);
taille1 = n; taille2 = n;
}
// idem et initialisation de toutes les valeurs, anciennes et nouvelles à tb
template <class T>
inline void Tableau2<T>::Change_taille (int n,const T& tb)
{
#ifdef MISE_AU_POINT
if (taille1 != taille2)
{ cout << "\nErreur : le changement de taille demandé n'est valide que pour des tableaux carrés,"
<< " ici taille 1= " << taille1 << " et taille2 = " << taille2 << '\n';
cout << "Tableau2<T>::Change_taille (int n) \n";
Sortie(1);
};
if ( n < 0)
{ cout << "\nErreur : la nouvelle taille demandée est négative , n= " << n << '\n';
cout << "Tableau2<T>::Change_taille (int n) \n";
Sortie(1);
};
#endif
this->Tableau<T>::Change_taille (n*n,tb);
taille1 = n; taille2 = n;
}
// Change la taille du tableau (les nouvelles tailles sont n1 et n2)
template <class T>
inline void Tableau2<T>::Change_taille (int n1, int n2)
{
#ifdef MISE_AU_POINT
if (( n1 < 0) || (n2 < 0))
{ cout << "\nErreur : une des nouvelles tailles demandée est négative , n1= " << n1 << " n2 = " << n2 <<'\n';
cout << "Tableau2<T>::Change_taille (int n1,int n2) \n";
Sortie(1);
};
#endif
this->Tableau<T>::Change_taille (n1*n2);
taille1 = n1; taille2 = n2;
}
// Permet de desallouer l'ensemble des elements du tableau
template <class T>
inline void Tableau2<T>::Libere ()
{ this->Tableau<T>::Libere ();
taille1 = 0; taille2 = 0;
}
// Surcharge de l'operateur ==
template <class T>
inline int Tableau2<T>::operator== (const Tableau2<T>& tab) const
{ if ((tab.taille1 != taille1) || (tab.taille2 != taille2))
return 0;
else
return this->Tableau<T>::operator== (tab);
}
// Change la taille du tableau (les nouvelles tailles sont n1 et n2)
// et initialisation de toutes les valeurs, anciennes et nouvelles à tb
template <class T>
inline void Tableau2<T>::Change_taille (int n1, int n2,const T& tb)
{
#ifdef MISE_AU_POINT
if (( n1 < 0) || (n2 < 0))
{ cout << "\nErreur : une des nouvelles tailles demandée est négative , n1= " << n1 << " n2 = " << n2 <<'\n';
cout << "Tableau2<T>::Change_taille (int n1,int n2) \n";
Sortie(1);
};
#endif
this->Tableau<T>::Change_taille (n1*n2,tb);
taille1 = n1; taille2 = n2;
}
#endif

307
Tableaux/Tableau4_T.h Normal file
View file

@ -0,0 +1,307 @@
// 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: 8/6/2003 *
* $ *
* AUTEUR: G RIO (mailto:gerardrio56@free.fr) *
* $ *
* PROJET: Herezh++ *
* $ *
************************************************************************
* BUT: définir un tableau template de dimension 4. *
* $ *
* '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * *
* VERIFICATION: *
* *
* ! date ! auteur ! but ! *
* ------------------------------------------------------------ *
* ! ! ! ! *
* $ *
* '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' *
* MODIFICATIONS: *
* ! date ! auteur ! but ! *
* ------------------------------------------------------------ *
* $ *
************************************************************************/
#ifndef TABLEAU4_T_H
#define TABLEAU4_T_H
#include "Tableau_T.h"
/// @addtogroup Les_Tableaux_generiques
/// @{
///
template <class T>
class Tableau4 : public Tableau <T>
{
public :
// CONSTRUCTEURS :
// Constructeur par defaut
Tableau4 ();
// Constructeur fonction de la taille du tableau
// dans le cas d'une taille il s'agit d'un tableau 4 fois la même dim
Tableau4 (const int nb);
// cas de 4 dimensions différentes
Tableau4 (const int nb1,const int nb2,const int nb3,const int nb4);
// Constructeur fonction de la taille du tableau et d'une
// valeur d'initialisation pour les composantes
//1) tableau 4 dim identique
Tableau4 (const int nb,const T& val);
//2) tableau avec des dimensions différentes
Tableau4 (const int nb1,const int nb2,const int nb3,const int nb4,const T& val);
// Constructeur de copie
Tableau4 (const Tableau4<T> & tab);
// DESTRUCTEUR :
~Tableau4 ();
// METHODES :
// Retourne la première taille du tableau
inline int Taille1 () const { return taille1; };
// Retourne la deuxième taille du tableau
inline int Taille2 () const{ return taille2; };
// Retourne la troisième taille du tableau
inline int Taille3 () const{ return taille3; };
// Retourne la quatrième taille du tableau
inline int Taille4 () const{ return taille4; };
// gestion d'erreur
// cette fonction n'est plus valable d'où la surcharge pour filtrer les
// appels éventuels
inline int Taille () const
{
cout << "\nErreur : fonction non disponible \n" ;
cout << "Tableau4_T::Taille () \n";
Sortie(1);
return 0; // pour éviter le warning
};
inline T& operator() (int i, int j, int k, int l)
// Retourne la (ieme,jeme) composante du tableau : acces en lecture et ecriture
{
#ifdef MISE_AU_POINT
if ( (i<1) || (i>taille1) || (j<1) || (j>taille2)
|| (k<1) || (k>taille3) || (l<1) || (l>taille4))
{ cout << "\nErreur : composante inexistante !, (i,j) demandé = (" << i
<< ',' << j << ","<<k <<","<<l<<")" << '\n';
cout << "Tableau4_T::OPERATOR() (int, int, int, int ) \n";
Sortie(1);
};
#endif
return this->t[taille4*((k-1) + taille3*((j-1)+taille2*(i-1))) + l-1];
};
inline T operator() (int i, int j, int k, int l) const
// Retourne la (ieme,jeme) composante du tableau : acces en lecture uniquement
{
#ifdef MISE_AU_POINT
if ( (i<1) || (i>taille1) || (j<1) || (j>taille2)
|| (k<1) || (k>taille3) || (l<1) || (l>taille4))
{ cout << "\nErreur : composante inexistante !, (i,j) demandé = (" << i
<< ',' << j << ","<<k <<","<<l<<")" << '\n';
cout << "Tableau4_T::OPERATOR() (int, int ) \n";
Sortie(1);
};
#endif
return this->t[taille4*((k-1) + taille3*((j-1)+taille2*(i-1))) + l-1];
};
inline int operator!= (const Tableau4<T>& tab) const
// Surcharge de l'operateur !=
// Renvoie 1 si les deux tableaux ne sont pas egaux
// Renvoie 0 sinon
{ if ( (*this)==tab ) // test de l'egalite des deux tableaux a l'aide
// de l'operateur surcharge ==
return 0;
else
return 1;
};
// Surcharge de l'operateur ==
int operator== (const Tableau4<T>& tab) const ;
// const {return ((*this)==tab); };
// Surcharge de l'operateur d'affectation =
Tableau4<T>& operator= (const Tableau4<T>& tab);
// Change la taille du tableau (la nouvelle taille est n)
// uniquement valable pour les tableaux de dimension identique
// N.B. : Si la nouvelle taille est superieure a l'ancienne alors le tableau est
// complete par defaut, mais les valeurs anciennes et nouvelles sont mises à la valeur par défaut de T
// contrairement au Tableau_T
void Change_taille (int n);
// Change la taille du tableau (les nouvelles tailles sont n1 et n2,n3,n4)
// et toutes les valeurs sont initialisées à la valeur par défaut de T
void Change_taille (int n1, int n2,int n3, int n4);
// Change la taille du tableau (la nouvelle taille est n)
// et initialisation de toutes les valeurs, anciennes et nouvelles à tb
void Change_taille (int n,T& tb)
{ cout << "\n fonction non disponible pour des tableaux a quatre dim"
<< "\n Tableau4<T>::Change_taille (int n,T& tb)"; Sortie(1); };
// Permet de desallouer l'ensemble des elements du tableau
void Libere ();
protected :
int taille1; // la première taille du tableau
int taille2; // seconde taille du tableau
int taille3; // troisième taille du tableau
int taille4; // quatrième taille du tableau
};
/// @} // end of group
//================================= def des differents elements ==================
// Constructeur par defaut
template <class T>
inline Tableau4<T>::Tableau4 () :
Tableau<T> (),taille1(0),taille2(0),taille3(0),taille4(0)
{ }
// Constructeur fonction de la taille du tableau
// dans le cas d'une taille identique
template <class T>
inline Tableau4<T>::Tableau4 (const int nb) :
Tableau<T> (nb*nb*nb*nb),taille1(nb),taille2(nb),taille3(nb),taille4(nb)
{ }
// cas de deux dimensions différentes
template <class T>
inline Tableau4<T>::Tableau4 (const int nb1,const int nb2,const int nb3,const int nb4) :
Tableau<T> (nb1*nb2*nb3*nb4),taille1(nb1),taille2(nb2),taille3(nb3),taille4(nb4)
{ }
// Constructeur fonction de la taille du tableau et d'une
// valeur d'initialisation pour les composantes
//1) tableau de dim identique
template <class T>
inline Tableau4<T>::Tableau4 (const int nb,const T& val) :
Tableau<T> (nb*nb*nb*nb,val),taille1(nb),taille2(nb),taille3(nb),taille4(nb)
{ }
//2) tableau rectangulaire
template <class T>
inline Tableau4<T>::Tableau4 (const int nb1,const int nb2,const int nb3,const int nb4,const T& val) :
Tableau<T> (nb1*nb2*nb3*nb4,val),taille1(nb1),taille2(nb2),taille3(nb3),taille4(nb4)
{ }
// Constructeur de copie
template <class T>
inline Tableau4<T>::Tableau4 (const Tableau4<T> & tab) :
Tableau<T> (tab),taille1(tab.taille1),taille2(tab.taille2)
,taille3(tab.taille3),taille4(tab.taille4)
{ }
// DESTRUCTEUR :
template <class T>
inline Tableau4<T>::~Tableau4 ()
{ Libere(); }
// METHODES :
template <class T>
inline Tableau4<T> & Tableau4<T>::operator= (const Tableau4<T> & tab)
// Surcharge de l'operateur = : realise l'egalite entre deux tableaux de pointeurs
{ Tableau<T> & T1 = *this;
//this->Tableau<T>::operator= (T1,T2);
T1 = (Tableau<T>) tab;
taille1 = tab.taille1;taille2 = tab.taille2;
taille3 = tab.taille3;taille4 = tab.taille4;
return (*this);
}
// Change la taille du tableau (la nouvelle taille est n)
// uniquement valable pour les tableaux carrés
// N.B. : Si la nouvelle taille est superieure a l'ancienne alors le tableau est
// complete par defaut
template <class T>
inline void Tableau4<T>::Change_taille (int n)
{
#ifdef MISE_AU_POINT
if ((taille1 != taille2) || (taille1 != taille3) || (taille1 != taille4)
|| (taille2 != taille3) || (taille2 != taille4))
{ cout << "\nErreur : le changement de taille demande n'est valide que pour des tableaux de meme 4 dimensions,"
<< " ici taille 1= " << taille1 << " et taille2 = " << taille2
<< " et taille3 = " << taille3 << " et taille4 = " << taille4<< '\n';
cout << "Tableau4<T>::Change_taille (int n) \n";
Sortie(1);
};
if ( n < 0)
{ cout << "\nErreur : la nouvelle taille demandée est négative , n= " << n << '\n';
cout << "Tableau4<T>::Change_taille (int n) \n";
Sortie(1);
};
#endif
if (n != taille1)
{ // on intervient que si la nouvelle dimension est différente
T tb; // def d'une valeur par défaut
// déf du tableau avec initialisation à tb
this->Tableau<T>::Change_taille (n*n*n*n,tb);
taille1 = n; taille2 = n;taille3 = n;taille4 = n;
}
}
// Change la taille du tableau (les nouvelles tailles sont n1 et n2)
template <class T>
inline void Tableau4<T>::Change_taille (int n1, int n2,int n3, int n4)
{
#ifdef MISE_AU_POINT
if (( n1 < 0) || (n2 < 0) || (n3<0) || (n4<0))
{ cout << "\nErreur : une des nouvelles tailles demandée est négative , n1= " << n1 << " n2 = " << n2
<< " n3 = " << n3 << " n4 = " << n4 <<'\n';
cout << "Tableau4<T>::Change_taille (int n1,int n2,int n3, int n4) \n";
Sortie(1);
};
#endif
if ( (n1 != taille1) || (n2 != taille2) || (n3 != taille3) || (n4 != taille4))
// dans le cas où il y a un changement de taille on répercute
{ // dimensionnement du nouveau tableau
T tb; // def d'une valeur par défaut
// déf du tableau avec initialisation à tb
this->Tableau<T>::Change_taille (n1*n2*n3*n4,tb);
taille1 = n1; taille2 = n2;taille3 = n3;taille4 = n4;
}
}
// Permet de desallouer l'ensemble des elements du tableau
template <class T>
inline void Tableau4<T>::Libere ()
{ this->Tableau<T>::Libere ();
taille1 = 0; taille2 = 0; taille3 = 0;taille4 = 0;
}
// Surcharge de l'operateur ==
template <class T>
inline int Tableau4<T>::operator== (const Tableau4<T>& tab) const
{ if ((tab.taille1 != taille1) || (tab.taille2 != taille2)
|| (tab.taille3 != taille3) || (tab.taille4 != taille4))
return 0;
else
return this->Tableau<T>::operator== (tab);
}
#endif

1
Tableaux/Tableau_3D.cc Normal file
View file

@ -0,0 +1 @@
// FICHIER : Tableau_3D.cc // CLASSE : Tableau_3D // 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/>. #include <iostream> using namespace std; #include <stdlib.h> #include "Sortie.h" #include "Tableau_3D.h" Tableau_3D::Tableau_3D () // Constructeur par defaut { dim1=0; dim2=0; dim3=0; t=NULL; }; Tableau_3D::Tableau_3D (int d1,int d2,int d3,double val) // Constructeur utile quand les trois dimensions ainsi qu'une // eventuelle valeur d'initialisation sont connues { if ( ( d1<0 ) || ( d2<0 ) || ( d3<0 ) ) { cout << "\nErreur : taille(s) invalide(s) !\n"; cout << "TABLEAU_3D::TABLEAU_3D(int ,int ,int ,double ) \n"; Sortie(1); }; if ( ( d1==0 ) || ( d2==0 ) || ( d3==0 ) ) // cas ou une des dimensions est nulle : initialisation identique // a l'appel du constructeur par defaut { dim1=0; dim2=0; dim3=0; t=NULL; } else // autres cas { dim1=d1; dim2=d2; dim3=d3; t=new double [d1*d2*d3]; // allocation dynamique de la memoire Initialise(val); // initialisation des composantes a val }; }; Tableau_3D::Tableau_3D (const Tableau_3D& tab) // Constructeur de copie { if ( tab.dim1==0 ) // cas ou le tableau copie est vide : initialisation // identique a l'appel du constructeur par defaut { dim1=0; dim2=0; dim3=0; t=NULL; } else { dim1=tab.dim1; dim2=tab.dim2; dim3=tab.dim3; t=new double [dim1*dim2*dim3]; // allocation dynamique de la memoire double* ptr1=t; double* ptr2=tab.t; for (int i=0;i<dim1;i++) { for (int j=0;j<dim2;j++) { for (int k=0;k<dim3;k++) { (*ptr1++)=(*ptr2++); // copie des composantes du tableau tab }; }; }; }; }; Tableau_3D::~Tableau_3D () // Destructeur (N.B. : Apres l'appel de ce destructeur le tableau est identique // a ce qu'il aurait ete a la suite d'un appel du constructeur par defaut) { Libere(); }; void Tableau_3D::Initialise (double val) // Initialisation des composantes du tableau a trois dimensions { double* ptr=t; for (int i=0;i<dim1;i++) { for (int j=0;j<dim2;j++) { for (int k=0;k<dim3;k++) { (*ptr++)=val; // initialisation des composantes a val }; }; }; }; void Tableau_3D::Libere () // Apres l'appel de cette methode le tableau est identique a ce qu'il // aurait ete a la suite d'un appel du constructeur par defaut { if ( dim1>0 ) delete [] t; // desallocation de la place memoire else { if ( t!=NULL ) { cout << "\nErreur de liberation de la place memoire\n"; cout << "TABLEAU_3D::LIBERE() \n"; Sortie(1); } }; t=NULL; dim1=0; dim2=0; dim3=0; }; Tableau_3D& Tableau_3D::operator= (const Tableau_3D& tab) // Surcharge de l'operateur = : egalite entre deux tableaux a trois dimensions { if ( t!=NULL ) Libere(); // cas ou le tableau se trouvant a gauche du signe = // n'est pas vide : desallocation de ce tableau if ( tab.dim1==0 ) // cas ou le tableau se trouvant a droite du signe = est vide : initialisation // identique a l'appel du constructeur par defaut { dim1=0; dim2=0; dim3=0; t=NULL; } else // autres cas { dim1=tab.dim1; dim2=tab.dim2; dim3=tab.dim3; t=new double [dim1*dim2*dim3]; // allocation de la place memoire double* ptr1=t; double* ptr2=tab.t; // copie des elements du tableau se trouvant a droite dans le tableau se trouvant // a gauche du signe d'affectation for (int i=0;i<dim1;i++) { for (int j=0;j<dim2;j++) { for (int k=0;k<dim3;k++) { (*ptr1++)=(*ptr2++); }; }; }; }; return (*this); };

197
Tableaux/Tableau_3D.h Normal file
View file

@ -0,0 +1,197 @@
// FICHIER : Tableau_3D.h
// CLASSE : Tableau_3D
// 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: 23/01/97 *
* $ *
* AUTEUR: G RIO (mailto:gerardrio56@free.fr) *
* $ *
* PROJET: Herezh++ *
* $ *
************************************************************************
* La classe Tableau_3D permet de declarer des tableaux a trois dimensions dont
* les composantes sont de type double.
* Les composantes d'une instance de cette classe sont stockees en ligne et la memoire
* est allouee dynamiquement.
* $ *
* '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' *
* *
* VERIFICATION: *
* *
* ! date ! auteur ! but ! *
* ------------------------------------------------------------ *
* ! ! ! ! *
* $ *
* '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' *
* MODIFICATIONS: *
* ! date ! auteur ! but ! *
* ------------------------------------------------------------ *
* $ *
************************************************************************/
// La classe Tableau_3D permet de declarer des tableaux a trois dimensions dont
// les composantes sont de type double.
// Les composantes d'une instance de cette classe sont stockees en ligne et la memoire
// est allouee dynamiquement.
#ifndef TABLEAU_3D_H
#define TABLEAU_3D_H
#include <iostream>
#include <stdlib.h>
#include "Sortie.h"
/// @addtogroup Les_Tableaux_generiques
/// @{
///
class Tableau_3D
{
public :
// CONSTRUCTEURS :
// Constructeur par defaut
Tableau_3D ();
// Constructeur utile quand les trois dimensions ainsi qu'une
// eventuelle valeur d'initialisation sont connues
Tableau_3D (int d1,int d2,int d3,double val=0.0);
// Constructeur de copie
Tableau_3D (const Tableau_3D& tab);
// DESTRUCTEUR :
~Tableau_3D ();
// METHODES :
inline void Affiche () const
// Affiche les donnees du tableau a trois dimensions
{
cout << "Tableau 3D\n";
cout << "Dimension 1 : " << Taille1() << " .\n";
cout << "Dimension 2 : " << Taille2() << " .\n";
cout << "Dimension 3 : " << Taille3() << " .\n";
cout << "Composante(s) :\n{\n";
for (int i=0;i<dim1;i++)
{
cout << "\t[ ";
for (int j=0;j<dim2;j++)
{
cout << "[ ";
for (int k=0;k<dim3;k++)
{
cout << *(t+dim3*dim2*i+dim3*j+k) << " ";
};
cout << "] ";
};
cout << "] \n";
};
cout << "}\n\n";
};
inline int Taille1 () const
// Retourne la taille de la premiere dimension
{
return dim1;
};
inline int Taille2 () const
// Retourne la taille de la deuxieme dimension
{
return dim2;
};
inline int Taille3 () const
// Retourne la taille de la troisieme dimension
{
return dim3;
};
inline double& operator() (int i,int j,int k)
// Retourne la ieme jieme kieme composante
{
if ( (i<1) || (i>dim1) || (j<1) || (j>dim2) || (k<1) || (k>dim3) )
{
cout << "\nErreur : composante inexistante !\n";
cout << "TABLEAU_3D::OPERATOR[](int ,int ,int ) \n";
Sortie(1);
};
return *(t+dim3*dim2*(i-1)+dim3*(j-1)+(k-1));
};
// Initialisation des composantes du tableau
void Initialise (double val=0.0);
// Desallocation des composantes du tableau
void Libere ();
// Surcharge de l'operateur = : egalite entre deux tableaux a trois dimensions
Tableau_3D& operator= (const Tableau_3D& tab);
protected :
int dim1; // dimension dans la premiere direction
int dim2; // dimension dans la seconde direction
int dim3; // dimension dans la troisieme direction
double* t; // tableau des composantes
};
/// @} // end of group
#endif

1
Tableaux/Tableau_4D.cc Normal file

File diff suppressed because one or more lines are too long

213
Tableaux/Tableau_4D.h Normal file
View file

@ -0,0 +1,213 @@
// FICHIER : Tableau_4D.h
// CLASSE : Tableau_4D
// 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: 23/01/97 *
* $ *
* AUTEUR: G RIO (mailto:gerardrio56@free.fr) *
* $ *
* PROJET: Herezh++ *
* $ *
************************************************************************
* La classe Tableau_4D permet de declarer des tableaux a quatre dimensions dont
* les composantes sont de type double.
* Les composantes d'une instance de cette classe sont stockees en ligne et la memoire
* est allouee dynamiquement.
* $ *
* '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' *
* *
* VERIFICATION: *
* *
* ! date ! auteur ! but ! *
* ------------------------------------------------------------ *
* ! ! ! ! *
* $ *
* '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' *
* MODIFICATIONS: *
* ! date ! auteur ! but ! *
* ------------------------------------------------------------ *
* $ *
************************************************************************/
// La classe Tableau_4D permet de declarer des tableaux a quatre dimensions dont
// les composantes sont de type double.
// Les composantes d'une instance de cette classe sont stockees en ligne et la memoire
// est allouee dynamiquement.
#ifndef TABLEAU_4D_H
#define TABLEAU_4D_H
#include <iostream>
#include <stdlib.h>
#include "Sortie.h"
/// @addtogroup Les_Tableaux_generiques
/// @{
///
class Tableau_4D
{
public :
// CONSTRUCTEURS :
// Constructeur par defaut
Tableau_4D ();
// Constructeur utile quand les quatre dimensions ainsi qu'une
// eventuelle valeur d'initialisation sont connues
Tableau_4D (int d1,int d2,int d3,int d4,double val=0.0);
// Constructeur de copie
Tableau_4D (const Tableau_4D& tab);
// DESTRUCTEUR :
~Tableau_4D ();
// METHODES :
inline void Affiche ()
// Affiche les donnees du tableau a trois dimensions
{
cout << "Tableau 4D\n";
cout << "Dimension 1 : " << Taille1() << " .\n";
cout << "Dimension 2 : " << Taille2() << " .\n";
cout << "Dimension 3 : " << Taille3() << " .\n";
cout << "Dimension 4 : " << Taille4() << " .\n";
cout << "Composante(s) :\n{\n";
for (int i=0;i<dim1;i++)
{
cout << "( ";
for (int j=0;j<dim2;j++)
{
cout << "\t[ ";
for (int k=0;k<dim3;k++)
{
cout << "[ ";
for (int l=0;l<dim4;l++)
{
cout << *(t+dim4*dim3*dim2*i+dim4*dim3*j+dim4*k+l) << " ";
};
cout << " ]";
};
cout << "] \n";
};
cout << ") \n";
};
cout << "}\n\n";
};
inline int Taille1 ()
// Retourne la taille de la premiere dimension
{
return dim1;
};
inline int Taille2 ()
// Retourne la taille de la deuxieme dimension
{
return dim2;
};
inline int Taille3 ()
// Retourne la taille de la troisieme dimension
{
return dim3;
};
inline int Taille4 ()
// Retourne la taille de la quatrieme dimension
{
return dim4;
};
inline double& operator() (int i,int j,int k,int l)
// Retourne la ieme jieme kieme lieme composante
{
if ( (i<1) || (i>dim1) || (j<1) || (j>dim2)
|| (k<1) || (k>dim3) || (l<1) || (l>dim4) )
{
cout << "\nErreur : composante inexistante !\n";
cout << "TABLEAU_4D::OPERATOR[](int ,int ,int ,int ) \n";
Sortie(1);
};
return *(t+dim4*dim3*dim2*(i-1)+dim4*dim3*(j-1)+dim4*(k-1)+(l-1));
};
// Initialisation des composantes du tableau
void Initialise (double val=0.0);
// Desallocation des composantes du tableau
void Libere ();
// Surcharge de l'operateur = : egalite entre deux tableaux a quatre dimensions
Tableau_4D& operator= (const Tableau_4D& tab);
protected :
int dim1; // dimension dans la premiere direction
int dim2; // dimension dans la seconde direction
int dim3; // dimension dans la troisieme direction
int dim4; // dimension dans la quatrieme direction
double* t; // tableau des composantes
};
/// @} // end of group
#endif

1
Tableaux/Tableau_5D.cc Normal file

File diff suppressed because one or more lines are too long

230
Tableaux/Tableau_5D.h Normal file
View file

@ -0,0 +1,230 @@
// FICHIER : Tableau_5D.h
// CLASSE : Tableau_5D
// 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: 23/01/97 *
* $ *
* AUTEUR: G RIO (mailto:gerardrio56@free.fr) *
* $ *
* PROJET: Herezh++ *
* $ *
************************************************************************
* La classe Tableau_5D permet de declarer des tableaux a cinq dimensions dont
* les composantes sont de type double.
* Les composantes d'une instance de cette classe sont stockees en ligne et la memoire
* est allouee dynamiquement.
* $ *
* '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' *
* *
* VERIFICATION: *
* *
* ! date ! auteur ! but ! *
* ------------------------------------------------------------ *
* ! ! ! ! *
* $ *
* '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' *
* MODIFICATIONS: *
* ! date ! auteur ! but ! *
* ------------------------------------------------------------ *
* $ *
************************************************************************/
// La classe Tableau_5D permet de declarer des tableaux a cinq dimensions dont
// les composantes sont de type double.
// Les composantes d'une instance de cette classe sont stockees en ligne et la memoire
// est allouee dynamiquement.
#ifndef TABLEAU_5D_H
#define TABLEAU_5D_H
#include <iostream>
#include <stdlib.h>
#include "Sortie.h"
/// @addtogroup Les_Tableaux_generiques
/// @{
///
class Tableau_5D
{
public :
// CONSTRUCTEURS :
// Constructeur par defaut
Tableau_5D ();
// Constructeur utile quand les cinq dimensions ainsi qu'une
// eventuelle valeur d'initialisation sont connues
Tableau_5D (int d1,int d2,int d3,int d4,int d5,double val=0.0);
// Constructeur de copie
Tableau_5D (const Tableau_5D& tab);
// DESTRUCTEUR :
~Tableau_5D ();
// METHODES :
inline void Affiche ()
// Affiche les donnees du tableau a cinq dimensions
{
cout << "Tableau 5D\n";
cout << "Dimension 1 : " << Taille1() << " .\n";
cout << "Dimension 2 : " << Taille2() << " .\n";
cout << "Dimension 3 : " << Taille3() << " .\n";
cout << "Dimension 4 : " << Taille4() << " .\n";
cout << "Dimension 5 : " << Taille5() << " .\n";
cout << "Composante(s) :\n{\n";
for (int i=0;i<dim1;i++)
{
cout << "( ";
for (int j=0;j<dim2;j++)
{
cout << "\t[ ";
for (int k=0;k<dim3;k++)
{
cout << "[ ";
for (int l=0;l<dim4;l++)
{
cout << "[ ";
for (int m=0;m<dim5;m++)
{
cout << *(t+dim5*dim4*dim3*dim2*i+dim5*dim4*dim3*j
+dim5*dim4*k+dim5*l+m) << " ";
};
cout << " ]";
};
cout << " ]";
};
cout << "] \n";
};
cout << ") \n";
};
cout << "}\n\n";
};
inline int Taille1 ()
// Retourne la taille de la premiere dimension
{
return dim1;
};
inline int Taille2 ()
// Retourne la taille de la deuxieme dimension
{
return dim2;
};
inline int Taille3 ()
// Retourne la taille de la troisieme dimension
{
return dim3;
};
inline int Taille4 ()
// Retourne la taille de la quatrieme dimension
{
return dim4;
};
inline int Taille5 ()
// Retourne la taille de la cinquieme dimension
{
return dim5;
};
inline double& operator() (int i,int j,int k,int l,int m)
// Retourne la ieme jieme kieme lieme mieme composante
{
if ( (i<1) || (i>dim1) || (j<1) || (j>dim2)
|| (k<1) || (k>dim3) || (l<1) || (l>dim4) || (m<1) || (m>dim5) )
{
cout << "\nErreur : composante inexistante !\n";
cout << "TABLEAU_3D::OPERATOR[](int ,int ,int ) \n";
Sortie(1);
};
return *(t+dim5*dim4*dim3*dim2*(i-1)+dim5*dim4*dim3*(j-1)+dim5*dim4*(k-1)
+dim5*(l-1)+(m-1));
};
// Initialisation des composantes du tableau
void Initialise (double val=0.0);
// Desallocation des composantes du tableau
void Libere ();
// Surcharge de l'operateur = : egalite entre deux tableaux a cinq dimensions
Tableau_5D& operator= (const Tableau_5D& tab);
protected :
int dim1; // dimension dans la premiere direction
int dim2; // dimension dans la seconde direction
int dim3; // dimension dans la troisieme direction
int dim4; // dimension dans la quatrieme direction
int dim5; // dimension dans la cinquieme direction
double* t; // tableau des composantes
};
/// @} // end of group
#endif

889
Tableaux/Tableau_T.h Normal file
View file

@ -0,0 +1,889 @@
// FICHIER : Tableau_T.h
// CLASSE : Tableau_T
// 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: 23/01/97 *
* $ *
* AUTEUR: G RIO (mailto:gerardrio56@free.fr) *
* $ *
* PROJET: Herezh++ *
* $ *
************************************************************************
* BUT: La classe Tableau_T permet de declarer des tableaux de *
* longueur determinee et dont les composantes sont du type T fixe *
* a la declaration d'un objet de cette classe. L'operateur = doit *
* etre surcharge pour les objets de la classe T. *
* L'allocation memoire est dynamique et permet de declarer des *
* tableaux de tailles indifferentes. *
* $ *
* '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' *
* *
* VERIFICATION: *
* *
* ! date ! auteur ! but ! *
* ------------------------------------------------------------ *
* ! ! ! ! *
* $ *
* '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' *
* MODIFICATIONS: *
* ! date ! auteur ! but ! *
* ------------------------------------------------------------ *
* $ *
************************************************************************/
#ifndef TABLEAU_T_H
#define TABLEAU_T_H
//#include "Debug.h"
#include <iostream>
#include <stdlib.h>
using namespace std; //introduces namespace std
#include "Sortie.h"
#include <iomanip>
#include <string>
#include "ParaGlob.h"
/** @defgroup Les_Tableaux_generiques
*
* BUT: groupe des tableaux génériques: typiquement des templates, mais pas seulement
*
*
* \author Gérard Rio
* \version 1.0
* \date 23/01/97
* \brief groupe des tableaux génériques: typiquement des templates, mais pas seulement
*
*/
/// @addtogroup Les_Tableaux_generiques
/// @{
///
template <class T>
class Tableau
{
// surcharge de l'operator d'ecriture
friend ostream & operator << (ostream & sort, const Tableau<T> & tab)
{ // tout d'abord un indicateur donnant le type
sort << "Tableau :taille= " << tab.taille << " ";
for (int i=0;i<tab.taille;i++)
{ sort << setprecision(ParaGlob::NbdigdoCA()) << tab.t[i] ; sort << " "; }
// sort << "\n";
return sort;
}
// affichage du premier élément pour les messages d'erreur
friend void Affiche_premier_elem(ostream &sort , const Tableau<T> & tab )
{ if (tab.taille > 0)
{sort << "\n le premier element du tableau pour info: ";
sort << tab.t[0] ;
sort << endl;};
}
public :
// CONSTRUCTEURS :
// Constructeur par defaut
Tableau ();
// Constructeur fonction de la taille du tableau
Tableau (int nb);
// Constructeur fonction de la taille du tableau et d'une
// valeur d'initialisation pour les composantes
Tableau (int nb,T val);
// Constructeur fonction de la taille du tableau et d'une
// référence: pas facile à faire car ensuite on manipule des pointeurs de références !!
// bref on ne sait pas ce que l'on fait , dans ce cas il vaut mieux utiliser
// un tableau de pointeur de la grandeur en question
// Constructeur fonction d'un tableau de composantes de type T
Tableau (int nb,T* tab);
// Constructeur de copie
Tableau (const Tableau<T> & tab);
// DESTRUCTEUR :
~Tableau ();
// METHODES :
inline int Taille () const
// Retourne la taille du tableau
{ return taille; };
// Retourne la ieme composante du tableau : acces en lecture et ecriture
T& operator() (int i) const;
// cas particulier ou l'on ne veut pas modifier les valeurs
const T val_const(int i) const;
const T& ref_const(int i) const;
// Surcharge de l'operateur !=
// Renvoie 1 si les deux tableaux ne sont pas egaux
// Renvoie 0 sinon
int operator!= (const Tableau<T>& tab) const;
// Surcharge de l'operateur ==
int operator== (const Tableau<T>& tab) const ;
// Surcharge de l'operateur d'affectation =
Tableau<T>& operator= (const Tableau<T>& tab);
// Change la taille du tableau (la nouvelle taille est n)
void Change_taille (int n);
// Change la taille du tableau (la nouvelle taille est n)
// et initialisation de toutes les valeurs, anciennes et nouvelles à tb
void Change_taille (int n,const T& tb);
// Enleve la ieme composante du tableau
void Enleve (int i);
// Enleve toutes les composantes du tableau dont la valeur est val
void Enleve_val (T val);
// Permet de desallouer l'ensemble des elements du tableau
void Libere ();
// initialisation d'un tableau à partir d'une liste
// premier du tableau == premier de la liste
void Init_from_list(const list<T> & liste );
// opération inverse: remplissage d'une liste à partir du tableau
// premier de la liste == premier du tableau
void Init_list(list<T> & liste );
// opération de lecture sur un flot d'entrée
// les données sont le type puis la dimension puis les datas
istream & Entree(istream &);
// les données sont le type puis la dimension puis les datas
// ici il n'y a pas redimentionnement du tableau si la taille est suffisante
istream & Entree_sans_redim(istream &);
// lectures sur le flot si la taille du tableau est identique ou supérieure à celle lue
// retour d'un pointeur nulle
// sinon, si la taille lue est supérieure à la taille du tableau actuellement existant
// il y a création d'un nouveau tableau de même type avec la taille adéquate
// et retour d'un pointeur sur le nouveau tableau
Tableau<T> * New_en_lecture_si_taille_superieur_a_lire(istream &);
// opération d'écriture non formatée
// les données sont le type la dimension puis les datas, chacun
// séparé par un espace
ostream & Sortir(ostream &) const ;
// idem mais sans retour chariot à la fin
ostream & Sortir_sansRet(ostream &) const;
// test si la valeur passée en argument apartient au tableau
// ramène 0 si ne contient pas
// ramène l'indice dans le tableau de la grandeur si appartenance
int Contient(const T& e) const;
// initialisation avec la valeur passée en argument
bool Inita(const T& e) ;
protected :
int taille; // taille du tableau
T* t; // pointeur sur les composantes du tableau
};
/// @} // end of group
// cas de la surcharge de la lecture : il y a deux cas a considérer
// 1) cas d'élément constant : dans ce cas la lecture est une erreur
// 2) cas d'élément non constant : lecture permise
// les deux fonctions sont en dehors de la classe car sinon dans la classe il y a pris en compte
// du fait d'avoir des éléments constants ou non ce qui n'a pas l'air évident à traité sinon par
// deux classes différentes
template <class T>
// surcharge de l'operator de lecture d'élément non constant
istream & operator >> (istream & entree, Tableau<T> & tab)
{ // vérification du type
string type;
entree >> type;
if (type != "Tableau")
{Sortie (1);
return entree;
};
int dim; entree >> type >> dim;
int tabtaille = tab.Taille();
if (dim != tabtaille)
tab.Change_taille(dim);
for (int i=1;i<=dim;i++)
entree >> tab(i);
return entree;
}
//================================= def des differents elements ==================
template <class T>
inline Tableau<T>::Tableau ()
// Constructeur par defaut
{ taille=0;
t=NULL;
}
template <class T>
inline Tableau<T>::Tableau (int nb)
// Constructeur devant etre utilise quand la dimension nb du tableau est connu
{
#ifdef MISE_AU_POINT
if ( nb<0 )
// cas ou la taille selectionnee est negative
{ cout << "\nErreur : taille invalide !\n";
cout << "TABLEAU_T::TABLEAU_T(int ) \n";
Sortie(1);
};
#endif
if ( nb==0 )
// cas ou la taille selectionnee est nulle : initialisation identique a
// l'appel du constructeur par defaut
{ taille=0;
t=NULL;
}
else
// autres cas
{ taille=nb;
t=new T [taille]; // allocation de la place memoire
T* ptr=t;
for (int i=0;i<taille;i++)
// initialisation des composantes a l'aide de l'attribut statique defaut
// (*ptr++)=defaut;
(*ptr++)= T();
};
}
template <class T>
inline Tableau<T>::Tableau (int nb, T val)
// Constructeur permettant de creer un tableau dont toutes les composantes
// sont egales a val
// N.B: La valeur de l'attribut defaut est fixee a val
{ // initialisation de l'element defaut
#ifdef MISE_AU_POINT
if ( nb<0 )
// cas ou la taille selectionnee est negative
{ cout << "\nErreur : taille invalide !\n";
cout << "TABLEAU_T::TABLEAU_T(int ,T ) \n";
Sortie(1);
};
#endif
if ( nb==0 )
// cas ou la taille selectionnee est nulle : initialisation identique a
// l'appel du constructeur par defaut
{ taille=0;
t=NULL;
}
else
// autres cas
{ taille=nb;
t=new T [taille]; // allocation de la place memoire
T* ptr=t;
for (int i=0;i<taille;i++)
// initialisation des composantes a val
(*ptr++)=val;
};
}
template <class T>
inline Tableau<T>::Tableau (int nb,T* tab)
// Constructeur permettant de creer un tableau de taille nb dont les composantes
// sont initialisees a l'aide des valeurs de tab
// N.B.: tab doit avoir au moins nb composantes (aucun test n'est realise pour le
// verifier !!!)
{
#ifdef MISE_AU_POINT
if ( nb<0 )
// cas ou la taille selectionnee est negative
{ cout << "\nErreur : taille invalide !\n";
cout << "TABLEAU_T::TABLEAU_T(int ,T* ) \n";
Sortie(1);
};
#endif
if ( nb==0 )
// cas ou la taille selectionnee est nulle : initialisation identique a
// l'appel du constructeur par defaut
{
taille=0;
t=NULL;
}
else
// autres cas
{
taille=nb;
t=new T [taille]; // allocation de la place memoire
T* ptr1=t;
T* ptr2=tab;
for (int i=0;i<taille;i++)
// copie des composantes du tableau tab dans le tableau declare
(*ptr1++)=(*ptr2++);
};
}
template <class T>
inline Tableau<T>::Tableau (const Tableau<T>& tab)
// Constructeur de copie
{ if ( tab.taille==0 )
// cas ou le tableau copie est vide : initialisation identique a l'appel
// du constructeur par defaut
{ t=NULL;
taille=0;
}
else
// autres cas
{ t=new T [tab.taille]; // allocation de la place memoire
T* ptr1=t;
T* ptr2=tab.t;
for (int i=0;i<tab.taille;i++)
// copie des composantes du tableau tab dans le tableau declare
(*ptr1++)=(*ptr2++);
taille=tab.taille;
};
}
template <class T>
inline Tableau<T>::~Tableau ()
// Destructeur (N.B. : Apres l'appel de ce destructeur le tableau est identique
// a ce qu'il aurait ete a la suite d'un appel du constructeur par defaut)
{ Libere(); }
template <class T> void
inline Tableau<T>::Change_taille (int n)
// Permet de modifier la taille du tableau
// N.B. : Si la nouvelle taille est superieure a l'ancienne alors le tableau est
// complete par defaut
{
#ifdef MISE_AU_POINT
if ( n<0 )
// cas ou la taille selectionnee est negative
{ cout << "\nErreur : taille invalide !\n";
cout << "TABLEAU_T::CHANGE_TAILLE(int ) \n";
cout << " NB: taille actuelle = " << taille << " ";
Sortie(1);
}
#endif
if ( n == taille ) // taille identique , on ne fait rien
return;
if ( n==0 )
// cas ou la taille selectionnee est nulle : initialisation identique a
// l'appel du constructeur par defaut
{
taille=0;
if ( t!= NULL) delete [] t;
t=NULL;
return ;
};
T* tempo;
tempo=new T [n];
T* ptr1=t;
T* ptr2=tempo;
if ( n<=taille )
// cas ou la taille selectionnee est inferieure a la taille d'origine
{
for (int i=0;i<n;i++)
// copie des composantes du tableau d'origine dans le tableau pointe par tempo
(*ptr2++)=(*ptr1++);
}
else if ( n>taille )
// cas ou la taille selectionnee est superieure a la taille d'origine
{
for (int i=0;i<taille;i++)
// copie des composantes du tableau d'origine dans le tableau pointe par tempo
(*ptr2++)=(*ptr1++);
for (int i=taille;i<n;i++)
// initialisation des composantes supplementaires a l'aide de l'element par defaut
///(*ptr2++)=defaut;
(*ptr2++)=T();
};
delete [] t; // desallocation du tableau pointe par t
t=tempo; // affectation du pointeur t au pointeur tempo
taille=n;
}
template <class T> void
inline Tableau<T>::Change_taille (int n,const T& tb)
// Change la taille du tableau (la nouvelle taille est n)
// et initialisation de toutes les valeurs, anciennes et nouvelles à tb
{
#ifdef MISE_AU_POINT
if ( n<0 )
// cas ou la taille selectionnee est negative
{ cout << "\nErreur : taille invalide !\n";
cout << "TABLEAU_T::CHANGE_TAILLE(int ) \n";
cout << " NB: taille actuelle = " << taille << " ";
Sortie(1);
}
#endif
if ( n == taille ) // taille identique , on ne fait que l'initialisation
{ T* ptr2= t;
for (int i=0;i<n;i++)
// copie des composantes à tb
(*ptr2++)=tb;
return;
}
if ( n==0 )
// cas ou la taille selectionnee est nulle : initialisation identique a
// l'appel du constructeur par defaut
{
taille=0;
if ( t!= NULL) delete [] t;
t=NULL;
return ;
};
T* tempo;
tempo=new T [n];
T* ptr2=tempo;
if ( n<=taille )
// cas ou la taille selectionnee est inferieure a la taille d'origine
{
for (int i=0;i<n;i++)
// copie des composantes du tableau d'origine dans le tableau pointe par tempo
(*ptr2++)=tb;
}
else if ( n>taille )
// cas ou la taille selectionnee est superieure a la taille d'origine
{
for (int i=0;i<n;i++)
// copie des composantes à tb
(*ptr2++)=tb;
};
delete [] t; // desallocation du tableau pointe par t
t=tempo; // affectation du pointeur t au pointeur tempo
taille=n;
}
template <class T>
#ifndef MISE_AU_POINT
inline
#endif
T& Tableau<T>::operator() (int i) const
// Retourne la ieme composante du tableau : acces en lecture et ecriture
{
#ifdef MISE_AU_POINT
if ( (i<1) || (i>taille) )
{ cout << "\nErreur : composante inexistante !, nb demande = " << i << '\n';
cout << "T& TABLEAU_T::OPERATOR() (int ) \n";
cout << "\n pour info: taille actuelle du tableau = " << taille << " ";
Sortie(1);
};
#endif
return t[i-1];
}
// cas particulier ou l'on ne veut pas modifier les valeurs
template <class T>
#ifndef MISE_AU_POINT
inline
#endif
const T Tableau<T>::val_const(int i) const
//const T& Tableau<T>::operator() (int i) const
// Retourne la ieme composante du tableau : acces en lecture seulement
{
#ifdef MISE_AU_POINT
if ( (i<1) || (i>taille) )
{ cout << "\nErreur : composante inexistante !, nb demande = " << i << '\n';
cout << "T TABLEAU_T::OPERATOR() (int ) const \n";
cout << "\n pour info: taille actuelle du tableau = " << taille << " ";
Sortie(1);
};
#endif
T retour = t[i-1];
return retour;
}
// Retourne la référence constante à la ieme composante du tableau : acces en lecture seulement
template <class T>
#ifndef MISE_AU_POINT
inline
#endif
const T& Tableau<T>::ref_const(int i) const
//const T& Tableau<T>::operator() (int i) const
// Retourne la ieme composante du tableau : acces en lecture seulement
{
#ifdef MISE_AU_POINT
if ( (i<1) || (i>taille) )
{ cout << "\nErreur : composante inexistante !, nb demande = " << i << '\n';
cout << "T TABLEAU_T::OPERATOR() (int ) const \n";
cout << "\n pour info: taille actuelle du tableau = " << taille << " ";
Sortie(1);
};
#endif
return t[i-1];
}
template <class T>
#ifndef MISE_AU_POINT
inline
#endif
int Tableau<T>::operator!= (const Tableau<T>& tab) const
// Surcharge de l'operateur !=
// Renvoie 1 si les deux tableaux ne sont pas egaux
// Renvoie 0 sinon
{ if ( (*this)==tab ) // test de l'egalite des deux tableaux a l'aide
// de l'operateur surcharge ==
return 0;
else
return 1;
}
template <class T> void
inline Tableau<T>::Enleve (int i)
// Enleve la ieme composante du tableau en decrementant la taille
{
#ifdef MISE_AU_POINT
if ( (i<1) || (i>taille) )
{
cout << "\nErreur : composante inexistante "<<i<< " !\n";
cout << "TABLEAU_T::ENLEVE(int ) \n";
cout << "\n pour info: taille actuelle du tableau = " << taille << " ";
Sortie(1);
};
#endif
T* tempo;
tempo=new T [taille-1];
T* ptr1=t;
T* ptr2=tempo;
for (int j=0;j<i-1;j++)
// copie des elements du tableau pointe par t dans le tableau pointe par tempo
// du 1er au (i-1)eme element
(*ptr2++)=(*ptr1++);
ptr1++; // saut du ieme element du tableau pointe par t
for (int j=i;j<taille;j++)
// copie des elements du tableau pointe par t dans le tableau pointe par tempo
// du (i+1)eme au dernier element
(*ptr2++)=(*ptr1++);
delete [] t; // desallocation du tableau pointe par t
t=tempo; // affectation du pointeur t au pointeur tempo
taille=taille-1;
}
template <class T> void
inline Tableau<T>::Enleve_val (T val)
// Enleve les composantes du tableau egales a val en decrementant la taille
{
T* tempo;
tempo=new T [taille];
T* ptr1=t;
T* ptr2=tempo;
int nouvel_taille=taille;
for (int j=0;j<taille;j++)
// boucle sur les composantes du tableau
{
if ( (*ptr1)!=val )
// l'objet pointe n'est pas egal a val
(*ptr2++)=(*ptr1++);
else
// l'objet pointe est egal a val, saut de celui-ci
{
ptr1++;
nouvel_taille=nouvel_taille-1;
};
};
#ifdef MISE_AU_POINT
if ( nouvel_taille==taille )
{
cout << "\nErreur : absence de la composante cherchee !\n";
cout << "TABLEAU_T::ENLEVE_VAL(T ) \n";
Sortie(1);
};
#endif
delete [] t; // desallocation du tableau pointe par t
t=tempo; // affectation du pointeur t au pointeur tempo
taille=nouvel_taille;
}
template <class T> void
inline Tableau<T>::Libere ()
// Apres l'appel de cette methode, le tableau est identique a ce qu'il aurait
// ete a la suite d'un appel du constructeur par defaut
{
if ( taille>0 )
delete [] t; // desallocation du tableau pointe par t
else
{
#ifdef MISE_AU_POINT
if ( t!=NULL )
{ cout << "\nErreur de liberation de la place memoire\n";
cout << "TABLEAU_T::LIBERE() \n";
// Affiche_premier_elem( cout);
Sortie(1);
}
#endif
};
t=NULL;
taille=0;
}
template <class T> void
inline Tableau<T>::Init_from_list(const list<T> & liste )
// initialisation d'un tableau à partir d'une liste
{ int tail_liste = liste.size(); // récup de la tail de la liste
typename list<T>::const_iterator ili,ilifin=liste.end();
Change_taille(tail_liste);
int i=0;
for (ili=liste.begin();ili!=ilifin;ili++,i++)
t[i] = (*ili);
}
template <class T> void
inline Tableau<T>::Init_list(list<T> & liste )
// initialisation d'une liste à partir du tableau
// premier de la liste == premier du tableau
{ liste.clear(); // on initialise la liste
// on balaie le tableau et on remplit la liste
T* ptr1=t;
for (int i=0;i<taille;i++)
liste.push_back(*ptr1++);
}
template <class T>
inline Tableau<T> & Tableau<T>::operator= (const Tableau<T> & tab)
// Surcharge de l'operateur = : realise l'egalite entre deux tableaux de pointeurs
{
// on essaie d'optimiser un peu
// -- si les tableaux sont identiques en taille, on ne réaffecte pas
// on ne fait que la recopie
if (taille == tab.taille)
{ // on n'examine que si la taille est non nulle
if (taille != 0)
{ T* ptr1=t;
T* ptr2=tab.t;
for (int i=0;i<taille;i++)
// copie des elements du tableau se trouvant a droite dans le tableau se trouvant
// a gauche du signe d'affectation
(*ptr1++)=(*ptr2++);
};
// et retour
return (*this);
};
// sinon on réajuste les tailles
if ( t!=NULL ) Libere(); // cas ou le tableau se trouvant a gauche du signe =
// n'est pas vide : desallocation de ce tableau
if ( tab.taille==0 )
// cas ou le tableau se trouvant a droite du signe = est vide : initialisation
// identique a l'appel du constructeur par defaut
{
taille=0;
t=NULL;
}
else
// autres cas
{
taille=tab.taille;
t=new T [taille];
T* ptr1=t;
T* ptr2=tab.t;
for (int i=0;i<taille;i++)
// copie des elements du tableau se trouvant a droite dans le tableau se trouvant
// a gauche du signe d'affectation
(*ptr1++)=(*ptr2++);
};
return (*this);
}
template <class T>
inline int Tableau<T>::operator ==(const Tableau<T> & tab) const
// Surcharge de l'operateur ==
// Renvoie 1 si les deux tableaux sont egaux
// Renvoie 0 sinon
{
if ( tab.taille!=taille )
return 0;
else
{
T* ptr1=t;
T* ptr2=tab.t;
for (int i=0;i<taille;i++)
{
if ( (*ptr2++)!=(*ptr1++) )
return 0;
};
return 1;
};
}
// opération de lecture sur un flot d'entrée
// les données sont le type puis la dimension puis les datas
template <class T>
inline istream & Tableau<T>::Entree(istream & entree)
{ // vérification du type
string type;
entree >> type;
if (type != "Tableau")
{Sortie (1);
return entree;
}
int dime; entree >> type >> dime;
if (dime != taille)
Change_taille(dime);
for (int i=0;i<taille;i++)
entree >> t[i];
return entree;
}
// opération de lecture sur un flot d'entrée sans redimentionnement
// les données sont le type puis la dimension puis les datas
// ici il n'y a pas redimentionnement du tableau si la taille est suffisente
template <class T>
inline istream & Tableau<T>::Entree_sans_redim(istream & entree)
{ // vérification du type
string type;
entree >> type;
if (type != "Tableau")
{Sortie (1);
return entree;
}
int dime; entree >> type >> dime;
if (dime > taille) // redimensionnement que si la taille est insuffisente
Change_taille(dime);
for (int i=0;i<taille;i++)
entree >> t[i];
return entree;
}
// lectures sur le flot si la taille du tableau est identique ou supérieure à celle lue
// retour d'un pointeur nulle
// sinon, si la taille lue est supérieure à la taille du tableau actuellement existant
// il y a création d'un nouveau tableau de même type avec la taille adéquate
// et retour d'un pointeur sur le nouveau tableau
template <class T>
inline Tableau<T> * Tableau<T>::New_en_lecture_si_taille_superieur_a_lire(istream& entree)
{ Tableau<T> * pt_tableau = NULL; // init au cas courant
// vérification du type
string type;
entree >> type;
if (type != "Tableau")
{Sortie (1);
return pt_tableau;
}
int dime; entree >> type >> dime;
if (dime > taille)
{ // on crée un nouveau tableau
pt_tableau = new Tableau<T>(dime);
for (int i=0;i<dime;i++)
entree >> pt_tableau->t[i];
}
else
{ // cas d'une dimension suffisante
for (int i=0;i<dime;i++)
entree >> t[i];
};
return pt_tableau;
}
// opération d'écriture non formatée
// les données sont le type la dimension puis les datas, chacun
// séparé par un espace
template <class T>
inline ostream & Tableau<T>::Sortir( ostream & sort) const
{ // tout d'abord un indicateur donnant le type
sort << "Tableau :taille= " << taille << " ";
for (int i=0;i<taille;i++)
sort << t[i] << " ";
sort << "\n";
return sort;
}
// opération d'écriture non formatée, idem précédent mais sans retour chariot à la fin
// les données sont le type la dimension puis les datas, chacun
// séparé par un espace
template <class T>
inline ostream & Tableau<T>::Sortir_sansRet( ostream & sort) const
{ // tout d'abord un indicateur donnant le type
sort << "Tableau :taille= " << taille << " ";
for (int i=0;i<taille;i++)
sort << t[i] << " ";
return sort;
}
// test si la valeur passée en argument apartient au tableau
// ramène 0 si n'appartient pas sinon ramène l'indice dans le tableau
// t(i) = t[i+1]
template <class T>
inline int Tableau<T>::Contient(const T& e) const
{ for (int i=0;i<taille;i++)
if (t[i] == e) {return (i+1);}
return 0;
}
// initialisation avec la valeur passée en argument
template <class T>
inline bool Tableau<T>::Inita(const T& e)
{ for (int i=0;i<taille;i++)
t[i] = e;
return true; // par défaut
};
//// affichage du premier élément pour les messages d'erreur
//template <class T>
//inline void Tableau<T>::Affiche_premier_elem( ostream & sort) const
// { // on indique quelque infos sup pour la compréhension
// sort << "Tableau :taille= " << taille << " ";
// if (taille >0)
// {sort << "\n le premier element du tableau pour info: ";
// sort << t[0] ;
// sort << endl;};
// }
//#include "ParaGlob.h"
#endif

File diff suppressed because one or more lines are too long

141
Tableaux/Tableau_double.h Normal file
View file

@ -0,0 +1,141 @@
// 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: 23/01/97 *
* $ *
* AUTEUR: G RIO (mailto:gerardrio56@free.fr) *
* $ *
* PROJET: Herezh++ *
* $ *
************************************************************************
* définition d'un tableau de réel de dimension quelconque. Dans le cas ou la dimension est comprise
* entre 1 et 20, on utilise des listes de réels pour allouer de la mémoire et pour la désallouer, ce qui
* permet d'être beaucoup plus rapide que l'opérateur classique new.
* la construstion de la classe s'appuit sur une spécialisation d'une classe template.
* $ *
* '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' *
* VERIFICATION: *
* *
* ! date ! auteur ! but ! *
* ------------------------------------------------------------ *
* ! ! ! ! *
* *
* $ *
* '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' *
* MODIFICATIONS:
* *
* ! date ! auteur ! but ! *
* ------------------------------------------------------------ *
* *
* $ *
* *
************************************************************************/
// définition d'un tableau de réel de dimension quelconque. Dans le cas ou la dimension est comprise
// entre 1 et 20, on utilise des listes de réels pour allouer de la mémoire et pour la désallouer, ce qui
// permet d'être beaucoup plus rapide que l'opérateur classique new.
// la construstion de la classe s'appuit sur une spécialisation d'une classe template.
#ifndef TABLEAU_DOUBLE_H
#define TABLEAU_DOUBLE_H
#include "Tableau_T.h"
#include "PtTabRel.h"
/// @addtogroup Les_Tableaux_generiques
/// @{
///
class Tableau_double : public Tableau<double>
{
public :
// VARIABLES PUBLIQUES :
// CONSTRUCTEURS :
// CONSTRUCTEURS :
// Constructeur par defaut
Tableau_double () :
Tableau()
{};
// Constructeur fonction de la taille du tableau
Tableau_double (int nb);
// Constructeur fonction de la taille du tableau et d'une
// valeur d'initialisation pour les composantes
Tableau_double (int nb,double val);
// Constructeur fonction d'un tableau de double
Tableau_double (int nb,double* tab);
// Constructeur de copie
Tableau_double (const Tableau_double & tab);
// DESTRUCTEUR :
~Tableau_double ();
// METHODES :
// Surcharge de l'operateur d'affectation =
Tableau_double& operator= (const Tableau_double& tab);
// Change la taille du tableau (la nouvelle taille est n)
void Change_taille (int n);
// Enleve la ieme composante du tableau
void Enleve (int i);
// Enleve toutes les composantes du tableau dont la valeur est val
void Enleve_val (double val);
// Permet de desallouer l'ensemble des elements du tableau
void Libere ();
protected :
// allocator dans la liste de data
// a priori on utilise un pointeur sur une liste de 3 réels, mais dans
// le constructeur et dans le destructeur, on effectue un cast vers le
// bon allocator qui normalement à la même dimension
ReelsPointe* iapointe; // pointeur générique
};
/// @} // end of group
#endif

1
Tableaux/utilDebug.h Normal file
View file

@ -0,0 +1 @@
// 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: 23/01/97 * * $ * * AUTEUR: G RIO (mailto:gerardrio56@free.fr) * * $ * * PROJET: Herezh++ * * $ * ************************************************************************ * BUT: outils pour la visualisation avec le debugger * * $ * * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * * VERIFICATION: * * * * ! date ! auteur ! but ! * * ------------------------------------------------------------ * * ! ! ! ! * * * * $ * * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * * MODIFICATIONS: * * * ! date ! auteur ! but ! * * ------------------------------------------------------------ * * * * $ * * * ************************************************************************/ #ifndef TABLE_H #define TABLE_H class Table33 { public : double A[3][3]; }; #endif