
// 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 "Isovaleurs_Gmsh.h"

#include <iomanip>
#include <algorithm>
#include "CharUtil.h"
#include "Coordonnee2.h"
#include "ConstMath.h"
#include "MathUtil.h"
#include "Banniere.h"
#include "TypeQuelconqueParticulier.h"
#include "Visualisation_Gmsh.h"

// choix de l'isovaleur à visualiser calculée à partir des grandeurs évoluées aux points d'intégrations
void Isovaleurs_Gmsh::ChoixIsovaleur_tensorielle_ptinteg(const string& choix)
 { // tout d'abord on traite le cas de tous les isovaleurs
   if (choix=="to")
    { tabelement_evoluee_retenu = tabelement_evoluee;
      return;
    }
   else if (choix=="de")
    { // on prend le premier élément de chaque maillage et on statut en fonction de son type
      int nbmail = tabelement_evoluee.Taille();
      for (int imail = 1;imail<=nbmail;imail++)
       {List_io < TypeQuelconque >& element_evoluee = tabelement_evoluee(imail); // pour simplifier
        List_io < TypeQuelconque >& element_evoluee_retenu = tabelement_evoluee_retenu(imail); // pour simplifier
        List_io < TypeQuelconque >::iterator iq,iqfin=element_evoluee.end();
        List_io < TypeQuelconque >::iterator iqev,iqevfin;
        Element& ele = lesMail->Element_LesMaille(imail,1);
        Element::Signature signa =  ele.Signature_element();
        switch (signa.id_problem)
         {case MECA_SOLIDE_DEFORMABLE:
           {// c'est avec les types évoluées que l'on travaille, on sort la contrainte et la déformation courante
            // tout d'abord les grandeurs communes:
            //   a) on sort les contraintes 
            for (iq=element_evoluee.begin();iq!=iqfin;iq++) 
                      {if ((*iq).EnuTypeQuelconque()== CONTRAINTE_COURANTE) break;};
            if (iq != iqfin) 
             { // on enregistre s'il n'existe pas déjà
               iqevfin=element_evoluee_retenu.end();
               for (iqev=element_evoluee_retenu.begin();iqev!=iqevfin;iqev++) 
                      {if ((*iqev).EnuTypeQuelconque()== CONTRAINTE_COURANTE) break;};
               if (iqev == iqevfin)element_evoluee_retenu.push_back(*iq);
             };
            //   b) et les déformations
            for (iq=element_evoluee.begin();iq!=iqfin;iq++) 
                      {if ((*iq).EnuTypeQuelconque()== DEFORMATION_COURANTE) break;};
            if (iq != iqfin) 
             { // on enregistre s'il n'existe pas déjà
               iqevfin=element_evoluee_retenu.end();
               for (iqev=element_evoluee_retenu.begin();iqev!=iqevfin;iqev++) 
                      {if ((*iqev).EnuTypeQuelconque()== DEFORMATION_COURANTE) break;};
               if (iqev == iqevfin) element_evoluee_retenu.push_back(*iq);
             }; 
            // puis choix en fonction de l'évolution temporelle
            switch  (Evolution_temporelle_du_calcul(ParaGlob::param->TypeCalcul_maitre()))
             { case DYNAMIQUE:
                { // on sort les vitesses de déformation 
                  for (iq=element_evoluee.begin();iq!=iqfin;iq++) 
                      {if ((*iq).EnuTypeQuelconque()== VITESSE_DEFORMATION_COURANTE) break;};
                  if (iq != iqfin) 
                   { // on enregistre s'il n'existe pas déjà
                     iqevfin=element_evoluee_retenu.end();
                     for (iqev=element_evoluee_retenu.begin();iqev!=iqevfin;iqev++) 
                            {if ((*iqev).EnuTypeQuelconque()== VITESSE_DEFORMATION_COURANTE) break;};
                     if (iqev == iqevfin) element_evoluee_retenu.push_back(*iq);
                   }; 
                  break;
                }
               default: break; // sinon pour l'instant on ne fait rien
             };
             break;
           } //-- fin du cas MECA_SOLIDE_DEFORMABLE
          default: 
            cout << "\n pour l'instant pas de parametre par defaut pour les pt integ !! "
                 << "\n pour le type de problem : " << NomElemTypeProblem(signa.id_problem) 
                 << "\n on continue sur le cas general ";
          };
       }; //-- fin de la boucle sur les maillages 
      return;
     };  
   // maintenant on traite le cas interactif
   string rep;
   bool choix_valide = false;   
   cout << "\n  choix d'isovaleur (grandeurs evoluees) venant des pts d'integ a visualiser ";
   int nbmail = tabelement_evoluee.Taille();
   // update du tableau evolues à visualiser si nécessaire
   if (tabelement_evoluee_retenu.Taille() != nbmail)
       tabelement_evoluee_retenu.Change_taille(nbmail);
   for (int imail = 1;imail<=nbmail;imail++)
    {// on ne traite que s'il y a des grandeurs disponibles
     if (tabelement_evoluee(imail).size() != 0 )
     {choix_valide=false;
      while (!choix_valide) // premier while
      {try 
        { cout << "\n (0 ou f ou fin) fin choix grandeurs tensorielles ";
          cout << "\n listes de type de grandeur tensorielles a visualiser ";
          // affichage des grandeurs retenues si la liste n'est pas vide
          if ((tabelement_evoluee_retenu(imail)).size())
             { cout << "\n Maillage nb: " << imail << "\n  liste des types de grandeurs enregistres:   ";  
               List_io < TypeQuelconque >::iterator iet,ietfin = (tabelement_evoluee_retenu(imail)).end();
               for (iet=(tabelement_evoluee_retenu(imail)).begin();iet!=ietfin;iet++)
                 cout << ((*iet).EnuTypeQuelconque().NomPlein()) << " " ;
               cout << endl;  
             };
          cout << "\n Maillage nb: " << imail << " liste des types de grandeurs tensorielles disponibles ";
          List_io < TypeQuelconque >::iterator iet,ietfin = (tabelement_evoluee(imail)).end();
          for (iet=(tabelement_evoluee(imail)).begin();iet!=ietfin;iet++)
                     cout << "\n " << ((*iet).EnuTypeQuelconque().NomPlein()) ;
          // le menu
          cout << "\n donner la grandeur a visulaliser "
               << "\n (to) toutes les grandeurs "
               << "\n (de) les grandeurs par defaut"
               << "\n (une liste de grandeurs tensorielles) "
               << "\n (ef)               pour effacer la liste "
               << "\n (0 ou f ou fin)    fin choix grandeur tensorielle "
               << "\n reponse ?  ";
          rep = lect_return_defaut(false,"f");
          if (rep == "fin_prog") Sortie(1);
          if (rep == "to")
           {// cas de toutes les grandeurs
            tabelement_evoluee_retenu(imail) = tabelement_evoluee(imail);
            choix_valide=false;
           };
          // sinon
          if ((rep == "0") || (rep == "f") || (rep == "fin")) 
            {choix_valide=true;}
          else if (rep=="ef")
            { tabelement_evoluee_retenu(imail).erase(tabelement_evoluee_retenu(imail).begin(),
                      tabelement_evoluee_retenu(imail).end());
            }
          else if (rep=="de")
            {List_io < TypeQuelconque >& element_evoluee = tabelement_evoluee(imail); // pour simplifier
             List_io < TypeQuelconque >& element_evoluee_retenu = tabelement_evoluee_retenu(imail); // pour simplifier
             List_io < TypeQuelconque >::iterator iq,iqfin=element_evoluee.end();
             List_io < TypeQuelconque >::iterator iqev,iqevfin;
             Element& ele = lesMail->Element_LesMaille(imail,1);
             Element::Signature signa =  ele.Signature_element();
             switch (signa.id_problem)
             {case MECA_SOLIDE_DEFORMABLE:
               {// c'est avec les types évoluées que l'on travaille, on sort la contrainte et la déformation courante
                // tout d'abord les grandeurs communes:
                //   a) on sort les contraintes 
                for (iq=element_evoluee.begin();iq!=iqfin;iq++) 
                          {if ((*iq).EnuTypeQuelconque()== CONTRAINTE_COURANTE) break;};
                if (iq != iqfin) 
                 { // on enregistre s'il n'existe pas déjà
                   iqevfin=element_evoluee_retenu.end();
                   for (iqev=element_evoluee_retenu.begin();iqev!=iqevfin;iqev++) 
                      {if ((*iqev).EnuTypeQuelconque()== CONTRAINTE_COURANTE) break;};
                   if (iqev == iqevfin)element_evoluee_retenu.push_back(*iq);
                 };
                //   b) et les déformations
                for (iq=element_evoluee.begin();iq!=iqfin;iq++) 
                          {if ((*iq).EnuTypeQuelconque()== DEFORMATION_COURANTE) break;};
                if (iq != iqfin) 
                  { // on enregistre s'il n'existe pas déjà
                    iqevfin=element_evoluee_retenu.end();
                    for (iqev=element_evoluee_retenu.begin();iqev!=iqevfin;iqev++) 
                      {if ((*iqev).EnuTypeQuelconque()== DEFORMATION_COURANTE) break;};
                    if (iqev == iqevfin) element_evoluee_retenu.push_back(*iq);
                  }; 
                // puis choix en fonction de l'évolution temporelle
                switch  (Evolution_temporelle_du_calcul(ParaGlob::param->TypeCalcul_maitre()))
                 { case DYNAMIQUE:
                    { // on sort les vitesses de déformation 
                      for (iq=element_evoluee.begin();iq!=iqfin;iq++) 
                          {if ((*iq).EnuTypeQuelconque()== VITESSE_DEFORMATION_COURANTE) break;};
                      if (iq != iqfin) 
                       { // on enregistre s'il n'existe pas déjà
                         iqevfin=element_evoluee_retenu.end();
                         for (iqev=element_evoluee_retenu.begin();iqev!=iqevfin;iqev++) 
                            {if ((*iqev).EnuTypeQuelconque()== VITESSE_DEFORMATION_COURANTE) break;};
                         if (iqev == iqevfin) element_evoluee_retenu.push_back(*iq);
                       }; 
                      break;
                    }
                   default: break; // sinon pour l'instant on ne fait rien
                 };
                break;
               } //-- fin du cas MECA_SOLIDE_DEFORMABLE
              default: 
                  cout << "\n pour l'instant pas de parametre par defaut pour les pt integ !! "
                       << "\n pour le type de problem : " << NomElemTypeProblem(signa.id_problem) 
                       << "\n on continue sur le cas general ";
             };
           }
          else if (TypeQuelconque_enum_etendu::VerifExistence(rep) ) // vérif que c'est une grandeur possible
            { // maintenant on vérifie qu'elle appartient à la liste des grandeurs disponibles
              TypeQuelconque a(TypeQuelconque_enum_etendu::RecupTypeQuelconque_enum_etendu(rep)); // création d'un type quelconque sans grandeur
              List_io<TypeQuelconque>& tpg_ret = (tabelement_evoluee_retenu(imail)); // pour simplifier
              List_io<TypeQuelconque>& tpg = (tabelement_evoluee(imail)); // pour simplifier
              if (find(tpg.begin(),tpg.end(),a) != tpg.end())
                { // il existe -> enregistrement
                  List_io<TypeQuelconque>::iterator il = find(tpg.begin(),tpg.end(),a); // récup du réel type
                  // s'il n'existe pas déjà on l'enregistre vraiment
                  if (find(tpg_ret.begin(),tpg_ret.end(),a) == tpg_ret.end())
                       tpg_ret.push_back(*il);
                }
              else
                { cout << "\n erreur, grandeur non disponible !, recommencez ";};
            };
        }
       catch (ErrSortieFinale)
            // cas d'une direction voulue vers la sortie
            // on relance l'interuption pour le niveau supérieur
          { ErrSortieFinale toto;
            throw (toto);
          }
       catch (...)// erreur en lecture
        {  cout << "\n Erreur dans la lecture evolues !!, "
                << "\n redonnez une bonne valeur"
                << "\n ou taper fin_prog pour arreter le programme";
           choix_valide=false;
        };
      }; //-- fin du premier while
      tabelement_evoluee_retenu(imail).sort(); // on ordonne
      tabelement_evoluee_retenu(imail).unique();// on supprime les doublons                           
     }; //-- fin de if (tabelement_typeParti(imail).size() != 0 )                          
    };//-- fin de la boucle sur les maillages  
 };  
  
// choix de l'isovaleur à visualiser calculée à partir des grandeurs quelconques aux points d'intégrations
void Isovaleurs_Gmsh::ChoixIsovaleur_quelc_ptinteg(const string& choix)
 { // tout d'abord on traite le cas de tous les isovaleurs
   if (choix=="to")
    { tabelement_typeParti_retenu = tabelement_typeParti;
      return;
     }
   else if (choix=="de")
    { // pour l'instant aucun éléments par défaut
      return;
     };  
   // maintenant on traite le cas interactif   
   bool choix_valide = false;
   string rep;
   cout << "\n  choix d'isovaleur venant des pts d'integ a visualiser (de type grandeurs particulieres) ";
   int nbmail = tabelement_typeParti.Taille();
   // update du tableau de ddl à visualiser si nécessaire
   if (tabelement_typeParti_retenu.Taille() != nbmail)
       tabelement_typeParti_retenu.Change_taille(nbmail);

   for (int imail = 1;imail<=nbmail;imail++)
    {// on ne traite que s'il y a des grandeurs disponibles
     if (tabelement_typeParti(imail).size() != 0 )
     {choix_valide=false;
      while (!choix_valide) // premier while
      {try 
        { cout << "\n (0 ou f ou fin) fin choix grandeurs particulieres ";
          cout << "\n listes de type de grandeur particuliere a visualiser ";
          // affichage des ddl retenues si la liste n'est pas vide
          if ((tabelement_typeParti_retenu(imail)).size())
                 { cout << "\n Maillage nb: " << imail << "\n  liste des types de grandeurs enregistres:   ";  
                   List_io < TypeQuelconque >::iterator iet,ietfin = (tabelement_typeParti_retenu(imail)).end();
                   for (iet=(tabelement_typeParti_retenu(imail)).begin();iet!=ietfin;iet++)
                     {cout << ((*iet).EnuTypeQuelconque().NomPlein()) << " " ;
                     };
                   cout << endl;  
                  };
          cout << "\n Maillage nb: " << imail << " liste des types de grandeur particuliere disponibles ";
          List_io < TypeQuelconque >::iterator iet,ietfin = (tabelement_typeParti(imail)).end();
          for (iet=(tabelement_typeParti(imail)).begin();iet!=ietfin;iet++)
                     cout << "\n " << ((*iet).EnuTypeQuelconque().NomPlein()) ;
          cout << "\n donner la grandeur particuliere a visualiser "
               << "\n (to) tous les grandeurs particulieres "
               << "\n ou une liste de grandeurs particulieres "
               << "\n (0 ou f ou fin) fin choix de grandeurs particulieres "
               << "\n reponse ?  ";
          rep = lect_return_defaut(false,"f");
          if (rep == "fin_prog") Sortie(1);
          if (rep == "to")
           {// cas de tous les ddl
            tabelement_typeParti_retenu(imail) = tabelement_typeParti(imail);
            choix_valide=false;
            };
          // sinon
          if ((rep == "0") || (rep == "f") || (rep == "fin")) 
              {choix_valide=true;}
          else if (TypeQuelconque_enum_etendu::VerifExistence(rep) ) // vérif que c'est une grandeur possible
            { // maintenant on vérifie qu'elle appartient à la liste des grandeurs disponibles
              TypeQuelconque a(TypeQuelconque_enum_etendu::RecupTypeQuelconque_enum_etendu(rep)); // création d'un type quelconque sans grandeur
              List_io<TypeQuelconque>& tpg_ret = (tabelement_typeParti_retenu(imail)); // pour simplifier
              List_io<TypeQuelconque>& tpg = (tabelement_typeParti(imail)); // pour simplifier
              if (find(tpg.begin(),tpg.end(),a) != tpg.end())
                { // il existe -> enregistrement
                  List_io<TypeQuelconque>::iterator il = find(tpg.begin(),tpg.end(),a); // récup du réel type
                  // s'il n'existe pas déjà on l'enregistre vraiment
                  if (find(tpg_ret.begin(),tpg_ret.end(),a) == tpg_ret.end())
                       tpg_ret.push_back(*il);
                  }
              else
                { cout << "\n erreur, grandeur non disponible !, recommencez ";};
             }
          }
        catch (ErrSortieFinale)
             // cas d'une direction voulue vers la sortie
             // on relance l'interuption pour le niveau supérieur
           { ErrSortieFinale toto;
             throw (toto);
           }
        catch (...)// erreur en lecture
          {  cout << "\n Erreur dans la lecture de grandeur particuliere !!, "
                  << "\n redonnez une bonne valeur"
                  << "\n ou taper fin_prog pour arreter le programme"; 
             choix_valide=false;
           }
      } //-- fin du premier while 
      tabelement_typeParti_retenu(imail).sort(); // on ordonne
      tabelement_typeParti_retenu(imail).unique();// on supprime les doublons 
      }; //-- fin de if (tabelement_typeParti(imail).size() != 0 )                          
     }//-- fin de la boucle sur les maillages   
  };
  
