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

//#include "Debug.h"

#include "GeomSeg.h"
#include <math.h>
#include "MathUtil.h"

//----- les variables statiques ------------
 Tableau <Tableau <double > > GeomSeg::ksi_gl; 
 Tableau <Tableau <double > > GeomSeg::wi_gl; 
 GeomSeg::Construire_Gauss_Lobatto GeomSeg::construire_gauss_lobatto;
//------- fin des variables statiques -----------

//  dimension 1, nbi pt d'integ, nbne noeuds, 0 face et 1 ligne          
GeomSeg::GeomSeg(int nbi,int nbne,Enum_type_pt_integ type_pti) :
  ElemGeomC0(1,nbi,nbne,0,1,SEGMENT,RIEN_INTERPOL,type_pti) 
  ,tabD2Phi(nbi),phi_M(),dphi_M()
{ // def de la taille du tableau contenant la dérivée seconde
  for (int i= 1; i<=nbi; i++)
   tabD2Phi(i).Initialise (dimension,NBNE,0.);

  // def du pointeur de ligne
  seg(1) = this;
  // def du tableau NONS
  NONS(1).Change_taille(NBNE);
  for (int i=1;i<=nbne;i++)
     NONS(1)(i) = i;
  // définition de la numérotation locale de l'élément de direction inverse
  switch  (NBNE)
    { case 2: { INVCONNEC(1) = 2;INVCONNEC(2) = 1;break;}  
      case 3: { INVCONNEC(1) = 3;INVCONNEC(2) = 2;INVCONNEC(3) = 1;break;} 
      case 4: { INVCONNEC(1) = 4;INVCONNEC(2) = 3;INVCONNEC(3) = 2;INVCONNEC(4) = 1;break;} 
      default :
        { cout << "\n erreur le nombre de noeud demande :" << NBNE <<" n\'est"
               << " pas implante "
               << "\nGeomSeg::GeomSeg(int nbi,int nbne)";
          Sortie(1);
        }
    };     
  // le tableau des tranches: comme tous les noeuds sont à suivre -> une seule tranche
	 IND.Change_taille(1); IND(1)=NBNE;

  //    ----------------------------------------------
  //    coordonnees et poids des points d'integrations
  //         ( -1 <= KSI <= +1 )
  //    ----------------------------------------------
      // def de W et de ptInteg
      // cas avec un pt d'integ
		if (type_pti == PTI_GAUSS) // cas des points de gauss
       {switch  (nbi)
        { case 1:  
           { KSI(1)= 0.;
             WI(1)= 2.;
             break;
           }
          case 2:  // avec 2
           { double S= 1./sqrt(3.) ;
             KSI(1)= -S;
             KSI(2)= S;
             WI(1)= 1.;
             WI(2)= 1.;
             break;
           }
          case 3:  // avec 3
           { double S= sqrt(3./5.) ;
             KSI(2)= 0.;
             KSI(3)= S;
             KSI(1)= -S;
             WI(2)= 8./9.;
             WI(1)= 5./9.;
             WI(3)= 5./9.;
             break;
           }
          case  4:  // avec 4
           { double S= 2.*sqrt(6./5.);
             double T= sqrt( (3.-S)/7. );
             KSI(3)= T;
             KSI(2)= -T;
             T= sqrt( (3.+S)/7. );
             KSI(4)= T;
             KSI(1)= -T;
             S= 1./(6.*sqrt(6./5.));
             WI(3)= 0.5 + S;
             WI(2)= 0.5 + S;
             WI(4)= 0.5 - S;
             WI(1)= 0.5 - S;
             break;
           }
          case  5:  // avec 5
           { double untiers=1./3.;
             double racine5sur14 = sqrt(5./14.);
             double T1= untiers*sqrt(5.-  4.* racine5sur14);
             double T2= untiers*sqrt(5.+ 4.* racine5sur14);
             KSI(1)= -T2; WI(1)=(161./450.-13./(180.*racine5sur14));
             KSI(2)= -T1; WI(2)=(161./450.+13./(180.*racine5sur14));
             KSI(3)=  0.; WI(3)=128./225.;
             KSI(4)=  T1; WI(4)=(161./450.+13./(180.*racine5sur14));
             KSI(5)=  T2; WI(5)=(161./450.-13./(180.*racine5sur14));
             break;
           }
          case  6:  // avec 6
           { KSI(1)= -0.932469514203152; WI(1)=0.171324492379170;
             KSI(2)= -0.661209386466265; WI(2)=0.360761573048139;
             KSI(3)= -0.238619186083197; WI(3)=0.467913934572691;
             KSI(4)=  0.238619186083197; WI(4)=0.467913934572691;
             KSI(5)=  0.661209386466265; WI(5)=0.360761573048139;
             KSI(6)=  0.932469514203152; WI(6)=0.171324492379170;
             break;
           }
          case  7:  // avec 7
           { KSI(1)= -0.949107912342759; WI(1)=0.129484966168870;
             KSI(2)= -0.741531185599394; WI(2)=0.279705391489277;
             KSI(3)= -0.405845151377397; WI(3)=0.381830050505119;
             KSI(4)=  0;                 WI(4)=0.417959183673469;
             KSI(5)=  0.405845151377397; WI(5)=0.381830050505119;
             KSI(6)=  0.741531185599394; WI(6)=0.279705391489277;
             KSI(7)=  0.949107912342759; WI(7)=0.129484966168870;
             break;
           }
          case  8:  // avec 8
           {
             KSI(1)= -0.9602898564975362316835609; WI(1)=0.1012285362903762591525314;
             KSI(2)= -0.7966664774136267395915539; WI(2)=0.2223810344533744705443560;
             KSI(3)= -0.5255324099163289858177390; WI(3)=0.3137066458778872873379622;
             KSI(4)= -0.1834346424956498049394761; WI(4)=0.3626837833783619829651504;

             KSI(5)=  0.1834346424956498049394761; WI(5)=0.3626837833783619829651504;
             KSI(6)=  0.5255324099163289858177390; WI(6)=0.3137066458778872873379622;
             KSI(7)=  0.7966664774136267395915539; WI(7)=0.2223810344533744705443560;
             KSI(8)=  0.9602898564975362316835609; WI(8)=0.1012285362903762591525314;
             break;
           }
          case  10:  // avec 10
           {
             KSI(1)= -0.9739065285171717200779640;WI(1)=0.0666713443086881375935688;
             KSI(2)= -0.8650633666889845107320967;WI(2)=0.1494513491505805931457763;
             KSI(3)= -0.6794095682990244062343274;WI(3)=0.2190863625159820439955349;
             KSI(4)= -0.4333953941292471907992659;WI(4)=0.2692667193099963550912269;
             KSI(5)= -0.1488743389816312108848260;WI(5)=0.2955242247147528701738930;
             KSI(6)=  0.1488743389816312108848260;WI(6)=0.2955242247147528701738930;
             KSI(7)=  0.4333953941292471907992659;WI(7)=0.2692667193099963550912269;
             KSI(8)=  0.6794095682990244062343274;WI(8)=0.2190863625159820439955349;
             KSI(9)=  0.8650633666889845107320967;WI(9)=0.1494513491505805931457763;
             KSI(10)=  0.9739065285171717200779640;WI(10)=0.0666713443086881375935688;
             break;
           }
          case  12:  // avec 12
           {
             KSI(7)=   0.1252334085114689154724414;WI(7)=0.2491470458134027850005624;
             KSI(8)=   0.3678314989981801937526915;WI(8)=0.2334925365383548087608499;
             KSI(9)=   0.5873179542866174472967024;WI(9)=0.2031674267230659217490645;
             KSI(10)=  0.7699026741943046870368938;WI(10)=0.1600783285433462263346525;
             KSI(11)=  0.9041172563704748566784659;WI(11)=0.1069393259953184309602547;
             KSI(12)=  0.9815606342467192506905491;WI(12)=0.0471753363865118271946160;
             KSI(6)= -KSI(7);   WI(6)=WI(7);
             KSI(5)= -KSI(8);   WI(5)=WI(8);
             KSI(4)= -KSI(9);   WI(4)=WI(9);
             KSI(3)= -KSI(10);  WI(3)=WI(10);
             KSI(2)= -KSI(11);  WI(2)=WI(11);
             KSI(1)= -KSI(12);  WI(1)=WI(12);
             break;
           }
          case  14:  // avec 14
           {
             KSI(8)=  0.1080549487073436620662447;  WI(8)=0.2152638534631577901958764;
             KSI(9)=  0.3191123689278897604356718;  WI(9)=0.2051984637212956039659241;
             KSI(10)=  0.5152486363581540919652907; WI(10)=0.1855383974779378137417166;
             KSI(11)=  0.6872929048116854701480198; WI(11)=0.1572031671581935345696019;
             KSI(12)=  0.8272013150697649931897947; WI(12)=0.1215185706879031846894148;
             KSI(13)=  0.9284348836635735173363911; WI(13)=0.0801580871597602098056333;
             KSI(14)=  0.9862838086968123388415973; WI(14)=0.0351194603317518630318329;
             KSI(7)= -KSI(8);   WI(7)=WI(8);
             KSI(6)= -KSI(9);   WI(6)=WI(9);
             KSI(5)= -KSI(10);  WI(5)=WI(10);
             KSI(4)= -KSI(11);  WI(4)=WI(11);
             KSI(3)= -KSI(12);  WI(3)=WI(12);
             KSI(2)= -KSI(13);  WI(2)=WI(13);
             KSI(1)= -KSI(14);  WI(1)=WI(14);
             break;
           }
          case  16:  // avec 16
           {
             KSI(9)=   0.0950125098376374401853193; WI(9) =0.1894506104550684962853967;
             KSI(10)=  0.2816035507792589132304605; WI(10)=0.1826034150449235888667637;
             KSI(11)=  0.4580167776572273863424194; WI(11)=0.1691565193950025381893121;
             KSI(12)=  0.6178762444026437484466718; WI(12)=0.1495959888165767320815017;
             KSI(13)=  0.7554044083550030338951012; WI(13)=0.1246289712555338720524763;
             KSI(14)=  0.8656312023878317438804679; WI(14)=0.0951585116824927848099251;
             KSI(15)=  0.9445750230732325760779884; WI(15)=0.0622535239386478928628438;
             KSI(16)=  0.9894009349916499325961542; WI(16)=0.0271524594117540948517806;
             KSI(8)= -KSI(9);   WI(8)=WI(9);
             KSI(7)= -KSI(10);  WI(7)=WI(10);
             KSI(6)= -KSI(11);  WI(6)=WI(11);
             KSI(5)= -KSI(12);  WI(5)=WI(12);
             KSI(4)= -KSI(13);  WI(4)=WI(13);
             KSI(3)= -KSI(14);  WI(3)=WI(14);
             KSI(2)= -KSI(15);  WI(2)=WI(15);
             KSI(1)= -KSI(16);  WI(1)=WI(16);
             break;
           }
          default :
            { cout << "\n erreur le nombre de point d\'integration demande :" << Nbi() <<" n\'est"
                   << " pas implante "
                   << "\nGeomSeg::GeomSeg(int nbi,int nbne)";
              Sortie(1);
            }
        };
		     }
		else if (type_pti == PTI_GAUSS_LOBATTO) //  il s'agit des points de Gauss-lobatto
		 { if ((nbi > 0) && (nbi < 17))
			 { Tableau <double >& ksigl = ksi_gl(nbi-1); // pour simplifier
			   Tableau <double >& wigl = wi_gl(nbi-1);   //  ""
				for (int i=1;i<=nbi;i++)
			     {KSI(i) = ksigl(i);WI(i) = wigl(i);};
			 }
			else  
			 { cout << "\n erreur le nombre de point d\'integration de Gauss-Lobatto demande :" << Nbi() <<" n\'est"
					  << " pas implante "
					  << "\nGeomSeg::GeomSeg(int nbi,int nbne)";
				Sortie(1);
			  };
		 };
		 
    // fonction et derivees des fonctions d'interpolation
    // ainsi que coordonnées des noeuds
    switch  (NBNE)
    {case 2:  // cas lineaire
     {id_interpol=LINEAIRE;
      for (int ni=1;ni<= Nbi();ni++)
       {tabPhi(ni)(1) = (1. - KSI(ni))/2.;
        tabPhi(ni)(2) = (1. + KSI(ni))/2.;
        tabDPhi(ni)(1,1) = -1./2.;
        tabDPhi(ni)(1,2) = 1./2.;
        //tabD2Phi(ni)(1,1) = 0.; le calcul est inutile mais ces lignes sont
        //tabD2Phi(ni)(1,2) = 0.; pour mémoire
        ptelem(1) = Coordonnee(-1.);
        ptelem(2) = Coordonnee(1.);
       }
      break;
      }
     case 3:  // cas  quadratique
     {id_interpol=QUADRACOMPL;
      for (int ni=1;ni<= Nbi();ni++)
       {tabPhi(ni)(1) = -KSI(ni)*(1. - KSI(ni))/2.;
        tabPhi(ni)(2) = (1. - KSI(ni))*(1. + KSI(ni));
        tabPhi(ni)(3) = KSI(ni)*(1. + KSI(ni))/2.;
        tabDPhi(ni)(1,1) = (-1.+2.*KSI(ni))/2.;
        tabDPhi(ni)(1,2) = -2*KSI(ni);
        tabDPhi(ni)(1,3) = (1.+2.*KSI(ni))/2.;
        tabD2Phi(ni)(1,1) = 1.;
        tabD2Phi(ni)(1,2) = -2.;
        tabD2Phi(ni)(1,3) = 1.;
        ptelem(1) = Coordonnee(-1.);
        ptelem(2) = Coordonnee(0.);
        ptelem(3) = Coordonnee(1.);
       }
      break;
      } 
     case  4 : // cas  cubique
     {id_interpol=CUBIQUE;
      for (int ni=1;ni<= Nbi();ni++)
       {double unsur16 = 1./16.;
        double KSI1=KSI(ni);double KSI2=KSI1*KSI1;  
        tabPhi(ni)(1) = -(1. - KSI1)*(1-9.*KSI2)*unsur16;
        tabPhi(ni)(2) = 9.*(1. - KSI2)*(1. - 3.*KSI1)*unsur16;
        tabPhi(ni)(3) = 9.*(1. - KSI2)*(1. + 3.*KSI1)*unsur16;
        tabPhi(ni)(4) = -(1. + KSI1)*(1-9.*KSI2)*unsur16;
        tabDPhi(ni)(1,1) = (1. + 18. * KSI1 - 27.*KSI2)*unsur16;
        tabDPhi(ni)(1,2) = (-27. -18.* KSI1 + 81.*KSI2)*unsur16;
        tabDPhi(ni)(1,3) = (27. -18.* KSI1 - 81.*KSI2)*unsur16;
        tabDPhi(ni)(1,4) = (-1. +18.* KSI1 +27.*KSI2)*unsur16;
        tabD2Phi(ni)(1,1) = (18. - 54.*KSI1)*unsur16;
        tabD2Phi(ni)(1,2) = (-18. + 162.*KSI1)*unsur16;
        tabD2Phi(ni)(1,3) = (-18. - 162.*KSI1)*unsur16;
        tabD2Phi(ni)(1,4) = (18. + 54.*KSI1)*unsur16;
        ptelem(1) = Coordonnee(-1.);
        ptelem(2) = Coordonnee(-1./3.);
        ptelem(3) = Coordonnee(1./3.);
        ptelem(4) = Coordonnee(1.);
       } 
      break;
      }
     default :
      { cout << "\n erreur le nombre de noeud demande :" << NBNE <<"n\'est pas implante "
             << "\nGeomSeg::GeomSeg(int nbi,int nbne)";
        Sortie(1);
      }
    }  
    // ---- constitution du tableau Extrapol ----- 
    Calcul_extrapol(nbi);      
                  
};

