1647 lines
82 KiB
C++
Executable file
1647 lines
82 KiB
C++
Executable file
|
|
// This file is part of the Herezh++ application.
|
|
//
|
|
// The finite element software Herezh++ is dedicated to the field
|
|
// of mechanics for large transformations of solid structures.
|
|
// It is developed by Gérard Rio (APP: IDDN.FR.010.0106078.000.R.P.2006.035.20600)
|
|
// INSTITUT DE RECHERCHE DUPUY DE LÔME (IRDL) <https://www.irdl.fr/>.
|
|
//
|
|
// Herezh++ is distributed under GPL 3 license ou ultérieure.
|
|
//
|
|
// Copyright (C) 1997-2021 Université Bretagne Sud (France)
|
|
// AUTHOR : Gérard Rio
|
|
// E-MAIL : gerardrio56@free.fr
|
|
//
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License,
|
|
// or (at your option) any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty
|
|
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
// See the GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
//
|
|
// For more information, please consult: <https://herezh.irdl.fr/>.
|
|
|
|
//#include "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(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(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) ;};
|
|
}
|
|
};
|
|
|