// initialisation de l'exécution du  transferts
void Isovaleurs_Gmsh::InitPremierIncrExecutionTransfertAuxNoeuds() 
 { // cas du premier incrément et que l'on veut un transfert
   // l'objectif est d'initialiser de manière a doc les noeuds (introduire les grandeurs)
   // on boucle sur les maillages
   int nb_mail=lesMail->NbMaillage();
   for (int imail=1;imail<=nb_mail;imail++)
    { lesMail->AjoutConteneurAuNoeud(imail,glob_elem_ddl_retenu,tab_quelconque);
    };
 };
      
// définition interactives des paramètres généraux des isovaleurs
void Isovaleurs_Gmsh::ParametresGeneraux(const string& )
 {  bool choix_val = false;
    bool fr = ParaGlob::Francais();
    if (fr)
			   {cout << "\n -- parametres generaux pour la sortie des isovaleurs ";}
    else
			   {cout << "\n -- definition of the main parameters for the isovalues ";}
			 string rep;
			 while (!choix_val)
     {try
       {if (fr)
         {cout << "\n (0 ou f ou fin) fin modif"
               << "\n (1) sortie des tenseurs dans le repere absolu (par defaut) "
               << "\n (2) sortie des tenseurs dans un repere ad hoc, qui depend du type d'element ";
          cout << "\n \n reponse ? ";
         }
        else
         {cout << "\n (0 or f or end) end of modif"
               << "\n (1) output of the tensor componants in the global frame (default) "
               << "\n (2) output of the tensor componants in a specific local frame, depending of the element ";
          cout << "\n \n answers ? ";
         };
			     rep = lect_return_defaut(false,"f");
			     // sinon
			     int num = ChangeEntier(rep);
			     if ((rep == "0")||(rep == "f")||(rep == "end"))
			       { choix_val=true; }
			     else
			       { // def du type de sortie
			         if (num == 1) { absolue = true;}
			         else if (num == 2) { absolue = false;}
			         else 
			          { if (fr)
                {cout << "\n Erreur on attendait un entier entre 0 et 1 ou 2!!, "
			                   << "\n redonnez une bonne valeur";
                }
               else
                {cout << "\n Error the answers is an int in the range of 0..2 !!, "
			                   << "\n try again ";
                };
			            choix_val=false;
			          };
			       };
       }
     catch (ErrSortieFinale)
          // cas d'une direction voulue vers la sortie
          // on relance l'interuption pour le niveau supérieur
        { ErrSortieFinale toto;
          throw (toto);
        }
     catch (...)// erreur de lecture
            {if (fr)
               {cout << "\n Erreur on attendait un des mots cles proposés !!, "
                     << "\n redonnez une bonne valeur"
                     << "\n ou taper fin_prog pour arreter le programme";
               }
             else
               {cout << "\n error, we expect one of the proposed keywords  !!, "
                     << "\n try again to give a right answer "
                     << "\n or write 'f' in order to stop this menu ";
               };
               choix_val=false;
            };
    }; //-- fin du while
		
   return;
  };


// ---- cas de l'ancien format ---------
// sortie d'une view pour un type quelconque simple !!, c'est-à-dire pas un tableau par exemple
// en fait ne concerne que les types scalaires, vectoriels, ou tensoriels
// dans le cas où le type simple provient d'un tableau
// numero donne un numéro de l'élément à sortir dans l'entête de la view si diff de 0
void Isovaleurs_Gmsh::SortirUneViewTypeQuelconque_old_format(ostream & sort,TypeQuelconque_enum_etendu enu
                 ,EnumType2Niveau  enuStructure, int numero
                 ,Tableau <List_io < bool >::iterator >& t_indic_sortie,int nbmail
                 ,const Tableau <int>& tab_mail,EnumTypeGrandeur enugrandeur,LesMaillages * lesMail,const int& incre)
 {  // def de l'entete
    string nom((enu.NomPlein()));
    EnteteView(sort,incre,nom,numero);

    // ramène le tableau t_Egmsh
    // t_Egmsh(im)(ie): donne pour le maillage im, et pour l'élément ie, le numéro gmsh de l'élément
    const Tableau < Tableau < int > >& t_Egmsh = mailInitial->TabEgmsh(); 
    // récup de la connection herezh->gmsh
    // t_GmshHer(i)(j) : donne pour le noeud j de l'élément i de gmsh, le numéro d'herezh  
    const Tableau < Tableau < int > >& tGmshHer = Visualisation_Gmsh::Tab_GmshHer(); 

    // on définit un cas du type de celui géré par gmsh
    int castype = 0; 
    switch (enugrandeur)
         { case SCALAIRE: case SCALAIRE_ENTIER: case SCALAIRE_DOUBLE:
               {castype=1;break;}
         	case COORDONNEE: case COORDONNEEB:  case COORDONNEEH:
              {castype=2;break;}  
         	case  TENSEURBB: case TENSEURHH: 
              {castype=3;break;}
//         	case CHAINE_CAR:  // pour l'instant on n'a pas de type quelconque  pour le type caractère donc on ne met rien
//              {castype=4;break;}
          default:
             cout << "\n ***** erreur en sortie de la grandeur quelconque " << (enu.NomPlein())
                  << " le type " << NomType2Niveau(enuStructure) << "n'est pas gere par gmsh, le fichier resultat "
                  << " ne sera donc pas exploitable !! on continue quand meme !!"; 
             return;      
         };          

        for (int im =1; im <= nbmail; im++)
         {// on ne continue que si la grandeur quelconque est à sortir
          if (*(t_indic_sortie(im)))
          	{int numMail = tab_mail(im);
             int nbmaxelem = lesMail->Nombre_element(numMail);
             int dcaN = mailInitial->DecalNumNoeud(numMail);
             for (int numElem = 1; numElem <= nbmaxelem; numElem++)
          	   {Element& elem  = lesMail->Element_LesMaille(numMail,numElem); // récup de l'élément
                Tableau<Noeud *>& t_n = elem.Tab_noeud();
                int num_elem_gmsh = t_Egmsh(im)(numElem);  // numéro de classement du type d'élément gmsh
               // -- sortie du type de valeur: scalaire, vecteur ou tenseur
   // ***** a complèter pour les éléments quadratiques incomplet et les autres non possibles *****
               switch (castype)
                  { case 1: {sort << "\n" << tabScalVecTensGmsh.scalar_pourView(num_elem_gmsh)<< "(";break;}  
                  	 case 2: {sort << "\n" << tabScalVecTensGmsh.vector_pourView(num_elem_gmsh)<< "(";break;}  
                  	 case 3: {sort << "\n" << tabScalVecTensGmsh.tensor_pourView(num_elem_gmsh)<< "(";break;}
                  	 case 4: {sort << "\n" << tabScalVecTensGmsh.text_pourView(num_elem_gmsh)<< "(";break;}
                  };          
               // -- sortie des coordonnées 
               // on considère le nombre de noeuds de la sortie gmsh, et non celui de l'élément (qui peut-être
               // plus grand dans le cas d'un sfe, ou plus petit dans le cas d'un quadratique incomplet !)
               int nbNmax = tGmshHer(num_elem_gmsh).Taille(); //t_n.Taille();
               for (int ino=1;ino<=nbNmax;ino++) // ino = numéro gmsh
                { int num_her = tGmshHer(num_elem_gmsh)(ino); // --> num HZpp
                  int num_N = t_n(num_her)->Num_noeud()+dcaN; // num global
                  SortieUseUneCoordonnee(incre,sort,(ino == nbNmax),num_N);
                };
               // -- sortie des grandeurs
               for (int ino=1;ino<=nbNmax;ino++)
                {int num_her = tGmshHer(num_elem_gmsh)(ino); // --> num HZpp
                 const TypeQuelconque& tyret =  t_n(num_her)->Grandeur_quelconque(enu); // récup de la grandeur
                 switch (castype)
                  { case 1: // cas d'une grandeur scalaire (mais qui peut venir d'un tableau)
                      { switch (enuStructure)
                             {case TYPE_SIMPLE:{tyret.Const_Grandeur_pointee()->Grandeur_brut(sort,ParaGlob::NbdigdoGR());
                                                break;};
                              case TABLEAU_T: {Tab_Grandeur_scalaire_double* t_grandeur =
                                                   ((Tab_Grandeur_scalaire_double*) tyret.Const_Grandeur_pointee());
                                               Grandeur_scalaire_double& grandeur =t_grandeur->Grandeur_scalaire_associee(numero); 
                                               grandeur.Grandeur_brut(sort,ParaGlob::NbdigdoGR());
                                               break;};
                              default:
                                cout << "\n -1- *** attention la structure " << NomType2Niveau(enuStructure) << " pour le type "
                                     << NomTypeGrandeur(enugrandeur) << " n'est pas encore gere pour "
                                     << " la sortie gmsh le fichier resultat  ne sera donc pas exploitable !! on continue quand meme !!"
                                     << "\n Isovaleurs_Gmsh::SortirUneViewTypeQuelconque_old_format(...";
                             };
                         break;
                      }
                  	case 2: // cas d'une grandeur vectorielle à trois coordonnées, si il y en a moins, il y a des 0 à la place 
                      { const TypeQuelconque::Grandeur& grandeur=*(tyret.Const_Grandeur_pointee()); // pour simplifier
                        switch (enuStructure)
                             {case TYPE_SIMPLE:{sort << setprecision(ParaGlob::NbdigdoGR())
									                                            << grandeur.GrandeurNumOrdre(1)
                                                     <<", "<<grandeur.GrandeurNumOrdre(2) <<","
                                                     << grandeur.GrandeurNumOrdre(3) ;
                                                break;};
                              case TABLEAU_T: 
                                {Tab_Grandeur_Coordonnee* tab_coor = ((Tab_Grandeur_Coordonnee*) tyret.Const_Grandeur_pointee());
                                 int taille = tab_coor->Taille();
                                 // on boucle, et on sort  chaque coordonnée
                                 for (int i=1;i<=taille;i++)
                                   { const Grandeur_coordonnee&  coor = tab_coor->Grandeur_Coordonnee_associee(i);
                                     sort << setprecision(ParaGlob::NbdigdoGR())
												                              << coor.GrandeurNumOrdre(1) <<", "<<coor.GrandeurNumOrdre(2) <<"," 
                                          << coor.GrandeurNumOrdre(3) ;
                                 	 };
                                 break;
                                }
                              // pour l'instant il n'y a pas de tableau de coordonnée qui existe donc on ne met rien d'autre
                              default:
                                cout << "\n -2- *** attention la structure " << NomType2Niveau(enuStructure) << " pour le type "
                                     << NomTypeGrandeur(enugrandeur) << " n'est pas encore gere pour "
                                     << " la sortie gmsh le fichier resultat  ne sera donc pas exploitable !! on continue quand meme !!"
                                     << "\n Isovaleurs_Gmsh::SortirUneViewTypeQuelconque_old_format(...";
                             };
                         break;
                      }
                  	case 3: // cas d'une grandeur tensorielle: forcément de dimension 9 (mais qui appartenir à un tableau
                       { const TypeQuelconque::Grandeur& grandeur=*(tyret.Const_Grandeur_pointee()); // pour simplifier
                         switch (enuStructure)
                           {case TYPE_SIMPLE:
                             { switch (grandeur.Type_grandeurAssocie())
                               { case TENSEURBB: 
                                   { const TenseurBB& t_BB =  ((Grandeur_TenseurBB*) &grandeur)->RefConteneurTenseur();
                                     Isovaleurs_Gmsh::SortieTenseurBB_ancien_format(sort,t_BB);
                                     break;                  
                                    }
                                 case TENSEURHH:
                                   { const TenseurHH& t_HH =  ((Grandeur_TenseurHH*) &grandeur)->RefConteneurTenseur();
                                     Isovaleurs_Gmsh::SortieTenseurHH_ancien_format(sort,t_HH);
                                     break;                  
                                    }
                                 default:
                                   cout << "\n -3- *** attention la structure " << NomType2Niveau(enuStructure) << " pour le type "
                                        << NomTypeGrandeur(enugrandeur) << " n'est pas encore gere pour "
                                        << " la sortie gmsh le fichier resultat  ne sera donc pas exploitable !! on continue quand meme !!"
                                        << "\n Isovaleurs_Gmsh::SortirUneViewTypeQuelconque_old_format(...";
                                };
                               break;
                             }
                            case TABLEAU_T: 
                              {switch (grandeur.Type_grandeurAssocie())
                               {case TENSEURHH:
                                   { const Tab_Grandeur_TenseurHH* g_t_t_HH =  ((Tab_Grandeur_TenseurHH*) &grandeur);
                                     const Grandeur_TenseurHH& g_t_HH = g_t_t_HH->Grandeur_TenseurHH_associee(numero);
                                     const TenseurHH& t_HH =  g_t_HH.RefConteneurTenseur();
                                     Isovaleurs_Gmsh::SortieTenseurHH_ancien_format(sort,t_HH);
                                     break;                  
                                    }
                                // pour l'instant il n'y a que les tableaux de tenseurHH qui existent    
                                default:
                                   cout << "\n -4- *** attention la structure " << NomType2Niveau(enuStructure) << " pour le type "
                                        << NomTypeGrandeur(enugrandeur) << " n'est pas encore gere pour "
                                        << " la sortie gmsh le fichier resultat  ne sera donc pas exploitable !! on continue quand meme !!"
                                        << "\n Isovaleurs_Gmsh::SortirUneViewTypeQuelconque_old_format(...";
                               };
                               break;
                              }

                            // pour l'instant il n'y a que les types simples et les tableaux qui sont pris en compte pour les tenseurs   
                            default:
                               cout << "\n -5- *** attention la structure " << NomType2Niveau(enuStructure) << " pour le type "
                                    << NomTypeGrandeur(enugrandeur) << " n'est pas encore gere pour "
                                    << " la sortie gmsh le fichier resultat  ne sera donc pas exploitable !! on continue quand meme !!"
                                    << "\n Isovaleurs_Gmsh::SortirUneViewTypeQuelconque_old_format(...";
                           }; // fin du switch (enuStructure) pour les tenseurs
                         break;
                       } //-- fin du cas castype = 3 c-a-d des cas relatifs aux tenseurs 
                  }; //-- fin du switch (castype) 
                 // gestion des fins de ligne 
                 if (ino != nbNmax)  {sort <<", ";} 
                 else                {sort <<"};";};
              
                }; //-- fin de la boucle sur les noeuds de l'éléments
          	   }; //-- fin de la boucle sur les éléments
          	}; //-- fin du test if (*(t_indic_sortie(im))) 
         }; //-- fin de la boucle sur les maillage
        // fin de la view
        sort << "\n }; "; 
 };
