
// 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 "Met_Sfe1.h"   
# include "Util.h"

//  =========================================================================================
//  vu la taille des executables le fichier est decompose en quatre
// le premier : Met_Sfe1s1.cp concerne les constructeurs, destructeur et 
//              la gestion des variables
// le second :  Met_Sfe1s2.cp concerne  le calcul des grandeurs publics
// le troisieme : Met_Sfe1s3.cp concerne  le calcul des grandeurs protegees, et des courbures pour SFE1 et SFE2 et QSFE1
// le quatrième : Met_Sfe1s4.cp concerne  le calcul des courbures pour les éléments SFE3 et QSFE3
//  =========================================================================================

// ----------- déclaration des variables statiques ---------------------------
Tableau <int> Met_Sfe1::indi;
// indicateur utilisé par Verif_Dcourbure 
int Met_Sfe1::indic_Verif_DcourbureSFE = 0;        
// ----------- fin de déclaration des variables statiques --------------------

Met_Sfe1::Met_Sfe1 () : // constructeur par defaut mettant les pointeurs a NULL
  Met_abstraite(), Ia(3),
  curb_0(),curb_t(),curb_tdt(), dcurb_t(),dcurb_tdt() 
  ,norme_N_t(0.), norme_N_tdt(0.)
  ,N_0(ParaGlob::Dimension()),N_t(ParaGlob::Dimension()),N_tdt(ParaGlob::Dimension())
  ,N_alpha_0_1(ParaGlob::Dimension()),N_alpha_0_2(ParaGlob::Dimension())
  ,N_alpha_t_1(ParaGlob::Dimension()),N_alpha_t_2(ParaGlob::Dimension())
  ,N_alpha_tdt_1(ParaGlob::Dimension()),N_alpha_tdt_2(ParaGlob::Dimension())
  ,d_aijBB_t(),d_aijBB_tdt(),d_aijHH_t(),d_aijHH_tdt(),d_ajacobien_t(),d_ajacobien_tdt()
  ,nbNoeudCentral(0),tCalEpais(0),epais(),d_epais(NULL),PtCourbure(NULL),PtDcourbure(NULL)
  ,PtTest_courbure_anormale(NULL)
  ,type_calcul_jacobien(1)
  		{  P0 = NULL; Pt = NULL; Ptdt = NULL;
		   aiB_0 = NULL;aiB_t = NULL; aiB_tdt = NULL;
		   aiH_0 = NULL;aiH_t = NULL;aiH_tdt = NULL;
		   aijBB_0 = NULL;aijBB_t = NULL;aijBB_tdt = NULL;
		   aijHH_0 = NULL;aijHH_t = NULL;aijHH_tdt = NULL;
		   d_aiB_t = NULL;d_N_t=NULL;d_N_alpha_t_1=NULL;d_N_alpha_t_2=NULL;
		   d_aiB_tdt = NULL;d_N_tdt=NULL;d_N_alpha_tdt_1=NULL;d_N_alpha_tdt_2=NULL;
		   d_aiH_t = NULL;d_aiH_tdt = NULL;
		   // def de Ia
		   for (int ii=1;ii<=3;ii++)
		       Ia(ii)(ii) = 1.;
		   if (indi.Taille() != 5)    // tableau indi
            { indi.Change_taille(5);indi(1) = 1; indi(2) = 2; indi(3) = 3; indi(4) = 1; indi(5) = 2;};
		   // pour la courbure, par défaut SFE1
		   PtCourbure = &Met_Sfe1::Courbure2;
		   PtDcourbure = &Met_Sfe1::Dcourbure2;
     PtTest_courbure_anormale = &Met_Sfe1::Test_courbure_anormale2;
		   Init_conteneur_de_retour_pourFacette(); // Init des conteneurs de retour de fonction
		};  
	    // constructeur permettant de dimensionner uniquement certaine variables
	    // dim = dimension de l'espace, ici forcément = 3
	    //  nbvec = nb de vecteur des bases, tab = liste des variables a initialiser
Met_Sfe1::Met_Sfe1 ( const DdlElement& tabddl,int nbvec
	                 ,const  Tableau<Enum_variable_metrique>& tabb, Enum_interpol enui
	                 ,int nb_noeud_central):
	    Met_abstraite(3,nbvec,tabddl,tabb,nb_noeud_central,(nbvec==3 ? nb_noeud_central : 0))
	    ,Ia(3), // dimension 3 et nombre de vecteur 
	    // et nb_noeud_central noeuds central
     curb_0(),curb_t(),curb_tdt(), dcurb_t(tab_ddl.NbDdl_famille(X1)),dcurb_tdt(tab_ddl.NbDdl_famille(X1))
     ,N_0(ParaGlob::Dimension()),N_t(ParaGlob::Dimension()),N_tdt(ParaGlob::Dimension())
     ,norme_N_t(0.), norme_N_tdt(0.)
     ,N_alpha_0_1(ParaGlob::Dimension()),N_alpha_0_2(ParaGlob::Dimension())
     ,N_alpha_t_1(ParaGlob::Dimension()),N_alpha_t_2(ParaGlob::Dimension())
     ,N_alpha_tdt_1(ParaGlob::Dimension()),N_alpha_tdt_2(ParaGlob::Dimension())
	    ,d_aijBB_t(),d_aijBB_tdt(),d_aijHH_t(),d_aijHH_tdt(),d_ajacobien_t(),d_ajacobien_tdt()
     ,nbNoeudCentral(nb_noeud_central),tCalEpais(nbvec == 3),epais(),d_epais(NULL)
     ,PtCourbure(NULL),PtDcourbure(NULL),PtTest_courbure_anormale(NULL)
     ,type_calcul_jacobien(1)
	    {  AllocSfe1();
		   // def de Ia
		   for (int ii=1;ii<=3;ii++)
		       Ia(ii)(ii) = 1.;
		   if (indi.Taille() != 5)    // tableau indi
            { indi.Change_taille(5);indi(1) = 1; indi(2) = 2; indi(3) = 3; indi(4) = 1; indi(5) = 2;};
		   // pour la courbure
		   switch (enui)
		   	{ case SFE1: case SFE1_3D: case QSFE1 : {PtCourbure = &Met_Sfe1::Courbure2;
               PtDcourbure = &Met_Sfe1::Dcourbure2;
               PtTest_courbure_anormale = &Met_Sfe1::Test_courbure_anormale2;break;}
		   	  case SFE2: case SFE2_3D: {PtCourbure = &Met_Sfe1::Courbure3;
               PtDcourbure = &Met_Sfe1::Dcourbure3;
               PtTest_courbure_anormale = &Met_Sfe1::Test_courbure_anormale3;break;}
		   	  case SFE3: case SFE3_3D: case QSFE3: {PtCourbure = &Met_Sfe1::Courbure4;
               PtDcourbure = &Met_Sfe1::Dcourbure4;
               PtTest_courbure_anormale = &Met_Sfe1::Test_courbure_anormale4;break;}
		   	  case SFE3C: case SFE3C_3D: {PtCourbure = &Met_Sfe1::Courbure4;
               PtDcourbure = &Met_Sfe1::Dcourbure4;
               PtTest_courbure_anormale = &Met_Sfe1::Test_courbure_anormale4;break;}
		   	  default: 
		   	  	{ cout << "\n erreur!!! cas d'interpolation sfe non connu, cas = " 
		   	  	       << Nom_interpol(enui) 
		   	  	       << "\n Met_Sfe1::Met_Sfe1 (..." << endl;
		   	  	  Sortie(1);     
		   	  	};
		   	};
		   Init_conteneur_de_retour_pourFacette(); // Init des conteneurs de retour de fonction
	    };
	    // Constructeur de copie :
