// This file is part of the Herezh++ application. // // The finite element software Herezh++ is dedicated to the field // of mechanics for large transformations of solid structures. // It is developed by Gérard Rio (APP: IDDN.FR.010.0106078.000.R.P.2006.035.20600) // INSTITUT DE RECHERCHE DUPUY DE LÔME (IRDL) . // // Herezh++ is distributed under GPL 3 license ou ultérieure. // // Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, // or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // For more information, please consult: . //#include "Debug.h" #include "GeomSeg.h" #include #include "MathUtil.h" //----- les variables statiques ------------ Tableau > GeomSeg::ksi_gl; Tableau > 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 & ksigl = ksi_gl(nbi-1); // pour simplifier Tableau & 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 > & indir = extrapol(1).indir; // pour simplifier Tableau > & tab = extrapol(1).tab; // pour simplifier Tableau indirect(2); // tableau de travail Tableau 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 & ksigl = ksi_gl(nbpt-1); wi_gl(nbpt-1).Change_taille(nbpt); Tableau & 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 & ksigl = ksi_gl(nbpt-1); wi_gl(nbpt-1).Change_taille(nbpt); Tableau & 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 & ksigl = ksi_gl(nbpt-1); wi_gl(nbpt-1).Change_taille(nbpt); Tableau & 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 & ksigl = ksi_gl(nbpt-1); wi_gl(nbpt-1).Change_taille(nbpt); Tableau & 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 & ksigl = ksi_gl(nbpt-1); wi_gl(nbpt-1).Change_taille(nbpt); Tableau & 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 & ksigl = ksi_gl(nbpt-1); wi_gl(nbpt-1).Change_taille(nbpt); Tableau & 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 & ksigl = ksi_gl(nbpt-1); wi_gl(nbpt-1).Change_taille(nbpt); Tableau & 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 & ksigl = ksi_gl(nbpt-1); wi_gl(nbpt-1).Change_taille(nbpt); Tableau & 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 & ksigl = ksi_gl(nbpt-1); wi_gl(nbpt-1).Change_taille(nbpt); Tableau & 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 & ksigl = ksi_gl(nbpt-1); wi_gl(nbpt-1).Change_taille(nbpt); Tableau & 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 & ksigl = ksi_gl(nbpt-1); wi_gl(nbpt-1).Change_taille(nbpt); Tableau & 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 & ksigl = ksi_gl(nbpt-1); wi_gl(nbpt-1).Change_taille(nbpt); Tableau & 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 & ksigl = ksi_gl(nbpt-1); wi_gl(nbpt-1).Change_taille(nbpt); Tableau & 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 & ksigl = ksi_gl(nbpt-1); wi_gl(nbpt-1).Change_taille(nbpt); Tableau & 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 & ksigl = ksi_gl(nbpt-1); wi_gl(nbpt-1).Change_taille(nbpt); Tableau & 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) ;}; } };