// constructeur de copie
GeomSeg::GeomSeg(const GeomSeg& a) :
  ElemGeomC0(a),tabD2Phi(a.tabD2Phi)
  ,phi_M(a.phi_M),dphi_M(a.dphi_M)
 { // la copie des parties pointées est à la charge de la classe spécifique
   // def du segment
	  seg(1) = this;
 };
    
// création d'élément identiques : cette fonction est analogue à la fonction new
// elle y fait d'ailleurs appel. l'implantation est spécifique dans chaque classe
// dérivée
// pt est le pointeur qui est affecté par la fonction 
ElemGeomC0 * GeomSeg::newElemGeomC0(ElemGeomC0 * pt) 
  { pt = new GeomSeg(*this);
    return pt; 
  };

//--------- cas de coordonnees locales quelconques ---------------- 
    // retourne les fonctions d'interpolation au point M (en coordonnees locales)
const Vecteur& GeomSeg::Phi_point(const Coordonnee& M)
  { 
    #ifdef MISE_AU_POINT	 	   
     // verification de la dimension des coordonnees locales
     if (M.Dimension() != 1)
       { cout << "\n erreur la dimension des coordonnees locales :" << M.Dimension()
              <<"n\'est pas egale a 1 "
             << "\nGeomSeg::Phi(Coordonnee& M)";
        Sortie(1);
      }
    #endif
    // dimentionnement éventuelle du tableau des fonctions d'interpolation
    phi_M.Change_taille(NBNE); // si la taille est identique -> aucune action
    // fonction  des fonctions d'interpolation
    double M1 = M(1);  // pour simplifier
    if (NBNE == 2 ) // cas lineaire
      { phi_M(1) = (1. - M1)/2.;
        phi_M(2) = (1. + M1)/2.;
      }
    else  if  (NBNE == 3 ) // cas  quadratique
      { double M2 = M1*M1;
        phi_M(1) = (M2 - M1)/2.;
        phi_M(2) = (1. - M2);
        phi_M(3) = (M2 + M1)/2.;
      }
    else  if  (NBNE == 4 ) // cas  cubique
      { double unsur16 = 1./16.;
        double M1 = M(1); double M2 = M1*M1;
        phi_M(1) = -(1. - M1)*(1-9.*M2)*unsur16;
        phi_M(2) = 9.*(1. - M2)*(1. - 3.*M1)*unsur16;
        phi_M(3) = 9.*(1. - M2)*(1. + 3.*M1)*unsur16;
        phi_M(4) = -(1. + M1)*(1-9.*M2)*unsur16;
      }
    else            
      { cout << "\n erreur le nombre de noeud demande :" << NBNE <<"n\'est pas implante "
             << "\nGeomSeg::Phi(Coordonnee& M)";
        Sortie(1);
      }

    return phi_M;
   };
    // retourne les derivees des fonctions d'interpolation au point M (en coordonnees locales)
