Herezh_dev/Elements/Geometrie/ElemGeom/Ligne/GeomSeg.cc
2023-05-03 17:23:49 +02:00

1647 lines
82 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-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 <https://www.gnu.org/licenses/>.
//
// For more information, please consult: <https://herezh.irdl.fr/>.
//#include "Debug.h"
#include "GeomSeg.h"
#include <math.h>
#include "MathUtil.h"
//----- les variables statiques ------------
Tableau <Tableau <double > > GeomSeg::ksi_gl;
Tableau <Tableau <double > > GeomSeg::wi_gl;
GeomSeg::Construire_Gauss_Lobatto GeomSeg::construire_gauss_lobatto;
//------- fin des variables statiques -----------
// dimension 1, nbi pt d'integ, nbne noeuds, 0 face et 1 ligne
GeomSeg::GeomSeg(int nbi,int nbne,Enum_type_pt_integ type_pti) :
ElemGeomC0(1,nbi,nbne,0,1,SEGMENT,RIEN_INTERPOL,type_pti)
,tabD2Phi(nbi),phi_M(),dphi_M()
{ // def de la taille du tableau contenant la dérivée seconde
for (int i= 1; i<=nbi; i++)
tabD2Phi(i).Initialise (dimension,NBNE,0.);
// def du pointeur de ligne
seg(1) = this;
// def du tableau NONS
NONS(1).Change_taille(NBNE);
for (int i=1;i<=nbne;i++)
NONS(1)(i) = i;
// définition de la numérotation locale de l'élément de direction inverse
switch (NBNE)
{ case 2: { INVCONNEC(1) = 2;INVCONNEC(2) = 1;break;}
case 3: { INVCONNEC(1) = 3;INVCONNEC(2) = 2;INVCONNEC(3) = 1;break;}
case 4: { INVCONNEC(1) = 4;INVCONNEC(2) = 3;INVCONNEC(3) = 2;INVCONNEC(4) = 1;break;}
default :
{ cout << "\n erreur le nombre de noeud demande :" << NBNE <<" n\'est"
<< " pas implante "
<< "\nGeomSeg::GeomSeg(int nbi,int nbne)";
Sortie(1);
}
};
// le tableau des tranches: comme tous les noeuds sont à suivre -> une seule tranche
IND.Change_taille(1); IND(1)=NBNE;
// ----------------------------------------------
// coordonnees et poids des points d'integrations
// ( -1 <= KSI <= +1 )
// ----------------------------------------------
// def de W et de ptInteg
// cas avec un pt d'integ
if (type_pti == PTI_GAUSS) // cas des points de gauss
{switch (nbi)
{ case 1:
{ KSI(1)= 0.;
WI(1)= 2.;
break;
}
case 2: // avec 2
{ double S= 1./sqrt(3.) ;
KSI(1)= -S;
KSI(2)= S;
WI(1)= 1.;
WI(2)= 1.;
break;
}
case 3: // avec 3
{ double S= sqrt(3./5.) ;
KSI(2)= 0.;
KSI(3)= S;
KSI(1)= -S;
WI(2)= 8./9.;
WI(1)= 5./9.;
WI(3)= 5./9.;
break;
}
case 4: // avec 4
{ double S= 2.*sqrt(6./5.);
double T= sqrt( (3.-S)/7. );
KSI(3)= T;
KSI(2)= -T;
T= sqrt( (3.+S)/7. );
KSI(4)= T;
KSI(1)= -T;
S= 1./(6.*sqrt(6./5.));
WI(3)= 0.5 + S;
WI(2)= 0.5 + S;
WI(4)= 0.5 - S;
WI(1)= 0.5 - S;
break;
}
case 5: // avec 5
{ double untiers=1./3.;
double racine5sur14 = sqrt(5./14.);
double T1= untiers*sqrt(5.- 4.* racine5sur14);
double T2= untiers*sqrt(5.+ 4.* racine5sur14);
KSI(1)= -T2; WI(1)=(161./450.-13./(180.*racine5sur14));
KSI(2)= -T1; WI(2)=(161./450.+13./(180.*racine5sur14));
KSI(3)= 0.; WI(3)=128./225.;
KSI(4)= T1; WI(4)=(161./450.+13./(180.*racine5sur14));
KSI(5)= T2; WI(5)=(161./450.-13./(180.*racine5sur14));
break;
}
case 6: // avec 6
{ KSI(1)= -0.932469514203152; WI(1)=0.171324492379170;
KSI(2)= -0.661209386466265; WI(2)=0.360761573048139;
KSI(3)= -0.238619186083197; WI(3)=0.467913934572691;
KSI(4)= 0.238619186083197; WI(4)=0.467913934572691;
KSI(5)= 0.661209386466265; WI(5)=0.360761573048139;
KSI(6)= 0.932469514203152; WI(6)=0.171324492379170;
break;
}
case 7: // avec 7
{ KSI(1)= -0.949107912342759; WI(1)=0.129484966168870;
KSI(2)= -0.741531185599394; WI(2)=0.279705391489277;
KSI(3)= -0.405845151377397; WI(3)=0.381830050505119;
KSI(4)= 0; WI(4)=0.417959183673469;
KSI(5)= 0.405845151377397; WI(5)=0.381830050505119;
KSI(6)= 0.741531185599394; WI(6)=0.279705391489277;
KSI(7)= 0.949107912342759; WI(7)=0.129484966168870;
break;
}
case 8: // avec 8
{
KSI(1)= -0.9602898564975362316835609; WI(1)=0.1012285362903762591525314;
KSI(2)= -0.7966664774136267395915539; WI(2)=0.2223810344533744705443560;
KSI(3)= -0.5255324099163289858177390; WI(3)=0.3137066458778872873379622;
KSI(4)= -0.1834346424956498049394761; WI(4)=0.3626837833783619829651504;
KSI(5)= 0.1834346424956498049394761; WI(5)=0.3626837833783619829651504;
KSI(6)= 0.5255324099163289858177390; WI(6)=0.3137066458778872873379622;
KSI(7)= 0.7966664774136267395915539; WI(7)=0.2223810344533744705443560;
KSI(8)= 0.9602898564975362316835609; WI(8)=0.1012285362903762591525314;
break;
}
case 10: // avec 10
{
KSI(1)= -0.9739065285171717200779640;WI(1)=0.0666713443086881375935688;
KSI(2)= -0.8650633666889845107320967;WI(2)=0.1494513491505805931457763;
KSI(3)= -0.6794095682990244062343274;WI(3)=0.2190863625159820439955349;
KSI(4)= -0.4333953941292471907992659;WI(4)=0.2692667193099963550912269;
KSI(5)= -0.1488743389816312108848260;WI(5)=0.2955242247147528701738930;
KSI(6)= 0.1488743389816312108848260;WI(6)=0.2955242247147528701738930;
KSI(7)= 0.4333953941292471907992659;WI(7)=0.2692667193099963550912269;
KSI(8)= 0.6794095682990244062343274;WI(8)=0.2190863625159820439955349;
KSI(9)= 0.8650633666889845107320967;WI(9)=0.1494513491505805931457763;
KSI(10)= 0.9739065285171717200779640;WI(10)=0.0666713443086881375935688;
break;
}
case 12: // avec 12
{
KSI(7)= 0.1252334085114689154724414;WI(7)=0.2491470458134027850005624;
KSI(8)= 0.3678314989981801937526915;WI(8)=0.2334925365383548087608499;
KSI(9)= 0.5873179542866174472967024;WI(9)=0.2031674267230659217490645;
KSI(10)= 0.7699026741943046870368938;WI(10)=0.1600783285433462263346525;
KSI(11)= 0.9041172563704748566784659;WI(11)=0.1069393259953184309602547;
KSI(12)= 0.9815606342467192506905491;WI(12)=0.0471753363865118271946160;
KSI(6)= -KSI(7); WI(6)=WI(7);
KSI(5)= -KSI(8); WI(5)=WI(8);
KSI(4)= -KSI(9); WI(4)=WI(9);
KSI(3)= -KSI(10); WI(3)=WI(10);
KSI(2)= -KSI(11); WI(2)=WI(11);
KSI(1)= -KSI(12); WI(1)=WI(12);
break;
}
case 14: // avec 14
{
KSI(8)= 0.1080549487073436620662447; WI(8)=0.2152638534631577901958764;
KSI(9)= 0.3191123689278897604356718; WI(9)=0.2051984637212956039659241;
KSI(10)= 0.5152486363581540919652907; WI(10)=0.1855383974779378137417166;
KSI(11)= 0.6872929048116854701480198; WI(11)=0.1572031671581935345696019;
KSI(12)= 0.8272013150697649931897947; WI(12)=0.1215185706879031846894148;
KSI(13)= 0.9284348836635735173363911; WI(13)=0.0801580871597602098056333;
KSI(14)= 0.9862838086968123388415973; WI(14)=0.0351194603317518630318329;
KSI(7)= -KSI(8); WI(7)=WI(8);
KSI(6)= -KSI(9); WI(6)=WI(9);
KSI(5)= -KSI(10); WI(5)=WI(10);
KSI(4)= -KSI(11); WI(4)=WI(11);
KSI(3)= -KSI(12); WI(3)=WI(12);
KSI(2)= -KSI(13); WI(2)=WI(13);
KSI(1)= -KSI(14); WI(1)=WI(14);
break;
}
case 16: // avec 16
{
KSI(9)= 0.0950125098376374401853193; WI(9) =0.1894506104550684962853967;
KSI(10)= 0.2816035507792589132304605; WI(10)=0.1826034150449235888667637;
KSI(11)= 0.4580167776572273863424194; WI(11)=0.1691565193950025381893121;
KSI(12)= 0.6178762444026437484466718; WI(12)=0.1495959888165767320815017;
KSI(13)= 0.7554044083550030338951012; WI(13)=0.1246289712555338720524763;
KSI(14)= 0.8656312023878317438804679; WI(14)=0.0951585116824927848099251;
KSI(15)= 0.9445750230732325760779884; WI(15)=0.0622535239386478928628438;
KSI(16)= 0.9894009349916499325961542; WI(16)=0.0271524594117540948517806;
KSI(8)= -KSI(9); WI(8)=WI(9);
KSI(7)= -KSI(10); WI(7)=WI(10);
KSI(6)= -KSI(11); WI(6)=WI(11);
KSI(5)= -KSI(12); WI(5)=WI(12);
KSI(4)= -KSI(13); WI(4)=WI(13);
KSI(3)= -KSI(14); WI(3)=WI(14);
KSI(2)= -KSI(15); WI(2)=WI(15);
KSI(1)= -KSI(16); WI(1)=WI(16);
break;
}
default :
{ cout << "\n erreur le nombre de point d\'integration demande :" << Nbi() <<" n\'est"
<< " pas implante "
<< "\nGeomSeg::GeomSeg(int nbi,int nbne)";
Sortie(1);
}
};
}
else if (type_pti == PTI_GAUSS_LOBATTO) // il s'agit des points de Gauss-lobatto
{ if ((nbi > 0) && (nbi < 17))
{ Tableau <double >& ksigl = ksi_gl(nbi-1); // pour simplifier
Tableau <double >& wigl = wi_gl(nbi-1); // ""
for (int i=1;i<=nbi;i++)
{KSI(i) = ksigl(i);WI(i) = wigl(i);};
}
else
{ cout << "\n erreur le nombre de point d\'integration de Gauss-Lobatto demande :" << Nbi() <<" n\'est"
<< " pas implante "
<< "\nGeomSeg::GeomSeg(int nbi,int nbne)";
Sortie(1);
};
};
// fonction et derivees des fonctions d'interpolation
// ainsi que coordonnées des noeuds
switch (NBNE)
{case 2: // cas lineaire
{id_interpol=LINEAIRE;
for (int ni=1;ni<= Nbi();ni++)
{tabPhi(ni)(1) = (1. - KSI(ni))/2.;
tabPhi(ni)(2) = (1. + KSI(ni))/2.;
tabDPhi(ni)(1,1) = -1./2.;
tabDPhi(ni)(1,2) = 1./2.;
//tabD2Phi(ni)(1,1) = 0.; le calcul est inutile mais ces lignes sont
//tabD2Phi(ni)(1,2) = 0.; pour mémoire
ptelem(1) = Coordonnee(-1.);
ptelem(2) = Coordonnee(1.);
}
break;
}
case 3: // cas quadratique
{id_interpol=QUADRACOMPL;
for (int ni=1;ni<= Nbi();ni++)
{tabPhi(ni)(1) = -KSI(ni)*(1. - KSI(ni))/2.;
tabPhi(ni)(2) = (1. - KSI(ni))*(1. + KSI(ni));
tabPhi(ni)(3) = KSI(ni)*(1. + KSI(ni))/2.;
tabDPhi(ni)(1,1) = (-1.+2.*KSI(ni))/2.;
tabDPhi(ni)(1,2) = -2*KSI(ni);
tabDPhi(ni)(1,3) = (1.+2.*KSI(ni))/2.;
tabD2Phi(ni)(1,1) = 1.;
tabD2Phi(ni)(1,2) = -2.;
tabD2Phi(ni)(1,3) = 1.;
ptelem(1) = Coordonnee(-1.);
ptelem(2) = Coordonnee(0.);
ptelem(3) = Coordonnee(1.);
}
break;
}
case 4 : // cas cubique
{id_interpol=CUBIQUE;
for (int ni=1;ni<= Nbi();ni++)
{double unsur16 = 1./16.;
double KSI1=KSI(ni);double KSI2=KSI1*KSI1;
tabPhi(ni)(1) = -(1. - KSI1)*(1-9.*KSI2)*unsur16;
tabPhi(ni)(2) = 9.*(1. - KSI2)*(1. - 3.*KSI1)*unsur16;
tabPhi(ni)(3) = 9.*(1. - KSI2)*(1. + 3.*KSI1)*unsur16;
tabPhi(ni)(4) = -(1. + KSI1)*(1-9.*KSI2)*unsur16;
tabDPhi(ni)(1,1) = (1. + 18. * KSI1 - 27.*KSI2)*unsur16;
tabDPhi(ni)(1,2) = (-27. -18.* KSI1 + 81.*KSI2)*unsur16;
tabDPhi(ni)(1,3) = (27. -18.* KSI1 - 81.*KSI2)*unsur16;
tabDPhi(ni)(1,4) = (-1. +18.* KSI1 +27.*KSI2)*unsur16;
tabD2Phi(ni)(1,1) = (18. - 54.*KSI1)*unsur16;
tabD2Phi(ni)(1,2) = (-18. + 162.*KSI1)*unsur16;
tabD2Phi(ni)(1,3) = (-18. - 162.*KSI1)*unsur16;
tabD2Phi(ni)(1,4) = (18. + 54.*KSI1)*unsur16;
ptelem(1) = Coordonnee(-1.);
ptelem(2) = Coordonnee(-1./3.);
ptelem(3) = Coordonnee(1./3.);
ptelem(4) = Coordonnee(1.);
}
break;
}
default :
{ cout << "\n erreur le nombre de noeud demande :" << NBNE <<"n\'est pas implante "
<< "\nGeomSeg::GeomSeg(int nbi,int nbne)";
Sortie(1);
}
}
// ---- constitution du tableau Extrapol -----
Calcul_extrapol(nbi);
};
// constructeur de copie
GeomSeg::GeomSeg(const GeomSeg& a) :
ElemGeomC0(a),tabD2Phi(a.tabD2Phi)
,phi_M(a.phi_M),dphi_M(a.dphi_M)
{ // la copie des parties pointées est à la charge de la classe spécifique
// def du segment
seg(1) = this;
};
// 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 * GeomSeg::newElemGeomC0(ElemGeomC0 * pt)
{ pt = new GeomSeg(*this);
return pt;
};
//--------- cas de coordonnees locales quelconques ----------------
// retourne les fonctions d'interpolation au point M (en coordonnees locales)
const Vecteur& GeomSeg::Phi_point(const Coordonnee& M)
{
#ifdef MISE_AU_POINT
// verification de la dimension des coordonnees locales
if (M.Dimension() != 1)
{ cout << "\n erreur la dimension des coordonnees locales :" << M.Dimension()
<<"n\'est pas egale a 1 "
<< "\nGeomSeg::Phi(Coordonnee& M)";
Sortie(1);
}
#endif
// dimentionnement éventuelle du tableau des fonctions d'interpolation
phi_M.Change_taille(NBNE); // si la taille est identique -> aucune action
// fonction des fonctions d'interpolation
double M1 = M(1); // pour simplifier
if (NBNE == 2 ) // cas lineaire
{ phi_M(1) = (1. - M1)/2.;
phi_M(2) = (1. + M1)/2.;
}
else if (NBNE == 3 ) // cas quadratique
{ double M2 = M1*M1;
phi_M(1) = (M2 - M1)/2.;
phi_M(2) = (1. - M2);
phi_M(3) = (M2 + M1)/2.;
}
else if (NBNE == 4 ) // cas cubique
{ double unsur16 = 1./16.;
double M1 = M(1); double M2 = M1*M1;
phi_M(1) = -(1. - M1)*(1-9.*M2)*unsur16;
phi_M(2) = 9.*(1. - M2)*(1. - 3.*M1)*unsur16;
phi_M(3) = 9.*(1. - M2)*(1. + 3.*M1)*unsur16;
phi_M(4) = -(1. + M1)*(1-9.*M2)*unsur16;
}
else
{ cout << "\n erreur le nombre de noeud demande :" << NBNE <<"n\'est pas implante "
<< "\nGeomSeg::Phi(Coordonnee& M)";
Sortie(1);
}
return phi_M;
};
// retourne les derivees des fonctions d'interpolation au point M (en coordonnees locales)
const Mat_pleine& GeomSeg::Dphi_point(const Coordonnee& M)
{
#ifdef MISE_AU_POINT
// verification de la dimension des coordonnees locales
if (M.Dimension() != 1)
{ cout << "\n erreur la dimension des coordonnees locales :" << M.Dimension()
<<"n\'est pas egale a 1 "
<< "\nGeomSeg::Dphi(Coordonnee& M)";
Sortie(1);
}
#endif
// Mat_pleine dphi(1,NBNE);
// le tableau des derivees: redimentionnement si nécessaire
if ((dphi_M.Nb_ligne() != 1)&&(dphi_M.Nb_colonne() != NBNE))
dphi_M.Initialise (1,NBNE,0.);
// fonction et derivees des fonctions d'interpolation
double M1 = M(1); // pour simplifier
if (NBNE == 2 ) // cas lineaire
{ dphi_M(1,1) = -1./2.;
dphi_M(1,2) = 1./2.;
}
else if (NBNE == 3 ) // cas quadratique
{ dphi_M(1,1) = M1-0.5;
dphi_M(1,2) = -2*M1;
dphi_M(1,3) = M1+0.5;
}
else if (NBNE == 4 ) // cas cubique
{ double unsur16 = 1./16.;
double M1 = M(1); double M2 = M1*M1;
dphi_M(1,1) = (1. + 18. * M1 - 27.*M2)*unsur16;
dphi_M(1,2) = (-27. -18.* M1 + 81.*M2)*unsur16;
dphi_M(1,3) = (27. -18.* M1 - 81.*M2)*unsur16;
dphi_M(1,4) = (-1. +18.* M1 +27.*M2)*unsur16;
}
else
{ cout << "\n erreur le nombre de noeud demande :" << NBNE <<"n\'est pas implante "
<< "\nGeomSeg::Dphi(Coordonnee& M)";
Sortie(1);
}
return dphi_M;
};
// en fonction de coordonnees locales, retourne true si le point est a l'interieur
// de l'element, false sinon
bool GeomSeg::Interieur(const Coordonnee& M)
{ if ((Dabs(M(1)) <= 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 GeomSeg::Maxi_Coor_dans_directionGM(const Coordonnee& M)
{ // on recherche du maxi de la composante en valeur absolu
double xmax = Dabs(M(1));
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 GeomSeg::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(2); // tableau de travail
Tableau <Coordonnee> gi_B,gi_H; // bases naturelle et duale
Vecteur phi_(2); // le conteneur pour les fonctions d'interpolation
Coordonnee theta(1); // le conteneur pour les coordonnées locales
if (id_type_pt_integ == PTI_GAUSS)
{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 2:
{ // cas avec 2 points d'intégration
// on extrapole linéairement sur les pt d'integ quelques soit le nombre de noeuds
{ indirect(1)=1;indirect(2)=2;
Bases_naturel_duales(indirect,gi_B,gi_H);
Coordonnee O((int)1); // def de l'origine à 0
for (int ne = 1; ne<=NBNE;ne++)
{ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
};
};
break;
} // fin du cas avec 2 pt d'intégration
case 3:
{ // cas avec 3 points d'intégration
switch (NBNE)
{ case 2: // deux noeuds,
{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
// -- le premier noeud
int ne = 1; indirect(1)=1;indirect(2)=2;
Bases_naturel_duales(indirect,gi_B,gi_H);
Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le second noeud
ne = 2; indirect(1)=2;indirect(2)=3;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(2)+ptInteg(3)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(2) = phi_(1);tab(ne)(3) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
break;
}
case 3: // trois noeuds,
{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
// -- le premier noeud
int ne = 1; indirect(1)=1;indirect(2)=2;
Bases_naturel_duales(indirect,gi_B,gi_H);
Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le second noeud --> directement le second pt d'integ
ne=2; tab(ne)(2) = 1.;
indir(ne).Change_taille(1);
indir(ne)(1)=2;
// -- le troisième noeud
ne = 3; indirect(1)=2;indirect(2)=3;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(2)+ptInteg(3)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(2) = phi_(1);tab(ne)(3) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
break;
}
case 4:// dans le cas 4 noeuds
{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
// -- le deux premiers noeuds, on utilise les deux premiers points d'intégration
indirect(1)=1;indirect(2)=2;
Bases_naturel_duales(indirect,gi_B,gi_H);
Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine
for (int ne = 1; ne <= 2; ne++)
{ ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
};
// -- le deux derniers noeuds, on utilise les deux derniers points d'intégration
indirect(1)=2;indirect(2)=3;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(2)+ptInteg(3)); // def de l'origine
for (int ne = 2; ne <= 3; ne++)
{ ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(2) = phi_(1);tab(ne)(3) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
};
break;
}
default:
{ cout << "\n erreur le nombre de noeud demande :" << NBNE <<"n\'est pas implante "
<< "\nGeomSeg::Calcul_extrapol(..";
Sortie(1);
};
};
break;
} // fin du cas avec 3 pt d'intégration
case 4:
{ // cas avec 4 points d'intégration
// on extrapole linéairement vers les noeuds en considérant à chaque fois les 2 pt d'intégration les + proches
switch (NBNE)
{ case 2: // deux noeuds,
{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
// -- le premier noeud
int ne = 1; indirect(1)=1;indirect(2)=2;
Bases_naturel_duales(indirect,gi_B,gi_H);
Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le second noeud
ne = 2; indirect(1)=3;indirect(2)=4;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(3)+ptInteg(4)) ; // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(3) = phi_(1);tab(ne)(4) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
break;
}
case 3: // trois noeuds,
{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
// -- le premier noeud
int ne = 1; indirect(1)=1;indirect(2)=2;
Bases_naturel_duales(indirect,gi_B,gi_H);
Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le second noeud = entre les pt d'integ 2 et 3
ne = 2; indirect(1)=2;indirect(2)=3;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(2)+ptInteg(3)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(2) = phi_(1);tab(ne)(3) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le troisième noeud
ne = 3; indirect(1)=3;indirect(2)=4;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(3)+ptInteg(4)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(3) = phi_(1);tab(ne)(4) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
break;
}
case 4:// dans le cas 4 noeuds
{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
// -- le deux premiers noeuds, on utilise les deux premiers points d'intégration
indirect(1)=1;indirect(2)=2;
Bases_naturel_duales(indirect,gi_B,gi_H);
Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine
for (int ne = 1; ne <= 2; ne++)
{ ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
};
// -- le deux derniers noeuds, on utilise les deux derniers points d'intégration
indirect(1)=3;indirect(2)=4;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(3)+ptInteg(4)); // def de l'origine
for (int ne = 3; ne <= 4; ne++)
{ ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(3) = phi_(1);tab(ne)(4) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
};
break;
}
default:
{ cout << "\n erreur le nombre de noeud demande :" << NBNE <<"n\'est pas implante "
<< "\nGeomSeg::Calcul_extrapol(..";
Sortie(1);
};
};
break;
} // fin du cas avec 4 pt d'intégration
case 5:
{ // cas avec 5 points d'intégration
// on extrapole linéairement vers les noeuds en considérant à chaque fois les 2 pt d'intégration les + proches
switch (NBNE)
{ case 2: // deux noeuds,
{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
// -- le premier noeud
int ne = 1; indirect(1)=1;indirect(2)=2;
Bases_naturel_duales(indirect,gi_B,gi_H);
Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le second noeud
ne = 2; indirect(1)=4;indirect(2)=5;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(4)+ptInteg(5)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(4) = phi_(1);tab(ne)(5) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
break;
}
case 3: // trois noeuds,
{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
// -- le premier noeud
int ne = 1; indirect(1)=1;indirect(2)=2;
Bases_naturel_duales(indirect,gi_B,gi_H);
Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le second noeud = le 3 pt d'integ
ne = 2;
tab(ne)(3) = 1.;
indir(ne).Change_taille(1);
indir(ne)(1)=3;
// -- le troisième noeud
ne = 3; indirect(1)=4;indirect(2)=5;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(4)+ptInteg(5)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(4) = phi_(1);tab(ne)(5) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
break;
}
case 4:// dans le cas 4 noeuds
{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
// -- le deux premiers noeuds, on utilise les deux premiers points d'intégration
indirect(1)=1;indirect(2)=2;
Bases_naturel_duales(indirect,gi_B,gi_H);
Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine
for (int ne = 1; ne <= 2; ne++)
{ ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
};
// -- le deux derniers noeuds, on utilise les deux derniers points d'intégration
indirect(1)=3;indirect(2)=4;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(4)+ptInteg(5)); // def de l'origine
for (int ne = 3; ne <= 4; ne++)
{ ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(4) = phi_(1);tab(ne)(5) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
};
break;
};
default:
{ cout << "\n erreur le nombre de noeud demande :" << NBNE <<"n\'est pas implante "
<< "\nGeomSeg::Calcul_extrapol(..";
Sortie(1);
};
};
break;
} // fin du cas avec 5 pt d'intégration
case 6:
{ // cas avec 6 points d'intégration
// on extrapole linéairement vers les noeuds en considérant à chaque fois les 2 pt d'intégration les + proches
switch (NBNE)
{ case 2: // deux noeuds,
{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
// -- le premier noeud
int ne = 1; indirect(1)=1;indirect(2)=2;
Bases_naturel_duales(indirect,gi_B,gi_H);
Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le second noeud
ne = 2; indirect(1)=5;indirect(2)=6;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(5)+ptInteg(6)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(5) = phi_(1);tab(ne)(6) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
break;
}
case 3: // trois noeuds,
{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
// -- le premier noeud
int ne = 1; indirect(1)=1;indirect(2)=2;
Bases_naturel_duales(indirect,gi_B,gi_H);
Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le second noeud = le milieu du 3 ième et 4 ième noeud
ne = 2; indirect(1)=3;indirect(2)=4;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(3)+ptInteg(4)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(3) = phi_(1);tab(ne)(4) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le troisième noeud
ne = 3; indirect(1)=5;indirect(2)=6;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(5)+ptInteg(6)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(5) = phi_(1);tab(ne)(6) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
break;
}
case 4:// dans le cas 4 noeuds
{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
// -- le premier noeud
int ne = 1; indirect(1)=1;indirect(2)=2;
Bases_naturel_duales(indirect,gi_B,gi_H);
Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le second noeud = entre le 2 ième et le 3 ième noeud
ne = 2; indirect(1)=2;indirect(2)=3;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(2)+ptInteg(3)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(2) = phi_(1);tab(ne)(3) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le troisième noeud : entre les pt d'integ 4 et 5
ne = 3; indirect(1)=4;indirect(2)=5;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(4)+ptInteg(5)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(4) = phi_(1);tab(ne)(5) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le quatrième noeud : extérieur de 5 et 6
ne = 4; indirect(1)=5;indirect(2)=6;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(5)+ptInteg(6)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(5) = phi_(1);tab(ne)(6) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
}
break;
default:
{ cout << "\n erreur le nombre de noeud demande :" << NBNE <<"n\'est pas implante "
<< "\nGeomSeg::Calcul_extrapol(..";
Sortie(1);
};
};
break;
}// fin du cas avec 6 pt d'intégration
case 7:
{ // cas avec 7 points d'intégration
// on extrapole linéairement vers les noeuds en considérant à chaque fois les 2 pt d'intégration les + proches
switch (NBNE)
{ case 2: // deux noeuds,
{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
// -- le premier noeud
int ne = 1; indirect(1)=1;indirect(2)=2;
Bases_naturel_duales(indirect,gi_B,gi_H);
Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le second noeud
ne = 2; indirect(1)=6;indirect(2)=7;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(6)+ptInteg(7)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(6) = phi_(1);tab(ne)(7) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
break;
}
case 3: // trois noeuds,
{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
// -- le premier noeud
int ne = 1; indirect(1)=1;indirect(2)=2;
Bases_naturel_duales(indirect,gi_B,gi_H);
Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le second noeud = le pt d'integ 4
ne = 2; tab(ne)(4) = 1;
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le troisième noeud
ne = 3; indirect(1)=6;indirect(2)=7;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(6)+ptInteg(7)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(6) = phi_(1);tab(ne)(7) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
break;
}
case 4:// dans le cas 4 noeuds
{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
// -- le premier noeud
int ne = 1; indirect(1)=1;indirect(2)=2;
Bases_naturel_duales(indirect,gi_B,gi_H);
Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le second noeud = entre le 3 ième et le 4 ième noeud
ne = 2; indirect(1)=3;indirect(2)=4;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(3)+ptInteg(4)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(3) = phi_(1);tab(ne)(4) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le troisième noeud : entre les pt d'integ 4 et 5
ne = 3; indirect(1)=4;indirect(2)=5;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(4)+ptInteg(5)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(4) = phi_(1);tab(ne)(5) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le quatrième noeud : extérieur de 6 et 7
ne = 4; indirect(1)=6;indirect(2)=7;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(6)+ptInteg(7)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(6) = phi_(1);tab(ne)(7) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
}
break;
default:
{ cout << "\n erreur le nombre de noeud demande :" << NBNE <<"n\'est pas implante "
<< "\nGeomSeg::Calcul_extrapol(..";
Sortie(1);
};
};
break;
}// fin du cas avec 7 pt d'intégration
case 8:
{ // cas avec 8 points d'intégration
// on extrapole linéairement vers les noeuds en considérant à chaque fois les 2 pt d'intégration les + proches
int n1,n2;
switch (NBNE)
{ case 2: // deux noeuds,
{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
// -- le premier noeud
int ne = 1; indirect(1)=1;indirect(2)=2;
Bases_naturel_duales(indirect,gi_B,gi_H);
Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le second noeud
ne = 2; n1=7;n2=8;indirect(1)=n1;indirect(2)=n2;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
break;
}
case 3: // trois noeuds,
{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
// -- le premier noeud
int ne = 1; indirect(1)=1;indirect(2)=2;
Bases_naturel_duales(indirect,gi_B,gi_H);
Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le second noeud = entre le 4 ième et le 5 ième pti
ne = 2; n1=4;n2=5;indirect(1)=n1;indirect(2)=n2;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le troisième noeud
ne = 3;n1=7;n2=8;indirect(1)=n1;indirect(2)=n2;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
break;
}
case 4:// dans le cas 4 noeuds
{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
// -- le premier noeud
int ne = 1; indirect(1)=1;indirect(2)=2;
Bases_naturel_duales(indirect,gi_B,gi_H);
Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le second noeud = entre le 3 ième et le 4 ième noeud
ne = 2; n1=3;n2=4;indirect(1)=n1;indirect(2)=n2;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le troisième noeud : entre les pt d'integ 5 et 6
ne = 3;n1=5;n2=6;indirect(1)=n1;indirect(2)=n2;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le quatrième noeud : extérieur de 7 et 8
ne = 4;n1=7;n2=8;indirect(1)=n1;indirect(2)=n2;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
}
break;
default:
{ cout << "\n erreur le nombre de noeud demande :" << NBNE <<"n\'est pas implante "
<< "\nGeomSeg::Calcul_extrapol(..";
Sortie(1);
};
};
break;
}// fin du cas avec 8 pt d'intégration
case 10:
{ // cas avec 10 points d'intégration
// on extrapole linéairement vers les noeuds en considérant à chaque fois les 2 pt d'intégration les + proches
int n1,n2;
switch (NBNE)
{ case 2: // deux noeuds,
{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
// -- le premier noeud
int ne = 1; indirect(1)=1;indirect(2)=2;
Bases_naturel_duales(indirect,gi_B,gi_H);
Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le second noeud
ne = 2; n1=9;n2=10;indirect(1)=n1;indirect(2)=n2;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
break;
}
case 3: // trois noeuds,
{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
// -- le premier noeud
int ne = 1; indirect(1)=1;indirect(2)=2;
Bases_naturel_duales(indirect,gi_B,gi_H);
Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le second noeud = entre le 5 ième et le 6 ième pti
ne = 2; n1=5;n2=6;indirect(1)=n1;indirect(2)=n2;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le troisième noeud
ne = 3; n1=9;n2=10;indirect(1)=n1;indirect(2)=n2;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
break;
}
case 4:// dans le cas 4 noeuds
{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
// -- le premier noeud
int ne = 1; indirect(1)=1;indirect(2)=2;
Bases_naturel_duales(indirect,gi_B,gi_H);
Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le second noeud = entre le 4 ième et le 5 ième noeud
ne = 2; n1=4;n2=5;indirect(1)=n1;indirect(2)=n2;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le troisième noeud : entre les pt d'integ 6 et 7
ne = 3; n1=6;n2=7;indirect(1)=n1;indirect(2)=n2;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le quatrième noeud : extérieur de 9 et 10
ne = 4; n1=9;n2=10;indirect(1)=n1;indirect(2)=n2;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
}
break;
default:
{ cout << "\n erreur le nombre de noeud demande :" << NBNE <<"n\'est pas implante "
<< "\nGeomSeg::Calcul_extrapol(..";
Sortie(1);
};
};
break;
}// fin du cas avec 10 pt d'intégration
case 12:
{ // cas avec 12 points d'intégration
// on extrapole linéairement vers les noeuds en considérant à chaque fois les 2 pt d'intégration les + proches
switch (NBNE)
{ case 2: // deux noeuds,
{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
// -- le premier noeud
int ne = 1; indirect(1)=1;indirect(2)=2;
Bases_naturel_duales(indirect,gi_B,gi_H);
Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le second noeud
ne = 2; indirect(1)=11;indirect(2)=12;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(11)+ptInteg(12)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(11) = phi_(1);tab(ne)(12) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
break;
}
case 3: // trois noeuds,
{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
// -- le premier noeud
int ne = 1; indirect(1)=1;indirect(2)=2;
Bases_naturel_duales(indirect,gi_B,gi_H);
Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le second noeud = entre le 6 ième et le 7 ième pti
ne = 2; indirect(1)=6;indirect(2)=7;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(6)+ptInteg(7)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(6) = phi_(1);tab(ne)(7) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le troisième noeud
ne = 3; indirect(1)=11;indirect(2)=12;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(11)+ptInteg(12)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(11) = phi_(1);tab(ne)(12) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
break;
}
case 4:// dans le cas 4 noeuds
{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
int n1,n2;
// -- le premier noeud
int ne = 1; indirect(1)=1;indirect(2)=2;
Bases_naturel_duales(indirect,gi_B,gi_H);
Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le second noeud = entre le 5 ième et le 6 ième noeud
ne = 2; n1=5;n2=6;indirect(1)=n1;indirect(2)=n2;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le troisième noeud : entre les pt d'integ 7 et 8
ne = 3; n1=7;n2=8;indirect(1)=n1;indirect(2)=n2;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le quatrième noeud : extérieur de 7 et 8
ne = 4; n1=11;n2=12;indirect(1)=n1;indirect(2)=n2;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
}
break;
default:
{ cout << "\n erreur le nombre de noeud demande :" << NBNE <<"n\'est pas implante "
<< "\nGeomSeg::Calcul_extrapol(..";
Sortie(1);
};
};
break;
}// fin du cas avec 12 pt d'intégration
case 14:
{ // cas avec 8 points d'intégration
// on extrapole linéairement vers les noeuds en considérant à chaque fois les 2 pt d'intégration les + proches
int n1,n2;
switch (NBNE)
{ case 2: // deux noeuds,
{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
// -- le premier noeud
int ne = 1; indirect(1)=1;indirect(2)=2;
Bases_naturel_duales(indirect,gi_B,gi_H);
Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le second noeud
ne = 2; n1=13;n2=14;indirect(1)=n1;indirect(2)=n2;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
break;
}
case 3: // trois noeuds,
{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
// -- le premier noeud
int ne = 1; indirect(1)=1;indirect(2)=2;
Bases_naturel_duales(indirect,gi_B,gi_H);
Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le second noeud = entre le 7 ième et le 8 ième pti
ne = 2; n1=7;n2=8;indirect(1)=n1;indirect(2)=n2;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le troisième noeud
ne = 3; n1=13;n2=14;indirect(1)=n1;indirect(2)=n2;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
break;
}
case 4:// dans le cas 4 noeuds
{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
// -- le premier noeud
int ne = 1; indirect(1)=1;indirect(2)=2;
Bases_naturel_duales(indirect,gi_B,gi_H);
Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le second noeud = entre le 6 ième et le 7 ième noeud
ne = 2; n1=6;n2=7;indirect(1)=n1;indirect(2)=n2;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le troisième noeud : entre les pt d'integ 8 et 9
ne = 3; n1=8;n2=9;indirect(1)=n1;indirect(2)=n2;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le quatrième noeud : extérieur de 13 et 14
ne = 4; n1=13;n2=14;indirect(1)=n1;indirect(2)=n2;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
}
break;
default:
{ cout << "\n erreur le nombre de noeud demande :" << NBNE <<"n\'est pas implante "
<< "\nGeomSeg::Calcul_extrapol(..";
Sortie(1);
};
};
break;
}// fin du cas avec 14 pt d'intégration
case 16:
{ // cas avec 8 points d'intégration
// on extrapole linéairement vers les noeuds en considérant à chaque fois les 2 pt d'intégration les + proches
int n1,n2;
switch (NBNE)
{ case 2: // deux noeuds,
{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
// -- le premier noeud
int ne = 1; indirect(1)=1;indirect(2)=2;
Bases_naturel_duales(indirect,gi_B,gi_H);
Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le second noeud
ne = 2; n1=15;n2=16;indirect(1)=n1;indirect(2)=n2;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
break;
}
case 3: // trois noeuds,
{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
// -- le premier noeud
int ne = 1; indirect(1)=1;indirect(2)=2;
Bases_naturel_duales(indirect,gi_B,gi_H);
Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le second noeud = entre le 8 ième et le 9 ième pti
ne = 2; n1=8;n2=9;indirect(1)=n1;indirect(2)=n2;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le troisième noeud
ne = 3; n1=15;n2=16;indirect(1)=n1;indirect(2)=n2;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
break;
}
case 4:// dans le cas 4 noeuds
{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
// -- le premier noeud
int ne = 1; indirect(1)=1;indirect(2)=2;
Bases_naturel_duales(indirect,gi_B,gi_H);
Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le second noeud = entre le 6 ième et le 7 ième pti
ne = 2; n1=6;n2=7;indirect(1)=n1;indirect(2)=n2;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le troisième noeud : entre les pt d'integ 10 et 11
ne = 3; n1=10;n2=11;indirect(1)=n1;indirect(2)=n2;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
// -- le quatrième noeud : extérieur de 7 et 8
ne = 4; n1=15;n2=16;indirect(1)=n1;indirect(2)=n2;
Bases_naturel_duales(indirect,gi_B,gi_H);
O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
indir(ne).Change_taille(2);
indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
}
break;
default:
{ cout << "\n erreur le nombre de noeud demande :" << NBNE <<"n\'est pas implante "
<< "\nGeomSeg::Calcul_extrapol(..";
Sortie(1);
};
};
break;
}// fin du cas avec 8 pt d'intégration
default:
{ cout << "\n erreur le nombre de point d'integration demande :" << nbi <<"n\'est pas implante "
<< "\nGeomSeg::Calcul_extrapol(..";
Sortie(1);
};
};
}
else if (id_type_pt_integ == PTI_GAUSS_LOBATTO)
// dans le cas des points de gauss lobatto, le premier et le dernier sont exactement positionné sur le premier et dernier noeud
{ switch (NBNE)
{ case 2: // deux noeuds,
{ // pour chaque noeuds on récupère le pt d'integ positionné au noeud
// -- le premier noeud
int ne = 1;
tab(ne)(1) = 1.;
indir(ne).Change_taille(1);
indir(ne)(1)=1;
// -- le second noeud
ne = 2;
tab(ne)(1) = 1.;
indir(ne).Change_taille(1);
indir(ne)(1)= nbi ;
break;
}
default:
{ cout << "\n erreur le nombre de noeud demande :" << NBNE
<<"n\'est pas implante pour le type de point d'integration gauss lobatto"
<< "\nGeomSeg::Calcul_extrapol(..";
Sortie(1);
};
};
};
};
//----------------------------- construction des poids et positions pour l'intégration de Gauss Lobatto ---------
GeomSeg::Construire_Gauss_Lobatto::Construire_Gauss_Lobatto()
{ // a priori on va jusqu'à 16 points
ksi_gl.Change_taille(16);
wi_gl.Change_taille(16);
// cas de 2 points
{int nbpt = 2;
ksi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& ksigl = ksi_gl(nbpt-1);
wi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& wigl = wi_gl(nbpt-1);
ksigl(1) = -1.; wigl(1) = 1.;
ksigl(2) = 1.; wigl(2) = 1.;
}
// cas de 3 points
{int nbpt = 3;
ksi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& ksigl = ksi_gl(nbpt-1);
wi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& wigl = wi_gl(nbpt-1);
ksigl(1) = -1.; wigl(1) = 1./3.;
ksigl(2) = 0.; wigl(2) = 4./3.;
ksigl(3) = 1.; wigl(3) = 1./3.;
}
// cas de 4 points
{int nbpt = 4;
ksi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& ksigl = ksi_gl(nbpt-1);
wi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& wigl = wi_gl(nbpt-1);
ksigl(1) = -1.; wigl(1) = 2./(nbpt * (nbpt - 1));
ksigl(2) = -4.472135954999580e-01; wigl(2) = 8.33333333333333333333333e-01;
ksigl(3) = 4.472135954999580e-01; wigl(3) = 8.33333333333333333333333e-01;
ksigl(4) = 1.; wigl(4) = 2./(nbpt * (nbpt - 1));
}
// cas de 5 points
{int nbpt = 5;
ksi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& ksigl = ksi_gl(nbpt-1);
wi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& wigl = wi_gl(nbpt-1);
ksigl(1) = -1.; wigl(1) = 2./(nbpt * (nbpt - 1));
ksigl(2) = -6.546536707079772e-01; wigl(2) = 5.4444444444444444444444444e-01;
ksigl(3) = 0.; wigl(3) = 7.1111111111111111111111111e-01;
ksigl(4) = 6.546536707079772e-01; wigl(4) = 5.4444444444444444444444444e-01;
ksigl(5) = 1.; wigl(5) = 2./(nbpt * (nbpt - 1));
}
// cas de 6 points
{int nbpt = 6;
ksi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& ksigl = ksi_gl(nbpt-1);
wi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& wigl = wi_gl(nbpt-1);
ksigl(1) = -1.; wigl(1) = 2./(nbpt * (nbpt - 1));
ksigl(2) = -7.650553239294655e-01; wigl(2) = 3.784749562978474e-01;
ksigl(3) = -2.852315164806451e-01; wigl(3) = 5.548583770354862e-01;
ksigl(4) = 2.852315164806451e-01; wigl(4) = 5.548583770354862e-01;
ksigl(5) = 7.650553239294655e-01; wigl(5) = 3.784749562978474e-01;
ksigl(6) = 1.; wigl(6) = 2./(nbpt * (nbpt - 1));
}
// cas de 7 points
{int nbpt = 7;
ksi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& ksigl = ksi_gl(nbpt-1);
wi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& wigl = wi_gl(nbpt-1);
ksigl(7) = 1.; wigl(7) = 2./(nbpt * (nbpt - 1));
ksigl(6) = 8.302238962785669e-01; wigl(6) = 2.768260473615680e-01;
ksigl(5) = 4.688487934707141e-01; wigl(5) = 4.317453812098623e-01;
ksigl(4) = 0.; wigl(4) = 4.876190476190476e-01;
ksigl(3) = -ksigl(5); wigl(3) = wigl(5);
ksigl(2) = -ksigl(6); wigl(2) = wigl(6);
ksigl(1) = -ksigl(7); wigl(1) = wigl(7);
}
// cas de 8 points
{int nbpt = 8;
ksi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& ksigl = ksi_gl(nbpt-1);
wi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& wigl = wi_gl(nbpt-1);
ksigl(5) = 2.092992179024789e-01; wigl(5) = 4.124587946587041e-01;
ksigl(6) = 5.917001814331432e-01; wigl(6) = 3.411226924835035e-01;
ksigl(7) = 8.717401485096070e-01; wigl(7) = 2.107042271435098e-01;
ksigl(8) = 1.; wigl(8) = 2./(nbpt * (nbpt - 1));
ksigl(1) = -ksigl(5); wigl(1) = wigl(5);
ksigl(2) = -ksigl(6); wigl(2) = wigl(6);
ksigl(3) = -ksigl(7); wigl(3) = wigl(7);
ksigl(4) = -ksigl(8); wigl(4) = wigl(8);
}
// cas de 9 points
{int nbpt = 9;
ksi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& ksigl = ksi_gl(nbpt-1);
wi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& wigl = wi_gl(nbpt-1);
ksigl(5) = 0.; wigl(5) = 3.715192743764172e-01;
ksigl(6) = 3.631174638261781e-01; wigl(6) = 3.464285109730465e-01;
ksigl(7) = 6.771862795107376e-01; wigl(7) = 2.745387125001594e-01;
ksigl(8) = 8.997579954114603e-01; wigl(8) = 1.654953615608145e-01;
ksigl(9) = 1.; wigl(9) = 2./(nbpt * (nbpt - 1));
ksigl(1) = -ksigl(6); wigl(1) = wigl(6);
ksigl(2) = -ksigl(7); wigl(2) = wigl(7);
ksigl(3) = -ksigl(8); wigl(3) = wigl(8);
ksigl(4) = -ksigl(9); wigl(4) = wigl(9);
}
// cas de 10 points
{int nbpt = 10;
ksi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& ksigl = ksi_gl(nbpt-1);
wi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& wigl = wi_gl(nbpt-1);
ksigl(6) = 1.652789576663870e-01; wigl(6) = 3.275397611838975e-01;
ksigl(7) = 4.779249498104443e-01; wigl(7) = 2.920426836796842e-01;
ksigl(8) = 7.387738651055066e-01; wigl(8) = 2.248893420631201e-01;
ksigl(9) = 9.195339081664590e-01; wigl(9) = 1.333059908510840e-01;
ksigl(10) = 1.; wigl(10) = 2./(nbpt * (nbpt - 1));
ksigl(1) = -ksigl(6); wigl(1) = wigl(6);
ksigl(2) = -ksigl(7); wigl(2) = wigl(7);
ksigl(3) = -ksigl(8); wigl(3) = wigl(8);
ksigl(4) = -ksigl(9); wigl(4) = wigl(9);
ksigl(5) = -ksigl(10); wigl(5) = wigl(10);
}
// cas de 11 points
{int nbpt = 11;
ksi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& ksigl = ksi_gl(nbpt-1);
wi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& wigl = wi_gl(nbpt-1);
ksigl(6) = 0.; wigl(6) = 3.002175954556907e-01;
ksigl(7) = 2.957581355869391e-01; wigl(7) = 2.868791247790082e-01;
ksigl(8) = 5.652353269962073e-01; wigl(8) = 2.480481042640294e-01;
ksigl(9) = 7.844834736631412e-01; wigl(9) = 1.871698817802869e-01;
ksigl(10) = 9.340014304080602e-01; wigl(10) = 1.096122732670316e-01;
ksigl(11) = 1.; wigl(11) = 2./(nbpt * (nbpt - 1));
ksigl(1) = -ksigl(7) ; wigl(1) = wigl(7) ;
ksigl(2) = -ksigl(8) ; wigl(2) = wigl(8) ;
ksigl(3) = -ksigl(9) ; wigl(3) = wigl(9) ;
ksigl(4) = -ksigl(10); wigl(4) = wigl(10);
ksigl(5) = -ksigl(11); wigl(5) = wigl(11);
}
// cas de 12 points
{int nbpt = 12; int decal=6;
ksi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& ksigl = ksi_gl(nbpt-1);
wi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& wigl = wi_gl(nbpt-1);
ksigl(7) = 1.365529328549276e-01; wigl(7) = 2.714052409106961e-01;
ksigl(8) = 3.995309409653499e-01; wigl(8) = 2.512756031992004e-01;
ksigl(9) = 6.328761530318588e-01; wigl(9) = 2.125084177610267e-01;
ksigl(10) = 8.192793216440097e-01; wigl(10) = 1.579747055643515e-01;
ksigl(11) = 9.448992722228819e-01; wigl(11) = 9.168451741322353e-02;
ksigl(12) = 1.; wigl(12) = 2./(nbpt * (nbpt - 1));
for (int i=1;i<= nbpt/2;i++)
{ksigl(i) = -ksigl(i+decal) ; wigl(i) = wigl(i+decal) ;};
}
// cas de 13 points
{int nbpt = 13; int decal=7;
ksi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& ksigl = ksi_gl(nbpt-1);
wi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& wigl = wi_gl(nbpt-1);
ksigl(7) = 0.; wigl(7) = 2.519308493334467e-01;
ksigl(8) = 2.492869301062400e-01; wigl(8) = 2.440157903066762e-01;
ksigl(9) = 4.829098210913346e-01; wigl(9) = 2.207677935661110e-01;
ksigl(10) = 6.861884690817684e-01; wigl(10) = 1.836468652035536e-01;
ksigl(11) = 8.463475646518546e-01; wigl(11) = 1.349819266896224e-01;
ksigl(12) = 9.533098466421709e-01; wigl(12) = 7.780168674687256e-02;
ksigl(13) = 1.; wigl(13) = 2./(nbpt * (nbpt - 1));
for (int i=1;i<= nbpt/2;i++)
{ksigl(i) = -ksigl(i+decal) ; wigl(i) = wigl(i+decal) ;};
}
// cas de 14 points
{int nbpt = 14; int decal=7;
ksi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& ksigl = ksi_gl(nbpt-1);
wi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& wigl = wi_gl(nbpt-1);
ksigl(8) = 1.163318688837039e-01; wigl(8) = 2.316127944684571e-01;
ksigl(9) = 3.427240133427127e-01; wigl(9) = 2.191262530097713e-01;
ksigl(10) = 5.506394029286509e-01; wigl(10) = 1.948261493734101e-01;
ksigl(11) = 7.288685990913161e-01; wigl(11) = 1.600218517629651e-01;
ksigl(12) = 8.678010538303477e-01; wigl(12) = 1.165866558987275e-01;
ksigl(13) = 9.599350452672649e-01; wigl(13) = 6.683728449778241e-02;
ksigl(14) = 1.; wigl(14) = 2./(nbpt * (nbpt - 1));
for (int i=1;i<= nbpt/2;i++)
{ksigl(i) = -ksigl(i+decal) ; wigl(i) = wigl(i+decal) ;};
}
// cas de 15 points
{int nbpt = 15; int decal=8;
ksi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& ksigl = ksi_gl(nbpt-1);
wi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& wigl = wi_gl(nbpt-1);
ksigl(8) = 0.; wigl(8) = 2.170481163488157e-01;
ksigl(9) = 2.153539553637941e-01; wigl(9) = 2.119735859268208e-01;
ksigl(10) = 4.206380547136734e-01; wigl(10) = 1.969872359646122e-01;
ksigl(11) = 6.062532054698444e-01; wigl(11) = 1.727896472536003e-01;
ksigl(12) = 7.635196899518153e-01; wigl(12) = 1.405116998024270e-01;
ksigl(13) = 8.850820442229764e-01; wigl(13) = 1.016600703256791e-01;
ksigl(14) = 9.652459265038381e-01; wigl(14) = 5.802989302866641e-02;
ksigl(15) = 1.; wigl(15) = 2./(nbpt * (nbpt - 1));
for (int i=1;i<= nbpt/2;i++)
{ksigl(i) = -ksigl(i+decal) ; wigl(i) = wigl(i+decal) ;};
}
// cas de 16 points
{int nbpt = 16; int decal=8;
ksi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& ksigl = ksi_gl(nbpt-1);
wi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& wigl = wi_gl(nbpt-1);
ksigl(9) = 1.013262735219495e-01; wigl(9) = 2.019583081782299e-01;
ksigl(10) = 2.998304689007628e-01; wigl(10) = 1.936900238252040e-01;
ksigl(11) = 4.860594218871320e-01; wigl(11) = 1.774919133917017e-01;
ksigl(12) = 6.523887028825278e-01; wigl(12) = 1.540269808071386e-01;
ksigl(13) = 7.920082918617235e-01; wigl(13) = 1.242553821325850e-01;
ksigl(14) = 8.992005330935808e-01; wigl(14) = 8.939369732589475e-02;
ksigl(15) = 9.695680462701730e-01; wigl(15) = 5.085036100571246e-02;
ksigl(16) = 1.; wigl(16) = 2./(nbpt * (nbpt - 1));
for (int i=1;i<= nbpt/2;i++)
{ksigl(i) = -ksigl(i+decal) ; wigl(i) = wigl(i+decal) ;};
}
};