Met_Sfe1::Met_Sfe1 ( const  Met_Sfe1& a) :
  Met_abstraite(a), Ia(3)
  ,curb_0(a.curb_0),curb_t(a.curb_t),curb_tdt(a.curb_tdt) 
  ,dcurb_t(a.dcurb_t),dcurb_tdt(a.dcurb_tdt)
  ,N_0(a.N_0),N_t(a.N_t),N_tdt(a.N_tdt),norme_N_t(a.norme_N_t), norme_N_tdt(a.norme_N_tdt)
  ,N_alpha_0_1(a.N_alpha_0_1),N_alpha_0_2(a.N_alpha_0_2)
  ,N_alpha_t_1(a.N_alpha_t_1),N_alpha_t_2(a.N_alpha_t_2)
  ,N_alpha_tdt_1(a.N_alpha_tdt_1),N_alpha_tdt_2(a.N_alpha_tdt_2)
  ,ajacobien_0(a.ajacobien_0) , ajacobien_t(a.ajacobien_t)
  ,ajacobien_tdt(a.ajacobien_tdt), d_aijBB_t() 
  ,d_aijBB_tdt (a.d_aijBB_tdt.Taille()), d_aijHH_t(a.d_aijHH_t.Taille()) 
  ,d_aijHH_tdt (a.d_aijHH_tdt.Taille()), d_ajacobien_t(a.d_ajacobien_t)
  ,d_ajacobien_tdt(a.d_ajacobien_tdt)
  ,nbNoeudCentral(a.nbNoeudCentral),tCalEpais(a.tCalEpais),epais(),d_epais(NULL)
  ,PtCourbure(a.PtCourbure),PtDcourbure(a.PtDcourbure)
  ,PtTest_courbure_anormale(a.PtTest_courbure_anormale)
  ,type_calcul_jacobien(a.type_calcul_jacobien)
  { // on met à NULL les grandeurs pointées
    P0 = NULL; Pt = NULL;d_Pt = NULL; Ptdt = NULL; d_Ptdt = NULL;
    aiB_0 = NULL;aiB_t = NULL; aiB_tdt = NULL;
    aiH_0 = NULL;aiH_t = NULL;aiH_tdt = NULL;
    aijBB_0 = NULL;aijBB_t = NULL;aijBB_tdt = NULL;
    aijHH_0 = NULL;aijHH_t = NULL;aijHH_tdt = NULL;
    d_aiB_t = NULL;  d_N_t=NULL;   d_N_alpha_t_1=NULL;d_N_alpha_t_2=NULL;
    d_aiB_tdt = NULL;d_N_tdt=NULL; d_N_alpha_tdt_1=NULL;d_N_alpha_tdt_2=NULL;
    d_aiH_t = NULL;d_aiH_tdt = NULL;
    // copie des grandeurs pointées
    Copie_metSfe1(a); 
    // def de Ia
    for (int ii=1;ii<=dim_base;ii++)
	   Ia(ii)(ii) = 1.;
	   Init_conteneur_de_retour_pourFacette(); // Init des conteneurs de retour de fonction
  };
  
Met_Sfe1::~Met_Sfe1 ()
		{ DeallocSfe1();
        };
        

    // Surcharge de l'operateur = : realise l'affectation
    // dérivant de virtuel, a ne pas employer -> message d'erreur
Met_abstraite& Met_Sfe1::operator= (const Met_abstraite& )
  {	// normalement ne devrait pas être utilisé
    cout << "\n erreur , l operateur d affectation a utiliser  doit etre celui explicite "
         << " de la classe Met_Sfe1 \n"
         << " Met_abstraite& Met_Sfe1::operator= (const Met_abstraite& met) \n";
    Sortie(1);     
    return (*this);	
   };

	// normale