// sortie d'une view pour un type quelconque simple !!, c'est-à-dire pas un tableau par exemple
// en fait ne concerne que les types scalaires, vectoriels, ou tensoriels
// dans le cas où le type simple provient d'un tableau
// numero donne un numéro de l'élément à sortir dans l'entête de la view si diff de 0
void Isovaleurs_Gmsh::SortirUneViewTypeQuelconque(ostream & sort,TypeQuelconque& typ
                 ,EnumType2Niveau  enuStructure, int numero
                 ,Tableau <List_io < bool >::iterator >& t_indic_sortie,int nbmail
                 ,const Tableau <int>& tab_mail,EnumTypeGrandeur enugrandeur,LesMaillages * lesMail,const int& incre)
 {  	  
    // récup du temps actuel
    double temps_actuel = ParaGlob::Variables_de_temps().TempsCourant();
    TypeQuelconque_enum_etendu enu = typ.EnuTypeQuelconque();
    EnuTypeQuelParticulier enu_particulier
         =  typ.Const_Grandeur_pointee()->Type_enumGrandeurParticuliere();

    // on définit un cas du type de celui géré par gmsh
    int castype = 0;int NB_val = 0; 
    switch (enugrandeur)
      {case SCALAIRE: case SCALAIRE_ENTIER: case SCALAIRE_DOUBLE:
            {castype=1;NB_val=1;break;}
      	case COORDONNEE: case COORDONNEEB:  case COORDONNEEH:
           {castype=2;NB_val=3; break;}
       case BASE__H: // en fait une base est traite comme un ensemble de une grandeur
                     //  COORDONNEE par axe de la base
                     // donc arrivée ici on sort une grandeur COORDONNEE de numéro i
           {castype=5;NB_val=3;
            break;
           }
      	case  TENSEURBB: case TENSEURHH:
           {castype=3;NB_val=9;break;}
       case VECTEUR: // pas géré par gmsh directement
           {int nb_double = 0;
            switch (enuStructure)
              { case TYPE_SIMPLE:
                 {
                   if (enu_particulier == PARTICULIER_VECTEUR_NOMMER)
                     {Grandeur_Vecteur_Nommer* t_grandeur =
                           ((Grandeur_Vecteur_Nommer*) typ.Const_Grandeur_pointee());
                      nb_double = t_grandeur->ConteneurVecteur().Taille();
                      castype=4;
                     }
                    else if (enu_particulier == PARTICULIER_VECTEUR)
                     {Grandeur_Vecteur* t_grandeur =
                           ((Grandeur_Vecteur*) typ.Const_Grandeur_pointee());
                      nb_double = t_grandeur->ConteneurVecteur()->Taille();
                      castype=6;
                     }
                  break;
                 };
                case TABLEAU_T:
                 {
                   if (enu_particulier == PARTICULIER_TABLEAU_VECTEUR_NOMMER)
                     {Tab_Grandeur_Vecteur_Nommer* t_grandeur =
                           ((Tab_Grandeur_Vecteur_Nommer*) typ.Const_Grandeur_pointee());
                      Grandeur_Vecteur_Nommer& grn = (*t_grandeur)(numero);
                      nb_double = grn.ConteneurVecteur().Taille();
                      castype=4;
                     }
                    else if (enu_particulier == PARTICULIER_TABLEAU_VECTEUR)
                     {Tab_Grandeur_Vecteur* t_grandeur =
                           ((Tab_Grandeur_Vecteur*) typ.Const_Grandeur_pointee());
                      const Grandeur_Vecteur& grn = (*t_grandeur)(numero);
                      nb_double = grn.ConteneurVecteur_const().Taille();
                      castype=6;
                     }
                  break;
                 }
                default:
                 cout << "\n ***** erreur en sortie de la grandeur quelconque " << (enu.NomPlein()  )
                      << " le type " << NomType2Niveau(enuStructure) << "n'est pas gere par gmsh, le fichier resultat "
                      << " ne sera donc pas exploitable !! on continue quand meme !!";
                 return;
              };
            switch (nb_double)
              { case 1: NB_val=1; break;
                case 2: case 3: NB_val=3; break;
                case 4: case 5: case 6: NB_val=6; break;
                default: // cas non prévu pour l'instant dans gmsh
                 cout << "\n ***** erreur en sortie de la grandeur quelconque " << enu.NomPlein()
                      << " le type " << NomType2Niveau(enuStructure) << "n'est pas gere par gmsh, le fichier resultat "
                      << " ne sera donc pas exploitable !! on continue quand meme !!";
                 return;
             };
            break;
           }
//      	case CHAINE_CAR:  // pour l'instant on n'a pas de type quelconque  pour le type caractère donc on ne met rien
//           {castype=4;break;}
       default:
          cout << "\n ***** erreur en sortie de la grandeur quelconque " << enu.NomPlein()
               << " le type " << NomType2Niveau(enuStructure) << "n'est pas gere par gmsh, le fichier resultat "
               << " ne sera donc pas exploitable !! on continue quand meme !!"; 
          return;      
      };          
	   // def de l'entete
    string nom(enu.NomPlein());
	   if (numero != 0)
	   nom = nom + "_" + ChangeEntierSTring(numero);
	   EnteteNodeData(sort,incre,temps_actuel,nom,NB_val);

    // s'il faut sortir une grandeur nulle on la définie: a priori c'est une opération
    // qui est faite uniquement une fois pour chaque
    // type donc pas couteuse
    TypeQuelconque type_null(typ);
    // on initialise la grandeur par défaut
    type_null.Grandeur_pointee()->InitParDefaut();

    // -- sortie des grandeurs
    // on balaie les maillages
    for (int im =1; im <= nbmail; im++)
     { // on ne continue que si le maillage est à sortir
       // !!! en fait avec gmsh, et le nouveau format, il faut que l'on sorte toujours quelque chose, car le nombre de noeuds
       // est celui de l'ensemble des maillages présents, à moins que le maillage ne soit pas actif, là il n'y a pas de pb, mais
       // dans les autres cas, il faut que le nombre de valeurs = le nombre de noeuds, quelque soit les grandeurs. Donc l'idée
       // est de sortir une grandeur nulle, lorsque la grandeur n'est pas prévue pour ce maillage
       bool grandeur_prevu_en_sortie = (*(t_indic_sortie(im))); // drapeau utilisé en sortie
//       if (*(t_indic_sortie(im))) // première version
         {int numMail = tab_mail(im);
          int decal_noe = mailInitial->DecalNumNoeud(numMail);
          Tableau<Noeud *>& t_n = lesMail->Tab_noeud(numMail);
          int nbmaxinoeud = t_n.Taille();
          for (int numNoeud=1; numNoeud<= nbmaxinoeud;numNoeud++) 
            { // recup du noeud
              Noeud & noe = lesMail->Noeud_LesMaille(numMail,numNoeud);
              sort << "\n" << noe.Num_noeud()+decal_noe << " " ;
              //--   les grandeurs
              // ici on va choisir entre le cas normal et le cas d'une grandeur nulle
              TypeQuelconque const *  typ_en_sortie = &type_null; // init à la valeur par défaut
              if (grandeur_prevu_en_sortie)
                typ_en_sortie = &(noe.Grandeur_quelconque(enu));
              // puis on sort la grandeur
              switch (castype)
                  { case 1: // cas d'une grandeur scalaire (mais qui peut venir d'un tableau)
                      { switch (enuStructure)
                          { case TYPE_SIMPLE:{typ_en_sortie->Const_Grandeur_pointee()->Grandeur_brut(sort,ParaGlob::NbdigdoGR());
                                              break;};
                            case TABLEAU_T: {Tab_Grandeur_scalaire_double* t_grandeur =
                                                 ((Tab_Grandeur_scalaire_double*) typ_en_sortie->Const_Grandeur_pointee());
                                             Grandeur_scalaire_double& grandeur =t_grandeur->Grandeur_scalaire_associee(numero); 
                                             grandeur.Grandeur_brut(sort,ParaGlob::NbdigdoGR());
                                             break;};
                            default:
                              cout << "\n -1- *** attention la structure " << NomType2Niveau(enuStructure) << " pour le type "
                                   << NomTypeGrandeur(enugrandeur) << " n'est pas encore gere pour "
                                   << " la sortie gmsh le fichier resultat  ne sera donc pas exploitable !! on continue quand meme !!"
                                   << "\n Isovaleurs_Gmsh::SortirUneViewTypeQuelconque(...";
                          };
                         break;
                      }
                  	 case 2: // cas d'une grandeur vectorielle à trois coordonnées, si il y en a moins, il y a des 0 à la place 
                      { const TypeQuelconque::Grandeur& grandeur=*(typ_en_sortie->Const_Grandeur_pointee()); // pour simplifier
                        switch (enuStructure)
                             {case TYPE_SIMPLE:{sort << setprecision(ParaGlob::NbdigdoGR())
									                          << grandeur.GrandeurNumOrdre(1) <<" "<<grandeur.GrandeurNumOrdre(2) <<" " 
                                                     << grandeur.GrandeurNumOrdre(3) ;
                                                break;};
                              case TABLEAU_T: 
                                {Tab_Grandeur_Coordonnee* tab_coor = ((Tab_Grandeur_Coordonnee*) typ_en_sortie->Const_Grandeur_pointee());
                                 // on sort  les coordonnées pour numéro
                                 const Grandeur_coordonnee&  coor = tab_coor->Grandeur_Coordonnee_associee(numero);
                                 sort << setprecision(ParaGlob::NbdigdoGR())
												                          << coor.GrandeurNumOrdre(1) <<"  "<<coor.GrandeurNumOrdre(2) <<" " 
                                      << coor.GrandeurNumOrdre(3) ;
                                 break;
                                }
                              // pour l'instant il n'y a pas de tableau de coordonnée qui existe donc on ne met rien d'autre
                              default:
                                cout << "\n -2- *** attention la structure " << NomType2Niveau(enuStructure) << " pour le type "
                                     << NomTypeGrandeur(enugrandeur) << " n'est pas encore gere pour "
                                     << " la sortie gmsh le fichier resultat  ne sera donc pas exploitable !! on continue quand meme !!"
                                     << "\n Isovaleurs_Gmsh::SortirUneViewTypeQuelconque(...";
                             };
                         break;
                      }
                  	 case 3: // cas d'une grandeur tensorielle: forcément de dimension 9 (mais qui appartenir à un tableau
                       { const TypeQuelconque::Grandeur& grandeur=*(typ_en_sortie->Const_Grandeur_pointee()); // pour simplifier
                         switch (enuStructure)
                           {case TYPE_SIMPLE:
                             { switch (grandeur.Type_grandeurAssocie())
                               { case TENSEURBB: 
                                   { const TenseurBB& t_BB =  ((Grandeur_TenseurBB*) &grandeur)->RefConteneurTenseur();
                                     Isovaleurs_Gmsh::SortieTenseurBB(sort,t_BB);
                                     break;                  
                                    }
                                 case TENSEURHH:
                                   { const TenseurHH& t_HH =  ((Grandeur_TenseurHH*) &grandeur)->RefConteneurTenseur();
                                     Isovaleurs_Gmsh::SortieTenseurHH(sort,t_HH);
                                     break;                  
                                    }
                                 default:
                                   cout << "\n -3- *** attention la structure " << NomType2Niveau(enuStructure) << " pour le type "
                                        << NomTypeGrandeur(enugrandeur) << " n'est pas encore gere pour "
                                        << " la sortie gmsh le fichier resultat  ne sera donc pas exploitable !! on continue quand meme !!"
                                        << "\n Isovaleurs_Gmsh::SortirUneViewTypeQuelconque(...";
                                };
                               break;
                             }
                            case TABLEAU_T: 
                              {switch (grandeur.Type_grandeurAssocie())
                               {case TENSEURHH:
                                   { const Tab_Grandeur_TenseurHH* g_t_t_HH =  ((Tab_Grandeur_TenseurHH*) &grandeur);
                                     const Grandeur_TenseurHH& g_t_HH = g_t_t_HH->Grandeur_TenseurHH_associee(numero);
                                     const TenseurHH& t_HH =  g_t_HH.RefConteneurTenseur();
                                     Isovaleurs_Gmsh::SortieTenseurHH(sort,t_HH);
                                     break;                  
                                    }
                                case TENSEURBB:
                                   { const Tab_Grandeur_TenseurBB* g_t_t_BB =  ((Tab_Grandeur_TenseurBB*) &grandeur);
                                     const Grandeur_TenseurBB& g_t_BB = g_t_t_BB->Grandeur_TenseurBB_associee(numero);
                                     const TenseurBB& t_BB =  g_t_BB.RefConteneurTenseur();
                                     Isovaleurs_Gmsh::SortieTenseurBB(sort,t_BB);
                                     break;
                                    }
                                // pour l'instant il n'y a que les tableaux de tenseurHH qui existent
                                default:
                                   cout << "\n -4- *** attention la structure " << NomType2Niveau(enuStructure) << " pour le type "
                                        << NomTypeGrandeur(enugrandeur) << " n'est pas encore gere pour "
                                        << " la sortie gmsh le fichier resultat  ne sera donc pas exploitable !! on continue quand meme !!"
                                        << "\n Isovaleurs_Gmsh::SortirUneViewTypeQuelconque(...";
                               };
                               break;
                              }

                            // pour l'instant il n'y a que les types simples et les tableaux qui sont pris en compte pour les tenseurs   
                            default:
                               cout << "\n -5- *** attention la structure " << NomType2Niveau(enuStructure) << " pour le type "
                                    << NomTypeGrandeur(enugrandeur) << " n'est pas encore gere pour "
                                    << " la sortie gmsh le fichier resultat  ne sera donc pas exploitable !! on continue quand meme !!"
                                    << "\n Isovaleurs_Gmsh::SortirUneViewTypeQuelconque(...";
                           }; // fin du switch (enuStructure) pour les tenseurs
                         break;
                       } //-- fin du cas castype = 3 c-a-d des cas relatifs aux tenseurs 
                    case 4: // cas d'une grandeur VECTEUR nommé que l'on gère comme un tableau de scalaires
                      { switch (enuStructure)
                          { case TYPE_SIMPLE:
                              {Grandeur_Vecteur_Nommer* t_grandeur =
                                    ((Grandeur_Vecteur_Nommer*) typ_en_sortie->Const_Grandeur_pointee());
                               Vecteur& vec = *((Vecteur*) &t_grandeur->ConteneurVecteur());
                               Isovaleurs_Gmsh::SortieVecteur(sort,vec);
                               break;
                              };
                            case TABLEAU_T:
                              {Tab_Grandeur_Vecteur_Nommer* t_grandeur =
                                   ((Tab_Grandeur_Vecteur_Nommer*) typ_en_sortie->Const_Grandeur_pointee());
                               Grandeur_Vecteur_Nommer& grn = (*t_grandeur)(numero);
                               const Vecteur& vec = *((const Vecteur*) &(grn.ConteneurVecteur()));
                               Isovaleurs_Gmsh::SortieVecteur(sort,vec);
                               break;
                              }
                            default:
                              cout << "\n -1- *** attention la structure " << NomType2Niveau(enuStructure) << " pour le type "
                                   << NomTypeGrandeur(enugrandeur) << " n'est pas encore gere pour "
                                   << " la sortie gmsh le fichier resultat  ne sera donc pas exploitable !! on continue quand meme !!"
                                   << "\n Isovaleurs_Gmsh::SortirUneViewTypeQuelconque(...";
                          };
                         break;
                      }
                    case 5: // cas d'une grandeur de type BaseH
                            // c'est géré comme une succession de vecteur à trois coordonnées, si il y en a moins, il y a des 0 à la place
                      { const TypeQuelconque::Grandeur& grandeur=*(typ_en_sortie->Const_Grandeur_pointee()); // pour simplifier
                        switch (enuStructure)
                             {case TYPE_SIMPLE:
                               { Grandeur_BaseH* base
                                       = ((Grandeur_BaseH*) typ_en_sortie->Const_Grandeur_pointee());
                                 // le numéro de sortie correspond au numéro de vecteur de base
                                 const BaseH& baH1 = base->RefConteneurBaseH();
                                 const Coordonnee& V =  baH1.Coordo(numero);
                                 V.Affiche(sort,ParaGlob::NbdigdoGR());
                                 // sur gmsh, il faut des vecteurs à 3 composantes
                                 switch (3 - V.Dimension())
                                   {case 0: // on ne fait rien
                                       break;
                                    case 1: // cas où il manque une composante
                                       sort << " 0 "; break;
                                    case 2: // il manque 2 composantes
                                       sort << " 0  0 "; break;
                                    case 3: // il manque 3  composantes... un peu étrange !!
                                       sort << " 0  0  0 "; break;
                                    default:
                                      cout << "\n *** erreur en sortie d'une grandeur Grandeur_BaseH "
                                           << " la dimension du vecteur de la base = " << V.Dimension()
                                           << " le resultat ne sera pas exploitable par gmsh !";
                                       break;
                                   };
                                 break;
                               };
                              case TABLEAU_T:
                                {Tab_Grandeur_BaseH* tab_base
                                       = ((Tab_Grandeur_BaseH*) typ_en_sortie->Const_Grandeur_pointee());
                                 // on va considérer que toutes les bases ont le même nombre de vecteur
                                 // correspondant à la dimension de l'espace de travail
                                 int nb_vect = ParaGlob::Dimension();
                                 // récup du numéro de l'axe
                                 int N_a = ((numero-1) % nb_vect) + 1 ;
                                 // récup du numéro dans le tableau de la base
                                 int n_dans_tab = ((numero-1) / nb_vect) + 1 ;
                                 // récup de la base
                                 Grandeur_BaseH& gr = (*tab_base)(n_dans_tab);
                                 const BaseH& baH1 = gr.RefConteneurBaseH();
                                 // récup des coordonnées du vecteur N_a
                                 const Coordonnee& V =  baH1.Coordo(N_a);
                                 V.Affiche(sort,ParaGlob::NbdigdoGR());
                                 // sur gmsh, il faut des vecteurs à 3 composantes
                                 switch (3 - V.Dimension())
                                   {case 0: // on ne fait rien
                                       break;
                                    case 1: // cas où il manque une composante
                                       sort << " 0 "; break;
                                    case 2: // il manque 2 composantes
                                       sort << " 0  0 "; break;
                                    case 3: // il manque 3  composantes... un peu étrange !!
                                       sort << " 0  0  0 "; break;
                                    default:
                                      cout << "\n *** erreur en sortie d'une grandeur Grandeur_BaseH "
                                           << " provenant d'un element de tableau: "<<n_dans_tab
                                           << " la dimension du vecteur de la base = " << V.Dimension()
                                           << " le resultat ne sera pas exploitable par gmsh !";
                                       break;
                                   };
                                 break;
                                }
                              // pour l'instant rien d'autre
                              default:
                                cout << "\n -2- *** attention la structure " << NomType2Niveau(enuStructure) << " pour le type "
                                     << NomTypeGrandeur(enugrandeur) << " n'est pas encore gere pour "
                                     << " la sortie gmsh le fichier resultat  ne sera donc pas exploitable !! on continue quand meme !!"
                                     << "\n Isovaleurs_Gmsh::SortirUneViewTypeQuelconque(...";
                             };
                         break;
                      }
                    case 6: // cas d'une grandeur VECTEUR que l'on gère comme un tableau de scalaires
                      { switch (enuStructure)
                          { case TYPE_SIMPLE:
                              {Grandeur_Vecteur* t_grandeur =
                                    ((Grandeur_Vecteur*) typ_en_sortie->Const_Grandeur_pointee());
                               const Vecteur& vec = *((Vecteur*) t_grandeur->ConteneurVecteur());
                               Isovaleurs_Gmsh::SortieVecteur(sort,vec);
                               break;
                              };
                            case TABLEAU_T:
                              {Tab_Grandeur_Vecteur* t_grandeur =
                                   ((Tab_Grandeur_Vecteur*) typ_en_sortie->Const_Grandeur_pointee());
                               Vecteur& vec = *((Vecteur*) &(*t_grandeur)(numero));

                               Isovaleurs_Gmsh::SortieVecteur(sort,vec);
                               break;
                              }
                            default:
                              cout << "\n -1- *** attention la structure " << NomType2Niveau(enuStructure) << " pour le type "
                                   << NomTypeGrandeur(enugrandeur) << " n'est pas encore gere pour "
                                   << " la sortie gmsh le fichier resultat  ne sera donc pas exploitable !! on continue quand meme !!"
                                   << "\n Isovaleurs_Gmsh::SortirUneViewTypeQuelconque(...";
                          };
                         break;
                      }
                  }; //-- fin du switch (castype)
            };
         };
	    };
	   // fin de la view
	   sort << "\n$EndNodeData \n"; 
 };
 
