Gérard Rio
9692dbd130
- contient les éléments finis, métriques associées, déformations ... intégration du réperoire Géométrie: - contient les géométries 1D 2D et 3D, les frontières des éléments géométriques
1485 lines
72 KiB
C++
1485 lines
72 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 "GeomQuadrangle.h"
|
|
#include "GeomSeg.h"
|
|
#include <math.h>
|
|
#include "MathUtil.h"
|
|
|
|
// constructeur
|
|
// dimension 2, nbi pt integ, nbne noeuds, 1 face, 4 aretes
|
|
// sans_extrapole : cas particulier pour lequel on ne construit pas le
|
|
// tableau d'extrapolation: nécessaire pour justement définir ce tableau pour
|
|
// des éléments particuliers (ex: hexaèdre) en évitant une boucle récurcive
|
|
// via l'utilisation de sous-éléments particuliers (quadrangle, hexaèdre etc.)
|
|
GeomQuadrangle::GeomQuadrangle(int nbi, int nbne,int sans_extrapole) :
|
|
ElemGeomC0(2,nbi,nbne,1,4,QUADRANGLE,RIEN_INTERPOL)
|
|
,phi_M(),dphi_M()
|
|
{ // definition de la face
|
|
face(1) = this;
|
|
NONF(1).Change_taille(NBNE);
|
|
for (int i=1;i<=NBNE;i++)
|
|
NONF(1)(i) = i;
|
|
// définition de la numérotation locale de l'élément de direction inverse
|
|
switch (NBNE)
|
|
{ case 4:
|
|
{ INVCONNEC(1) = 1;INVCONNEC(2) = 4;
|
|
INVCONNEC(3) = 3;INVCONNEC(4) = 2;
|
|
// le tableau des tranches
|
|
IND.Change_taille(1); IND(1)=4;
|
|
break;
|
|
}
|
|
case 8:
|
|
{ INVCONNEC(1) = 1;INVCONNEC(2) = 4; INVCONNEC(3) = 3;INVCONNEC(4) = 2;
|
|
INVCONNEC(5) = 8;INVCONNEC(6) = 7; INVCONNEC(7) = 6;INVCONNEC(8) = 5;
|
|
// { INVCONNEC(1) = 2;INVCONNEC(2) = 1; INVCONNEC(3) = 4;INVCONNEC(4) = 3;
|
|
// INVCONNEC(5) = 5;INVCONNEC(6) = 8; INVCONNEC(7) = 7;INVCONNEC(8) = 6;
|
|
// le tableau des tranches
|
|
IND.Change_taille(2); IND(1)=4;IND(2)=4;
|
|
break;
|
|
}
|
|
case 9:
|
|
{ INVCONNEC(1) = 1;INVCONNEC(2) = 4; INVCONNEC(3) = 3;INVCONNEC(4) = 2;
|
|
INVCONNEC(5) = 8;INVCONNEC(6) = 7; INVCONNEC(7) = 6;INVCONNEC(8) = 5;
|
|
// { INVCONNEC(1) = 2;INVCONNEC(2) = 1; INVCONNEC(3) = 4;INVCONNEC(4) = 3;
|
|
// INVCONNEC(5) = 5;INVCONNEC(6) = 8; INVCONNEC(7) = 7;INVCONNEC(8) = 6;
|
|
INVCONNEC(9) = 9;
|
|
// le tableau des tranches
|
|
IND.Change_taille(3); IND(1)=4;IND(2)=4;IND(3)=1;
|
|
break;
|
|
}
|
|
case 6:
|
|
{ INVCONNEC(1) = 2;INVCONNEC(2) = 1; INVCONNEC(3) = 4;INVCONNEC(4) = 3;
|
|
INVCONNEC(5) = 5;INVCONNEC(6) = 6;
|
|
// le tableau des tranches
|
|
IND.Change_taille(2); IND(1)=4;IND(2)=2;
|
|
break;
|
|
}
|
|
case 16:
|
|
{ INVCONNEC(1) = 1; INVCONNEC(2) = 4; INVCONNEC(3) = 3; INVCONNEC(4) = 2;
|
|
INVCONNEC(5) = 12;INVCONNEC(6) = 11; INVCONNEC(7) = 10;INVCONNEC(8) = 9;
|
|
INVCONNEC(9) = 8; INVCONNEC(10) = 7; INVCONNEC(11) = 6; INVCONNEC(12) = 5;
|
|
INVCONNEC(13) = 13;INVCONNEC(14) = 16; INVCONNEC(15) = 15;INVCONNEC(16) = 14;
|
|
// le tableau des tranches
|
|
IND.Change_taille(3); IND(1)=4;IND(2)=8;IND(3)=4;
|
|
break;
|
|
}
|
|
default :
|
|
{ cout << "\n erreur le nombre de noeud demande :" << NBNE <<" n\'est"
|
|
<< " pas implante "
|
|
<< "\nGeomQuadrangle::GeomQuadrangle(int nbi, int nbne)";
|
|
Sortie(1);
|
|
}
|
|
}
|
|
//------------------------------------------------------
|
|
//cas des points d'integration
|
|
//------------------------------------------------------
|
|
if ((Nbi() == 1) || (Nbi() == 4) || (Nbi() == 9) || (Nbi() == 16))
|
|
{ // definition des cotes
|
|
int nbil = (int) sqrt((double)Nbi());
|
|
// on met 2 noeuds par défaut au lieu de sqrt(nbne) , mais cela n'a pas d'importance pour
|
|
// le calcul des points et poids d'intégration
|
|
GeomSeg b(nbil,2);
|
|
// definition des points et des poids
|
|
int ni = 1;
|
|
for (int niy = 1; niy<= nbil; niy++)
|
|
for (int nix = 1; nix<= nbil; nix++)
|
|
{ WI(ni) = b.Wi(nix) * b.Wi(niy);
|
|
ptInteg(ni) =
|
|
Coordonnee(b.CoorPtInteg(nix)(1),b.CoorPtInteg(niy)(1));
|
|
ni++;
|
|
}
|
|
}
|
|
else
|
|
{cout << "\n erreur le quadrangle de nombre de point d\'integration " << Nbi()
|
|
<< " n\'est pas implante !! ";
|
|
cout << "\nGeomQuadrangle::GeomQuadrangle(int nbi, int nbne) " << endl;
|
|
Sortie(1);
|
|
}
|
|
|
|
//
|
|
//-------------------------------------------------------------
|
|
//cas d'un quadrangle bilineaire ou quadratique/cubique complet
|
|
//-------------------------------------------------------------
|
|
if ( ((NBNE == 4) || (NBNE == 9)|| (NBNE == 16)) &&
|
|
((Nbi() == 1) || (Nbi() == 4) || (Nbi() == 9) || (Nbi() == 16)) )
|
|
{ // definition des cotes
|
|
int nbil = (int) sqrt((double)Nbi()); // point d'integration par cote
|
|
int nbnes; // nombre de noeud par cote
|
|
if (NBNE == 4) nbnes = 2;
|
|
else if (NBNE == 9) nbnes = 3;
|
|
else nbnes = 4;
|
|
seg(1) = new GeomSeg(nbil,nbnes);
|
|
for (int il=2;il<= 4; il++)
|
|
seg(il) = seg(1);
|
|
// def des tableaux de connection des noeuds des cotes
|
|
if (NBNE == 4)
|
|
{ for (int i =1;i<=4;i++) NONS(i).Change_taille(2);
|
|
NONS(1)(1) = 1;NONS(1)(2) = 2;NONS(2)(1) = 2;NONS(2)(2) = 3;
|
|
NONS(3)(1) = 3;NONS(3)(2) = 4;NONS(4)(1) = 4;NONS(4)(2) = 1;
|
|
}
|
|
else if (NBNE == 9)
|
|
{ for (int i =1;i<=4;i++) NONS(i).Change_taille(3);
|
|
NONS(1)(1) = 1;NONS(1)(2) = 5;NONS(1)(3) = 2;
|
|
NONS(2)(1) = 2;NONS(2)(2) = 6;NONS(2)(3) = 3;
|
|
NONS(3)(1) = 3;NONS(3)(2) = 7;NONS(3)(3) = 4;
|
|
NONS(4)(1) = 4;NONS(4)(2) = 8;NONS(4)(3) = 1;
|
|
}
|
|
else if (NBNE == 16)
|
|
{ for (int i =1;i<=4;i++) NONS(i).Change_taille(4);
|
|
NONS(1)(1) = 1;NONS(1)(2) = 5;NONS(1)(3) = 6;NONS(1)(4) = 2;
|
|
NONS(2)(1) = 2;NONS(2)(2) = 7;NONS(2)(3) = 8;NONS(2)(4) = 3;
|
|
NONS(3)(1) = 3;NONS(3)(2) = 9;NONS(3)(3) = 10;NONS(3)(4) = 4;
|
|
NONS(4)(1) = 4;NONS(4)(2) = 11;NONS(4)(3) = 12;NONS(4)(4) = 1;
|
|
}
|
|
|
|
// des fonctions d'interpolation, et des derivees
|
|
int ne = 1;
|
|
Tableau <Vecteur> tabPhiT(tabPhi);
|
|
Tableau < Mat_pleine > tabDPhiT(tabDPhi);
|
|
for (int iy = 1;iy<= nbnes; iy++)
|
|
for (int ix =1;ix<=nbnes;ix++)
|
|
{ int ni = 1;
|
|
for (int niy = 1; niy<= nbil; niy++)
|
|
for (int nix = 1; nix<= nbil; nix++)
|
|
{ tabPhiT(ni)(ne) = (seg(1)->Phi(nix))(ix) * seg(1)->Phi(niy)(iy);
|
|
tabDPhiT(ni)(1,ne) = seg(1)->Dphi(nix)(1,ix) * seg(1)->Phi(niy)(iy);
|
|
tabDPhiT(ni)(2,ne) = seg(1)->Phi(nix)(ix) * seg(1)->Dphi(niy)(1,iy);
|
|
ni++;
|
|
}
|
|
ne++;
|
|
}
|
|
// numerotation suivant le standard habituel
|
|
Tableau<int> ind;
|
|
if (nbnes == 2) // cas bilineaire
|
|
{id_interpol=LINEAIRE;
|
|
for (int ni=1;ni<=Nbi();ni++)
|
|
{ //cout << "\nni = " << ni;
|
|
ind.Change_taille(4);
|
|
ind(1) = 1; ind(2) = 2; ind(3) = 4; ind(4) = 3;
|
|
for (int ne = 1; ne<= 4; ne++)
|
|
{ for (int ii=1;ii<=2;ii++)
|
|
{tabDPhi(ni)(ii,ne) = tabDPhiT(ni)(ii,ind(ne));
|
|
//cout << "tph(" << ii << "," << ne << ")=" << tabDPhi(ni)(ii,ne);
|
|
}
|
|
//cout << "\n";
|
|
tabPhi(ni)(ne) = tabPhiT(ni)(ind(ne));
|
|
}
|
|
}
|
|
}
|
|
else if (nbnes == 3) // cas quadratique complet
|
|
{id_interpol=QUADRACOMPL;
|
|
for (int ni=1;ni<=Nbi();ni++)
|
|
{ ind.Change_taille(9);
|
|
ind(1) = 1; ind(2) = 3; ind(3) = 9; ind(4) = 7;ind(5) = 2;
|
|
ind(6) = 6; ind(7) = 8; ind(8) = 4; ind(9) = 5;
|
|
for (int ne = 1; ne<= 9; ne++)
|
|
{ for (int ii=1;ii<=2;ii++)
|
|
tabDPhi(ni)(ii,ne) = tabDPhiT(ni)(ii,ind(ne));
|
|
tabPhi(ni)(ne) = tabPhiT(ni)(ind(ne));
|
|
}
|
|
}
|
|
}
|
|
else if (nbnes == 4) // cas cubique complet
|
|
{id_interpol=CUBIQUE;
|
|
for (int ni=1;ni<=Nbi();ni++)
|
|
{ ind.Change_taille(16);
|
|
ind(1) = 1; ind(2) = 4; ind(3) = 16; ind(4) = 13;ind(5) = 2;
|
|
ind(6) = 3; ind(7) = 8; ind(8) = 12; ind(9) = 15;
|
|
ind(10) = 14; ind(11) = 9; ind(12) = 5; ind(13) = 6;
|
|
ind(14) = 7; ind(15) = 11; ind(16) = 10;
|
|
for (int ne = 1; ne<= 16; ne++)
|
|
{ for (int ii=1;ii<=2;ii++)
|
|
tabDPhi(ni)(ii,ne) = tabDPhiT(ni)(ii,ind(ne));
|
|
tabPhi(ni)(ne) = tabPhiT(ni)(ind(ne));
|
|
}
|
|
}
|
|
}
|
|
// définition des coordonnées des noeuds
|
|
// et de la triangulation
|
|
if (NBNE == 4)
|
|
{ ptelem(1) = Coordonnee(-1.,-1.);
|
|
ptelem(2) = Coordonnee(1.,-1.);
|
|
ptelem(3) = Coordonnee(1.,1.);
|
|
ptelem(4) = Coordonnee(-1.,1.);
|
|
// triangulation de la face
|
|
NONFt(1).Change_taille(2); // 2 face linéaires pour la face quadrangle
|
|
// trois noeuds pour chaque triangle linéaire
|
|
for (int ikt=1;ikt<=2;ikt++)
|
|
NONFt(1)(ikt).Change_taille(3);
|
|
// remplissage de la connexion par rapport à celle de l'élément
|
|
NONFt(1)(1)(1) = 1; NONFt(1)(1)(2) = 2; NONFt(1)(1)(3) = 3;
|
|
NONFt(1)(2)(1) = 1; NONFt(1)(2)(2) = 3; NONFt(1)(2)(3) = 4;
|
|
}
|
|
else if (NBNE == 9)// NBE=9
|
|
{ ptelem(1) = Coordonnee(-1.,-1.);
|
|
ptelem(2) = Coordonnee(1.,-1.);
|
|
ptelem(3) = Coordonnee(1.,1.);
|
|
ptelem(4) = Coordonnee(-1.,1.);
|
|
ptelem(5) = Coordonnee(0,-1.);
|
|
ptelem(6) = Coordonnee(1.,0);
|
|
ptelem(7) = Coordonnee(0.,1.);
|
|
ptelem(8) = Coordonnee(-1.,0.);
|
|
ptelem(9) = Coordonnee(0,0.);
|
|
// triangulation de la face
|
|
NONFt(1).Change_taille(8); // 8 face linéaires pour la face quadrangle
|
|
// trois noeuds pour chaque triangle linéaire
|
|
for (int ikt=1;ikt<=8;ikt++)
|
|
NONFt(1)(ikt).Change_taille(3);
|
|
// remplissage de la connexion par rapport à celle de l'élément
|
|
NONFt(1)(1)(1) = 8; NONFt(1)(1)(2) = 5; NONFt(1)(1)(3) = 9;
|
|
NONFt(1)(2)(1) = 5; NONFt(1)(2)(2) = 6; NONFt(1)(2)(3) = 9;
|
|
NONFt(1)(3)(1) = 9; NONFt(1)(3)(2) = 6; NONFt(1)(3)(3) = 7;
|
|
NONFt(1)(4)(1) = 8; NONFt(1)(4)(2) = 9; NONFt(1)(4)(3) = 7;
|
|
NONFt(1)(5)(1) = 1; NONFt(1)(5)(2) = 5; NONFt(1)(5)(3) = 8;
|
|
NONFt(1)(6)(1) = 5; NONFt(1)(6)(2) = 2; NONFt(1)(6)(3) = 6;
|
|
NONFt(1)(7)(1) = 6; NONFt(1)(7)(2) = 3; NONFt(1)(7)(3) = 7;
|
|
NONFt(1)(8)(1) = 8; NONFt(1)(8)(2) = 7; NONFt(1)(8)(3) = 4;
|
|
}
|
|
else if (NBNE == 16)// NBE=16
|
|
{ double a = 2./3.;
|
|
ptelem(1) = Coordonnee(-1.,-1.);
|
|
ptelem(2) = Coordonnee(1.,-1.);
|
|
ptelem(3) = Coordonnee(1.,1.);
|
|
ptelem(4) = Coordonnee(-1.,1.);
|
|
ptelem(5) = Coordonnee(-a,-1.);
|
|
ptelem(6) = Coordonnee(a,-1.);
|
|
ptelem(7) = Coordonnee(1.,-a);
|
|
ptelem(8) = Coordonnee(1.,a);
|
|
ptelem(9) = Coordonnee(a,1.);
|
|
ptelem(10) = Coordonnee(-a,1.);
|
|
ptelem(11) = Coordonnee(-1.,a);
|
|
ptelem(12) = Coordonnee(-1.,-a);
|
|
ptelem(13) = Coordonnee(-a,-a);
|
|
ptelem(14) = Coordonnee(a,-a);
|
|
ptelem(15) = Coordonnee(a,a);
|
|
ptelem(16) = Coordonnee(-a,a);
|
|
// triangulation de la face
|
|
NONFt(1).Change_taille(18); // 18 faces linéaires pour la face quadrangle
|
|
// trois noeuds pour chaque triangle linéaire
|
|
for (int ikt=1;ikt<=18;ikt++)
|
|
NONFt(1)(ikt).Change_taille(3);
|
|
// remplissage de la connexion par rapport à celle de l'élément
|
|
NONFt(1)(1)(1) = 1; NONFt(1)(1)(2) = 5; NONFt(1)(1)(3) = 12;
|
|
NONFt(1)(2)(1) = 5; NONFt(1)(2)(2) = 13; NONFt(1)(2)(3) = 12;
|
|
NONFt(1)(3)(1) = 5; NONFt(1)(3)(2) = 6; NONFt(1)(3)(3) = 13;
|
|
NONFt(1)(4)(1) = 6; NONFt(1)(4)(2) = 14; NONFt(1)(4)(3) = 13;
|
|
NONFt(1)(5)(1) = 6; NONFt(1)(5)(2) = 2; NONFt(1)(5)(3) = 14;
|
|
NONFt(1)(6)(1) = 2; NONFt(1)(6)(2) = 7; NONFt(1)(6)(3) = 14;
|
|
NONFt(1)(7)(1) = 12; NONFt(1)(7)(2) = 13; NONFt(1)(7)(3) = 11;
|
|
NONFt(1)(8)(1) = 13; NONFt(1)(8)(2) = 16; NONFt(1)(8)(3) = 11;
|
|
NONFt(1)(9)(1) = 13; NONFt(1)(9)(2) = 14; NONFt(1)(9)(3) = 16;
|
|
NONFt(1)(10)(1) = 14; NONFt(1)(10)(2) = 15; NONFt(1)(10)(3) = 16;
|
|
NONFt(1)(11)(1) = 14; NONFt(1)(11)(2) = 7; NONFt(1)(11)(3) = 15;
|
|
NONFt(1)(12)(1) = 7; NONFt(1)(12)(2) = 8; NONFt(1)(12)(3) = 15;
|
|
NONFt(1)(13)(1) = 11; NONFt(1)(13)(2) = 16; NONFt(1)(13)(3) = 4;
|
|
NONFt(1)(14)(1) = 16; NONFt(1)(14)(2) = 10; NONFt(1)(14)(3) = 4;
|
|
NONFt(1)(15)(1) = 16; NONFt(1)(15)(2) = 15; NONFt(1)(15)(3) = 10;
|
|
NONFt(1)(16)(1) = 15; NONFt(1)(16)(2) = 9; NONFt(1)(16)(3) = 10;
|
|
NONFt(1)(17)(1) = 15; NONFt(1)(17)(2) = 8; NONFt(1)(17)(3) = 9;
|
|
NONFt(1)(18)(1) = 8; NONFt(1)(18)(2) = 3; NONFt(1)(18)(3) = 9;
|
|
}
|
|
|
|
}
|
|
//------------------------------------------------------
|
|
// cas d'un quadrangle quadratique incomplet 8 noeuds
|
|
//------------------------------------------------------
|
|
else if ( (NBNE == 8) &&
|
|
((Nbi() == 1) || (Nbi() == 4) || (Nbi() == 9) || (Nbi() == 16)) )
|
|
{ id_interpol=QUADRATIQUE;
|
|
// definition des cotes, qui sont quadratiques
|
|
int nbil = (int) sqrt((double)Nbi());
|
|
int nbnes = 3;
|
|
seg(1) = new GeomSeg(nbil,nbnes);
|
|
for (int il=2;il<= 4; il++)
|
|
seg(il) = seg(1);
|
|
// def des tableaux de connection des noeuds des faces et des noeuds des cotes
|
|
for (int i =1;i<=4;i++) NONS(i).Change_taille(3);
|
|
NONS(1)(1) = 1;NONS(1)(2) = 5;NONS(1)(3) = 2;
|
|
NONS(2)(1) = 2;NONS(2)(2) = 6;NONS(2)(3) = 3;
|
|
NONS(3)(1) = 3;NONS(3)(2) = 7;NONS(3)(3) = 4;
|
|
NONS(4)(1) = 4;NONS(4)(2) = 8;NONS(4)(3) = 1;
|
|
// triangulation de la face
|
|
NONFt(1).Change_taille(6); // 6 face linéaires pour la face quadrangle
|
|
// trois noeuds pour chaque triangle linéaire
|
|
for (int ikt=1;ikt<=6;ikt++)
|
|
NONFt(1)(ikt).Change_taille(3);
|
|
// remplissage de la connexion par rapport à celle de l'élément
|
|
NONFt(1)(1)(1) = 1; NONFt(1)(1)(2) = 5; NONFt(1)(1)(3) = 8;
|
|
NONFt(1)(2)(1) = 8; NONFt(1)(2)(2) = 5; NONFt(1)(2)(3) = 6;
|
|
NONFt(1)(3)(1) = 5; NONFt(1)(3)(2) = 2; NONFt(1)(3)(3) = 6;
|
|
NONFt(1)(4)(1) = 6; NONFt(1)(4)(2) = 3; NONFt(1)(4)(3) = 7;
|
|
NONFt(1)(5)(1) = 8; NONFt(1)(5)(2) = 6; NONFt(1)(5)(3) = 7;
|
|
NONFt(1)(6)(1) = 8; NONFt(1)(6)(2) = 7; NONFt(1)(6)(3) = 4;
|
|
// définition des coordonnées des noeuds
|
|
ptelem(1) = Coordonnee(-1.,-1.);
|
|
ptelem(2) = Coordonnee(1.,-1.);
|
|
ptelem(3) = Coordonnee(1.,1.);
|
|
ptelem(4) = Coordonnee(-1.,1.);
|
|
ptelem(5) = Coordonnee(0,-1.);
|
|
ptelem(6) = Coordonnee(1.,0);
|
|
ptelem(7) = Coordonnee(0.,1.);
|
|
ptelem(8) = Coordonnee(-1.,0.);
|
|
// definition des points , des fonctions d'interpolation, et des derivees
|
|
double C= 0.25;
|
|
double D= 0.5;
|
|
GeomSeg & a = *((GeomSeg*) seg(1)); // pour commodite
|
|
int ni = 1;
|
|
// for (int NI1=1;NI1<=nbil;NI1++)
|
|
// { double P1= 1.+a.KSI(NI1);
|
|
// double M1= 1.-a.KSI(NI1);
|
|
// for (int NI2=1;NI2<=nbil;NI2++)
|
|
// { double P2= 1.+a.KSI(NI2);
|
|
// double M2= 1.-a.KSI(NI2);
|
|
|
|
// on suit le même ordre des pt d'integ (d'abord suivant x puis suivant y)
|
|
// d'où c'est la boucle suivant y qui est la plus extrème
|
|
for (int NI2=1;NI2<=nbil;NI2++)
|
|
{ double P2= 1.+a.KSI(NI2);
|
|
double M2= 1.-a.KSI(NI2);
|
|
for (int NI1=1;NI1<=nbil;NI1++)
|
|
{ double P1= 1.+a.KSI(NI1);
|
|
double M1= 1.-a.KSI(NI1);
|
|
// ------------------------------
|
|
// des fonctions d'interpolations
|
|
// ------------------------------
|
|
tabPhi(ni)(1)= -C*M1*M2*(1.+a.KSI(NI1)+a.KSI(NI2));
|
|
tabPhi(ni)(2)= -C*P1*M2*(1.-a.KSI(NI1)+a.KSI(NI2));
|
|
tabPhi(ni)(3)= -C*P1*P2*(1.-a.KSI(NI1)-a.KSI(NI2));
|
|
tabPhi(ni)(4)= -C*M1*P2*(1.+a.KSI(NI1)-a.KSI(NI2));
|
|
tabPhi(ni)(5)= D*M1*P1*M2;
|
|
tabPhi(ni)(6)= D*P1*M2*P2;
|
|
tabPhi(ni)(7)= D*M1*P1*P2;
|
|
tabPhi(ni)(8)= D*M1*M2*P2;
|
|
// -----------------
|
|
// de leurs derivees
|
|
// -----------------
|
|
tabDPhi(ni)(1,1)= C*M2*(2.*a.KSI(NI1)+a.KSI(NI2));
|
|
tabDPhi(ni)(2,1)= C*M1*(a.KSI(NI1)+2.*a.KSI(NI2));
|
|
tabDPhi(ni)(1,2)= C*M2*(2.*a.KSI(NI1)-a.KSI(NI2));
|
|
tabDPhi(ni)(2,2)= -C*P1*(a.KSI(NI1)-2.*a.KSI(NI2));
|
|
tabDPhi(ni)(1,3)= C*P2*(2.*a.KSI(NI1)+a.KSI(NI2));
|
|
tabDPhi(ni)(2,3)= C*P1*(a.KSI(NI1)+2.*a.KSI(NI2));
|
|
tabDPhi(ni)(1,4)= C*P2*(2.*a.KSI(NI1)-a.KSI(NI2));
|
|
tabDPhi(ni)(2,4)= -C*M1*(a.KSI(NI1)-2.*a.KSI(NI2));
|
|
tabDPhi(ni)(1,5)= -M2*a.KSI(NI1);
|
|
tabDPhi(ni)(2,5)= -D*M1*P1;
|
|
tabDPhi(ni)(1,6)= D*M2*P2;
|
|
tabDPhi(ni)(2,6)= -P1*a.KSI(NI2);
|
|
tabDPhi(ni)(1,7)= -P2*a.KSI(NI1);
|
|
tabDPhi(ni)(2,7)= D*M1*P1;
|
|
tabDPhi(ni)(1,8)= -D*M2*P2;
|
|
tabDPhi(ni)(2,8)= -M1*a.KSI(NI2);
|
|
ni++;
|
|
}
|
|
}
|
|
}
|
|
// -------------------------------------------------------
|
|
// ------------ cas lineaire/quadratique -------------
|
|
// -------------------------------------------------------
|
|
// quadratique suivant ksi et lineaire suivant eta
|
|
|
|
else if ( (NBNE == 6) &&
|
|
((Nbi() == 1) || (Nbi() == 4) || (Nbi() == 9) || (Nbi() == 16)) )
|
|
{ id_interpol=LINQUAD;
|
|
// definition des cotes, qui sont quadratiques
|
|
int nbil = (int) sqrt((double)Nbi());
|
|
int nbnes = 3;
|
|
seg(1) = new GeomSeg(nbil,nbnes); // quadratique
|
|
seg(2) = new GeomSeg(nbil,2); // lineaire
|
|
seg(3) = seg(1); seg(4) = seg(2);
|
|
// def des tableaux de connection des noeuds des faces et des noeuds des cotes
|
|
NONS(1).Change_taille(3);NONS(2).Change_taille(2);
|
|
NONS(3).Change_taille(3);NONS(4).Change_taille(2);
|
|
NONS(1)(1) = 1;NONS(1)(2) = 5;NONS(1)(3) = 2;
|
|
NONS(2)(1) = 2;NONS(2)(2) = 3;
|
|
NONS(3)(1) = 3;NONS(3)(2) = 6;NONS(3)(3) = 4;
|
|
NONS(4)(1) = 4;NONS(4)(2) = 1;
|
|
// triangulation de la face
|
|
NONFt(1).Change_taille(4); // 4 face linéaires pour la face quadrangle
|
|
// trois noeuds pour chaque triangle linéaire
|
|
for (int ikt=1;ikt<=4;ikt++)
|
|
NONFt(1)(ikt).Change_taille(3);
|
|
// remplissage de la connexion par rapport à celle de l'élément
|
|
NONFt(1)(1)(1) = 1; NONFt(1)(1)(2) = 6; NONFt(1)(1)(3) = 4;
|
|
NONFt(1)(2)(1) = 1; NONFt(1)(2)(2) = 5; NONFt(1)(2)(3) = 6;
|
|
NONFt(1)(3)(1) = 5; NONFt(1)(3)(2) = 3; NONFt(1)(3)(3) = 6;
|
|
NONFt(1)(4)(1) = 5; NONFt(1)(4)(2) = 2; NONFt(1)(4)(3) = 3;
|
|
// définition des coordonnées des noeuds
|
|
ptelem(1) = Coordonnee(-1.,-1.);
|
|
ptelem(2) = Coordonnee(1.,-1.);
|
|
ptelem(3) = Coordonnee(1.,1.);
|
|
ptelem(4) = Coordonnee(-1.,1.);
|
|
ptelem(5) = Coordonnee(0,-1.);
|
|
ptelem(6) = Coordonnee(1.,0);
|
|
// definition des points , des fonctions d'interpolation, et des derivees
|
|
double C= 0.25;
|
|
double D= 0.5;
|
|
GeomSeg & a = *((GeomSeg*) seg(1)); // pour commodite
|
|
int ni = 1;
|
|
for (int NI1=1;NI1<=nbil;NI1++)
|
|
{ double P1= 1.+a.KSI(NI1);
|
|
double M1= 1.-a.KSI(NI1);
|
|
for (int NI2=1;NI2<=nbil;NI2++)
|
|
{ double P2= 1.+a.KSI(NI2);
|
|
double M2= 1.-a.KSI(NI2);
|
|
// ------------------------------
|
|
// des fonctions d'interpolations
|
|
// ------------------------------
|
|
tabPhi(ni)(1)= -C*a.KSI(NI1)*M1*M2;
|
|
tabPhi(ni)(2)= C*a.KSI(NI1)*P1*M2;
|
|
tabPhi(ni)(3)= C*a.KSI(NI1)*P1*P2;
|
|
tabPhi(ni)(4)= -C*a.KSI(NI1)*M1*P2;
|
|
tabPhi(ni)(5)= D*M1*P1*M2;
|
|
tabPhi(ni)(6)= D*M1*P1*P2;
|
|
|
|
// -----------------
|
|
// de leurs derivees
|
|
// -----------------
|
|
tabDPhi(ni)(1,1)= -C*(1.-2*a.KSI(NI1))*M2;
|
|
tabDPhi(ni)(2,1)= C*a.KSI(NI1)*M1;
|
|
tabDPhi(ni)(1,2)= C*(1.+2.*a.KSI(NI1))*M2;
|
|
tabDPhi(ni)(2,2)= -C*a.KSI(NI1)*P1;
|
|
tabDPhi(ni)(1,3)= C*(1.+2.*a.KSI(NI1))*P2;
|
|
tabDPhi(ni)(2,3)= C*a.KSI(NI1)*P1;
|
|
tabDPhi(ni)(1,4)= -C*(1.-2*a.KSI(NI1))*P2;
|
|
tabDPhi(ni)(2,4)= -C*a.KSI(NI1)*M1;
|
|
tabDPhi(ni)(1,5)= -M2*a.KSI(NI1);
|
|
tabDPhi(ni)(2,5)= -D*M1*P1;
|
|
tabDPhi(ni)(1,6)= -P2*a.KSI(NI1);
|
|
tabDPhi(ni)(2,6)= D*M1*P1;
|
|
ni++;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{cout << "\n erreur le quadrangle de nombre de noeud NBNE = " << NBNE
|
|
<< "\n n\'est pas implante !! ";
|
|
cout << "\nGeomQuadrangle::GeomQuadrangle(int nbi, int nbne) " << endl;
|
|
Sortie(1);
|
|
}
|
|
// ---- constitution du tableau Extrapol -----
|
|
if (!sans_extrapole)
|
|
Calcul_extrapol(nbi);
|
|
};
|
|
|
|
// destructeur
|
|
GeomQuadrangle::~GeomQuadrangle()
|
|
{ if ((NBNE == 4) || (NBNE == 9) || (NBNE == 8)|| (NBNE == 16))
|
|
delete seg(1);
|
|
else
|
|
{ delete seg (1);
|
|
delete seg(2);
|
|
}
|
|
};
|
|
// constructeur de copie
|
|
GeomQuadrangle::GeomQuadrangle(const GeomQuadrangle& a) :
|
|
ElemGeomC0(a),phi_M(a.phi_M),dphi_M(a.dphi_M)
|
|
{ // la copie des parties pointées est à la charge de la classe spécifique
|
|
// definition de la face
|
|
face(1) = this;
|
|
// def des segments
|
|
if ((NBNE == 4) || (NBNE == 9) || (NBNE == 8) || (NBNE == 16))
|
|
{ seg(1) = new GeomSeg(*((GeomSeg*)(a.seg(1)))) ;
|
|
for (int il=2;il<= 4; il++)
|
|
seg(il) = seg(1);
|
|
}
|
|
else
|
|
{ seg (1) = new GeomSeg(*((GeomSeg*)(a.seg(1)))) ;
|
|
seg (2) = new GeomSeg(*((GeomSeg*)(a.seg(2)))) ;
|
|
seg(3) = seg(1); seg(4) = seg(2);
|
|
}
|
|
};
|
|
|
|
// création d'élément identiques : cette fonction est analogue à la fonction new
|
|
// elle y fait d'ailleurs appel. l'implantation est spécifique dans chaque classe
|
|
// dérivée
|
|
// pt est le pointeur qui est affecté par la fonction
|
|
ElemGeomC0 * GeomQuadrangle::newElemGeomC0(ElemGeomC0 * pt)
|
|
{ pt = new GeomQuadrangle(*this);
|
|
return pt;
|
|
};
|
|
|
|
//--------- cas de coordonnees locales quelconques ----------------
|
|
|
|
// retourne les fonctions d'interpolation au point M (en coordonnees locales)
|
|
const Vecteur& GeomQuadrangle::Phi(const Coordonnee& M)
|
|
{
|
|
#ifdef MISE_AU_POINT
|
|
// verification de la dimension des coordonnees locales
|
|
if (M.Dimension() != 2)
|
|
{ cout << "\n erreur la dimension des coordonnees locales :" << M.Dimension()
|
|
<<"n\'est pas egale a 2 "
|
|
<< "\nGeomQuadrangle::Phi(Coordonnee& M)";
|
|
Sortie(1);
|
|
}
|
|
#endif
|
|
// Vecteur phi(NBNE); // tableau des fonctions d'interpolation
|
|
// dimentionnement éventuelle du tableau des fonctions d'interpolation
|
|
phi_M.Change_taille(NBNE); // si la taille est identique -> aucune action
|
|
//------------------------------------------------------
|
|
//cas d'un quadrangle bilineaire ou quadratique/cubique complet
|
|
//------------------------------------------------------
|
|
if ((NBNE == 4) || (NBNE == 9) || (NBNE == 16))
|
|
{ int nbnes; // nombre de noeud par cote
|
|
if (NBNE == 4) nbnes = 2;
|
|
else if (NBNE == 9) nbnes = 3;
|
|
else nbnes = 4;
|
|
Coordonnee X(1),Y(1); X(1) = M(1); Y(1) = M(2); // coordonnees pour le segment
|
|
// fonctions d'interpolation
|
|
int ne = 1;
|
|
Vecteur tabPhiT(NBNE);
|
|
for (int iy = 1;iy<= nbnes; iy++)
|
|
for (int ix =1;ix<=nbnes;ix++)
|
|
{ tabPhiT(ne) = seg(1)->Phi(X)(ix) * seg(1)->Phi(Y)(iy);
|
|
ne++;
|
|
}
|
|
// numerotation suivant le standard habituel
|
|
Tableau<int> ind;
|
|
if (nbnes == 2) // cas bilineaire
|
|
{ ind.Change_taille(4);
|
|
ind(1) = 1; ind(2) = 2; ind(3) = 4; ind(4) = 3;
|
|
for (int ne = 1; ne<= 4; ne++)
|
|
phi_M(ne) = tabPhiT(ind(ne));
|
|
}
|
|
else if (nbnes == 3) // cas quadratique complet
|
|
{ ind.Change_taille(9);
|
|
ind(1) = 1; ind(2) = 3; ind(3) = 9; ind(4) = 7;ind(5) = 2;
|
|
ind(6) = 6; ind(7) = 8; ind(8) = 4; ind(9) = 5;
|
|
for (int ne = 1; ne<= 9; ne++)
|
|
phi_M(ne) = tabPhiT(ind(ne));
|
|
}
|
|
else if (nbnes == 4) // cas cubique complet
|
|
{ ind.Change_taille(16);
|
|
ind(1) = 1; ind(2) = 4; ind(3) = 16; ind(4) = 13;ind(5) = 2;
|
|
ind(6) = 3; ind(7) = 8; ind(8) = 12; ind(9) = 15;
|
|
ind(10) = 14; ind(11) = 9; ind(12) = 5; ind(13) = 6;
|
|
ind(14) = 7; ind(15) = 11; ind(16) = 10;
|
|
for (int ne = 1; ne<= 16; ne++)
|
|
phi_M(ne) = tabPhiT(ind(ne));
|
|
}
|
|
}
|
|
//------------------------------------------------------
|
|
// cas d'un quadrangle quadratique incomplet 8 noeuds
|
|
//------------------------------------------------------
|
|
else if (NBNE == 8)
|
|
{
|
|
// inter pour les fonctions d'interpolation
|
|
double C= 0.25;
|
|
double D= 0.5;
|
|
double P1= 1.+ M(1);
|
|
double M1= 1.- M(1);
|
|
double P2= 1.+ M(2);
|
|
double M2= 1.- M(2);
|
|
// ------------------------------
|
|
// fonctions d'interpolations
|
|
// ------------------------------
|
|
phi_M(1)= -C*M1*M2*(1.+ M(1)+ M(2));
|
|
phi_M(2)= -C*P1*M2*(1.- M(1)+ M(2));
|
|
phi_M(3)= -C*P1*P2*(1.- M(1)- M(2));
|
|
phi_M(4)= -C*M1*P2*(1.+ M(1)- M(2));
|
|
phi_M(5)= D*M1*P1*M2;
|
|
phi_M(6)= D*P1*M2*P2;
|
|
phi_M(7)= D*M1*P1*P2;
|
|
phi_M(8)= D*M1*M2*P2;
|
|
}
|
|
// -------------------------------------------------------
|
|
// ------------ cas lineaire/quadratique -------------
|
|
// -------------------------------------------------------
|
|
// quadratique suivant ksi et lineaire suivant eta
|
|
|
|
else if (NBNE == 6)
|
|
{ // inter pour les fonctions d'interpolation,
|
|
double C= 0.25;
|
|
double D= 0.5;
|
|
double P1= 1.+ M(1);
|
|
double M1= 1.- M(1);
|
|
double P2= 1.+ M(2);
|
|
double M2= 1.- M(2);
|
|
// ------------------------------
|
|
// des fonctions d'interpolations
|
|
// ------------------------------
|
|
phi_M(1)= -C* M(1)*M1*M2;
|
|
phi_M(2)= C* M(1)*P1*M2;
|
|
phi_M(3)= C* M(1)*P1*P2;
|
|
phi_M(4)= -C* M(1)*M1*P2;
|
|
phi_M(5)= D*M1*P1*M2;
|
|
phi_M(6)= D*M1*P1*P2;
|
|
}
|
|
else
|
|
{cout << "\n erreur le quadrangle de nombre de noeud NBNE = " << NBNE
|
|
<< "\n n\'est pas implante !! ";
|
|
cout << "\nGeomQuadrangle::Phi(Coordonnee& M) " << endl;
|
|
Sortie(1);
|
|
}
|
|
// retour de phi_M
|
|
return phi_M;
|
|
};
|
|
// retourne les derivees des fonctions d'interpolation au point M (en coordonnees locales)
|
|
const Mat_pleine& GeomQuadrangle::Dphi(const Coordonnee& M)
|
|
{
|
|
#ifdef MISE_AU_POINT
|
|
// verification de la dimension des coordonnees locales
|
|
if (M.Dimension() != 2)
|
|
{ cout << "\n erreur la dimension des coordonnees locales :" << M.Dimension()
|
|
<<"n\'est pas egale a 2 "
|
|
<< "\nGeomQuadrangle::Dphi(Coordonnee& M)";
|
|
Sortie(1);
|
|
}
|
|
#endif
|
|
// Mat_pleine dphi(2,NBNE); // le tableau des derivees
|
|
// le tableau des derivees: redimentionnement si nécessaire
|
|
if ((dphi_M.Nb_ligne() != 2)&&(dphi_M.Nb_colonne() != NBNE))
|
|
dphi_M.Initialise (2,NBNE,0.);
|
|
//------------------------------------------------------
|
|
//cas d'un quadrangle bilineaire ou quadratique/cubique complet
|
|
//------------------------------------------------------
|
|
if ((NBNE == 4) || (NBNE == 9) || (NBNE == 16))
|
|
{ int nbnes; // nombre de noeud par cote
|
|
if (NBNE == 4) nbnes = 2;
|
|
else if (NBNE == 9) nbnes = 3;
|
|
else nbnes = 4;
|
|
Coordonnee X(1),Y(1); X(1) = M(1); Y(1) = M(2); // coordonnees pour le segment
|
|
// derivee des fonctions d'interpolation
|
|
int ne = 1;
|
|
Mat_pleine tabDPhiT(2,NBNE);
|
|
for (int iy = 1;iy<= nbnes; iy++)
|
|
for (int ix =1;ix<=nbnes;ix++)
|
|
{ tabDPhiT(1,ne) = seg(1)->Dphi(X)(1,ix) * seg(1)->Phi(Y)(iy);
|
|
tabDPhiT(2,ne) = seg(1)->Phi(X)(ix) * seg(1)->Dphi(Y)(1,iy);
|
|
ne++;
|
|
}
|
|
// numerotation suivant le standard habituel
|
|
Tableau<int> ind;
|
|
if (nbnes == 2) // cas bilineaire
|
|
{ ind.Change_taille(4);
|
|
ind(1) = 1; ind(2) = 2; ind(3) = 4; ind(4) = 3;
|
|
for (int ne = 1; ne<= 4; ne++)
|
|
{ dphi_M(1,ne) = tabDPhiT(1,ind(ne));
|
|
dphi_M(2,ne) = tabDPhiT(2,ind(ne));
|
|
}
|
|
}
|
|
else if (nbnes == 3) // cas quadratique complet
|
|
{ ind.Change_taille(9);
|
|
ind(1) = 1; ind(2) = 3; ind(3) = 9; ind(4) = 7;ind(5) = 2;
|
|
ind(6) = 6; ind(7) = 8; ind(8) = 4; ind(9) = 5;
|
|
for (int ne = 1; ne<= 9; ne++)
|
|
{ dphi_M(1,ne) = tabDPhiT(1,ind(ne));
|
|
dphi_M(2,ne) = tabDPhiT(2,ind(ne));
|
|
}
|
|
}
|
|
else if (nbnes == 4) // cas cubique complet
|
|
{ ind.Change_taille(16);
|
|
ind(1) = 1; ind(2) = 4; ind(3) = 16; ind(4) = 13;ind(5) = 2;
|
|
ind(6) = 3; ind(7) = 8; ind(8) = 12; ind(9) = 15;
|
|
ind(10) = 14; ind(11) = 9; ind(12) = 5; ind(13) = 6;
|
|
ind(14) = 7; ind(15) = 11; ind(16) = 10;
|
|
for (int ne = 1; ne<= 16; ne++)
|
|
{ dphi_M(1,ne) = tabDPhiT(1,ind(ne));
|
|
dphi_M(2,ne) = tabDPhiT(2,ind(ne));
|
|
}
|
|
}
|
|
}
|
|
//------------------------------------------------------
|
|
// cas d'un quadrangle quadratique incomplet 8 noeuds
|
|
//------------------------------------------------------
|
|
else if (NBNE == 8)
|
|
{
|
|
// inter pour les derivees
|
|
double C= 0.25;
|
|
double D= 0.5;
|
|
double P1= 1.+ M(1);
|
|
double M1= 1.- M(1);
|
|
double P2= 1.+ M(2);
|
|
double M2= 1.- M(2);
|
|
// -----------------
|
|
// derivees
|
|
// -----------------
|
|
dphi_M(1,1)= C*M2*(2.* M(1)+ M(2));
|
|
dphi_M(2,1)= C*M1*( M(1)+2.* M(2));
|
|
dphi_M(1,2)= C*M2*(2.* M(1)- M(2));
|
|
dphi_M(2,2)= -C*P1*( M(1)-2.* M(2));
|
|
dphi_M(1,3)= C*P2*(2.* M(1)+ M(2));
|
|
dphi_M(2,3)= C*P1*( M(1)+2.* M(2));
|
|
dphi_M(1,4)= C*P2*(2.* M(1)- M(2));
|
|
dphi_M(2,4)= -C*M1*( M(1)-2.* M(2));
|
|
dphi_M(1,5)= -M2* M(1);
|
|
dphi_M(2,5)= -D*M1*P1;
|
|
dphi_M(1,6)= D*M2*P2;
|
|
dphi_M(2,6)= -P1* M(2);
|
|
dphi_M(1,7)= -P2* M(1);
|
|
dphi_M(2,7)= D*M1*P1;
|
|
dphi_M(1,8)= -D*M2*P2;
|
|
dphi_M(2,8)= -M1* M(2);
|
|
}
|
|
// -------------------------------------------------------
|
|
// ------------ cas lineaire/quadratique -------------
|
|
// -------------------------------------------------------
|
|
// quadratique suivant ksi et lineaire suivant eta
|
|
|
|
else if (NBNE == 6)
|
|
{ // inter pour les derivees,
|
|
double C= 0.25;
|
|
double D= 0.5;
|
|
double P1= 1.+ M(1);
|
|
double M1= 1.- M(1);
|
|
double P2= 1.+ M(2);
|
|
double M2= 1.- M(2);
|
|
// -----------------
|
|
// derivees
|
|
// -----------------
|
|
dphi_M(1,1)= -C*(1.-2* M(1))*M2;
|
|
dphi_M(2,1)= C* M(1)*M1;
|
|
dphi_M(1,2)= C*(1.+2.* M(1))*M2;
|
|
dphi_M(2,2)= -C* M(1)*P1;
|
|
dphi_M(1,3)= C*(1.+2.* M(1))*P2;
|
|
dphi_M(2,3)= C* M(1)*P1;
|
|
dphi_M(1,4)= -C*(1.-2* M(1))*P2;
|
|
dphi_M(2,4)= -C* M(1)*M1;
|
|
dphi_M(1,5)= -M2* M(1);
|
|
dphi_M(2,5)= -D*M1*P1;
|
|
dphi_M(1,6)= -P2* M(1);
|
|
dphi_M(2,6)= D*M1*P1;
|
|
}
|
|
else
|
|
{ cout << "\n erreur le nombre de noeud demande :" << NBNE <<"n\'est pas implante "
|
|
<< "\nGeomQuadrangle::Dphi(Coordonnee& M)";
|
|
Sortie(1);
|
|
}
|
|
// retour des derivees
|
|
return dphi_M;
|
|
};
|
|
|
|
// en fonction de coordonnees locales, retourne true si le point est a l'interieur
|
|
// de l'element, false sinon
|
|
bool GeomQuadrangle::Interieur(const Coordonnee& M)
|
|
{ if ((Dabs(M(1)) <= 1.) &&
|
|
(Dabs(M(2)) <= 1.) )
|
|
return true;
|
|
else
|
|
return false;
|
|
};
|
|
|
|
// en fonction de coordonnees locales, retourne le point local P, maximum intérieur à l'élément, donc sur la frontière
|
|
// dont les coordonnées sont sur la droite GM: c-a-d GP = alpha GM, avec apha maxi et P appartenant à la frontière
|
|
// de l'élément, G étant le centre de gravité, sauf si GM est nul, dans ce cas retour de M
|
|
Coordonnee GeomQuadrangle::Maxi_Coor_dans_directionGM(const Coordonnee& M)
|
|
{ // on recherche du maxi des 2 composantes en valeur absolu
|
|
double xmax = MaX(Dabs(M(1)),Dabs(M(2)));
|
|
if (xmax <= ConstMath::petit) return M;
|
|
// sinon on fait la règle de 3
|
|
Coordonnee P= M/xmax;
|
|
return P;
|
|
};
|
|
|
|
// constitution du tableau Extrapol
|
|
void GeomQuadrangle::Calcul_extrapol(int nbi)
|
|
{ // cas de l'extrapolation de grandeur des points d'intégrations aux noeuds
|
|
// def du tableau de pondération tab(i)(j) qu'il faut appliquer
|
|
// aux noeuds pour avoir la valeur aux noeuds
|
|
// val_au_noeud(i) = somme_(de j=indir(i)(1) à indir(i)(taille(indir(i)) )) {tab(i)(j) * val_pt_integ(j) }
|
|
// cas = 1: la valeur au noeud = la valeur au pt d'integ le plus près ou une moyenne des
|
|
// pt les plus près (si le nb de pt d'integ < nb noeud)
|
|
// --- pour l'instant seul le cas 1 est implanté ---
|
|
Tableau<Tableau<int> > & indir = extrapol(1).indir; // pour simplifier
|
|
Tableau<Tableau<double > > & tab = extrapol(1).tab; // pour simplifier
|
|
Tableau <int> indirect(3); // tableau de travail
|
|
Tableau <Coordonnee> gi_B,gi_H; // bases naturelle et duale
|
|
Vecteur phi_(3); // le conteneur pour les fonctions d'interpolation
|
|
Coordonnee theta(2); // le conteneur pour les coordonnées locales
|
|
|
|
switch (nbi)
|
|
{ case 1:
|
|
{ // cas avec un point d'intégration, quelque soit le nombre de noeuds,
|
|
// on reporte la valeur au pt d'integ, telle quelle au noeud
|
|
for (int ne=1;ne<=NBNE;ne++)
|
|
{tab(ne)(1)=1.;
|
|
indir(ne).Change_taille(1); indir(ne)(1)=1;
|
|
};
|
|
break;
|
|
}
|
|
case 4:
|
|
{ // cas avec 4 points d'intégration
|
|
// on extrapole linéairement vers les noeuds en considérant à chaque fois les 3 pt d'intégration
|
|
// les plus près
|
|
// --- pour les 4 premiers noeuds c'est identique quelque soit le nombre total de noeud
|
|
{// -- le premier noeud
|
|
int ne = 1; indirect(1)=1;indirect(2)=2;indirect(3)=3;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
{// -- le deuxième noeud
|
|
int ne = 2; indirect(1)=2;indirect(2)=4;indirect(3)=1;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
{// -- le troisième noeud
|
|
int ne = 3; indirect(1)=4;indirect(2)=3;indirect(3)=2;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
{// -- le quatrième noeud
|
|
int ne = 4; indirect(1)=3;indirect(2)=1;indirect(3)=4;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
switch (NBNE) // on différencie en fonction du nombre de noeud
|
|
{ case 4: // quatre noeuds, déjà ok
|
|
break;
|
|
case 6:// quadratique en x et linéaire en y
|
|
{{// -- le noeud 5 -> extrapole en 1 2 3 (on aurait pu faire 1 2 4 -> choix arbitraire)
|
|
int ne = 5; indirect(1)=1;indirect(2)=2;indirect(3)=3;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
{// -- le noeud 6
|
|
int ne = 6; indirect(1)=3;indirect(2)=1;indirect(3)=4;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
break;
|
|
}
|
|
case 8: // quadratique en x et y
|
|
{{// -- le noeud 5 et 8 on extrapole en 1 2 3 (on aurait pu faire 1 2 4 -> choix arbitraire)
|
|
int ne = 5; indirect(1)=1;indirect(2)=2;indirect(3)=3;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
ne = 8;
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
{// -- noeud 6 et 7 on extrapole en 4 3 2
|
|
int ne = 6; indirect(1)=4;indirect(2)=3;indirect(3)=2;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
ne = 7;
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
break;
|
|
}
|
|
case 9: // quadratique en x et y
|
|
{{// -- le noeud 5 et 8 on extrapole en 1 2 3 (on aurait pu faire 1 2 4 -> choix arbitraire)
|
|
int ne = 5; indirect(1)=1;indirect(2)=2;indirect(3)=3;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
ne = 8;
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
{// -- noeud 6 et 7 on extrapole en 4 3 2
|
|
int ne = 6; indirect(1)=4;indirect(2)=3;indirect(3)=2;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
ne = 7;
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
{// -- le noeud 9, on fait la moyenne des 4 valeurs aux pt d'integ
|
|
int ne = 9;
|
|
tab(ne)(1) = 0.25;tab(ne)(2) = 0.25;tab(ne)(3) = 0.25; tab(ne)(4) = 0.25;
|
|
indir(ne).Change_taille(4);
|
|
indir(ne)(1)=1;indir(ne)(2)=2;indir(ne)(3)=3;indir(ne)(4)=4;
|
|
}
|
|
break;
|
|
}
|
|
case 16: // cubique en x et y
|
|
{{// -- le noeud 5, 12 et 13 on extrapole en 1 2 3 (on aurait pu faire 1 2 4 -> choix arbitraire)
|
|
int ne = 5; indirect(1)=1;indirect(2)=2;indirect(3)=3;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
ne = 12;
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
ne = 13;
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
{// -- noeud 6, 7 et 14 on extrapole en 2 4 1
|
|
int ne = 6; indirect(1)=2;indirect(2)=4;indirect(3)=1;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
ne = 7;
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
ne = 14;
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
{// -- noeud 8, 9 et 15 on extrapole en 4 3 2
|
|
int ne = 8; indirect(1)=4;indirect(2)=3;indirect(3)=2;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
ne = 9;
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
ne = 15;
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
{// -- noeud 10, 11 et 16 on extrapole en 3 1 4
|
|
int ne = 10; indirect(1)=3;indirect(2)=1;indirect(3)=4;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
ne = 11;
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
ne = 16;
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
{ cout << "\n erreur le nombre de noeud demande :" << NBNE <<"n\'est pas implante "
|
|
<< "\nGeomTriangle::Calcul_extrapol(..";
|
|
Sortie(1);
|
|
};
|
|
};
|
|
break;
|
|
} // fin du cas avec 4 pt d'intégration
|
|
case 9:
|
|
{ // cas avec 9 points d'intégration
|
|
// on extrapole linéairement vers les noeuds en considérant à chaque fois les 3 pt d'intégration
|
|
// les plus près
|
|
// --- pour les 4 premiers noeuds c'est identique quelque soit le nombre total de noeud
|
|
{// -- le premier noeud
|
|
int ne = 1; indirect(1)=1;indirect(2)=2;indirect(3)=4;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
{// -- le deuxième noeud
|
|
int ne = 2; indirect(1)=3;indirect(2)=6;indirect(3)=2;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
{// -- le troisième noeud
|
|
int ne = 3; indirect(1)=9;indirect(2)=8;indirect(3)=6;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
{// -- le quatrième noeud
|
|
int ne = 4; indirect(1)=7;indirect(2)=4;indirect(3)=8;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
switch (NBNE) // on différencie en fonction du nombre de noeud
|
|
{ case 4: // quatre noeuds, déjà ok
|
|
break;
|
|
case 6:// quadratique en x et linéaire en y
|
|
{{// -- le noeud 5 -> extrapole en 2 3 5
|
|
int ne = 5; indirect(1)=2;indirect(2)=3;indirect(3)=5;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
{// -- le noeud 6
|
|
int ne = 6; indirect(1)=8;indirect(2)=7;indirect(3)=5;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
break;
|
|
}
|
|
case 8: // quadratique en x et y
|
|
{{// -- le noeud 5 -> extrapole en 2 3 5
|
|
int ne = 5; indirect(1)=2;indirect(2)=3;indirect(3)=5;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
{// -- le noeud 6
|
|
int ne = 6; indirect(1)=6;indirect(2)=9;indirect(3)=5;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
{// -- le noeud 7
|
|
int ne = 7; indirect(1)=8;indirect(2)=7;indirect(3)=5;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
{// -- le noeud 8
|
|
int ne = 8; indirect(1)=4;indirect(2)=1;indirect(3)=5;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
break;
|
|
}
|
|
case 9: // quadratique en x et y
|
|
{{// -- le noeud 5 -> extrapole en 2 3 5
|
|
int ne = 5; indirect(1)=2;indirect(2)=3;indirect(3)=5;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
{// -- le noeud 6
|
|
int ne = 6; indirect(1)=6;indirect(2)=9;indirect(3)=5;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
{// -- le noeud 7
|
|
int ne = 7; indirect(1)=8;indirect(2)=7;indirect(3)=5;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
{// -- le noeud 8
|
|
int ne = 8; indirect(1)=4;indirect(2)=1;indirect(3)=5;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
{// -- le noeud 9, idem le pt d'integ 5
|
|
int ne = 9;
|
|
tab(ne)(5) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=5;
|
|
}
|
|
break;
|
|
}
|
|
case 16: // cubique en x et y
|
|
{{// -- le noeud 5 et 13 on extrapole en 1 2 5
|
|
int ne = 5; indirect(1)=1;indirect(2)=2;indirect(3)=5;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
ne = 13;
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
{// -- noeud 6 et 14 on extrapole en 2 3 5
|
|
int ne = 6; indirect(1)=2;indirect(2)=3;indirect(3)=5;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
ne = 14;
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
{// -- noeud 7
|
|
int ne = 7; indirect(1)=6;indirect(2)=5;indirect(3)=3;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
{// -- noeud 8 et 15 on extrapole en 6 9 5
|
|
int ne = 8; indirect(1)=6;indirect(2)=9;indirect(3)=5;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
ne = 15;
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
{// -- noeud 9
|
|
int ne = 9; indirect(1)=8;indirect(2)=5;indirect(3)=9;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
{// -- noeud 10 et 16
|
|
int ne = 10; indirect(1)=8;indirect(2)=7;indirect(3)=5;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
ne = 16;
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
{// -- noeud 11
|
|
int ne = 11; indirect(1)=4;indirect(2)=5;indirect(3)=7;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
{// -- noeud 12
|
|
int ne = 12; indirect(1)=1;indirect(2)=2;indirect(3)=4;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
{ cout << "\n erreur le nombre de noeud demande :" << NBNE <<"n\'est pas implante "
|
|
<< "\nGeomTriangle::Calcul_extrapol(..";
|
|
Sortie(1);
|
|
};
|
|
};
|
|
break;
|
|
} // fin du cas avec 9 pt d'intégration
|
|
case 16:
|
|
{ // cas avec 16 points d'intégration
|
|
// on extrapole linéairement vers les noeuds en considérant à chaque fois les 3 pt d'intégration
|
|
// les plus près
|
|
// --- pour les 4 premiers noeuds c'est identique quelque soit le nombre total de noeud
|
|
{// -- le premier noeud
|
|
int ne = 1; indirect(1)=1;indirect(2)=2;indirect(3)=5;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
{// -- le deuxième noeud
|
|
int ne = 2; indirect(1)=4;indirect(2)=8;indirect(3)=3;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
{// -- le troisième noeud
|
|
int ne = 3; indirect(1)=16;indirect(2)=15;indirect(3)=12;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
{// -- le quatrième noeud
|
|
int ne = 4; indirect(1)=13;indirect(2)=9;indirect(3)=14;
|
|
Bases_naturel_duales(indirect,gi_B,gi_H);
|
|
Coordonnee O(ptInteg(indirect(1))); // def de l'origine
|
|
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
|
|
tab(ne)(indirect(1)) = phi_(1);tab(ne)(indirect(2)) = phi_(2);tab(ne)(indirect(3)) = phi_(3);
|
|
indir(ne).Change_taille(3);
|
|
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);indir(ne)(3)=indirect(3);
|
|
}
|
|
switch (NBNE) // on différencie en fonction du nombre de noeud
|
|
{ case 4: // quatre noeuds, déjà ok
|
|
break;
|
|
case 6:// quadratique en x et linéaire en y
|
|
{{// -- le noeud 5 -> moyenne de 2 3
|
|
int ne = 5;
|
|
tab(ne)(2) = 0.5;tab(ne)(3) = 0.5;
|
|
indir(ne).Change_taille(2);
|
|
indir(ne)(1)=2;indir(ne)(2)=3;
|
|
}
|
|
{// -- le noeud 6 -> moyenne de 14 15
|
|
int ne = 6;
|
|
tab(ne)(14) = 0.5;tab(ne)(15) = 0.5;
|
|
indir(ne).Change_taille(2);
|
|
indir(ne)(1)=14;indir(ne)(2)=15;
|
|
}
|
|
break;
|
|
}
|
|
case 8: // quadratique en x et y : vu la proximité des pt d'integ on moyenne
|
|
{{// -- le noeud 5 -> moyenne de 2 3
|
|
int ne = 5;
|
|
tab(ne)(2) = 0.5;tab(ne)(3) = 0.5;
|
|
indir(ne).Change_taille(2);
|
|
indir(ne)(1)=2;indir(ne)(2)=3;
|
|
}
|
|
{// -- le noeud 6 -> moyenne de 8 12
|
|
int ne = 6;
|
|
tab(ne)(8) = 0.5;tab(ne)(12) = 0.5;
|
|
indir(ne).Change_taille(2);
|
|
indir(ne)(1)=8;indir(ne)(2)=12;
|
|
}
|
|
{// -- le noeud 7 -> moyenne de 14 15
|
|
int ne = 7;
|
|
tab(ne)(14) = 0.5;tab(ne)(15) = 0.5;
|
|
indir(ne).Change_taille(2);
|
|
indir(ne)(1)=14;indir(ne)(2)=15;
|
|
}
|
|
{// -- le noeud 8 -> moyenne de 5 9
|
|
int ne = 8;
|
|
tab(ne)(5) = 0.5;tab(ne)(9) = 0.5;
|
|
indir(ne).Change_taille(2);
|
|
indir(ne)(1)=5;indir(ne)(2)=9;
|
|
}
|
|
break;
|
|
}
|
|
case 9: // quadratique en x et y
|
|
{{// -- le noeud 5 -> moyenne de 2 3
|
|
int ne = 5;
|
|
tab(ne)(2) = 0.5;tab(ne)(3) = 0.5;
|
|
indir(ne).Change_taille(2);
|
|
indir(ne)(1)=2;indir(ne)(2)=3;
|
|
}
|
|
{// -- le noeud 6 -> moyenne de 8 12
|
|
int ne = 6;
|
|
tab(ne)(8) = 0.5;tab(ne)(12) = 0.5;
|
|
indir(ne).Change_taille(2);
|
|
indir(ne)(1)=8;indir(ne)(2)=12;
|
|
}
|
|
{// -- le noeud 7 -> moyenne de 14 15
|
|
int ne = 7;
|
|
tab(ne)(14) = 0.5;tab(ne)(15) = 0.5;
|
|
indir(ne).Change_taille(2);
|
|
indir(ne)(1)=14;indir(ne)(2)=15;
|
|
}
|
|
{// -- le noeud 8 -> moyenne de 5 9
|
|
int ne = 8;
|
|
tab(ne)(5) = 0.5;tab(ne)(9) = 0.5;
|
|
indir(ne).Change_taille(2);
|
|
indir(ne)(1)=5;indir(ne)(2)=9;
|
|
}
|
|
{// -- le noeud 9, moyenne de 6 7 10 11
|
|
int ne = 9;
|
|
tab(ne)(6) = 0.25;tab(ne)(7) = 0.25;tab(ne)(10) = 0.25;tab(ne)(11) = 0.25;
|
|
indir(ne).Change_taille(4);
|
|
indir(ne)(1)=6;indir(ne)(2)=7;indir(ne)(3)=10;indir(ne)(4)=11;
|
|
}
|
|
break;
|
|
}
|
|
case 16: // cubique en x et y -->> on exporte systématiquement au noeud le plus près pour simplifier
|
|
{{// -- le noeud 5
|
|
int ne = 5; tab(ne)(2) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=2;
|
|
}
|
|
{// -- le noeud 6
|
|
int ne = 6; tab(ne)(3) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=3;
|
|
}
|
|
{// -- le noeud 7
|
|
int ne = 7; tab(ne)(8) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=8;
|
|
}
|
|
{// -- le noeud 8
|
|
int ne = 8; tab(ne)(12) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=12;
|
|
}
|
|
{// -- le noeud 9
|
|
int ne = 9; tab(ne)(15) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=15;
|
|
}
|
|
{// -- le noeud 10
|
|
int ne = 10; tab(ne)(14) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=14;
|
|
}
|
|
{// -- le noeud 11
|
|
int ne = 11; tab(ne)(9) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=9;
|
|
}
|
|
{// -- le noeud 12
|
|
int ne = 12; tab(ne)(5) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=5;
|
|
}
|
|
{// -- le noeud 13
|
|
int ne = 13; tab(ne)(6) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=6;
|
|
}
|
|
{// -- le noeud 14
|
|
int ne = 14; tab(ne)(7) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=7;
|
|
}
|
|
{// -- le noeud 15
|
|
int ne = 15; tab(ne)(11) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=11;
|
|
}
|
|
{// -- le noeud 16
|
|
int ne = 16; tab(ne)(10) = 1.;indir(ne).Change_taille(1); indir(ne)(1)=10;
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
{ cout << "\n erreur le nombre de noeud demande :" << NBNE <<"n\'est pas implante "
|
|
<< "\nGeomTriangle::Calcul_extrapol(..";
|
|
Sortie(1);
|
|
};
|
|
};
|
|
break;
|
|
} // fin du cas avec 16 pt d'intégration
|
|
|
|
default:
|
|
{ cout << "\n erreur le nombre de point d'integration demande :" << nbi <<"n\'est pas implante "
|
|
<< "\nGeomTriangle::Calcul_extrapol(..";
|
|
Sortie(1);
|
|
};
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|