Met_Sfe1& Met_Sfe1::operator= (const Met_Sfe1& met)
  {	(*this) = Met_abstraite::operator=(met); // partie met_abstraite
   nbNoeudCentral = met.nbNoeudCentral;
   // copie des grandeurs pointées
   Copie_metSfe1(met);
   // copie des grandeurs non pointées
   Ia = met.Ia;
   curb_0 = met.curb_0;curb_t = met.curb_t;curb_tdt = met.curb_tdt;
   dcurb_t = met.dcurb_t;dcurb_tdt = met.dcurb_tdt;
   N_0 = met.N_0;N_t = met.N_t;N_tdt = met.N_tdt;
   norme_N_t=met.norme_N_t; norme_N_tdt=met.norme_N_tdt;
   N_alpha_0_1=met.N_alpha_0_1;N_alpha_0_2=met.N_alpha_0_2;
   N_alpha_t_1=met.N_alpha_t_1;N_alpha_t_2=met.N_alpha_t_2;
   N_alpha_tdt_1=met.N_alpha_tdt_1;N_alpha_tdt_2=met.N_alpha_tdt_2;   
   ajacobien_0 = met.ajacobien_0;ajacobien_t = met.ajacobien_t;ajacobien_tdt = met.ajacobien_tdt;   
   d_ajacobien_t = met.d_ajacobien_t;   d_ajacobien_tdt = met.d_ajacobien_tdt; 
   type_calcul_jacobien = met.type_calcul_jacobien;
   return (*this);
  };

  // affichage minimale des éléments de métrique de base
  void Met_Sfe1::Affiche() const
   { cout << "\n -- 1) info elements de base de la metrique SFE : partie membrane -- ";
     if (aiB_0 != NULL)
      { cout << "\n aiB_0: "; aiB_0->Affiche();};
     if (aiB_t != NULL)
      { cout << "\n aiB_t: "; aiB_t->Affiche();};
     if (aiB_tdt != NULL)
      { cout << "\n aiB_tdt: "; aiB_tdt->Affiche();};
     if (aiH_0 != NULL)
      { cout << "\n aiH_0: "; aiH_0->Affiche();};
     if (aiH_t != NULL)
      { cout << "\n aiH_t: "; aiH_t->Affiche();};
     if (aiH_tdt != NULL)
      { cout << "\n aiH_tdt: "; aiH_tdt->Affiche();};
      
     if (aijBB_0 != NULL)
      { cout << "\n aijBB_0: "; aijBB_0->Ecriture(cout);}
     if (aijBB_t != NULL)
      { cout << "\n aijBB_t: "; aijBB_t->Ecriture(cout);}
     if (aijBB_tdt != NULL)
      { cout << "\n aijBB_tdt: "; aijBB_tdt->Ecriture(cout);}
     if (aijHH_0 != NULL)
      { cout << "\n aijHH_0: "; aijHH_0->Ecriture(cout);}
     if (aijHH_t != NULL)
      { cout << "\n aijHH_t: "; aijHH_t->Ecriture(cout);}
     if (aijHH_tdt != NULL)
      { cout << "\n aijHH_tdt: "; aijHH_tdt->Ecriture(cout);}

     cout << "\n ajacobien_0= "<< ajacobien_0
          << " ajacobien_t= "<< ajacobien_t
          << " ajacobien_tdt= "<< ajacobien_tdt;
          
     cout << "\n courbure_0: "; curb_0.Ecriture(cout);
     cout << "\n courbure_t: "; curb_t.Ecriture(cout);
     cout << "\n courbure_tdt: "; curb_tdt.Ecriture(cout);
     cout << "\n normale_0: " << N_0;
     cout << "\n normale_t: " << N_t;
     cout << "\n normale_tdt: " << N_tdt;
     
     cout << "\n N_0,alpha_1: " << N_alpha_0_1 << " N_0,alpha_2: " << N_alpha_0_2;
     cout << "\n N_t,alpha_1: " << N_alpha_t_1 << " N_t,alpha_2: " << N_alpha_t_2;
     cout << "\n N_tdt,alpha_1: " << N_alpha_tdt_1 << " N_tdt,alpha_2: " << N_alpha_tdt_2;
     cout << "\n epaisseurs: "<< epais;
          
          
          
     cout << "\n -- fin info elements de metrique sfe : partie membrane--" << flush;
     cout << "\n -- 2) info elements de base de la metrique SFE : partie dans l'epaisseur (via la courbure) -- ";
     Met_abstraite::Affiche();
     cout << "\n -- fin info elements de base de la metrique SFE : partie dans l'epaisseur (via la courbure) -- "<<flush;

     
   };

// attribution de l'indicateur de type de calcul de jacobien:
// =1: le jacobien = celui de la facette médiane sans courbure
// =2: le jacobien = celui de la facette médiane + la courbure actuelle
// =3: le jacobien = celui du volume = facette * épaisseur, cas d'une métrique 3D
void Met_Sfe1::ChangeTypeCalculJacobien(int nouveau_type)
 { switch (nouveau_type)
    {case 1: case 2: case 3:  type_calcul_jacobien=nouveau_type; break;
     default:
       cout << "\n erreur a l'affectation du type de calcul de jacobien pour les elements sfe"
            << " le nouveau type demande est " << nouveau_type << " alors que seuls les types 1 2 et 3 "
            << " sont actuellement definis ";
       Sortie(1);
    };
 };
		        		        

