// FICHIER : Vecteur.cc
// CLASSE : Vecteur
// This file is part of the Herezh++ application.
//
// The finite element software Herezh++ is dedicated to the field
// of mechanics for large transformations of solid structures.
// It is developed by Gérard Rio (APP: IDDN.FR.010.0106078.000.R.P.2006.035.20600)
// INSTITUT DE RECHERCHE DUPUY DE LÔME (IRDL) .
//
// Herezh++ is distributed under GPL 3 license ou ultérieure.
//
// Copyright (C) 1997-2022 Université Bretagne Sud (France)
// AUTHOR : Gérard Rio
// E-MAIL : gerardrio56@free.fr
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License,
// or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
//
// For more information, please consult: .
////#include "Debug.h"
# include
using namespace std; //introduces namespace std
#include
#include
#include "Sortie.h"
#include
#include "ParaGlob.h"
#include "CharUtil.h"
#include "Vecteur.h"
#ifndef VECTEUR_H_deja_inclus
#ifndef MISE_AU_POINT
inline
#endif
// Constructeur permettant de definir un vecteur de taille n initialise a 0
Vecteur::Vecteur (int n):
memoire(true)
{
#ifdef MISE_AU_POINT
if ( n<0 )
{ cout << "\nErreur : taille invalide !\n";
cout << "VECTEUR::VECTEUR (int ) \n";
Sortie(1);
};
#endif
if ( n==0 )
// cas ou la taille selectionnee est nulle : initialisation identique a l'appel
// du constructeur par defaut
{ taille=0;
v=NULL;
}
else
{v=new double [n]; // allocation de la place memoire
taille=n;
for (int i=0;i memoire = false par défaut
/// le booléen sert pour différencier le constructeur avec
/// Vecteur::Vecteur (int n,double* vec)
/// Constructeur fonction d'un tableau de composantes déjà existant
/// il s'agit d'un tuillage, le vecteur ne gère pas sa mémoire
/// aucun test n'est fait concernant la taille disponible de vec
/// routine dangereuse !!!!!
/// il n'y a pas d'initialisation des composantes !!
Vecteur::Vecteur (int n,double* vec,bool memoi) :
memoire(false)
{
#ifdef MISE_AU_POINT
if ( n < 0)
{
cout << "\nErreur : taille invalide ! n= " << n << '\n';
cout << "VECTEUR::VECTEUR (int n,double* vec,bool memoi) \n";
Sortie(1);
};
#endif
v = vec;
taille = n;
};
#ifndef MISE_AU_POINT
inline
#endif
// Destructeur
Vecteur::~Vecteur ()
{ // on libère la mémoire que s'il s'agit d'un vecteur libre
if (memoire)
Libere();
};
// Retourne la taille du vecteur
#ifndef MISE_AU_POINT
inline
#endif
int Vecteur::Taille () const
{ return taille; };
#ifndef MISE_AU_POINT
inline
#endif
// Affiche les donnees concernant le vecteur
void Vecteur::Affiche () const
{double* ptr=v;
cout << "\nTaille du vecteur : " << taille << " .\n";
cout << "Composante(s) :\n\t{ ";
for (int i=0;iAffiche(min_i,max_i,pas_i,nd);
cout << "\n entrez une lettre pour continuer ? ";
rep = lect_chaine();
}
};
#ifndef MISE_AU_POINT
inline
#endif
// Permet de modifier la taille du vecteur
// N.B. : Si la nouvelle taille est superieure a l'ancienne alors le vecteur
// est complete par des 0
void Vecteur::Change_taille (int n)
{ // si la taille est identique, on ne fait rien
if (n == taille)
return;
// sinon, s'il s'agit d'un vecteur lié -> pas possible
if (!memoire)
{ cout << "\n*** Erreur de changement de taille \n"
<< " il s'agit d'un vecteur particulier qui ne gere pas sa propre memoire "
<< " on ne peut pas modifier la place memoire !! ";
cout << "Vecteur::Change_taille (... \n";
Sortie(1);
};
// la suite concerne le cas où il faut vraiment faire quelque chose
if ( n<0 )
// cas ou la taille selectionnee est negative
{ cout << "\nErreur : taille invalide !\n";
cout << "VECTEUR::CHANGE_TAILLE (int ) \n";
Sortie(1);
};
if ( n==0 )
// cas ou la taille selectionnee est nulle : initialisation identique a
// l'appel du constructeur par defaut
{ taille=0;
v=NULL;
return ;
};
double* tempo;
tempo=new double [n];
if ( n<=taille )
// cas ou la taille selectionnee est inferieure a la taille d'origine
{ for (int i=0;itaille )
// cas ou la taille selectionnee est superieure a la taille d'origine
{ for (int i=0;i pas possible
if (!memoire)
{ cout << "\n*** Erreur de changement de taille \n"
<< " il s'agit d'un vecteur particulier qui ne gere pas sa propre memoire "
<< " on ne peut pas modifier la place memoire !! ";
cout << "Vecteur::Change_taille (... \n";
Sortie(1);
};
// la suite concerne le cas où il faut vraiment faire quelque chose
if ( n<0 )
// cas ou la taille selectionnee est negative
{ cout << "\nErreur : taille demandee="< message d'erreur et arrêt
void Vecteur::Libere ()
{if (!memoire)
{ cout << "\n*** Erreur de liberation de la place memoire\n"
<< " il s'agit d'un vecteur particulier qui ne gere pas sa propre memoire "
<< " on ne peut pas modifier la place memoire !! ";
cout << "VECTEUR::LIBERE () \n";
Sortie(1);
};
// sinon c'est ok
if ( taille>0 )
{delete [] v;} // desallocation du vecteur pointe par v
else
{ if ( v!=NULL )
{ cout << "\nErreur de liberation de la place memoire\n";
cout << "VECTEUR::LIBERE () \n";
Sortie(1);
};
};
v=NULL;
taille=0;
};
#ifndef MISE_AU_POINT
inline
#endif
// Retourne le maximum en valeur absolue des composantes du vecteur
double Vecteur::Max_val_abs () const
{ double max;
max=fabs(v[0]); // affectation de max a la premiere composante du vecteur
for (int i=1;iNorme();
return *this;};
#ifndef MISE_AU_POINT
inline
#endif
// Realise le produit scalaire entre le vecteur courant et le vecteur
// vec et retourne le resultat obtenu
// N.B.: Les vecteurs doivent etre de meme taille
double Vecteur::Prod_scal (const Vecteur& vec) const
{
#ifdef MISE_AU_POINT
if ( taille!=vec.taille )
{ cout << "\nErreur : tailles non egales !\n";
cout << "VECTEUR::PROD_SCAL (Vecteur ) \n";
Sortie(1);
};
#endif
double prod_scal=0.0;
for (int i=0;i & A)
{ // cas où les deux tailles sont égales
if ( taille==A.size() )
{ for (int i=0;itaille) )
{ cout << "\nErreur : composante inexistante !\n";
cout << "VECTEUR::OPERATOR() (int ) \n";
Sortie(1);
};
#endif
return v[i-1];
};
#ifndef MISE_AU_POINT
inline
#endif
// Retourne la ieme composante du vecteur : acces en lecture et en ecriture
double& Vecteur::operator() (int i)
{
#ifdef MISE_AU_POINT
if ( (i<1) || (i>taille) )
{ cout << "\nErreur : composante inexistante !\n";
cout << "VECTEUR::OPERATOR() (int ) \n";
Sortie(1);
};
#endif
return v[i-1];
};
#ifndef MISE_AU_POINT
inline
#endif
// Surcharge de l'operateur ! : renvoie la norme d'un vecteur
double Vecteur::operator! () const
{ return Norme(); };
// mise a zero d'un vecteur
#ifndef MISE_AU_POINT
inline
#endif
void Vecteur::Zero()
{for (int i=0;i>
#ifndef MISE_AU_POINT
inline
#endif
void Vecteur::Lecture(istream & istr)
{istr >> *this; };
#ifndef MISE_AU_POINT
inline
#endif
// calcul le produit P(i) = (*this)(i) * A(i); ramène P qui est passé en paramètre
Vecteur& Vecteur::Prod_ii(const Vecteur& A, Vecteur& P) const
{
#ifdef MISE_AU_POINT
if ( taille != A.Taille() )
{cout << "\nErreur : la taille de this ("< vec.taille) )
{ cout << "\nErreur, affectation impossible: indice= " << indice << " vec.Taille()= " << vec.taille
<< " (*this).Taille()= " << taille << " !\n";
cout << "Vecteur::Egale_une_partie_de(const Vecteur& vec,int indice)\n";
Sortie(1);
};
#endif
int j=indice-1;
for (int i=0;i taille) )
{cout << "\nErreur, affectation impossible: indice= " << indice << " vec.Taille()= " << vec.taille
<< " (*this).Taille()= " << taille << " !\n";
cout << "Vecteur::Une_partie_egale(int indice, const Vecteur& vec)\n";
Sortie(1);
};
#endif
int j=indice-1;
for (int i=0;i> (istream & entree, Vecteur & vec)
{ // vérification du type
string type;
entree >> type;
if (type != "Vecteur")
{Sortie (1);
return entree;
};
// passage de la chaine donnant la taille puis lecture de la taille
int taille;
entree >> type >> taille;
// vérification de la taille sinon changement
if (vec.Taille() != taille) vec.Change_taille(taille);
// lecture des données
for (int i = 0; i< vec.taille; i++)
entree >> vec.v[i];
return entree;
};
// surcharge de l'operateur d'ecriture non formatée
// les informations sont le type puis la taille puis les datas séparées par
// un espace
#ifndef MISE_AU_POINT
inline
#endif
ostream & operator << ( ostream & sort,const Vecteur & vec)
{ // tout d'abord un indicateur donnant le type
sort << "Vecteur taille= " << vec.taille << " ";
for (int i = 0; i< vec.taille; i++)
sort << setprecision(ParaGlob::NbdigdoCA()) << vec.v[i] << " ";
// sort << "\n";
return sort;
};
// spécifiquement à la classe MV_Vector
#ifndef MISE_AU_POINT
inline
#endif
MV_Vector * Vecteur::Nouveau_MV_Vector_double()
{ MV_Vector * pt =
new MV_Vector (v,taille,MV_Vector_::ref_type(1));
return pt;
};
#ifndef MISE_AU_POINT
inline
#endif
const MV_Vector * Vecteur::Nouveau_MV_Vector_double_const() const
{ const MV_Vector * pt =
new const MV_Vector (v,taille,MV_Vector_::ref_type(1));
return pt;
};
// ramène un vecteur MV_Vector qui utilise la même place
// mémoire que this ce qui pemet d'utiliser le type MV_Vector
#ifndef MISE_AU_POINT
inline
#endif
MV_Vector Vecteur::MV_vecteur_double()
{ return (MV_Vector (v,taille,MV_Vector_::ref_type(1)));
};
// ramène un vecteur constant MV_Vector qui utilise la même place
// mémoire que this ce qui pemet d'utiliser le type MV_Vector
#ifndef MISE_AU_POINT
inline
#endif
const MV_Vector Vecteur::MV_vecteur_double() const
{ return (MV_Vector (v,taille,MV_Vector_::ref_type(1)));
};
#endif