//--ancien format --// utilitaire pour la sortie d'un tenseur HH
// bool: indique s'il faut une virgule ou non après le dernier enreg
void Isovaleurs_Gmsh::SortieTenseurHH_ancien_format(ostream & sort,const TenseurHH& t_HH)
 { switch (Abs(t_HH.Dimension()))  
    {case 1: { sort << setprecision(ParaGlob::NbdigdoGR()) << t_HH(1,1) << ", ";
               for (int i=2;i<=9;i++) sort << " 0., "; // le reste en 0
               break;
             }
     case 2: { sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(1,1) << ", ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(1,2) << ", 0., "; 
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(1,2) << ", " ;
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(2,2) << ", ";
               sort <<  " 0., 0., 0., 0. "; 
               break;
              };
     case 3: { sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(1,1) << ", ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(1,2) << ", ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(1,3) << ", ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(2,1) << ", ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(2,2) << ", ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(2,3) << ", ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(3,1) << ", ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(3,2) << ", ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(3,3) ;
               break;
              };
     default: cout << "\n erreur !! Isovaleurs_Gmsh::SortieTenseurHH(.."; Sortie(1);         
   	};
 };
 
//-- ancien format // utilitaire pour la sortie d'un tenseur BB
// bool: indique s'il faut une virgule ou non après le dernier enreg
void Isovaleurs_Gmsh::SortieTenseurBB_ancien_format(ostream & sort,const TenseurBB& t_BB)
 { switch (Abs(t_BB.Dimension()))  
    {case 1: { sort << setw(ParaGlob::NbdigdoGR())  << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,1) << ", "; 
               for (int i=2;i<=9;i++) sort << " 0., "; // le reste en 0
               break;
             }
     case 2: { sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,1) << ", ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,2) << ", 0., "; 
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,2) << ", " ;
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(2,2) << ", ";
               sort <<  " 0., 0., 0., 0. "; 
               break;
              };
     case 3: { sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,1) << ", ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,2) << ", ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,3) << ", ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(2,1) << ", ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(2,2) << ", ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(2,3) << ", ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(3,1) << ", ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(3,2) << ", ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(3,3) ;
               break;
              };
     default: cout << "\n erreur !! Isovaleurs_Gmsh::SortieTenseurBB(.."; Sortie(1);         
   	};
 };
// utilitaire pour la sortie d'un tenseur HH
// bool: indique s'il faut une virgule ou non après le dernier enreg
void Isovaleurs_Gmsh::SortieTenseurHH(ostream & sort,const TenseurHH& t_HH)
 { switch (Abs(t_HH.Dimension()))  
    {case 1: { sort << setw(ParaGlob::NbdigdoGR())  << setprecision(ParaGlob::NbdigdoGR()) << t_HH(1,1) << " "; 
               for (int i=2;i<=9;i++) sort << " 0.  "; // le reste en 0
               break;
             }
     case 2: { sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(1,1) << " ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(1,2) << "  0.  "; 
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(1,2) << "  " ;
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(2,2) << "  ";
               sort <<  " 0.  0.  0.  0. "; 
               break;
              };
     case 3: { sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(1,1) << " ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(1,2) << " ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(1,3) << " ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(2,1) << " ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(2,2) << " ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(2,3) << " ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(3,1) << " ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(3,2) << " ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_HH(3,3) ;
               break;
              };
     default: cout << "\n erreur !! Isovaleurs_Gmsh::SortieTenseurHH(.."; Sortie(1);         
   	};
 };
 
// utilitaire pour la sortie d'un tenseur BB
// bool: indique s'il faut une virgule ou non après le dernier enreg
void Isovaleurs_Gmsh::SortieTenseurBB(ostream & sort,const TenseurBB& t_BB)
 { switch (Abs(t_BB.Dimension()))  
    {case 1: { sort << setw(ParaGlob::NbdigdoGR())  << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,1) << " "; 
               for (int i=2;i<=9;i++) sort << " 0. "; // le reste en 0
               break;
             }
     case 2: { sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,1) << " ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,2) << " 0. "; 
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,2) << " " ;
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(2,2) << " ";
               sort <<  " 0. 0. 0. 0. "; 
               break;
              };
     case 3: { sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,1) << " ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,2) << " ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(1,3) << " ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(2,1) << " ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(2,2) << " ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(2,3) << " ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(3,1) << " ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(3,2) << " ";
               sort << setw(ParaGlob::NbdigdoGR()) << setprecision(ParaGlob::NbdigdoGR()) << t_BB(3,3) ;
               break;
              };
     default: cout << "\n erreur !! Isovaleurs_Gmsh::SortieTenseurBB(.."; Sortie(1);         
   	};
 };

// utilitaire pour une sortie de type Vecteur
void Isovaleurs_Gmsh::SortieVecteur(ostream & sort,const Vecteur& vec)
 {
   switch (vec.Taille())
     {case 1: // cas d'un équivalent scalaire
        sort << setprecision(ParaGlob::NbdigdoGR()) << vec(1) << " ";break;
      case 2: // là on fait un équivalent Coordonnees
        sort << setprecision(ParaGlob::NbdigdoGR())
             << vec(1) << " "<< vec(2) << " 0. ";break;
      case 3: // là on fait un équivalent Coordonnees
        sort << setprecision(ParaGlob::NbdigdoGR())
             << vec(1) << " "<< vec(2) << " "<< vec(3)<< " ";break;
      
      case 4: // là on fait un équivalent tenseur
        sort << setprecision(ParaGlob::NbdigdoGR())
             << vec(1) << " "<< vec(2) << " "<< vec(3)<< " "<< vec(4)
             << " 0 0 ";break;
      case 5: // là on fait un équivalent tenseur
        sort << setprecision(ParaGlob::NbdigdoGR())
             << vec(1) << " "<< vec(2) << " "<< vec(3)<< " "<< vec(4)
             << vec(5) << " 0 ";break;
      case 6: // là on fait un équivalent tenseur
        sort << setprecision(ParaGlob::NbdigdoGR())
             << vec(1) << " "<< vec(2) << " "<< vec(3)<< " "<< vec(4)
             << vec(5) << " "<< vec(6) << " ";break;
      default:
        cout << "\n nombre de composante du vecteur superieur a 6 "
             << " aucune sortie possible avec gmsh " ;
     };
 };