const Mat_pleine& GeomSeg::Dphi_point(const Coordonnee& M)
 { 
   #ifdef MISE_AU_POINT	 	   
     // verification de la dimension des coordonnees locales
     if (M.Dimension() != 1)
       { cout << "\n erreur la dimension des coordonnees locales :" << M.Dimension()
              <<"n\'est pas egale a 1 "
             << "\nGeomSeg::Dphi(Coordonnee& M)";
        Sortie(1);
      }
    #endif
//   Mat_pleine dphi(1,NBNE);
   // le tableau des derivees: redimentionnement si nécessaire
   if ((dphi_M.Nb_ligne() != 1)&&(dphi_M.Nb_colonne() != NBNE))
      dphi_M.Initialise (1,NBNE,0.);
   // fonction et derivees des fonctions d'interpolation
    double M1 = M(1);  // pour simplifier
    if (NBNE == 2 ) // cas lineaire
      { dphi_M(1,1) = -1./2.;
        dphi_M(1,2) = 1./2.;
      }
    else  if  (NBNE == 3 ) // cas  quadratique
      { dphi_M(1,1) = M1-0.5;
        dphi_M(1,2) = -2*M1;
        dphi_M(1,3) = M1+0.5;
      }
    else  if  (NBNE == 4 ) // cas  cubique
      { double unsur16 = 1./16.;
        double M1 = M(1); double M2 = M1*M1;
        dphi_M(1,1) = (1. + 18. * M1 - 27.*M2)*unsur16;
        dphi_M(1,2) = (-27. -18.* M1 + 81.*M2)*unsur16;
        dphi_M(1,3) = (27. -18.* M1 - 81.*M2)*unsur16;
        dphi_M(1,4) = (-1. +18.* M1 +27.*M2)*unsur16;
      }
    else            
      { cout << "\n erreur le nombre de noeud demande :" << NBNE <<"n\'est pas implante "
             << "\nGeomSeg::Dphi(Coordonnee& M)";
        Sortie(1);
      }
    return dphi_M;
  };

   
// en fonction de coordonnees locales, retourne true si le point est a l'interieur
// de l'element, false sinon
bool GeomSeg::Interieur(const Coordonnee& M)
  { if ((Dabs(M(1)) <= 1.)  )                
        return true;
    else
        return false;    
   };
       
// en fonction de coordonnees locales, retourne le point local P, maximum intérieur à l'élément, donc sur la frontière
// dont les coordonnées sont sur la droite GM: c-a-d GP = alpha GM, avec apha maxi et P appartenant à la frontière
// de l'élément, G étant le centre de gravité, sauf si GM est nul, dans ce cas retour de M
Coordonnee GeomSeg::Maxi_Coor_dans_directionGM(const Coordonnee& M)
  { // on recherche du maxi de la composante en valeur absolu
    double xmax = Dabs(M(1));
    if (xmax <= ConstMath::petit) return M;
    // sinon on fait la règle de 3
    Coordonnee P= M/xmax;
    return P;
   }; 
  
  