//   ------------------------ gestion de la memoire --------------------------  	 	  	
// Changement d'initialisation des differentes variables
void Met_Sfe1::PlusInitVariables(Tableau<Enum_variable_metrique>& tab)
  { // on définit un tableau d'indicateurs pour gérer le tableau tab interne
    int tabtaille = tab.Taille();
    Tableau <bool> tabbool(tabtaille,false);
    // on alloue en fonction des parametres
		  int nbddl_x = tab_ddl.NbDdl_famille(X1); // nombre de ddl en position 
		  int nbddl_v = tab_ddl.NbDdl_famille(V1); // nombre de ddl en vitesse 
		  int nbddlEpais = 0.;
		  if (tCalEpais) nbddlEpais = nbNoeudCentral; // un ddl par noeud central
		  int nbddlDepTot = nbddl_x + nbddlEpais; 
	   // changement de nbddl_sup_xi par les classes dérivées
	   Change_nbddl_sup_xi(nbddlEpais);

	   // on alloue a la classe superieur
	   Met_abstraite::PlusInitVariables(tab);
	      	    
		  if (Existe(tab,iM0) && (P0 == NULL) ) 
		     {P0 = new Coordonnee3(dim_base);tabbool(Existe_num(tab,iM0))=true;}
	   if (Existe(tab,iMt) && (Pt == NULL) )
	      {Pt = new Coordonnee3(dim_base);tabbool(Existe_num(tab,iMt))=true;}
	   if (Existe(tab,idMt) && (d_Pt == NULL) )
	      {Coordonnee3 toto; d_Pt = new Tableau <Coordonnee3> (nbddl_x,toto);
	       tabbool(Existe_num(tab,idMt))=true;}
	   if (Existe(tab,iMtdt) && (Ptdt == NULL) )
	      {Ptdt = new Coordonnee3;tabbool(Existe_num(tab,iMtdt))=true;}
	   if (Existe(tab,idMtdt) && (d_Ptdt == NULL) )
	      {Coordonnee3 toto; d_Ptdt = new Tableau <Coordonnee3> (nbddl_x,toto);
	       tabbool(Existe_num(tab,idMtdt))=true;}
	   if (Existe(tab,igiB_0) && (aiB_0 == NULL) )
	      {aiB_0 = new BaseB(dim_base,nbvec_base);tabbool(Existe_num(tab,igiB_0))=true;}
	   if (Existe(tab,igiB_t) && (aiB_t == NULL) )
	      {aiB_t = new BaseB(dim_base,nbvec_base);tabbool(Existe_num(tab,igiB_t))=true;}
	   if (Existe(tab,igiB_tdt) && (aiB_tdt == NULL) )
	      {aiB_tdt = new BaseB(dim_base,nbvec_base);tabbool(Existe_num(tab,igiB_tdt))=true;}
	   if (Existe(tab,igiH_0) && (aiH_0 == NULL) )
	      {aiH_0 = new BaseH (dim_base,nbvec_base);tabbool(Existe_num(tab,igiH_0))=true;}
	   if (Existe(tab,igiH_t) && (aiH_t == NULL) )
	      {aiH_t = new BaseH (dim_base,nbvec_base);tabbool(Existe_num(tab,igiH_t))=true;}
	   if (Existe(tab,igiH_tdt) && (aiH_tdt == NULL) )
	      {aiH_tdt = new BaseH (dim_base,nbvec_base);tabbool(Existe_num(tab,igiH_tdt))=true;}
	   if (Existe(tab,igijBB_0) && (aijBB_0 == NULL) )
	      {aijBB_0 = NevezTenseurBB(nbvec_base);tabbool(Existe_num(tab,igijBB_0))=true;}
	   if (Existe(tab,igijBB_t) && (aijBB_t == NULL) )
	      {aijBB_t = NevezTenseurBB(nbvec_base);tabbool(Existe_num(tab,igijBB_t))=true;}
	   if (Existe(tab,igijBB_tdt) && (aijBB_tdt == NULL) )
	      {aijBB_tdt = NevezTenseurBB(nbvec_base);tabbool(Existe_num(tab,igijBB_tdt))=true;}
	   if (Existe(tab,igijHH_0) && (aijHH_0 == NULL) )
	      {aijHH_0 = NevezTenseurHH(nbvec_base);tabbool(Existe_num(tab,igijHH_0))=true;}
	   if (Existe(tab,igijHH_t) && (aijHH_t == NULL) )
	      {aijHH_t = NevezTenseurHH(nbvec_base);tabbool(Existe_num(tab,igijHH_t))=true;}
	   if (Existe(tab,igijHH_tdt) && (aijHH_tdt == NULL) )
	      {aijHH_tdt = NevezTenseurHH(nbvec_base);tabbool(Existe_num(tab,igijHH_tdt))=true;}
	   if (Existe(tab,id_giB_t) && (d_aiB_t == NULL) )
	      { BaseB truc(dim_base,nbvec_base,0);
	        tabbool(Existe_num(tab,id_giB_t))=true;
            d_aiB_t = new Tableau <BaseB> (nbddlDepTot,truc);
            d_N_t = new Tableau < CoordonneeB > (nbddl_x);
            d_N_alpha_t_1 = new Tableau < CoordonneeB > (nbddl_x);
	        d_N_alpha_t_2 = new Tableau < CoordonneeB > (nbddl_x);
	      };
    if (Existe(tab,id_giB_tdt) && (d_aiB_tdt == NULL) )
	      { BaseB truc(dim_base,nbvec_base,0);
	        tabbool(Existe_num(tab,id_giB_tdt))=true;
         d_aiB_tdt = new Tableau <BaseB> (nbddlDepTot,truc);
         d_N_tdt = new Tableau < CoordonneeB > (nbddl_x);
         d_N_alpha_tdt_1 = new Tableau < CoordonneeB > (nbddl_x);
	        d_N_alpha_tdt_2 = new Tableau < CoordonneeB > (nbddl_x);
       };
	   if (Existe(tab,id_giH_t) && (d_aiH_t == NULL) )
	      { BaseH truc(dim_base,nbvec_base,0);
	        tabbool(Existe_num(tab,id_giH_t))=true;
            d_aiH_t = new Tableau <BaseH> (nbddlDepTot,truc); }
	   if (Existe(tab,id_giH_tdt) && (d_aiH_tdt == NULL) )
	      { BaseH truc(dim_base,nbvec_base,0);
	        tabbool(Existe_num(tab,id_giH_tdt))=true;
            d_aiH_tdt = new Tableau <BaseH> (nbddlDepTot,truc); }
	   if (Existe(tab,id_gijBB_t) && ( d_aijBB_t.Taille() == 0) )
	       { tabbool(Existe_num(tab,id_gijBB_t))=true;
	         d_aijBB_t.Change_taille(nbddlDepTot);
             for (int i=1;i<=nbddlDepTot;i++)
                 d_aijBB_t(i) = NevezTenseurBB(nbvec_base); }
	   if (Existe(tab,id_gijBB_tdt) && ( d_aijBB_tdt.Taille() == 0) )
	       { tabbool(Existe_num(tab,id_gijBB_tdt))=true;
	         d_aijBB_tdt.Change_taille(nbddlDepTot);
             for (int i=1;i<=nbddlDepTot;i++)
                 d_aijBB_tdt(i) = NevezTenseurBB(nbvec_base); }
	   if (Existe(tab,id_gijHH_t) && (d_aijHH_t.Taille() == 0) )
	       { tabbool(Existe_num(tab,id_gijHH_t))=true;
	         d_aijHH_t.Change_taille(nbddlDepTot);
             for (int i=1;i<=nbddlDepTot;i++)
                 d_aijHH_t(i) = NevezTenseurHH(nbvec_base); }
	   if (Existe(tab,id_gijHH_tdt) && (d_aijHH_tdt.Taille() == 0) )
	       { tabbool(Existe_num(tab,id_gijHH_tdt))=true;
	         d_aijHH_tdt.Change_taille(nbddlDepTot);
             for (int i=1;i<=nbddlDepTot;i++)
                 d_aijHH_tdt(i) = NevezTenseurHH(nbvec_base); }
	   if (Existe(tab,id_jacobien_t) && (d_ajacobien_t.Taille() == 0) )
	         {d_ajacobien_t.Change_taille(nbddlDepTot);tabbool(Existe_num(tab,id_jacobien_t))=true;}
	   if (Existe(tab,id_jacobien_tdt) && (d_ajacobien_tdt.Taille() == 0) )
	             {d_ajacobien_tdt.Change_taille(nbddlDepTot);tabbool(Existe_num(tab,id_jacobien_tdt))=true;}
	   // maintenant on met à jour le tableau local tab,
	   int nbplus = 0;
	   // on compte les éléments à rajouter
	   for (int i=1;i<=tabtaille;i++) if(tabbool(i)) nbplus++;
	   // on agrandi le tableau existant et on le complète
	   int taille_i = this->tab.Taille();
	   this->tab.Change_taille(taille_i + nbplus);
	   nbplus = 0;
	   for (int i=1;i<=tabtaille;i++)
	     if(tabbool(i))
	       { nbplus++; this->tab(taille_i + nbplus) = tab(i);}
    Init_conteneur_de_retour_pourFacette(); // Init des conteneurs de retour de fonction
  };

//---------------------------------- fonctions privées -------------------------------------------
   