// initialisation les différentes listes internes qui globalisent tous les maillages
void Isovaleurs_Gmsh::GlobalisationListSurTousLesMaillagesPourLesNoeuds()
  { // on initialise toutes les listes globales
    glob_noe_ddl_retenu.clear();
    glob_noeud_ddl_etendu_retenu.clear();
    glob_noeud_evol_retenu.clear();
    glob_elem_ddl_retenu.clear();
    glob_elem_evol_retenu.clear();
    glob_elem_Parti_retenu.clear();
    // on passe en revue tous les maillages pour crées les listes globales des grandeurs 
    int nb_mail = tabnoeud_type_ddl_retenu.Taille(); // dim des maillages, via un tableau arbitraire
    for (int imail=1;imail<= nb_mail;imail++)
      { // on merge les listes (il faut qu'avant chaque merge, les listes soient ordonnées)
        // comme l'ordre merge ajoute les listes mais en détruisant la liste initiale, on crée une liste intermédiaire
        tabnoeud_type_ddl_retenu(imail).sort();
        List_io < Ddl_enum_etendu > interDddlenumetendu(tabnoeud_type_ddl_retenu(imail));        
        glob_noe_ddl_retenu.merge(interDddlenumetendu);

        tabnoeud_type_ddlEtendu_retenu(imail).sort();
        List_io < Ddl_enum_etendu > inter2Dddlenumetendu(tabnoeud_type_ddlEtendu_retenu(imail));
        glob_noeud_ddl_etendu_retenu.merge(inter2Dddlenumetendu);

        tabnoeud_evoluee_retenu(imail).sort();
        List_io < TypeQuelconque > internoeudevolretenu(tabnoeud_evoluee_retenu(imail));
//debug
//cout << "\n debug: Isovaleurs_Gmsh::GlobalisationListSurTousLesMaillagesPourLesNoeuds() ";
//cout << "\n list tabnoeud_evoluee_retenu("<<imail<<") "<< tabnoeud_evoluee_retenu(imail) << endl;
// fin debug
       
        glob_noeud_evol_retenu.merge(internoeudevolretenu);
        
        tabelement_type_ddl_retenu(imail).sort();
        List_io < Ddl_enum_etendu > interelemDddlenumetendu(tabelement_type_ddl_retenu(imail));
        glob_elem_ddl_retenu.merge(interelemDddlenumetendu);
        
        tabelement_evoluee_retenu(imail).sort();
        List_io < TypeQuelconque > interelemevolretenu(tabelement_evoluee_retenu(imail));
        glob_elem_evol_retenu.merge(interelemevolretenu);
        
        tabelement_typeParti_retenu(imail).sort();
        List_io < TypeQuelconque > interelempartiretenu(tabelement_typeParti_retenu(imail));        
        glob_elem_Parti_retenu.merge(interelempartiretenu);
        // on ordonne
        glob_noe_ddl_retenu.sort();
        glob_noeud_ddl_etendu_retenu.sort();
        glob_noeud_evol_retenu.sort();
        glob_elem_ddl_retenu.sort();
        glob_elem_evol_retenu.sort();
        glob_elem_Parti_retenu.sort();	
        // on supprime les doublons
        glob_noe_ddl_retenu.unique();
        glob_noeud_ddl_etendu_retenu.unique();
        glob_noeud_evol_retenu.unique();
        glob_elem_ddl_retenu.unique();
        glob_elem_evol_retenu.unique();
        glob_elem_Parti_retenu.unique();
    	};
    // pour le transfert des points d'intégration aux noeuds, on met à jour le tableau de pointeur global
    // ne concerne donc que les grandeurs quelconques définis aux noeuds
    if (glob_elem_evol_retenu.size()!=0) {tab_quelconque(1)= &glob_elem_evol_retenu;}
    else                                 {tab_quelconque(1)= NULL;};
    if (glob_elem_Parti_retenu.size()!=0){tab_quelconque(2)= &glob_elem_Parti_retenu;}
    else                                 {tab_quelconque(2)= NULL;};
    
    	
    // on définit les tableaux d'indicateurs de sortie de grandeurs
    for (int imai=1;imai<= nb_mail;imai++)
     { // initialisation des tableaux d'indicateurs
       List_io < bool >& g_noeud_type_ddl_asortir = t_g_noeud_ddl_asortir(imai); // pour simplifier
       g_noeud_type_ddl_asortir.clear();
       List_io < bool >& g_noeud_ddl_etendu_asortir = t_g_noeud_ddl_etendu_asortir(imai); // pour simplifier
       g_noeud_ddl_etendu_asortir.clear();
       List_io < bool >& g_noeud_evoluee_asortir = t_g_noeud_evoluee_asortir(imai); // pour simplifier
       g_noeud_evoluee_asortir.clear();
       List_io < bool >& g_element_ddl_asortir = t_g_elem_ddl_asortir(imai); // pour simplifier
       g_element_ddl_asortir.clear();
       List_io < bool >& g_element_evoluee_asortir = t_g_elem_evoluee_asortir(imai); // pour simplifier
       g_element_evoluee_asortir.clear();
       List_io < bool >& g_element_typeParti_asortir = t_g_elem_typeParti_asortir(imai); // pour simplifier
       g_element_typeParti_asortir.clear();
       // on passe en revue les grandeurs à sortir et on met à jour les indicateurs en conséquence

       // .. pour les ddl  aux noeuds 
      {List_io < Ddl_enum_etendu >& noeud_type_ddl_retenu = tabnoeud_type_ddl_retenu(imai); // pour simplifier
       List_io < Ddl_enum_etendu >::iterator i1,i1fin=glob_noe_ddl_retenu.end();
       for (i1=glob_noe_ddl_retenu.begin();i1!=i1fin;i1++)
         if (find(noeud_type_ddl_retenu.begin(),noeud_type_ddl_retenu.end(),(*i1)) == noeud_type_ddl_retenu.end())
               {g_noeud_type_ddl_asortir.push_back(false);} // cas où le ddl initial n'existe pas pour le maillage considéré
         else  {g_noeud_type_ddl_asortir.push_back(true);}; // cas où le ddl initial existe également pour le maillage considéré
      };

      {// .. pour les ddl étendues définis aux noeuds
       List_io < Ddl_enum_etendu >& noeud_type_ddlEtendu_retenu = tabnoeud_type_ddlEtendu_retenu(imai); // pour simplifier
       List_io < Ddl_enum_etendu >::iterator i1,i1fin=glob_noeud_ddl_etendu_retenu.end();
       for (i1=glob_noeud_ddl_etendu_retenu.begin();i1!=i1fin;i1++)
         if (find(noeud_type_ddlEtendu_retenu.begin(),noeud_type_ddlEtendu_retenu.end(),(*i1)) == noeud_type_ddlEtendu_retenu.end())
               {g_noeud_ddl_etendu_asortir.push_back(false);} // cas où le ddl étendu n'existe pas pour le maillage considéré
         else  {g_noeud_ddl_etendu_asortir.push_back(true);}; // cas où le ddl étendu existe également pour le maillage considéré
      };
      
      {// .. pour les types évoluées définis aux noeuds
       List_io < TypeQuelconque >& noeud_evoluee_retenu = tabnoeud_evoluee_retenu(imai); // pour simplifier
       List_io < TypeQuelconque >::iterator i1,i1fin=glob_noeud_evol_retenu.end();
       for (i1=glob_noeud_evol_retenu.begin();i1!=i1fin;i1++)
         if (find(noeud_evoluee_retenu.begin(),noeud_evoluee_retenu.end(),(*i1)) == noeud_evoluee_retenu.end())
               {g_noeud_evoluee_asortir.push_back(false);} // cas où le type évolué n'existe pas pour le maillage considéré
         else  {g_noeud_evoluee_asortir.push_back(true);}; // cas où le type évolué existe également pour le maillage considéré
      };

       // .. pour les ddl venant d'un transfert aux noeuds des grandeurs aux pt d'integ
       List_io < Ddl_enum_etendu >& element_type_ddl_retenu = tabelement_type_ddl_retenu(imai); // pour simplifier
       List_io < Ddl_enum_etendu >::iterator j1,j1fin=glob_elem_ddl_retenu.end();
       for (j1=glob_elem_ddl_retenu.begin();j1!=j1fin;j1++)
         if (find(element_type_ddl_retenu.begin(),element_type_ddl_retenu.end(),(*j1))== element_type_ddl_retenu.end())
               {g_element_ddl_asortir.push_back(false);} // cas où le ddl global n'existe pas pour le maillage considéré
         else  {g_element_ddl_asortir.push_back(true);}; // cas où le ddl global existe également pour le maillage considéré

       // .. pour les types évolulées venant d'un transfert aux noeuds des grandeurs aux pt d'integ
       List_io < TypeQuelconque >& element_evoluee_retenu = tabelement_evoluee_retenu(imai); // pour simplifier
       List_io < TypeQuelconque >::iterator k1,k1fin=glob_elem_evol_retenu.end();
       for (k1=glob_elem_evol_retenu.begin();k1!=k1fin;k1++)
         if (find(element_evoluee_retenu.begin(),element_evoluee_retenu.end(),(*k1))== element_evoluee_retenu.end())
               {g_element_evoluee_asortir.push_back(false);} // cas où le ddl évolué global n'existe pas pour le maillage considéré
         else  {g_element_evoluee_asortir.push_back(true);}; // cas où le ddl évolué global existe également pour le maillage considéré

       // .. pour les types particuliers aux elements venant d'un transfert aux noeuds
       List_io < TypeQuelconque >& element_typeParti_retenu = tabelement_typeParti_retenu(imai); // pour simplifier
       List_io < TypeQuelconque >::iterator m1,m1fin=glob_elem_Parti_retenu.end();
       for (m1=glob_elem_Parti_retenu.begin();m1!=m1fin;m1++)
         if (find(element_typeParti_retenu.begin(),element_typeParti_retenu.end(),(*m1))== element_typeParti_retenu.end())
               {g_element_typeParti_asortir.push_back(false);} // cas où le ddl évolué global n'existe pas pour le maillage considéré
         else  {g_element_typeParti_asortir.push_back(true);}; // cas où le ddl évolué global existe également pour le maillage considéré 
     };
	};

// vérification que le transfert peut se faire (pas de doublon de grandeurs)
void Isovaleurs_Gmsh::VerificationTransfertPossible_et_doublon()
 {  // l'objectif est de vérifier qu'il n'y a pas deux grandeurs identiques  au niveau des types quelconques et évoluées
    // (ce qui posera des pb au niveau des moyennes aux noeuds)
    int nb_mail = tabnoeud_type_ddl_retenu.Taille(); // dim des maillages, via un tableau arbitraire
    for (int imail=1;imail<= nb_mail;imail++)
      { List_io < TypeQuelconque >& element_evoluee_retenu =  tabelement_evoluee_retenu(imail); 
        List_io < TypeQuelconque >& element_typeParti_retenu = tabelement_typeParti_retenu(imail);
        List_io < TypeQuelconque >& noe_typeParti_retenu = tabnoeud_evoluee_retenu(imail);
        // on ordonne
        element_evoluee_retenu.sort();
        element_typeParti_retenu.sort();
        noe_typeParti_retenu.sort();
        // a priori il y a peut d'éléments donc on compare
        List_io < TypeQuelconque >::iterator i1,i1end = element_evoluee_retenu.end();
        i1=element_evoluee_retenu.begin();
        List_io < TypeQuelconque >::iterator j1,j1end = element_typeParti_retenu.end();
        j1=element_typeParti_retenu.begin();
        List_io < TypeQuelconque >::iterator k1,k1end = noe_typeParti_retenu.end();
        k1=noe_typeParti_retenu.begin();
        for (i1=element_evoluee_retenu.begin(); i1 != i1end; i1++)
          for (j1=element_typeParti_retenu.begin();j1 != j1end; j1++)
            for (k1=noe_typeParti_retenu.begin();k1 != k1end; k1++)
        	    { if ((*i1)==(*j1)) 
                {cout << "\n attention *** probleme concernant le transfert aux noeuds il ne faut pas avoir deux grandeurs identiques, or ici "
        	             << "\n on a la grandeurs : " << ((*i1).EnuTypeQuelconque().NomPlein()) << " en double !! "
        	             << "\n on supprime l'un d'eux ";
       	         element_typeParti_retenu.erase(j1);
        	       };
        	      if ((*i1)==(*k1))
                {cout << "\n attention *** probleme concernant le transfert aux noeuds il ne faut pas avoir deux grandeurs identiques, or ici "
        	             << "\n on a la grandeurs : " << ((*i1).EnuTypeQuelconque().NomPlein()) << " en double !! "
        	             << "\n on supprime l'un d'eux ";
       	         noe_typeParti_retenu.erase(k1);
        	       };
        	      if ((*j1)==(*k1))
                {cout << "\n attention *** probleme concernant le transfert aux noeuds il ne faut pas avoir deux grandeurs identiques, or ici "
        	             << "\n on a la grandeurs : " << ((*j1).EnuTypeQuelconque().NomPlein()) << " en double !! "
        	             << "\n on supprime l'un d'eux ";
       	         noe_typeParti_retenu.erase(k1);
        	       };
        	    };
      };

    // de plus, il ne faut pas qu'il y ait la même  grandeur de type évoluées définis aux noeuds, qui soit également définit pour le transfert
    // des pti aux noeud, ou en ddl pur
    // (cela posera des pb au niveau des moyennes aux noeuds, et de nom de fichier de sortie)
    for (int imail=1;imail<= nb_mail;imail++)
      { List_io < Ddl_enum_etendu >& noe_ddl_retenu =  tabnoeud_type_ddl_retenu(imail);
        List_io < Ddl_enum_etendu >& noe_ddlEtendu_retenu = tabnoeud_type_ddlEtendu_retenu(imail);
        List_io < Ddl_enum_etendu >& element_type_ddl_retenu = tabelement_type_ddl_retenu(imail);
        // on ordonne
        noe_ddl_retenu.sort();
        noe_ddlEtendu_retenu.sort();
        element_type_ddl_retenu.sort();
        // a priori il y a peu d'éléments donc on compare
        List_io < Ddl_enum_etendu >::iterator i1,i1end = noe_ddl_retenu.end();
        i1=noe_ddl_retenu.begin();
        List_io < Ddl_enum_etendu >::iterator j1,j1end = noe_ddlEtendu_retenu.end();
        j1=noe_ddlEtendu_retenu.begin();
        List_io < Ddl_enum_etendu >::iterator k1,k1end = element_type_ddl_retenu.end();
        k1=element_type_ddl_retenu.begin();
        for (i1=noe_ddl_retenu.begin(); i1 != i1end; i1++)
          for (j1=noe_ddlEtendu_retenu.begin();j1 != j1end; j1++)
           for (k1=element_type_ddl_retenu.begin();k1 != k1end; k1++)
        	{ if ((*i1)==(*j1)) 
        	   {cout << "\n attention *** probleme concernant le transfert aux noeuds il ne faut pas avoir deux grandeurs identiques, or ici "
        	         << "\n on a la grandeurs : " << (((*i1).Nom_vide()) ? Nom_ddl((*i1).Enum()) : (*i1).Nom() )
                  << " en double !! "
        	         << "\n on supprime l'un d'eux ";
       	        noe_ddlEtendu_retenu.erase(j1);
        	   };
        	  if ((*i1)==(*k1))
            {cout << "\n attention *** probleme concernant le transfert aux noeuds il ne faut pas avoir deux grandeurs identiques, or ici "
        	         << "\n on a la grandeurs : " << (((*i1).Nom_vide()) ? Nom_ddl((*i1).Enum()) : (*i1).Nom() )
                  << " en double !! "
        	         << "\n on supprime l'un d'eux ";
       	     element_type_ddl_retenu.erase(k1);
        	   };
        	  if ((*j1)==(*k1))
            {cout << "\n attention *** probleme concernant le transfert aux noeuds il ne faut pas avoir deux grandeurs identiques, or ici "
        	         << "\n on a la grandeurs : " << (((*j1).Nom_vide()) ? Nom_ddl((*j1).Enum()) : (*j1).Nom() )
                  << " en double !! "
        	         << "\n on supprime l'un d'eux ";
       	     element_type_ddl_retenu.erase(k1);
        	   };
        	};		
      };
  
 };
 
    //------------ méthodes utilitaires qui sont également utilisées par d'autres classes----

// numero: dans le cas où c'est une view pour un élément de tableau, donc de numéro numero
void Isovaleurs_Gmsh::EnteteView(ostream & sort,const int & incre, const string& nom,const int & numero ) const
 {  // def de l'entete
    sort << "\n\n View \""<< nom << " incre= " << incre ;
    if (numero != 0)
      sort << ",  NB tab  " << numero;
    sort <<"\" { ";
	};
    
// utilitaire pour la sortie de l'entête d'un bloc NodeData utilisé avec le nouveau format gmsh
// numero: dans le cas où c'est une view pour un élément de tableau, donc de numéro numero
void Isovaleurs_Gmsh::EnteteNodeData(ostream & sort,const int & incre, const double& temps
                   ,const string& nom,const int & nb_composante ) const
{	// dans le cas où l'incrément est supérieur à 1000000, on est dans un cas spécial de mode débug, pour lequel
  // le temps ne veut rien dire donc on a un traitement spécial
  if (incre < 1000000) // cas normal
		 {sort << "\n\n$NodeData \n1 \n\""<< nom
		       << "\"\n1 \n"<< temps << "\n3 \n"<< incre <<"\n"<< nb_composante <<"\n" 
         << mailInitial->Nb_total_noeud();
		 }
	 else 	// cas particulier début  
      {int compteur = incre % 1000000;
		     sort << "\n\n$NodeData \n1 \n\""<< nom 
		          << "\"\n1 \n"<< compteur << "\n3 \n"<< compteur <<"\n"<< nb_composante <<"\n"
		          << mailInitial->Nb_total_noeud();
		    }; 
};

// sortie de la def des coordonnées pour une view
void Isovaleurs_Gmsh::SortieDefCoordonnees_old_format(ostream & sort,const int & incre
                   ,int nbmail, const Tableau <int>& tab_mail,LesMaillages * lesMail) const
{   int dim = ParaGlob::Dimension();
    for (int im =1; im <= nbmail; im++)
      {int numMail = tab_mail(im);
       int nbmaxnoeud = lesMail->Nombre_noeud(numMail);
       int decalnoeud = mailInitial->DecalNumNoeud(numMail);
       // deux cas soit on applique une pseudo-homothetie ou non
       if (!((mailInitial->Considerer_homothetie()) && ((mailInitial->T_homothetie())(numMail))))
        {// cas sans homothetie : cas classique
         for (int ino = 1; ino <= nbmaxnoeud; ino++)
       	 {Noeud& noe = lesMail->Noeud_LesMaille(numMail, ino); // pour simplifier
       	  int num_noeud = ino + decalnoeud;
          const Coordonnee& co = noe.Coord2();
          sort << "\n"; 
          switch (dim) 
           { case 3: sort << "Z" << num_noeud <<"i"<<incre << " = " << co(3) << " ; ";
             case 2: sort << "Y" << num_noeud <<"i"<<incre << " = " << co(2) << " ; ";
             case 1: sort << "X" << num_noeud <<"i"<<incre << " = " << co(1) << " ; ";
            }; 
          // on remplie de 0, au cas où la dimension n'est pas 3  
          switch (dim) 
           { case 1: sort << "Y" << num_noeud <<"i"<<incre << " = 0 ; " ;
             case 2: sort << "Z" << num_noeud <<"i"<<incre << " = 0 ; " ;
            }; 
       	 };
			}
		 else // cas avec Homothetie 	
        {Coordonnee& orig = (mailInitial->T_orig())(numMail);           // pour simplifier
		  Coordonnee& fact_mult = (mailInitial->T_fact_mult())(numMail); // pour simplifier
         for (int ino = 1; ino <= nbmaxnoeud; ino++)
       	{ Noeud& noe = lesMail->Noeud_LesMaille(numMail, ino); // pour simplifier
       	  int num_noeud = ino + decalnoeud;
          const Coordonnee& co = noe.Coord2();
          const Coordonnee& co_0 = noe.Coord0();
			 Coordonnee delta_co = co-co_0; // calcul du déplacement
			 // on calcul les coordonnées initiale avec homothetie
			 Coordonnee A(co_0-orig); int dim = A.Dimension();
          switch (dim) // dans le cas d'une dimension diff de 3, on complète avec des 0
           { case 3: A(3) *= fact_mult(3);
             case 2: A(2) *= fact_mult(2);
             case 1: A(1) *= fact_mult(1);
            };
			 A +=orig;
			 // on rajoute le déplacement 
			 A += delta_co;			 
          sort << "\n"; 
          switch (dim) 
           { case 3: sort << "Z" << num_noeud <<"i"<<incre << " = " << A(3) << " ; ";
             case 2: sort << "Y" << num_noeud <<"i"<<incre << " = " << A(2) << " ; ";
             case 1: sort << "X" << num_noeud <<"i"<<incre << " = " << A(1) << " ; ";
            }; 
          // on remplie de 0, au cas où la dimension n'est pas 3  
          switch (dim) 
           { case 1: sort << "Y" << num_noeud <<"i"<<incre << " = 0 ; " ;
             case 2: sort << "Z" << num_noeud <<"i"<<incre << " = 0 ; " ;
            }; 
       	 };
		  }		  
       }; // fin de la boucle sur les maillage      
};