// constitution du tableau Extrapol
void GeomSeg::Calcul_extrapol(int nbi)
{ // cas de l'extrapolation de grandeur des points d'intégrations aux noeuds
  // def du tableau de pondération tab(i)(j) qu'il faut appliquer
  // aux noeuds pour avoir la valeur aux noeuds 
  // val_au_noeud(i) = somme_(de j=indir(i)(1) à indir(i)(taille(indir(i)) )) {tab(i)(j) * val_pt_integ(j) }
  // cas = 1: la valeur au noeud = la valeur au pt d'integ le plus près ou une moyenne des
  //          pt les plus près (si le nb de pt d'integ < nb noeud)
  //  --- pour l'instant seul le cas 1 est implanté  ---
  Tableau<Tableau<int> > & indir = extrapol(1).indir;  // pour simplifier
  Tableau<Tableau<double > > & tab = extrapol(1).tab;    // pour simplifier
  Tableau <int> indirect(2); // tableau de travail
  Tableau <Coordonnee>  gi_B,gi_H; // bases naturelle et duale
  Vecteur phi_(2); // le conteneur pour les fonctions d'interpolation
  Coordonnee theta(1); // le conteneur pour les coordonnées locales

  if (id_type_pt_integ == PTI_GAUSS)
  {switch  (nbi)
   { case 1: 
       { // cas avec un point d'intégration, quelque soit le nombre de noeuds, 
         // on reporte la valeur au pt d'integ, telle quelle au noeud
         for (int ne=1;ne<=NBNE;ne++)
         	{tab(ne)(1)=1.;
         	 indir(ne).Change_taille(1); indir(ne)(1)=1;
         	};
         break;
       }
   	 case 2:
   	   { // cas avec 2 points d'intégration 
         // on extrapole linéairement sur les  pt d'integ quelques soit le nombre de noeuds
         { indirect(1)=1;indirect(2)=2;
           Bases_naturel_duales(indirect,gi_B,gi_H);
           Coordonnee O((int)1); // def de l'origine à 0 
           for (int ne = 1; ne<=NBNE;ne++)
             {ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
              tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
              indir(ne).Change_taille(2); 
              indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
             };
         };
         break; 
   	 	}  // fin du cas avec 2 pt d'intégration
   	 case 3:
   	   { // cas avec 3 points d'intégration 
         switch (NBNE)
         	{ case 2: // deux noeuds, 
         		{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
         		  // -- le premier noeud
                  int ne = 1; indirect(1)=1;indirect(2)=2; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  // -- le second noeud
                  ne = 2; indirect(1)=2;indirect(2)=3; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(2)+ptInteg(3)); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(2) = phi_(1);tab(ne)(3) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  break;
         		}
         	  case 3: // trois noeuds, 
         		{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
         		  // -- le premier noeud
                  int ne = 1; indirect(1)=1;indirect(2)=2; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  // -- le second noeud --> directement le second pt d'integ
                  ne=2; tab(ne)(2) = 1.; 
                  indir(ne).Change_taille(1); 
                  indir(ne)(1)=2;
         		  // -- le troisième noeud
                  ne = 3; indirect(1)=2;indirect(2)=3; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(2)+ptInteg(3)); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(2) = phi_(1);tab(ne)(3) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  break;
         		}
         	  case 4:// dans le cas 4 noeuds
         		{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
         		  // -- le deux premiers noeuds, on utilise les deux premiers points d'intégration
                  indirect(1)=1;indirect(2)=2; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine 
                  for (int ne = 1; ne <= 2; ne++)
                   { ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                     tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
                     indir(ne).Change_taille(2); 
                     indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
                   };
         		  // -- le deux derniers noeuds, on utilise les deux derniers points d'intégration
                  indirect(1)=2;indirect(2)=3; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(2)+ptInteg(3)); // def de l'origine 
                  for (int ne = 2; ne <= 3; ne++)
                   { ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                     tab(ne)(2) = phi_(1);tab(ne)(3) = phi_(2);
                     indir(ne).Change_taille(2); 
                     indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
                   };
                  break;
         		}
         	  default:
         	    { cout << "\n erreur le nombre de noeud demande :" << NBNE <<"n\'est pas implante "
                       << "\nGeomSeg::Calcul_extrapol(..";
                  Sortie(1);
                };
         	};
          break;  
   	 	}  // fin du cas avec 3 pt d'intégration
   	 case 4:
   	   { // cas avec 4 points d'intégration  
         // on extrapole linéairement vers les  noeuds en considérant à chaque fois les 2 pt d'intégration les + proches
         switch (NBNE)
         	{ case 2: // deux noeuds, 
         		{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
         		  // -- le premier noeud
                  int ne = 1; indirect(1)=1;indirect(2)=2; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  // -- le second noeud
                  ne = 2; indirect(1)=3;indirect(2)=4; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(3)+ptInteg(4)) ; // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(3) = phi_(1);tab(ne)(4) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  break;
         		}
         	  case 3: // trois noeuds, 
         		{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
         		  // -- le premier noeud
                  int ne = 1; indirect(1)=1;indirect(2)=2; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  // -- le second noeud = entre les pt d'integ 2 et 3
                  ne = 2; indirect(1)=2;indirect(2)=3; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(2)+ptInteg(3)); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(2) = phi_(1);tab(ne)(3) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
        		  // -- le troisième noeud 
                  ne = 3; indirect(1)=3;indirect(2)=4; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(3)+ptInteg(4)); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(3) = phi_(1);tab(ne)(4) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  break;
         		}
         	  case 4:// dans le cas 4 noeuds
         		{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
         		  // -- le deux premiers noeuds, on utilise les deux premiers points d'intégration
                  indirect(1)=1;indirect(2)=2; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine 
                  for (int ne = 1; ne <= 2; ne++)
                   { ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                     tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
                     indir(ne).Change_taille(2); 
                     indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
                   };
         		  // -- le deux derniers noeuds, on utilise les deux derniers points d'intégration
                  indirect(1)=3;indirect(2)=4; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(3)+ptInteg(4)); // def de l'origine 
                  for (int ne = 3; ne <= 4; ne++)
                   { ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                     tab(ne)(3) = phi_(1);tab(ne)(4) = phi_(2);
                     indir(ne).Change_taille(2); 
                     indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
                   };
         	      break;
         		}
         	  default:
         	    { cout << "\n erreur le nombre de noeud demande :" << NBNE <<"n\'est pas implante "
                       << "\nGeomSeg::Calcul_extrapol(..";
                  Sortie(1);
                };
         	};
          break;  
   	 	}  // fin du cas avec 4 pt d'intégration
   	 case 5:
   	   { // cas avec 5 points d'intégration  
         // on extrapole linéairement vers les  noeuds en considérant à chaque fois les 2 pt d'intégration les + proches
         switch (NBNE)
         	{ case 2: // deux noeuds, 
         		{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
         		  // -- le premier noeud
                  int ne = 1; indirect(1)=1;indirect(2)=2; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  // -- le second noeud
                  ne = 2; indirect(1)=4;indirect(2)=5; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(4)+ptInteg(5)); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(4) = phi_(1);tab(ne)(5) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  break;
         		}
         	  case 3: // trois noeuds, 
         		{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
         		  // -- le premier noeud
                  int ne = 1; indirect(1)=1;indirect(2)=2; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  // -- le second noeud = le 3 pt d'integ
                  ne = 2; 
                  tab(ne)(3) = 1.; 
                  indir(ne).Change_taille(1); 
                  indir(ne)(1)=3;
        		  // -- le troisième noeud 
                  ne = 3; indirect(1)=4;indirect(2)=5; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(4)+ptInteg(5)); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(4) = phi_(1);tab(ne)(5) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  break;
         		}
         	  case 4:// dans le cas 4 noeuds
         		{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
         		  // -- le deux premiers noeuds, on utilise les deux premiers points d'intégration
                  indirect(1)=1;indirect(2)=2; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine 
                  for (int ne = 1; ne <= 2; ne++)
                   { ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                     tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
                     indir(ne).Change_taille(2); 
                     indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
                   };
         		  // -- le deux derniers noeuds, on utilise les deux derniers points d'intégration
                  indirect(1)=3;indirect(2)=4; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(4)+ptInteg(5)); // def de l'origine 
                  for (int ne = 3; ne <= 4; ne++)
                   { ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                     tab(ne)(4) = phi_(1);tab(ne)(5) = phi_(2);
                     indir(ne).Change_taille(2); 
                     indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
                   };
                  break; 
         		};
         	  default:
         	    { cout << "\n erreur le nombre de noeud demande :" << NBNE <<"n\'est pas implante "
                       << "\nGeomSeg::Calcul_extrapol(..";
                  Sortie(1);
                };
         	};
          break;  
   	 	}  // fin du cas avec 5 pt d'intégration
   	 case 6:
   	   { // cas avec 6 points d'intégration  
         // on extrapole linéairement vers les  noeuds en considérant à chaque fois les 2 pt d'intégration les + proches
         switch (NBNE)
         	{ case 2: // deux noeuds, 
         		{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
         		  // -- le premier noeud
                  int ne = 1; indirect(1)=1;indirect(2)=2; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  // -- le second noeud
                  ne = 2; indirect(1)=5;indirect(2)=6; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(5)+ptInteg(6)); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(5) = phi_(1);tab(ne)(6) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  break;
         		}
         	  case 3: // trois noeuds, 
         		{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
         		  // -- le premier noeud
                  int ne = 1; indirect(1)=1;indirect(2)=2; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  // -- le second noeud = le milieu du 3 ième et 4 ième noeud
                  ne = 2; indirect(1)=3;indirect(2)=4; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(3)+ptInteg(4)); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(3) = phi_(1);tab(ne)(4) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
        		  // -- le troisième noeud 
                  ne = 3; indirect(1)=5;indirect(2)=6; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(5)+ptInteg(6)); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(5) = phi_(1);tab(ne)(6) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  break;
         		}
         	  case 4:// dans le cas 4 noeuds
         		{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
         		  // -- le premier noeud
                  int ne = 1; indirect(1)=1;indirect(2)=2; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  // -- le second noeud = entre le 2 ième et le 3 ième noeud
                  ne = 2; indirect(1)=2;indirect(2)=3; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(2)+ptInteg(3)); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(2) = phi_(1);tab(ne)(3) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
        		  // -- le troisième noeud : entre les pt d'integ 4 et 5
                  ne = 3; indirect(1)=4;indirect(2)=5; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(4)+ptInteg(5)); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(4) = phi_(1);tab(ne)(5) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
        		  // -- le quatrième noeud : extérieur de 5 et 6 
                  ne = 4; indirect(1)=5;indirect(2)=6; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(5)+ptInteg(6)); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(5) = phi_(1);tab(ne)(6) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		}
         		break;
         	  default:
         	    { cout << "\n erreur le nombre de noeud demande :" << NBNE <<"n\'est pas implante "
                       << "\nGeomSeg::Calcul_extrapol(..";
                  Sortie(1);
                };
         	};
        break;  
   	   }// fin du cas avec 6 pt d'intégration
   	 case 7:
   	   { // cas avec 7 points d'intégration  
         // on extrapole linéairement vers les  noeuds en considérant à chaque fois les 2 pt d'intégration les + proches
         switch (NBNE)
         	{ case 2: // deux noeuds, 
         		{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
         		  // -- le premier noeud
                  int ne = 1; indirect(1)=1;indirect(2)=2; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  // -- le second noeud
                  ne = 2; indirect(1)=6;indirect(2)=7; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(6)+ptInteg(7)); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(6) = phi_(1);tab(ne)(7) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  break;
         		}
         	  case 3: // trois noeuds, 
         		{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
         		  // -- le premier noeud
                  int ne = 1; indirect(1)=1;indirect(2)=2; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  // -- le second noeud = le pt d'integ 4
                  ne = 2; tab(ne)(4) = 1;
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
        		  // -- le troisième noeud 
                  ne = 3; indirect(1)=6;indirect(2)=7; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(6)+ptInteg(7)); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(6) = phi_(1);tab(ne)(7) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  break;
         		}
         	  case 4:// dans le cas 4 noeuds
         		{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
         		  // -- le premier noeud
                  int ne = 1; indirect(1)=1;indirect(2)=2; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  // -- le second noeud = entre le 3 ième et le 4 ième noeud
                  ne = 2; indirect(1)=3;indirect(2)=4; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(3)+ptInteg(4)); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(3) = phi_(1);tab(ne)(4) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
        		  // -- le troisième noeud : entre les pt d'integ 4 et 5
                  ne = 3; indirect(1)=4;indirect(2)=5; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(4)+ptInteg(5)); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(4) = phi_(1);tab(ne)(5) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
        		  // -- le quatrième noeud : extérieur de 6 et 7 
                  ne = 4; indirect(1)=6;indirect(2)=7; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(6)+ptInteg(7)); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(6) = phi_(1);tab(ne)(7) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		}
         		break;
         	  default:
         	    { cout << "\n erreur le nombre de noeud demande :" << NBNE <<"n\'est pas implante "
                       << "\nGeomSeg::Calcul_extrapol(..";
                  Sortie(1);
                };
         	};
        break;  
   	   }// fin du cas avec 7 pt d'intégration
   	 case 8:
   	   { // cas avec 8 points d'intégration  
         // on extrapole linéairement vers les  noeuds en considérant à chaque fois les 2 pt d'intégration les + proches
         int n1,n2;
         switch (NBNE)
         	{ case 2: // deux noeuds, 
         		{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
         		  // -- le premier noeud
                  int ne = 1; indirect(1)=1;indirect(2)=2; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  // -- le second noeud
                  ne = 2; n1=7;n2=8;indirect(1)=n1;indirect(2)=n2;
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  break;
         		}
         	  case 3: // trois noeuds, 
         		{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
         		  // -- le premier noeud
                  int ne = 1; indirect(1)=1;indirect(2)=2; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);                  
          		  // -- le second noeud = entre le 4 ième et le 5 ième pti
                  ne = 2; n1=4;n2=5;indirect(1)=n1;indirect(2)=n2;
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
       		      // -- le troisième noeud 
                  ne = 3;n1=7;n2=8;indirect(1)=n1;indirect(2)=n2;
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  break;
         		}
         	  case 4:// dans le cas 4 noeuds
         		{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
         		  // -- le premier noeud
                  int ne = 1; indirect(1)=1;indirect(2)=2; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  // -- le second noeud = entre le 3 ième et le 4 ième noeud
                  ne = 2; n1=3;n2=4;indirect(1)=n1;indirect(2)=n2;
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
        		  // -- le troisième noeud : entre les pt d'integ 5 et 6
                  ne = 3;n1=5;n2=6;indirect(1)=n1;indirect(2)=n2;
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
        		  // -- le quatrième noeud : extérieur de 7 et 8 
                  ne = 4;n1=7;n2=8;indirect(1)=n1;indirect(2)=n2;
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		}
         		break;
         	  default:
         	    { cout << "\n erreur le nombre de noeud demande :" << NBNE <<"n\'est pas implante "
                       << "\nGeomSeg::Calcul_extrapol(..";
                  Sortie(1);
                };
         	};
        break;  
   	   }// fin du cas avec 8 pt d'intégration
   	 case 10:
   	   { // cas avec 10 points d'intégration  
         // on extrapole linéairement vers les  noeuds en considérant à chaque fois les 2 pt d'intégration les + proches
         int n1,n2;
         switch (NBNE)
         	{ case 2: // deux noeuds, 
         		{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
         		  // -- le premier noeud
                  int ne = 1; indirect(1)=1;indirect(2)=2; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  // -- le second noeud
                  ne = 2; n1=9;n2=10;indirect(1)=n1;indirect(2)=n2;
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  break;
         		}
         	  case 3: // trois noeuds, 
         		{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
         		  // -- le premier noeud
                  int ne = 1; indirect(1)=1;indirect(2)=2; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);                  
          		  // -- le second noeud = entre le 5 ième et le 6 ième pti
                  ne = 2; n1=5;n2=6;indirect(1)=n1;indirect(2)=n2;
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
       		      // -- le troisième noeud 
                  ne = 3; n1=9;n2=10;indirect(1)=n1;indirect(2)=n2;
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  break;
         		}
         	  case 4:// dans le cas 4 noeuds
         		{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
         		  // -- le premier noeud
                  int ne = 1; indirect(1)=1;indirect(2)=2; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  // -- le second noeud = entre le 4 ième et le 5 ième noeud
                  ne = 2; n1=4;n2=5;indirect(1)=n1;indirect(2)=n2;
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
        		  // -- le troisième noeud : entre les pt d'integ 6 et 7
                  ne = 3; n1=6;n2=7;indirect(1)=n1;indirect(2)=n2;
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
        		  // -- le quatrième noeud : extérieur de 9 et 10
                  ne = 4; n1=9;n2=10;indirect(1)=n1;indirect(2)=n2;
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		}
         		break;
         	  default:
         	    { cout << "\n erreur le nombre de noeud demande :" << NBNE <<"n\'est pas implante "
                       << "\nGeomSeg::Calcul_extrapol(..";
                  Sortie(1);
                };
         	};
        break;  
   	   }// fin du cas avec 10 pt d'intégration
   	 case 12:
   	   { // cas avec 12 points d'intégration  
         // on extrapole linéairement vers les  noeuds en considérant à chaque fois les 2 pt d'intégration les + proches
         switch (NBNE)
         	{ case 2: // deux noeuds, 
         		{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
         		  // -- le premier noeud
                  int ne = 1; indirect(1)=1;indirect(2)=2; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  // -- le second noeud
                  ne = 2; indirect(1)=11;indirect(2)=12;
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(11)+ptInteg(12)); // def de l'origine
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(11) = phi_(1);tab(ne)(12) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  break;
         		}
         	  case 3: // trois noeuds, 
         		{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
         		  // -- le premier noeud
                  int ne = 1; indirect(1)=1;indirect(2)=2; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);                  
          		  // -- le second noeud = entre le 6 ième et le 7 ième pti
                  ne = 2; indirect(1)=6;indirect(2)=7;
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(6)+ptInteg(7)); // def de l'origine
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(6) = phi_(1);tab(ne)(7) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
       		      // -- le troisième noeud 
                  ne = 3; indirect(1)=11;indirect(2)=12;
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(11)+ptInteg(12)); // def de l'origine
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(11) = phi_(1);tab(ne)(12) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  break;
         		}
         	  case 4:// dans le cas 4 noeuds
         		{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
                  int n1,n2;
         		  // -- le premier noeud
                  int ne = 1; indirect(1)=1;indirect(2)=2; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  // -- le second noeud = entre le 5 ième et le 6 ième noeud
                  ne = 2; n1=5;n2=6;indirect(1)=n1;indirect(2)=n2;
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
        		  // -- le troisième noeud : entre les pt d'integ 7 et 8
                  ne = 3; n1=7;n2=8;indirect(1)=n1;indirect(2)=n2;
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
        		  // -- le quatrième noeud : extérieur de 7 et 8 
                  ne = 4; n1=11;n2=12;indirect(1)=n1;indirect(2)=n2;
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		}
         		break;
         	  default:
         	    { cout << "\n erreur le nombre de noeud demande :" << NBNE <<"n\'est pas implante "
                       << "\nGeomSeg::Calcul_extrapol(..";
                  Sortie(1);
                };
         	};
        break;  
   	   }// fin du cas avec 12 pt d'intégration
   	 case 14:
   	   { // cas avec 8 points d'intégration  
         // on extrapole linéairement vers les  noeuds en considérant à chaque fois les 2 pt d'intégration les + proches
         int n1,n2;
         switch (NBNE)
         	{ case 2: // deux noeuds, 
         		{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
         		  // -- le premier noeud
                  int ne = 1; indirect(1)=1;indirect(2)=2; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  // -- le second noeud
                  ne = 2; n1=13;n2=14;indirect(1)=n1;indirect(2)=n2;
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  break;
         		}
         	  case 3: // trois noeuds, 
         		{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
         		  // -- le premier noeud
                  int ne = 1; indirect(1)=1;indirect(2)=2; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);                  
          		  // -- le second noeud = entre le 7 ième et le 8 ième pti
                  ne = 2; n1=7;n2=8;indirect(1)=n1;indirect(2)=n2;
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
       		      // -- le troisième noeud 
                  ne = 3; n1=13;n2=14;indirect(1)=n1;indirect(2)=n2;
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  break;
         		}
         	  case 4:// dans le cas 4 noeuds
         		{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
         		  // -- le premier noeud
                  int ne = 1; indirect(1)=1;indirect(2)=2; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  // -- le second noeud = entre le 6 ième et le 7 ième noeud
                  ne = 2; n1=6;n2=7;indirect(1)=n1;indirect(2)=n2;
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
        		  // -- le troisième noeud : entre les pt d'integ 8 et 9
                  ne = 3; n1=8;n2=9;indirect(1)=n1;indirect(2)=n2;
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
        		  // -- le quatrième noeud : extérieur de 13 et 14 
                  ne = 4; n1=13;n2=14;indirect(1)=n1;indirect(2)=n2;
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		}
         		break;
         	  default:
         	    { cout << "\n erreur le nombre de noeud demande :" << NBNE <<"n\'est pas implante "
                       << "\nGeomSeg::Calcul_extrapol(..";
                  Sortie(1);
                };
         	};
        break;  
   	   }// fin du cas avec 14 pt d'intégration
   	 case 16:
   	   { // cas avec 8 points d'intégration  
         // on extrapole linéairement vers les  noeuds en considérant à chaque fois les 2 pt d'intégration les + proches
         int n1,n2;
         switch (NBNE)
         	{ case 2: // deux noeuds, 
         		{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
         		  // -- le premier noeud
                  int ne = 1; indirect(1)=1;indirect(2)=2; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  // -- le second noeud
                  ne = 2; n1=15;n2=16;indirect(1)=n1;indirect(2)=n2;
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  break;
         		}
         	  case 3: // trois noeuds, 
         		{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
         		  // -- le premier noeud
                  int ne = 1; indirect(1)=1;indirect(2)=2; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);                  
          		  // -- le second noeud = entre le 8 ième et le 9 ième pti
                  ne = 2; n1=8;n2=9;indirect(1)=n1;indirect(2)=n2;
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
       		      // -- le troisième noeud 
                  ne = 3; n1=15;n2=16;indirect(1)=n1;indirect(2)=n2;
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  break;
         		}
         	  case 4:// dans le cas 4 noeuds
         		{ // pour chaque noeuds on extrapole linéairement les deux pt d'integ les plus près
         		  // -- le premier noeud
                  int ne = 1; indirect(1)=1;indirect(2)=2; 
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  Coordonnee O(0.5*(ptInteg(1)+ptInteg(2))); // def de l'origine 
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(1) = phi_(1);tab(ne)(2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		  // -- le second noeud = entre le 6 ième et le 7 ième pti
                  ne = 2; n1=6;n2=7;indirect(1)=n1;indirect(2)=n2;
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
        		  // -- le troisième noeud : entre les pt d'integ 10 et 11
                  ne = 3; n1=10;n2=11;indirect(1)=n1;indirect(2)=n2;
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
        		  // -- le quatrième noeud : extérieur de 7 et 8 
                  ne = 4; n1=15;n2=16;indirect(1)=n1;indirect(2)=n2;
                  Bases_naturel_duales(indirect,gi_B,gi_H);
                  O = 0.5*(ptInteg(n1)+ptInteg(n2)); // def de l'origine
                  ElemGeomC0::Coor_phi(O,gi_H,ptelem(ne),phi_,theta);
                  tab(ne)(n1) = phi_(1);tab(ne)(n2) = phi_(2);
                  indir(ne).Change_taille(2); 
                  indir(ne)(1)=indirect(1);indir(ne)(2)=indirect(2);
         		}
         		break;
         	  default:
         	    { cout << "\n erreur le nombre de noeud demande :" << NBNE <<"n\'est pas implante "
                       << "\nGeomSeg::Calcul_extrapol(..";
                  Sortie(1);
                };
         	};
        break;  
   	   }// fin du cas avec 8 pt d'intégration
          
     default:
       { cout << "\n erreur le nombre de point d'integration demande :" << nbi <<"n\'est pas implante "
              << "\nGeomSeg::Calcul_extrapol(..";
         Sortie(1);
       };
   };
  }
  else if (id_type_pt_integ == PTI_GAUSS_LOBATTO)
   // dans le cas des points de gauss lobatto, le premier et le dernier sont exactement positionné sur le premier et dernier noeud
  { switch (NBNE)
      { case 2: // deux noeuds, 
      	{ // pour chaque noeuds on récupère le  pt d'integ positionné au noeud
      	  // -- le premier noeud
            int ne = 1;
            tab(ne)(1) = 1.;
            indir(ne).Change_taille(1);
            indir(ne)(1)=1;
      	  // -- le second noeud
            ne = 2;
            tab(ne)(1) = 1.;
            indir(ne).Change_taille(1);
            indir(ne)(1)= nbi ;
      	  break;
      	}
        default:
          { cout << "\n erreur le nombre de noeud demande :" << NBNE
                 <<"n\'est pas implante pour le type de point d'integration gauss lobatto"
                 << "\nGeomSeg::Calcul_extrapol(..";
            Sortie(1);
          };
      };
  };

}; 
        
