Herezh_dev/herezh_pp/Lecture/Bloc.cc

912 lines
30 KiB
C++
Executable file

// 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 "Bloc.h"
#include "CharUtil.h"
//================================================
// cas d'un bloc scalaire
//================================================
// Constructeur
BlocScal::BlocScal () : // par defaut
nomref(),val(0.)
{
};
BlocScal::BlocScal (const BlocScal& a) : // de copie
nomref(a.nomref),val(a.val)
{
};
// destructeur
BlocScal::~BlocScal ()
{
};
// nom de reference
const string & BlocScal::NomRef() const
{return nomref;
};
// lecture d'un bloc
void BlocScal::Lecture(UtilLecture & entreePrinc)
{ *(entreePrinc.entree) >> nomref >> val;
};
// affichage des infos
void BlocScal::Affiche() const
{ cout << "\n reference = " << nomref
<< " , valeur = " << val;
};
// surcharge des operateurs
bool BlocScal::operator == (const BlocScal& a) const
{ if ((nomref == a.nomref) && (val == a.val))
return true;
else
return false;
};
BlocScal& BlocScal::operator = ( const BlocScal& a)
{ nomref = a.nomref; val = a.val;
return *this;
};
bool BlocScal::operator != (const BlocScal& a) const
{ return !(*this == a);};
bool BlocScal::operator < (const BlocScal& a) const
{ if (this->nomref < a.nomref) return true;
else if (this->nomref == a.nomref) return (this->val < a.val);
else return false;
};
istream & operator >> (istream & entree, BlocScal & coo)
{ entree >> coo.nomref >> coo.val;
return entree;
};
ostream & operator << ( ostream & sort,const BlocScal & coo)
{ sort << coo.nomref << " " << coo.val <<" " ;
return sort;
};
//================================================
// cas d'un bloc scalaire ou non de fonction nD
//================================================
// un bloc qui correspond a une reference
// et soit une seule valeur ou soit le nom d'une fonction nD
// qui doit-être précédé par le mot clé une_fonction_nD_
// Constructeur
BlocScal_ou_fctnD::BlocScal_ou_fctnD () : // par defaut
nomref(),val(NULL),fctnD(NULL)
{
};
BlocScal_ou_fctnD::BlocScal_ou_fctnD (const BlocScal_ou_fctnD& a) : // de copie
nomref(a.nomref)
{ if (a.val == NULL) val = NULL; else val = new double(*(a.val));
if (a.fctnD == NULL) fctnD = NULL; else fctnD = new string (*(a.fctnD));
};
// destructeur
BlocScal_ou_fctnD::~BlocScal_ou_fctnD ()
{ if (val != NULL) delete val;
if (fctnD != NULL) delete fctnD;
};
// nom de reference
const string & BlocScal_ou_fctnD::NomRef() const
{return nomref;
};
// lecture d'un bloc
void BlocScal_ou_fctnD::Lecture(UtilLecture & entreePrinc)
{ *(entreePrinc.entree) >> nomref ;
string toto;
*(entreePrinc.entree) >> toto ;
if (toto == "une_fonction_nD_") // cas d'une fonction
{ *(entreePrinc.entree) >> toto ; // on lit le nom de la fonction
if (fctnD == NULL)
fctnD = new string (toto);
else *fctnD = toto;
if (val != NULL) // il ne peut y avoir val et fctnD définies en même temps
{delete val; val = NULL;};
}
else // cas d'une valeur numérique
{ if (val != NULL) {*val = ChangeReel(toto);}
else {val = new double(ChangeReel(toto));};
if (fctnD != NULL) // il ne peut y avoir val et fctnD définies en même temps
{delete fctnD; fctnD = NULL;};
};
};
// affichage des infos
void BlocScal_ou_fctnD::Affiche() const
{ cout << "\n reference = " << nomref;
if (val != NULL)
cout << " , valeur = " << *val << " ";
else if (fctnD != NULL)
cout << " fctnD= "<<(*fctnD) << " ";
else
cout << " pas_de_valeur_affectee ";
};
// surcharge des operateurs
bool BlocScal_ou_fctnD::operator == (const BlocScal_ou_fctnD& a) const
{ if (nomref == a.nomref)
{ if (val != NULL)
{ if (*val == *a.val) return true;} // cas d'une valeur
else if (fctnD != NULL)
{ if (*fctnD == *a.fctnD) return true;} // cas d'un nom de fctnD
else if ((a.val == NULL) && (a.fctnD == NULL))
{ return true;} // cas rien d'affecté
else
{ return false;};
}
else
return false;
};
BlocScal_ou_fctnD& BlocScal_ou_fctnD::operator = ( const BlocScal_ou_fctnD& a)
{ nomref = a.nomref;
if (a.val == NULL)
{ if (val != NULL)
{delete val;val = NULL;}
if (a.fctnD != NULL)
{if (fctnD == NULL) {fctnD = new string (*a.fctnD);}
else {*fctnD = *a.fctnD;}
}
else // ici a.fctnD est nulle, donc tout est nul
{if (fctnD != NULL)
{delete fctnD; fctnD = NULL;};
};
}
else // cas d'une valeur
{ if (val == NULL)
{val = new double(*(a.val));}
else {*val = *a.val;};
if (fctnD != NULL) {delete fctnD; fctnD = NULL;};
};
return *this;
};
bool BlocScal_ou_fctnD::operator != (const BlocScal_ou_fctnD& a) const
{ return !(*this == a);};
bool BlocScal_ou_fctnD::operator < (const BlocScal_ou_fctnD& a) const
{ if (this->nomref < a.nomref) return true;
else if (this->nomref == a.nomref)
{if (a.val == NULL)
{ if (val != NULL)
{return false;}
if (a.fctnD != NULL)
{if (fctnD == NULL) {return true;}
else {return (*fctnD < *a.fctnD);}
}
else // ici a.fctnD est nulle
{if (fctnD != NULL)
{return false;}
else // là on ne peut plus les départager on met arbitrairement à false
return false;
};
}
else // cas d'une valeur
{ if (val != NULL)
{return (*val < *a.val);}
};
}
else return false;
};
istream & operator >> (istream & entree, BlocScal_ou_fctnD & coo)
{ string toto;
entree >> coo.nomref >> toto;
if ((toto != "fctnD=") && (toto != "no_val_"))
{ // c'est une valeur numérique
if (coo.val != NULL)
{*coo.val = ChangeReel(toto);}
else
{coo.val = new double (ChangeReel(toto));};
if (coo.fctnD != NULL)
{delete coo.fctnD; coo.fctnD=NULL;};
}
else if (toto == "fctnD=")
{ // c'est un nom de fonction
if (coo.fctnD != NULL)
{*coo.fctnD = toto;}
else
{coo.fctnD = new string (toto);}
if (coo.val != NULL)
{delete coo.val; coo.val = NULL;};
}
else // cas où ce n'est pas affecté
{ if (coo.val != NULL)
{delete coo.val; coo.val = NULL;};
if (coo.fctnD != NULL)
{delete coo.fctnD; coo.fctnD=NULL;};
};
return entree;
};
ostream & operator << ( ostream & sort,const BlocScal_ou_fctnD & coo)
{ sort << coo.nomref << " " ;
if (coo.val != NULL)
{sort << *coo.val << " ";}
else if (coo.fctnD != NULL)
{sort << " fctnD= " << (*coo.fctnD) << " ";}
else {sort << " no_val_ ";};
return sort;
};
// modifie la valeur du double: possible uniquement s'il n'y a pas de fonction nD
void BlocScal_ou_fctnD::Change_val(const double a)
{ if (fctnD == NULL) // c'est ok
{ if (val != NULL)
{*val = a;}
else {val = new double(a);};
}
else // ce n'est pas normal
{ cout << "\n *** erreur dans la methode BlocScal_ou_fctnD::Change_val(..."
<< " on devrait avoir un pointeur de fonction nul ! ce qui n'est pas le cas ";
Sortie(1);
};
};
// modifie la valeur du nom de la fonction : possible uniquement s'il n'y a pas de valeur
void BlocScal_ou_fctnD::Change_fctnD(const string a)
{ if (val == NULL) // c'est ok
{if (fctnD != NULL)
{*fctnD = a;}
else {fctnD = new string(a);};
}
else // ce n'est pas normal
{ cout << "\n *** erreur dans la methode BlocScal_ou_fctnD::Change_fctnD(..."
<< " on devrait avoir un pointeur de valeur nul ! ce qui n'est pas le cas ";
Sortie(1);
};
};
//========================================================
// cas d'un bloc general de n chaines et de m scalaires
//========================================================
//
// Constructeur
BlocGen::BlocGen (int n1, int m1) : // par defaut
pt(m1) , ptnom(n1)
{ };
BlocGen::BlocGen (const BlocGen& a) : // par defaut
pt(a.pt) , ptnom(a.ptnom)
{ };
// destructeur
BlocGen::~BlocGen ()
{ };
// nom de reference
string & BlocGen::NomRef() const
{ return ptnom(1);
};
// lecture d'un bloc
void BlocGen::Lecture(UtilLecture & entreePrinc)
{ // la lecture dépend du fait qu'il y a ou non une fin de bloc
if (strstr(entreePrinc.tablcar,"fin_bloc_gene_")==NULL)
// cas d'une taille fixe
{int ptnomtaille = ptnom.Taille();
for (int i=1;i<= ptnomtaille;i++)
*(entreePrinc.entree) >> ptnom(i);
int pttaille = pt.Taille();
for (int i=1;i<= pttaille;i++)
*(entreePrinc.entree) >> pt(i);
}
else // cas de l'existence d'un marqueur de fin de bloc
{ // a priori on ne sait pas le nombre d'info que l'on va lire
// et on stocke tout en string
list <string> li_nom; // on utilise une liste intermédiaire
string nom_lue; // init
*(entreePrinc.entree) >> nom_lue;
while (nom_lue != "fin_bloc_gene_")
{li_nom.push_back(nom_lue);
*(entreePrinc.entree) >> nom_lue;
};
// on redimentionne éventuellement le conteneur
pt.Change_taille(0);
int ptnomtaille = li_nom.size();
ptnom.Change_taille(ptnomtaille);
// on affecte
list <string>::iterator ili,ilifin=li_nom.end();
int i=1;
for (ili = li_nom.begin();ili!=ilifin;ili++,i++)
ptnom(i) = (*ili);
};
};
// affichage des infos
void BlocGen::Affiche() const
{ cout << "\n reference = " << ptnom(1) << '\n';
int ptnomtaille = ptnom.Taille();
for (int i=2;i<=ptnomtaille;i++) // affichage des noms
cout << ptnom(i) << " ";
cout << '\n';
int pttaille = pt.Taille();
for (int i=1;i<=pttaille;i++) // affichage des valeurs
cout << " nb [" << i << "] = " << pt(i);
};
// surcharge des operateurs
bool BlocGen::operator == (const BlocGen& a) const
{ int ptnomtaille = ptnom.Taille();
for (int i=1;i<=ptnomtaille;i++) // affichage des noms
if (ptnom(i) != a.ptnom(i))
return false;
int pttaille = pt.Taille();
for (int i=1;i<=pttaille;i++) // affichage des noms
if (pt(i) != a.pt(i))
return false;
return true;
};
BlocGen& BlocGen::operator = (const BlocGen& a)
{ int ptnomtaille = a.ptnom.Taille();
// on modifie la taille du bloc gen si besoin
if (ptnom.Taille() != ptnomtaille)
ptnom.Change_taille(ptnomtaille);
// on recopie
for (int i=1;i<=ptnomtaille;i++)
ptnom(i) = a.ptnom(i);
// idem pour les scalaires
int pttaille = a.pt.Taille();
if (pt.Taille() != pttaille)
pt.Change_taille(pttaille);
for (int i=1;i<=pttaille;i++)
pt(i) = a.pt(i);
return *this;
};
bool BlocGen::operator != (const BlocGen& a) const
{ return !(*this == a);};
istream & operator >> (istream & entree, BlocGen & coo)
{ int ptnomTaille; string toto;
entree >> toto >> ptnomTaille ;
coo.ptnom.Change_taille(ptnomTaille);
for (int i=1;i<=ptnomTaille;i++)
entree >> coo.ptnom(i) ;
int ptTaille ;
entree >> toto >> ptTaille ;
coo.pt.Change_taille(ptTaille);
for (int i=1;i<=ptTaille;i++)
entree >> coo.pt(i) ;
return entree;
};
ostream & operator << ( ostream & sort,const BlocGen & coo)
{ int ptnomTaille = coo.ptnom.Taille();
sort << "tab_nom " << ptnomTaille << " ";
for (int i=1;i<=ptnomTaille;i++)
sort << coo.ptnom(i) << " ";
int ptTaille = coo.pt.Taille();
sort << "tab_valeur " << ptTaille << " ";
for (int i=1;i<=ptTaille;i++)
sort << coo.pt(i) << " ";
return sort;
};
//================================================
// cas d'un bloc scalaire type
//================================================
// un bloc scalaire type correspond a une reference
// un mot cle, et une seule valeur
// Constructeur
BlocScalType::BlocScalType () : // par defaut
nomref(),motClef()
{
};
BlocScalType::BlocScalType (const BlocScalType& a) : // de copie
nomref(a.nomref),motClef(a.motClef),val(a.val)
{
};
// destructeur
BlocScalType::~BlocScalType ()
{
};
// nom de reference
const string & BlocScalType::NomRef() const
{return nomref;
};
// lecture d'un bloc
void BlocScalType::Lecture(UtilLecture & entreePrinc)
{ *(entreePrinc.entree) >> nomref >> motClef >> val;
};
// affichage des infos
void BlocScalType::Affiche() const
{ cout << "\n reference = " << nomref << " , cle : " << motClef
<< " , valeur = " << val;
};
// surcharge des operateurs
bool BlocScalType::operator == (const BlocScalType& a) const
{ if ((nomref == a.nomref) && (val == a.val) && (motClef == a.motClef ) )
return true;
else
return false;
};
BlocScalType& BlocScalType::operator = ( const BlocScalType& a)
{ nomref = a.nomref; val = a.val; motClef = a.motClef;
return *this;
};
bool BlocScalType::operator != (const BlocScalType& a) const
{ return !(*this == a);};
istream & operator >> (istream & entree, BlocScalType & coo)
{ entree >> coo.nomref >> coo.motClef >> coo.val;
return entree;
};
ostream & operator << ( ostream & sort,const BlocScalType & coo)
{ sort << coo.nomref << " " << coo.motClef << " "<< coo.val <<" " ;
return sort;
};
//================================================
// cas d'un bloc vecteur
//================================================
// Constructeur
BlocVec::BlocVec () : // par defaut
nomref(),coorpt(ParaGlob::Dimension ())
{};
BlocVec::BlocVec (const BlocVec & a) : // de copie
nomref(),coorpt(a.coorpt)
{ };
// destructeur
BlocVec::~BlocVec ()
{ };
// nom de reference
const string & BlocVec::NomRef() const
{return nomref;
};
// lecture d'un bloc
void BlocVec::Lecture(UtilLecture & entreePrinc)
{ *(entreePrinc.entree) >> nomref ;
coorpt.Lecture(entreePrinc);
// *(entreePrinc.entree) >> coorpt;
};
// affichage des infos
void BlocVec::Affiche() const
{ cout << "\n reference = " << nomref
<< " , coordonnees : ";
coorpt.Affiche(cout);
// cout << coorpt;
};
// surcharge des operateurs
bool BlocVec::operator == (const BlocVec& a) const
{ if ((nomref == a.nomref)&&(coorpt==a.coorpt))
return true;
else
return false;
};
BlocVec& BlocVec::operator = (const BlocVec& a)
{ nomref = a.nomref;
coorpt = a.coorpt;
return *this;
};
bool BlocVec::operator != (const BlocVec& a) const
{ return !(*this == a);};
istream & operator >> (istream & entree, BlocVec & coo)
{ entree >> coo.nomref >> coo.coorpt;
return entree;
};
ostream & operator << ( ostream & sort,const BlocVec & coo)
{ sort << coo.nomref << " " << coo.coorpt <<" " ;
return sort;
};
//================================================
// cas d'un bloc vecteur type
//================================================
// un bloc vecteur type correspond a une reference et
// un mot cle et un vecteur, fonction de la dimension du pb
// Constructeur
BlocVecType::BlocVecType () : // par defaut
nomref(),motClef(),coorpt(ParaGlob::Dimension ())
{
};
BlocVecType::BlocVecType (const BlocVecType& a) : // de copie
nomref(a.nomref),motClef(a.motClef),coorpt(a.coorpt)
{ };
// destructeur
BlocVecType::~BlocVecType ()
{
};
// nom de reference
const string & BlocVecType::NomRef() const
{return nomref;
};
// lecture d'un bloc
void BlocVecType::Lecture(UtilLecture & entreePrinc)
{ *(entreePrinc.entree) >> nomref >> motClef;
coorpt.Lecture(entreePrinc);
};
// affichage des infos
void BlocVecType::Affiche() const
{ cout << "\n ref = " << nomref << ", cle: " << motClef
<< " , coord : ";
coorpt.Affiche(cout);
// cout << coorpt;
};
// surcharge des operateurs
bool BlocVecType::operator == (const BlocVecType& a) const
{ if ((nomref == a.nomref) && (motClef == a.motClef)
&& (coorpt==a.coorpt))
return true;
else
return false;
};
BlocVecType& BlocVecType::operator = (const BlocVecType& a)
{ nomref = a.nomref;motClef = a.motClef;
coorpt = a.coorpt;
return *this;
};
bool BlocVecType::operator != (const BlocVecType& a) const
{ return !(*this == a);};
istream & operator >> (istream & entree, BlocVecType & coo)
{ entree >> coo.nomref >> coo.motClef >> coo.coorpt;
return entree;
};
ostream & operator << ( ostream & sort,const BlocVecType & coo)
{ sort << coo.nomref << " " << coo.motClef << " " << coo.coorpt <<" " ;
return sort;
};
//================================================
// cas d'un bloc de n vecteur type
//================================================
// un bloc de plusieurs vecteurs et plusieurs scalaires type correspond a une reference et
// un mot cle et des vecteurs, fonction de la dimension du pb et des scalaires
// Constructeur
BlocVecMultType::BlocVecMultType (int n,int m) : // par defaut
nomref(),motClef(),vect_coorpt(n,Coordonnee(ParaGlob::Dimension ()))
,pt(m)
{
};
BlocVecMultType::BlocVecMultType (const BlocVecMultType& a) : // de copie
nomref(a.nomref),motClef(a.motClef),vect_coorpt(a.vect_coorpt),pt(a.pt)
{ };
// destructeur
BlocVecMultType::~BlocVecMultType ()
{
};
// nom de reference
const string & BlocVecMultType::NomRef() const
{return nomref;
};
// lecture d'un bloc
void BlocVecMultType::Lecture(UtilLecture & entreePrinc)
{ *(entreePrinc.entree) >> nomref >> motClef;
int taille = vect_coorpt.Taille();
for (int i=1;i<=taille;i++)
vect_coorpt(i).Lecture(entreePrinc);
int pttaille = pt.Taille();
for (int i=1;i<= pttaille;i++)
*(entreePrinc.entree) >> pt(i);
};
// affichage des infos
void BlocVecMultType::Affiche() const
{ cout << "\n ref = " << nomref << ", cle: " << motClef;
int taille = vect_coorpt.Taille();
for (int i=1;i<=taille;i++)
{cout << " , coord "<< i <<" : "; vect_coorpt(i).Affiche(cout);};
int pttaille = pt.Taille();
cout << ", " << pttaille << " scal(s) ";
for (int i=1;i<= pttaille;i++)
cout << pt(i) << " ";
};
// surcharge des operateurs
bool BlocVecMultType::operator == (const BlocVecMultType& a) const
{ if ((nomref == a.nomref) && (motClef == a.motClef)
&& (vect_coorpt==a.vect_coorpt) && (pt == a.pt))
return true;
else
return false;
};
BlocVecMultType& BlocVecMultType::operator = (const BlocVecMultType& a)
{ nomref = a.nomref;motClef = a.motClef;
vect_coorpt = a.vect_coorpt; pt = a.pt;
return *this;
};
bool BlocVecMultType::operator != (const BlocVecMultType& a) const
{ return !(*this == a);};
istream & operator >> (istream & entree, BlocVecMultType & coo)
{ entree >> coo.nomref >> coo.motClef;
string toto; int taille;
entree >> taille >> toto ;
coo.vect_coorpt.Change_taille(taille);
for (int i=1;i<=taille;i++)
entree >> coo.vect_coorpt(i) ;
entree >> taille >> toto ;
coo.pt.Change_taille(taille);
for (int i=1;i<=taille;i++)
entree >> coo.pt(i);
return entree;
};
ostream & operator << ( ostream & sort,const BlocVecMultType & coo)
{ sort << coo.nomref << " " << coo.motClef << " " ;
int taille = coo.vect_coorpt.Taille();
sort << taille << " vect(s) ";
for (int i=1;i<=taille;i++)
sort << coo.vect_coorpt(i) << " ";
int pttaille = coo.pt.Taille();
sort << " " << pttaille << " scal(s) ";
for (int i=1;i<= pttaille;i++)
sort << coo.pt(i) << " ";
return sort;
};
//=======================================================================
// cas d'un bloc general de n chaines, de m scalaires, de p Coordonnees
// avec un choix en lecture et définition des coordonnees ou de chaine
//=======================================================================
//
// n: le nombre de vecteurs, m le nombre de scalaires, n le nombre de ptnom_vect
BlocGeneEtVecMultType::BlocGeneEtVecMultType (int n,int m) : // par defaut
nomref(),motClef()
,vect_coorpt(n,Coordonnee(ParaGlob::Dimension())),ptnom_vect(n)
,tab_val(m),ptnom_tab_val(m,"NULL")
{ string init("NULL");
// on initialise les noms à rien
for (int i=1; i<= n; i++)
ptnom_vect(i).Change_taille((ParaGlob::Dimension()),init);
};
BlocGeneEtVecMultType::BlocGeneEtVecMultType (const BlocGeneEtVecMultType& a) : // de copie
nomref(a.nomref),motClef(a.motClef),vect_coorpt(a.vect_coorpt),tab_val(a.tab_val)
,ptnom_vect(a.ptnom_vect),ptnom_tab_val(a.ptnom_tab_val)
{ };
// destructeur
BlocGeneEtVecMultType::~BlocGeneEtVecMultType ()
{
};
// lecture d'un bloc
void BlocGeneEtVecMultType::Lecture(UtilLecture & entreePrinc)
{ *(entreePrinc.entree) >> nomref >> motClef;
int dim = ParaGlob::Dimension();
int taille = vect_coorpt.Taille();
for (int i=1;i<=taille;i++)
for (int j=1;j<= dim;j++)
{string inter;
*(entreePrinc.entree) >> inter;
if (inter == "nom_Xi_")
// dans ce cas cela signifie qu'on doit lire un nom
{*(entreePrinc.entree) >> ptnom_vect(i)(j);}
else // sinon cela veut dire que c'est une valeur numérique
{vect_coorpt(i)(j) = ChangeReel(inter);};
};
int tab_valtaille = tab_val.Taille();
for (int i=1;i<= tab_valtaille;i++)
{string inter;
*(entreePrinc.entree) >> inter;
if (inter == "nom_VAL_")
// dans ce cas cela signifie qu'on doit lire un nom
{*(entreePrinc.entree) >> ptnom_tab_val(i);}
else // sinon cela veut dire que c'est une valeur numérique
{tab_val(i) = ChangeReel(inter);};
};
};
// affichage des infos
void BlocGeneEtVecMultType::Affiche() const
{ cout << "\n ref = " << nomref << ", cle: " << motClef;
int taille = vect_coorpt.Taille();
int dim = ParaGlob::Dimension();
for (int i=1;i<=taille;i++)
{cout << " , coord "<< i <<" : ";
for (int j=1;j<= dim;j++)
if (ptnom_vect(i)(j) != "NULL")
{ cout << " nom_Xi_ " << ptnom_vect(i)(j) << " ";}
else
{ cout << vect_coorpt(i)(j) << " ";};
};
int tab_valtaille = tab_val.Taille();
cout << ", " << tab_valtaille << " scal(s) ";
for (int i=1;i<= tab_valtaille;i++)
if (ptnom_tab_val(i) != "NULL")
{ cout << " nom_VAL_ " << ptnom_tab_val(i) << " ";}
else
{ cout << tab_val(i) << " ";};
};
// surcharge des operateurs
bool BlocGeneEtVecMultType::operator == (const BlocGeneEtVecMultType& a) const
{ if ((nomref == a.nomref) && (motClef == a.motClef)
&& (vect_coorpt==a.vect_coorpt) && (tab_val == a.tab_val)
&& (ptnom_vect==a.ptnom_vect)&& (ptnom_tab_val==a.ptnom_tab_val))
return true;
else
return false;
};
BlocGeneEtVecMultType& BlocGeneEtVecMultType::operator = (const BlocGeneEtVecMultType& a)
{ nomref = a.nomref;motClef = a.motClef;
vect_coorpt = a.vect_coorpt; tab_val = a.tab_val;
ptnom_vect = a.ptnom_vect;
ptnom_tab_val = a.ptnom_tab_val;
return *this;
};
bool BlocGeneEtVecMultType::operator != (const BlocGeneEtVecMultType& a) const
{ return !(*this == a);};
// change le tableau des coordonnées, la taille des noms associés est modifié
// en conséquence
void BlocGeneEtVecMultType::Change_vect_coorpt(const Tableau <Coordonnee>& vect)
{vect_coorpt=vect;
int taille_ptnom_vect= ptnom_vect.Taille();
int taille_vect = vect.Taille();
if (taille_ptnom_vect < taille_vect)
{ // il faut agrandir le tableau
string init("NULL");
// on change de taille globalement
ptnom_vect.Change_taille(taille_vect);
for (int i=taille_ptnom_vect+1;i<=taille_vect;i++)
ptnom_vect(i).Change_taille((ParaGlob::Dimension()),init);
}
else if (taille_ptnom_vect > taille_vect)
{ // il faut diminuer le tableau, c'est plus simple
// on change de taille globalement
ptnom_vect.Change_taille(taille_vect);
};
};
// change le tableau des coordonnées, la taille des noms associés est modifié
// en conséquence, ici à partir d'une liste
void BlocGeneEtVecMultType::Change_vect_coorpt(const list<Coordonnee>& livect)
{ int taille = livect.size(); vect_coorpt.Change_taille(taille);
list<Coordonnee>::const_iterator ili=livect.begin();
for (int i=0;i<taille;i++,ili++)
vect_coorpt(i+1)=(*ili);
int taille_ptnom_vect_coorpt=ptnom_vect.Taille();
ptnom_vect.Change_taille(taille);
//si la nouvelle taille est plus grande, il faut initialiser à null
string init("NULL");
if (taille_ptnom_vect_coorpt < taille)
for (int i=taille_ptnom_vect_coorpt+1;i<= taille;i++)
ptnom_vect(i).Change_taille((ParaGlob::Dimension()),init);;
};
// change le tableau des noms associés aux vecteurs
// la taille du tableau de vecteurs associés est modifié en conséquence
void BlocGeneEtVecMultType::Change_ptnom_vect(const Tableau <Tableau<string> >& t_ptnom_vect)
{ptnom_vect=t_ptnom_vect;
int taille_t_ptnom_vect = t_ptnom_vect.Taille();
int taille_vect_coorpt = vect_coorpt.Taille();
int dim = ParaGlob::Dimension();
vect_coorpt.Change_taille(taille_t_ptnom_vect);
if (taille_t_ptnom_vect > taille_vect_coorpt)
{ // on augmente le tableau avec des vecteurs correctement dimensionnées
for (int i=taille_vect_coorpt+1;i<=taille_t_ptnom_vect;i++)
vect_coorpt(i).Change_dim(dim);
};
};
// change le tableau des noms associés aux scalaires
// la taille du tableau de scalaires associés est modifié en conséquence
void BlocGeneEtVecMultType::Change_ptnom_val(const Tableau<string> & t_ptnom_val)
{ptnom_tab_val=t_ptnom_val;
if (tab_val.Taille() != t_ptnom_val.Taille())
tab_val.Change_taille(t_ptnom_val.Taille());
};
// change le tableau de scalaires en fonction d'une liste
// la taille des noms associés est modifié en conséquence
void BlocGeneEtVecMultType::Change_tab_val(const list<double>& li)
{ int taille = li.size(); tab_val.Change_taille(taille);
list<double>::const_iterator ili=li.begin();
for (int i=0;i<taille;i++,ili++)
tab_val(i+1)=(*ili);
int taille_ptnom_tab_val=ptnom_tab_val.Taille();
ptnom_tab_val.Change_taille(taille);
//si la nouvelle taille est plus grande, il faut initialiser à null
if (taille_ptnom_tab_val < taille)
for (int i=taille_ptnom_tab_val+1;i<= taille;i++)
ptnom_tab_val(i)="NULL";
};
// change le tableau des noms associé aux scalaires en fonction d'une liste
// la taille du tableau de scalaires associés est modifié en conséquence
void BlocGeneEtVecMultType::Change_ptnom_val(const list<string>& li)
{ int taille = li.size(); ptnom_tab_val.Change_taille(taille);
list<string>::const_iterator ili=li.begin();
for (int i=0;i<taille;i++,ili++)
ptnom_tab_val(i+1)=(*ili);
tab_val.Change_taille(taille);
};
istream & operator >> (istream & entree, BlocGeneEtVecMultType & coo)
{ entree >> coo.nomref >> coo.motClef;
string toto; int taille;
entree >> taille >> toto ;
coo.vect_coorpt.Change_taille(taille);
int dim = ParaGlob::Dimension();
string init("NULL");
// on initialise les noms à rien
for (int i=1; i<= taille; i++)
coo.ptnom_vect(i).Change_taille(dim,init);
for (int i=1;i<=taille;i++)
for (int j=1;j<= dim;j++)
{string inter;
entree >> inter;
if (inter == "nom_Xi_")
// dans ce cas cela signifie qu'on doit lire un nom
{entree >> coo.ptnom_vect(i)(j);}
else // sinon cela veut dire que c'est une valeur numérique
{coo.vect_coorpt(i)(j) = ChangeReel(inter);
coo.ptnom_vect(i)(j) = "NULL";
};
};
entree >> taille >> toto ;
coo.tab_val.Change_taille(taille);
for (int i=1;i<=taille;i++)
{string inter;
entree >> inter;
if (inter == "nom_VAL_")
// dans ce cas cela signifie qu'on doit lire un nom
{entree >> coo.ptnom_tab_val(i);}
else // sinon cela veut dire que c'est une valeur numérique
{coo.tab_val(i) = ChangeReel(inter);
coo.ptnom_tab_val(i) = "NULL";
};
};
return entree;
};
ostream & operator << ( ostream & sort,const BlocGeneEtVecMultType & coo)
{ sort << coo.nomref << " " << coo.motClef << " " ;
int taille = coo.vect_coorpt.Taille();
sort << taille << " vect(s) ";
int dim = ParaGlob::Dimension();
for (int i=1;i<=taille;i++)
{sort << " , coord "<< i <<" : ";
for (int j=1;j<= dim;j++)
if (coo.ptnom_vect(i)(j) != "NULL")
{ sort << " nom_Xi_ " << coo.ptnom_vect(i)(j) << " ";}
else
{ sort << coo.vect_coorpt(i)(j) << " ";};
};
int tab_valtaille = coo.tab_val.Taille();
sort << " " << tab_valtaille << " scal(s) ";
for (int i=1;i<= tab_valtaille;i++)
if (coo.ptnom_tab_val(i) != "NULL")
{ sort << " nom_VAL_ " << coo.ptnom_tab_val(i) << " ";}
else
{ sort << coo.tab_val(i) << " ";};
return sort;
};