// sortie de l'utilisation d'une coordonnée
void Isovaleurs_Gmsh::SortieUseUneCoordonnee(int incre, ostream & sort,bool fin,int num_N) const
	{ sort << "X"<<num_N<<"i"<<incre << ",Y"<<num_N<<"i"<<incre << ",Z"<<num_N<<"i"<<incre;
	  if(fin) {sort << "){";}
	  else    {sort << ", ";}; 
	};               

// création de la liste des noms correspondants à tous les grandeurs à sortir
void Isovaleurs_Gmsh::CreatListNomsTousLesGrandeurs()
 {  // --cette création s'appuie sur  les listes globales, qui doivent donc être construite
    // on efface la liste existante
    nomsGrandeursSortie.clear();
    // !! normalement tous les noms sont différents, cela a été vérifié dans :
    //    Isovaleurs_Gmsh::VerificationTransfertPossible_et_doublon()
    
    // on passe en revue la liste des ddl aux noeuds
   {List_io < Ddl_enum_etendu >::iterator ili,ilifin=  glob_noe_ddl_retenu.end();
    for (ili=glob_noe_ddl_retenu.begin();ili != ilifin; ili++)
	     nomsGrandeursSortie.push_back(((*ili).Nom_plein()+"_ddl_noe"));
    };
    // .. pour les ddl étendues définis aux noeuds
   {List_io < Ddl_enum_etendu >::iterator ili,ilifin=  glob_noeud_ddl_etendu_retenu.end();
    for (ili=glob_noeud_ddl_etendu_retenu.begin();ili != ilifin; ili++)
	     nomsGrandeursSortie.push_back(((*ili).Nom_plein()+"_ddl_etendu_noe"));
    };
    // .. pour les types évoluées définis aux noeuds
   {List_io < TypeQuelconque >::iterator ili,ilifin=  glob_noeud_evol_retenu.end();
    for (ili=glob_noeud_evol_retenu.begin();ili != ilifin; ili++)
	      nomsGrandeursSortie.push_back( string(((*ili).EnuTypeQuelconque().NomPlein())+"_evolue_noe" ));
   };
    // .. pour les ddl venant d'un transfert aux noeuds des grandeurs aux pt d'integ
   {List_io < Ddl_enum_etendu >::iterator ili,ilifin = glob_elem_ddl_retenu.end();
    for (ili=glob_elem_ddl_retenu.begin();ili != ilifin; ili++)
	     nomsGrandeursSortie.push_back(((*ili).Nom_plein()+"_pti"));
   };
    // .. pour les types évoluées venant d'un transfert aux noeuds des grandeurs aux pt d'integ
   {List_io < TypeQuelconque >::iterator ipi,ipifin=glob_elem_evol_retenu.end();
    for (ipi=glob_elem_evol_retenu.begin();ipi != ipifin; ipi++)
        nomsGrandeursSortie.push_back(  string(((*ipi).EnuTypeQuelconque().NomPlein())+"_evolue_pti" ));
    // .. pour les types particuliers aux elements venant d'un transfert aux noeuds
    ipifin= glob_elem_Parti_retenu.end();
    for (ipi=glob_elem_Parti_retenu.begin();ipi != ipifin; ipi++)
       { // on traite le cas VECTEUR nommé d'une manière particulière
         TypeQuelconque& typ = (*ipi); // pour simplifier
         EnumTypeGrandeur enugrandeur = typ.EnuTypeGrandeur();
         EnumType2Niveau  enuStructure = typ.Const_Grandeur_pointee()->Type_structure_grandeurAssocie();
//         string sup="";// un string vide
//         if ((enuStructure == TYPE_SIMPLE) && (enugrandeur == VECTEUR))
//          {Grandeur_Vecteur_Nommer& t_grandeur =
//                                                 *((Grandeur_Vecteur_Nommer*) typ.Const_Grandeur_pointee());
//           sup += *(t_grandeur.Nom_ref());
//          };
//         string nom_s(typ.EnuTypeQuelconque().NomPlein());
//
         nomsGrandeursSortie.push_back(  string(((*ipi).EnuTypeQuelconque().NomPlein())+"_particulier_pti" ));       };
   };
        
//----- debug
//list <string>::iterator iti,itifin=nomsGrandeursSortie.end();
//cout << "\n la liste des noms ";
//for (iti=nomsGrandeursSortie.begin();iti != itifin;iti++)
//  cout << (*iti) << " ";
//cout << endl;  
//
//----- fin debug        
        
        
	};