//----------------------------- construction des poids et positions pour l'intégration de Gauss Lobatto ---------  
  
GeomSeg::Construire_Gauss_Lobatto::Construire_Gauss_Lobatto()
{ // a priori on va jusqu'à 16 points
  ksi_gl.Change_taille(16);
  wi_gl.Change_taille(16);
  // cas de 2 points
 {int nbpt = 2; 
  ksi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& ksigl = ksi_gl(nbpt-1);
  wi_gl(nbpt-1).Change_taille(nbpt);  Tableau <double >& wigl = wi_gl(nbpt-1);
  ksigl(1) = -1.;  wigl(1) = 1.;
  ksigl(2) =  1.;  wigl(2) = 1.;
  }
  // cas de 3 points
 {int nbpt = 3; 
  ksi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& ksigl = ksi_gl(nbpt-1);
  wi_gl(nbpt-1).Change_taille(nbpt);  Tableau <double >& wigl = wi_gl(nbpt-1);
  ksigl(1) = -1.;  wigl(1) = 1./3.;
  ksigl(2) =  0.;  wigl(2) = 4./3.;
  ksigl(3) =  1.;  wigl(3) = 1./3.;
  }
  // cas de 4 points
 {int nbpt = 4; 
  ksi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& ksigl = ksi_gl(nbpt-1);
  wi_gl(nbpt-1).Change_taille(nbpt);  Tableau <double >& wigl = wi_gl(nbpt-1);
  ksigl(1) = -1.;							 wigl(1) = 2./(nbpt * (nbpt - 1));
  ksigl(2) =  -4.472135954999580e-01;   wigl(2) = 8.33333333333333333333333e-01;
  ksigl(3) =   4.472135954999580e-01;   wigl(3) = 8.33333333333333333333333e-01;
  ksigl(4) =  1.;							  wigl(4) = 2./(nbpt * (nbpt - 1));
  }
  // cas de 5 points
 {int nbpt = 5; 
  ksi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& ksigl = ksi_gl(nbpt-1);
  wi_gl(nbpt-1).Change_taille(nbpt);  Tableau <double >& wigl = wi_gl(nbpt-1);
  ksigl(1) = -1.;							 wigl(1) = 2./(nbpt * (nbpt - 1));
  ksigl(2) =  -6.546536707079772e-01;   wigl(2) = 5.4444444444444444444444444e-01;
  ksigl(3) =   0.;							 wigl(3) = 7.1111111111111111111111111e-01;
  ksigl(4) =   6.546536707079772e-01;   wigl(4) = 5.4444444444444444444444444e-01;
  ksigl(5) =  1.;							 wigl(5) = 2./(nbpt * (nbpt - 1));
  }
  // cas de 6 points
 {int nbpt = 6; 
  ksi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& ksigl = ksi_gl(nbpt-1);
  wi_gl(nbpt-1).Change_taille(nbpt);  Tableau <double >& wigl = wi_gl(nbpt-1);
  ksigl(1) = -1.;							 wigl(1) = 2./(nbpt * (nbpt - 1));
  ksigl(2) =  -7.650553239294655e-01;   wigl(2) = 3.784749562978474e-01;
  ksigl(3) =  -2.852315164806451e-01;	 wigl(3) = 5.548583770354862e-01;
  ksigl(4) =   2.852315164806451e-01;   wigl(4) = 5.548583770354862e-01;
  ksigl(5) =   7.650553239294655e-01;   wigl(5) = 3.784749562978474e-01;
  ksigl(6) =  1.;							 wigl(6) = 2./(nbpt * (nbpt - 1));
  }
  // cas de 7 points
 {int nbpt = 7; 
  ksi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& ksigl = ksi_gl(nbpt-1);
  wi_gl(nbpt-1).Change_taille(nbpt);  Tableau <double >& wigl = wi_gl(nbpt-1);
  ksigl(7) =  1.;							 wigl(7) = 2./(nbpt * (nbpt - 1));
  ksigl(6) =   8.302238962785669e-01;   wigl(6) = 2.768260473615680e-01;
  ksigl(5) =   4.688487934707141e-01;   wigl(5) = 4.317453812098623e-01;
  ksigl(4) =   0.;							 wigl(4) = 4.876190476190476e-01;
  ksigl(3) =  -ksigl(5);					 wigl(3) = wigl(5);
  ksigl(2) =  -ksigl(6);					 wigl(2) = wigl(6);
  ksigl(1) =  -ksigl(7);					 wigl(1) = wigl(7);
  }
  // cas de 8 points
 {int nbpt = 8; 
  ksi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& ksigl = ksi_gl(nbpt-1);
  wi_gl(nbpt-1).Change_taille(nbpt);  Tableau <double >& wigl = wi_gl(nbpt-1);
  ksigl(5) =   2.092992179024789e-01;   wigl(5) = 4.124587946587041e-01;
  ksigl(6) =   5.917001814331432e-01;	 wigl(6) = 3.411226924835035e-01;
  ksigl(7) =   8.717401485096070e-01;	 wigl(7) = 2.107042271435098e-01;
  ksigl(8) =   1.;							 wigl(8) = 2./(nbpt * (nbpt - 1));

  ksigl(1) =  -ksigl(5);					wigl(1) = wigl(5);
  ksigl(2) =  -ksigl(6);					wigl(2) = wigl(6);
  ksigl(3) =  -ksigl(7);					wigl(3) = wigl(7);
  ksigl(4) =  -ksigl(8);					wigl(4) = wigl(8);

  }
  // cas de 9 points
 {int nbpt = 9; 
  ksi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& ksigl = ksi_gl(nbpt-1);
  wi_gl(nbpt-1).Change_taille(nbpt);  Tableau <double >& wigl = wi_gl(nbpt-1);
  ksigl(5) =   0.;    					 wigl(5) = 3.715192743764172e-01;
  ksigl(6) =   3.631174638261781e-01;   wigl(6) = 3.464285109730465e-01;
  ksigl(7) =   6.771862795107376e-01;	 wigl(7) = 2.745387125001594e-01;
  ksigl(8) =   8.997579954114603e-01;	 wigl(8) = 1.654953615608145e-01;
  ksigl(9) =   1.;							 wigl(9) = 2./(nbpt * (nbpt - 1));

  ksigl(1) =  -ksigl(6);					wigl(1) = wigl(6);
  ksigl(2) =  -ksigl(7);					wigl(2) = wigl(7);
  ksigl(3) =  -ksigl(8);					wigl(3) = wigl(8);
  ksigl(4) =  -ksigl(9);					wigl(4) = wigl(9);
  }
  // cas de 10 points
 {int nbpt = 10; 
  ksi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& ksigl = ksi_gl(nbpt-1);
  wi_gl(nbpt-1).Change_taille(nbpt);  Tableau <double >& wigl = wi_gl(nbpt-1);
  ksigl(6) =   1.652789576663870e-01;   wigl(6) = 3.275397611838975e-01;
  ksigl(7) =   4.779249498104443e-01;	 wigl(7) = 2.920426836796842e-01;
  ksigl(8) =   7.387738651055066e-01;	 wigl(8) = 2.248893420631201e-01;
  ksigl(9) =   9.195339081664590e-01;	 wigl(9) = 1.333059908510840e-01;
  ksigl(10) =  1.;							 wigl(10) = 2./(nbpt * (nbpt - 1));

  ksigl(1) =  -ksigl(6);					wigl(1) = wigl(6);
  ksigl(2) =  -ksigl(7);					wigl(2) = wigl(7);
  ksigl(3) =  -ksigl(8);					wigl(3) = wigl(8);
  ksigl(4) =  -ksigl(9);					wigl(4) = wigl(9);
  ksigl(5) =  -ksigl(10);    			wigl(5) = wigl(10);
  }
  // cas de 11 points
 {int nbpt = 11; 
  ksi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& ksigl = ksi_gl(nbpt-1);
  wi_gl(nbpt-1).Change_taille(nbpt);  Tableau <double >& wigl = wi_gl(nbpt-1);
  ksigl(6)  =   0.;    					 wigl(6)   = 3.002175954556907e-01;
  ksigl(7)  =   2.957581355869391e-01;  wigl(7)   = 2.868791247790082e-01;
  ksigl(8)  =   5.652353269962073e-01;	 wigl(8)   = 2.480481042640294e-01;
  ksigl(9)  =   7.844834736631412e-01;	 wigl(9)   = 1.871698817802869e-01;
  ksigl(10) =   9.340014304080602e-01;	 wigl(10)  = 1.096122732670316e-01;
  ksigl(11) =   1.;						 wigl(11)  = 2./(nbpt * (nbpt - 1));

  ksigl(1) =  -ksigl(7) ;				 wigl(1) = wigl(7) ;
  ksigl(2) =  -ksigl(8) ;				 wigl(2) = wigl(8) ;
  ksigl(3) =  -ksigl(9) ;				 wigl(3) = wigl(9) ;
  ksigl(4) =  -ksigl(10);				 wigl(4) = wigl(10);
  ksigl(5) =  -ksigl(11);    			 wigl(5) = wigl(11);
  }
  // cas de 12 points
 {int nbpt = 12; int decal=6;
  ksi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& ksigl = ksi_gl(nbpt-1);
  wi_gl(nbpt-1).Change_taille(nbpt);  Tableau <double >& wigl = wi_gl(nbpt-1);
  ksigl(7)  =   1.365529328549276e-01;  wigl(7)   = 2.714052409106961e-01;
  ksigl(8)  =   3.995309409653499e-01;	 wigl(8)   = 2.512756031992004e-01;
  ksigl(9)  =   6.328761530318588e-01;	 wigl(9)   = 2.125084177610267e-01;
  ksigl(10) =   8.192793216440097e-01;	 wigl(10)  = 1.579747055643515e-01;
  ksigl(11) =   9.448992722228819e-01;	 wigl(11)  = 9.168451741322353e-02;
  ksigl(12) =   1.;						 wigl(12)  = 2./(nbpt * (nbpt - 1));
  
  for (int i=1;i<= nbpt/2;i++)
   {ksigl(i) =  -ksigl(i+decal) ; wigl(i) = wigl(i+decal) ;};
  }
  // cas de 13 points
 {int nbpt = 13; int decal=7;
  ksi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& ksigl = ksi_gl(nbpt-1);
  wi_gl(nbpt-1).Change_taille(nbpt);  Tableau <double >& wigl = wi_gl(nbpt-1);
  ksigl(7)  =   0.;    					 wigl(7)   = 2.519308493334467e-01;
  ksigl(8)  =   2.492869301062400e-01;	 wigl(8)   = 2.440157903066762e-01;
  ksigl(9)  =   4.829098210913346e-01;	 wigl(9)   = 2.207677935661110e-01;
  ksigl(10) =   6.861884690817684e-01;	 wigl(10)  = 1.836468652035536e-01;
  ksigl(11) =   8.463475646518546e-01;	 wigl(11)  = 1.349819266896224e-01;
  ksigl(12) =   9.533098466421709e-01;	 wigl(12)  = 7.780168674687256e-02;
  ksigl(13) =   1.;						 wigl(13)  = 2./(nbpt * (nbpt - 1));
  
  for (int i=1;i<= nbpt/2;i++)
   {ksigl(i) =  -ksigl(i+decal) ; wigl(i) = wigl(i+decal) ;};
  }
  // cas de 14 points
 {int nbpt = 14; int decal=7;
  ksi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& ksigl = ksi_gl(nbpt-1);
  wi_gl(nbpt-1).Change_taille(nbpt);  Tableau <double >& wigl = wi_gl(nbpt-1);
  ksigl(8)  =   1.163318688837039e-01;	 wigl(8)   = 2.316127944684571e-01;
  ksigl(9)  =   3.427240133427127e-01;	 wigl(9)   = 2.191262530097713e-01;
  ksigl(10) =   5.506394029286509e-01;	 wigl(10)  = 1.948261493734101e-01;
  ksigl(11) =   7.288685990913161e-01;	 wigl(11)  = 1.600218517629651e-01;
  ksigl(12) =   8.678010538303477e-01;	 wigl(12)  = 1.165866558987275e-01;
  ksigl(13) =   9.599350452672649e-01;	 wigl(13)  = 6.683728449778241e-02;
  ksigl(14) =   1.;						 wigl(14)  = 2./(nbpt * (nbpt - 1));
  
  for (int i=1;i<= nbpt/2;i++)
   {ksigl(i) =  -ksigl(i+decal) ; wigl(i) = wigl(i+decal) ;};
  }
  // cas de 15 points
 {int nbpt = 15; int decal=8;
  ksi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& ksigl = ksi_gl(nbpt-1);
  wi_gl(nbpt-1).Change_taille(nbpt);  Tableau <double >& wigl = wi_gl(nbpt-1);
  ksigl(8)  =   0.;    					 wigl(8)   = 2.170481163488157e-01;
  ksigl(9)  =   2.153539553637941e-01;	 wigl(9)   = 2.119735859268208e-01;
  ksigl(10) =   4.206380547136734e-01;	 wigl(10)  = 1.969872359646122e-01;
  ksigl(11) =   6.062532054698444e-01;	 wigl(11)  = 1.727896472536003e-01;
  ksigl(12) =   7.635196899518153e-01;	 wigl(12)  = 1.405116998024270e-01;
  ksigl(13) =   8.850820442229764e-01;	 wigl(13)  = 1.016600703256791e-01;
  ksigl(14) =   9.652459265038381e-01;	 wigl(14)  = 5.802989302866641e-02;
  ksigl(15) =   1.;						 wigl(15)  = 2./(nbpt * (nbpt - 1));
  
  for (int i=1;i<= nbpt/2;i++)
   {ksigl(i) =  -ksigl(i+decal) ; wigl(i) = wigl(i+decal) ;};
  }
  // cas de 16 points
 {int nbpt = 16; int decal=8;
  ksi_gl(nbpt-1).Change_taille(nbpt); Tableau <double >& ksigl = ksi_gl(nbpt-1);
  wi_gl(nbpt-1).Change_taille(nbpt);  Tableau <double >& wigl = wi_gl(nbpt-1);
  ksigl(9)  =   1.013262735219495e-01;	 wigl(9)   = 2.019583081782299e-01;
  ksigl(10) =   2.998304689007628e-01;	 wigl(10)  = 1.936900238252040e-01;
  ksigl(11) =   4.860594218871320e-01;	 wigl(11)  = 1.774919133917017e-01;
  ksigl(12) =   6.523887028825278e-01;	 wigl(12)  = 1.540269808071386e-01;
  ksigl(13) =   7.920082918617235e-01;	 wigl(13)  = 1.242553821325850e-01;
  ksigl(14) =   8.992005330935808e-01;	 wigl(14)  = 8.939369732589475e-02;
  ksigl(15) =   9.695680462701730e-01;	 wigl(15)  = 5.085036100571246e-02;
  ksigl(16) =   1.;						 wigl(16)  = 2./(nbpt * (nbpt - 1));
  
  for (int i=1;i<= nbpt/2;i++)
   {ksigl(i) =  -ksigl(i+decal) ; wigl(i) = wigl(i+decal) ;};
  }
};  
  
