368 lines
9.5 KiB
C++
368 lines
9.5 KiB
C++
|
|
// This file is part of the Herezh++ application.
|
|
//
|
|
// The finite element software Herezh++ is dedicated to the field
|
|
// of mechanics for large transformations of solid structures.
|
|
// It is developed by Gérard Rio (APP: IDDN.FR.010.0106078.000.R.P.2006.035.20600)
|
|
// INSTITUT DE RECHERCHE DUPUY DE LÔME (IRDL) <https://www.irdl.fr/>.
|
|
//
|
|
// Herezh++ is distributed under GPL 3 license ou ultérieure.
|
|
//
|
|
// Copyright (C) 1997-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 "debug.h"
|
|
#include "Base3D3.h"
|
|
|
|
#ifndef BASE3D3_H_deja_inclus
|
|
|
|
//===============================================================
|
|
// Les base covariantes et absolus
|
|
//===============================================================
|
|
|
|
|
|
// CONSTRUCTEURS :
|
|
// par defaut, defini une Base de coordonnŕes nulles
|
|
#ifndef MISE_AU_POINT
|
|
inline
|
|
#endif
|
|
Base3D3B::Base3D3B () :
|
|
v1(),v2(),v3()
|
|
{ v[0] = & v1;v[1] = & v1;v[2] = & v1;
|
|
};
|
|
// defini une Base unitaire en dimension 3 :100,010,001
|
|
#ifndef MISE_AU_POINT
|
|
inline
|
|
#endif
|
|
Base3D3B::Base3D3B (bool ):
|
|
v1(),v2(),v3()
|
|
{ v1(1) = 1.; v2(2) = 1.;v3(3) = 1.;
|
|
v[0] = & v1;v[1] = & v1;v[2] = & v1;
|
|
};
|
|
// defini une Base donnŕe a partir d'un tableau
|
|
#ifndef MISE_AU_POINT
|
|
inline
|
|
#endif
|
|
Base3D3B::Base3D3B ( const Tableau<Coordonnee3B > & vv) :
|
|
v1(vv(1)),v2(vv(2)),v3(vv(3))
|
|
{v[0] = & v1;v[1] = & v1;v[2] = & v1;};
|
|
// defini une Base donnŕe a partir de trois vecteur
|
|
#ifndef MISE_AU_POINT
|
|
inline
|
|
#endif
|
|
Base3D3B::Base3D3B
|
|
( const Coordonnee3B& vv1,const Coordonnee3B& vv2,const Coordonnee3B& vv3) :
|
|
v1(vv1),v2(vv2),v3(vv3)
|
|
{v[0] = & v1;v[1] = & v1;v[2] = & v1;};
|
|
// constructeur de copie
|
|
#ifndef MISE_AU_POINT
|
|
inline
|
|
#endif
|
|
Base3D3B::Base3D3B (const Base3D3B & aB) :
|
|
v1(aB.v1),v2(aB.v2),v3(aB.v3)
|
|
{v[0] = & v1;v[1] = & v1;v[2] = & v1;};
|
|
// DESTRUCTEUR :
|
|
#ifndef MISE_AU_POINT
|
|
inline
|
|
#endif
|
|
Base3D3B::~Base3D3B ()
|
|
{ };
|
|
// surcharge de l'affectation
|
|
#ifndef MISE_AU_POINT
|
|
inline
|
|
#endif
|
|
Base3D3B & Base3D3B::operator = (const Base3D3B & aB)
|
|
{ v1 = aB.v1; v2 = aB.v2;v3 = aB.v3;
|
|
v[0] = & v1;v[1] = & v1;v[2] = & v1;
|
|
return *this;
|
|
};
|
|
// retourne le i ieme Coordonnee3s en I/O
|
|
#ifndef MISE_AU_POINT
|
|
inline
|
|
#endif
|
|
Coordonnee3B & Base3D3B::operator () (int i)
|
|
{
|
|
#ifdef MISE_AU_POINT
|
|
if ((i < 1) || (i > 3))
|
|
{ cout << "\nErreur : vecteur inexistant !\n";
|
|
cout << " i = " << i << '\n';
|
|
cout << "Base3D3B::OPERATOR() (int ) \n";
|
|
Sortie(1);
|
|
};
|
|
#endif
|
|
return *(v[i-1]);
|
|
};
|
|
// retourne le i ieme Coordonnee3s en lecture only
|
|
#ifndef MISE_AU_POINT
|
|
inline
|
|
#endif
|
|
Coordonnee3B Base3D3B::operator () (int i) const
|
|
{
|
|
#ifdef MISE_AU_POINT
|
|
if ((i < 1) || (i > 3))
|
|
{ cout << "\nErreur : vecteur inexistant !\n";
|
|
cout << " i = " << i << '\n';
|
|
cout << "Base3D3B::OPERATOR() (int ) const \n";
|
|
Sortie(1);
|
|
};
|
|
#endif
|
|
return *(v[i-1]);
|
|
};
|
|
// retourne la j ieme composante du i ieme vecteur en I/O
|
|
#ifndef MISE_AU_POINT
|
|
inline
|
|
#endif
|
|
double & Base3D3B::operator () (int i,int j)
|
|
{
|
|
#ifdef MISE_AU_POINT
|
|
if ((i < 1) || (i > 3))
|
|
{ cout << "\nErreur : vecteur inexistant !\n";
|
|
cout << " i = " << i << '\n';
|
|
cout << " Base3D3B::operator () (int i,int j)\n";
|
|
Sortie(1);
|
|
};
|
|
if ((j < 1) || (j > 3))
|
|
{ cout << "\nErreur : composante inexistante !\n";
|
|
cout << " j = " << j << '\n';
|
|
cout << " Base3D3B::operator () (int i,int j)\n";
|
|
Sortie(1);
|
|
};
|
|
#endif
|
|
return (*(v[i-1]))(j);
|
|
};
|
|
// retourne la j ieme composante du i ieme vecteur en lecture only
|
|
#ifndef MISE_AU_POINT
|
|
inline
|
|
#endif
|
|
double Base3D3B::operator () (int i,int j) const
|
|
{
|
|
#ifdef MISE_AU_POINT
|
|
if ((i < 1) || (i > 3))
|
|
{ cout << "\nErreur : vecteur inexistant !\n";
|
|
cout << " i = " << i << '\n';
|
|
cout << " Base3D3B::operator () (int i,int j)\n";
|
|
Sortie(1);
|
|
};
|
|
if ((j < 1) || (j > 3))
|
|
{ cout << "\nErreur : composante inexistante !\n";
|
|
cout << " j = " << j << '\n';
|
|
cout << " Base3D3B::operator () (int i,int j)\n";
|
|
Sortie(1);
|
|
};
|
|
#endif
|
|
return (*(v[i-1]))(j);
|
|
};
|
|
|
|
|
|
// surcharge de l'operateur de lecture
|
|
#ifndef MISE_AU_POINT
|
|
inline
|
|
#endif
|
|
istream & operator >> ( istream & ent, Base3D3B & ba)
|
|
{ // lecture du type et vŕrification
|
|
string nomtype; ent >> nomtype;
|
|
if (nomtype != "Base3D3B")
|
|
{ Sortie(1);
|
|
return ent;
|
|
}
|
|
// lecture des data
|
|
ent >> ba.v1 >> ba.v2 >> ba.v3;
|
|
return ent;
|
|
};
|
|
|
|
// surcharge de l'operateur d'ecriture
|
|
#ifndef MISE_AU_POINT
|
|
inline
|
|
#endif
|
|
ostream & operator << ( ostream & sort,const Base3D3B & ba)
|
|
{ // ŕcriture du type
|
|
sort << "Base3D3B " ;
|
|
// les data
|
|
sort << ba.v1 << ba.v2 << ba.v3 << "\n";
|
|
return sort;
|
|
};
|
|
|
|
//===============================================================
|
|
// Les base duales
|
|
//===============================================================
|
|
|
|
// CONSTRUCTEURS :
|
|
// par defaut, defini une Base de coordonnŕes nulles
|
|
#ifndef MISE_AU_POINT
|
|
inline
|
|
#endif
|
|
Base3D3H::Base3D3H () :
|
|
v1(),v2(),v3()
|
|
{ v[0] = & v1;v[1] = & v1;v[2] = & v1;
|
|
};
|
|
// defini une Base unitaire en dimension 3 :100,010,001
|
|
#ifndef MISE_AU_POINT
|
|
inline
|
|
#endif
|
|
Base3D3H::Base3D3H (bool ):
|
|
v1(),v2(),v3()
|
|
{ v1(1) = 1.; v2(2) = 1.;v3(3) = 1.;
|
|
v[0] = & v1;v[1] = & v1;v[2] = & v1;
|
|
};
|
|
// defini une Base donnŕe a partir d'un tableau
|
|
#ifndef MISE_AU_POINT
|
|
inline
|
|
#endif
|
|
Base3D3H::Base3D3H ( const Tableau<Coordonnee3H > & vv) :
|
|
v1(vv(1)),v2(vv(2)),v3(vv(3))
|
|
{v[0] = & v1;v[1] = & v1;v[2] = & v1;};
|
|
// defini une Base donnŕe a partir de trois vecteur
|
|
#ifndef MISE_AU_POINT
|
|
inline
|
|
#endif
|
|
Base3D3H::Base3D3H
|
|
( const Coordonnee3H& vv1,const Coordonnee3H& vv2,const Coordonnee3H& vv3) :
|
|
v1(vv1),v2(vv2),v3(vv3)
|
|
{v[0] = & v1;v[1] = & v1;v[2] = & v1;};
|
|
// constructeur de copie
|
|
#ifndef MISE_AU_POINT
|
|
inline
|
|
#endif
|
|
Base3D3H::Base3D3H (const Base3D3H & aB) :
|
|
v1(aB.v1),v2(aB.v2),v3(aB.v3)
|
|
{v[0] = & v1;v[1] = & v1;v[2] = & v1;};
|
|
// DESTRUCTEUR :
|
|
#ifndef MISE_AU_POINT
|
|
inline
|
|
#endif
|
|
Base3D3H::~Base3D3H ()
|
|
{ };
|
|
// surcharge de l'affectation
|
|
#ifndef MISE_AU_POINT
|
|
inline
|
|
#endif
|
|
Base3D3H & Base3D3H::operator = (const Base3D3H & aH)
|
|
{ v1 = aH.v1; v2 = aH.v2;v3 = aH.v3;
|
|
v[0] = & v1;v[1] = & v1;v[2] = & v1;
|
|
return *this;
|
|
};
|
|
// retourne le i ieme Coordonnee3s en I/O
|
|
#ifndef MISE_AU_POINT
|
|
inline
|
|
#endif
|
|
Coordonnee3H & Base3D3H::operator () (int i)
|
|
{
|
|
#ifdef MISE_AU_POINT
|
|
if ((i < 1) || (i > 3))
|
|
{ cout << "\nErreur : vecteur inexistant !\n";
|
|
cout << " i = " << i << '\n';
|
|
cout << "Base3D3H::OPERATOR() (int ) \n";
|
|
Sortie(1);
|
|
};
|
|
#endif
|
|
return *(v[i-1]);
|
|
};
|
|
// retourne le i ieme Coordonnee3s en lecture only
|
|
#ifndef MISE_AU_POINT
|
|
inline
|
|
#endif
|
|
Coordonnee3H Base3D3H::operator () (int i) const
|
|
{
|
|
#ifdef MISE_AU_POINT
|
|
if ((i < 1) || (i > 3))
|
|
{ cout << "\nErreur : vecteur inexistant !\n";
|
|
cout << " i = " << i << '\n';
|
|
cout << "Base3D3H::OPERATOR() (int ) const \n";
|
|
Sortie(1);
|
|
};
|
|
#endif
|
|
return *(v[i-1]);
|
|
};
|
|
// retourne la j ieme composante du i ieme vecteur en I/O
|
|
#ifndef MISE_AU_POINT
|
|
inline
|
|
#endif
|
|
double & Base3D3H::operator () (int i,int j)
|
|
{
|
|
#ifdef MISE_AU_POINT
|
|
if ((i < 1) || (i > 3))
|
|
{ cout << "\nErreur : vecteur inexistant !\n";
|
|
cout << " i = " << i << '\n';
|
|
cout << " Base3D3H::operator () (int i,int j)\n";
|
|
Sortie(1);
|
|
};
|
|
if ((j < 1) || (j > 3))
|
|
{ cout << "\nErreur : composante inexistante !\n";
|
|
cout << " j = " << j << '\n';
|
|
cout << " Base3D3H::operator () (int i,int j)\n";
|
|
Sortie(1);
|
|
};
|
|
#endif
|
|
return (*(v[i-1]))(j);
|
|
};
|
|
// retourne la j ieme composante du i ieme vecteur en lecture only
|
|
#ifndef MISE_AU_POINT
|
|
inline
|
|
#endif
|
|
double Base3D3H::operator () (int i,int j) const
|
|
{
|
|
#ifdef MISE_AU_POINT
|
|
if ((i < 1) || (i > 3))
|
|
{ cout << "\nErreur : vecteur inexistant !\n";
|
|
cout << " i = " << i << '\n';
|
|
cout << " Base3D3H::operator () (int i,int j)\n";
|
|
Sortie(1);
|
|
};
|
|
if ((j < 1) || (j > 3))
|
|
{ cout << "\nErreur : composante inexistante !\n";
|
|
cout << " j = " << j << '\n';
|
|
cout << " Base3D3H::operator () (int i,int j)\n";
|
|
Sortie(1);
|
|
};
|
|
#endif
|
|
return (*(v[i-1]))(j);
|
|
};
|
|
|
|
|
|
// surcharge de l'operateur de lecture
|
|
#ifndef MISE_AU_POINT
|
|
inline
|
|
#endif
|
|
istream & operator >> ( istream & ent, Base3D3H & ba)
|
|
{ // lecture du type et vŕrification
|
|
string nomtype; ent >> nomtype;
|
|
if (nomtype != "Base3D3H")
|
|
{ Sortie(1);
|
|
return ent;
|
|
}
|
|
// lecture des data
|
|
ent >> ba.v1 >> ba.v2 >> ba.v3;
|
|
return ent;
|
|
};
|
|
|
|
// surcharge de l'operateur d'ecriture
|
|
#ifndef MISE_AU_POINT
|
|
inline
|
|
#endif
|
|
ostream & operator << ( ostream & sort,const Base3D3H & ba)
|
|
{ // ŕcriture du type
|
|
sort << "Base3D3H " ;
|
|
// les data
|
|
sort << ba.v1 << ba.v2 << ba.v3 << "\n";
|
|
return sort;
|
|
};
|
|
|
|
|
|
#endif
|
|
|