// écriture des grandeurs aux noeuds au nouveau format
void Isovaleurs_Gmsh::EcritureAuxNoeuds(const Tableau <int>& tab_mail,LesMaillages * lesMail
                                        ,int incre,UtilLecture & entreePrinc)
{ // pour simplifier
  int nbmail = tab_mail.Taille();
  // ici l'objectif est de tout mettre dans un seul groupe de résultat de manière à pouvoir tout
  // visualiser en même temps 
  // on ne traite que s'il y a des ddl 
  bool atraiter = false;
  {if (   (glob_noe_ddl_retenu.size() != 0)
       || (glob_noeud_ddl_etendu_retenu.size() != 0)
       || (glob_noeud_evol_retenu.size() != 0) 
       || (glob_elem_ddl_retenu.size() != 0)  
       || (glob_elem_evol_retenu.size() != 0) 
       || (glob_elem_Parti_retenu.size() != 0)
      )
        atraiter = true;
   };
  if (atraiter)   
   {
     // :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
	    double temps_actuel = ParaGlob::Variables_de_temps().TempsCourant();
     // a) cas des ddl initiaux définis aux noeuds
     // **(3mars2016) je retire l'incrément 0 qui est bancal, car ne représente pas l'état initial de la structure
     if ((glob_noe_ddl_retenu.size() != 0)&& (incre != 0))
     {// on utilise la liste globale car la boucle la plus grande est sur les ddl et non sur les
      // maillage, ceci de manière à avoir (éventuellement) une seule view qui rassemble plusieurs maillages
      List_io < Ddl_enum_etendu >::iterator il,ilfin=glob_noe_ddl_retenu.end();
      Tableau <List_io < bool >::iterator > t_indic_sortie(nbmail);
      Tableau <List_io < bool >::iterator > t_choix_var_ddl(nbmail);
      for (int im =1; im <= nbmail; im++)
         {t_indic_sortie(im)=t_g_noeud_ddl_asortir(im).begin();
			       t_choix_var_ddl(im)=choix_var_ddl(im).begin();
         };
      for (il=glob_noe_ddl_retenu.begin();il != ilfin;il++)
      { Enum_ddl ddl = (*il).Enum(); // récup du ddl de base
        Ddl_enum_etendu ddl_etendu = (*il); // le ddl étendue associé
        bool ddl_basique = (*il).Nom_vide();
        ostream &sort = entreePrinc.Sort_resultat_Gmsh(ddl_etendu.Nom_plein()+"_ddl_noe");
        // def de l'entete
        EnteteNodeData(sort,incre,temps_actuel,ddl_etendu.Nom_plein(),1);
        // -- sortie des grandeurs
        // on balaie les maillages
        for (int im =1; im <= nbmail; im++)
         {// on ne continue que si le maillage est à sortir
          // !!! en fait avec gmsh, et le nouveau format, il faut que l'on sorte toujours quelque chose, car le nombre de noeuds
          // est celui de l'ensemble des maillages présents, 
          bool grandeur_prevu_en_sortie = (*(t_indic_sortie(im))); // drapeau utilisé en sortie
          //if (*(t_indic_sortie(im)))
          	{int numMail = tab_mail(im);
             int decal_noe = mailInitial->DecalNumNoeud(numMail);
             Tableau<Noeud *>& t_n = lesMail->Tab_noeud(im);
             int nbmaxinoeud = t_n.Taille();
             for (int numNoeud=1; numNoeud<= nbmaxinoeud;numNoeud++) 
              { // recup du noeud
                Noeud & noe = lesMail->Noeud_LesMaille(numMail,numNoeud);
                sort << "\n" << noe.Num_noeud()+decal_noe << " " ;
                //--   les grandeurs
                if (grandeur_prevu_en_sortie)
                 {bool varddl = *(t_choix_var_ddl(im)); // variation ou pas
                  // il y a un choix suivant que c'est un ddl de base ou un ddl étendu
                  if (ddl_basique)
                    { if (noe.Existe_ici(ddl)) 
                        { if (varddl) // cas de la variation
                            {sort << setprecision(ParaGlob::NbdigdoGR())
                                  << (noe.Valeur_tdt(ddl)-noe.Valeur_0(ddl));}
                          else 
                            { sort << setprecision(ParaGlob::NbdigdoGR()) << noe.Valeur_tdt(ddl) ;};
                        }
                      else  // si la valeur n'existe pas on sort 0  
                        {sort << 0. ;};
                    }	 
                  else // sinon c'est un ddl étendue	
                    { if (noe.Existe_ici_ddlEtendu(ddl_etendu)) 
                        { sort << setprecision(ParaGlob::NbdigdoGR())
                               << (noe.DdlEtendue(ddl_etendu).ConstValeur()) ;}
                      else  // si la valeur n'existe pas on sort 0  
                        {sort << 0 ;};
                    };
                 }
                else // cas d'une sortie non prévue, on sort quand même 0.
                 {sort << 0 ;};
              };
          	};
         };
        // fin de la view
        sort << "\n$EndNodeData \n"; 
        // mise à jour des pointeurs de choix
        for (int im =1; im <= nbmail; im++)
           {t_indic_sortie(im)++;t_choix_var_ddl(im)++;}
      }; //-- fin de la boucle sur les enum aux noeud
     }; //--// fin du test s'il y a des enum à sortir ou nom
     
     // a-1) cas des ddl étendues définis aux noeuds
     // **(3mars2016) je retire l'incrément 0 qui est bancal, car ne représente pas l'état initial de la structure     
     if ((glob_noeud_ddl_etendu_retenu.size() != 0) && (incre != 0))
     {// on utilise la liste globale car la boucle la plus grande est sur les ddl et non sur les
      // maillage, ceci de manière à avoir (éventuellement) une seule view qui rassemble plusieurs maillages
      List_io < Ddl_enum_etendu >::iterator il,ilfin=glob_noeud_ddl_etendu_retenu.end();
      Tableau <List_io < bool >::iterator > t_indic_sortie(nbmail);
      for (int im =1; im <= nbmail; im++)
         {t_indic_sortie(im)=t_g_noeud_ddl_etendu_asortir(im).begin();
         };
      for (il=glob_noeud_ddl_etendu_retenu.begin();il != ilfin;il++)
      { Enum_ddl ddl = (*il).Enum(); // récup du ddl de base
        Ddl_enum_etendu ddl_etendu = (*il); // le ddl étendue associé
        bool ddl_basique = (*il).Nom_vide();
        ostream &sort = entreePrinc.Sort_resultat_Gmsh((*il).Nom_plein()+"_ddl_etendu_noe");
        // def de l'entete
        EnteteNodeData(sort,incre,temps_actuel,(*il).Nom_plein(),1);
        // -- sortie des grandeurs
        // on balaie les maillages
        for (int im =1; im <= nbmail; im++)
         {// on ne continue que si le maillage est à sortir
          // !!! en fait avec gmsh, et le nouveau format, il faut que l'on sorte toujours quelque chose, car le nombre de noeuds
          // est celui de l'ensemble des maillages présents, 
          bool grandeur_prevu_en_sortie = (*(t_indic_sortie(im))); // drapeau utilisé en sortie
          //if (*(t_indic_sortie(im)))
          	{int numMail = tab_mail(im);
             int decal_noe = mailInitial->DecalNumNoeud(numMail);
             Tableau<Noeud *>& t_n = lesMail->Tab_noeud(im);
             int nbmaxinoeud = t_n.Taille();
             for (int numNoeud=1; numNoeud<= nbmaxinoeud;numNoeud++) 
              { // recup du noeud
                Noeud & noe = lesMail->Noeud_LesMaille(numMail,numNoeud);
                sort << "\n" << noe.Num_noeud()+decal_noe << " " ;
                //--   les grandeurs
                if (grandeur_prevu_en_sortie)
                 {// il y a un choix suivant que c'est un ddl de base ou un ddl étendu
                  if (ddl_basique)
                    { if (noe.Existe_ici(ddl)) 
                        { sort << setprecision(ParaGlob::NbdigdoGR()) << noe.Valeur_tdt(ddl) ;}
                      else  // si la valeur n'existe pas on sort 0  
                        {sort << 0. ;};
                    }	 
                  else // sinon c'est un ddl étendue	
                    { if (noe.Existe_ici_ddlEtendu(ddl_etendu)) 
                        { sort << setprecision(ParaGlob::NbdigdoGR())
                               << (noe.DdlEtendue(ddl_etendu).ConstValeur()) ;}
                      else  // si la valeur n'existe pas on sort 0  
                        {sort << 0 ;};
                    };
                 }
                else // cas d'une sortie non prévue, on sort quand même 0.
                 {sort << 0 ;};
								 
              };
          	};
         };
        // fin de la view
        sort << "\n$EndNodeData \n"; 
        // mise à jour des pointeurs de choix
        for (int im =1; im <= nbmail; im++)
           {t_indic_sortie(im)++;}
      }; //-- fin de la boucle sur les enum aux noeud
     }; //--// fin du test s'il y a des enum à sortir ou nom

     // a-2) cas des types évoluées définis aux noeuds
     // **(3mars2016) je retire l'incrément 0 qui est bancal, car ne représente pas l'état initial de la structure     
     if ((glob_noeud_evol_retenu.size() != 0) && (incre != 0))    
     {// on utilise la liste globale car la boucle la plus grande est sur les ddl et non sur les
      // maillage, ceci de manière à avoir (éventuellement) une seule view qui rassemble plusieurs maillages
      List_io < TypeQuelconque >::iterator il,ilfin=glob_noeud_evol_retenu.end();
      Tableau <List_io < bool >::iterator > t_indic_sortie(nbmail);
      for (int im =1; im <= nbmail; im++)
         {t_indic_sortie(im)=t_g_noeud_evoluee_asortir(im).begin();
         };
//debug
//cout << "\n debug Isovaleurs_Gmsh::EcritureAuxNoeuds "
//     << "\n glob_noeud_evol_retenu "<< glob_noeud_evol_retenu << endl;
//fin debug
      for (il=glob_noeud_evol_retenu.begin();il != ilfin;il++)
       {TypeQuelconque& typ = (*il); // pour simplifier
        ostream &sort = entreePrinc.Sort_resultat_Gmsh((typ.EnuTypeQuelconque().NomPlein())+"_evolue_noe");
        // -- choix entre grandeur simple ou complexe
        EnumTypeGrandeur enugrandeur = typ.EnuTypeGrandeur();
        EnumType2Niveau  enuStructure = typ.Const_Grandeur_pointee()->Type_structure_grandeurAssocie();
        switch (enuStructure)
         { case TYPE_SIMPLE: 
          	{ // appel directe de la routine adoc
          	  int numero = 0;
             SortirUneViewTypeQuelconque(sort,typ,enuStructure,numero
                                          ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre);
             break;                       
          	}
           case TABLEAU_T:
          	{ // dans le cas d'un tableau on boucle sur les éléments du tableau
          	  switch (enugrandeur)
              { case TENSEURHH:
                 {Tab_Grandeur_TenseurHH& tab_tensHH =  *((Tab_Grandeur_TenseurHH*) typ.Const_Grandeur_pointee());
                  int taille = tab_tensHH.Taille();
                  // on boucle, et on sort  chaque tenseur
                  for (int i=1;i<=taille;i++)
                      SortirUneViewTypeQuelconque(sort,typ,enuStructure,i
                                          ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre);
                  break; 
                 }
                case TENSEURBB:
                 {Tab_Grandeur_TenseurBB& tab_tensBB =  *((Tab_Grandeur_TenseurBB*) typ.Const_Grandeur_pointee());
                  int taille = tab_tensBB.Taille();
                  // on boucle, et on sort  chaque tenseur
                  for (int i=1;i<=taille;i++)
                      SortirUneViewTypeQuelconque(sort,typ,enuStructure,i
                                          ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre);
                  break;
                 }
                case SCALAIRE: case SCALAIRE_ENTIER: case SCALAIRE_DOUBLE:
                 {Tab_Grandeur_scalaire_double& tab_Gdouble =  *((Tab_Grandeur_scalaire_double*) typ.Const_Grandeur_pointee());
                  int taille = tab_Gdouble.Taille();
                  // on boucle, et on sort  chaque scalaire
                  for (int i=1;i<=taille;i++)
                      SortirUneViewTypeQuelconque(sort,typ,enuStructure,i
                                          ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre);
                  break; 
                  }
                case COORDONNEE: 
                 {Tab_Grandeur_Coordonnee& tab_coordonnee =  *((Tab_Grandeur_Coordonnee*) typ.Const_Grandeur_pointee());
                  int taille = tab_coordonnee.Taille();
                  // on boucle, et on sort  chaque coordonnée
                  for (int i=1;i<=taille;i++)
                      SortirUneViewTypeQuelconque(sort,typ,enuStructure,i
                                          ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre);
                  break; 
                  }
                case VECTEUR:
                 {Tab_Grandeur_Vecteur& tab_vecteur =  *((Tab_Grandeur_Vecteur*) typ.Const_Grandeur_pointee());
                  int taille = tab_vecteur.Taille();
                  // on boucle, et on sort  chaque vecteur
                  for (int i=1;i<=taille;i++)
                      SortirUneViewTypeQuelconque(sort,typ,enuStructure,i
                                          ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre);
                  break;
                  }
                default:
                   cout << "\n attention : cas de sortie de grandeur tableau non implantee (mais il suffit de le demander !!) "; 
                   typ.Const_Grandeur_pointee()->Ecriture_grandeur(sort);
                   cout << "\n Isovaleurs_Gmsh::EcritureAuxNoeuds(... 4 ";    
              };//-- fin du  switch (enugrandeur)
              break;
          	}
           default:            
             cout << "\n attention : cas de sortie de grandeur de type secondaire " << NomType2Niveau(enuStructure) 
                  << " non implantee (mais il suffit de le demander !!) "; 
             typ.Const_Grandeur_pointee()->Ecriture_grandeur(sort);
             cout << "\n Isovaleurs_Gmsh::EcritureAuxNoeuds(... 3 ";    
         }; 

        // mise à jour des pointeurs de choix
        for (int im =1; im <= nbmail; im++)
           t_indic_sortie(im)++;
          	
       }; //--// fin de la boucle sur les enum
     }; //--// fin du test s'il y a des enum à sortir ou nom

     // :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
     // b) cas des ddl de base (simple) venant d'un transfert aux noeuds des grandeurs aux pt d'integ
     //    on ne sort que les incréments différents de 0, car pour l'incrément 0 pas de grandeurs licites aux pt integ
//debug
//cout << "\n debug Isovaleurs_Gmsh::EcritureAuxNoeuds "
//     << "\n glob_elem_ddl_retenu "<< glob_elem_ddl_retenu << endl;
//fin debug
     if ((glob_elem_ddl_retenu.size() != 0) && (incre != 0))    
     {// on utilise la liste globale car la boucle la plus grande est sur les ddl et non sur les
      // maillage, ceci de manière à avoir (éventuellement) une seule view qui rassemble plusieurs maillages
      List_io < Ddl_enum_etendu >::iterator il,ilfin=glob_elem_ddl_retenu.end();
      Tableau <List_io < bool >::iterator > t_indic_sortie(nbmail);
      for (int im =1; im <= nbmail; im++)
         t_indic_sortie(im)=t_g_elem_ddl_asortir(im).begin();
      
      for (il=glob_elem_ddl_retenu.begin();il != ilfin;il++)
       {Ddl_enum_etendu& ddlEtendu = (*il); // pour simplifier
        ostream *sorti; 
        // def de l'entete
        sorti = &(entreePrinc.Sort_resultat_Gmsh(ddlEtendu.Nom_plein()+"_pti"));
        EnteteNodeData(*sorti,incre,temps_actuel,ddlEtendu.Nom_plein(),1);
        ostream& sort = *sorti;      
        // -- sortie des grandeurs
        // on balaie les maillages
        
        for (int im =1; im <= nbmail; im++)
         {// on ne continue que si le ddl est à sortir
          // !!! en fait avec gmsh, et le nouveau format, il faut que l'on sorte toujours quelque chose, car le nombre de noeuds
          // est celui de l'ensemble des maillages présents, 
          bool grandeur_prevu_en_sortie = (*(t_indic_sortie(im))); // drapeau utilisé en sortie
          //if (*(t_indic_sortie(im)))
          	{int numMail = tab_mail(im);
            int decal_noe = mailInitial->DecalNumNoeud(numMail);
			         Tableau<Noeud *>& t_n = lesMail->Tab_noeud(numMail);
            int nbmaxinoeud = t_n.Taille();
            for (int numNoeud=1; numNoeud<= nbmaxinoeud;numNoeud++) 
              { // recup du noeud
                Noeud & noe = lesMail->Noeud_LesMaille(numMail,numNoeud);
                sort << "\n" << noe.Num_noeud()+decal_noe << " " ;
                //--   les grandeurs
                if (grandeur_prevu_en_sortie)
                 {if (noe.Existe_ici_ddlEtendu(ddlEtendu)) 
                    { sort << setprecision(ParaGlob::NbdigdoGR()) << (noe.DdlEtendue(ddlEtendu).ConstValeur());}
                  else  // si la valeur n'existe pas on sort 0  
                    {sort << 0. ;};
                 }
                else // cas d'une sortie non prévue, on sort quand même 0.
                 {sort << 0 ;};
              };
          	};
         };
        // fin de la view
        sort << "\n$EndNodeData \n"; 
        // mise à jour des pointeurs de choix
        for (int im =1; im <= nbmail; im++)
           t_indic_sortie(im)++;
       }; //--// fin de la boucle sur les enum
     }; //--// fin du test d'existance d'énum à sortir venant d'un transfert aux noeuds des grandeurs aux pt d'integ

     // :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
     // c) cas des types évoluées venant d'un transfert aux noeuds des grandeurs aux pt d'integ
     //    on ne sort que les incréments différents de 0, car pour l'incrément 0 pas de grandeurs licites aux pt integ
     if ((glob_elem_evol_retenu.size() != 0) && (incre != 0))
     {// on utilise la liste globale car la boucle la plus grande est sur les ddl et non sur les
      // maillage, ceci de manière à avoir (éventuellement) une seule view qui rassemble plusieurs maillages
      List_io < TypeQuelconque >::iterator il,ilfin=glob_elem_evol_retenu.end();
      Tableau <List_io < bool >::iterator > t_indic_sortie(nbmail);
      for (int im =1; im <= nbmail; im++)
         t_indic_sortie(im)=t_g_elem_evoluee_asortir(im).begin();
     
      for (il=glob_elem_evol_retenu.begin();il != ilfin;il++)
       {TypeQuelconque& typ = (*il); // pour simplifier
        ostream &sort = entreePrinc.Sort_resultat_Gmsh((typ.EnuTypeQuelconque().NomPlein())+"_evolue_pti");
        // -- choix entre grandeur simple ou complexe
        EnumTypeGrandeur enugrandeur = typ.EnuTypeGrandeur();
        EnumType2Niveau  enuStructure = typ.Const_Grandeur_pointee()->Type_structure_grandeurAssocie();
        switch (enuStructure)
         { case TYPE_SIMPLE: 
          	{ // appel directe de la routine adoc
          	  int numero = 0;
              SortirUneViewTypeQuelconque(sort,typ,enuStructure,numero
                                          ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre);
          	  break;                       
          	}
           case TABLEAU_T:
          	{ // dans le cas d'un tableau on boucle sur les éléments du tableau
          	  switch (enugrandeur)
              { case TENSEURHH:
                 {Tab_Grandeur_TenseurHH& tab_tensHH =  *((Tab_Grandeur_TenseurHH*) typ.Const_Grandeur_pointee());
                  int taille = tab_tensHH.Taille();
                  // on boucle, et on sort  chaque tenseur
                  for (int i=1;i<=taille;i++)
                      SortirUneViewTypeQuelconque(sort,typ,enuStructure,i
                                          ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre);
                  break; 
                 }
               case TENSEURBB:
                 {Tab_Grandeur_TenseurBB& tab_tensBB =  *((Tab_Grandeur_TenseurBB*) typ.Const_Grandeur_pointee());
                  int taille = tab_tensBB.Taille();
                  // on boucle, et on sort  chaque tenseur
                  for (int i=1;i<=taille;i++)
                      SortirUneViewTypeQuelconque(sort,typ,enuStructure,i
                                          ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre);
                  break;
                 }
                case SCALAIRE: case SCALAIRE_ENTIER: case SCALAIRE_DOUBLE:
                 {Tab_Grandeur_scalaire_double& tab_Gdouble =  *((Tab_Grandeur_scalaire_double*) typ.Const_Grandeur_pointee());
                  int taille = tab_Gdouble.Taille();
                  // on boucle, et on sort  chaque scalaire
                  for (int i=1;i<=taille;i++)
                      SortirUneViewTypeQuelconque(sort,typ,enuStructure,i
                                          ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre);
                  break; 
                  }
                case COORDONNEE: 
                 {Tab_Grandeur_Coordonnee& tab_coordonnee =  *((Tab_Grandeur_Coordonnee*) typ.Const_Grandeur_pointee());
                  int taille = tab_coordonnee.Taille();
                  // on boucle, et on sort  chaque scalaire
                  for (int i=1;i<=taille;i++)
                      SortirUneViewTypeQuelconque(sort,typ,enuStructure,i
                                          ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre);
                  break; 
                  }
                case VECTEUR:
                 {Tab_Grandeur_Vecteur& tab_vecteur =  *((Tab_Grandeur_Vecteur*) typ.Const_Grandeur_pointee());
                  int taille = tab_vecteur.Taille();
                  // on boucle, et on sort  chaque scalaire
                  for (int i=1;i<=taille;i++)
                      SortirUneViewTypeQuelconque(sort,typ,enuStructure,i
                                          ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre);
                  break;
                  }
                default:
                   cout << "\n attention : cas de sortie de grandeur tableau non implantee (mais il suffit de le demander !!) "; 
                   typ.Const_Grandeur_pointee()->Ecriture_grandeur(sort);
                   cout << "\n Isovaleurs_Gmsh::EcritureAuxNoeuds(... 4 ";    
              };//-- fin du  switch (enugrandeur)
              break;
          	}
           default:            
             cout << "\n attention : cas de sortie de grandeur de type secondaire " << NomType2Niveau(enuStructure) 
                  << " non implantee (mais il suffit de le demander !!) "; 
             typ.Const_Grandeur_pointee()->Ecriture_grandeur(sort);
             cout << "\n Isovaleurs_Gmsh::EcritureAuxNoeuds(... 3 ";    
         }; 

        // mise à jour des pointeurs de choix
        for (int im =1; im <= nbmail; im++)
           t_indic_sortie(im)++;
          	
       }; //--// fin de la boucle sur les enum
     }; //--// fin du test d'existance de type évolué venant d'un transfert aux noeuds des grandeurs aux pt d'integ

     // :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
     // d) cas des types particuliers aux elements venant d'un transfert aux noeuds
     //    on ne sort que les incréments différents de 0, car pour l'incrément 0 pas de grandeurs licites aux pt integ
     if ((glob_elem_Parti_retenu.size() != 0) && (incre != 0))
     {// on utilise la liste globale car la boucle la plus grande est sur les ddl et non sur les
      // maillage, ceci de manière à avoir (éventuellement) une seule view qui rassemble plusieurs maillages
      List_io < TypeQuelconque >::iterator il,ilfin=glob_elem_Parti_retenu.end();
      Tableau <List_io < bool >::iterator > t_indic_sortie(nbmail);
      for (int im =1; im <= nbmail; im++)
         t_indic_sortie(im)=t_g_elem_typeParti_asortir(im).begin();
     
      for (il=glob_elem_Parti_retenu.begin();il != ilfin;il++)
       {TypeQuelconque& typ = (*il); // pour simplifier
        // -- choix entre grandeur simple ou complexe
        EnumTypeGrandeur enugrandeur = typ.EnuTypeGrandeur();
        EnumType2Niveau  enuStructure = typ.Const_Grandeur_pointee()->Type_structure_grandeurAssocie();
//        // traitement particulier pour VECTEUR
//        string sup="";// un string vide
//        if ((enuStructure == TYPE_SIMPLE) && (enugrandeur == VECTEUR))
//          {Grandeur_Vecteur_Nommer& t_grandeur =
//                                                 *((Grandeur_Vecteur_Nommer*) typ.Const_Grandeur_pointee());
//           sup += *(t_grandeur.Nom_ref());
//          };
//        ostream &sort = entreePrinc.Sort_resultat_Gmsh((typ.EnuTypeQuelconque().NomPlein())+sup+"_particulier_pti");
        ostream &sort = entreePrinc.Sort_resultat_Gmsh((typ.EnuTypeQuelconque().NomPlein())+"_particulier_pti");

        //  il faut combiner les deux types d'enu
        // compte tenu du fait que VECTEUR et TABLEAU_T sont traité de la même manière
        switch (enuStructure)
         { case TYPE_SIMPLE: 
          	{ if (enugrandeur != VECTEUR)
              {// appel directe de la routine adoc
          	    int numero = 0;
               SortirUneViewTypeQuelconque(sort,typ,enuStructure,numero
                                          ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre);
              }
             // sinon c'est un VECTEUR, on traite comme un tableau_T, donc on ne met pas de break;
             else
              {Grandeur_Vecteur_Nommer& t_grandeur =
                                                 *((Grandeur_Vecteur_Nommer*) typ.Const_Grandeur_pointee());
               Vecteur& vi = t_grandeur.ConteneurVecteur();
               int taille = vi.Taille();
               // on boucle, et on sort  chaque valeur
               for (int i=1;i<=taille;i++)
                  SortirUneViewTypeQuelconque(sort,typ,enuStructure,i
                                       ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre);
              };
             break;
          	}
           case TABLEAU_T:
          	{ // dans le cas d'un tableau (ou d'un VECTEUR) on boucle sur les éléments du tableau
          	  switch (enugrandeur)
              { case TENSEURHH:
                 {Tab_Grandeur_TenseurHH& tab_tensHH =  *((Tab_Grandeur_TenseurHH*) typ.Const_Grandeur_pointee());
                  int taille = tab_tensHH.Taille();
                  // on boucle, et on sort  chaque tenseur
                  for (int i=1;i<=taille;i++)
                     SortirUneViewTypeQuelconque(sort,typ,enuStructure,i
                                          ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre);
                  break; 
                 }
               case TENSEURBB:
                 {Tab_Grandeur_TenseurBB& tab_tensBB =  *((Tab_Grandeur_TenseurBB*) typ.Const_Grandeur_pointee());
                  int taille = tab_tensBB.Taille();
                  // on boucle, et on sort  chaque tenseur
                  for (int i=1;i<=taille;i++)
                     SortirUneViewTypeQuelconque(sort,typ,enuStructure,i
                                          ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre);
                  break;
                 }
                case SCALAIRE: case SCALAIRE_ENTIER: case SCALAIRE_DOUBLE:
                 {Tab_Grandeur_scalaire_double& tab_Gdouble =  *((Tab_Grandeur_scalaire_double*) typ.Const_Grandeur_pointee());
                  int taille = tab_Gdouble.Taille();
                  // on boucle, et on sort  chaque scalaire
                  for (int i=1;i<=taille;i++)
                     SortirUneViewTypeQuelconque(sort,typ,enuStructure,i
                                          ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre);
                  break; 
                  }
                case COORDONNEE: 
                 {Tab_Grandeur_Coordonnee& tab_coordonnee =  *((Tab_Grandeur_Coordonnee*) typ.Const_Grandeur_pointee());
                  int taille = tab_coordonnee.Taille();
                  // on boucle, et on sort  chaque scalaire
                  for (int i=1;i<=taille;i++)
                      SortirUneViewTypeQuelconque(sort,typ,enuStructure,i
                                          ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre);
                  break; 
                  }
                case VECTEUR:
                 {Tab_Grandeur_Vecteur& tab_vecteur =  *((Tab_Grandeur_Vecteur*) typ.Const_Grandeur_pointee());
                  int taille = tab_vecteur.Taille();
                  // on boucle, et on sort  chaque scalaire
                  for (int i=1;i<=taille;i++)
                      SortirUneViewTypeQuelconque(sort,typ,enuStructure,i
                                          ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre);
                  break;
                  }
                case BASE__H:
                 {Tab_Grandeur_BaseH& tab_base =  *((Tab_Grandeur_BaseH*) typ.Const_Grandeur_pointee());
                  int taille = tab_base.Taille();
                  if (taille > 0)
                   {// on va considérer que toutes les bases ont le même nombre de vecteur
                    Grandeur_BaseH& gr = tab_base(1);
                    const BaseH& baH1 = gr.RefConteneurBaseH();
                    int nb_vect = baH1.NbVecteur();
                    // on va traiter chaque vecteur de base comme une grandeur coordonnée
                    // on boucle, et on sort chaque base H
                    int indice_vecteur = 1; // le numéro du vecteur à sortir
                                          // par exemple si la base comporte 3 vecteurs, et qu'il y a 2 bases
                                          // a sortir cela fera au total 6 vecteurs : les 3 premiers pour la base1
                                          // les 3 suivants pour la base 2
                    for (int i=1;i<=taille;i++) // le compteur de base
                      for (int num_vec = 1; num_vec <= nb_vect; num_vec++,indice_vecteur++)
                        SortirUneViewTypeQuelconque(sort,typ,enuStructure,indice_vecteur
                                          ,t_indic_sortie,nbmail,tab_mail,enugrandeur,lesMail,incre);
                    };
                  break;
                  }
                default:
                   cout << "\n attention : cas de sortie de grandeur tableau non implantee (mais il suffit de le demander !!) "; 
                   typ.Const_Grandeur_pointee()->Ecriture_grandeur(sort);
                   cout << "\n Isovaleurs_Gmsh::EcritureAuxNoeuds(... 1 ";    
              };//-- fin du  switch (enugrandeur)
              break;
          	}
           default:            
             cout << "\n attention : cas de sortie de grandeur de type secondaire " << NomType2Niveau(enuStructure) 
                  << " non implantee (mais il suffit de le demander !!) "; 
             typ.Const_Grandeur_pointee()->Ecriture_grandeur(sort);
             cout << "\n Isovaleurs_Gmsh::EcritureAuxNoeuds(... 2 ";    
         }; 
          	
        // mise à jour des pointeurs de choix
        for (int im =1; im <= nbmail; im++)
           t_indic_sortie(im)++;

       }; //--// fin de la boucle sur les enum
     }; //--// fin du test d'existance de type évolué venant d'un transfert aux noeuds des grandeurs aux pt d'integ

   }; //-- fin du cas if (atraiter)

};