// allocation de la memoire
void Met_Sfe1::AllocSfe1 ()
 {
    // on met les pointeurs a NULL
    P0 = NULL; Pt = NULL;d_Pt = NULL; Ptdt = NULL; d_Ptdt = NULL;
		  aiB_0 = NULL;aiB_t = NULL; aiB_tdt = NULL;
		  aiH_0 = NULL;aiH_t = NULL;aiH_tdt = NULL;
		  aijBB_0 = NULL;aijBB_t = NULL;aijBB_tdt = NULL;
		  aijHH_0 = NULL;aijHH_t = NULL;aijHH_tdt = NULL;
		  d_aiB_t = NULL;  d_N_t=NULL;   d_N_alpha_t_1=NULL;d_N_alpha_t_2=NULL;
		  d_aiB_tdt = NULL;d_N_tdt=NULL; d_N_alpha_tdt_1=NULL;d_N_alpha_tdt_2=NULL;
		  d_aiH_t = NULL;d_aiH_tdt = NULL;
	      // on alloue en fonction des parametres
		  int nbddl_x = tab_ddl.NbDdl_famille(X1); // nombre de ddl en position
		  int nbddlEpais = 0.;
		  if (tCalEpais) nbddlEpais = nbNoeudCentral; // un ddl par noeud central
		  int nbddl_v = tab_ddl.NbDdl_famille(V1); // nombre de ddl en vitesse
		  int nbddlDepTot = nbddl_x + nbddlEpais;
		  
		  if (tCalEpais)
		  	{ d_epais = new Tableau < Epai> (nbddlEpais);};
		  if (Existe(tab,iM0)) P0 = new Coordonnee3();
	   if (Existe(tab,iMt)) Pt = new Coordonnee3();
	   if (Existe(tab,idMt))
	      {Coordonnee3 toto; d_Pt = new Tableau <Coordonnee3> (nbddl_x,toto);}
	   if (Existe(tab,iMtdt)) Ptdt = new Coordonnee3;
	   if (Existe(tab,idMtdt))
	      {Coordonnee3 toto; d_Ptdt = new Tableau <Coordonnee3> (nbddl_x,toto);}
	   if (Existe(tab,igiB_0))  aiB_0 = new BaseB(dim_base,nbvec_base);
	   if (Existe(tab,igiB_t))  aiB_t = new BaseB(dim_base,nbvec_base);
	   if (Existe(tab,igiB_tdt))aiB_tdt = new BaseB(dim_base,nbvec_base);
	   if (Existe(tab,igiH_0)) aiH_0 = new BaseH (dim_base,nbvec_base);
	   if (Existe(tab,igiH_t)) aiH_t = new BaseH (dim_base,nbvec_base);
	   if (Existe(tab,igiH_tdt)) aiH_tdt = new BaseH (dim_base,nbvec_base);
	   if (Existe(tab,igijBB_0)) aijBB_0 = NevezTenseurBB(nbvec_base);
	   if (Existe(tab,igijBB_t)) aijBB_t = NevezTenseurBB(nbvec_base);
	   if (Existe(tab,igijBB_tdt)) aijBB_tdt = NevezTenseurBB(nbvec_base);
	   if (Existe(tab,igijHH_0)) aijHH_0 = NevezTenseurHH(nbvec_base);
	   if (Existe(tab,igijHH_t)) aijHH_t = NevezTenseurHH(nbvec_base);
	   if (Existe(tab,igijHH_tdt)) aijHH_tdt = NevezTenseurHH(nbvec_base);
	   if (Existe(tab,id_giB_t))
	       { BaseB truc(dim_base,nbvec_base,0);
             d_aiB_t = new Tableau <BaseB> (nbddlDepTot,truc);
             d_N_t = new Tableau < CoordonneeB > (nbddl_x);
             d_N_alpha_t_1 = new Tableau < CoordonneeB > (nbddl_x);
	         d_N_alpha_t_2 = new Tableau < CoordonneeB > (nbddl_x);
	       };
	   if (Existe(tab,id_giB_tdt))
	       { BaseB truc(dim_base,nbvec_base,0);
             d_aiB_tdt = new Tableau <BaseB> (nbddlDepTot,truc);
             d_N_tdt = new Tableau < CoordonneeB > (nbddl_x);
             d_N_alpha_tdt_1 = new Tableau < CoordonneeB > (nbddl_x);
	         d_N_alpha_tdt_2 = new Tableau < CoordonneeB > (nbddl_x);
	       };
	   if (Existe(tab,id_giH_t))  { BaseH truc(dim_base,nbvec_base,0);
             d_aiH_t = new Tableau <BaseH> (nbddlDepTot,truc); }
	   if (Existe(tab,id_giH_tdt)) { BaseH truc(dim_base,nbvec_base,0);
             d_aiH_tdt = new Tableau <BaseH> (nbddlDepTot,truc); }
	   if (Existe(tab,id_gijBB_t))  { d_aijBB_t.Change_taille(nbddlDepTot);
             for (int i=1;i<=nbddlDepTot;i++)
                 d_aijBB_t(i) = NevezTenseurBB(nbvec_base); }
	   if (Existe(tab,id_gijBB_tdt)) { d_aijBB_tdt.Change_taille(nbddlDepTot);
             for (int i=1;i<=nbddlDepTot;i++)
                 d_aijBB_tdt(i) = NevezTenseurBB(nbvec_base); }
	   if (Existe(tab,id_gijHH_t)) { d_aijHH_t.Change_taille(nbddlDepTot);
             for (int i=1;i<=nbddlDepTot;i++)
                 d_aijHH_t(i) = NevezTenseurHH(nbvec_base); }
	   if (Existe(tab,id_gijHH_tdt)) { d_aijHH_tdt.Change_taille(nbddlDepTot);
             for (int i=1;i<=nbddlDepTot;i++)
                 d_aijHH_tdt(i) = NevezTenseurHH(nbvec_base); }
	   if (Existe(tab,id_jacobien_t))  d_ajacobien_t.Change_taille(nbddlDepTot);
	   if (Existe(tab,id_jacobien_tdt))  d_ajacobien_tdt.Change_taille(nbddlDepTot);
  };
	    
// deallocation de la memoire complète, uniquement des grandeurs spécifiques à Met_Sfe1
void Met_Sfe1::DeallocSfe1()
   { DeallocSfe1(tab);
   };
        
// deallocation de la memoire en fonction du tableau tib, uniquement des grandeurs spécifiques à Met_Sfe1
void Met_Sfe1::DeallocSfe1(Tableau<Enum_variable_metrique>& tib)
		{  if (d_epais != NULL){ delete d_epais; d_epais=NULL;};
		   if (Existe(tib,iM0)) {delete P0;P0=NULL;}
	    if (Existe(tib,iMt)) {delete Pt;Pt=NULL;}
	    if (Existe(tib,idMt)) {delete d_Pt;d_Pt=NULL;};
	    if (Existe(tib,iMtdt)) {delete Ptdt;Ptdt=NULL;}
	    if (Existe(tib,idMtdt)) {delete d_Ptdt;d_Ptdt=NULL;};
	    if (Existe(tib,igiB_0))  {delete  aiB_0;aiB_0=NULL;}
	    if (Existe(tib,igiB_t))  {delete  aiB_t;aiB_t=NULL;}
	    if (Existe(tib,igiB_tdt))  {delete  aiB_tdt;aiB_tdt=NULL;}
	    if (Existe(tib,igiH_0)) {delete aiH_0;aiH_0=NULL;}
	    if (Existe(tib,igiH_t))  {delete aiH_t;aiH_t=NULL;}
	    if (Existe(tib,igiH_tdt)) {delete aiH_tdt;aiH_tdt=NULL;}
	    if (Existe(tib,igijBB_0))  {delete aijBB_0;aijBB_0=NULL;}
	    if (Existe(tib,igijBB_t)) {delete  aijBB_t;aijBB_t=NULL;}
	    if (Existe(tib,igijBB_tdt))  {delete aijBB_tdt;aijBB_tdt=NULL;}
	    if (Existe(tib,igijHH_0)) {delete  aijHH_0;aijHH_0=NULL;}
	    if (Existe(tib,igijHH_t))  {delete aijHH_t;aijHH_t=NULL;}
	    if (Existe(tib,igijHH_tdt))  {delete aijHH_tdt;aijHH_tdt=NULL;}
	    if (Existe(tib,id_giB_t)) {delete d_aiB_t;d_aiB_t=NULL;
	                                  delete d_N_t; d_N_t=NULL;
	                                  delete d_N_alpha_t_1; d_N_alpha_t_1=NULL;
	                                  delete d_N_alpha_t_2; d_N_alpha_t_2=NULL;};
	    if (Existe(tib,id_giB_tdt)) {delete d_aiB_tdt;d_aiB_tdt=NULL;
	                               delete d_N_tdt; d_N_tdt=NULL;
	                               delete d_N_alpha_tdt_1; d_N_alpha_tdt_1=NULL;
	                               delete d_N_alpha_tdt_2; d_N_alpha_tdt_2=NULL;};
	    if (Existe(tib,id_giH_t)) {delete d_aiH_t;d_aiH_t=NULL;}
	    if (Existe(tib,id_giH_tdt)) {delete d_aiH_tdt;d_aiH_tdt=NULL;}
	    if (Existe(tib,id_gijBB_t)) { for (int i = 1; i<= d_aijBB_t.Taille(); i++)
	                                    delete d_aijBB_t(i);
	                                d_aijBB_t.Change_taille(0); }
	    if (Existe(tib,id_gijBB_tdt)) { for (int i = 1; i<= d_aijBB_tdt.Taille(); i++)
	                                    delete d_aijBB_tdt(i);
	                                d_aijBB_tdt.Change_taille(0); }
	    if (Existe(tib,id_gijHH_t)) { for (int i = 1; i<= d_aijHH_t.Taille(); i++)
	                                    delete d_aijHH_t(i);
	                                d_aijHH_t.Change_taille(0); }
	    if (Existe(tib,id_gijHH_tdt)) { for (int i = 1; i<= d_aijHH_tdt.Taille(); i++)
	                                    delete d_aijHH_tdt(i);
	                                d_aijHH_tdt.Change_taille(0); }
	    if (Existe(tib,id_jacobien_t))  d_ajacobien_t.Change_taille(0);                     
	    if (Existe(tib,id_jacobien_tdt))  d_ajacobien_tdt.Change_taille(0); 
        
	    // maintenant on reinitialise à NULL les variables de retour
	    Impli toto; ex_impli = toto;
  };