// gestion de l'accumulation due au passage des grandeurs choisies venant des éléments, aux noeuds, lorsque ces grandeurs sont
// directement diponibles aux noeuds
void Isovaleurs_Gmsh::Passage_grandeursRetenuesAuxNoeuds_elementsVersNoeuds()
{ int nb_maillage = tabnoeud_type_ddl.Taille();// def du nombre de maillage avec un tableau quelconque
  // dans le cas où les ddl récupérés des éléments sont visibles directement aux noeuds on les bascule
  // sur les noeuds, car il ne faut pas faire de transfert particulier
  for (int imail=1;imail<=nb_maillage;imail++)
    {  
      // on fait l'optimisation et le rangement 
      tabnoeud_evoluee_retenu(imail).sort();tabnoeud_evoluee_retenu(imail).unique();
      // on construit les tableaux a accumuler
     {List_io<Ddl_enum_etendu>& aaccum_ret = a_accumuler_tabnoeud_type_ddlEtendu_retenu(imail); // pour simplifier
      List_io<Ddl_enum_etendu>& aaccum = a_accumuler_tabnoeud_type_ddlEtendu(imail); // pour simplifier
      aaccum_ret.clear();
      List_io<Ddl_enum_etendu>& tpg_ret = (tabnoeud_type_ddlEtendu_retenu(imail)); // pour simplifier
      List_io < Ddl_enum_etendu >::iterator iq,iqfin=tpg_ret.end();
      for (iq=tpg_ret.begin();iq!=iqfin;iq++)// on parcours la liste
       // si l'élément doit-être accumulé, on l'indique
       if (find(aaccum.begin(),aaccum.end(),(*iq)) != aaccum.end())
         aaccum_ret.push_back(*iq);// accumulation simple
      //on ordonne et supprime les doublons
      aaccum_ret.sort();aaccum_ret.unique();
     };
     
     {List_io<TypeQuelconque>& aaccum_ret = (a_accumuler_tabnoeud_evoluee_retenu(imail)); // pour simplifier
      List_io<TypeQuelconque>& aaccum = (a_accumuler_tabnoeud_evoluee(imail)); // pour simplifier
      aaccum_ret.clear();
      List_io<TypeQuelconque>& tpg_ret = (tabnoeud_evoluee_retenu(imail)); // pour simplifier
      List_io < TypeQuelconque >::iterator iq,iqfin=tpg_ret.end();
      for (iq=tpg_ret.begin();iq!=iqfin;iq++)// on parcours la liste
       // si l'élément doit-être accumulé, on l'indique
       if (find(aaccum.begin(),aaccum.end(),(*iq)) != aaccum.end())
         aaccum_ret.push_back(*iq);// accumulation simple
      //on ordonne et supprime les doublons
      aaccum_ret.sort();aaccum_ret.unique();
     };
     
////debug
//cout << "\n debug Isovaleurs_Gmsh::Passage_grandeursRetenuesAuxNoeuds_elementsVersNoeuds() "
//     << "\n 2: tabnoeud_type_ddlEtendu_retenu(imail) " << tabnoeud_type_ddlEtendu_retenu(imail)
//     << "\n 3: tabnoeud_evoluee_retenu(imail) "<<tabnoeud_evoluee_retenu(imail)<< endl;
////fin debug
      // on ajoute éventuellement des conteneurs ad hoc aux noeuds
      // une fois que ces conteneurs existent, ils sont remplit automatiquement par l'élément
      List_io < TypeQuelconque > litq; // une autre pour les quelconques
      Tableau <List_io < TypeQuelconque > * > tabQ(2); 
      tabQ(1)= &tabnoeud_evoluee_retenu(imail);tabQ(2)=&litq;
      // on est obligé d'utiliser un tableau dont le second terme est nul,
      // ceci pour pouvoir utiliser "AjoutConteneurAuNoeud" tel quel
      lesMail->AjoutConteneurAuNoeud(imail,tabnoeud_type_ddlEtendu_retenu(imail),tabQ);
    };
 };
 

// passage des grandeurs disponibles venant des éléments, aux noeuds, lorsque ces grandeurs sont
// directement diponibles aux noeuds
void Isovaleurs_Gmsh::Passage_grandeursDisponiblesAuxNoeuds_elementsVersNoeuds() 
{ int nb_maillage = tabnoeud_type_ddl.Taille();// def du nombre de maillage avec un tableau quelconque
  // dans le cas où les ddl récupérés des éléments sont visibles directement aux noeuds on les bascule
  // sur les noeuds, car il ne faut pas faire de transfert particulier
  for (int imail=1;imail<=nb_maillage;imail++)
    { 
     {List_io <Ddl_enum_etendu>& lis_sor = tabelement_type_ddl(imail); // pour simplifier
//debug
//cout << "\n debug Isovaleurs_Gmsh::Passage_grandeursDisponiblesAuxNoeuds_elementsVersNoeuds() "
//     << "\n tabelement_type_ddl_retenu(imail) " << tabelement_type_ddl_retenu(imail) << endl;
//fin debug
     
     
      List_io <Ddl_enum_etendu>::iterator ili,ilifin = lis_sor.end();
      List_io <List_io <Ddl_enum_etendu>::iterator> inter; // pour stocker les grandeurs à déplacer
      // on parcours d'abord la liste venant des éléments
      for (ili=lis_sor.begin();ili != ilifin;ili++)
        {
//debug
//if ((*ili).Nom() == "pression_ext")
// cout << "\n debug Isovaleurs_Gmsh::Passage_grandeursDisponiblesAuxNoeuds_elementsVersNoeuds() "
//      << "\n tabelement_type_ddl_retenu(imail) " << tabelement_type_ddl_retenu(imail) << endl;
//fin debug
         if ((Meme_famille((*ili).Enum(),X1)) // X1 est un ddl définit aux noeuds
             || ((*ili).Nom() == "pression_ext") // cas particuliers : def au pti, mais dispo tel quel au noeud
            )
            {inter.push_back(ili);tabnoeud_type_ddlEtendu(imail).push_back(*ili);
             // les grandeurs qui viennent des éléments sont visible par moyenne aux noeuds
             a_accumuler_tabnoeud_type_ddlEtendu(imail).push_back(*ili);
            };
        };
      // on supprime
      List_io <List_io <Ddl_enum_etendu>::iterator>::iterator ik,ikfin = inter.end();
      for (ik = inter.begin();ik!=ikfin;ik++)
        lis_sor.erase(*ik);
      tabnoeud_type_ddlEtendu_retenu(imail).sort();tabnoeud_type_ddlEtendu(imail).unique();
      a_accumuler_tabnoeud_type_ddlEtendu(imail).sort();
      a_accumuler_tabnoeud_type_ddlEtendu(imail).unique();
     };
      //.. idem pour les grandeurs évoluées ...
     {List_io <TypeQuelconque>& lis_sor = tabelement_evoluee(imail); // pour simplifier
      List_io <TypeQuelconque>::iterator ili,ilifin = lis_sor.end();
      List_io <List_io <TypeQuelconque>::iterator> inter; // pour stocker les grandeurs à déplacer
      // on parcours d'abord la liste venant des éléments
      for (ili=lis_sor.begin();ili != ilifin;ili++)
        if (Meme_famille((*ili).Enum(),X1)) // X1 est un ddl définit aux noeuds
            {inter.push_back(ili);tabnoeud_evoluee(imail).push_back(*ili);
             // les grandeurs qui viennent des éléments sont visible par moyenne aux noeuds
             a_accumuler_tabnoeud_evoluee(imail).push_back(*ili);
             };
      // on supprime
      List_io <List_io <TypeQuelconque>::iterator>::iterator ik,ikfin = inter.end();
      for (ik = inter.begin();ik!=ikfin;ik++)
        lis_sor.erase(*ik);
     };
      //.. idem pour les grandeurs particulières ...
     {List_io <TypeQuelconque>& lis_sor = tabelement_typeParti(imail); // pour simplifier
      List_io <TypeQuelconque>::iterator ili,ilifin = lis_sor.end();
      List_io <List_io <TypeQuelconque>::iterator> inter; // pour stocker les grandeurs à déplacer
      // on parcours d'abord la liste venant des éléments
      for (ili=lis_sor.begin();ili != ilifin;ili++)
        if (Meme_famille((*ili).Enum(),X1)) // X1 est un ddl définit aux noeuds
            {inter.push_back(ili);tabnoeud_evoluee(imail).push_back(*ili);
             // les grandeurs qui viennent des éléments sont visible par moyenne aux noeuds
             a_accumuler_tabnoeud_evoluee(imail).push_back(*ili);
             };
      // on supprime
      List_io <List_io <TypeQuelconque>::iterator>::iterator ik,ikfin = inter.end();
      for (ik = inter.begin();ik!=ikfin;ik++)
        lis_sor.erase(*ik);
     };
      // comme tabnoeud_evoluee est utilisé pour les éléments par les grandeurs évoluées et particulières
      // on fait l'optimisation et le rangement une seule fois à la fin
      tabnoeud_evoluee(imail).sort();tabnoeud_evoluee(imail).unique();
      a_accumuler_tabnoeud_evoluee(imail).sort();
      a_accumuler_tabnoeud_evoluee(imail).unique();
     
//debug
//cout << "\n debug Isovaleurs_Gmsh::Passage_grandeursDisponiblesAuxNoeuds_elementsVersNoeuds() "
//     << "\n 2: tabelement_type_ddl(imail) " << tabelement_type_ddl(imail)
//     << "\n 3: a_accumuler_tabnoeud_evoluee(imail) "<<a_accumuler_tabnoeud_evoluee(imail)<< endl;
//fin debug
    };
 };

// calcul des grandeurs aux noeuds, directement accessible des éléments 
void Isovaleurs_Gmsh::CalculAuxElemAuxNoeuds(const Tableau <int>& tab_mail,LesMaillages * lesMail)
{ // .. on initialise les conteneurs ..
  int nbmail = tab_mail.Taille();
  int cas=1; // par défaut on cumul et on moyenne simplement
  // pour utiliser la méthode InitUpdateAuNoeud, on doit construire tabQ a deux dim
  List_io < TypeQuelconque > litq; // une autre pour les quelconques
  Tableau <List_io < TypeQuelconque > * > tabQ(2); 
  tabQ(2)=&litq;
////debug
//cout << "\n debug Isovaleurs_Gmsh::CalculAuxElemAuxNoeuds(...) "
//     << "\n  a_accumuler_tabnoeud_evoluee_retenu(1) " << a_accumuler_tabnoeud_evoluee_retenu(1)
//     << "\n  a_accumuler_tabnoeud_type_ddlEtendu_retenu(1) "<<a_accumuler_tabnoeud_type_ddlEtendu_retenu(1)<< endl;
////fin debug

  for (int imail=1;imail<=nbmail;imail++)
    { tabQ(1) = &a_accumuler_tabnoeud_evoluee_retenu(imail);
      lesMail->InitUpdateAuNoeud(imail,a_accumuler_tabnoeud_type_ddlEtendu_retenu(imail),tabQ,cas);
    };
 
  // accumulation aux noeuds de grandeurs venant de l'éléments vers ses noeuds (exemple la pression appliquée)
	 // autres que celles aux pti classiques, mais directements disponibles
  for (int imail=1;imail<=nbmail;imail++)
     lesMail->Accumul_aux_noeuds(imail,a_accumuler_tabnoeud_type_ddlEtendu_retenu(imail)
                                 ,a_accumuler_tabnoeud_evoluee_retenu(imail),cas);
	 //  calcul des moyennes en chaque noeuds)
  tabQ.Change_taille(1);
  for (int imail=1;imail<=nbmail;imail++)
    { tabQ(1) = &a_accumuler_tabnoeud_evoluee_retenu(imail);
      lesMail->FinTransfertPtIntegAuNoeud(imail,a_accumuler_tabnoeud_type_ddlEtendu_retenu(imail),tabQ,cas);
    };
		
};
  