// copie en fonction de l'instance passée
// concerne que les grandeurs pointées
void Met_Sfe1::Copie_metSfe1(const  Met_Sfe1& a)
  {// on alloue en fonction des parametres
   int nbddl_x = tab_ddl.NbDdl_famille(X1); // nombre de ddl en position
   int nbddlEpais = 0.;
   if (tCalEpais) nbddlEpais = nbNoeudCentral; // un ddl par noeud central
   int nbddl_v = tab_ddl.NbDdl_famille(V1); // nombre de ddl en vitesse 
   int nbddlDepTot = nbddl_x + nbddlEpais; 
   
   tCalEpais = a.tCalEpais;
   if (tCalEpais) {if (d_epais == NULL) {d_epais = new Tableau <Epai> (*a.d_epais);}
                   else { *d_epais = *a.d_epais;}
                   };
   if (a.P0 != NULL) 
     {if (P0==NULL) P0 = new Coordonnee3(*(a.P0)); else *P0=*a.P0;} 
   else {if (P0!=NULL) {delete P0;P0=NULL;}}
   if (a.Pt != NULL) 
     {if (Pt==NULL) Pt = new Coordonnee3(*(a.Pt)); else *Pt=*a.Pt;}
   else {if (Pt!=NULL) {delete Pt;Pt=NULL;}}
   if (a.d_Pt != NULL) 
     {if (d_Pt==NULL) d_Pt = new Tableau <Coordonnee3> (*(a.d_Pt)); else *d_Pt=*a.d_Pt;}
   else {if (d_Pt != NULL) {delete d_Pt;d_Pt=NULL;}}
   if (a.Ptdt != NULL) 
     {if (Ptdt==NULL) Ptdt = new Coordonnee3(*(a.Ptdt)); else *Ptdt=*a.Ptdt;}
   else {if (Ptdt!=NULL) {delete Ptdt;Ptdt=NULL;}}
   if (a.d_Ptdt != NULL) 
     {if (d_Ptdt==NULL) d_Ptdt = new Tableau <Coordonnee3> (*(a.d_Ptdt)); else *d_Ptdt=*a.d_Ptdt;}
   else {if (d_Ptdt != NULL) {delete d_Ptdt;d_Ptdt=NULL;}}
   if (a.aiB_0 != NULL) 
     {if (aiB_0==NULL) aiB_0 = new BaseB(*(a.aiB_0)); else *aiB_0=*a.aiB_0;}
   else {if (aiB_0!=NULL) {delete aiB_0;aiB_0 = NULL;}}
   if (a.aiB_t != NULL) 
     {if (aiB_t==NULL) aiB_t = new BaseB(*(a.aiB_t)); else *aiB_t=*a.aiB_t;}
   else {if (aiB_t!=NULL) {delete aiB_t;aiB_t = NULL;}}
   if (a.aiB_tdt != NULL) 
     {if (aiB_tdt==NULL) aiB_tdt = new BaseB(*(a.aiB_tdt)); else *aiB_tdt=*a.aiB_tdt;}
   else {if (aiB_tdt!=NULL) {delete aiB_tdt;aiB_tdt = NULL;}}
   if (a.aiH_0 != NULL) 
     {if (aiH_0==NULL) aiH_0 = new BaseH(*(a.aiH_0)); else *aiH_0=*a.aiH_0;}
   else {if (aiH_0!=NULL) {delete aiH_0;aiH_0 = NULL;}}
   if (a.aiH_t != NULL) 
     {if (aiH_t==NULL) aiH_t = new BaseH(*(a.aiH_t)); else *aiH_t=*a.aiH_t;}
   else {if (aiH_t!=NULL) {delete aiH_t;aiH_t = NULL;}}
   if (a.aiH_tdt != NULL) 
     {if (aiH_tdt==NULL) aiH_tdt = new BaseH(*(a.aiH_tdt)); else *aiH_tdt=*a.aiH_tdt;}
   else {if (aiH_tdt!=NULL) {delete aiH_tdt;aiH_tdt = NULL;}}
   if (a.aijBB_0 != NULL) 
     {if (aijBB_0==NULL) aijBB_0 = NevezTenseurBB(*a.aijBB_0);else *aijBB_0=*a.aijBB_0;}
   else {if (aijBB_0!=NULL) {delete aijBB_0;aijBB_0 = NULL;}}
   if (a.aijBB_t != NULL) 
     {if (aijBB_t==NULL) aijBB_t = NevezTenseurBB(*a.aijBB_t);else *aijBB_t=*a.aijBB_t;}
   else {if (aijBB_t!=NULL) {delete aijBB_t;aijBB_t = NULL;}}
   if (a.aijBB_tdt != NULL)
     {if (aijBB_tdt==NULL) aijBB_tdt = NevezTenseurBB(*a.aijBB_tdt);else *aijBB_tdt=*a.aijBB_tdt;}
   else {if (aijBB_tdt!=NULL) {delete aijBB_tdt;aijBB_tdt = NULL;}}
   if (a.aijHH_0 != NULL) 
     {if (aijHH_0==NULL) aijHH_0 = NevezTenseurHH(*a.aijHH_0);else *aijHH_0=*a.aijHH_0;}
   else {if (aijHH_0!=NULL) {delete aijHH_0;aijHH_0 = NULL;}}
   if (a.aijHH_t != NULL) 
     {if (aijHH_t==NULL) aijHH_t = NevezTenseurHH(*a.aijHH_t);else *aijHH_t=*a.aijHH_t;}
   else {if (aijHH_t!=NULL) {delete aijHH_t;aijHH_t = NULL;}}
   if (a.aijHH_tdt != NULL)
     {if (aijHH_tdt==NULL) aijHH_tdt = NevezTenseurHH(*a.aijHH_tdt);else *aijHH_tdt=*a.aijHH_tdt;}
   else {if (aijHH_tdt!=NULL) {delete aijHH_tdt;aijHH_tdt = NULL;}}
   if (a.d_aiB_t != NULL) 
     {if (d_aiB_t==NULL) {d_aiB_t = new Tableau <BaseB>( *a.d_aiB_t);}else {*d_aiB_t = *a.d_aiB_t;};
      if (d_N_t==NULL) {d_N_t = new Tableau < CoordonneeB > (*a.d_N_t);}
	  else             { *d_N_t = *a.d_N_t; };
      if (d_N_alpha_t_1==NULL) {d_N_alpha_t_1 = new Tableau < CoordonneeB > (*a.d_N_alpha_t_1);
	                            d_N_alpha_t_2 = new Tableau < CoordonneeB > (*a.d_N_alpha_t_2);
	                           }
	  else { *d_N_alpha_t_1 = *a.d_N_alpha_t_1;*d_N_alpha_t_2 = *a.d_N_alpha_t_2; };
     }
   else {if (d_aiB_t!=NULL) {delete d_aiB_t;d_aiB_t = NULL;}; 
         if (d_N_t!=NULL) {delete d_N_t;d_N_t=NULL;};
         if (d_N_alpha_t_1!=NULL) {delete d_N_alpha_t_1;d_N_alpha_t_1=NULL;};
         if (d_N_alpha_t_2!=NULL) {delete d_N_alpha_t_2;d_N_alpha_t_2=NULL;};
        };
         
   if (a.d_aiB_tdt != NULL) 
     {if (d_aiB_tdt==NULL) {d_aiB_tdt = new Tableau <BaseB>( *a.d_aiB_tdt);}else {*d_aiB_tdt = *a.d_aiB_tdt;};
      if (d_N_tdt==NULL) {d_N_tdt = new Tableau < CoordonneeB > (*a.d_N_tdt);}
	  else               { *d_N_tdt = *a.d_N_tdt; };
      if (d_N_alpha_tdt_1==NULL) {d_N_alpha_tdt_1 = new Tableau < CoordonneeB > (*a.d_N_alpha_tdt_1);
	                              d_N_alpha_tdt_2 = new Tableau < CoordonneeB > (*a.d_N_alpha_tdt_2);
	                             }
	  else { *d_N_alpha_tdt_1 = *a.d_N_alpha_tdt_1;*d_N_alpha_tdt_2 = *a.d_N_alpha_tdt_2; };
     }
   else {if (d_aiB_tdt!=NULL) {delete d_aiB_tdt;d_aiB_tdt = NULL;} 
         if (d_N_tdt!=NULL) {delete d_N_tdt;d_N_tdt=NULL;};
         if (d_N_alpha_tdt_1!=NULL) {delete d_N_alpha_tdt_1;d_N_alpha_tdt_1=NULL;};
         if (d_N_alpha_tdt_2!=NULL) {delete d_N_alpha_tdt_2;d_N_alpha_tdt_2=NULL;};
        };

   if (a.d_aiH_t != NULL) 
     {if (d_aiH_t==NULL) d_aiH_t = new Tableau <BaseH>( *a.d_aiH_t);else *d_aiH_t = *a.d_aiH_t;}
   else {if (d_aiH_t!=NULL) {delete d_aiH_t;d_aiH_t = NULL;} }
   if (a.d_aiH_tdt != NULL) 
     {if (d_aiH_tdt==NULL) d_aiH_tdt = new Tableau <BaseH>( *a.d_aiH_tdt);else *d_aiH_tdt = *a.d_aiH_tdt;}
   else {if (d_aiH_tdt!=NULL) {delete d_aiH_tdt;d_aiH_tdt = NULL;} }
   if (Existe(tab,id_gijBB_t))  
           { d_aijBB_t.Change_taille(a.d_aijBB_t.Taille());
             for (int i=1;i<=nbddlDepTot;i++)
                { d_aijBB_t(i) = NevezTenseurBB(nbvec_base);
                  *((d_aijBB_t)(i)) = *((a.d_aijBB_t)(i)) ; } }
   else  d_aijBB_t.Change_taille(0);              
   if (Existe(tab,id_gijBB_tdt))  
           { d_aijBB_tdt.Change_taille(a.d_aijBB_tdt.Taille());
             for (int i=1;i<=nbddlDepTot;i++)
                { d_aijBB_tdt(i) = NevezTenseurBB(nbvec_base);
                 *((d_aijBB_tdt)(i)) = *((a.d_aijBB_tdt)(i)) ; }}
   else  d_aijBB_tdt.Change_taille(0);              
   if (Existe(tab,id_gijHH_t))  
           { d_aijHH_t.Change_taille(a.d_aijHH_t.Taille());
             for (int i=1;i<=nbddlDepTot;i++)
                { d_aijHH_t(i) = NevezTenseurHH(nbvec_base);
                 *((d_aijHH_t)(i)) = *((a.d_aijHH_t)(i)) ; }}
   else  d_aijHH_t.Change_taille(0);              
   if (Existe(tab,id_gijHH_tdt))  
           { d_aijHH_tdt.Change_taille(a.d_aijHH_tdt.Taille());
             for (int i=1;i<=nbddlDepTot;i++)
                { d_aijHH_tdt(i) = NevezTenseurHH(nbvec_base);
                 *((d_aijHH_tdt)(i)) = *((a.d_aijHH_tdt)(i)); }}
   else  d_aijHH_tdt.Change_taille(0);              
  };
   

// initialisation des conteneurs de retour des méthodes
void Met_Sfe1::Init_conteneur_de_retour_pourFacette()
 { courbure_t_tdt.Mise_a_jour_grandeur(aiB_0,aiH_0,aiB_t,aiH_t,aiB_tdt,aiH_tdt,aijBB_0,aijHH_0
                       ,aijBB_t,aijHH_t,aijBB_tdt,aijHH_tdt,&curb_t,&curb_tdt,&curb_0
                       ,&ajacobien_tdt,&ajacobien_t,&ajacobien_0);  		  	        

   ex_impliFac.Mise_a_jour_grandeur(aiB_0,aiH_0,aiB_t,aiH_t,aiB_tdt,d_aiB_tdt,aiH_tdt,d_aiH_tdt
                         ,aijBB_0,aijHH_0,aijBB_t,aijHH_t,aijBB_tdt,aijHH_tdt,gradVmoyBB_t,gradVmoyBB_tdt,gradVBB_tdt
                         ,&d_aijBB_tdt,NULL,&d_aijHH_tdt,&jacobien_tdt,&jacobien_t,&jacobien_0,&d_jacobien_tdt
                         ,&d_gradVmoyBB_t,&d_gradVmoyBB_tdt,&d_gradVBB_t,&d_gradVBB_tdt);


   ex_expliFac.Mise_a_jour_grandeur(aiB_0,aiH_0,aiB_t,aiH_t,aijBB_0,aijHH_0,aijBB_t,aijHH_t,gradVmoyBB_t,gradVBB_t,
                                    &d_aijBB_t,&jacobien_t,&jacobien_0);
   ex_expli_t_tdtFac.Mise_a_jour_grandeur(aiB_0,aiH_0,aiB_t,aiH_t,aiB_tdt,aiH_tdt,aijBB_0,aijHH_0,aijBB_t,aijHH_t,aijBB_tdt
                          ,aijHH_tdt,gradVmoyBB_t,gradVmoyBB_tdt,gradVBB_tdt,&d_aijBB_tdt,&jacobien_tdt,&jacobien_t,&jacobien_0);
   ex_aijHH_0_et_aiH_0Fac.Mise_a_jour_grandeur(aiH_0,aijHH_0);
   ex_DynamiqFac.Mise_a_jour_grandeur(aiB_0,aiB_tdt,aijBB_0,aijBB_tdt,
                                      &jacobien_tdt,&jacobien_0);
   ex_flambe_linFac.Mise_a_jour_grandeur(aiB_0,aiH_0,aiB_t,aiH_t,aiB_tdt,d_aiB_tdt,aiH_tdt,d_aiH_tdt
                          ,aijBB_0,aijHH_0,aijBB_t,aijHH_t,aijBB_tdt,aijHH_tdt,gradVmoyBB_t,gradVmoyBB_tdt,gradVBB_tdt
                          ,&d_aijBB_tdt,NULL,&d_aijHH_tdt,&jacobien_tdt,&jacobien_t,&jacobien_0,&d_jacobien_tdt
                          ,&d_gradVmoyBB_t,&d_gradVmoyBB_tdt,&d_gradVBB_t,&d_gradVBB_tdt);
   umat_contFac.Mise_a_jour_grandeur(aiB_0,aiH_0,aiB_t,aiH_t,aiB_tdt,aiH_tdt,aijBB_0,aijHH_0,aijBB_t,aijHH_t,aijBB_tdt
                        ,aijHH_tdt,gradVmoyBB_t,gradVmoyBB_tdt,gradVBB_tdt,&jacobien_tdt,&jacobien_t,&jacobien_0);                    
   ex_InfoImpFac.Mise_a_jour_grandeur(M0,Mtdt,aiB_0,aiB_tdt,aiH_0,aiH_tdt,aijHH_tdt,aijBB_tdt,aijBB_0,aijHH_0);
   ex_InfoExp_tFac.Mise_a_jour_grandeur(M0,Mt,aiB_0,aiB_t,aiH_0,aiH_t,aijHH_t,aijBB_t,aijBB_0,aijHH_0);
   ex_InfoExp_tdtFac.Mise_a_jour_grandeur(M0,Mtdt,aiB_0,aiB_tdt,aiH_0,aiH_tdt,aijHH_tdt,aijBB_tdt,aijBB_0,aijHH_0);
   ex_Info0_t_tdtFac.Mise_a_jour_grandeur(M0,Mt,Mtdt,aiB_0,aiB_t,aiB_tdt,aiH_0,aiH_t,aiH_tdt);
};
   
   
   
                 
