]> SALOME platform Git repositories - tools/eficas.git/commitdiff
Salome HOME
pour Tests MT V9_5_0a2
authorpascale.noyret <pascale.noyret@edf.fr>
Wed, 1 Apr 2020 10:23:10 +0000 (12:23 +0200)
committerpascale.noyret <pascale.noyret@edf.fr>
Wed, 1 Apr 2020 10:23:10 +0000 (12:23 +0200)
MT/MT_Cata_V2020.py [new file with mode: 0644]
MT/prefs_MT.py
generator/generator_CARMEL3D_frequentiel.py [deleted file]
generator/generator_CARMEL3D_temporel.py [deleted file]
generator/oldCodes/generator_CARMEL3D_temporel.py [new file with mode: 0644]
generator/oldCodes/oldGenerator_CARMEL3D_frequentiel.py [new file with mode: 0755]

diff --git a/MT/MT_Cata_V2020.py b/MT/MT_Cata_V2020.py
new file mode 100644 (file)
index 0000000..c1df53f
--- /dev/null
@@ -0,0 +1,1041 @@
+## -*- coding: utf-8 -*-
+#
+## --------------------------------------------------
+## debut entete
+## --------------------------------------------------
+#
+# 20120510 : suppression de la valeur par defaut de MATERIAU->PARAMETRES_MAT->NU
+#            changement du nom MATERIAU->PARAMETRES_MAT->MASS_VOL en MATERIAU->PARAMETRES_MAT->RHO
+#
+# 20120619 : changement ordre d'affichage des macros -> ordre de création
+# 20120725 : modification definition (matrices A,K,M) palier et support
+# 20130411 : ajout elements dans palier generalise (mail tdg + comm tdg)
+#
+# todo : supprimer les noeuds -> definir les elements par leur longueur
+#
+#
+#
+#
+#
+
+
+
+
+
+
+
+
+from Accas import *
+#
+
+import types
+class Tuple:
+  def __init__(self,ntuple):
+    self.ntuple=ntuple
+
+  def __convert__(self,valeur):
+    if type(valeur) == bytes:
+      return None
+    if len(valeur) != self.ntuple:
+      return None
+    return valeur
+
+  def info(self):
+    return "Tuple de %s elements" % self.ntuple
+
+  __repr__=info
+  __str__=info
+
+
+#CONTEXT.debug = 1
+VERSION_CATALOGUE="2019.0.0";
+JdC = JDC_CATA(code = 'MT',
+               execmodul = None,
+               regles = (AU_MOINS_UN ( 'LIGNE_ARBRE',),
+                         AU_PLUS_UN ( 'LIGNE_ARBRE',)),
+               ) # Fin JDC_CATA
+
+class Direction(ASSD): pass
+class Materiau(ASSD): pass
+#class Masse(ASSD): pass
+class Zone(ASSD): pass
+class Palier(ASSD): pass
+#class Masse(ASSD): pass
+#class ConditionsAuxLimites(ASSD): pass
+class LigneArbre(ASSD): pass
+class Support(ASSD): pass
+class Butee(ASSD): pass
+class PalTor(ASSD):pass
+#class Noeud(ASSD): pass
+
+## def macro_noeuds(self, NOEUD, **args):
+##     """
+##     """
+##     if NOEUD is not None:
+##         self.type_sdprod(NOEUD, Noeud)
+##         pass
+##     else:
+##         raise AsException("Impossible de typer les concepts resultats")
+    
+##     return Noeuds
+
+############################# MATERIAUX ########################################
+# @todo
+# introduction manuelle => dans ce cas l'utilisateur definit le
+# materiau comme ci-dessous
+# recuperation depuis une bibliothÚque de materiau => sera specife
+# plus tard
+MATERIAUX = MACRO(nom = 'MATERIAUX',
+                 op = None,
+                 sd_prod = Materiau,
+                 reentrant = 'n',
+                 UIinfo = {"groupes": ("Machine tournante",)},
+                 fr = "Renseignement des caracteristiques des materiaux",
+                 TYPE_INTRO = SIMP(statut='o', 
+                                   fr = "Mode de description des caracteristiques des materiaux",
+                                   typ='TXM',
+                                   into=('MANUELLE','FICHIER'),
+                                   min=1,
+                                   max=1,
+                                   defaut='MANUELLE',
+                                   ), # end TYPE_INTRO
+                 PARAMETRES_MAT = BLOC(condition = "((TYPE_INTRO == 'MANUELLE') )",
+                                       #MASS_VOL  = SIMP(statut='o', typ='R', min=1, max=1, fr='masse volumique'),
+                                       fr = "Saisie manuelle des caracteristiques du materiau",
+                                       RHO = SIMP(statut='o',
+                                                  typ='R',
+                                                  min=1,
+                                                  max=1,
+                                                  fr='Masse volumique (kg/m**3)',
+                                                  ), # end RHO
+                                       E = SIMP(statut='o',
+                                                typ='R',
+                                                min=1,
+                                                max=1,
+                                                fr="Module d'Young (Pa)",
+                                                ), # end E
+                                       NU = SIMP(statut='o', 
+                                                 typ='R',
+                                                 min=1,
+                                                 max=1,
+                                                 val_min=-1.0,
+                                                 val_max=0.5,
+                                                 fr='Coefficient de cisaillement (-1.0 <= NU <= 0.5)',
+                                                 ), # end NU
+                                       ALPHA = SIMP(statut='f', 
+                                                    typ='R',
+                                                    min=1,
+                                                    max=1,
+                                                    fr = "Coefficient permettant de construire une matrice d'amortissement visqueux proportionnel a la rigidite",
+                                                    ), # end ALPHA
+                                       BETA = SIMP(statut='f',
+                                                   typ='R', 
+                                                   min=1, 
+                                                   max=1, 
+                                                   fr = "Coefficient permettant de construire une matrice d'amortissement visqueux proportionnel a la masse",
+                                                   ), # end BETA
+                                       GAMMA = SIMP(statut='f',
+                                                   typ='R',
+                                                   min=1,
+                                                   max=1,
+                                                   fr = "Coefficient d'amortissement hysteretique permettant de definir le module d'Young complexe",
+                                                   ), # end GAMMA
+                                       ), # end PARAMETRES_MAT
+                   FICHIER_MAT = BLOC(condition = "((TYPE_INTRO == 'FICHIER') )",
+                                      MATERIAU_CATALOGUE = SIMP(statut='o',
+                                  fr="Fichier decrivant les caracteristiques materiaux (format decrit dans le Manuel Utilisateur)",
+                                                              min=1, 
+                                  max=1, 
+                                  typ=('Fichier','Fichier materiau (*.*)'), 
+                                  ), # end MATERIAU_CATALOGUE
+                                     ), # end FICHIER_MAT
+                                     #SIMP(typ=('Fichier','JDC Files (*.comm)'),docu='',min=1,max=1,statut='o',defaut=None)
+                 ) # end MATERIAU
+
+
+
+############################# ZONES ########################################
+ZONE = MACRO(nom = 'ZONE',
+             op = None,
+             sd_prod = Zone,
+             reentrant = 'n',
+             UIinfo = {"groupes":("Machine tournante",)},
+             fr = "Description d'une zone (comportant noeuds et elements, et en option masses ponctuelles et fissures)",
+             regles = (AU_MOINS_UN("ELEMENTS")),
+             fenetreIhm='deplie1Niveau',
+             MASSE = FACT(statut='f',
+                          min=0,
+                          max='**',
+              fr = "Description des masses ponctuelles",
+              #POSITION = SIMP(statut='o',
+              NOEUD = SIMP(statut='o', 
+                      typ='TXM', 
+                      defaut=None, 
+                      fr = "Definition de la position axiale de la masse (label du noeud de la ligne d'arbres en vis-a-vis)",
+                      ), # end POSITION
+              TYPE_MASSE = SIMP(statut='o', 
+                        typ='TXM', 
+                        fr = "Renseignement du type de masse consideree",
+                        into=('DISQUE','AILETTE','QUELCONQUE'),
+                        ), # end TYPE_MASSE
+              DISQUE = BLOC(condition = "((TYPE_MASSE == 'DISQUE') )",
+                            TYPE_SAISIE = SIMP(statut='o',
+                                               typ='TXM',
+                                               fr = "Type de saisie des parametres du DISQUE",
+                                               into = ('MECANIQUE','GEOMETRIQUE'),
+                                               defaut = 'MECANIQUE'
+                                               ), # end TYPE_SAISIE
+                            PARAMETRES_MECANIQUE = BLOC(condition = "TYPE_SAISIE == 'MECANIQUE'",
+                                    PARAMETRES = FACT(statut = 'o',
+                                              fr = "Parametres mecaniques pour un DISQUE",
+                                              MASSE = SIMP(statut='o',
+                                                       typ='R',
+                                                   val_min=0,
+                                                   fr = "Masse du DISQUE (kg)",
+                                                   ), # end MASSE_DISQUE
+                                              INERTIEX = SIMP(statut='o', 
+                                                      typ='R',
+                                                      fr = "Inertie du DISQUE en X (kg.m**2)",
+                                                      ), # end INERTIEX
+                                              INERTIEY = SIMP(statut='o', 
+                                                      typ='R',
+                                                      fr = "Inertie du DISQUE en Y (kg.m**2)",
+                                                      ), # end INERTIEY
+                                              INERTIEZ = SIMP(statut='o', 
+                                                      typ='R',
+                                                      fr = "Inertie du DISQUE en Z (axe de rotation de la ligne d'arbres)(kg.m**2)",
+                                                      ), # end INERTIEZ
+                                              ) # end PARAMETRES_DISQUE_M
+                                                            ), # end PARAMETRES_MECANIQUE
+                                PARAMETRES_GEOMETRIQUE = BLOC(condition = "TYPE_SAISIE == 'GEOMETRIQUE'",
+                                    PARAMETRES = FACT(statut = 'o',
+                                              fr = "Parametres geometriques pour un DISQUE",
+                                              DIAMETRE_EXT = SIMP(statut='o',
+                                                      typ='R',
+                                                      val_min=0,
+                                                      fr = "Diametre exterieur du DISQUE (m)",
+                                                      ), # end MASSE_DISQUE
+                                              DIAMETRE_INT = SIMP(statut='o', 
+                                                          typ='R',
+                                                          fr = "Diametre interieur du DISQUE (m). Verifier le diametre exterieur du rotor avant saisie",
+                                                          ), # end INERTIEX
+                                              EPAISSEUR = SIMP(statut='o', 
+                                                       typ='R',
+                                                       val_min=0,
+                                                       fr = "Epaisseur (dans la direction axiale) du DISQUE (m)",
+                                                       ), # end INERTIEY
+                                              MATERIAU = SIMP(statut='o', 
+                                                      typ=Materiau,
+                                                      fr = "Materiau constituant le DISQUE (doit avoir ete defini via une entree MATERIAUX)",
+                                                      ), # end INERTIEZ
+                                              ) # nd PARAMETRES_DISQUE_G
+                                                            ), # end PARAMETRES_MECANIQUE
+                    ), # end DISQUE
+              AILETTE = BLOC(condition = "((TYPE_MASSE == 'AILETTE') )",
+                     TYPE_SAISIE = SIMP(statut='o',
+                                                typ='TXM',
+                                                fr = "Type de saisie des parametres de la rangee d'AILETTES",
+                                                into = ('MECANIQUE','GEOMETRIQUE'),
+                                                defaut = 'MECANIQUE'
+                                                ), # end TYPE_SAISIE
+                             PARAMETRES_MECANIQUE = BLOC(condition = "TYPE_SAISIE == 'MECANIQUE'",
+                                     PARAMETRES = FACT(statut = 'o',
+                                                   fr = "Parametres mecaniques de la rangee d'AILETTES",
+                                               MASSE = SIMP(statut='o',
+                                                            typ='R',
+                                                        val_min=0,
+                                                        fr = "Masse de la rangee d'AILETTES (kg)",
+                                                        ), # end MASSE_AILETTE
+                                               INERTIEX = SIMP(statut='o', 
+                                                       typ='R',
+                                                       fr = "Inertie de la rangee d'AILETTES en X (kg.m**2)",
+                                                       ), # end INERTIEX
+                                               INERTIEY = SIMP(statut='o', 
+                                                           typ='R',
+                                                           fr = "Inertie de la rangee d'AILETTES en Y (kg.m**2)",
+                                                       ), # end INERTIEY
+                                               INERTIEZ = SIMP(statut='o', 
+                                                       typ='R',
+                                                       fr = "Inertie de la rangee d'AILETTES en Z (axe de rotation de la ligne d'arbres) (kg.m**2)",
+                                                       ), # end INERTIEZ
+                                               ) # nd PARAMETRES_AILETTE_M
+                                                              ), # end PARAMETRES_MECANIQUE
+                                   PARAMETRES_GEOMETRIQUE = BLOC(condition = "TYPE_SAISIE == 'GEOMETRIQUE'",
+                                         PARAMETRES = FACT(statut = 'o',
+                                                   fr = "Parametres geometriques d'une AILETTE",
+                                                   MASSE_AILETTE = SIMP(statut='o',
+                                                                        typ='R',
+                                                        val_min=0,
+                                                        fr = "Masse d'une AILETTE (kg)",
+                                                        ), # end MASSE_AILETTE
+                                               RAYON = SIMP(statut='o', 
+                                                    typ='R',
+                                                    val_min=0,
+                                                    fr = "Distance entre le pied de l'AILETTE et le centre de rotation (m). Verifier le diametre exterieur du rotor avant saisie",
+                                                    ), # end RAYON
+                                               HAUTEUR = SIMP(statut='o',
+                                                              typ='R',
+                                                          val_min=0,
+                                                          fr = "Distance entre les deux extremites de l'AILETTE (m)",
+                                                          ), # end HAUTEUR
+                                               BASE = SIMP(statut='o', 
+                                                           typ='R',
+                                                       val_min=0,
+                                                       fr = "Largeur du pied de l'AILETTE (m)",
+                                                       ), # end BASE
+                                               NOMBRE = SIMP(statut='o',
+                                                             typ='I',
+                                                             val_min=1,
+                                                             fr = "Nombre d'AILETTES dans la rangee",
+                                                             ),
+                                               ) # end PARAMETRES_DISQUE
+                                                                 ), # end PARAMETRES_MECANIQUE
+                       ), # end AILETTE
+                QUELCONQUE = BLOC(condition = "((TYPE_MASSE == 'QUELCONQUE') )",
+                                  #TYPE_SAISIE = SIMP(statut='c',typ='TXM',defaut="MECANIQUE"), # cf 20120622 test : mot-clé caché
+                          PARAMETRES = FACT(statut = 'o',
+                                fr = "Parametres pour masse de type QUELCONQUE",
+                                MASSE = SIMP(statut='o', 
+                                         typ='R',
+                                         val_min=0,
+                                         fr = "Masse (m)",
+                                         ), # end MASSE
+                                INERTIEX = SIMP(statut='o', 
+                                        typ='R',
+                                        fr = "Inertie en X (kg.m**2)",
+                                           ), # end INERTIEX
+                                INERTIEY = SIMP(statut='o', 
+                                        typ='R',
+                                        fr = "Inertie en Y (kg.m**2)",
+                                           ), # end INERTIEY
+                                INERTIEZ = SIMP(statut='o', 
+                                        typ='R',
+                                        fr = "Inertie en Z (axe de rotation de la ligne d'arbres) (kg.m**2)",
+                                           ), # end INERTIEZ
+                                ), # end PARAMETRES_QUELCONQUE
+                          ), # end QUELCONQUE
+             ),  # end MASSE
+             NOEUDS = SIMP(fr = "Definition des noeuds de la zone (2 noeuds minimum)",
+                           fenetreIhm='Tableau',
+                           homo = ('NOM','POSITION_AXIALE'),
+                           statut='o',
+                           min=2, 
+                           max='**',
+                           typ = Tuple(2),
+                           validators=VerifTypeTuple(('TXM','R')),
+                           ), # end NOEUDS                 
+             ELEMENTS = FACT(fr = "Definition des elements poutre de la zone",
+                             statut='o',
+                             min=1,
+                             max='**',
+                             NOM = SIMP(statut='o',
+                                        typ='TXM',
+                                        fr="Label de l'element"
+                                        ), # end NOM
+                             NOEUD_DEBUT = SIMP(statut='o',
+                                          typ='TXM',
+                                          fr= "Noeud de debut de l'element poutre (label d'un noeud)"
+                                          ), # end DEBUT
+                             NOEUD_FIN = SIMP(statut='o',
+                                        typ='TXM',
+                                        fr= "Noeud de fin de l'element poutre (label d'un noeud)"
+                                        ), # end FIN
+                             RAFFINEMENT = SIMP(fr = "Choix de raffiner l'element poutre",
+                                              statut='o',
+                                              typ='TXM',
+                                              into=('OUI','NON'),
+                                              defaut='NON'
+                                              ), # end RAFFINEMENT
+                             PARAM_RAFFINEMENT = BLOC(fr = "Nombre de points supplementaires a ajouter pour le raffinement (nombre elements : 1 -> nb points + 1)",
+                                                    condition = "((RAFFINEMENT == 'OUI') )",
+                                                    NB_POINTS_SUPPL = SIMP(statut='o', 
+                                                                           typ='I'
+                                                                           ), # end NB_POINTS_SUPPL
+                                                    ), # end PARAM_RAFFINEMENT
+                             MATERIAU = SIMP(statut='o',
+                                             typ=Materiau,
+                                             fr= "Materiau constituant l'element poutre (doit avoir ete defini via une entree MATERIAUX)"
+                                             ), # end MATERIAU
+                 SECTION_MASSE = FACT(statut='o',
+                                                  fr = "Section a partir de laquelle est determinee la masse de l'element poutre",
+                                                  TYPE_SECTION = SIMP(statut='o',
+                                                                      fr = "Choix d'une section de dimensions constantes ou variables",
+                                                                      typ='TXM',
+                                                                      into=('CONSTANTE','VARIABLE'),
+                                                                      defaut='CONSTANTE',
+                                                                      ), # end TYPE_SECTION
+                                                  DIAM_EXTERN_DEBUT = SIMP(statut='o',
+                                                                           typ='R',
+                                                                           fr = "Diametre exterieur en debut d'element poutre (m)",
+                                                                           ), # end DIAM_EXTERN_DEBUT
+                                                  DIAM_INTERN_DEBUT = SIMP(statut='o',
+                                                                           typ='R',
+                                                                           fr = "Diametre interieur en debut d'element poutre (m) (different de 0 si element creux)",
+                                                                           ), # end DIAM_INTERN_DEBUT
+                                                  PARAMETRE_SECT_VAR = BLOC(condition = "((TYPE_SECTION == 'VARIABLE') )",
+                                                                            fr = "Renseignement des dimensions de fin d'element (variation lineaire entre le debut et la fin)",
+                                                                            DIAM_EXTERN_SORTIE = SIMP(statut='o',
+                                                                                                      typ='R',
+                                                                                                      fr = "Diametre exterieur en fin d'element (m)",
+                                                                                                      ), # end DIAM_EXTERN_SORTIE
+                                                                            DIAM_INTERN_SORTIE = SIMP(statut='o',
+                                                                                                      typ='R',
+                                                                                                      fr = "Diametre interieur en fin d'element (m)",
+                                                                                                      ), # DIAM_INTERN_SORTIE
+                                                                            ),
+                                                  ), # end SECTION_MASSE
+                             SECTION_RIGIDITE = FACT(statut='f',
+                                                     fr = "Section a partir de laquelle est determinee la rigidite de l'element poutre",
+                                                     TYPE_SECTION = SIMP(statut='o', 
+                                                                         fr = "Choix d'une section de dimensions constantes ou variables",
+                                                                         typ='TXM', 
+                                                                         into=('CONSTANTE','VARIABLE'), 
+                                                                         defaut='CONSTANTE',
+                                                                         ), # end TYPE_SECTION
+                                                     DIAM_EXTERN_DEBUT = SIMP(statut='o',
+                                                                              typ='R',
+                                                                              fr = "Diametre exterieur en debut d'element poutre (m)",
+                                                                              ), # end DIAM_EXTERN_DEBUT
+                                                     DIAM_INTERN_DEBUT = SIMP(statut='o',
+                                                                              typ='R',
+                                                                              fr = "Diametre interieur en debut d'element poutre (m) (different de 0 si element creux)",
+                                                                              ), # end DIAM_INTERN_DEBUT
+                                                     PARAMETRE_SECT_VAR = BLOC(condition = "((TYPE_SECTION == 'VARIABLE') )",
+                                                                               fr = "Renseignement des dimensions de fin d'element (variation lineaire entre le debut et la fin)",
+                                                                               DIAM_EXTERN_SORTIE = SIMP(statut='o',
+                                                                                                         typ='R',
+                                                                                                         fr = "Diametre exterieur en fin d'element (m)",
+                                                                                                         ), # end DIAM_EXTERN_SORTIE
+                                                                               DIAM_INTERN_SORTIE = SIMP(statut='o',
+                                                                                                         typ='R',
+                                                                                                         fr = "Diametre interieur en fin d'element (m)",
+                                                                                                         ), # end DIAM_INTERN_SORTIE
+                                                                               ), # end PARAMETRE_SECT_VAR
+                                                     ), # end SECTION_RIGIDITE
+                             ),  # end ELEMENTS
+                             FISSURE = FACT(statut='f',
+                                            fr="Description d'une fissure sur un noeud de l'arbre (licite uniquement si les elements poutres a gauche et a droite du noeud ont des sections masse et rigidite constantes)",
+                                            MATERIAU = SIMP(statut='o',
+                                                            typ=Materiau,
+                                                            fr="Materiau a la position de la fissure (doit avoir ete defini via une entree MATERIAUX)"
+                                                           ), # end MATERIAU
+                                            NOEUD_FISSURE = SIMP(statut='o',
+                                                                 typ='TXM',
+                                                                 fr="Label du noeud ou est positionnee la fissure",
+                                                                 ), # end POSITION_FISSURE
+                                            ORIENTATION_FISSURE = SIMP(statut='o',
+                                                                       typ='R',
+                                                                       fr="Angle initial du fond de fissure par rapport à sa définition dans la loi de comportement de fissure (0. par defaut)(degres)",
+                                                                       ), # end ORIENTATION_FISSURE
+                                            FICHIER_RAIDEUR = SIMP(statut='o',
+                                                                   typ=('Fichier','Fichier loi de raideur (*.*)'),
+                                                                   fr="Fichier contenant la loi de comportement en raideur de la fissure",
+                                                                   ), # end FICHIER_RAIDEUR
+                                            DIAMETRE = SIMP(statut='o',
+                                                            typ='R',
+                                                            fr="Diametre du rotor a l'emplacement de la fissure (m)",
+                                                            ), # end DIAMETRE
+                                            ), # end FISSURE
+
+            )  # end ZONE
+                
+############################# PALIERS ########################################
+PALIER = MACRO(nom = 'PALIER',
+               op = None,
+               sd_prod = Palier,
+               reentrant = 'n',
+               UIinfo = {"groupes":("Machine tournante",)},
+               fr = "Description d'un palier radial",
+               POSITION = SIMP(statut='o', 
+                               typ='R', 
+                               defaut=0.0, 
+                               fr = "Position axiale (absolue) du palier radial (m)",
+                               ), # end POSITION
+               NOM_NOEUD = SIMP(statut='f',
+                                typ='TXM',
+                                fr="Nom du noeud dans le cas où plusieurs noeuds se trouvent à la même position axiale"),
+               TYPE_PALIER = SIMP(statut='o', 
+                                  fr = "Type de palier radial",
+                                  typ='TXM', 
+                                  into=('PALIER LINEAIRE','PALIER NON-LINEAIRE','LAME FLUIDE'),
+                                  ), # end TYPE_PALIER
+           PALIER_LINEAIRE = BLOC(condition = "((TYPE_PALIER == 'PALIER LINEAIRE') )", 
+                          fr = "Description d'un palier radial lineaire",
+                                      TYPE_SAISIE = SIMP(statut='o', 
+                            fr = "Mode de description des caracteristiques du palier radial lineaire",
+                                                        typ='TXM', 
+                            into=('MANUELLE', 'CATALOGUE'),
+                            ), # end TYPE_SAISIE
+                      MANUELLE = BLOC(condition = "((TYPE_SAISIE == 'MANUELLE') )",
+                                      fr = "Saisie manuelle des caracteristiques du palier radial lineaire",
+                                                      CARAC_PALIER = FACT(statut = 'o',max='**',fr = "Caracteristiques du palier par vitesse de rotation de la ligne d'arbres",
+                                                              VITESSE_ROTATION = SIMP(statut='o',
+                                                                                      typ='R',
+                                                                                      fr= "Vitesse de rotation (tr/min)",
+                                                                                      ), # end VITESSE_ROTATION
+                                  SYME = SIMP(statut = 'o',
+                                      typ = 'TXM',
+                                      max = 1,
+                                      fr = "Symetrie des matrices du palier radial lineaire (KXY=KYX et AXY=AYX)",
+                                      into = ('OUI','NON'),
+                                      defaut = 'OUI',
+                                      ), # end SYME
+                                  RIGIDITE_NS = BLOC(condition="(SYME=='NON')",
+                                          RIGIDITE=FACT(statut='o',fr="Renseignement des caracteristiques non-symetriques de rigidite du palier radial lineaire",
+                                          KXX = SIMP(statut = 'o',
+                                            typ = 'R',
+                                            max = 1,
+                                            fr = "Valeur de KXX dans la matrice de rigidite (N/m)",
+                                            ),# end KXX
+                                          KXY = SIMP(statut = 'o',
+                                            typ = 'R',
+                                            max = 1,
+                                            fr = "Valeur de KXY dans la matrice de rigidite (N/m)",
+                                            ),# end KXY
+                                          KYX = SIMP(statut = 'o',
+                                            typ = 'R',
+                                            max = 1,
+                                            fr = "Valeur de KYX dans la matrice de rigidite (N/m)",
+                                            ),# end KYX
+                                          KYY = SIMP(statut = 'o',
+                                            typ = 'R',
+                                            max = 1,
+                                            fr = "Valeur de KYY dans la matrice de rigidite (N/m)",
+                                            ),# end KYY
+                                                  ), # end RIGIDITE
+                                          ), # end RIGIDITE_S
+                                  RIGIDITE_S = BLOC(condition="(SYME=='OUI')",
+                                          RIGIDITE=FACT(statut='o',fr="Renseignement des caracteristiques symetriques de rigidite du palier radial lineaire",
+                                          KXX = SIMP(statut = 'o',
+                                            typ = 'R',
+                                            max = 1,
+                                            fr = "Valeur de KXX dans la matrice de rigidite (N/m)",
+                                            ),# end KXX
+                                          KXY = SIMP(statut = 'o',
+                                            typ = 'R',
+                                            max = 1,
+                                            fr = "Valeur de KXY dans la matrice de rigidite (N/m)",
+                                            ),# end KXY
+                                          KYY = SIMP(statut = 'o',
+                                            typ = 'R',
+                                            max = 1,
+                                            fr = "Valeur de KYY dans la matrice de rigidite (N/m)",
+                                            ),# end KYY
+                                                  ), # end RIGIDITE
+                                          ), # end RIGIDITE_NS
+                                  AMORTISSEMENT_NS = BLOC(condition="(SYME=='NON')",
+                                          AMORTISSEMENT=FACT(statut='o',fr="Renseignement des caracteristiques non-symetriques d'amortissement du palier radial lineaire",
+                                          AXX = SIMP(statut = 'o',
+                                                  typ = 'R',
+                                                  max = 1,
+                                                  fr = "Valeur de AXX dans la matrice d'amortissement (N.s/m)",
+                                                ),# end AXX
+                                          AXY = SIMP(statut = 'o',
+                                                  typ = 'R',
+                                                  max = 1,
+                                                  fr = "Valeur de AXY dans la matrice d'amortissement (N.s/m)",
+                                                ),# end AXY
+                                          AYX = SIMP(statut = 'o',
+                                                  typ = 'R',
+                                                  max = 1,
+                                                  fr = "Valeur de AYX dans la matrice d'amortissement (N.s/m)",
+                                                ),# end AYX
+                                          AYY = SIMP(statut = 'o',
+                                                  typ = 'R',
+                                                  max = 1,
+                                                  fr = "Valeur de AYY dans la matrice d'amortissement (N.s/m)",
+                                                ),# end AYY
+                                                      ), # end AMORTISSEMENT
+                                            ), # end AMORTISSEMENT_NS
+                                  AMORTISSEMENT_S = BLOC(condition="(SYME=='OUI')",
+                                          AMORTISSEMENT=FACT(statut='o',fr="Renseignement des caracteristiques symetriques d'amortissement du palier radial lineaire",
+                                          AXX = SIMP(statut = 'o',
+                                                  typ = 'R',
+                                                  max = 1,
+                                                  fr = "Valeur de AXX dans la matrice d'amortissement (N.s/m)",
+                                                ),# end AXX
+                                          AXY = SIMP(statut = 'o',
+                                                  typ = 'R',
+                                                  max = 1,
+                                                  fr = "Valeur de AXY dans la matrice d'amortissement (N.s/m)",
+                                                ),# end AXY
+                                          AYY = SIMP(statut = 'o',
+                                                  typ = 'R',
+                                                  max = 1,
+                                                  fr = "Valeur de AYY dans la matrice d'amortissement (N.s/m)",
+                                                ),# end AYY
+                                                      ), # end AMORTISSEMENT
+                                            ), # end AMORTISSEMENT_S
+                                                          ), # end CARAC_PALIER
+                              ), # end MANUELLE
+                              CATALOGUE = BLOC(condition = "((TYPE_SAISIE == 'CATALOGUE') )",
+                                      fr = "Renseignement des fichiers contenant les caracteristiques du palier radial lineaire",
+                                                                      CATALOGUE_AMORTISSEMENT = SIMP(statut='o',
+                                                  min=1, 
+                                                  max=1, 
+                                                  typ='Fichier', 
+                                                  fr="Fichier decrivant les caracteristiques d'amortissement (N.s/m) du palier radial lineaire (format decrit dans le Manuel Utilisateur)",
+                                                  ), # end CATALOGUE_AMORTISSEMENT
+                                      CATALOGUE_RIGIDITE = SIMP(statut='o',
+                                                  min=1, 
+                                                  max=1, 
+                                                  typ='Fichier', 
+                                                  fr="Fichier decrivant les caracteristiques de rigidite (N/m) du palier radial lineaire (format decrit dans le Manuel Utilisateur)",
+                                                  ), # end CATALOGUE_RIGIDITE
+                                      ), # end CATALOGUE
+                         ), # end PALIER_LINEAIRE
+                  LAME_FLUIDE = BLOC(condition = "((TYPE_PALIER == 'LAME FLUIDE') )",
+                                      fr = "Description d'une lame fluide",
+                                                  TYPE_SAISIE = SIMP(statut='o', 
+                            fr = "Mode de description des caracteristiques de la lame fluide",
+                                                        typ='TXM', 
+                                                        defaut = 'MANUELLE',
+                            #into=('MANUELLE', 'CATALOGUE'), #Fonctionnalite catalogue non encore implementee
+                            into=('MANUELLE',),
+                            ), # end TYPE_SAISIE
+                                  MANUELLE = BLOC(condition = "((TYPE_SAISIE == 'MANUELLE') )",
+                                                fr = "Saisie manuelle des caracteristiques de la lame fluide",
+                                                                CARAC_PALIER = FACT(statut = 'o',max='**',fr = "Caracteristiques de la lame fluide par vitesse de rotation de la ligne d'arbres",
+                                      SYME = SIMP(statut = 'o',
+                                        typ = 'TXM',
+                                        max = 1,
+                                        fr = "Symetrie des matrices de la lame fluide  (KXY=KYX et AXY=AYX)",
+                                        into = ('OUI','NON'),
+                                        defaut = 'OUI',
+                                        ), # end SYME
+                                    RIGIDITE_NS = BLOC(condition="(SYME=='NON')",
+                                            RIGIDITE=FACT(statut='o',fr="Renseignement des caracteristiques non-symetriques de rigidite de la lame fluide",
+                                          KXX = SIMP(statut = 'o',
+                                            typ = 'R',
+                                            max = 1,
+                                            fr = "Valeur de KXX dans la matrice de rigidite (N/m)",
+                                            ),# end KXX
+                                          KXY = SIMP(statut = 'o',
+                                            typ = 'R',
+                                            max = 1,
+                                            fr = "Valeur de KXY dans la matrice de rigidite (N/m)",
+                                            ),# end KXY
+                                          KYX = SIMP(statut = 'o',
+                                            typ = 'R',
+                                            max = 1,
+                                            fr = "Valeur de KYX dans la matrice de rigidite (N/m)",
+                                            ),# end KYX
+                                          KYY = SIMP(statut = 'o',
+                                            typ = 'R',
+                                            max = 1,
+                                            fr = "Valeur de KYY dans la matrice de rigidite (N/m)",
+                                            ),# end KYY
+                                            ),# end RIGIDITE
+                                            ), # end RIGIDITE_NS
+                                    RIGIDITE_S = BLOC(condition="(SYME=='OUI')",
+                                            RIGIDITE=FACT(statut='o',fr="Renseignement des caracteristiques symetriques de rigidite de la lame fluide",
+                                          KXX = SIMP(statut = 'o',
+                                            typ = 'R',
+                                            max = 1,
+                                            fr = "Valeur de KXX dans la matrice de rigidite (N/m)",
+                                            ),# end KXX
+                                          KXY = SIMP(statut = 'o',
+                                            typ = 'R',
+                                            max = 1,
+                                            fr = "Valeur de KXY dans la matrice de rigidite (N/m)",
+                                            ),# end KXY
+                                          KYY = SIMP(statut = 'o',
+                                            typ = 'R',
+                                            max = 1,
+                                            fr = "Valeur de KYY dans la matrice de rigidite (N/m)",
+                                            ),# end KYY
+                                                  ), # end RIGIDITE
+                                            ), # end RIGIDITE_S
+                                    AMORTISSEMENT_NS = BLOC(condition="(SYME=='NON')",
+                                            AMORTISSEMENT=FACT(statut='o',fr="Renseignement des caracteristiques non-symetriques d'amortissement de la lame fluide",
+                                          AXX = SIMP(statut = 'o',
+                                                  typ = 'R',
+                                                  max = 1,
+                                                  fr = "Valeur de AXX dans la matrice d'amortissement (N.s/m)",
+                                                ),# end AXX
+                                          AXY = SIMP(statut = 'o',
+                                                  typ = 'R',
+                                                  max = 1,
+                                                  fr = "Valeur de AXY dans la matrice d'amortissement (N.s/m)",
+                                                ),# end AXY
+                                          AYX = SIMP(statut = 'o',
+                                                  typ = 'R',
+                                                  max = 1,
+                                                  fr = "Valeur de AYX dans la matrice d'amortissement (N.s/m)",
+                                                ),# end AYX
+                                          AYY = SIMP(statut = 'o',
+                                                  typ = 'R',
+                                                  max = 1,
+                                                  fr = "Valeur de AYY dans la matrice d'amortissement (N.s/m)",
+                                                ),# end AYY
+                                                      ), # end AMORTISSEMENT
+                                                ), # end AMORTISSEMENT
+                                            #), # end AMORTISSEMENT_NS
+                                    AMORTISSEMENT_S = BLOC(condition="(SYME=='OUI')",
+                                            AMORTISSEMENT=FACT(statut='o',fr="Renseignement des caracteristiques symetriques d'amortissement de la lame fluide",
+                                          AXX = SIMP(statut = 'o',
+                                                  typ = 'R',
+                                                  max = 1,
+                                                  fr = "Valeur de AXX dans la matrice d'amortissement (N.s/m)",
+                                                ),# end AXX
+                                          AXY = SIMP(statut = 'o',
+                                                  typ = 'R',
+                                                  max = 1,
+                                                  fr = "Valeur de AXY dans la matrice d'amortissement (N.s/m)",
+                                                ),# end AXY
+                                          AYY = SIMP(statut = 'o',
+                                                  typ = 'R',
+                                                  max = 1,
+                                                  fr = "Valeur de AYY dans la matrice d'amortissement (N.s/m)",
+                                                ),# end AYY
+                                                      ), # end AMORTISSEMENT
+                                                ), # end AMORTISSEMENT_S
+                                    MASSE_NS = BLOC(condition="(SYME=='NON')",
+                                            MASSE=FACT(statut='o',fr="Renseignement des caracteristiques non symetriques de masse de la lame fluide",
+                                              MXX = SIMP(statut = 'o',
+                                                    typ = 'R',
+                                                    max = 1,
+                                                    fr = "Valeur de MXX dans la matrice de masse (kg)",
+                                                    ),# end MXX
+                                              MXY = SIMP(statut = 'o',
+                                                    typ = 'R',
+                                                    max = 1,
+                                                    fr = "Valeur de MXY dans la matrice de masse (kg)",
+                                                    ),# end MXY
+                                              MYX = SIMP(statut = 'o',
+                                                    typ = 'R',
+                                                    max = 1,
+                                                    fr = "Valeur de MYX dans la matrice de masse (kg)",
+                                                    ),# end MYX
+                                              MYY = SIMP(statut = 'o',
+                                                    typ = 'R',
+                                                    max = 1,
+                                                    fr = "Valeur de MYY dans la matrice de masse (kg)",
+                                                    ),# end MYY
+                                                ), # end MASSE
+                                            ), # end MASSE_NS
+                                    MASSE_S = BLOC(condition="(SYME=='OUI')",
+                                        MASSE=FACT(statut='o',fr="Renseignement des caracteristiques symetriques de masse de la lame fluide",
+                                              MXX = SIMP(statut = 'o',
+                                                    typ = 'R',
+                                                    max = 1,
+                                                    fr = "Valeur de MXX dans la matrice de masse (kg)",
+                                                    ),# end MXX
+                                              MXY = SIMP(statut = 'o',
+                                                    typ = 'R',
+                                                    max = 1,
+                                                    fr = "Valeur de MXY dans la matrice de masse (kg)",
+                                                    ),# end MXY
+                                              MYY = SIMP(statut = 'o',
+                                                    typ = 'R',
+                                                    max = 1,
+                                                    fr = "Valeur de MYY dans la matrice de masse (kg)",
+                                                    ),# end MYY
+                                                ), # end MASSE
+                                            ), # end MASSE_S
+                                    VITESSE_ROTATION = SIMP(statut='o',
+                                                typ='R',
+                                                fr= "Vitesse de rotation (tr/min)",
+                                                ), # end VITESSE_ROTATION
+                                                               ), # end CARAC_PALIER
+                              ), # end MANUELLE
+                              #Fonctionnalite non encore implementee
+                                                      CATALOGUE = BLOC(condition = "((TYPE_SAISIE == 'CATALOGUE') )",
+                                    PALIERS_CATALOGUE = SIMP(statut='o',
+                                                min=1, 
+                                                max=1, 
+                                                typ='Fichier', 
+                                                fr="Format du fichier : CSV.",
+                                                ), # end PALIERS_CATALOGUE
+                                    ), # end CATALOGUE
+                              
+                        ), # end LAME_FLUIDE
+                        PALIER_NON_LINEAIRE = BLOC(condition = "((TYPE_PALIER == 'PALIER NON-LINEAIRE') )",
+                                                  fr = "Description d'un palier non-lineaire (licite uniquement en cas d'analyse de type 'TRANSITOIRE ACCIDENTEL'",
+                                                                  TYPE = SIMP(statut='o',
+                                                              typ='TXM',
+                                                              into=('PAPANL','PAFINL','PAHYNL','PACONL'),
+                                                              defaut=None,
+                                                              fr="Type de palier non-lineaire parmi ceux proposes dans Edyos",
+                                                              ), # end TYPE
+                                                  REPERTOIRE_EDYOS = SIMP(statut='o',
+                                                                          typ=('Repertoire'),
+                                                                          defaut=None,
+                                                                          fr="Repertoire 'CDC' du palier non-lineaire utilise (les fichiers Geometrie et Donnees doivent exister dans les repertoires parents respectivement de niveau 2 et 1 de CDC)",
+                                                                          ), # end REPERTOIRE_EDYOS
+                                                  ), # end PALIER_NON_LINEAIRE
+               )  # end PALIER
+
+PALIER_TORSION=MACRO(nom="PALIER_TORSION",
+                     op=None,
+                     sd_prod=PalTor,
+                     reentrant='n',
+                     UIinfo={"groupes":("Machine tournante",)},
+                     fr="Description d'un palier de torsion",
+                     POSITION = SIMP(statut='o',typ='R',defaut=0.0,fr = "Position axiale (absolue) du palier de torsion (m)",), # end POSITION
+                     TYPE_SAISIE = SIMP(statut='o',typ='TXM',into=('MANUELLE',),fr = "Mode de description des caracteristiques du palier de torsion",), # end TYPE_SAISIE
+                                   MANUELLE = BLOC(condition = "((TYPE_SAISIE == 'MANUELLE') )", 
+                                              fr = "Saisie manuelle des caracteristiques du palier de torsion",
+                                                          CARAC_PALIER = FACT(statut = 'o',max=1,fr = "Caracteristiques du palier par vitesse de rotation de l'arbre",
+                                                                VITESSE_ROTATION = SIMP(statut='o',typ='R',min=1,max='**',fr= "Liste des vitesses de rotation (tr/min)",), # end VITESSE_ROTATION          
+                                                                KRZ = SIMP(statut = 'o',typ = 'R',min=1,max = '**',fr = "Liste des caracteristiques de rigidite (N/m) du palier de torsion en fonction de la vitesse de rotation",),# end KRZ
+                                                                ARZ = SIMP(statut = 'o',typ = 'R',min=1,max = '**',fr = "Liste des caracteristiques d'amortissement (N.s/m) du palier de torsion  en fonction de la vitesse de rotation",),# end ARZ
+                                                                MRZ = SIMP(statut = 'f',typ = 'R',min=1,max = '**',fr = "Liste des caracteristiques de masse ajoutee (kg) du palier de torsion  en fonction de la vitesse de rotation",),# end MRZ                    
+                                                              ),#end CARAC_PALIER
+                                                            ), # end MANUELLE
+                                   #Fonctionnalite pas encore implementee
+                                                           CATALOGUE = BLOC(condition = "((TYPE_SAISIE == 'CATALOGUE') )",
+                                                                            fr = "Renseignement des fichiers contenant les caracteristiques du palier de torsion",
+                                                    CATA_PALIER = SIMP(statut='o',min=1,max=1,typ='Fichier',fr="Format du fichier : CSV.",), # end CATA_PALIER
+                                                   ), # end CATALOGUE
+                 )#end PALIER TORSION
+        
+BUTEE=MACRO(nom="BUTEE",
+            op=None,
+            sd_prod=Butee,
+            reentrant='n',
+            UIinfo={"groupes":("Machine tournante",)},
+            fr="Description d'une butee",
+            POSITION = SIMP(statut='o',typ='R',defaut=0.0,fr = "Position axiale (absolue) de la butee (m)",), # end POSITION
+            TYPE_BUTEE = SIMP(statut='o',typ='TXM',into=('BUTEE LINEAIRE',),fr = "Type de butee",), # end TYPE_BUTEE, BUTEE NON LINEAIRE reintegrable
+            BUTEE_LINEAIRE=BLOC(condition="TYPE_BUTEE=='BUTEE LINEAIRE'",
+                                fr = "Description d'une butee lineaire",
+                                TYPE_SAISIE = SIMP(statut='o',typ='TXM',into=('MANUELLE',),fr = "Mode de description des caracteristiques de la butee lineaire",), # end TYPE_SAISIE; 'CATALOGUE' reintegrable
+                                MANUELLE=BLOC(condition="TYPE_SAISIE=='MANUELLE'",
+                                              fr = "Saisie manuelle des caracteristiques de la butee lineaire",
+                                              CARAC_BUTEE=FACT(statut='o',max=1,fr="Caracteristiques de la butee en fonction de la vitesse de rotation",
+                                                            VITESSE_ROTATION=SIMP(statut='o',typ='R',min=1,max='**',fr="Liste des vitesses de rotation (tr/min)",),
+                                                            SYMETRIQUE=SIMP(statut='o',typ='TXM',min=1,max=1,into=("OUI","NON"),defaut="OUI",fr="Symetrie des matrices de la butee (KRXRY=KRYRX , ARXRY=ARYRX et MRXRY=MRYRX)",),
+
+                                                            RIGIDITE_NS = BLOC(condition="(SYMETRIQUE=='NON')",
+                                                                            RIGIDITE=FACT(statut='o',max=1,fr="Caracteristiques non-symetriques de rigidite de la butee lineaire en fonction de la vitesse de rotation",
+                                                                          KZZ=SIMP(statut='o',typ='R',min=1,max='**',fr="Rigidite axiale (N/m) de la butee lineaire en fonction de la vitesse de rotation"),
+                                                                          KRXRX=SIMP(statut='f',typ='R',min=1,max='**',fr="Rigidite directe de rotation autour de l'axe X (N/m) de la butee lineaire en fonction de la vitesse de rotation"),
+                                                                          KRXRY=SIMP(statut='f',typ='R',min=1,max='**',fr="Rigidite croisee de rotation autour de l'axe X (N/m) de la butee lineaire en fonction de la vitesse de rotation"),
+                                                                          KRYRX=SIMP(statut='f',typ='R',min=1,max='**',fr="Rigidite croisee de rotation autour de l'axe Y (N/m) de la butee lineaire en fonction de la vitesse de rotation"),
+                                                                          KRYRY=SIMP(statut='f',typ='R',min=1,max='**',fr="Rigidite directe de rotation autour de l'axe Y (N/m) de la butee lineaire en fonction de la vitesse de rotation"),
+                                                                             ), #END RIGIDITE
+                                                            ),#END RIGIDITE_NS
+                                                            RIGIDITE_S = BLOC(condition="(SYMETRIQUE=='OUI')",
+                                                                RIGIDITE=FACT(statut='o',max=1,fr="Caracteristiques symetriques de rigidite de la butee lineaire en fonction de la vitesse de rotation",
+                                                                          KZZ=SIMP(statut='o',typ='R',min=1,max='**',fr="Rigidite axiale (N/m) de la butee lineaire en fonction de la vitesse de rotation"),
+                                                                          KRXRX=SIMP(statut='f',typ='R',min=1,max='**',fr="Rigidite directe de rotation autour de l'axe X (N/m) de la butee lineaire en fonction de la vitesse de rotation"),
+                                                                          KRXRY=SIMP(statut='f',typ='R',min=1,max='**',fr="Rigidite croisee de rotation autour de l'axe X (N/m) de la butee lineaire en fonction de la vitesse de rotation"),
+                                                                          KRYRY=SIMP(statut='f',typ='R',min=1,max='**',fr="Rigidite directe de rotation autour de l'axe Y (N/m) de la butee lineaire en fonction de la vitesse de rotation"),
+                                                                             ), #END RIGIDITE
+                                                            ),#END RIGIDITE_S
+
+                                                            AMORTISSEMENT_NS = BLOC(condition="(SYMETRIQUE=='NON')",
+                                                                AMORTISSEMENT=FACT(statut='o',max=1,fr="Caracteristiques non-symetriques d'amortissement de la butee lineaire en fonction de la vitesse de rotation",
+                                                                          AZZ=SIMP(statut='o',typ='R',min=1,max='**',fr="Amortissement axial (N.s/m) de la butee lineaire en fonction de la vitesse de rotation"),
+                                                                          ARXRX=SIMP(statut='f',typ='R',min=1,max='**',fr="Amortissement direct de rotation autour de l'axe X (N.s/m) de la butee lineaire en fonction de la vitesse de rotation"),
+                                                                          ARXRY=SIMP(statut='f',typ='R',min=1,max='**',fr="Amortissement croise de rotation autour de l'axe X (N.s/m) de la butee lineaire en fonction de la vitesse de rotation"),
+                                                                          ARYRX=SIMP(statut='f',typ='R',min=1,max='**',fr="Amortissement croise de rotation autour de l'axe Y (N.s/m) de la butee lineaire en fonction de la vitesse de rotation"),
+                                                                          ARYRY=SIMP(statut='f',typ='R',min=1,max='**',fr="Amortissement croise de rotation autour de l'axe Y (N.s/m) de la butee lineaire en fonction de la vitesse de rotation"),                                       
+                                                                  ),#END AMORTISSEMENT
+                                                            ),#END AMORTISSEMENT_NS
+                                                            AMORTISSEMENT_S = BLOC(condition="(SYMETRIQUE=='OUI')",
+                                                                AMORTISSEMENT=FACT(statut='o',max=1,fr="Caracteristiques symetriques d'amortissement de la butee lineaire en fonction de la vitesse de rotation",
+                                                                          AZZ=SIMP(statut='o',typ='R',min=1,max='**',fr="Amortissement axial (N.s/m) de la butee lineaire en fonction de la vitesse de rotation"),
+                                                                          ARXRX=SIMP(statut='f',typ='R',min=1,max='**',fr="Amortissement direct de rotation autour de l'axe X (N.s/m) de la butee lineaire en fonction de la vitesse de rotation"),
+                                                                          ARXRY=SIMP(statut='f',typ='R',min=1,max='**',fr="Amortissement croise de rotation autour de l'axe X (N.s/m) de la butee lineaire en fonction de la vitesse de rotation"),
+                                                                          ARYRY=SIMP(statut='f',typ='R',min=1,max='**',fr="Amortissement croise de rotation autour de l'axe Y (N.s/m) de la butee lineaire en fonction de la vitesse de rotation"),                                       
+                                                                  ),#END AMORTISSEMENT
+                                                            ),#END AMORTISSEMENT_S
+
+                                                            INERTIE_NS = BLOC(condition="(SYMETRIQUE=='NON')",
+                                                                INERTIE=FACT(statut='f',max=1,fr="Caracteristiques non-symetriques de masse ajoutee de la butee lineaire en fonction de la vitesse de rotation",
+                                                                          MZZ=SIMP(statut='f',typ='R',min=1,max='**',fr="Masse ajoutee axiale (kg) de la butee lineaire en fonction de la vitesse de rotation"),
+                                                                          MRXRX=SIMP(statut='f',typ='R',min=1,max='**',fr="Masse ajoutee directe de rotation autour de l'axe X (kg) de la butee lineaire en fonction de la vitesse de rotation"),
+                                                                          MRXRY=SIMP(statut='f',typ='R',min=1,max='**',fr="Masse ajoutee croisee de rotation autour de l'axe X (kg) de la butee lineaire en fonction de la vitesse de rotation"),
+                                                                          MRYRX=SIMP(statut='f',typ='R',min=1,max='**',fr="Masse ajoutee croisee de rotation autour de l'axe Y (kg) de la butee lineaire en fonction de la vitesse de rotation"),
+                                                                          MRYRY=SIMP(statut='f',typ='R',min=1,max='**',fr="Masse ajoutee croisee de rotation autour de l'axe Y (kg) de la butee lineaire en fonction de la vitesse de rotation"),                                       
+                                                                 ),#END INERTIE
+                                                            ),#END INERTIE_NS                                   
+                                                            INERTIE_S = BLOC(condition="(SYMETRIQUE=='OUI')",
+                                                                INERTIE=FACT(statut='f',max=1,fr="Caracteristiques symetriques de masse ajoutee de la butee lineaire en fonction de la vitesse de rotation",
+                                                                          MZZ=SIMP(statut='f',typ='R',min=1,max='**',fr="Masse ajoutee axiale (kg) de la butee lineaire en fonction de la vitesse de rotation"),
+                                                                          MRXRX=SIMP(statut='f',typ='R',min=1,max='**',fr="Masse ajoutee directe de rotation autour de l'axe X (kg) de la butee lineaire en fonction de la vitesse de rotation"),
+                                                                          MRXRY=SIMP(statut='f',typ='R',min=1,max='**',fr="Masse ajoutee croisee de rotation autour de l'axe X (kg) de la butee lineaire en fonction de la vitesse de rotation"),
+                                                                          MRYRY=SIMP(statut='f',typ='R',min=1,max='**',fr="Masse ajoutee croisee de rotation autour de l'axe Y (kg) de la butee lineaire en fonction de la vitesse de rotation"),                                       
+                                                                 ),#END INERTIE
+                                                            ),#END INERTIE_S
+                                                            
+                                                          ),#END CARA_BUTEE
+                                              ),#end MANUELLE
+                                CATALOGUE=BLOC(condition="TYPE_SAISIE=='CATALOGUE'",
+                                               fr = "Renseignement des fichiers contenant les caracteristiques de la butee lineaire",
+                                               ),#END CATALOGUE
+                               ),#END BUTEE LINEAIRE
+
+            BUTEE_NON_LINEAIRE=BLOC(condition="TYPE_BUTEE=='BUTEE NON LINEAIRE'",
+                                    fr = "Description d'une butee non-lineaire",
+                                    ),#END BUTEE NON LINEAIRE
+
+    );#END BUTEE
+
+############################# SUPPORT ########################################
+SUPPORT = MACRO(nom = "SUPPORT",
+                op = None,
+                sd_prod = Support,
+                reentrant = 'n',
+                UIinfo = {"groupes":("Machine tournante",)},
+                fr = "Description d'un support ",
+                TYPE_SUPPORT = SIMP(statut='o', 
+                                    fr = "Type de support",
+                                    typ='TXM', 
+                                    defaut="RIGIDE", 
+                                    into=("RIGIDE", "SIMPLIFIE", "GENERALISE", ),
+                                    ), # end TYPE_SUPPORT
+                SIMPLIFIE = BLOC(condition = "((TYPE_SUPPORT == 'SIMPLIFIE') )",
+                                fr = "Description d'un support simplifie",
+                                RIGIDITE = FACT(statut='o', fr = "Renseignement des caracteristiques de rigidite du support simplifie",
+                        KXX = SIMP(statut = 'o',
+                              typ = 'R',
+                              max = 1,
+                              fr = "Valeur de KXX dans la matrice de rigidite (N/m)",
+                              ),# end KXX
+                        KXY = SIMP(statut = 'o',
+                              typ = 'R',
+                              max = 1,
+                              fr = "Valeur de KXY dans la matrice de rigidite (N/m)",
+                              ),# end KXY
+                        KYX = SIMP(statut = 'o',
+                              typ = 'R',
+                              max = 1,
+                              fr = "Valeur de KYX dans la matrice de rigidite (N/m)",
+                              ),# end KYX
+                        KYY = SIMP(statut = 'o',
+                              typ = 'R',
+                              max = 1,
+                              fr = "Valeur de KYY dans la matrice de rigidite (N/m)",
+                              ),# end KYY
+                        ), # end RIGIDITE
+                AMORTISSEMENT = FACT(statut='o', fr= "Renseignement des caracteristiques d'amortissement du support simplifie",
+                            AXX = SIMP(statut = 'o',
+                                typ = 'R',
+                                max = 1,
+                                fr = "Valeur de AXX dans la matrice d'amortissement (N.s/m)",
+                                  ),# end AXX
+                            AXY = SIMP(statut = 'o',
+                                typ = 'R',
+                                max = 1,
+                                fr = "Valeur de AXY dans la matrice d'amortissement (N.s/m)",
+                                  ),# end AXY
+                            AYX = SIMP(statut = 'o',
+                                typ = 'R',
+                                max = 1,
+                                fr = "Valeur de AYX dans la matrice d'amortissement (N.s/m)",
+                                  ),# end AYX
+                            AYY = SIMP(statut = 'o',
+                                typ = 'R',
+                                max = 1,
+                                fr = "Valeur de AYY dans la matrice d'amortissement (N.s/m)",
+                                  ),# end AYY
+                              ), # end AMORTISSEMENT
+                                MASSE = FACT(statut='o', fr= "Renseignement des caracteristiques de masse du support simplifie",
+                        MXX = SIMP(statut = 'o',
+                            typ = 'R',
+                            max = 1,
+                            fr = "Valeur de MXX dans la matrice de masse (kg)",
+                              ),# end MXX
+                        MXY = SIMP(statut = 'o',
+                            typ = 'R',
+                            max = 1,
+                            fr = "Valeur de MXY dans la matrice de masse (kg)",
+                              ),# end MXY
+                        MYX = SIMP(statut = 'o',
+                            typ = 'R',
+                            max = 1,
+                            fr = "Valeur de MYX dans la matrice de masse (kg)",
+                              ),# end MYX
+                        MYY = SIMP(statut = 'o',
+                            typ = 'R',
+                            max = 1,
+                            fr = "Valeur de MYY dans la matrice de masse (kg)",
+                              ),# end MYY
+                        ), # end MASSE
+                                 ), # end SIMPLIFIE
+                GENERALISE = BLOC(condition = "((TYPE_SUPPORT == 'GENERALISE') )",
+                                  fr = "Description d'un support generalise",
+                                  ANGL_NAUT = SIMP(statut='f',
+                                                  fr="Rotation du modele du support generalise a effectuer pour coincider avec le repere de la ligne d'arbres (rotation autour de X, puis Y, puis Z (degres))",
+                                                  typ='R',
+                                                  min=3,max=3,
+                                                  ), # end ANGL_NAUT
+                                  TRANS = SIMP(statut='f',
+                                              fr="Translation du modele du support generalise a effectuer pour que ses noeuds de connexion soient confondus avec ceux de la ligne d'arbres (translation suivant X, Y et Z (m))",
+                                              typ='R',
+                                              min=3,max=3,
+                                              ), # end TRANS
+                                  MAIL_TDG = SIMP(statut='o',
+                                                 fr="Fichier du maillage du support generalise",
+                                                 typ=("Fichier","Fichier maillage TdG (*.*)"),
+                                                 min=1,max=1,
+                                                ), # end MAIL_TDG
+                                  COMM_TDG = SIMP(statut='o',
+                                                 fr="Fichier de la mise en donnees du support generalise",
+                                                 typ=("Fichier","Fichier commande TdG (*.*)"),
+                                                 min=1,max=1,
+                                                ), # end COMM_TDG
+                                  NOM_MACRO_ELEMENT_DYNAMIQUE = SIMP(statut='o',
+                                                                     fr="Nom du macro element dynamique cree pour le support generalise",
+                                                                     typ='TXM',
+                                                                     min=1,max=1,
+                                                                    ), # end NOM_MACRO_ELEMENT_DYNAMIQUE
+                                  NOM_INTERFACE = SIMP(statut='o',
+                                                       fr="Nom de l'interface cree pour le support generalise",
+                                                       typ='TXM',
+                                                       min=1,max=1,
+                                                      ), # end NOM_INTERFACE
+                                  NOM_GROUP_MA_MASSIF = SIMP(statut='o',
+                                                             fr="Nom du groupe de maille representant le support generalise",
+                                                             typ='TXM',
+                                                             min=1,max=1,
+                                                            ), # end NOM_GROUP_MA_MASSIF
+                                  REDUIT = SIMP(statut='f',
+                                                fr="Introduction du mot-cle REDUIT pour le cas ou le nombre d'interfaces n'est pas identique entre le support generalise et la ligne d'arbres",
+                                                typ='TXM',
+                                                into=("OUI",),
+                                                defaut="OUI",
+                                               ), # end REDUIT 
+                                  ), # end GENERALISE
+                ) # end SUPPORT
+
+############################# LIGNE_ARBRE ########################################
+LIGNE_ARBRE = MACRO(nom = 'LIGNE_ARBRE',
+                    op = None,
+                    sd_prod = LigneArbre,
+                    reentrant = 'n',
+                    UIinfo = {"groupes":("Machine tournante",)},
+                    fr = "Description de la ligne d'arbres",
+                    ZONES = SIMP(statut='o', 
+                                 fr = "Zone(s) composant la ligne d'arbres (choisir, en faisant attention a l'ordre, parmi les entrees ZONE creees)",
+                                 typ=Zone, 
+                                 min=1, 
+                                 max='**',
+                                 ), # end ZONES
+                    PALIERS = SIMP(statut='o',
+                                   fr = "Paliers supportant la ligne d'arbres (choisir, en faisant attention a l'ordre, parmi les entrees PALIER creees)",
+                                   typ=Palier,
+                                   min=2,
+                                   max='**',
+                                   ), # end PALIERS
+                    BUTEES  = SIMP(statut='f',
+                                   fr = "Butee(s) guidant axialement la ligne d'arbres (choisir, en faisant attention a l'ordre, parmi les entrees BUTEES creees)",
+                                   typ=Butee,
+                                   max='**'
+                                   ),#end BUTEE
+                    PALIERS_TORSION=SIMP(statut='f',
+                                         fr = "Palier(s) de torsion de la ligne d'arbres (choisir, en faisant attention a l'ordre, parmi les entrees PALIERS_TORSION creees)",
+                                         typ=PalTor,
+                                         max='**'
+                                         ),#end PALIERS_TORSION
+                    SUPPORTS = SIMP(statut='o', 
+                                    fr = "Supports sous les paliers (choisir, en faisant attention a l'ordre, parmi les entrees SUPPORTS creees)",
+                                    typ=Support, 
+                                    min=1, 
+                                    max='**',
+                                    ), # end SUPPORTS
+                    ) # end LIGNE_ARBRE
+
index ec6a9af5074c35cc5ad469eecc02108e790ec59a..ac892e7fc2069ae3adf4524185ebc1ec0d8343af 100644 (file)
@@ -35,7 +35,7 @@ encoding='iso-8859-1'
 
 #
 catalogues=(
-   ('MT','V2016',os.path.join(repIni,'MT_Cata_V2016.py'),'python','python'),
+   ('MT','V2020',os.path.join(repIni,'MT_Cata_V2020.py'),'python','python'),
 )
 nombreDeBoutonParLigne=4
 simpleClic=True
diff --git a/generator/generator_CARMEL3D_frequentiel.py b/generator/generator_CARMEL3D_frequentiel.py
deleted file mode 100755 (executable)
index 2bc21ca..0000000
+++ /dev/null
@@ -1,1444 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright (C) 2007-2017   EDF R&D
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-#
-# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-#
-"""Ce module contient le plugin generateur de fichier au format  Code_Carmel3D pour EFICAS.
-"""
-
-import traceback
-import types,string,re,os
-from Extensions.i18n import tr
-from generator_python import PythonGenerator
-
-# Groupes de mailles dont les types sont definis par des prefixes dans leur nom
-usePrefix = False # les noms ont des prefixes (True) ou non (False)
-# liste des prefixes des groupes de mailles, sans le caractere _ separant le prefixe du reste du nom
-# Ce prefixe (et caractere _) doivent etre supprimes dans le fichier .phys
-listePrefixesGroupeMaille = ("DIEL","NOCOND","COND","CURRENT","EPORT","HPORT","TOPO","PB_MOBILE","NILMAT",
-                         "VCUT","VCUTN","EWALL","HWALL","GAMMAJ","PERIODIC","APERIODIC",
-                         "HPROBE","EPROBE","BFLUX","BFLUXN","JFLUX","JFLUXN",
-                         "PORT_OMEGA","POST_PHI","PB_GRID",
-                         "SCUTE","SCUTN","ZS","ZJ","ZT")
-# liste des prefixes des groupes de mailles, sans le separateur, par type de bloc du fichier PHYS sous la forme d'un dictionnaire
-dictPrefixesGroupeMaille = {'DIELECTRIC':('DIEL','NOCOND'), 
-                                             'CONDUCTOR':('COND',), 
-                                             'STRANDED_INDUCTOR':('CURRENT', ), 
-                                             'EPORT':('EPORT', ), 
-                                             'HPORT':('HPORT', ), 
-                                             'ZSURFACIC':('ZS', ), 
-                                             'ZINSULATOR':('ZJ', ), 
-                                             'NILMAT':('NILMAT', )}
-# separateur entre le prefixe et le reste du nom du groupe de maille
-sepNomGroupeMaille = '_'
-
-
-# types de problemes
-HARMONIC = 'HARMONIC' # probleme frequentiel
-TIME_DOMAIN = 'TIME_DOMAIN' # probleme temporel
-
-# nom du plugin, utilisé dans entryPoint et generMACRO_ETAPE()
-nomPlugin = 'CARMEL3DFV0'
-
-def entryPoint():
-   """
-      Retourne les informations necessaires pour le chargeur de plugins
-      Ces informations sont retournees dans un dictionnaire
-   """
-   return {
-        # Le nom du plugin
-          'name' : nomPlugin,
-        # La factory pour creer une instance du plugin
-          'factory' : CARMEL3DFV0Generator,
-          }
-
-
-
-class CARMEL3DFV0Generator(PythonGenerator):
-   """
-      Ce generateur parcourt un objet de type JDC et produit
-      un texte au format eficas et 
-      un texte au format attendu par le code Code_Carmel3D (fichier '.PHYS') 
-
-   """
-   # Les extensions de fichier permis?
-   extensions=('.comm',)
-
-#----------------------------------------------------------------------------------------
-   def gener(self,obj,format='brut',config=None):
-       
-      self.initDico()
-      
-      #self.debug = True
-      
-      # Cette instruction genere le contenu du fichier de commandes (persistance)
-      self.text=PythonGenerator.gener(self,obj,format)
-
-      if self.debug:
-         print "self.text = %s" % self.text
-
-      # Cette instruction genere le contenu du fichier de parametres pour le code Carmel3D
-      # si le jdc est valide (sinon cela n a pas de sens)
-      if obj.isValid() : 
-           try :
-             # constitution du bloc VERSION du fichier PHYS (existe toujours)
-             self.generBLOC_VERSION(obj)
-             # constitution du bloc MATERIALS du fichier PHYS (existe toujours)
-             self.generBLOC_MATERIALS()
-             # constitution du bloc SOURCES du fichier PHYS (existe toujours)
-             self.generBLOC_SOURCES()
-             
-           except ValueError, err:
-             raise ValueError(str(err))
-
-#      print "texte carmel3d :\n",self.texteCarmel3D
-#      print "dictMaterDielectric : ",self.dictMaterDielectric
-      if self.debug:
-         print "dictMaterDielectric : %s" % repr(self.dictMaterDielectric)
-         print "dictMaterConductor : %s" % repr(self.dictMaterConductor)
-      
-      return self.text
-
-
-
-
-#----------------------------------------------------------------------------------------
-# initialisations
-#----------------------------------------------------------------------------------------
-   
-   def initDico(self) :
-      self.texteCarmel3D=""
-      self.texteCarmel3D_PARAM=""
-      self.texteCarmel3D_PARAM_SOLV=""
-      self.texteCarmel3D_SH=""      
-      self.texteCarmel3D_INFC=""
-      self.texteCarmel3D_CMD=""
-      self.texteCarmel3D_INGEND1=""
-      self.texteCarmel3D_INGEND2=""
-      self.texteCarmel3D_INGEND3=""
-      self.texteCarmel3D_INPOST=""
-      self.debug = True # affichage de messages pour deboguage (.true.) ou non
-      self.dicoEtapeCourant=None
-      self.dicoMCFACTCourant=None
-      self.dicoCourant=None
-      self.dictGroupes = {'ordreMateriauxJdC':[], 'ordreSourcesJdC':[], 'ordreStrandJdC':[], 'ordreListeJdC':[], 'ordreDomaineJdC':[]} # association des noms de groupes de maillage avec les noms de materiaux ou de sources, en sauvegardant l'ordre du JdC en separant les groupes associes a des materiaux de ceux associes a des sources
-      self.dictMaterConductor={}
-      self.dictMaterDielectric={}
-      self.dictMaterZsurfacic={}
-      self.dictMaterEmIso={}
-      self.dictMaterEmAnIso={}
-      self.dictMaterNilmat={}
-      self.dictMaterZinsulator={}
-      self.dictSourceStInd={}
-      self.dictSourceEport={}
-      self.dictSourceHport={}
-      self.dictStrand={}
-      self.dictDomaine={}
-      self.dictPort={}
-      self.cutlineValeur=[]
-      self.cutplaneValeur=[]
-      self.visu3dValeur=[]
-      self.fieldmapValeur=[]
-      self.fielddumpValeur=[]
-      self.repertory=""
-      self.frequency=""
-      self.domaine=""
-      self.direction=""
-      self.section=""
-      self.forme=""
-      self.centre=""
-      self.echelle=""
-      self.visu=False
-      self.post_global=False
-      self.visu_format=""
-      self.visu_type=""
-      self.gendof=""
-      self.fcarmel=""
-      self.postprocess=""
-      self.formulation=""
-      # on force le probleme a etre frequentiel, seul possible en l'etat des choses
-      self.problem = HARMONIC
-      self.fichierMaillage = "" # chemin absolu ou relatif  du fichier contenant le maillage, défini dans PARAMETERS.Fichier_maillage.
-      self.nomFichierMaillage = "" # nom du fichier de maillage, sans le chemin
-      self.projet = "" # nom du projet, utilisé un peu partout, i.e., nom du fichier de maillage sans l'extension
-      self.materiauxGroupesTousHomogenes = True # Tous les groupes sont associés a priori à des matériaux tous homogènes mais pas forcément isotropes. On le vérifie ou modifie ci-dessous. 
-      self.materiauxGroupesTousIsotropes = True # Tous les groupes sont associés a priori à des matériaux tous isotropes mais pas forcément homogènes. On le vérifie ou modifie ci-dessous. 
-
-#----------------------------------------------------------------------------------------
-# ecriture
-#----------------------------------------------------------------------------------------
-
-   def writeDefault(self,fn) :
-        """Ecrit les fichiers de parametres et le fichier d'execution pour le code Carmel3D"""
-        
-        # fn est le chemin complet du fichier de l'étude, e.g., /home/toto/foo.comm
-        #file =  fn[:fn.rfind(".")]  # chemin complet du fichier de l'étude sans l'extension, e.g., /home/toto/foo
-        repertory=os.path.dirname(fn)  # répertoire de l'étude, e.g., /home/toto/
-        file = os.path.join(repertory, self.projet) # on crée le chemin complet des fichiers de configuration sans extension, à partir du nom du projet.
-        namefile=os.path.basename(file) # nom du projet e.g., foo
-            
-        
-        if self.debug: 
-            print "ecriture du fichier de parametres (PHYS)"
-        filePHYS = file + '.phys'
-        typeBloc = 'PHYS_FILES'
-        f = open( str(filePHYS), 'w')
-        f.write( self.texteCarmel3D)
-        f.close()
-        
-
-        if self.debug: 
-            print "ecriture du fichier de parametres (PARAM)"
-        filePARAM = file + '.param'
-        f = open( str(filePARAM), 'w')
-        f.write('[VERSION \n'
-                    '   NUM     1\n'
-                    '   FILETYPE PARAM\n]\n'
-                    '[PROBLEM\n'
-                    '   NAME HARMONIC\n]\n'
-                )                
-        typeBloc = 'CAR_FILES'
-        self.texteCarmel3D_PARAM+="["+typeBloc+"\n" # debut de bloc
-        self.texteCarmel3D_PARAM+="    NAME "+self.projet+".car"
-        self.texteCarmel3D_PARAM+="\n]\n" # fin de bloc
-        typeBloc = 'PHYS_FILES'
-        self.texteCarmel3D_PARAM+="["+typeBloc+"\n" # debut de bloc
-        self.texteCarmel3D_PARAM+="    NAME "+self.projet+".phys" 
-        self.texteCarmel3D_PARAM+="\n]\n" # fin de bloc
-        self.texteCarmel3D_PARAM+="[FREQUENCY\n"
-        self.texteCarmel3D_PARAM+="   SINGLE %g \n" % (self.frequency )
-        self.texteCarmel3D_PARAM+="] \n"
-        f.write( self.texteCarmel3D_PARAM)
-        f.write(self.texteCarmel3D_PARAM_SOLV)
-        f.close()
-        # ecriture du fichier de commandes du post-traitement (.cmd), à partir du texte self.textCarmel3D défini dans la routine generPOST_COMMANDS
-        if self.debug: 
-            print "ecriture du fichier de parametres (CMD)"
-        fileCMD =file + '.cmd'
-        f = open( str(fileCMD), 'w')
-        f.write(self.texteCarmel3D_CMD)
-        f.close()
-
-
-        if self.debug: 
-            print "ecriture du fichier de parametres (INGENDOF)"
-        fileINGEND = file + '.ingendof'
-        f = open(fileINGEND, 'w')
-        self.texteCarmel3D_INGEND1+=""+self.nomFichierMaillage # nom du fichier de maillage (chemin relatif)
-        
-        nomsGroupes = self.dictGroupes['ordreStrandJdC'][:] 
-        nomsGroupes.sort()
-
-        #if self.dictDomaine !={}:
-        try:
-            self.creaBLOC_STRANDED_INDUCTOR_GEOMETRY(nomsGroupes)
-        except ValueError, err:
-            raise ValueError(str(err))
-        if self.dictPort != {} :
-            self.creaBLOC_PORTS_GEOMETRY(nomsGroupes)
-        if self.formulation=="APHI": self.texteCarmel3D_INGEND3+="\n1"
-        if self.formulation=="TOMEGA": self.texteCarmel3D_INGEND3+="\n2"
-        f.write(self.texteCarmel3D_INGEND1)
-        f.write(self.texteCarmel3D_INGEND2)  
-        f.write(self.texteCarmel3D_INGEND3)
-        f.close()     
-
-        if self.debug: 
-            print "ecriture du fichier de parametres (INFCARMEL) "
-        fileINFC = file + '.infcarmel'
-        f = open(fileINFC, 'w')
-        self.texteCarmel3D_INFC+= self.projet+".param"
-        f.write(self.texteCarmel3D_INFC)
-        f.close()      
-        
-        if self.debug: 
-            print "ecriture du fichier de parametres (INPOSTPROCESS) "
-        fileINPOST = file + '.inpostprocess'
-        f = open(fileINPOST, 'w')
-        self.texteCarmel3D_INPOST+= self.projet+".param"
-        self.texteCarmel3D_INPOST+="\n"+self.projet+".xmat"
-        self.texteCarmel3D_INPOST+="\n"+self.projet+".cmd"
-        f.write(self.texteCarmel3D_INPOST)
-        f.close()            
-
-        print "dictionnaire complet=%s" %self.dictGroupes
-        print "dictionnaire des ports =%s"  %self.dictPort
-        if self.debug: 
-            print "ecriture du fichier d'execution (SH)"
-            print"LISTE DES DOMAINES=%s" %(self.dictGroupes['ordreDomaineJdC'])
-        RepCarmel= os.path.join(repertory,"lancer.sh")
-        f = open( str(RepCarmel), 'wb')
-        self.texteCarmel3D_SH+='cd ' + repertory + ' \n'
-        if self.gendof=="TRUE":
-            self.texteCarmel3D_SH+='echo "Debut execution gendof" \n'
-            if self.echelle=="Millimetre":
-                self.texteCarmel3D_SH+=self.repertory+"/gendof.exe -scale 0.001 < " + self.projet + ".ingendof\n"
-            else:
-                self.texteCarmel3D_SH+=self.repertory+"/gendof.exe < " + self.projet + ".ingendof\n"
-        if self.fcarmel=="TRUE": 
-            self.texteCarmel3D_SH+='echo "Debut execution fcarmel" \n'
-            self.texteCarmel3D_SH+=self.repertory+"/fcarmel.exe <  " + self.projet + ".infcarmel\n"
-        if self.postprocess=="TRUE":
-            self.texteCarmel3D_SH+= 'echo "Debut execution postprocess" \n'
-            self.texteCarmel3D_SH+= self.repertory+"/postprocess.exe < " + self.projet + ".inpostprocess\n"
-        f.write(self.texteCarmel3D_SH)
-        f.close()      
-        
-#----------------------------------------------------------------------------------------
-#  analyse de chaque noeud de l'arbre 
-#----------------------------------------------------------------------------------------
-
-   def generMCSIMP(self,obj) :
-        """recuperation de l objet MCSIMP"""
-        if self.debug: 
-            print "MCSIMP %(v_1)s  %(v_2)s" % {'v_1': obj.nom, "v_2": obj.valeur}
-        s=PythonGenerator.generMCSIMP(self,obj)
-        try:
-            self.dicoCourant[obj.nom]=obj.valeurFormatee
-        except:
-            print "Oubli des messages texte homo='information'"
-        return s
-
-  
-#----------------------------------------------------------------------------------------
-   def generMCFACT(self,obj) :
-        """recuperation de l objet MCFACT"""
-        if self.debug:
-            print "MCFACT debut %(v_1)s  %(v_2)s" % {'v_1': unicode(obj.nom), "v_2": unicode(obj.valeur)}
-        dico={}
-        self.dicoMCFACTCourant=dico
-        self.dicoCourant=self.dicoMCFACTCourant
-        s=PythonGenerator.generMCFACT(self,obj)
-        # sauvegarde, dans self.dicoEtapeCourant, de la valeur du FACT courant, pour utilisation ultérieure dans generETAPE et generPROC_ETAPE
-        # traitement des FACT CUTLINE et CUTPLANE multiples (max='**' dans le catalogue)
-        # Ce traitement spécial est nécessaire pour le moment car le générateur bogue sinon au niveau des matériaux (non-linéaires ?)
-        if obj.nom in ('FIELDDUMP','CUTLINE', 'CUTPLANE', 'FIELDMAP', 'VISU3D' ): 
-            # Remplissage se self.dicoEtapeCourant pour le nom du FACT courant
-            # Il ne contient qu'une seule valeur (un dictionnaire) par défaut lorsque le FACT est unique (max=1 dans le catalogue),
-            # mais il peut aussi contenir plusieurs valeurs (tableau) dans le cas contraire, e.g., max='**' dans le catalogue
-            if self.dicoEtapeCourant.has_key(obj.nom): # plusieurs valeurs
-                print "self.dicoEtapeCourant= %s"%self.dicoEtapeCourant
-                if type(self.dicoEtapeCourant[obj.nom]) == types.DictType: # une seule valeur entrée jusqu'à présent
-                    dicoMCFACTprecedent = self.dicoEtapeCourant[obj.nom] # sauvegarde de la valeur précédente
-                    print "dicoMCFACTpreceden= %s self.dicoEtapeCourant= %s"%(dicoMCFACTprecedent,self.dicoEtapeCourant) 
-                    self.dicoEtapeCourant[obj.nom] = [ dicoMCFACTprecedent, self.dicoMCFACTCourant ] # restructuration en liste et insertion de la valeur précédente et de la valeur courant
-                    print "self.dicoEtapeCourant[obj.nom]= %s"%self.dicoEtapeCourant[obj.nom]
-                else: # plusieurs valeurs entrées jusqu'à présent, sous la forme d'une liste de dictionnaires
-                    self.dicoEtapeCourant[obj.nom].append(self.dicoMCFACTCourant) # extension de la liste avec cette valeur, placée en dernier
-            else: # une seule valeur ou première valeur
-                self.dicoEtapeCourant[obj.nom]=self.dicoMCFACTCourant
-        else: # traitement usuel des FACT uniques, pour ignorer le bogue décrit plus haut
-            self.dicoEtapeCourant[obj.nom]=self.dicoMCFACTCourant
-        self.dicoMCFACTCourant=None
-        self.dicoCourant=self.dicoEtapeCourant
-        if self.debug:
-            print "MCFACT fin %(v_1)s  %(v_2)s" % {'v_1': unicode(obj.nom), "v_2": unicode(obj.valeur)}
-        return s
-
-
-#----------------------------------------------------------------------------------------
-   def generPROC_ETAPE(self,obj):
-        """analyse des PROC du catalogue  ( VERSION )"""
-        if self.debug: 
-            print "PROC_ETAPE initial: %(v_1)s  %(v_2)s" % {'v_1': unicode(obj.nom), "v_2": unicode(obj.valeur)}
-        dico={}
-        self.dicoEtapeCourant=dico
-        self.dicoCourant=self.dicoEtapeCourant
-        s=PythonGenerator.generPROC_ETAPE(self,obj)
-        obj.valeur=self.dicoEtapeCourant # on passe à obj la bonne structure générée par PythonGenerator.generPROC_ETAPE, pour le traitement de chaque partie ci-dessous
-        if self.debug: 
-            print "PROC_ETAPE mis a jour: %(v_1)s  %(v_2)s" % {'v_1': unicode(obj.nom), "v_2": unicode(obj.valeur)}
-        if obj.nom=="PARAMETERS" : self.generBLOC_PARAMETERS(obj)
-        if obj.nom=="SOLVEUR" : self.generSOLVEUR(obj)
-        if obj.nom=="POST_COMMANDS" : self.generPOST_COMMANDS(obj)
-        s=PythonGenerator.generPROC_ETAPE(self,obj) # obj.valeur a été modifiée pour le traitement ci-dessus, alors il faut tout remettre en ordre en appelant de nouveau PythonGenerator.generPROC_ETAPE
-        return s
-
-
-
-#----------------------------------------------------------------------------------------
-   def generETAPE(self,obj):
-        """analyse des OPER du catalogue"""
-        if self.debug: 
-            print "ETAPE mis a jour: obj.nom = %(v_1)s , obj.valeur= %(v_2)s" % {'v_1': obj.nom, 'v_2': obj.valeur}
-        dico={}
-        self.dicoEtapeCourant=dico
-        self.dicoCourant=self.dicoEtapeCourant
-        s=PythonGenerator.generETAPE(self,obj)
-        obj.valeur=self.dicoEtapeCourant # cf. generPROC_ETAPE
-        if self.debug: 
-            print "ETAPE mis a jour: obj.nom = %(v_1)s , obj.valeur= %(v_2)s" % {'v_1': obj.nom, 'v_2': obj.valeur}
-        if obj.nom=="MESHGROUP" : self.generMESHGROUP(obj)
-        if obj.nom=="MATERIAL" : self.generMATERIAL(obj)
-        if obj.nom=="SOURCE" : self.generSOURCE(obj)
-        if obj.nom=="STRANDED_INDUCTOR_GEOMETRY" : self.generSTRANDED_INDUCTOR_GEOMETRY(obj)
-        if obj.nom=="MACRO_GROUPE": self.generMACRO_GROUPE(obj)
-        s=PythonGenerator.generETAPE(self,obj) # cf. generPROC_ETAPE
-        return s
-
-#----------------------------------------------------------------------------------------
-   def generMACRO_ETAPE(self,obj):
-        dico={}
-        self.dicoEtapeCourant=dico
-        self.dicoCourant=self.dicoEtapeCourant
-        import generator
-        monGenerateur=generator.plugins[nomPlugin]()
-        jdc_aux_texte=monGenerateur.gener(obj.jdc_aux)
-        if self.debug: 
-            print "jdc_aux_texte : %s" % jdc_aux_texte
-
-        for cle in monGenerateur.dictMaterConductor:
-            self.dictMaterConductor[cle] = monGenerateur.dictMaterConductor[cle]
-        for cle in monGenerateur.dictMaterDielectric:
-            self.dictMaterDielectric[cle] = monGenerateur.dictMaterDielectric[cle]
-        for cle in monGenerateur.dictMaterZsurfacic:
-            self.dictMaterZsurfacic[cle] = monGenerateur.dictMaterZsurfacic[cle]
-        for cle in monGenerateur.dictMaterEmIso:
-            self.dictMaterEmIso[cle] = monGenerateur.dictMaterEmIso[cle]
-        for cle in monGenerateur.dictMaterEmAnIso:
-            self.dictMaterEmAnIso[cle] = monGenerateur.dictMaterEmAnIso[cle]
-        for cle in monGenerateur.dictMaterNilmat:
-            self.dictMaterNilMat[cle] = monGenerateur.dictMaterNilMat[cle]
-        for cle in monGenerateur.dictMaterZinsulator:
-            self.dictMaterZinsulator[cle] = monGenerateur.dictMaterZinsulator[cle]
-              
-        print "________FIN MACRO______________________________________"
-        s=PythonGenerator.generMACRO_ETAPE(self,obj)
-        return s
-
-#----------------------------------------------------------------------------------------
-#----------------------------------------------------------------------------------------
-   def generMESHGROUP(self,obj):
-        """preparation de la ligne NAME referencant le groupe de mailles 
-            associe le groupe de mailles au materiau ou a la source utilisateur
-            on sauvegarde aussi les noms des groupes de maillage
-        """
-        try:
-            if usePrefix:
-                nomGroupe = self.nomReelGroupe(obj.getSdname()) # nom du groupe de maillage, i.e. nom du concept, avec prefixes enleves
-                print "liste des noms sans prefixes %s" %(nomGroupe)
-            else:
-                nomGroupe = obj.getSdname() # nom du groupe de maillage, i.e. nom du concept
-                print "liste des noms sans prefixes %s" %(nomGroupe)
-
-            # test: un et un seul nom de materiau ou source doit etre associe a ce groupe de maillage, via les cles MATERIAL et SOURCE, respectivement.
-            # test sur un seul attribut, non pertinent car il peut y en avoir plusieurs.
-            #assert len(obj.valeur.keys())==1,"Un et un seul nom de materiau ou source doit etre associe a ce groupe du maillage :"+nomGroupe
-            #
-            # on utilise le fait que obj.valeur est un dictionnaire
-            self.dictGroupes[nomGroupe] = {}   
-#            nomGroupe={'SOURCE':[], 'MATERIAL':[], 'LISTE':[], 'STRAND':[], }   
-            if self.debug: 
-                print "obj.valeur.keys()= %s" % obj.valeur.keys()
-            if 'MATERIAL' in obj.valeur.keys() and 'SOURCE' in obj.valeur.keys(): # test d'erreur lors de presence de materiau et source a la fois
-                raise ValueError, nomGroupe + tr(" : ce groupe de maillage ne peut pas etre associe a un materiau et une source a la fois.")
-            # association a un materiau
-            if 'MATERIAL' in obj.valeur.keys():
-                self.dictGroupes[nomGroupe]['MATERIAL'] = obj.valeur['MATERIAL'].nom # sauvegarde de l'association entre ce groupe de maillage et un materiau ou source, par son nom, i.e. nom du concept du materiau ou de la source
-                self.dictGroupes['ordreMateriauxJdC'].append(nomGroupe) # sauvegarde du nom du groupe de maillage associe a un materiau, dans l'ordre du JdC
-            # association a une source
-            if 'SOURCE' in obj.valeur.keys():
-                self.dictGroupes[nomGroupe]['SOURCE'] = obj.valeur['SOURCE'].nom # sauvegarde de l'association entre ce groupe de maillage et un materiau ou source, par son nom, i.e. nom du concept du materiau ou de la source
-                self.dictGroupes['ordreSourcesJdC'].append(nomGroupe) # sauvegarde du nom du groupe de maillage associe a une source, dans l'ordre du JdC
-            # erreur ni materiau ni source associee
-            if 'STRANDED_INDUCTOR_GEOMETRY' in obj.valeur.keys():
-                    self.dictGroupes[nomGroupe]['STRAND'] = obj.valeur['STRANDED_INDUCTOR_GEOMETRY'].nom # sauvegarde de l'association entre ce groupe de maillage et un materiau ou source, par son nom, i.e. nom du concept du materiau ou de la source
-                    self.dictGroupes['ordreStrandJdC'].append(nomGroupe) # sauvegarde du nom du groupe de maillage associe a une source, dans l'ordre du JdC
-            if 'Domaine' in obj.valeur.keys():
-                self.dictGroupes[nomGroupe]['DOMAINE'] = obj.valeur['Domaine']
-                self.dictGroupes['ordreDomaineJdC'].append(nomGroupe)
-                texte=""
-                texte+="%s"%(obj.valeur['Domaine'])
-                print"le texte=%s" %(texte)
-                self.dictDomaine[obj.getSdname()]=texte  
-                print "liste des domaines =%s" %(self.dictGroupes[nomGroupe]['DOMAINE'])
-                    
-#            else:
-#                raise ValueError, tr("ce groupe de maillage %s n'est associe a aucun materiau, source ou stranded_inductor_geometry." % nomGroupe)
-            if self.debug:
-                print "self.dictGroupes= %s" % repr(self.dictGroupes)
-        except ValueError, err:
-            raise ValueError, str(err)
-            
-   def generMACRO_GROUPE(self, obj):
-        """preparation de la ligne NAME referencant le groupe de mailles 
-            associe le groupe de mailles au materiau ou a la source utilisateur
-            on sauvegarde aussi les noms des macros groupes
-        """
-        try:
-            #nomGroupe={'SOURCE':[], 'MATERIAL':[], 'LISTE':[], 'STRAND':[], }   
-            if usePrefix:
-                nomGroupe = self.nomReelGroupe(obj.getSdname()) # nom du groupe de maillage, i.e. nom du concept, avec prefixes enleves
-                print "liste des noms sans prefixes %s" %(nomGroupe)
-            else:
-                nomGroupe = obj.getSdname() # nom du macro groupe
-                print "liste des noms sans prefixes %s" %(nomGroupe)
-            self.dictGroupes[nomGroupe] = {}   
-                
-            # test: un et un seul nom de materiau ou source doit etre associe a ce groupe de maillage, via les cles MATERIAL et SOURCE, respectivement.
-            # test sur un seul attribut, non pertinent car il peut y en avoir plusieurs.
-            #assert len(obj.valeur.keys())==1,"Un et un seul nom de materiau ou source doit etre associe a ce groupe du maillage :"+nomGroupe
-            #
-            # on utilise le fait que obj.valeur est un dictionnaire
-            if self.debug: 
-                print "obj.valeur.keys()= %s" % obj.valeur.keys()
-            if 'MATERIAL' in obj.valeur.keys() and 'SOURCE' in obj.valeur.keys(): # test d'erreur lors de presence de materiau et source a la fois
-                raise ValueError, nomgroupe + tr(" : ce MACRO_GROUPE ne peut pas contenir a la fois un MATERIAL et une SOURCE.")
-            # association a une source
-            if 'SOURCE' in obj.valeur.keys():
-                self.dictGroupes[nomGroupe]['SOURCE'] = obj.valeur['SOURCE'].nom # sauvegarde de l'association entre ce macro groupe et un materiau ou source, par son nom, i.e. nom du concept du materiau ou de la source
-                self.dictGroupes['ordreSourcesJdC'].append(nomGroupe) # sauvegarde du nom du groupe de maillage associe a une source, dans l'ordre du JdC
-            # erreur ni materiau ni source associee
-            if 'LISTE_MESHGROUP' in obj.valeur.keys():
-                listeStrandedInductorGeometry = True # indicateur du fait que tous les groupes de la liste sont des inducteurs bobinés ou topologiques, en morceaux ou entier (True), ou non (False). Utilisé pour savoir si le Domaine est nécessaire ou non.
-                listeGroupesMauvaisFormat = obj.valeur['LISTE_MESHGROUP'] # sauvegarde de l'association entre ce macro groupe et un materiau ou source, par son nom, i.e. nom du concept du materiau ou de la source
-                self.dictGroupes[nomGroupe]['LISTE'] = [] # sauvegarde de l'association entre ce macro groupe et un materiau ou source, par son nom, i.e. nom du concept du materiau ou de la source
-                for groupe in listeGroupesMauvaisFormat: # sauvegarde de la liste au format correct
-                    groupe = groupe.replace("'", "") # suppression des guillement simpes
-                    groupe = groupe.replace('"', "") # suppression des guillement doubles
-                    self.dictGroupes[nomGroupe]['LISTE'].append(groupe) # sauvegarde du nom au formatage correct
-                    if not self.dictGroupes[groupe].has_key('STRAND'): listeStrandedInductorGeometry = False # au moins un groupe de la liste n'est pas un inducteur bobiné ou topologique (morceau ou entier).
-                self.dictGroupes['ordreListeJdC'].append(nomGroupe) # sauvegarde du nom du macro groupe associe a une source, dans l'ordre du JdC
-                if not listeStrandedInductorGeometry: # Erreur en cas de liste ne définissant pas que des inducteurs bobinés ou topologiques en morceaux
-                    raise ValueError, nomGroupe + tr(" : ce MACRO_GROUPE ne doit contenir, dans LISTE_MESHGROUP, que des morceaux d'inducteurs bobines ou topologiques.")
-                # test de présence du domaine pour les cas appropriés d'inducteur bobiné ou topologique en morceau.
-                if 'Domaine' in obj.valeur.keys():
-                    if listeStrandedInductorGeometry: # Domaine seulement  en cas de liste définissant des inducteurs bobinés ou topologiques en morceaux
-                        self.dictGroupes[nomGroupe]['DOMAINE'] = obj.valeur['Domaine']
-                        self.dictGroupes['ordreDomaineJdC'].append(nomGroupe)
-                        texte=""
-                        texte+="%s"%(obj.valeur['Domaine'])
-                        print"le texte=%s" %(texte)
-                        self.dictDomaine[obj.getSdname()]=texte                  
-                    else: # Erreur si Domaine et macro-groupe pas complètement inducteur
-                        raise ValueError, nomGroupe + tr(" : ce MACRO_GROUPE ne doit pas contenir de Domaine car il contient, dans LISTE_MESHGROUP, des groupes qui ne sont pas que des morceaux d'inducteurs bobines ou topologiques.")
-                else: # Domaine manquant
-                    if listeStrandedInductorGeometry: # Erreur en cas de liste définissant des inducteurs bobinés ou topologiques en morceaux
-                        raise ValueError, nomGroupe + tr(" : ce MACRO_GROUPE de morceaux d'inducteurs bobines ou topologiques doit contenir aussi un Domaine.")
-            else:
-                raise ValueError, nomGroupe + tr(" : ce MACRO_GROUPE doit contenir une liste de groupes LISTE_MESHGROUP.")
-            if self.debug:
-                print "self.dictGroupes= %s" % repr(self.dictGroupes)
-                print "self.dictDomaine=%s" %(self.dictDomaine)
-        except ValueError, err:
-            raise ValueError, str(err)
-
-
-   def generSOLVEUR(self, obj):
-        if self.debug:
-            print "generation material obj.valeur = %s" % obj.valeur
-        try :
-            nature = obj.valeur['Type']
-            if nature == "Solveur_lineaire" : self.generSOLVEUR_LINEAIRE(obj)
-        except ValueError,  err:
-            raise ValueError,  str(err)
-            
-   def generSOLVEUR_LINEAIRE(self, obj):
-        if self.debug:
-            print "generation material obj.valeur = %s" % obj.valeur    
-        try :
-            nature = obj.valeur['Methode_lineaire']
-            if nature =="Methode iterative BICGCR" : self.generMETHODE_ITERATIVE_BICGCR(obj)
-            if nature  =="Methode directe MUMPS" : self.generMETHODE_DIRECTE_MUMPS(obj)
-        except ValueError,  err:
-            raise ValueError,  str(err)
-            
-   def generMETHODE_ITERATIVE_BICGCR(self, obj):
-        texte=""
-        if self.debug:
-            print "_____________iter_____________"
-
-            self.texteCarmel3D_PARAM_SOLV+="[SOLVER \n"
-            self.texteCarmel3D_PARAM_SOLV+="    NAME BICGCR\n"      
-            self.texteCarmel3D_PARAM_SOLV+="    [ITERATIVE_PARAM \n"                         
-            self.texteCarmel3D_PARAM_SOLV+="        NITERMAX   "+str(obj.valeur["Nombre_iterations_max"])+"\n"
-            self.texteCarmel3D_PARAM_SOLV+="        EPSILON  "+str(obj.valeur["Precision"])+"\n"
-            self.texteCarmel3D_PARAM_SOLV+="    ]\n] \n"
-        if self.debug: 
-           print "texte = %s", texte
-
-       
-   def generMETHODE_DIRECTE_MUMPS(self, obj):
-        texte=""
-        if self.debug:
-            print "_____________directe_____________"
-
-            self.texteCarmel3D_PARAM_SOLV+="[SOLVER \n"
-            self.texteCarmel3D_PARAM_SOLV+="    NAME MUMPS\n"              
-            self.texteCarmel3D_PARAM_SOLV+="    [MUMPS_PARAMETER \n"
-            self.texteCarmel3D_PARAM_SOLV+="         SYM   "+str(obj.valeur["Type_de_matrice"])+"\n"
-            self.texteCarmel3D_PARAM_SOLV+="       ICNTL   "+str(obj.valeur["ICNTL_Control_Parameters"])+"     "+str(obj.valeur["CNTL_Control_Parameters"])+"\n"
-            self.texteCarmel3D_PARAM_SOLV+="    ]\n] \n"
-        if self.debug: 
-           print "texte = %s", texte
-        
-             
-
-   def generMATERIAL(self,obj):
-        """preparation du bloc correspondant a un materiau du fichier PHYS"""
-        texte=""
-        if self.debug: 
-            print "generation material obj.valeur = %s" % obj.valeur
-        try :
-            nature = obj.valeur['TYPE'] # la nature est le parametre TYPE du MATERIAL
-            if nature=="CONDUCTOR" : self.generMATERIAL_CONDUCTOR(obj)
-            if nature=="DIELECTRIC" : self.generMATERIAL_DIELECTRIC(obj)
-            if nature=="ZSURFACIC" : self.generMATERIAL_ZSURFACIC(obj)
-            if nature=="EM_ISOTROPIC" : self.generMATERIAL_EMISO(obj)
-            if nature=="EM_ANISOTROPIC" : self.generMATERIAL_EMANISO(obj)
-            if nature=="NILMAT" : self.generMATERIAL_NILMAT(obj)
-            if nature=="ZINSULATOR" : self.generMATERIAL_ZINSULATOR(obj)
-        except ValueError, err:
-            raise ValueError, str(err)
-
-   def generMATERIAL_CONDUCTOR(self,obj):
-       """preparation du sous bloc CONDUCTOR"""
-       texte=""
-       if self.debug: 
-           print "_____________cond_____________"
-       # verification des proprietes du sous bloc CONDUCTOR (PERMEABILITY, CONDUCTIVITY)
-       if 'PERMEABILITY' not in obj.valeur or 'CONDUCTIVITY' not in obj.valeur:
-            print "ERREUR! Le matériau conducteur (CONDUCTOR) de nom %s doit contenir les propriétés PERMEABILITY et CONDUCTIVITY." % obj.getSdname()
-            raise ValueError,  obj.getSdname() + tr(" : ce materiau conducteur (CONDUCTOR) doit contenir les proprietes PERMEABILITY et CONDUCTIVITY.")
-       else:
-          # parcours des proprietes du sous bloc CONDUCTOR (PERMEABILITY, CONDUCTIVITY)
-          for keyN1 in ('PERMEABILITY','CONDUCTIVITY') :
-             # debut du sous bloc de propriete du DIELECTRIC
-             texte+="         ["+keyN1+"\n"
-             texte+="            HOMOGENEOUS "+str(obj.valeur[keyN1]["HOMOGENEOUS"])+"\n"
-             texte+="            ISOTROPIC "+str(obj.valeur[keyN1]["ISOTROPIC"])+"\n"
-             # Ecriture des valeurs seulement pour un materiau homogene et isotrope,
-             # car sinon ces valeurs sont definies dans des fichiers annexes
-             homogeneous = str(obj.valeur[keyN1]["HOMOGENEOUS"]) == 'TRUE'
-             isotropic = str(obj.valeur[keyN1]["ISOTROPIC"]) == 'TRUE'
-             if homogeneous and isotropic:
-                # loi (lineaire ou non)
-                texte+="            LAW "+str(obj.valeur[keyN1]["LAW"])+"\n"
-                # valeur de la loi lineaire
-                texte+="            VALUE "+self.formateCOMPLEX(obj.valeur[keyN1]["VALUE"])+"\n"
-                # loi non lineaire de nature spline, Marrocco ou Marrocco et Saturation
-                #  seuls les reels sont pris en compte
-                if obj.valeur[keyN1]['LAW']=='NONLINEAR' :
-                   texte+="            [NONLINEAR \n"
-                   texte+="                ISOTROPY TRUE\n"
-                   texte+="                NATURE "+str(obj.valeur[keyN1]['NATURE'])+"\n"
-                   # ajout des autres parametres autres que ISOTROPY, NATURE, VALUE, LAW, HOMOGENEOUS, ISOTROPIC
-                   for keyN2 in obj.valeur[keyN1] :
-                      if keyN2 not in ('ISOTROPY','NATURE','VALUE','LAW','HOMOGENEOUS','ISOTROPIC') :
-                          texte+="                "+keyN2+" "+str(obj.valeur[keyN1][keyN2])+"\n"
-                   # fin du sous-bloc NONLINEAR
-                   texte+="            ]"+"\n"
-             # fin du sous bloc de propriete
-             texte+="         ]"+"\n"
-       if self.debug: 
-           print "texte = %s", texte
-       self.dictMaterConductor[obj.getSdname()]={'texte':  texte,  'valeur': obj.valeur} # sauvegarde du texte pour ce bloc, ainsi que de toutes les valeurs pour analyse ultérieure
-
-   def generMATERIAL_DIELECTRIC(self,obj):
-        """preparation du sous bloc DIELECTRIC"""
-        texte=""
-        if self.debug: 
-           print "______________nocond_____________"
-           # verification des proprietes du sous bloc DIELECTRIC (PERMEABILITY, PERMITTIVITY)
-        if 'PERMITTIVITY' not in obj.valeur:
-            print "obj.valeur=%s" %obj.valeur
-            obj.valeur["PERMITTIVITY"]={'HOMOGENEOUS': 'TRUE', 'LAW': 'LINEAR', 'ISOTROPIC': 'TRUE', 'VALUE': 1}
-    
-        # parcours des proprietes du sous bloc DIELECTRIC (PERMEABILITY, PERMITTIVITY)
-        for keyN1 in ('PERMEABILITY','PERMITTIVITY') :
-         # debut du sous bloc de propriete du DIELECTRIC
-         texte+="         ["+keyN1+"\n"
-         texte+="            HOMOGENEOUS "+str(obj.valeur[keyN1]["HOMOGENEOUS"])+"\n"
-         texte+="            ISOTROPIC "+str(obj.valeur[keyN1]["ISOTROPIC"])+"\n"
-         # Ecriture des valeurs seulement pour un materiau homogene et isotrope,
-         # car sinon ces valeurs sont definies dans des fichiers annexes
-         homogeneous = str(obj.valeur[keyN1]["HOMOGENEOUS"]) == 'TRUE'
-         isotropic = str(obj.valeur[keyN1]["ISOTROPIC"]) == 'TRUE'
-         if homogeneous and isotropic:
-            # loi (lineaire ou non)
-            texte+="            LAW "+str(obj.valeur[keyN1]["LAW"])+"\n"
-            # valeur de la loi lineaire
-            texte+="            VALUE "+self.formateCOMPLEX(obj.valeur[keyN1]["VALUE"])+"\n"   
-            # loi non lineaire de nature spline, Marrocco ou Marrocco et Saturation
-            #  seuls les reels sont pris en compte
-            if obj.valeur[keyN1]['LAW']=='NONLINEAR' :
-               texte+="            [NONLINEAR \n"
-               texte+="                ISOTROPY TRUE\n"
-               texte+="                NATURE "+str(obj.valeur[keyN1]['NATURE'])+"\n"
-               # ajout des autres parametres autres que ISOTROPY, NATURE, VALUE, LAW, HOMOGENEOUS, ISOTROPIC
-               for keyN2 in obj.valeur[keyN1] :
-                  if keyN2 not in ('ISOTROPY','NATURE','VALUE','LAW','HOMOGENEOUS','ISOTROPIC') :
-                      texte+="                "+keyN2+" "+str(obj.valeur[keyN1][keyN2])+"\n"
-               # fin du sous-bloc NONLINEAR
-               texte+="            ]"+"\n"
-         # fin du sous bloc de propriete
-         texte+="         ]"+"\n"
-        if self.debug: 
-           print "texte = %s" % texte
-        self.dictMaterDielectric[obj.getSdname()]={'texte':  texte,  'valeur': obj.valeur} # sauvegarde du texte pour ce bloc, ainsi que de toutes les valeurs pour analyse ultérieure
-
-   def generMATERIAL_ZSURFACIC(self,obj):
-       """preparation du sous bloc ZSURFACIC"""
-       texte=""
-       if self.debug: 
-           print "______________zsurf_____________"
-       # verification des proprietes du sous bloc ZSURFACIC (PERMEABILITY, CONDUCTIVITY)
-       if 'PERMEABILITY' not in obj.valeur or 'CONDUCTIVITY' not in obj.valeur:
-            print "ERREUR! Le matériau impedance de surface (ZSURFACIC) de nom %s doit contenir les propriétés PERMEABILITY et CONDUCTIVITY." % obj.getSdname()
-            raise ValueError, obj.getSdname() + tr(" : ce materiau impedance de surface (ZSURFACIC) doit contenir les proprietes PERMEABILITY et CONDUCTIVITY.")
-       else:
-          # parcours des proprietes du sous bloc ZSURFACIC (PERMEABILITY, CONDUCTIVITY)
-          for keyN1 in obj.valeur :
-             if keyN1=='TYPE': continue
-             # print "type loi = ", obj.valeur[keyN1]['LAW']
-             # debut du sous bloc de propriete du DIELECTRIC
-             texte+="         ["+keyN1+"\n"
-             texte+="            HOMOGENEOUS "+str(obj.valeur[keyN1]["HOMOGENEOUS"])+"\n"
-             texte+="            ISOTROPIC "+str(obj.valeur[keyN1]["ISOTROPIC"])+"\n"
-             # Ecriture des valeurs seulement pour un materiau homogene et isotrope,
-             # car sinon ces valeurs sont definies dans des fichiers annexes
-             homogeneous = str(obj.valeur[keyN1]["HOMOGENEOUS"]) == 'TRUE'
-             isotropic = str(obj.valeur[keyN1]["ISOTROPIC"]) == 'TRUE'
-             if homogeneous and isotropic:
-                # loi (lineaire ou non)
-                texte+="            LAW "+str(obj.valeur[keyN1]["LAW"])+"\n"
-                # valeur de la loi lineaire
-                texte+="            VALUE "+self.formateCOMPLEX(obj.valeur[keyN1]["VALUE"])+"\n"
-             # fin du sous bloc de propriete
-             texte+="         ]"+"\n"
-       if self.debug: 
-           print "texte = %s", texte
-       self.dictMaterZsurfacic[obj.getSdname()]=texte # sauvegarde du texte pour ce bloc
-
-   def generMATERIAL_EMISO(self,obj):
-       """preparation du sous bloc EM_ISOTROPIC_FILES.
-       Les fichiers sont indiques par le chemin absolu, i.e. le nom complet du JdC,
-        ce qui permet de deplacer les dossiers contenant le modele complet puisque le JdC permet les chemins relatifs.
-       """
-       if "CONDUCTIVITY_File" in obj.valeur:
-            texte ="        CONDUCTIVITY MED "+str(obj.valeur["CONDUCTIVITY_File"])+"\n"
-       if "PERMEABILITY_File" in obj.valeur:
-            texte+="        PERMEABILITY MED "+str(obj.valeur["PERMEABILITY_File"])+"\n"
-       # Possibilite de forcer le chemin relatif (nom de fichier seulement) plutot que le chemin absolu par defaut
-       #from os.path import basename
-       #texte ="        CONDUCTIVITY MED "+basename(str(obj.valeur["CONDUCTIVITY_File"]))+"\n"
-       #texte+="        PERMEABILITY MED "+basename(str(obj.valeur["PERMEABILITY_File"]))+"\n"
-       #      print "obj get sdname= ", obj.getSdname()
-       #   if obj.getSdname() in self.dictMaterEmIso.keys() :
-       #    self.dictMaterEmIso[obj.getSdname()].append(texte) 
-       # else :
-       self.dictMaterEmIso[obj.getSdname()]=texte
-  
-   def generMATERIAL_EMANISO(self,obj):
-        """preparation du sous bloc EM_ANISOTROPIC_FILES.
-        Les fichiers sont indiques par le chemin absolu, i.e. le nom complet du JdC,
-            ce qui permet de deplacer les dossiers contenant le modele complet puisque le JdC permet les chemins relatifs.
-        """
-        if "CONDUCTIVITY_File" in obj.valeur: 
-            texte ="        CONDUCTIVITY MATER "+str(obj.valeur["CONDUCTIVITY_File"])+"\n"
-        if "PERMEABILITY_File" in obj.valeur:
-            texte+="        PERMEABILITY MATER "+str(obj.valeur["PERMEABILITY_File"])+"\n"
-       #  print "obj get sdname= ", obj.getSdname()
-       #  if obj.getSdname() in self.dictMaterEmAnIso.keys() :
-       #    self.dictMaterEmAnIso[obj.getSdname()].append(texte) 
-       #  else :
-        self.dictMaterEmAnIso[obj.getSdname()]=texte
-   
-   def generMATERIAL_NILMAT(self,obj):
-       """preparation du sous bloc NILMAT"""
-       texte=""
-       self.dictMaterNilmat[obj.getSdname()]=texte
-   
-   def generMATERIAL_ZINSULATOR(self,obj):
-       """"preparation du sous bloc ZINSULATOR"""
-       texte=""
-       self.dictMaterZinsulator[obj.getSdname()]=texte
-
-#-------------------------------------------------------------------
-
-   def generSOURCE(self,obj):
-        """preparation du bloc correspondant a une source du fichier PHYS"""
-        if self.debug: 
-            print "generation source obj valeur = %s" % obj.valeur
-        texte=""
-        try :
-            # test de la presence des types de sources reconnus
-            # commes ces sources sont des mot-cles facteurs, i.e. une cle de dictionnaire,
-            # la source ne peut contenir au plus qu'un type de source.
-            if "STRANDED_INDUCTOR" in obj.valeur:
-               self.generSOURCE_STRANDED_INDUCTOR(obj)
-            elif "HPORT" in obj.valeur:
-               self.generSOURCE_HPORT(obj)
-            elif "EPORT" in obj.valeur:
-               self.generSOURCE_EPORT(obj)
-            else:
-               print "ERREUR! Une source du type STRANDED_INDUCTOR, HPORT ou EPORT est attendue."
-        except ValueError, err:
-            raise ValueError, str(err)
-
-   def generSOURCE_STRANDED_INDUCTOR(self,obj):
-        """preparation du sous bloc STRANDED_INDUCTOR"""
-        texte=""
-        sdict = obj.valeur['STRANDED_INDUCTOR'] # dictionnaire contenant les parametres de la source, outre la forme de la source
-        try :
-            texte+="        NTURNS %s\n" % str(sdict['NTURNS'])  
-            self.nturns=sdict['NTURNS']
-            # test de la presence d'une forme de source reconnue
-            # commes ces formes sont des mot-cles facteurs, i.e. une cle de dictionnaire,
-            # la source ne peut contenir au plus qu'un type de source.
-            if "WAVEFORM_CONSTANT" in obj.valeur:
-               wdict = obj.valeur['WAVEFORM_CONSTANT'] # dictionnaire contenant les parametres de la forme de la source
-               if self.problem == HARMONIC:
-                  texte+="        CURJ POLAR %s 0\n" % str(wdict['AMPLITUDE'])
-            elif "WAVEFORM_SINUS" in obj.valeur:
-               wdict = obj.valeur['WAVEFORM_SINUS'] # dictionnaire contenant les parametres de la forme de la source
-               if self.problem == HARMONIC:
-                  texte+="        CURJ POLAR %(ampli)s %(phase)s\n" \
-                         % {'ampli': str(wdict['AMPLITUDE']), 'phase': str(wdict['PHASE'])}
-            self.dictSourceStInd[obj.getSdname()]=texte
-            if self.debug: 
-                print texte
-        except ValueError, err:
-            raise ValueError, str(err)
-
-   def generSOURCE_HPORT(self,obj):
-        """preparation du sous bloc HPORT"""
-        texte=""
-        sdict = obj.valeur['HPORT'] # dictionnaire contenant les parametres de la source, outre la forme de la source
-        nomPort = obj.getSdname()
-        self.dictPort[nomPort] = {} 
-        self.dictPort[nomPort]['HPORT']=str(sdict['TYPE'])
-        try :
-            texte+="        TYPE %s\n" % str(sdict['TYPE'])
-            # test de la presence d'une forme de source reconnue
-            # commes ces formes sont des mot-cles facteurs, i.e. une cle de dictionnaire,
-            # la source ne peut contenir au plus qu'un type de source.
-            if "WAVEFORM_CONSTANT" in obj.valeur:
-               wdict = obj.valeur['WAVEFORM_CONSTANT'] # dictionnaire contenant les parametres de la forme de la source
-               if self.problem == HARMONIC:
-                  texte+="        AMP POLAR %s 0\n" % str(wdict['AMPLITUDE'])
-            elif "WAVEFORM_SINUS" in obj.valeur:
-               wdict = obj.valeur['WAVEFORM_SINUS'] # dictionnaire contenant les parametres de la forme de la source
-               if self.problem == HARMONIC:
-                  texte+="        AMP POLAR %(ampli)s %(phase)s\n" \
-                         % {'ampli': str(wdict['AMPLITUDE']), 'phase': str(wdict['PHASE'])}
-            self.dictSourceHport[obj.getSdname()]=texte
-            if self.debug: 
-                print texte
-        except ValueError, err:
-            raise ValueError, str(err)
-
-   def generSOURCE_EPORT(self,obj):
-       
-
-        """preparation du sous bloc EPORT"""
-        texte=""
-        sdict = obj.valeur['EPORT'] # dictionnaire contenant les parametres de la source, outre la forme de la source
-        nomPort = obj.getSdname()
-        self.dictPort[nomPort] = {} 
-        self.dictPort[nomPort]['EPORT']=str(sdict['TYPE'])
-        print "sdict=%s" %(sdict)
-        try :
-            texte+="        TYPE %s\n" % str(sdict['TYPE'])
-            # test de la presence d'une forme de source reconnue
-            # commes ces formes sont des mot-cles facteurs, i.e. une cle de dictionnaire,
-            # la source ne peut contenir au plus qu'un type de source.
-            if "WAVEFORM_CONSTANT" in obj.valeur:
-               wdict = obj.valeur['WAVEFORM_CONSTANT'] # dictionnaire contenant les parametres de la forme de la source
-               if self.problem == HARMONIC:
-                  texte+="        AMP POLAR %s 0\n" % str(wdict['AMPLITUDE'])
-            elif "WAVEFORM_SINUS" in obj.valeur:
-               wdict = obj.valeur['WAVEFORM_SINUS'] # dictionnaire contenant les parametres de la forme de la source
-               if self.problem == HARMONIC:
-                  texte+="        AMP POLAR %(ampli)s %(phase)s\n" \
-                         % {'ampli': str(wdict['AMPLITUDE']), 'phase': str(wdict['PHASE'])}
-            self.dictSourceEport[obj.getSdname()]=texte
-            if self.debug: 
-                print texte
-        except ValueError, err:
-            raise ValueError, str(err)
-    
-#      
-   def generPARAM_CIRCULAIRE(self, obj):
-        if self.debug: 
-            print "generation stranded inductor geometry obj.valeur = %s" % obj.valeur     
-        self.centre=obj.valeur["Centre"]  
-          
-   def generPOST_COMMANDS(self, obj):
-        """Création du texte de commandes de post-traitement toto.cmd"""
-        if self.debug: 
-            print "generation POST_COMMANDS obj.valeur = %s" % obj.valeur     
-            
-        if obj.valeur.has_key('GLOBAL'):
-            self.texteCarmel3D_CMD+="[\nGLOBAL\n]\n"
-            
-        if obj.valeur.has_key('DUMP'):
-            champsFieldkind={'total':'TOTAL', 'reaction':'REACTION', 'diffracted':'DIFFRACTED'}
-            self.texteCarmel3D_CMD+="[\nDUMP"
-            self.texteCarmel3D_CMD+="\n"+self.projet +  '_postgroups.txt'
-            self.texteCarmel3D_CMD+="\n"+champsFieldkind[obj.valeur["DUMP"]["fieldkind"]]+"\n]\n"
-            
-        if obj.valeur.has_key('FIELDDUMP'):
-            champs = {'T':'TFIELD','H':'HFIELD', 'B':'BFIELD', 'J':'JFIELD', 'E':'EFIELD', 'pertesJoule':'OHMLOSS_DENSITY', 'champSource':'SOURCEFIELD', 'A':'AFIELD', 'Phi':'PHIFIELD', 'Omega':'OMEGAFIELD'}
-            champsFieldkind={'total':'TOTAL', 'reaction':'REACTION', 'diffracted':'DIFFRACTED'}
-            self.texteCarmel3D_CMD+="[\nFIELDDUMP"
-            if type(obj.valeur["FIELDDUMP"]) == types.DictType: # correspondance sur une 'Fielddump'
-                self.fielddumpValeur.append(obj.valeur["FIELDDUMP"]) 
-            else:
-                self.fielddumpValeur=obj.valeur["FIELDDUMP"] # correspondance sur plusieurs 'Fielddump'
-            for indexFielddump in self.fielddumpValeur:
-                self.texteCarmel3D_CMD+="\n  [\n" +"   "+ champs[indexFielddump["field"]]
-                self.texteCarmel3D_CMD+="\n" + "   " + champsFieldkind[indexFielddump["fieldkind"]] + "\n  ]"
-            self.texteCarmel3D_CMD+="\n]\n"    
-            
-        
-        if obj.valeur.has_key('VISU'):
-            self.texteCarmel3D_CMD+="[\nVISU"
-            # test de fichier de maillage bien lu
-            if self.fichierMaillage == "":  raise ValueError, tr("Le fichier de maillage n'existe pas. Le bloc PARAMETERS doit etre defini au-dessus du bloc POST_COMMANDS.")
-            self.texteCarmel3D_CMD+="\n"+self.projet+"\n"
-            self.texteCarmel3D_CMD+=obj.valeur["VISU"]["visu_format"]+"\n"
-            self.texteCarmel3D_CMD+=obj.valeur["VISU"]["visu_type"]+"\n]\n"
-    
-        if obj.valeur.has_key('VISU3D'):
-            champsField = {'T':'TFIELD','H':'HFIELD', 'B':'BFIELD', 'J':'JFIELD', 'E':'EFIELD', 'pertesJoule':'OHMLOSS_DENSITY', 'champSource':'SOURCEFIELD', 'A':'AFIELD', 'Phi':'PHIFIELD', 'Omega':'OMEGAFIELD'} # correspondance sur le nom du champ entre le catalogue (clé) et le fichier de configuration de Code_Carmel3D (valeur)
-            champsFieldkind={'total':'TOTAL', 'reaction':'REACTION', 'diffracted':'DIFFRACTED'}
-            if type(obj.valeur["VISU3D"])==types.DictType:  # correspondance sur une 'VISU3D'
-                self.visu3dValeur.append(obj.valeur["VISU3D"])
-            else:
-                self.visu3dValeur=obj.valeur["VISU3D"] # correspondance sur plusieurs 'VISU3D'
-            self.texteCarmel3D_CMD+="[\nVISU3D"
-            if self.fichierMaillage == "":  raise ValueError, tr("Le fichier de maillage n'existe pas. Le bloc PARAMETERS doit etre defini au-dessus du bloc POST_COMMANDS.")
-            self.texteCarmel3D_CMD+="\n"+ self.projet
-            self.texteCarmel3D_CMD+="\n" + self.visu3dValeur[0]["visu_format"]
-            for indexVisu3d in self.visu3dValeur:
-                if indexVisu3d["visu_format"]!=self.visu3dValeur[0]["visu_format"]:
-                    print "ERREUR! Dans les multiples VISU3D du bloc POST_COMMANDS, le parametre visu_format doit prendre la meme valeur."
-                    raise ValueError, tr("Dans les multiples VISU3D du bloc POST_COMMANDS, le parametre visu_format doit prendre la meme valeur.")
-                self.texteCarmel3D_CMD+="\n   [\n   " + champsField[indexVisu3d["field"]]
-                self.texteCarmel3D_CMD+="\n   "+ champsFieldkind[indexVisu3d["fieldkind"]]
-                self.texteCarmel3D_CMD+="\n   "+ indexVisu3d["visu_type"]+"\n   ]"
-            self.texteCarmel3D_CMD+="\n]\n" 
-            
-        if obj.valeur.has_key('ASTER_RMS_LOSSES'):
-              self.texteCarmel3D_CMD+="[\nASTER_RMS_LOSSES"  
-              if self.fichierMaillage == "":  raise ValueError, tr("Le fichier de maillage n'existe pas. Le bloc PARAMETERS doit etre defini au-dessus du bloc POST_COMMANDS.")
-              self.texteCarmel3D_CMD+="\n"+self.projet+"\n"  
-              self.texteCarmel3D_CMD+= obj.valeur["ASTER_RMS_LOSSES"]["rms_losses_format"] +"\n]\n"
-              
-        if obj.valeur.has_key('CUTLINE'):
-            # création du champ, renommé par rapport à l'interface
-            champsField = {'H':'HFIELD', 'B':'BFIELD', 'J':'JFIELD', 'E':'EFIELD', 'pertesJoule':'OHMLOSS_DENSITY', 'champSource':'SOURCEFIELD', 'A':'AFIELD', 'Phi':'PHIFIELD', 'Omega':'OMEGAFIELD', 'T':'TFIELD'} # correspondance sur le nom du champ entre le catalogue (clé) et le fichier de configuration de Code_Carmel3D (valeur)
-            champsFieldkind={'total':'TOTAL', 'reaction':'REACTION', 'diffracted':'DIFFRACTED'}
-            champsOutput={'xgraphic':'XGRAPHIC', 'gnuplot':'GNUPLOT', 'gmsh':'GMSH'}
-            champsLissage={'aucun':'NONE', 'un seul point par element':'1PTELT'}
-            if type(obj.valeur["CUTLINE"]) == types.DictType: # correspondance sur une 'Cutline'
-                self.cutlineValeur.append(obj.valeur["CUTLINE"])  # transfert d'une dictionnaire à une liste
-            else:
-                self.cutlineValeur=obj.valeur["CUTLINE"] # correspondance sur plusieurs 'Cutline'
-            for indexCutline in self.cutlineValeur: 
-                self.texteCarmel3D_CMD+="[\nCUTLINE"
-                self.texteCarmel3D_CMD+="\n%s" % ' '.join(map(str,indexCutline["first_point"]), )
-                self.texteCarmel3D_CMD+="\n%s" % ' '.join(map(str,indexCutline["last_point"]), )
-                self.texteCarmel3D_CMD+="\n%d" % (indexCutline["number_of_points"], )
-                self.texteCarmel3D_CMD+="\n" +indexCutline["name"]
-                self.texteCarmel3D_CMD+="\n" + champsField[indexCutline["field"]]
-                if indexCutline.has_key('fieldkind'):
-                    self.texteCarmel3D_CMD+="\nFIELDKIND " + champsFieldkind[indexCutline["fieldkind"]]
-                if indexCutline.has_key('output'):
-                    self.texteCarmel3D_CMD+="\nOUTPUT " +champsOutput[indexCutline["output"]]
-                if indexCutline.has_key('lissage'):
-                    self.texteCarmel3D_CMD+="\nSMOOTHLEVEL " +champsLissage[indexCutline["lissage"]]
-                self.texteCarmel3D_CMD+="\n]\n"
-                
-        if obj.valeur.has_key('CUTPLANE'):
-            champs = {'T':'TFIELD','H':'HFIELD', 'B':'BFIELD', 'J':'JFIELD', 'E':'EFIELD','pertesJoule':'OHMLOSS_DENSITY', 'champSource':'SOURCEFIELD', 'A':'AFIELD', 'Phi':'PHIFIELD', 'Omega':'OMEGAFIELD'} # correspondance sur le nom du champ entre le catalogue (clé) et le fichier de configuration de Code_Carmel3D (valeur)
-            champsFieldkind= {'total':'TOTAL', 'reaction':'REACTION', 'diffracted':'DIFFRACTED'}
-            champsOutput={'xgraphic':'XGRAPHIC', 'gnuplot':'GNUPLOT', 'gmsh':'GMSH'}
-            champsLissage={'aucun':'NONE', 'un seul point par element':'1PTELT'}
-            axes = {'Ox':1, 'Oy':2, 'Oz':3} # correspondance de l'axe normal entre le catalogue (clé) et le fichier de configuration Code_Carmel3D (valeur)
-            if type(obj.valeur["CUTPLANE"]) == types.DictType:
-                self.cutplaneValeur.append(obj.valeur["CUTPLANE"]) # correspondance sur une 'Cutplane'
-            else:
-                self.cutplaneValeur=obj.valeur["CUTPLANE"] # correspondance sur plusieurs 'Cutplane'
-            for indexCutplane in self.cutplaneValeur:
-                self.texteCarmel3D_CMD+="[\nCUTPLANE" 
-                self.texteCarmel3D_CMD+="\n%d" % (axes[indexCutplane["normal_vector"]], )
-                self.texteCarmel3D_CMD+="\n%f" % (indexCutplane["plane_position"], )
-                self.texteCarmel3D_CMD+="\n%s" % ' '.join(map(str,indexCutplane["number_of_points"]))
-                self.texteCarmel3D_CMD+="\n" + indexCutplane["name"]
-                self.texteCarmel3D_CMD+="\n" + champs[indexCutplane["field"]]
-                if indexCutplane.has_key('fieldkind'):
-                    self.texteCarmel3D_CMD+="\nFIELDKIND " + champsFieldkind[indexCutplane["fieldkind"]]
-                if indexCutplane.has_key('output'):
-                    self.texteCarmel3D_CMD+="\nOUTPUT " +champsOutput[indexCutplane["output"]]
-                if indexCutplane.has_key('lissage'):
-                    self.texteCarmel3D_CMD+="\nSMOOTHLEVEL " +champsLissage[indexCutplane["lissage"]]
-                self.texteCarmel3D_CMD+="\n]\n"
-                
-        if obj.valeur.has_key('FIELDMAP'):
-            champs = {'T':'TFIELD','H':'HFIELD', 'B':'BFIELD', 'J':'JFIELD', 'E':'EFIELD','pertesJoule':'OHMLOSS_DENSITY', 'champSource':'SOURCEFIELD', 'A':'AFIELD', 'Phi':'PHIFIELD', 'Omega':'OMEGAFIELD'} # correspondance sur le nom du champ entre le catalogue (clé) et le fichier de configuration de Code_Carmel3D (valeur)
-            champsFieldkind= {'total':'TOTAL', 'reaction':'REACTION', 'diffracted':'DIFFRACTED'}
-            champsOutput={'xgraphic':'XGRAPHIC', 'gnuplot':'GNUPLOT', 'gmsh':'GMSH'}
-            champsFieldmap_type={'equation':'EQUATION', 'fichier':'FILE'}
-            champsType={'plane':'PLANE', 'line':'LINE'}
-            axes = {'Ox':1, 'Oy':2, 'Oz':3} # correspondance de l'axe normal entre le catalogue (clé) et le fichier de configuration Code_Carmel3D (valeur)
-            if type(obj.valeur["FIELDMAP"]) == types.DictType: 
-                self.fieldmapValeur.append(obj.valeur["FIELDMAP"]) # correspondance sur une 'Fieldmap'
-            else:
-                self.fieldmapValeur=obj.valeur["FIELDMAP"]# correspondance sur plusieurs 'Fieldmap'
-            for indexFieldmap in self.fieldmapValeur:
-                self.texteCarmel3D_CMD+="[\nFIELDMAP"
-                self.texteCarmel3D_CMD+="\n" + champsFieldmap_type[indexFieldmap["fieldmap_type"]]
-                if indexFieldmap["fieldmap_type"]=="equation":
-                    self.texteCarmel3D_CMD+="\n" + champsType[indexFieldmap["type"]]
-                    if indexFieldmap["type"]=="line":
-                        self.texteCarmel3D_CMD+="\n%s" % ' '.join(map(str,indexFieldmap["first_point"]), )
-                        self.texteCarmel3D_CMD+="\n%s" % ' '.join(map(str,indexFieldmap["last_point"]), )
-                        self.texteCarmel3D_CMD+="\n%d" % (indexFieldmap["number_of_points"], )
-                    if indexFieldmap["type"]=="plane":
-                        self.texteCarmel3D_CMD+="\n%d" % (axes[indexFieldmap["normal_vector"]], )
-                        self.texteCarmel3D_CMD+="\n%f" % (indexFieldmap["plane_position"], )
-                        self.texteCarmel3D_CMD+="\n%s" % ' '.join(map(str,indexFieldmap["number_of_points"]))
-                if indexFieldmap["fieldmap_type"]=="fichier":
-                        self.fichierFieldmap=indexFieldmap["filename"]
-                        self.nomFichierFieldmap = os.path.basename(self.fichierFieldmap) # nom du fichier de fieldmap, sans le chemin
-                        self.texteCarmel3D_CMD+="\n" + self.nomFichierFieldmap
-                self.texteCarmel3D_CMD+="\n" + champs[indexFieldmap["field"]]
-                self.texteCarmel3D_CMD+="\n" + champsFieldkind[indexFieldmap["fieldkind"]]
-                self.texteCarmel3D_CMD+="\n" +indexFieldmap["name"] # nom systématique, quel que soit le fieldmap_type, placé entre fieldkind et output
-                self.texteCarmel3D_CMD+="\n" +champsOutput[indexFieldmap["output"]]
-                self.texteCarmel3D_CMD+="\n]\n"
-                        
-                
-
-
-#---------------------------------------------------------------------------------------
-# traitement fichier PHYS
-#---------------------------------------------------------------------------------------
-   def generBLOC_VERSION(self,obj) :
-      # constitution du bloc VERSION du fichier PHYS
-      # creation d une entite  VERSION ; elle sera du type PROC car decrit ainsi
-      # dans le du catalogue
-      version=obj.addEntite('VERSION',pos=None)
-      self.generPROC_ETAPE(obj.etapes[0])
-      self.texteCarmel3D+="["+obj.etapes[0].nom+"\n"
-      for cle in obj.etapes[0].valeur :
-          self.texteCarmel3D+="   "+cle+" "+str(obj.etapes[0].valeur[cle])+"\n"
-      self.texteCarmel3D+="]\n"
-      # destruction de l entite creee 
-      obj.suppEntite(version)
-      #print 'ERREUR : test erreur boite graphique BLOC_VERSION'
-      #raise ValueError, 'test erreur boite graphique BLOC_VERSION'
-
-
-   def generBLOC_PARAMETERS(self,obj):
-        if self.debug: 
-            print "generation parameters obj.valeur = %s" % obj.valeur    
-
-        self.frequency=obj.valeur["FREQUENCY"]
-        self.repertory=obj.valeur["RepCarmel"]
-        self.fichierMaillage=obj.valeur["Fichier_maillage"]
-        self.nomFichierMaillage = os.path.basename(self.fichierMaillage) # nom du fichier de maillage, sans le chemin
-        self.projet = self.nomFichierMaillage.split(".")[0] # nom du projet, utilisé un peu partout, équivalent au nom du fichier de maillage sans l'extension
-        self.echelle=obj.valeur["Echelle_du_maillage"]
-        self.gendof=obj.valeur["Realiser_topologie_gendof"]
-        self.fcarmel=obj.valeur["Resoudre_probleme"]
-        self.postprocess=obj.valeur["Realiser_post_traitement_aposteriori"]
-        self.formulation=obj.valeur["Formulation"]
-#----------------------------------------------------------------------------------------
-   def generBLOC_MATERIALS(self) :
-        """Prepare une partie du contenu du fichier de parametres (PHYS) pour le code Carmel3D (bloc MATERIALS).
-        Le bloc MATERIALS existe toujours ! 
-        """
-        if self.debug:
-            print "cle dictionnaire materconductor : %s" % self.dictMaterConductor.keys()
-            print "cle dictionnaire materdielectric : %s" % self.dictMaterDielectric.keys()
-        # constitution du bloc MATERIALS du fichier PHYS
-        self.texteCarmel3D+="[MATERIALS\n"
-        # tri alphabetique de tous les groupes de maillage associes a des sources (plus necessaire Code_Carmel3D V_2_3_1 et +, mais avant oui)
-        nomsGroupes = self.dictGroupes['ordreMateriauxJdC'][:] # copie de l'original, qui est une liste
-        nomsGroupes.sort() # tri alphabetique, avec les prefixes eventuels
-        if self.debug:
-            print "noms groupes de mailles associes a des materiaux \
-                            (ordre JdC puis tri)= %(v_1)s %(v_2)s" % \
-                            {'v_1': self.dictGroupes['ordreMateriauxJdC'], \
-                             'v_2': nomsGroupes}
-        try:  # mise à jour du fichier .phys selon les matériaux trouvés                  
-            # constitution du bloc CONDUCTOR du fichier PHYS si existe
-            if self.dictMaterConductor != {} : self.creaBLOC_CONDUCTOR(nomsGroupes)            
-            # constitution du bloc DIELECTRIC du fichier PHYS si exixte
-            if self.dictMaterDielectric != {} : self.creaBLOC_DIELECTRIC(nomsGroupes)            
-            # constitution du bloc ZSURFACIC du fichier PHYS si exixte
-            if self.dictMaterZsurfacic != {} : self.creaBLOC_ZSURFACIC(nomsGroupes)
-            # constitution du bloc NILMAT du fichier PHYS si exixte
-            if self.dictMaterNilmat != {} : self.creaBLOC_NILMAT(nomsGroupes)
-            # constitution du bloc ZINSULATOR du fichier PHYS si exixte
-            if self.dictMaterZinsulator != {} : self.creaBLOC_ZINSULATOR(nomsGroupes)
-            # Les blocs EM_ISOTROPIC_FILES et EM_ANISOTROPIC_FILES sont places en dernier dans le fichier PHYS
-            # constitution du bloc EM_ISOTROPIC_FILES du fichier PHYS si exixte
-            if self.dictMaterEmIso != {} and self.materiauxGroupesTousIsotropes and not self.materiauxGroupesTousHomogenes : self.creaBLOC_EMISO() # bloc isotrope si au moins un matériau isotrope et non homogene
-            # constitution du bloc EM_ANISOTROPIC_FILES du fichier PHYS si exixte
-            if self.dictMaterEmAnIso != {} and not self.materiauxGroupesTousIsotropes : self.creaBLOC_EMANISO() # bloc non isotrope si au moins un matériau non isotrope
-        except ValueError, err:
-            raise ValueError(str(err))
-            
-
-        # fin du bloc MATERIALS du fichier PHYS
-        self.texteCarmel3D+="]\n"  
-
-       
-       
-   def creaBLOC_CONDUCTOR(self, nomsGroupes) :
-        """Constitution du bloc CONDUCTOR du fichier PHYS"""
-        typeBloc = 'CONDUCTOR' # initialisation du type de bloc
-        dictProprietes = self.dictMaterConductor # initialisation du dictionnaire des proprietes du bloc
-        if self.debug: 
-            print 'cles materiaux de type %(type_bloc)s = %(cle_bloc)s' % {'type_bloc': typeBloc, 'cle_bloc': dictProprietes.keys()}
-        for nom in nomsGroupes: # parcours des noms des groupes de maillage
-            if self.dictGroupes[nom]['MATERIAL'][:]  in dictProprietes.keys(): # test si le nom du materiau associe est du bon type
-                if dictProprietes[self.dictGroupes[nom]['MATERIAL'][:]]['valeur']['PERMEABILITY']['LAW'] == 'NONLINEAR': # Erreur si ce matériau est non-linéaire
-                    print u"ERREUR! Le matériau de nom %s associé au groupe %s doit avoir sa perméabilité (PERMEABILITY) linéaire (LINEAR) seulement." % (self.dictGroupes[nom]['MATERIAL'][:],  nom)
-                    raise ValueError, self.dictGroupes[nom]['MATERIAL'][:] + ',' +  nom + tr(" : ce materiau (nom, groupe associe) doit avoir sa permeabilite (PERMEABILITY) lineaire (LINEAR) seulement.")
-                if dictProprietes[self.dictGroupes[nom]['MATERIAL'][:]]['valeur']['PERMEABILITY']['HOMOGENEOUS'] == 'FALSE' \
-                 or dictProprietes[self.dictGroupes[nom]['MATERIAL'][:]]['valeur']['CONDUCTIVITY']['HOMOGENEOUS'] == 'FALSE': # recherche si matériau non-homogène
-                    self.materiauxGroupesTousHomogenes = False # alors tous les matériaux ne sont pas homogènes
-                if dictProprietes[self.dictGroupes[nom]['MATERIAL'][:]]['valeur']['PERMEABILITY']['ISOTROPIC'] == 'FALSE' \
-                 or dictProprietes[self.dictGroupes[nom]['MATERIAL'][:]]['valeur']['CONDUCTIVITY']['ISOTROPIC'] == 'FALSE': # recherche si matériau non-homogène
-                    self.materiauxGroupesTousIsotropes = False # alors tous les matériaux ne sont pas isotropes
-                # ecriture du bloc complet
-                self.texteCarmel3D+="     ["+typeBloc+"\n" # debut de bloc
-                if usePrefix:
-                    nomReel = self.nomReelGroupe(nom, typeBloc)
-                else:
-                    nomReel = nom
-                self.texteCarmel3D+="        NAME "+nomReel+"\n" # ecriture du nom (reel) du groupe du maillage
-                self.texteCarmel3D+=  dictProprietes[self.dictGroupes[nom]['MATERIAL'][:]]['texte'] # ecriture des proprietes du type associe
-                self.texteCarmel3D+="     ]\n" # fin de bloc
-
-   def creaBLOC_DIELECTRIC(self, nomsGroupes) :
-        """Constitution du bloc DIELECTRIC du fichier PHYS"""
-        typeBloc = 'DIELECTRIC' # initialisation du type de bloc
-        dictProprietes = self.dictMaterDielectric # initialisation du dictionnaire des proprietes du bloc
-        if self.debug: 
-            print 'cles materiaux de type %(type_bloc)s=%(cle_bloc)s' % {'type_bloc': typeBloc, 'cle_bloc': dictProprietes.keys()}
-        for nom in nomsGroupes: # parcours des noms des groupes de maillage
-            print "jdc materiaux= %s" %(self.dictGroupes['ordreMateriauxJdC'])
-            if self.dictGroupes[nom]['MATERIAL'][:] in dictProprietes.keys(): # test si le nom du materiau associe est du bon type
-                if dictProprietes[self.dictGroupes[nom]['MATERIAL'][:]]['valeur']['PERMEABILITY']['LAW'] == 'NONLINEAR': # Erreur si ce matériau est non-linéaire
-                    print u"ERREUR! Le matériau de nom %s associé au groupe %s doit avoir sa perméabilité (PERMEABILITY) linéaire (LINEAR) seulement." % (self.dictGroupes[nom]['MATERIAL'][:],  nom)
-                    raise ValueError, self.dictGroupes[nom]['MATERIAL'][:] + ',' +  nom + tr(" : ce materiau (nom, groupe associe) doit avoir sa permeabilite (PERMEABILITY) lineaire (LINEAR) seulement.")
-                if dictProprietes[self.dictGroupes[nom]['MATERIAL'][:]]['valeur']['PERMEABILITY']['HOMOGENEOUS'] == 'FALSE': # recherche si matériau non-homogène
-                    self.materiauxGroupesTousHomogenes = False # alors tous les matériaux ne sont pas homogènes
-                if dictProprietes[self.dictGroupes[nom]['MATERIAL'][:]]['valeur']['PERMEABILITY']['ISOTROPIC'] == 'FALSE': # recherche si matériau non-homogène
-                    self.materiauxGroupesTousIsotropes = False # alors tous les matériaux ne sont pas isotropes
-                 # ecriture du bloc complet
-                self.texteCarmel3D+="     ["+typeBloc+"\n" # debut de bloc
-                self.texteCarmel3D+="        NAME "+nom+"\n" # ecriture du nom (reel) du groupe du maillage
-                self.texteCarmel3D+=  dictProprietes[self.dictGroupes[nom]['MATERIAL'][:]]['texte'] # ecriture des proprietes du type associe
-                self.texteCarmel3D+="     ]\n" # fin de bloc
-    
-   def creaBLOC_ZSURFACIC(self, nomsGroupes) :
-        """Constitution du bloc ZSURFACIC du fichier PHYS"""
-        typeBloc = 'ZSURFACIC' # initialisation du type de bloc
-        dictProprietes = self.dictMaterZsurfacic # initialisation du dictionnaire des proprietes du bloc
-        if self.debug: 
-            print 'cles materiaux de type %(type_bloc)s=%(cle_bloc)s' % {'type_bloc': typeBloc, 'cle_bloc': dictProprietes.keys()}
-        for nom in nomsGroupes: # parcours des noms des groupes de maillage
-            if self.dictGroupes[nom]['MATERIAL'][:]  in dictProprietes.keys(): # test si le nom du materiau associe est du bon type
-                # ecriture du bloc complet
-                self.texteCarmel3D+="     ["+typeBloc+"\n" # debut de bloc
-                if usePrefix:
-                    nomReel = self.nomReelGroupe(nom, typeBloc)
-                else:
-                    nomReel = nom
-                self.texteCarmel3D+="        NAME "+nomReel+"\n" # ecriture du nom (reel) du groupe du maillage
-                self.texteCarmel3D+=  dictProprietes[self.dictGroupes[nom]['MATERIAL'][:] ] # ecriture des proprietes du type associe
-                self.texteCarmel3D+="     ]\n" # fin de bloc
-
-   def creaBLOC_EMISO(self) :
-        """constitution du bloc EM_ISOTROPIC_FILES du fichier PHYS"""
-        for cle in self.dictMaterEmIso.keys():
-            self.texteCarmel3D+="     [EM_ISOTROPIC_FILES\n"
-            self.texteCarmel3D+= self.dictMaterEmIso[cle] 
-            self.texteCarmel3D+="     ]\n"
-
-   def creaBLOC_EMANISO(self) :
-        """constitution du bloc EM_ANISOTROPIC_FILES du fichier PHYS"""
-        for cle in self.dictMaterEmAnIso.keys():
-            self.texteCarmel3D+="     [EM_ANISOTROPIC_FILES\n"
-            self.texteCarmel3D+=  self.dictMaterEmAnIso[cle] 
-            self.texteCarmel3D+="     ]\n"
-
-   def creaBLOC_ZINSULATOR(self, nomsGroupes) :
-        """Constitution du bloc ZINSULATOR du fichier PHYS"""
-        typeBloc = 'ZINSULATOR' # initialisation du type de bloc
-        dictProprietes = self.dictMaterZinsulator # initialisation du dictionnaire des proprietes du bloc
-        if self.debug: print 'cles materiaux de type '+typeBloc+'=', dictProprietes.keys()
-        for nom in nomsGroupes: # parcours des noms des groupes de maillage
-            if self.dictGroupes[nom]['MATERIAL'][:]  in dictProprietes.keys(): # test si le nom du materiau associe est du bon type
-                # ecriture du bloc complet
-                self.texteCarmel3D+="     ["+typeBloc+"\n" # debut de bloc
-                if usePrefix:
-                    nomReel = self.nomReelGroupe(nom, typeBloc)
-                else:
-                    nomReel = nom
-                self.texteCarmel3D+="        NAME "+nomReel+"\n" # ecriture du nom (reel) du groupe du maillage
-                self.texteCarmel3D+=  dictProprietes[self.dictGroupes[nom]['MATERIAL'][:] ] # ecriture des proprietes du type associe
-                self.texteCarmel3D+="     ]\n" # fin de bloc
-
-   def creaBLOC_NILMAT(self, nomsGroupes) :
-        """Constitution du bloc NILMAT du fichier PHYS"""
-        typeBloc = 'NILMAT' # initialisation du type de bloc
-        dictProprietes = self.dictMaterNilmat # initialisation du dictionnaire des proprietes du bloc
-        if self.debug: 
-            print 'cles materiaux de type %(type_bloc)s=%(cle_bloc)s' % {'type_bloc': typeBloc, 'cle_bloc': dictProprietes.keys()}
-        for nom in nomsGroupes: # parcours des noms des groupes de maillage
-            if self.dictGroupes[nom]['MATERIAL'][:]  in dictProprietes.keys(): # test si le nom du materiau associe est du bon type
-                # ecriture du bloc complet
-                self.texteCarmel3D+="     ["+typeBloc+"\n" # debut de bloc
-                if usePrefix:
-                    nomReel = self.nomReelGroupe(nom, typeBloc)
-                else:
-                    nomReel = nom
-                self.texteCarmel3D+="        NAME "+nomReel+"\n" # ecriture du nom (reel) du groupe du maillage
-                self.texteCarmel3D+=  dictProprietes[self.dictGroupes[nom]['MATERIAL'][:]] # ecriture des proprietes du type associe
-                self.texteCarmel3D+="     ]\n" # fin de bloc
-
-#----------------------------------------------------------------------------------------
-   def generBLOC_SOURCES(self):
-        """constitution du bloc SOURCES du fichier PHYS"""
-        self.texteCarmel3D+="[SOURCES\n"
-#        # tri alphabetique de tous les groupes de maillage associes a des sources
-        nomsGroupes = self.dictGroupes['ordreSourcesJdC'][:] 
-        nomsGroupes.sort() 
-     #   print "RESULTAT APRES FUSION  self.dictGroupes= %s" %(self.dictGroupesnomsGroupes)
-        
-        if self.debug:
-            print 'noms groupes de mailles associes a des sources \
-                            (ordre JdC puis tri)=%(g_maillage_orig)s %(g_maillage_trie)s' % \
-                            {'g_maillage_orig': self.dictGroupes['ordreSourcesJdC'], \
-                             'g_maillage_trie': nomsGroupes}
-        if self.dictSourceStInd != {}: self.creaBLOC_STRANDED_INDUCTOR(nomsGroupes)
-        if self.dictSourceEport != {}: self.creaBLOC_EPORT(nomsGroupes)
-        if self.dictSourceHport != {}: self.creaBLOC_HPORT(nomsGroupes)
-        # fin du bloc SOURCES du fichier PHYS
-        self.texteCarmel3D+="]\n"
-
-
-   def creaBLOC_STRANDED_INDUCTOR(self, nomsGroupes) :
-        """constitution du bloc STRANDED_INDUCTOR du fichier PHYS"""
-        if self.debug: 
-            print 'cles sources STRANDED_INDUCTOR= %s' % self.dictSourceStInd.keys()
-        typeBloc = 'STRANDED_INDUCTOR'
-#        print "liste des NOM=%s" %(nom)
-        for nom in nomsGroupes: # parcours des noms des groupes de maillage
-            if self.dictGroupes[nom]['SOURCE'][:]  in self.dictSourceStInd.keys(): # test si le nom de la source associee est un inducteur bobine
-                # ecriture du bloc de l'inducteur bobine
-                self.texteCarmel3D+="     [STRANDED_INDUCTOR\n" # debut de bloc
-                self.texteCarmel3D+="        NAME "+nom+"\n" # ecriture du nom (reel) du groupe du maillage
-                self.texteCarmel3D+=  self.dictSourceStInd[self.dictGroupes[nom]['SOURCE'][:] ] # ecriture des proprietes de l'inducteur bobine
-                self.texteCarmel3D+="     ]\n" # fin de bloc
-
-   def creaBLOC_EPORT(self, nomsGroupes) :
-        """constitution du bloc EPORT du fichier PHYS"""
-        if self.debug: 
-            print 'cles sources EPORT= %s' % self.dictSourceEport.keys()
-        typeBloc = 'EPORT'
-        for nom in nomsGroupes: # parcours des noms des groupes de maillage
-            if self.dictGroupes[nom]['SOURCE'][:]  in self.dictSourceEport.keys(): # test si le nom de la source associee est un port electrique
-                # ecriture du bloc du port electrique
-                self.texteCarmel3D+="     [EPORT\n" # debut de bloc
-                if usePrefix:
-                    nomReel = self.nomReelGroupe(nom, typeBloc)
-                else:
-                    nomReel = nom
-                self.texteCarmel3D+="        NAME "+nomReel+"\n" # ecriture du nom (reel) du groupe du maillage
-                self.texteCarmel3D+=  self.dictSourceEport[self.dictGroupes[nom]['SOURCE'][:] ] # ecriture des proprietes du port electrique
-                self.texteCarmel3D+="     ]\n" # fin de bloc
-
-   def creaBLOC_HPORT(self, nomsGroupes) :
-        """constitution du bloc HPORT du fichier PHYS"""
-        if self.debug: 
-            print 'cles sources HPORT= %s' % self.dictSourceHport.keys()
-        typeBloc = 'HPORT'
-        for nom in nomsGroupes: # parcours des noms des groupes de maillage
-            if self.dictGroupes[nom]['SOURCE'][:] in self.dictSourceHport.keys(): # test si le nom de la source associee est un port magnetique
-                # ecriture du bloc du port magnetique
-                self.texteCarmel3D+="     [HPORT\n" # debut de bloc
-                if usePrefix:
-                    nomReel = self.nomReelGroupe(nom, typeBloc)
-                else:
-                    nomReel = nom
-                self.texteCarmel3D+="        NAME "+nomReel+"\n" # ecriture du nom (reel) du groupe du maillage
-                self.texteCarmel3D+=  self.dictSourceHport[self.dictGroupes[nom]['SOURCE'][:]] # ecriture des proprietes du port magnetique
-                self.texteCarmel3D+="     ]\n" # fin de bloc
-                
-   def generSTRANDED_INDUCTOR_GEOMETRY(self, obj):
-        """preparation du bloc STRANDED_INDUCTOR_GEOMETRY"""
-
-        texte=""
-        self.direction=obj.valeur["Direction"]
-        self.section=obj.valeur["Section"]
-        self.forme=obj.valeur["Forme"]
-#        texte+="\n%s" %(self.domaine)
-
-        if self.forme=="Circulaire" : self.generCIRCULAR_STRANDED_INDUCTOR_GEOMETRY(obj)
-        else: 
-            texte+="\n1"
-            texte+="\n%s" % ' '.join(map(str, self.direction))
-            texte+="\n%g" % (self.section)
-            self.dictStrand[obj.getSdname()]=texte  
-        if self.debug: 
-            print texte 
-
-   def generCIRCULAR_STRANDED_INDUCTOR_GEOMETRY(self, obj):
-            texte=""
-            self.centre=obj.valeur["Centre"]
-            texte+="\n2"
-            texte+="\n%s" % ' '.join(map(str,self.direction))
-            texte+="\n%s" % ' '.join(map(str, self.centre))
-            texte+="\n%g" % (self.section)
-            self.dictStrand[obj.getSdname()]=texte  
-            if self.debug: 
-                print texte
-
-
-   def creaBLOC_STRANDED_INDUCTOR_GEOMETRY(self, nomsGroupes):  
-        """Ecriture de chaque inducteur bobiné dans le in.gendof. Gestion des inducteurs en un ou plusieurs morceaux, avec le domaine.
-        Attention! L'argument nomSGroupes n'est pas utile ici. A supprimer. Routine à renommer aussi.
-        """
-        if self.debug: 
-            print 'dictGroupes=', self.dictGroupes
-            print 'cles sources STRANDED_INDUCTOR_GEOMETRY= %s' % self.dictStrand.keys()
-            print "nomsGroupes=%s" %(nomsGroupes)
-        nomsSources=self.dictGroupes['ordreDomaineJdC']
-        nomsSources.sort() # tri alphabétique des inducteurs, réclamé par gendof.exe
-        if self.debug: print"nomsSources=%s" %nomsSources
-        for nom in nomsSources:  
-            if self.debug: print "nomSource courant=",nom
-            if self.dictGroupes[nom].has_key('SOURCE'):
-                if self.dictGroupes[nom]['SOURCE'] not in self.dictPort :
-                    if not self.dictGroupes[nom].has_key('DOMAINE'): raise ValueError, nom + tr(" : il manque un Domaine a cet inducteur.")
-                    self.texteCarmel3D_INGEND2+="\n%s" %(self.dictGroupes[nom]['DOMAINE']) # écriture du nom de domaine
-            else:
-                    if not self.dictGroupes[nom].has_key('DOMAINE'): raise ValueError,  nom + tr(" : il manque un Domaine a cet inducteur.")
-                    self.texteCarmel3D_INGEND2+="\n%s" %(self.dictGroupes[nom]['DOMAINE']) # écriture du nom de domaine                
-            if self.dictGroupes[nom].has_key('STRAND'): # inducteur en un seul morceau
-                if not self.dictGroupes[nom].has_key('DOMAINE'): raise ValueError,  nom + tr(" : il manque un Domaine a cet inducteur.")
-                strand = self.dictGroupes[nom]['STRAND'] 
-                if self.debug: print "un seul morceau : nomStrand courant=", strand
-                self.texteCarmel3D_INGEND2+=  self.dictStrand[strand]
-            if self.dictGroupes[nom].has_key('LISTE'): # inducteur en plusieurs morceaux
-                listeStrand = self.dictGroupes[nom]['LISTE'] # liste des groupes de maillage composant l'inducteur, ou groupe tout seul si inducteur en un seul morceau
-                for strand in listeStrand: 
-                    #strand = strand.replace("'", "") # suppression des guillemets simples
-                    if self.debug: print "plusieurs morceaux : nomStrand courant=",strand
-                    if self.debug: print "self.dictGroupes[strand]=", self.dictGroupes[strand]
-                    self.texteCarmel3D_INGEND2+=  self.dictStrand[self.dictGroupes[strand]['STRAND'] ]
-                                                                    
-   def creaBLOC_PORTS_GEOMETRY(self, nomsGroupes):  
-        if self.debug:
-           print "self.dictSourceEport=",  self.dictSourceEport
-           print "self.dictSourceHport=",  self.dictSourceHport
-        nomsSources=self.dictGroupes['ordreDomaineJdC']
-        nomsSources.sort() # tri alphabétique des inducteurs, réclamé par gendof.exe
-
-        for nom in nomsSources: 
-            port=self.dictGroupes[nom]['SOURCE']
-            if self.dictGroupes[nom]['SOURCE'] in self.dictPort :
-                self.texteCarmel3D_INGEND2+="\n%s" %(self.dictGroupes[nom]['DOMAINE']) # écriture du nom de domaine
-                port=self.dictGroupes[nom]['SOURCE']
-
-                if self.dictPort[port].has_key('EPORT'):# inducteur en un seul morceau   
-                    if self.dictPort[port]['EPORT']=="VOLTAGE":
-                        self.texteCarmel3D_INGEND2+= "\n1"
-                    else:
-                        self.texteCarmel3D_INGEND2+= "\n2"
-                if self.dictPort[port].has_key('HPORT'):# inducteur en un seul morceau   
-                    if self.dictPort[port]['HPORT']=="VOLTAGE":
-                        self.texteCarmel3D_INGEND2+= "\n1"
-                    else:
-                        self.texteCarmel3D_INGEND2+= "\n2"  
-
-#-------------------------------------
-# Methodes utilitaires
-# ------------------------------------
-   def formateCOMPLEX(self,nbC):
-        """prise en compte des differentes formes de description d un nombre complexe
-        3 formats possibles : 2 listes (anciennement tuples?)  et 1 nombre complexe
-        """
-        if self.debug:
-            print "formatage"
-            print "type : %(type_nb_c)s pour %(nb_c)s" % {'type_nb_c': type(nbC), 'nb_c': nbC}
-        nbformate =""
-        if isinstance(nbC,(tuple,list)):
-            if nbC[0] == "'RI'" :
-                nbformate = "COMPLEX " + str(nbC[1])+" "+str(nbC[2])            
-            if nbC[0] == "'MP'" :
-                nbformate = "POLAR " + str(nbC[1])+" "+str(nbC[2])            
-        else:
-            nbformate = "COMPLEX " + str(nbC.real)+" "+str(nbC.imag)
-        if self.debug: 
-            print "nbformate : %s" % nbformate
-        return nbformate
-   
-   def nomReelGroupe(self, nom, typeBloc=None):
-        """Calcule et retourne le nom reel du groupe de maillage donne en entree,
-        en tenant compte de l'utilisation de prefixes ou pas, et cela pour le type
-        de bloc du fichier PHYS specifie.
-        Cette routine verifie aussi, en cas d'utilisation de prefixes, si le prefixe est en adequation avec le type du bloc.
-        """
-        from string import join
-        if self.debug: 
-            print "nom groupe original : %(nom)s avec usePrefix=%(use_prefix)s devient...", \
-                            {'nom': nom, 'use_prefix': str(usePrefix)}
-        nomReel= None # nom affiche dans le fichier PHYS, sans prefixe a priori
-        if usePrefix:
-            # suppression du prefixe si present
-            partiesNom = nom.split(sepNomGroupeMaille) # separation du nom du groupe en parties
-            # les tests suivants ne generent une erreur que si le prefixe est obligatoire
-            if len(partiesNom) < 2: # test d'erreur, pas de separateur donc nom incorrect, i.e. sans prefixe c'est sur
-                print "ERREUR! ce groupe de maille (%s) n'a pas de prefixe \
-                                indiquant le type de materiau ou de source associee" % (nom, )
-            elif partiesNom[0] not in listePrefixesGroupeMaille: # prefixe non defini
-                print "ERREUR! ce groupe de maille (%s) n'a pas de prefixe valable" %  (nom, )
-            else:   
-                # verification de l'adequation du prefixe avec le type de bloc demande, si fourni    
-                if typeBloc is not None:
-                    if typeBloc not in dictPrefixesGroupeMaille: # test validite de typeBloc, devant etre une cle du dictionnaire
-                        print "ERREUR! ce type de bloc (%s) n'est pas valable" % (str(typeBloc), )
-                    elif partiesNom[0] not in dictPrefixesGroupeMaille[typeBloc]: # pas de prefixe correct pour ce type de bloc
-                        print "ERREUR! ce groupe de maille (%(nom)s) n'a pas \
-                                        le prefixe correct pour etre associe a un type %(type_bloc)s", \
-                                         {'nom': nom, 'type_bloc': str(typeBloc)}
-                    else: # c'est bon
-                        nomReel = join(partiesNom[1:], sepNomGroupeMaille) # reconstruction du nom du groupe sans prefixe complet
-                        if self.debug: 
-                            print "ce groupe de maille (%(nom)s) a un prefixe qui \
-                                            est supprime automatiquement pour devenir : %(nom_reel)s", \
-                                            {'nom': nom, 'nom_reel': nomReel}
-                else: # c'est bon
-                    nomReel = join(partiesNom[1:], sepNomGroupeMaille) # reconstruction du nom du groupe sans prefixe complet
-                    if self.debug: 
-                        print "ce groupe de maille (%(nom)s) a un prefixe qui \
-                                        est supprime automatiquement pour devenir : %(nom_reel)s", \
-                                        {'nom': nom, 'nom_reel': nomReel}
-        if self.debug: 
-            print "... %s", nomReel
-        return nomReel
diff --git a/generator/generator_CARMEL3D_temporel.py b/generator/generator_CARMEL3D_temporel.py
deleted file mode 100644 (file)
index 05a3d85..0000000
+++ /dev/null
@@ -1,877 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright (C) 2007-2017   EDF R&D
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-#
-# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-#
-"""Ce module contient le plugin generateur de fichier au format  Code_Carmel3D pour EFICAS.
-"""
-
-import xml.etree.cElementTree as ET
-import traceback
-import types,string,re,os
-from Extensions.i18n import tr
-from generator_python import PythonGenerator
-
-# types de problemes
-HARMONIC = 'HARMONIC' # probleme frequentiel
-TIME_DOMAIN = 'TIME_DOMAIN' # probleme temporel
-
-# nom du plugin, utilisé dans entryPoint et generMACRO_ETAPE()
-nomPlugin = 'CARMEL3DTV0'
-
-def entryPoint():
-   """
-      Retourne les informations necessaires pour le chargeur de plugins
-      Ces informations sont retournees dans un dictionnaire
-   """
-   return {
-        # Le nom du plugin
-          'name' : nomPlugin,
-        # La factory pour creer une instance du plugin
-          'factory' : CARMEL3DTV0Generator,
-          }
-
-
-
-class CARMEL3DTV0Generator(PythonGenerator):
-   """
-      Ce generateur parcourt un objet de type JDC et produit
-      un texte au format eficas et 
-      un texte au format attendu par le code Code_Carmel3D (fichier '.PHYS') 
-
-   """
-   # Les extensions de fichier permis?
-   extensions=('.comm',)
-
-#----------------------------------------------------------------------------------------
-   def gener(self,obj,format='brut',config=None):
-
-      self.initDico()
-
-      #self.debug = True
-
-      # Cette instruction genere le contenu du fichier de commandes (persistance)
-      self.text=PythonGenerator.gener(self,obj,format)
-
-      if self.debug:
-         print "self.text = %s" % self.text
-
-      # Cette instruction genere le contenu du fichier de parametres pour le code Carmel3D
-      # si le jdc est valide (sinon cela n a pas de sens)
-      if obj.isValid() : 
-           try :
-             # constitution du bloc VERSION du fichier PHYS (existe toujours)
-             self.generBLOC_VERSION(obj)
-
-           except ValueError, err:
-             raise ValueError(str(err))
-
-      return self.text
-
-
-
-
-#----------------------------------------------------------------------------------------
-# initialisations
-#----------------------------------------------------------------------------------------
-
-   def initDico(self) :
-      self.texteCarmel3D=""
-      self.texteCarmel3D_SH=""      
-      self.debug = True # affichage de messages pour deboguage (.true.) ou non
-      self.dicoEtapeCourant=None
-      self.dicoMCFACTCourant=None
-      self.dicoCourant=None
-      self.dictGroupes = {} # association des noms de groupes de maillage avec les noms de materiaux ou de sources, en sauvegardant l'ordre du JdC en separant les groupes associes a des materiaux de ceux associes a des sources
-      self.dictMacroGroupes = {} # macro-groupe et leurs propriétés
-      self.listSymetrie=[]   
-      self.dictMouvement= {'ordre':[]} # dictionnaire contenant les mouvements, avec liste incluse pour l'ordre
-      self.nombreMouvements = 0 # nombre de mouvements définis, servant de compteur aussi
-      self.dictMaterial={}
-      self.dictSource={}
-      self.dictStrand={}
-      self.dictGroupeMilieux={"ordreSource":[], "ordreId":[]}
-      self.dictDomaine={}
-      # Parametre du maillage
-      self.identification = ""
-      self.fichierMaillage = ""
-      self.echelleMaillage = ""
-      # Parametre de Precision      
-      self.precond=""  
-      self.precisionLineaire=""
-      self.kEpsilonDistance=""
-      self.kdistanceRef=""  
-      self.nbIterationMax=""
-      self.methodeNonLineaire = ""
-      self.kEpsilonNonLinearite=""
-      self.kCoefficientRelaxation=""
-      self.jauge=""
-      self.NBoucleTemps=""
-      self.dt=""
-      # Paramètres divers
-      self.typeSolveur = "" # type de solveur, linéaire (Solveur_lineaire) ou non-linéaire (Solveur_non_lineaire)
-      #Post traitement
-      self.carteChamp="" # liste des pas de temps demandés lors du post-traitement des cartes de champ
-      self.carteCourantInduit="" # liste des pas de temps demandés lors du post-traitement des cartes de courants induits
-      self.carteForce="" # liste des pas de temps demandés lors du post-traitement des cartes de force
-      self.post_global = [] # liste des grandeurs globales demandées lors du post-traitement
-
-      # on force le probleme a etre frequentiel, seul possible en l'etat des choses
-      self.problem = HARMONIC
-
-   def indent(self, elem, level=0, more_sibs=False, espace=4*' '):
-        """Transformation du XML créé par le module interne xml.etree.ElementTree afin d'écrire les indentations et retours à la ligne corrects.
-        D'après un script original de Fredrik Lundh en 2004 (http://effbot.org/zone/element-lib.htm#prettyprint),
-        modifié par Joshua Richardson en 2012 (http://stackoverflow.com/questions/749796/pretty-printing-xml-in-python)
-        et par Loic Chevallier en 2014 (ajout du reglage de l'indentation).
-        L'indentation est de 4 espaces par défaut (cf. argument optionel : espace)
-        Utilisation : self.indent(root), avant écriture dans un fichier de root = ET.Element("configuration") ou de tree = ET.ElementTree(root)
-        où ET = xml.etree.ElementTree
-        """
-        i = "\n"
-        if level:
-            i += (level-1) * espace
-        num_kids = len(elem)
-        if num_kids:
-            if not elem.text or not elem.text.strip():
-                elem.text = i + espace
-                if level:
-                    elem.text += espace
-            count = 0
-            for kid in elem:
-                self.indent(kid, level+1, count < num_kids - 1)
-                count += 1
-            if not elem.tail or not elem.tail.strip():
-                elem.tail = i
-                if more_sibs:
-                    elem.tail += espace
-        else:
-            if level and (not elem.tail or not elem.tail.strip()):
-                elem.tail = i
-                if more_sibs:
-                    elem.tail += espace
-
-#----------------------------------------------------------------------------------------
-# ecriture
-#----------------------------------------------------------------------------------------
-
-   def writeDefault(self,fn) :
-        """Ecrit les fichiers de parametres et le fichier d'execution pour le code Carmel3D"""
-
-        file =  fn[:fn.rfind(".")]  # emplacement du ficher .comm (chemin complet)
-        namefile=os.path.basename(file) # nom du fichier.comm 
-        repertory=os.path.dirname(file) # répertoire contenant le fichier .comm (emplacement absolu)
-
-        # correspondances globales
-        correspondance_booleen = {'oui':'true', 'non':'false'}
-        
-        fileXML = os.path.join(repertory, 'configuration.xml') # nom du fichier de configuration XML (chemin complet)
-        if self.debug: 
-            print "\necriture du fichier XML : ", fileXML
-            print "self.dictMaterial = ",self.dictMaterial
-            print "self.dictSource = ",self.dictSource
-            print "self.dictGroupes = ",self.dictGroupes
-            print "self.dictMacroGroupes = ",self.dictMacroGroupes
-
-        root = ET.Element("configuration")
-
-        #Bloc <Maillage></Maillage>    
-        Maillage = ET.SubElement(root, "Maillage")
-        identification = ET.SubElement(Maillage, "identification")
-        identification.text = self.identification
-        fichierMaillage = ET.SubElement(Maillage, "fichierMaillage")
-        fichierMaillage.text = self.fichierMaillage
-        echelleMaillage = ET.SubElement(Maillage, "echelleMaillage")
-        correspondance_echelleMaillage = {"Metre":1.0, "Millimetre":1.0e-3}
-        echelleMaillage.text = "%f" % (correspondance_echelleMaillage[self.echelleMaillage], )
-
-        #Bloc <ParametrePrecision></ParametrePrecision>    
-        ParametrePrecision = ET.SubElement(root, "ParametrePrecision")
-        TypeSolveurLineaire = ET.SubElement(ParametrePrecision, "TypeSolveurLineaire")
-        if self.precond=="Crout":
-            TypeSolveurLineaire.text = "1" 
-        if self.precond=="Jacobi":
-            TypeSolveurLineaire.text = "2" 
-        if self.precond=="MUMPS":
-            TypeSolveurLineaire.text = "3"
-        kEpsilonGCP = ET.SubElement(ParametrePrecision, "kEpsilonGCP")
-        kEpsilonGCP.text = "%s" %(self.kEpsilonGCP)
-        nbIterationMax = ET.SubElement(ParametrePrecision, "nbIterationMax")
-        nbIterationMax.text = "%s" %(self.nbIterationMax)        
-        if self.typeSolveur == 'Solveur_non_lineaire': # écriture des paramètres du solveur non-linéaire seulement si défini dans l'étude
-            methodeNonLineaire = ET.SubElement(ParametrePrecision, "methodeNonLineaire")
-            methodeNonLineaire.text = "%s" %(self.methodeNonLineaire)
-            kEpsilonNonLinearite = ET.SubElement(ParametrePrecision, "kEpsilonNonLinearite")        
-            kEpsilonNonLinearite.text = "%s" %(self.kEpsilonNonLinearite)
-            kCoefficientRelaxation = ET.SubElement(ParametrePrecision, "kCoefficientRelaxation")
-            kCoefficientRelaxation.text = "%s" %(self.kCoefficientRelaxation)
-        kEpsilonDistance = ET.SubElement(ParametrePrecision, "kEpsilonDistance")
-        kEpsilonDistance.text = "%s" %(self.kEpsilonDistance)
-        kdistanceRef = ET.SubElement(ParametrePrecision, "kdistanceRef")
-        kdistanceRef.text = "%s" %(self.kdistanceRef)
-        jauge = ET.SubElement(ParametrePrecision, "jauge")
-        jauge.text = "%s" %(correspondance_booleen[self.jauge], )
-        NBoucleTemps = ET.SubElement(ParametrePrecision, "NBoucleTemps")
-        NBoucleTemps.text = "%s" %(self.NBoucleTemps)  
-        dt = ET.SubElement(ParametrePrecision, "dt")
-        dt.text = "%s" %(self.dt)
-
-        #Bloc <Milieux></Milieux>
-        i=0
-        j=0
-        p=0
-        k=0
-        listeMilieux = [] # liste des milieux,  dans l'ordre de création
-        Milieux=ET.SubElement(root, "Milieux") # création du bloc <Milieux>...</Milieux>
-        for nom in self.dictGroupes:  # on parcoure tous les groupes MESHGROUP
-            if self.dictGroupes[nom].has_key('MATERIAL') \
-                or self.dictGroupes[nom].has_key('SOURCE') \
-                or self.dictGroupes[nom].has_key('AIMANT') \
-                or self.dictGroupes[nom].has_key('STRANDED_INDUCTOR_GEOMETRY') : # si MESHGROUP ou MACRO_GROUPE associé à au moins un matériau, source ou géométrie d'inducteur bobiné, c'est un milieu
-                milieu=ET.SubElement(Milieux,"milieu" ) # création d'un nouveau milieu
-                listeMilieux.append(nom) # mise à jour de la liste des milieux
-                i = i+1 # incrément du  numéro de milieu
-                self.dictGroupes[nom]['idMilieu'] = i # affectation de l'id à ce groupe
-                milieu.set("id", "%g" % (i, ) ) # ajout de l'attribut id, inutilisé
-                milieu.set("name", "%s" % (nom, ) ) # ajout de l'attribut name, inutilisé         
-                nomGroupeMaillage = ET.SubElement(milieu, "nomGroupeMaillage") # nom du groupe de maillage
-                nomGroupeMaillage.text = nom
-                if self.dictGroupes[nom].has_key('MATERIAL'): # matériau trouvé pour ce milieu
-                    material = self.dictGroupes[nom]['MATERIAL'] # on récupère le nom de la propriété du matériau, clé de self.dictMaterial
-                    permeabiliteLineaire=ET.SubElement(milieu, "permeabiliteLineaire")
-                    permeabiliteLineaire.text="%s"%(self.dictMaterial[material]["PERMEABILITY"]["VALUE"])
-                    if self.dictMaterial[material]["PERMEABILITY"]["LAW"]=="NONLINEAR":
-                        coefficientsMarrocco=ET.SubElement(milieu, "coefficientsMarrocco")
-                        epsilon = self.dictMaterial[material]["PERMEABILITY"]["EPSILON"]
-                        c = self.dictMaterial[material]["PERMEABILITY"]["C"]
-                        alpha = self.dictMaterial[material]["PERMEABILITY"]["ALPHA"]
-                        tau = self.dictMaterial[material]["PERMEABILITY"]["TAU"]
-                        coefficientsMarrocco.text = '%g, %g, %g, %g' % (epsilon,  c,  alpha,  tau)
-                    if self.dictMaterial[material].has_key('CONDUCTIVITY'):
-                        conductivite=ET.SubElement(milieu, "conductivite")
-                        conductivite.text="%s" %(self.dictMaterial[material]["CONDUCTIVITY"]["VALUE"])
-                    if self.dictMaterial[material].has_key('AIMANT'):
-                        norme=ET.SubElement(milieu, "norme")
-                        norme.text="%s" %(self.dictMaterial[material]["AIMANT"]["VALUE"])
-                if self.dictGroupes[nom].has_key('STRANDED_INDUCTOR_GEOMETRY'): # géométrie d'inducteur bobiné trouvée pour ce milieu
-                    strand=self.dictGroupes[nom]['STRANDED_INDUCTOR_GEOMETRY'] # on récupère le nom de la géométrie d'inducteur bobiné, clé de self.dictStrand
-                    axe = ET.SubElement(milieu, "axe")
-                    axe.text= "%s" % ','.join(map(str,self.dictStrand[strand]["Direction"]))
-                    if self.dictStrand[strand]["Forme"]=="Circulaire":
-                        coordonneesPolaires=ET.SubElement(milieu, "coordonneesPolaires")
-                        coordonneesPolaires.text="true"                        
-                        origineReperePolaire=ET.SubElement(milieu, "origineReperePolaire")
-                        origineReperePolaire.text= "%s" % ','.join(map(str,self.dictStrand[strand]["Centre"]))
-                    section=ET.SubElement(milieu, "section")
-                    section.text="%g" %(self.dictStrand[strand]["Section"], )
-                if self.dictGroupes[nom].has_key('SOURCE'): # source trouvée pour ce milieu
-                        Source = self.dictGroupes[nom]['SOURCE'] # on récupère le nom de la source, clé de self.dictSource
-                        self.dictSource[Source]['milieux'].append(nom) # ajout du nom du groupe à cette source
-                        if self.dictSource[Source].has_key('STRANDED_INDUCTOR'):
-                            nbSpires=ET.SubElement(milieu, "nbSpires")
-                            nbSpires.text="%g" %(self.dictSource[Source]["STRANDED_INDUCTOR"]["NTURNS"])
-                    
-        #Bloc <ConditionsLimitesChamps>...</ConditionsLimitesChamps>
-        ConditionsLimitesChamps = ET.SubElement(root, "ConditionsLimitesChamps")
-        for nomCondition in self.dictGroupes:
-            if self.dictGroupes[nomCondition].has_key('CONDITION_LIMITE'): # condition aux limites associée à ce groupe, hors symétrie et mouvement
-                if self.dictGroupes[nomCondition].has_key('LISTE'): # MACRO_GROUPE
-                    for i in range(len(self.dictGroupes[nomCondition]['LISTE'])):
-                        conditionLimite = ET.SubElement(ConditionsLimitesChamps, "conditionLimitesChamps")
-                        Type=ET.SubElement(conditionLimite,"type" )
-                        Type.text=self.dictGroupes[nomCondition]["CONDITION_LIMITE"]
-                        GroupeNoeud=ET.SubElement(conditionLimite, "groupeNoeud")
-                        GroupeNoeud.text="%s" %(self.dictGroupes[nomCondition]['LISTE'][i])                       
-                else: # MESHGROUP
-                        conditionLimite = ET.SubElement(ConditionsLimitesChamps, "conditionLimitesChamps")
-                        Type=ET.SubElement(conditionLimite,"type" )
-                        Type.text=self.dictGroupes[nomCondition]["CONDITION_LIMITE"]
-                        GroupeNoeud=ET.SubElement(conditionLimite, "groupeNoeud")
-                        GroupeNoeud.text="%s" %(nomCondition)                          
-                
-        for i in range(len(self.listSymetrie)): # symétries, définies dans le bloc des conditions aux limites
-            conditionLimite = ET.SubElement(ConditionsLimitesChamps, "conditionLimitesChamp")
-            Type=ET.SubElement(conditionLimite,"type" )
-            Type.text="%s" %(self.listSymetrie[i]["Type"])
-            GroupeNoeud=ET.SubElement(conditionLimite, "groupeNoeud")
-            GroupeNoeud.text="%s" %(self.listSymetrie[i]["Face1"]) 
-            if 'Face2' in self.listSymetrie[i] :
-                GroupeNoeud2=ET.SubElement(conditionLimite, "groupeNoeud2")
-                GroupeNoeud2.text="%s" %(self.listSymetrie[i]["Face2"])                
-            if 'Mouvement_associe' in self.listSymetrie[i]:    
-                    MouvementAssocie=ET.SubElement(conditionLimite, "mouvementAssocie")
-                    nomMouvementAssocie = self.listSymetrie[i]['Mouvement_associe'].nom # on récupère le nom du mouvement associé, car on a stocké le concept tout entier
-                    MouvementAssocie.text="%i"%(self.dictMouvement[nomMouvementAssocie]['ordre'], )
-            if 'Groupe_Points' in self.listSymetrie[i] :
-                    GroupePoints=ET.SubElement(conditionLimite, "groupePoints")
-                    GroupePoints.text="%s" %(self.listSymetrie[i]['Groupe_Points'])
-
-        #Bloc <TermeSourceElectrique>...</TermeSourceElectrique>
-        TermeSourceElectrique=ET.SubElement(root, "TermeSourceElectrique")
-        i=0 # ?
-        if self.debug: print 'self.dictSource = ',  self.dictSource
-        for source in self.dictSource.keys(): # parcours des sources
-            if len(self.dictSource[source]['milieux']) > 0: # on continue si au moins un groupe de maillage, i.e., milieux est associé à cette source
-                if self.dictSource[source].has_key('STRANDED_INDUCTOR'): # inducteur bobiné
-                    inducteur=ET.SubElement(TermeSourceElectrique, "inducteur")
-                    listeMilieux=ET.SubElement(inducteur, "listeMilieux") # création de la liste des milieux
-                    idListeMilieux = [] # indices des milieux concernés
-                    for milieu in self.dictSource[source]['milieux']: # construction de la liste des milieux
-                        idListeMilieux.append(self.dictGroupes[milieu]['idMilieu'])
-                    listeMilieux.text = "%s" % ','.join(map(str,idListeMilieux))
-                    if self.dictSource[source]["STRANDED_INDUCTOR"]["TYPE"]=="CURRENT": # source de type courant imposé
-                        couplageTension=ET.SubElement(inducteur, "couplageTension")
-                        couplageTension.text = "false"
-                        courant=ET.SubElement(inducteur, "courant")
-                        if self.dictSource[source]["Signal"]=="WAVEFORM_CONSTANT":
-                            courant.text="%g" %(self.dictSource[source]["WAVEFORM_CONSTANT"]["AMPLITUDE"])
-                        if self.dictSource[source]["Signal"]=="WAVEFORM_SINUS": # écriture des 3 paramètres avec attribut spécial
-                            amplitude = self.dictSource[source]["WAVEFORM_SINUS"]["AMPLITUDE"]
-                            frequence = self.dictSource[source]["WAVEFORM_SINUS"]["FREQUENCY"]
-                            phase = self.dictSource[source]["WAVEFORM_SINUS"]["PHASE"]
-                            courant.text="%g, %g, %g" % (amplitude,  frequence,  phase)
-                            courant.set('forme', 'sinus') # attribut forme="sinus"
-                    if self.dictSource[source]["STRANDED_INDUCTOR"]["TYPE"]=="VOLTAGE": # source de type tension imposée
-                        couplageTension=ET.SubElement(inducteur, "couplageTension")
-                        couplageTension.text = "true"
-                        tension=ET.SubElement(inducteur, "tension")
-                        if self.dictSource[source]["Signal"]=="WAVEFORM_CONSTANT":
-                            tension.text="%g" %(self.dictSource[source]["WAVEFORM_CONSTANT"]["AMPLITUDE"])
-                        if self.dictSource[source]["Signal"]=="WAVEFORM_SINUS": # écriture des 3 paramètres avec attribut spécial
-                            amplitude = self.dictSource[source]["WAVEFORM_SINUS"]["AMPLITUDE"]
-                            frequence = self.dictSource[source]["WAVEFORM_SINUS"]["FREQUENCY"]
-                            phase = self.dictSource[source]["WAVEFORM_SINUS"]["PHASE"]
-                            tension.text="%g, %g, %g" % (amplitude,  frequence,  phase)
-                            tension.set('forme', 'sinus') # attribut forme="sinus"
-                        if self.dictSource[source]["STRANDED_INDUCTOR"].has_key('Resistance'):
-                            resistance=ET.SubElement(inducteur, "resistance")
-                            resistance.text="%g" %(self.dictSource[source]["STRANDED_INDUCTOR"]['Resistance'])
-
-        #definir Terme Source Magnetique
-        #definirTermeSourceMagnetique=ET.SubElement(root, "definirTermeSourceMagnetique")
-        #nombreTermeSourceMagnetique=ET.SubElement(definirTermeSourceMagnetique, "nombreTermeSourceMagnetique")
-        #nombreTermeSourceMagnetique.text="0"
-        
-        #definir Aimants
-        #definirAimants=ET.SubElement(root, "definirAimants")
-        #nombreAimants=ET.SubElement(definirAimants, "nombreAimants")
-        #nombreAimants.text="0"
-        
-        #Bloc <Mouvements>...</Mouvements>
-        i = 0
-        Mouvements=ET.SubElement(root, "Mouvements")
-        for nom in self.dictMouvement['ordre']: # parcours de la liste des noms de mouvement définis, dans l'ordre
-            i = i+1
-            mouvement = ET.SubElement(Mouvements, "mouvement") # création de ce mouvement
-            mouvement.set("id", "%g" % (i, ) ) # ajout de l'attribut id, inutilisé
-            mouvement.set("name", nom ) # ajout de l'attribut name, inutilisé
-            milieuGlissement = ET.SubElement(mouvement, "milieuGlissement")
-            nomMilieuGlissement = self.dictMouvement[nom]['valeurs']['Milieu_glissement'].nom  # concept stocké -> nom du concept
-            milieuGlissement.text="%i" % (self.dictGroupes[nomMilieuGlissement]['idMilieu'], ) # numéro du milieu défini par son nom, selon tableaux remplis précédemment
-            surfaceGlissement = ET.SubElement(mouvement, "surfaceGlissement")
-            surfaceGlissement.text= self.dictMouvement[nom]['valeurs']['Surface_glissement'].nom # concept stocké -> nom du concept
-            deltaMaillage = ET.SubElement(mouvement, "deltaMaillage")
-            deltaMaillage.text="%g" % (self.dictMouvement[nom]['valeurs']['Delta_maillage'], )
-            nbPermutPas = ET.SubElement(mouvement, "nbPermutPas")
-            nbPermutPas.text="%i" % (self.dictMouvement[nom]['valeurs']['Nombre_pas_permutation'], )
-            axeRotation = ET.SubElement(mouvement, "axeRotation")
-            axeRotation.text= self.dictMouvement[nom]['valeurs']['Axe_rotation']
-
-        #definir Force Couple
-        #definirForceCouple=ET.SubElement(root, "definirForceCouple")
-        #nombreForceCouple=ET.SubElement(definirForceCouple, "nombreForceCouple")
-        #nombreForceCouple.text="0"
-        
-        #bloc <SpiresExploratrices></SpiresExploratrices>
-        i = 0 # compteur de spires
-        spiresExploratrices = False # pas de spires exploratrices a priori
-        for nom in self.dictGroupes.keys(): # recherche des spires exploratrices définies dans les MESHGROUP
-            if self.dictGroupes[nom].has_key('Spire_Exploratrice'):
-                spiresExploratrices  = True
-        if spiresExploratrices: # on a trouvé au moins une spire exploratrice
-            SpiresExploratrices=ET.SubElement(root, "SpiresExploratrices") # création du bloc XML adéquat
-        for nom in self.dictGroupes.keys(): # recherche des spires exploratrices définies dans les MESHGROUP
-            if self.dictGroupes[nom].has_key('Spire_Exploratrice'):
-                spire = ET.SubElement(SpiresExploratrices, "spireExploratrice") # création du bloc XML pour cette spire
-                spire.text = nom # le nom du groupe de noeud est directement écrit
-                i = i+1 # incrément du  numéro de spire
-                spire.set("id", "%g" % (i, ) ) # ajout de l'attribut id, inutilisé
-                spire.set("name", "%s" % (nom, ) ) # ajout de l'attribut name, inutilisé         
-
-        #bloc <PotentielsFlottants></PotentielsFlottants>
-        i = 0 # compteur de potentiels flottants
-        potentielsFlottants = False # pas de potentiel flottant a priori
-        for nom in self.dictGroupes.keys(): # recherche des potentiels flottants définis dans les MESHGROUP
-            if self.dictGroupes[nom].has_key('Potentiel_Flottant'):
-                potentielsFlottants  = True
-        if potentielsFlottants: # on a trouvé au moins un potentiel flottant
-            PotentielsFlottants=ET.SubElement(root, "PotentielsFlottants") # création du bloc XML adéquat
-        for nom in self.dictGroupes.keys(): # recherche des potentiels flottants définis dans les MESHGROUP
-            if self.dictGroupes[nom].has_key('Potentiel_Flottant'):
-                potentielFlottant = ET.SubElement(PotentielsFlottants, "potentielFlottant") # création du bloc XML pour ce potentiel flottant
-                potentielFlottant.text = nom # le nom du groupe de noeud est directement écrit
-                i = i+1 # incrément du  numéro de spire
-                potentielFlottant.set("id", "%g" % (i, ) ) # ajout de l'attribut id, inutilisé
-                potentielFlottant.set("name", "%s" % (nom, ) ) # ajout de l'attribut name, inutilisé         
-                
-
-        #Definir Post traitement
-        postraitement=ET.SubElement(root, "postraitement")
-        # Ecriture des cartes de champ
-        carteChamp=ET.SubElement(postraitement, "carteChamp")
-        if type(self.carteChamp)==float:
-            carteChamp.text="%s" %(self.carteChamp)
-        else:
-            carteChamp.text="%s" % ','.join(map(str,self.carteChamp))
-        # Ecriture des cartes de courants induits
-        carteCourantInduit=ET.SubElement(postraitement, "carteCourantInduit")
-        if type(self.carteCourantInduit)==float:
-            carteCourantInduit.text="%s" %(self.carteCourantInduit)        
-        else:
-            carteCourantInduit.text="%s" % ','.join(map(str,self.carteCourantInduit))
-        # Ecriture des cartes de force
-        carteForce=ET.SubElement(postraitement, "carteForce")
-        if type(self.carteForce)==float:
-            carteForce.text="%s" %(self.carteForce)            
-        else:
-            carteForce.text="%s" % ','.join(map(str,self.carteForce))
-        # Sortie des grandeurs globales, enregistrées dans self.post_global
-        # liste de correspondance entre la valeur du catalogue et le nom de la balise XML
-        # sous forme ordonnée (nomXML, valeur catalogue) 
-        correspondance_global = (('energie',  "Energie"),\
-                                                   ('perteJoule', "Pertes Joules"),\
-                                                   ('fluxInducteur', "Flux par inducteur"),\
-                                                   ('courantInducteur', "Courants par inducteur"),\
-                                                   ('tensionInducteur', "Tensions par inducteur"), \
-                                                   ('forceCouple', "Force et couple"),\
-                                                   ('fluxSpire', "Flux par spire exploratrice"),\
-                                                   ('fluxGroupe', "Flux par groupe"),\
-                                                   ('ddpElect', "Tensions electriques"),\
-                                                   ('ddpMagn', "DDP magnetiques"), \
-                                                   ('fluxMagn', "Flux magnetiques"),\
-                                                   ('fluxJinduitTotal', "Flux J induit"),\
-                                                   ('potFlottant', "Potentiel flottant"))
-        # Sortie des grandeurs demandées seulement (true)
-        for table in correspondance_global:
-            if table[1] in self.post_global:
-                post_global_item=ET.SubElement(postraitement, table[0])
-                post_global_item.text = "true"
-#        # Sortie de toutes les grandeurs possibles, avec la valeur true pour celles demandées et false sinon
-#        for table in correspondance_global:
-#            post_global_item=ET.SubElement(postraitement, table[0])
-#            if table[1] in self.post_global:
-#                post_global_item.text = "true"
-#            else:
-#                post_global_item.text = "false"
-
-        self.indent(root) # indentations et retours à la ligne, à l'aide d'une fonction maison, car xml.etree.ElementTree ne sait pas faire et le module lxml n'est pas disponible dans Salomé
-
-        tree = ET.ElementTree(root)
-
-        tree.write(fileXML, encoding="UTF-8")
-
-       # print "le dico complet=%s" %(self.dictGroupes)
-
-        if self.debug: 
-            print "ecriture du fichier d'execution (SH)"
-        RepCarmel=os.path.join(repertory,"lancer.sh")
-        f = open( RepCarmel, 'wb')
-        self.texteCarmel3D_SH+='cd ' + repertory + ' \n'
-        self.texteCarmel3D_SH+='./carmel << FIN\n'
-        correspondance_resolution = {"(T-)Omega seulement":"1\n","A(-Phi) seulement":"2\n", "(T-)Omega puis A(-Phi)":"1\n2\n", "A(-Phi) puis (T-)Omega":"2\n1\n"}
-        self.texteCarmel3D_SH+= correspondance_resolution[self.formulation]
-        self.texteCarmel3D_SH+='0\nFIN\n'
-        f.write(self.texteCarmel3D_SH)
-        f.close()      
-
-
-#----------------------------------------------------------------------------------------
-#  analyse de chaque noeud de l'arbre 
-#----------------------------------------------------------------------------------------
-
-   def generMCSIMP(self,obj) :
-        """recuperation de l objet MCSIMP"""
-        if self.debug: 
-            print "MCSIMP %(v_1)s  %(v_2)s" % {'v_1': obj.nom, "v_2": obj.valeur}
-        s=PythonGenerator.generMCSIMP(self,obj)
-        try:
-            self.dicoCourant[obj.nom]=obj.valeurFormatee
-        except:
-            print "Oubli des messages texte homo='information'"
-        return s
-
-
-#----------------------------------------------------------------------------------------
-   def generMCFACT(self,obj) :
-        """recuperation de l objet MCFACT"""
-        dico={}
-        self.dicoMCFACTCourant=dico
-        self.dicoCourant=self.dicoMCFACTCourant
-        s=PythonGenerator.generMCFACT(self,obj)
-        self.dicoEtapeCourant[obj.nom]=self.dicoMCFACTCourant
-        self.dicoMCFACTCourant=None
-        self.dicoCourant=self.dicoEtapeCourant
-        return s
-
-
-#----------------------------------------------------------------------------------------
-   def generPROC_ETAPE(self,obj):
-        """analyse des PROC du catalogue  ( VERSION )"""
-        dico={}
-        self.dicoEtapeCourant=dico
-        self.dicoCourant=self.dicoEtapeCourant
-        s=PythonGenerator.generPROC_ETAPE(self,obj)
-        obj.valeur=self.dicoEtapeCourant
-
-        if self.debug: 
-            print "PROC_ETAPE %(v_1)s  %(v_2)s" % {'v_1': unicode(obj.nom), "v_2": unicode(obj.valeur)}
-        s=PythonGenerator.generPROC_ETAPE(self,obj)
-        if obj.nom=="PARAMETERS" : self.generBLOC_PARAMETERS(obj)
-        if obj.nom=="SOLVEUR" : self.generSOLVEUR(obj)
-        if obj.nom=="SYMETRIE" : self.generBLOC_SYMETRIE(obj)
-        if obj.nom=="POST_TRAITEMENT" : self.generPOST_TRAITEMENT(obj)
-        return s
-
-
-
-#----------------------------------------------------------------------------------------
-   def generETAPE(self,obj):
-        """analyse des OPER du catalogue"""
-        dico={}
-        self.dicoEtapeCourant=dico
-        self.dicoCourant=self.dicoEtapeCourant
-        s=PythonGenerator.generETAPE(self,obj)
-        obj.valeur=self.dicoEtapeCourant
-        if self.debug: 
-            print "ETAPE : obj.nom = %(v_1)s , obj.valeur= %(v_2)s" % {'v_1': obj.nom, 'v_2': obj.valeur}
-        if obj.nom=="MESHGROUP" : self.generMESHGROUP(obj)
-        if obj.nom=="MATERIAL" : self.generMATERIAL(obj)
-        if obj.nom=="SOURCE" : self.generSOURCE(obj)
-        if obj.nom=="STRANDED_INDUCTOR_GEOMETRY" : self.generSTRANDED_INDUCTOR_GEOMETRY(obj)
-        if obj.nom=="MACRO_GROUPE": self.generMACRO_GROUPE(obj)
-        if obj.nom=="MOUVEMENT" : self.generMOUVEMENT(obj)
-        s=PythonGenerator.generETAPE(self,obj)
-        return s
-
-#----------------------------------------------------------------------------------------
-   def generMACRO_ETAPE(self,obj):
-        """Utilisé par INCLUDE"""
-        dico={}
-        self.dicoEtapeCourant=dico
-        self.dicoCourant=self.dicoEtapeCourant
-        import generator
-        monGenerateur=generator.plugins[nomPlugin]()
-        jdc_aux_texte=monGenerateur.gener(obj.jdc_aux)
-        if self.debug: 
-            print "jdc_aux_texte : %s" % jdc_aux_texte
-
-        # sauvegarde de tous les matériaux trouvés dans les bibliothèques INCLUDE
-        for cle in monGenerateur.dictMaterial:
-            self.dictMaterial[cle] = monGenerateur.dictMaterial[cle]
-        # sauvegarde de toutes les sources trouvées dans les bibliothèques INCLUDE
-        for cle in monGenerateur.dictSource:
-            self.dictSource[cle] = monGenerateur.dictSource[cle]
-
-        print "________FIN MACRO______________________________________"
-        s=PythonGenerator.generMACRO_ETAPE(self,obj)
-        return s
-
-#----------------------------------------------------------------------------------------
-#----------------------------------------------------------------------------------------
-   def generMESHGROUP(self,obj):
-        """preparation de la ligne NAME referencant le groupe de mailles 
-            associe le groupe de mailles au materiau ou a la source utilisateur
-            on sauvegarde aussi les noms des groupes de maillage
-        """
-        try:
-            nomGroupe = obj.getSdname() # nom du groupe de maillage, i.e. nom du concept
-            print "liste des noms sans prefixes %s" %(nomGroupe)
-
-            # test: un et un seul nom de materiau ou source doit etre associe a ce groupe de maillage, via les cles MATERIAL et SOURCE, respectivement.
-            # test sur un seul attribut, non pertinent car il peut y en avoir plusieurs.
-            #assert len(obj.valeur.keys())==1,"Un et un seul nom de materiau ou source doit etre associe a ce groupe du maillage :"+nomGroupe
-
-            # on utilise le fait que obj.valeur est un dictionnaire
-            self.dictGroupes[nomGroupe] = {}   
-            if self.debug: 
-                print "obj.valeur.keys()= %s" % obj.valeur.keys()
-            #if 'MATERIAL' in obj.valeur.keys() and 'SOURCE' in obj.valeur.keys(): # test d'erreur lors de presence de materiau et source a la fois
-            #    raise ValueError,tr(" ce groupe de maillage %s est associe a au moins un materiau  et au moins une source." % nomGroupe)
-            # association a un materiau
-            if 'MATERIAL' in obj.valeur.keys():
-                self.dictGroupes[nomGroupe]['MATERIAL'] = obj.valeur['MATERIAL'].nom # sauvegarde de l'association entre ce groupe de maillage et un materiau ou source, par son nom, i.e. nom du concept du materiau ou de la source
-           #     self.dictGroupes['ordreMateriauxJdC'].append(nomGroupe) # sauvegarde du nom du groupe de maillage associe a un materiau, dans l'ordre du JdC
-            # association a une source
-            if 'SOURCE' in obj.valeur.keys():
-                self.dictGroupes[nomGroupe]['SOURCE'] = obj.valeur['SOURCE'].nom # sauvegarde de l'association entre ce groupe de maillage et un materiau ou source, par son nom, i.e. nom du concept du materiau ou de la source
-            #    self.dictGroupes['ordreSourcesJdC'].append(nomGroupe) # sauvegarde du nom du groupe de maillage associe a une source, dans l'ordre du JdC
-            # erreur ni materiau ni source associee
-            if 'STRANDED_INDUCTOR_GEOMETRY' in obj.valeur.keys():
-                    self.dictGroupes[nomGroupe]['STRANDED_INDUCTOR_GEOMETRY'] = obj.valeur['STRANDED_INDUCTOR_GEOMETRY'].nom # sauvegarde de l'association entre ce groupe de maillage et un materiau ou source, par son nom, i.e. nom du concept du materiau ou de la source
-             #       self.dictGroupes['ordreStrandJdC'].append(nomGroupe) # sauvegarde du nom du groupe de maillage associe a une source, dans l'ordre du JdC
-            if 'CONDITION_LIMITE' in obj.valeur.keys():
-                    self.dictGroupes[nomGroupe]['CONDITION_LIMITE'] = obj.valeur['CONDITION_LIMITE']
-             #       self.dictGroupes['ordreConditionJdC'].append(nomGroupe) 
-            if 'Domaine' in obj.valeur.keys():
-                self.dictGroupes[nomGroupe]['DOMAINE'] = obj.valeur['Domaine']
-            #    self.dictGroupes['ordreDomaineJdC'].append(nomGroupe)
-                texte=""
-                texte+="%s"%(obj.valeur['Domaine'])
-                print"le texte=%s" %(texte)
-                self.dictDomaine[obj.getSdname()]=texte  
-                print "liste des domaines =%s" %(self.dictGroupes[nomGroupe]['DOMAINE'])
-            if 'Potentiel_Flottant' in obj.valeur.keys():
-                self.dictGroupes[nomGroupe]['Potentiel_Flottant'] = True
-            if 'Spire_Exploratrice' in obj.valeur.keys():
-                self.dictGroupes[nomGroupe]['Spire_Exploratrice'] = True
-
-#            else:
-#                raise ValueError, tr("ce groupe de maillage %s n'est associe a aucun materiau, source ou stranded_inductor_geometry." % nomGroupe)
-            if self.debug:
-                print "self.dictGroupes= %s" % repr(self.dictGroupes)
-        except ValueError, err:
-            raise ValueError, str(err)
-
-   def generMACRO_GROUPE(self, obj):
-        """preparation de la ligne NAME referencant le groupe de mailles 
-            associe le groupe de mailles au materiau ou a la source utilisateur
-            on sauvegarde aussi les noms des macros groupes
-        """
-        try:
-            nomMacroGroupe = obj.getSdname() # nom du macro groupe
-            print "liste des noms sans prefixes %s" %(nomMacroGroupe)
-            self.dictMacroGroupes[nomMacroGroupe] = obj.valeur # sauvegarde des propriétés du macro-groupe
-
-            if self.debug: 
-                print "obj.valeur.keys()= %s" % obj.valeur.keys()
-            # association a une source
-            if 'LISTE_MESHGROUP' in obj.valeur.keys(): # test de liste définie dans la macro-groupe, sinon erreur
-                listeGroupesMauvaisFormat = obj.valeur['LISTE_MESHGROUP'] # sauvegarde de l'association entre ce macro groupe et un materiau ou source, par son nom, i.e. nom du concept du materiau ou de la source
-                self.dictMacroGroupes[nomMacroGroupe]['LISTE'] = [] # sauvegarde de l'association entre ce macro groupe et un materiau ou source, par son nom, i.e. nom du concept du materiau ou de la source
-                for groupe in listeGroupesMauvaisFormat: # sauvegarde de la liste au format correct
-                    groupe = groupe.replace("'", "") # suppression des guillement simples
-                    groupe = groupe.replace('"', "") # suppression des guillement doubles
-                    self.dictMacroGroupes[nomMacroGroupe]['LISTE'].append(groupe) # sauvegarde du nom au formatage correct
-            else:
-                raise ValueError, nomMacroGroupe + tr(" : ce MACRO_GROUPE doit contenir une liste de groupes LISTE_MESHGROUP.")
-
-            for nomGroupe in self.dictMacroGroupes[nomMacroGroupe]['LISTE']: # liste des groupes MESHGROUP de ce macro-groupe. On leur associe les propriétés du MACRO_GROUPE
-                for propriete in ('SOURCE', 'MATERIAL',  'STRANDED_INDUCTOR_GEOMETRY'): # liste des propriétés automatiques à copier du MACRO_GROUPE à chaque MESHGROUP de la liste
-                    if  propriete in obj.valeur.keys(): # ce macro-groupe est associé à cette propriété
-                        if self.dictGroupes[nomGroupe].has_key(propriete) and self.dictGroupes[nomGroupe][propriete] != self.dictGroupes[nomGroupe][propriete].nom: # erreur, ce meshgroup a déjà une telle propriéte définie, différente
-                            print u"ERREUR! Conflit entre la %s : %s du MACRO_GROUPE %s et celle : %s du MESHGROUP %s associé à ce macro-groupe." % \
-                             ( propriete, obj.valeur[propriete].nom,  nomMacroGroupe, self.dictGroupes[nomGroupe][propriete],  nomGroupe )
-                            raise ValueError, propriete + ',' + obj.valeur[propriete].nom + ',' + nomMacroGroupe + ',' + self.dictGroupes[nomGroupe][propriete] + ',' +  nomGroupe\
-                            + tr(" : conflit entre la propriete (#1:#2) du MACRO_GROUPE (de nom #3) et celle (#4) du MESHGROUP (#5) associe a ce macro-groupe.")
-                        else : # pas de conflit de cette propriété, alors copie, meme si les propriétés sont les memes pour simplifier
-                            self.dictGroupes[nomGroupe][propriete] = obj.valeur[propriete].nom # sauvegarde du nom de la propriété du macro-groupe dans le meshgroup
-                for propriete in ('CONDITION_LIMITE', ): # liste des propriétés définies à l'avance automatiques à copier du MACRO_GROUPE à chaque MESHGROUP de la liste
-                    if  propriete in obj.valeur.keys(): # ce macro-groupe est associé à cette propriété
-                        if self.dictGroupes[nomGroupe].has_key(propriete) and self.dictGroupes[nomGroupe][propriete] != self.dictGroupes[nomGroupe][propriete]: # erreur, ce meshgroup a déjà une telle propriéte définie, différente
-                            print u"ERREUR! Conflit entre la %s : %s du MACRO_GROUPE %s et celle : %s du MESHGROUP %s associé à ce macro-groupe." % \
-                             ( propriete, obj.valeur[propriete],  nomMacroGroupe, self.dictGroupes[nomGroupe][propriete],  nomGroupe )
-                            raise ValueError, propriete + ',' + obj.valeur[propriete].nom + ',' + nomMacroGroupe + ',' + self.dictGroupes[nomGroupe][propriete] + ',' +  nomGroupe\
-                            + tr(" : conflit entre la propriete (#1:#2) du MACRO_GROUPE (de nom #3) et celle (#4) du MESHGROUP (#5) associe a ce macro-groupe.")
-                        else : # pas de conflit de cette propriété, alors copie, meme si les propriétés sont les memes pour simplifier
-                            self.dictGroupes[nomGroupe][propriete] = obj.valeur[propriete] # sauvegarde du nom de la propriété du macro-groupe dans le meshgroup
-        except ValueError, err:
-            raise ValueError, str(err)
-
-
-   def generSOLVEUR(self, obj):
-        if self.debug:
-            print "generation solveur obj.valeur = %s" % obj.valeur
-        try :
-            self.typeSolveur = obj.valeur['Type']
-            if self.typeSolveur == "Solveur_lineaire" : self.generSOLVEUR_LINEAIRE(obj)
-            if self.typeSolveur == "Solveur_non_lineaire" :
-                self.generSOLVEUR_LINEAIRE(obj)
-                self.generSOLVEUR_NON_LINEAIRE(obj)
-        except ValueError,  err:
-            raise ValueError,  str(err)
-
-   def generSOLVEUR_LINEAIRE(self, obj):
-        if self.debug:
-            print "generation material obj.valeur = %s" % obj.valeur    
-        try :
-            nature = obj.valeur['Methode_lineaire']
-            if nature =="Methode iterative BICGCR" : self.generMETHODE_ITERATIVE_BICGCR(obj)
-            if nature  =="Methode directe MUMPS" : self.generMETHODE_DIRECTE_MUMPS(obj)
-        except ValueError,  err:
-            raise ValueError,  str(err)
-
-   def generMETHODE_ITERATIVE_BICGCR(self, obj):
-        if self.debug: 
-            print "generation methode iterative BICGCR obj.valeur = %s" % obj.valeur
-        self.kEpsilonGCP =  obj.valeur["Precision"]   
-        self.precond=obj.valeur["Preconditionneur"]
-        self.nbIterationMax=obj.valeur["Nombre_iterations_max"]
-
-
-   def generMETHODE_DIRECTE_MUMPS(self, obj):
-        texte=""
-        if self.debug:
-            print "_____________directe_____________"
-
-   def generSOLVEUR_NON_LINEAIRE(self, obj):
-        if self.debug: 
-            print "generation solveur_non_lineaire obj.valeur = %s" % obj.valeur
-        correspondance_methodeNonLineaire = {"Methode de Newton":2,"Methode de substitution":1} # correspondance sur la méthode non-linéaire entre le catalogue et le XML    
-        self.methodeNonLineaire = correspondance_methodeNonLineaire[obj.valeur["Methode_non_lineaire"]]
-        self.kEpsilonNonLinearite=obj.valeur["PrecisionNonLineaire"]
-        self.kCoefficientRelaxation=obj.valeur["Coefficient_de_Relaxation"]
-
-   def generMATERIAL(self,obj):
-        """preparation du bloc correspondant a un materiau du fichier PHYS"""
-        texte=""
-        if self.debug: 
-            print "generation material obj.valeur = %s" % obj.valeur
-        try :
-            nomMaterial = obj.getSdname() 
-            self.dictMaterial[nomMaterial]=obj.valeur
-            print"self.dictMaterial=%s" %(self.dictMaterial)
-        except ValueError, err:
-            raise ValueError, str(err)
-#-------------------------------------------------------------------
-
-   def generSOURCE(self,obj):
-        """preparation du bloc correspondant a une source du fichier PHYS"""
-        if self.debug: 
-            print "generation source obj valeur = %s" % obj.valeur
-        texte=""
-        try :
-            nomSource = obj.getSdname() 
-            self.dictSource[nomSource]=obj.valeur # dictionnaire
-            self.dictSource[nomSource]['milieux'] = [] # liste ordonnée des groupes associés à cette source
-            print"mon dico des sources=%s" %(self.dictSource)
-        except ValueError, err:
-            raise ValueError, str(err)
-
-#---------------------------------------------------------------------------------------
-# traitement fichier PHYS
-#---------------------------------------------------------------------------------------
-   def generBLOC_VERSION(self,obj) :
-      # constitution du bloc VERSION du fichier PHYS
-      # creation d une entite  VERSION ; elle sera du type PROC car decrit ainsi
-      # dans le du catalogue
-      version=obj.addEntite('VERSION',pos=None)
-      self.generPROC_ETAPE(obj.etapes[0])
-      self.texteCarmel3D+="["+obj.etapes[0].nom+"\n"
-      for cle in obj.etapes[0].valeur :
-          self.texteCarmel3D+="   "+cle+" "+str(obj.etapes[0].valeur[cle])+"\n"
-      self.texteCarmel3D+="]\n"
-      # destruction de l entite creee 
-      obj.suppEntite(version)
-      #print 'ERREUR : test erreur boite graphique BLOC_VERSION'
-      #raise ValueError, 'test erreur boite graphique BLOC_VERSION'
-
-
-   def generBLOC_PARAMETERS(self,obj):
-        if self.debug: 
-            print "generation parameters obj.valeur = %s" % obj.valeur    
-
-        self.identification = obj.valeur["Identification_du_Modele"]
-        self.fichierMaillage = obj.valeur["Fichier_maillage"]
-        self.echelleMaillage = obj.valeur["Echelle_du_maillage"]
-        
-        self.kEpsilonDistance=obj.valeur["kEpsilonDistance"] 
-        self.kdistanceRef=obj.valeur["kdistanceRef"] 
-        self.jauge=obj.valeur["Jauge"]
-        self.NBoucleTemps=obj.valeur["Nb_pas_de_temps"]
-        self.dt=obj.valeur["Pas_de_temps"]
-
-        self.repertory=obj.valeur["RepCarmel"]
-        self.fcarmel=obj.valeur["Resoudre_probleme"]
-        self.postprocess=obj.valeur["Realiser_post_traitement_aposteriori"]
-        self.formulation=obj.valeur["Formulation"]
-
-   def generBLOC_SYMETRIE(self, obj): 
-        if self.debug: 
-            print "generation de la symetrie obj.valeur = %s" % obj.valeur  
-
-        try:
-            self.listSymetrie.append(obj.valeur)
-            print"ma liste symetrie =%s" %(self.listSymetrie)
-        except ValueError, err:
-            raise ValueError, str(err)
-#----------------------------------------------------------------------------------------
-
-   def generMOUVEMENT(self, obj):
-        if self.debug:
-            print "generation du mouvement obj.valeur = %s" % obj.valeur
-        
-        try:
-            nom = obj.getSdname()
-            self.nombreMouvements = self.nombreMouvements+1
-            self.dictMouvement[nom] = {'ordre': self.nombreMouvements, 'valeurs': obj.valeur}
-            self.dictMouvement['ordre'].append(nom)
-            if self.debug:
-                print "self.dictMouvement =%s" %(self.dictMouvement)
-                print "self.nombreMouvements =%i" %(self.nombreMouvements)
-        except ValueError,  err:
-            raise valueError,  str(err)
-#----------------------------------------------------------------------------------------
-   def generSTRANDED_INDUCTOR_GEOMETRY(self, obj):
-        """preparation du bloc STRANDED_INDUCTOR_GEOMETRY"""
-        if self.debug: 
-            print "generation strand obj valeur = %s" % obj.valeur
-        try :
-            nomStrand = obj.getSdname() 
-            self.dictStrand[nomStrand]=obj.valeur
-            print"mon dico des stranded inductor geometry=%s" %(self.dictStrand)
-
-        except ValueError, err:
-            raise ValueError, str(err)
-
-   def generPOST_TRAITEMENT(self, obj):
-        if self.debug: 
-            print "generation post traitement obj.valeur = %s" % obj.valeur    
-        self.carteChamp=obj.valeur["Cartes_des_champs"]
-        self.carteCourantInduit=obj.valeur["Cartes_des_courants_induits"]
-        self.carteForce=obj.valeur["Cartes_des_forces"]
-        if obj.valeur.has_key('GLOBAL'):
-            self.post_global = obj.valeur['GLOBAL']
-            # sauvegarde de la liste au format correct, en supprimant les guillemets simples et doubles extra générés par Eficas
-            # car Eficas génère une liste ["'Energie'","'Flux par inducteur'","'Force et couple'"] enrichie
-            # à partir de l'instruction .comm correctement formatée : GLOBAL=('Energie','Flux par inducteur','Force et couple',)
-            for i in range(len(self.post_global)): 
-                self.post_global[i] = self.post_global[i].replace("'", "") # suppression des guillement simples
-                self.post_global[i] = self.post_global[i].replace('"', "") # suppression des guillement doubles
-
-#-------------------------------------
-# Methodes utilitaires
-# ------------------------------------
-   def formateCOMPLEX(self,nbC):
-        """prise en compte des differentes formes de description d un nombre complexe
-        3 formats possibles : 2 listes (anciennement tuples?)  et 1 nombre complexe
-        """
-        if self.debug:
-            print "formatage"
-            print "type : %(type_nb_c)s pour %(nb_c)s" % {'type_nb_c': type(nbC), 'nb_c': nbC}
-        nbformate =""
-        if isinstance(nbC,(tuple,list)):
-            if nbC[0] == "'RI'" :
-                nbformate = "COMPLEX " + str(nbC[1])+" "+str(nbC[2])            
-            if nbC[0] == "'MP'" :
-                nbformate = "POLAR " + str(nbC[1])+" "+str(nbC[2])            
-        else:
-            nbformate = "COMPLEX " + str(nbC.real)+" "+str(nbC.imag)
-        if self.debug: 
-            print "nbformate : %s" % nbformate
-        return nbformate
-
-
diff --git a/generator/oldCodes/generator_CARMEL3D_temporel.py b/generator/oldCodes/generator_CARMEL3D_temporel.py
new file mode 100644 (file)
index 0000000..5c98cb5
--- /dev/null
@@ -0,0 +1,876 @@
+# -*- coding: utf-8 -*-
+# Copyright (C) 2007-2017   EDF R&D
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+"""Ce module contient le plugin generateur de fichier au format  Code_Carmel3D pour EFICAS.
+"""
+
+import xml.etree.cElementTree as ET
+import traceback
+import types,string,re,os
+from Extensions.i18n import tr
+from generator_python import PythonGenerator
+
+# types de problemes
+HARMONIC = 'HARMONIC' # probleme frequentiel
+TIME_DOMAIN = 'TIME_DOMAIN' # probleme temporel
+
+# nom du plugin, utilisé dans entryPoint et generMACRO_ETAPE()
+nomPlugin = 'CARMEL3DTV0'
+
+def entryPoint():
+   """
+      Retourne les informations necessaires pour le chargeur de plugins
+      Ces informations sont retournees dans un dictionnaire
+   """
+   return {
+        # Le nom du plugin
+          'name' : nomPlugin,
+        # La factory pour creer une instance du plugin
+          'factory' : CARMEL3DTV0Generator,
+          }
+
+
+
+class CARMEL3DTV0Generator(PythonGenerator):
+   """
+      Ce generateur parcourt un objet de type JDC et produit
+      un texte au format eficas et 
+      un texte au format attendu par le code Code_Carmel3D (fichier '.PHYS') 
+
+   """
+   # Les extensions de fichier permis?
+   extensions=('.comm',)
+
+#----------------------------------------------------------------------------------------
+   def gener(self,obj,format='brut',config=None):
+
+      self.initDico()
+
+      #self.debug = True
+
+      # Cette instruction genere le contenu du fichier de commandes (persistance)
+      self.text=PythonGenerator.gener(self,obj,format)
+
+      if self.debug:
+         print ("self.text = ", self.text)
+
+      # Cette instruction genere le contenu du fichier de parametres pour le code Carmel3D
+      # si le jdc est valide (sinon cela n a pas de sens)
+      if obj.isValid() : 
+           try :
+             # constitution du bloc VERSION du fichier PHYS (existe toujours)
+             self.generBLOC_VERSION(obj)
+
+           except ValueError as err:
+             raise ValueError(str(err))
+
+      return self.text
+
+
+
+
+#----------------------------------------------------------------------------------------
+# initialisations
+#----------------------------------------------------------------------------------------
+
+   def initDico(self) :
+      self.texteCarmel3D=""
+      self.texteCarmel3D_SH=""      
+      self.debug = True # affichage de messages pour deboguage (.true.) ou non
+      self.dicoEtapeCourant=None
+      self.dicoMCFACTCourant=None
+      self.dicoCourant=None
+      self.dictGroupes = {} # association des noms de groupes de maillage avec les noms de materiaux ou de sources, en sauvegardant l'ordre du JdC en separant les groupes associes a des materiaux de ceux associes a des sources
+      self.dictMacroGroupes = {} # macro-groupe et leurs propriétés
+      self.listSymetrie=[]   
+      self.dictMouvement= {'ordre':[]} # dictionnaire contenant les mouvements, avec liste incluse pour l'ordre
+      self.nombreMouvements = 0 # nombre de mouvements définis, servant de compteur aussi
+      self.dictMaterial={}
+      self.dictSource={}
+      self.dictStrand={}
+      self.dictGroupeMilieux={"ordreSource":[], "ordreId":[]}
+      self.dictDomaine={}
+      # Parametre du maillage
+      self.identification = ""
+      self.fichierMaillage = ""
+      self.echelleMaillage = ""
+      # Parametre de Precision      
+      self.precond=""  
+      self.precisionLineaire=""
+      self.kEpsilonDistance=""
+      self.kdistanceRef=""  
+      self.nbIterationMax=""
+      self.methodeNonLineaire = ""
+      self.kEpsilonNonLinearite=""
+      self.kCoefficientRelaxation=""
+      self.jauge=""
+      self.NBoucleTemps=""
+      self.dt=""
+      # Paramètres divers
+      self.typeSolveur = "" # type de solveur, linéaire (Solveur_lineaire) ou non-linéaire (Solveur_non_lineaire)
+      #Post traitement
+      self.carteChamp="" # liste des pas de temps demandés lors du post-traitement des cartes de champ
+      self.carteCourantInduit="" # liste des pas de temps demandés lors du post-traitement des cartes de courants induits
+      self.carteForce="" # liste des pas de temps demandés lors du post-traitement des cartes de force
+      self.post_global = [] # liste des grandeurs globales demandées lors du post-traitement
+
+      # on force le probleme a etre frequentiel, seul possible en l'etat des choses
+      self.problem = HARMONIC
+
+   def indent(self, elem, level=0, more_sibs=False, espace=4*' '):
+        """Transformation du XML créé par le module interne xml.etree.ElementTree afin d'écrire les indentations et retours à la ligne corrects.
+        D'après un script original de Fredrik Lundh en 2004 (http://effbot.org/zone/element-lib.htm#prettyprint),
+        modifié par Joshua Richardson en 2012 (http://stackoverflow.com/questions/749796/pretty-printing-xml-in-python)
+        et par Loic Chevallier en 2014 (ajout du reglage de l'indentation).
+        L'indentation est de 4 espaces par défaut (cf. argument optionel : espace)
+        Utilisation : self.indent(root), avant écriture dans un fichier de root = ET.Element("configuration") ou de tree = ET.ElementTree(root)
+        où ET = xml.etree.ElementTree
+        """
+        i = "\n"
+        if level:
+            i += (level-1) * espace
+        num_kids = len(elem)
+        if num_kids:
+            if not elem.text or not elem.text.strip():
+                elem.text = i + espace
+                if level:
+                    elem.text += espace
+            count = 0
+            for kid in elem:
+                self.indent(kid, level+1, count < num_kids - 1)
+                count += 1
+            if not elem.tail or not elem.tail.strip():
+                elem.tail = i
+                if more_sibs:
+                    elem.tail += espace
+        else:
+            if level and (not elem.tail or not elem.tail.strip()):
+                elem.tail = i
+                if more_sibs:
+                    elem.tail += espace
+
+#----------------------------------------------------------------------------------------
+# ecriture
+#----------------------------------------------------------------------------------------
+
+   def writeDefault(self,fn) :
+        """Ecrit les fichiers de parametres et le fichier d'execution pour le code Carmel3D"""
+
+        file =  fn[:fn.rfind(".")]  # emplacement du ficher .comm (chemin complet)
+        namefile=os.path.basename(file) # nom du fichier.comm 
+        repertory=os.path.dirname(file) # répertoire contenant le fichier .comm (emplacement absolu)
+
+        # correspondances globales
+        correspondance_booleen = {'oui':'true', 'non':'false'}
+        
+        fileXML = os.path.join(repertory, 'configuration.xml') # nom du fichier de configuration XML (chemin complet)
+        if self.debug: 
+            print ("\necriture du fichier XML : ", fileXML)
+            print ("self.dictMaterial = ",self.dictMaterial)
+            print ("self.dictSource = ",self.dictSource)
+            print ("self.dictGroupes = ",self.dictGroupes)
+            print ("self.dictMacroGroupes = ",self.dictMacroGroupes)
+
+        root = ET.Element("configuration")
+
+        #Bloc <Maillage></Maillage>    
+        Maillage = ET.SubElement(root, "Maillage")
+        identification = ET.SubElement(Maillage, "identification")
+        identification.text = self.identification
+        fichierMaillage = ET.SubElement(Maillage, "fichierMaillage")
+        fichierMaillage.text = self.fichierMaillage
+        echelleMaillage = ET.SubElement(Maillage, "echelleMaillage")
+        correspondance_echelleMaillage = {"Metre":1.0, "Millimetre":1.0e-3}
+        echelleMaillage.text = "%f" % (correspondance_echelleMaillage[self.echelleMaillage], )
+
+        #Bloc <ParametrePrecision></ParametrePrecision>    
+        ParametrePrecision = ET.SubElement(root, "ParametrePrecision")
+        TypeSolveurLineaire = ET.SubElement(ParametrePrecision, "TypeSolveurLineaire")
+        if self.precond=="Crout":
+            TypeSolveurLineaire.text = "1" 
+        if self.precond=="Jacobi":
+            TypeSolveurLineaire.text = "2" 
+        if self.precond=="MUMPS":
+            TypeSolveurLineaire.text = "3"
+        kEpsilonGCP = ET.SubElement(ParametrePrecision, "kEpsilonGCP")
+        kEpsilonGCP.text = "%s" %(self.kEpsilonGCP)
+        nbIterationMax = ET.SubElement(ParametrePrecision, "nbIterationMax")
+        nbIterationMax.text = "%s" %(self.nbIterationMax)        
+        if self.typeSolveur == 'Solveur_non_lineaire': # écriture des paramètres du solveur non-linéaire seulement si défini dans l'étude
+            methodeNonLineaire = ET.SubElement(ParametrePrecision, "methodeNonLineaire")
+            methodeNonLineaire.text = "%s" %(self.methodeNonLineaire)
+            kEpsilonNonLinearite = ET.SubElement(ParametrePrecision, "kEpsilonNonLinearite")        
+            kEpsilonNonLinearite.text = "%s" %(self.kEpsilonNonLinearite)
+            kCoefficientRelaxation = ET.SubElement(ParametrePrecision, "kCoefficientRelaxation")
+            kCoefficientRelaxation.text = "%s" %(self.kCoefficientRelaxation)
+        kEpsilonDistance = ET.SubElement(ParametrePrecision, "kEpsilonDistance")
+        kEpsilonDistance.text = "%s" %(self.kEpsilonDistance)
+        kdistanceRef = ET.SubElement(ParametrePrecision, "kdistanceRef")
+        kdistanceRef.text = "%s" %(self.kdistanceRef)
+        jauge = ET.SubElement(ParametrePrecision, "jauge")
+        jauge.text = "%s" %(correspondance_booleen[self.jauge], )
+        NBoucleTemps = ET.SubElement(ParametrePrecision, "NBoucleTemps")
+        NBoucleTemps.text = "%s" %(self.NBoucleTemps)  
+        dt = ET.SubElement(ParametrePrecision, "dt")
+        dt.text = "%s" %(self.dt)
+
+        #Bloc <Milieux></Milieux>
+        i=0
+        j=0
+        p=0
+        k=0
+        listeMilieux = [] # liste des milieux,  dans l'ordre de création
+        Milieux=ET.SubElement(root, "Milieux") # création du bloc <Milieux>...</Milieux>
+        for nom in self.dictGroupes:  # on parcoure tous les groupes MESHGROUP
+            if self.dictGroupes[nom].has_key('MATERIAL') \
+                or self.dictGroupes[nom].has_key('SOURCE') \
+                or self.dictGroupes[nom].has_key('AIMANT') \
+                or self.dictGroupes[nom].has_key('STRANDED_INDUCTOR_GEOMETRY') : # si MESHGROUP ou MACRO_GROUPE associé à au moins un matériau, source ou géométrie d'inducteur bobiné, c'est un milieu
+                milieu=ET.SubElement(Milieux,"milieu" ) # création d'un nouveau milieu
+                listeMilieux.append(nom) # mise à jour de la liste des milieux
+                i = i+1 # incrément du  numéro de milieu
+                self.dictGroupes[nom]['idMilieu'] = i # affectation de l'id à ce groupe
+                milieu.set("id", "%g" % (i, ) ) # ajout de l'attribut id, inutilisé
+                milieu.set("name", "%s" % (nom, ) ) # ajout de l'attribut name, inutilisé         
+                nomGroupeMaillage = ET.SubElement(milieu, "nomGroupeMaillage") # nom du groupe de maillage
+                nomGroupeMaillage.text = nom
+                if self.dictGroupes[nom].has_key('MATERIAL'): # matériau trouvé pour ce milieu
+                    material = self.dictGroupes[nom]['MATERIAL'] # on récupère le nom de la propriété du matériau, clé de self.dictMaterial
+                    permeabiliteLineaire=ET.SubElement(milieu, "permeabiliteLineaire")
+                    permeabiliteLineaire.text="%s"%(self.dictMaterial[material]["PERMEABILITY"]["VALUE"])
+                    if self.dictMaterial[material]["PERMEABILITY"]["LAW"]=="NONLINEAR":
+                        coefficientsMarrocco=ET.SubElement(milieu, "coefficientsMarrocco")
+                        epsilon = self.dictMaterial[material]["PERMEABILITY"]["EPSILON"]
+                        c = self.dictMaterial[material]["PERMEABILITY"]["C"]
+                        alpha = self.dictMaterial[material]["PERMEABILITY"]["ALPHA"]
+                        tau = self.dictMaterial[material]["PERMEABILITY"]["TAU"]
+                        coefficientsMarrocco.text = '%g, %g, %g, %g' % (epsilon,  c,  alpha,  tau)
+                    if self.dictMaterial[material].has_key('CONDUCTIVITY'):
+                        conductivite=ET.SubElement(milieu, "conductivite")
+                        conductivite.text="%s" %(self.dictMaterial[material]["CONDUCTIVITY"]["VALUE"])
+                    if self.dictMaterial[material].has_key('AIMANT'):
+                        norme=ET.SubElement(milieu, "norme")
+                        norme.text="%s" %(self.dictMaterial[material]["AIMANT"]["VALUE"])
+                if self.dictGroupes[nom].has_key('STRANDED_INDUCTOR_GEOMETRY'): # géométrie d'inducteur bobiné trouvée pour ce milieu
+                    strand=self.dictGroupes[nom]['STRANDED_INDUCTOR_GEOMETRY'] # on récupère le nom de la géométrie d'inducteur bobiné, clé de self.dictStrand
+                    axe = ET.SubElement(milieu, "axe")
+                    axe.text= "%s" % ','.join(map(str,self.dictStrand[strand]["Direction"]))
+                    if self.dictStrand[strand]["Forme"]=="Circulaire":
+                        coordonneesPolaires=ET.SubElement(milieu, "coordonneesPolaires")
+                        coordonneesPolaires.text="true"                        
+                        origineReperePolaire=ET.SubElement(milieu, "origineReperePolaire")
+                        origineReperePolaire.text= "%s" % ','.join(map(str,self.dictStrand[strand]["Centre"]))
+                    section=ET.SubElement(milieu, "section")
+                    section.text="%g" %(self.dictStrand[strand]["Section"], )
+                if self.dictGroupes[nom].has_key('SOURCE'): # source trouvée pour ce milieu
+                        Source = self.dictGroupes[nom]['SOURCE'] # on récupère le nom de la source, clé de self.dictSource
+                        self.dictSource[Source]['milieux'].append(nom) # ajout du nom du groupe à cette source
+                        if self.dictSource[Source].has_key('STRANDED_INDUCTOR'):
+                            nbSpires=ET.SubElement(milieu, "nbSpires")
+                            nbSpires.text="%g" %(self.dictSource[Source]["STRANDED_INDUCTOR"]["NTURNS"])
+                    
+        #Bloc <ConditionsLimitesChamps>...</ConditionsLimitesChamps>
+        ConditionsLimitesChamps = ET.SubElement(root, "ConditionsLimitesChamps")
+        for nomCondition in self.dictGroupes:
+            if self.dictGroupes[nomCondition].has_key('CONDITION_LIMITE'): # condition aux limites associée à ce groupe, hors symétrie et mouvement
+                if self.dictGroupes[nomCondition].has_key('LISTE'): # MACRO_GROUPE
+                    for i in range(len(self.dictGroupes[nomCondition]['LISTE'])):
+                        conditionLimite = ET.SubElement(ConditionsLimitesChamps, "conditionLimitesChamps")
+                        Type=ET.SubElement(conditionLimite,"type" )
+                        Type.text=self.dictGroupes[nomCondition]["CONDITION_LIMITE"]
+                        GroupeNoeud=ET.SubElement(conditionLimite, "groupeNoeud")
+                        GroupeNoeud.text="%s" %(self.dictGroupes[nomCondition]['LISTE'][i])                       
+                else: # MESHGROUP
+                        conditionLimite = ET.SubElement(ConditionsLimitesChamps, "conditionLimitesChamps")
+                        Type=ET.SubElement(conditionLimite,"type" )
+                        Type.text=self.dictGroupes[nomCondition]["CONDITION_LIMITE"]
+                        GroupeNoeud=ET.SubElement(conditionLimite, "groupeNoeud")
+                        GroupeNoeud.text="%s" %(nomCondition)                          
+                
+        for i in range(len(self.listSymetrie)): # symétries, définies dans le bloc des conditions aux limites
+            conditionLimite = ET.SubElement(ConditionsLimitesChamps, "conditionLimitesChamp")
+            Type=ET.SubElement(conditionLimite,"type" )
+            Type.text="%s" %(self.listSymetrie[i]["Type"])
+            GroupeNoeud=ET.SubElement(conditionLimite, "groupeNoeud")
+            GroupeNoeud.text="%s" %(self.listSymetrie[i]["Face1"]) 
+            if 'Face2' in self.listSymetrie[i] :
+                GroupeNoeud2=ET.SubElement(conditionLimite, "groupeNoeud2")
+                GroupeNoeud2.text="%s" %(self.listSymetrie[i]["Face2"])                
+            if 'Mouvement_associe' in self.listSymetrie[i]:    
+                    MouvementAssocie=ET.SubElement(conditionLimite, "mouvementAssocie")
+                    nomMouvementAssocie = self.listSymetrie[i]['Mouvement_associe'].nom # on récupère le nom du mouvement associé, car on a stocké le concept tout entier
+                    MouvementAssocie.text="%i"%(self.dictMouvement[nomMouvementAssocie]['ordre'], )
+            if 'Groupe_Points' in self.listSymetrie[i] :
+                    GroupePoints=ET.SubElement(conditionLimite, "groupePoints")
+                    GroupePoints.text="%s" %(self.listSymetrie[i]['Groupe_Points'])
+
+        #Bloc <TermeSourceElectrique>...</TermeSourceElectrique>
+        TermeSourceElectrique=ET.SubElement(root, "TermeSourceElectrique")
+        i=0 # ?
+        if self.debug: print ('self.dictSource = ',  self.dictSource)
+        for source in self.dictSource.keys(): # parcours des sources
+            if len(self.dictSource[source]['milieux']) > 0: # on continue si au moins un groupe de maillage, i.e., milieux est associé à cette source
+                if self.dictSource[source].has_key('STRANDED_INDUCTOR'): # inducteur bobiné
+                    inducteur=ET.SubElement(TermeSourceElectrique, "inducteur")
+                    listeMilieux=ET.SubElement(inducteur, "listeMilieux") # création de la liste des milieux
+                    idListeMilieux = [] # indices des milieux concernés
+                    for milieu in self.dictSource[source]['milieux']: # construction de la liste des milieux
+                        idListeMilieux.append(self.dictGroupes[milieu]['idMilieu'])
+                    listeMilieux.text = "%s" % ','.join(map(str,idListeMilieux))
+                    if self.dictSource[source]["STRANDED_INDUCTOR"]["TYPE"]=="CURRENT": # source de type courant imposé
+                        couplageTension=ET.SubElement(inducteur, "couplageTension")
+                        couplageTension.text = "false"
+                        courant=ET.SubElement(inducteur, "courant")
+                        if self.dictSource[source]["Signal"]=="WAVEFORM_CONSTANT":
+                            courant.text="%g" %(self.dictSource[source]["WAVEFORM_CONSTANT"]["AMPLITUDE"])
+                        if self.dictSource[source]["Signal"]=="WAVEFORM_SINUS": # écriture des 3 paramètres avec attribut spécial
+                            amplitude = self.dictSource[source]["WAVEFORM_SINUS"]["AMPLITUDE"]
+                            frequence = self.dictSource[source]["WAVEFORM_SINUS"]["FREQUENCY"]
+                            phase = self.dictSource[source]["WAVEFORM_SINUS"]["PHASE"]
+                            courant.text="%g, %g, %g" % (amplitude,  frequence,  phase)
+                            courant.set('forme', 'sinus') # attribut forme="sinus"
+                    if self.dictSource[source]["STRANDED_INDUCTOR"]["TYPE"]=="VOLTAGE": # source de type tension imposée
+                        couplageTension=ET.SubElement(inducteur, "couplageTension")
+                        couplageTension.text = "true"
+                        tension=ET.SubElement(inducteur, "tension")
+                        if self.dictSource[source]["Signal"]=="WAVEFORM_CONSTANT":
+                            tension.text="%g" %(self.dictSource[source]["WAVEFORM_CONSTANT"]["AMPLITUDE"])
+                        if self.dictSource[source]["Signal"]=="WAVEFORM_SINUS": # écriture des 3 paramètres avec attribut spécial
+                            amplitude = self.dictSource[source]["WAVEFORM_SINUS"]["AMPLITUDE"]
+                            frequence = self.dictSource[source]["WAVEFORM_SINUS"]["FREQUENCY"]
+                            phase = self.dictSource[source]["WAVEFORM_SINUS"]["PHASE"]
+                            tension.text="%g, %g, %g" % (amplitude,  frequence,  phase)
+                            tension.set('forme', 'sinus') # attribut forme="sinus"
+                        if self.dictSource[source]["STRANDED_INDUCTOR"].has_key('Resistance'):
+                            resistance=ET.SubElement(inducteur, "resistance")
+                            resistance.text="%g" %(self.dictSource[source]["STRANDED_INDUCTOR"]['Resistance'])
+
+        #definir Terme Source Magnetique
+        #definirTermeSourceMagnetique=ET.SubElement(root, "definirTermeSourceMagnetique")
+        #nombreTermeSourceMagnetique=ET.SubElement(definirTermeSourceMagnetique, "nombreTermeSourceMagnetique")
+        #nombreTermeSourceMagnetique.text="0"
+        
+        #definir Aimants
+        #definirAimants=ET.SubElement(root, "definirAimants")
+        #nombreAimants=ET.SubElement(definirAimants, "nombreAimants")
+        #nombreAimants.text="0"
+        
+        #Bloc <Mouvements>...</Mouvements>
+        i = 0
+        Mouvements=ET.SubElement(root, "Mouvements")
+        for nom in self.dictMouvement['ordre']: # parcours de la liste des noms de mouvement définis, dans l'ordre
+            i = i+1
+            mouvement = ET.SubElement(Mouvements, "mouvement") # création de ce mouvement
+            mouvement.set("id", "%g" % (i, ) ) # ajout de l'attribut id, inutilisé
+            mouvement.set("name", nom ) # ajout de l'attribut name, inutilisé
+            milieuGlissement = ET.SubElement(mouvement, "milieuGlissement")
+            nomMilieuGlissement = self.dictMouvement[nom]['valeurs']['Milieu_glissement'].nom  # concept stocké -> nom du concept
+            milieuGlissement.text="%i" % (self.dictGroupes[nomMilieuGlissement]['idMilieu'], ) # numéro du milieu défini par son nom, selon tableaux remplis précédemment
+            surfaceGlissement = ET.SubElement(mouvement, "surfaceGlissement")
+            surfaceGlissement.text= self.dictMouvement[nom]['valeurs']['Surface_glissement'].nom # concept stocké -> nom du concept
+            deltaMaillage = ET.SubElement(mouvement, "deltaMaillage")
+            deltaMaillage.text="%g" % (self.dictMouvement[nom]['valeurs']['Delta_maillage'], )
+            nbPermutPas = ET.SubElement(mouvement, "nbPermutPas")
+            nbPermutPas.text="%i" % (self.dictMouvement[nom]['valeurs']['Nombre_pas_permutation'], )
+            axeRotation = ET.SubElement(mouvement, "axeRotation")
+            axeRotation.text= self.dictMouvement[nom]['valeurs']['Axe_rotation']
+
+        #definir Force Couple
+        #definirForceCouple=ET.SubElement(root, "definirForceCouple")
+        #nombreForceCouple=ET.SubElement(definirForceCouple, "nombreForceCouple")
+        #nombreForceCouple.text="0"
+        
+        #bloc <SpiresExploratrices></SpiresExploratrices>
+        i = 0 # compteur de spires
+        spiresExploratrices = False # pas de spires exploratrices a priori
+        for nom in self.dictGroupes.keys(): # recherche des spires exploratrices définies dans les MESHGROUP
+            if self.dictGroupes[nom].has_key('Spire_Exploratrice'):
+                spiresExploratrices  = True
+        if spiresExploratrices: # on a trouvé au moins une spire exploratrice
+            SpiresExploratrices=ET.SubElement(root, "SpiresExploratrices") # création du bloc XML adéquat
+        for nom in self.dictGroupes.keys(): # recherche des spires exploratrices définies dans les MESHGROUP
+            if self.dictGroupes[nom].has_key('Spire_Exploratrice'):
+                spire = ET.SubElement(SpiresExploratrices, "spireExploratrice") # création du bloc XML pour cette spire
+                spire.text = nom # le nom du groupe de noeud est directement écrit
+                i = i+1 # incrément du  numéro de spire
+                spire.set("id", "%g" % (i, ) ) # ajout de l'attribut id, inutilisé
+                spire.set("name", "%s" % (nom, ) ) # ajout de l'attribut name, inutilisé         
+
+        #bloc <PotentielsFlottants></PotentielsFlottants>
+        i = 0 # compteur de potentiels flottants
+        potentielsFlottants = False # pas de potentiel flottant a priori
+        for nom in self.dictGroupes.keys(): # recherche des potentiels flottants définis dans les MESHGROUP
+            if self.dictGroupes[nom].has_key('Potentiel_Flottant'):
+                potentielsFlottants  = True
+        if potentielsFlottants: # on a trouvé au moins un potentiel flottant
+            PotentielsFlottants=ET.SubElement(root, "PotentielsFlottants") # création du bloc XML adéquat
+        for nom in self.dictGroupes.keys(): # recherche des potentiels flottants définis dans les MESHGROUP
+            if self.dictGroupes[nom].has_key('Potentiel_Flottant'):
+                potentielFlottant = ET.SubElement(PotentielsFlottants, "potentielFlottant") # création du bloc XML pour ce potentiel flottant
+                potentielFlottant.text = nom # le nom du groupe de noeud est directement écrit
+                i = i+1 # incrément du  numéro de spire
+                potentielFlottant.set("id", "%g" % (i, ) ) # ajout de l'attribut id, inutilisé
+                potentielFlottant.set("name", "%s" % (nom, ) ) # ajout de l'attribut name, inutilisé         
+                
+
+        #Definir Post traitement
+        postraitement=ET.SubElement(root, "postraitement")
+        # Ecriture des cartes de champ
+        carteChamp=ET.SubElement(postraitement, "carteChamp")
+        if type(self.carteChamp)==float:
+            carteChamp.text="%s" %(self.carteChamp)
+        else:
+            carteChamp.text="%s" % ','.join(map(str,self.carteChamp))
+        # Ecriture des cartes de courants induits
+        carteCourantInduit=ET.SubElement(postraitement, "carteCourantInduit")
+        if type(self.carteCourantInduit)==float:
+            carteCourantInduit.text="%s" %(self.carteCourantInduit)        
+        else:
+            carteCourantInduit.text="%s" % ','.join(map(str,self.carteCourantInduit))
+        # Ecriture des cartes de force
+        carteForce=ET.SubElement(postraitement, "carteForce")
+        if type(self.carteForce)==float:
+            carteForce.text="%s" %(self.carteForce)            
+        else:
+            carteForce.text="%s" % ','.join(map(str,self.carteForce))
+        # Sortie des grandeurs globales, enregistrées dans self.post_global
+        # liste de correspondance entre la valeur du catalogue et le nom de la balise XML
+        # sous forme ordonnée (nomXML, valeur catalogue) 
+        correspondance_global = (('energie',  "Energie"),\
+                                                   ('perteJoule', "Pertes Joules"),\
+                                                   ('fluxInducteur', "Flux par inducteur"),\
+                                                   ('courantInducteur', "Courants par inducteur"),\
+                                                   ('tensionInducteur', "Tensions par inducteur"), \
+                                                   ('forceCouple', "Force et couple"),\
+                                                   ('fluxSpire', "Flux par spire exploratrice"),\
+                                                   ('fluxGroupe', "Flux par groupe"),\
+                                                   ('ddpElect', "Tensions electriques"),\
+                                                   ('ddpMagn', "DDP magnetiques"), \
+                                                   ('fluxMagn', "Flux magnetiques"),\
+                                                   ('fluxJinduitTotal', "Flux J induit"),\
+                                                   ('potFlottant', "Potentiel flottant"))
+        # Sortie des grandeurs demandées seulement (true)
+        for table in correspondance_global:
+            if table[1] in self.post_global:
+                post_global_item=ET.SubElement(postraitement, table[0])
+                post_global_item.text = "true"
+#        # Sortie de toutes les grandeurs possibles, avec la valeur true pour celles demandées et false sinon
+#        for table in correspondance_global:
+#            post_global_item=ET.SubElement(postraitement, table[0])
+#            if table[1] in self.post_global:
+#                post_global_item.text = "true"
+#            else:
+#                post_global_item.text = "false"
+
+        self.indent(root) # indentations et retours à la ligne, à l'aide d'une fonction maison, car xml.etree.ElementTree ne sait pas faire et le module lxml n'est pas disponible dans Salomé
+
+        tree = ET.ElementTree(root)
+
+        tree.write(fileXML, encoding="UTF-8")
+
+       # print "le dico complet=%s" %(self.dictGroupes)
+
+        if self.debug: 
+            print ("ecriture du fichier d'execution (SH)")
+        RepCarmel=os.path.join(repertory,"lancer.sh")
+        f = open( RepCarmel, 'wb')
+        self.texteCarmel3D_SH+='cd ' + repertory + ' \n'
+        self.texteCarmel3D_SH+='./carmel << FIN\n'
+        correspondance_resolution = {"(T-)Omega seulement":"1\n","A(-Phi) seulement":"2\n", "(T-)Omega puis A(-Phi)":"1\n2\n", "A(-Phi) puis (T-)Omega":"2\n1\n"}
+        self.texteCarmel3D_SH+= correspondance_resolution[self.formulation]
+        self.texteCarmel3D_SH+='0\nFIN\n'
+        f.write(self.texteCarmel3D_SH)
+        f.close()      
+
+
+#----------------------------------------------------------------------------------------
+#  analyse de chaque noeud de l'arbre 
+#----------------------------------------------------------------------------------------
+
+   def generMCSIMP(self,obj) :
+        """recuperation de l objet MCSIMP"""
+        if self.debug: 
+            print ("MCSIMP", obj.nom, obj.valeur)
+        s=PythonGenerator.generMCSIMP(self,obj)
+        try:
+            self.dicoCourant[obj.nom]=obj.valeurFormatee
+        except:
+            print ("Oubli des messages texte homo='information'")
+        return s
+
+
+#----------------------------------------------------------------------------------------
+   def generMCFACT(self,obj) :
+        """recuperation de l objet MCFACT"""
+        dico={}
+        self.dicoMCFACTCourant=dico
+        self.dicoCourant=self.dicoMCFACTCourant
+        s=PythonGenerator.generMCFACT(self,obj)
+        self.dicoEtapeCourant[obj.nom]=self.dicoMCFACTCourant
+        self.dicoMCFACTCourant=None
+        self.dicoCourant=self.dicoEtapeCourant
+        return s
+
+
+#----------------------------------------------------------------------------------------
+   def generPROC_ETAPE(self,obj):
+        """analyse des PROC du catalogue  ( VERSION )"""
+        dico={}
+        self.dicoEtapeCourant=dico
+        self.dicoCourant=self.dicoEtapeCourant
+        s=PythonGenerator.generPROC_ETAPE(self,obj)
+        obj.valeur=self.dicoEtapeCourant
+
+        if self.debug: 
+            print ("PROC_ETAPE " ,obj.nom, str(obj.valeur))
+        s=PythonGenerator.generPROC_ETAPE(self,obj)
+        if obj.nom=="PARAMETERS" : self.generBLOC_PARAMETERS(obj)
+        if obj.nom=="SOLVEUR" : self.generSOLVEUR(obj)
+        if obj.nom=="SYMETRIE" : self.generBLOC_SYMETRIE(obj)
+        if obj.nom=="POST_TRAITEMENT" : self.generPOST_TRAITEMENT(obj)
+        return s
+
+
+
+#----------------------------------------------------------------------------------------
+   def generETAPE(self,obj):
+        """analyse des OPER du catalogue"""
+        dico={}
+        self.dicoEtapeCourant=dico
+        self.dicoCourant=self.dicoEtapeCourant
+        s=PythonGenerator.generETAPE(self,obj)
+        obj.valeur=self.dicoEtapeCourant
+        if self.debug: 
+            print ("ETAPE " ,obj.nom, str(obj.valeur))
+        if obj.nom=="MESHGROUP" : self.generMESHGROUP(obj)
+        if obj.nom=="MATERIAL" : self.generMATERIAL(obj)
+        if obj.nom=="SOURCE" : self.generSOURCE(obj)
+        if obj.nom=="STRANDED_INDUCTOR_GEOMETRY" : self.generSTRANDED_INDUCTOR_GEOMETRY(obj)
+        if obj.nom=="MACRO_GROUPE": self.generMACRO_GROUPE(obj)
+        if obj.nom=="MOUVEMENT" : self.generMOUVEMENT(obj)
+        s=PythonGenerator.generETAPE(self,obj)
+        return s
+
+#----------------------------------------------------------------------------------------
+   def generMACRO_ETAPE(self,obj):
+        """Utilisé par INCLUDE"""
+        dico={}
+        self.dicoEtapeCourant=dico
+        self.dicoCourant=self.dicoEtapeCourant
+        import generator
+        monGenerateur=generator.plugins[nomPlugin]()
+        jdc_aux_texte=monGenerateur.gener(obj.jdc_aux)
+        if self.debug: 
+            print ("jdc_aux_texte : ", jdc_aux_texte)
+
+        # sauvegarde de tous les matériaux trouvés dans les bibliothèques INCLUDE
+        for cle in monGenerateur.dictMaterial:
+            self.dictMaterial[cle] = monGenerateur.dictMaterial[cle]
+        # sauvegarde de toutes les sources trouvées dans les bibliothèques INCLUDE
+        for cle in monGenerateur.dictSource:
+            self.dictSource[cle] = monGenerateur.dictSource[cle]
+
+        print ("________FIN MACRO______________________________________")
+        s=PythonGenerator.generMACRO_ETAPE(self,obj)
+        return s
+
+#----------------------------------------------------------------------------------------
+#----------------------------------------------------------------------------------------
+   def generMESHGROUP(self,obj):
+        """preparation de la ligne NAME referencant le groupe de mailles 
+            associe le groupe de mailles au materiau ou a la source utilisateur
+            on sauvegarde aussi les noms des groupes de maillage
+        """
+        try:
+            nomGroupe = obj.getSdname() # nom du groupe de maillage, i.e. nom du concept
+            print ("liste des noms sans prefixes", nomGroupe)
+
+            # test: un et un seul nom de materiau ou source doit etre associe a ce groupe de maillage, via les cles MATERIAL et SOURCE, respectivement.
+            # test sur un seul attribut, non pertinent car il peut y en avoir plusieurs.
+            #assert len(obj.valeur.keys())==1,"Un et un seul nom de materiau ou source doit etre associe a ce groupe du maillage :"+nomGroupe
+
+            # on utilise le fait que obj.valeur est un dictionnaire
+            self.dictGroupes[nomGroupe] = {}   
+            if self.debug: 
+                print ("obj.valeur.keys()" , obj.valeur.keys())
+            #if 'MATERIAL' in obj.valeur.keys() and 'SOURCE' in obj.valeur.keys(): # test d'erreur lors de presence de materiau et source a la fois
+            #    raise ValueError,tr(" ce groupe de maillage %s est associe a au moins un materiau  et au moins une source." % nomGroupe)
+            # association a un materiau
+            if 'MATERIAL' in obj.valeur.keys():
+                self.dictGroupes[nomGroupe]['MATERIAL'] = obj.valeur['MATERIAL'].nom # sauvegarde de l'association entre ce groupe de maillage et un materiau ou source, par son nom, i.e. nom du concept du materiau ou de la source
+           #     self.dictGroupes['ordreMateriauxJdC'].append(nomGroupe) # sauvegarde du nom du groupe de maillage associe a un materiau, dans l'ordre du JdC
+            # association a une source
+            if 'SOURCE' in obj.valeur.keys():
+                self.dictGroupes[nomGroupe]['SOURCE'] = obj.valeur['SOURCE'].nom # sauvegarde de l'association entre ce groupe de maillage et un materiau ou source, par son nom, i.e. nom du concept du materiau ou de la source
+            #    self.dictGroupes['ordreSourcesJdC'].append(nomGroupe) # sauvegarde du nom du groupe de maillage associe a une source, dans l'ordre du JdC
+            # erreur ni materiau ni source associee
+            if 'STRANDED_INDUCTOR_GEOMETRY' in obj.valeur.keys():
+                    self.dictGroupes[nomGroupe]['STRANDED_INDUCTOR_GEOMETRY'] = obj.valeur['STRANDED_INDUCTOR_GEOMETRY'].nom # sauvegarde de l'association entre ce groupe de maillage et un materiau ou source, par son nom, i.e. nom du concept du materiau ou de la source
+             #       self.dictGroupes['ordreStrandJdC'].append(nomGroupe) # sauvegarde du nom du groupe de maillage associe a une source, dans l'ordre du JdC
+            if 'CONDITION_LIMITE' in obj.valeur.keys():
+                    self.dictGroupes[nomGroupe]['CONDITION_LIMITE'] = obj.valeur['CONDITION_LIMITE']
+             #       self.dictGroupes['ordreConditionJdC'].append(nomGroupe) 
+            if 'Domaine' in obj.valeur.keys():
+                self.dictGroupes[nomGroupe]['DOMAINE'] = obj.valeur['Domaine']
+            #    self.dictGroupes['ordreDomaineJdC'].append(nomGroupe)
+                texte=""
+                texte+="%s"%(obj.valeur['Domaine'])
+                print ("le texte=", texte)
+                self.dictDomaine[obj.getSdname()]=texte  
+                print ("liste des domaines " ,self.dictGroupes[nomGroupe]['DOMAINE'])
+            if 'Potentiel_Flottant' in obj.valeur.keys():
+                self.dictGroupes[nomGroupe]['Potentiel_Flottant'] = True
+            if 'Spire_Exploratrice' in obj.valeur.keys():
+                self.dictGroupes[nomGroupe]['Spire_Exploratrice'] = True
+
+#            else:
+#                raise ValueError, tr("ce groupe de maillage %s n'est associe a aucun materiau, source ou stranded_inductor_geometry." % nomGroupe)
+            if self.debug:
+                print ("self.dictGroupes" , repr(self.dictGroupes))
+        except ValueError as err:
+            raise ValueError (str(err))
+
+   def generMACRO_GROUPE(self, obj):
+        """preparation de la ligne NAME referencant le groupe de mailles 
+            associe le groupe de mailles au materiau ou a la source utilisateur
+            on sauvegarde aussi les noms des macros groupes
+        """
+        try:
+            nomMacroGroupe = obj.getSdname() # nom du macro groupe
+            print ("liste des noms sans prefixes " ,nomMacroGroupe)
+            self.dictMacroGroupes[nomMacroGroupe] = obj.valeur # sauvegarde des propriétés du macro-groupe
+
+            if self.debug: 
+                print ("obj.valeur.keys()" , obj.valeur.keys())
+            # association a une source
+            if 'LISTE_MESHGROUP' in obj.valeur.keys(): # test de liste définie dans la macro-groupe, sinon erreur
+                listeGroupesMauvaisFormat = obj.valeur['LISTE_MESHGROUP'] # sauvegarde de l'association entre ce macro groupe et un materiau ou source, par son nom, i.e. nom du concept du materiau ou de la source
+                self.dictMacroGroupes[nomMacroGroupe]['LISTE'] = [] # sauvegarde de l'association entre ce macro groupe et un materiau ou source, par son nom, i.e. nom du concept du materiau ou de la source
+                for groupe in listeGroupesMauvaisFormat: # sauvegarde de la liste au format correct
+                    groupe = groupe.replace("'", "") # suppression des guillement simples
+                    groupe = groupe.replace('"', "") # suppression des guillement doubles
+                    self.dictMacroGroupes[nomMacroGroupe]['LISTE'].append(groupe) # sauvegarde du nom au formatage correct
+            else:
+                raise ValueError (tr(" : ce MACRO_GROUPE doit contenir une liste de groupes LISTE_MESHGROUP."))
+
+            for nomGroupe in self.dictMacroGroupes[nomMacroGroupe]['LISTE']: # liste des groupes MESHGROUP de ce macro-groupe. On leur associe les propriétés du MACRO_GROUPE
+                for propriete in ('SOURCE', 'MATERIAL',  'STRANDED_INDUCTOR_GEOMETRY'): # liste des propriétés automatiques à copier du MACRO_GROUPE à chaque MESHGROUP de la liste
+                    if  propriete in obj.valeur.keys(): # ce macro-groupe est associé à cette propriété
+                        if self.dictGroupes[nomGroupe].has_key(propriete) and self.dictGroupes[nomGroupe][propriete] != self.dictGroupes[nomGroupe][propriete].nom: # erreur, ce meshgroup a déjà une telle propriéte définie, différente
+                            print ("ERREUR! Conflit entre la  MACRO_GROUPE et celle :  du MESHGROUP  associé à ce macro-groupe." ,\
+                             ( propriete, obj.valeur[propriete].nom,  nomMacroGroupe, self.dictGroupes[nomGroupe][propriete],  nomGroupe ))
+                            raise ValueError( propriete + ',' + obj.valeur[propriete].nom + ',' + nomMacroGroupe + ',' + self.dictGroupes[nomGroupe][propriete] + ',' +  nomGroupe\
+                            + tr(" : conflit entre la propriete (#1:#2) du MACRO_GROUPE (de nom #3) et celle (#4) du MESHGROUP (#5) associe a ce macro-groupe."))
+                        else : # pas de conflit de cette propriété, alors copie, meme si les propriétés sont les memes pour simplifier
+                            self.dictGroupes[nomGroupe][propriete] = obj.valeur[propriete].nom # sauvegarde du nom de la propriété du macro-groupe dans le meshgroup
+                for propriete in ('CONDITION_LIMITE', ): # liste des propriétés définies à l'avance automatiques à copier du MACRO_GROUPE à chaque MESHGROUP de la liste
+                    if  propriete in obj.valeur.keys(): # ce macro-groupe est associé à cette propriété
+                        if self.dictGroupes[nomGroupe].has_key(propriete) and self.dictGroupes[nomGroupe][propriete] != self.dictGroupes[nomGroupe][propriete]: # erreur, ce meshgroup a déjà une telle propriéte définie, différente
+                            print ("ERREUR! Conflit entre la  MACRO_GROUPE et celle :  du MESHGROUP  associé à ce macro-groupe.") 
+                             #( propriete, obj.valeur[propriete],  nomMacroGroupe, self.dictGroupes[nomGroupe][propriete],  nomGroupe )
+                            #raise ValueError( propriete + ',' + obj.valeur[propriete].nom + ',' + nomMacroGroupe + ',' + self.dictGroupes[nomGroupe][propriete] + ',' +  nomGroupe\
+                            #+ tr(" : conflit entre la propriete (#1:#2) du MACRO_GROUPE (de nom #3) et celle (#4) du MESHGROUP (#5) associe a ce macro-groupe."))
+                            raise ValueError()
+                        else : # pas de conflit de cette propriété, alors copie, meme si les propriétés sont les memes pour simplifier
+                            self.dictGroupes[nomGroupe][propriete] = obj.valeur[propriete] # sauvegarde du nom de la propriété du macro-groupe dans le meshgroup
+        except ValueError as err:
+            raise ValueError( str(err))
+
+
+   def generSOLVEUR(self, obj):
+        if self.debug:
+            print ("generation solveur", obj.valeur )
+        try :
+            self.typeSolveur = obj.valeur['Type']
+            if self.typeSolveur == "Solveur_lineaire" : self.generSOLVEUR_LINEAIRE(obj)
+            if self.typeSolveur == "Solveur_non_lineaire" :
+                self.generSOLVEUR_LINEAIRE(obj)
+                self.generSOLVEUR_NON_LINEAIRE(obj)
+        except ValueError as  err:
+            raise ValueError( str(err))
+
+   def generSOLVEUR_LINEAIRE(self, obj):
+        if self.debug:
+            print ("generation material" , obj.valeur    )
+        try :
+            nature = obj.valeur['Methode_lineaire']
+            if nature =="Methode iterative BICGCR" : self.generMETHODE_ITERATIVE_BICGCR(obj)
+            if nature  =="Methode directe MUMPS" : self.generMETHODE_DIRECTE_MUMPS(obj)
+        except ValueError as  err:
+            raise ValueError( str(err))
+
+   def generMETHODE_ITERATIVE_BICGCR(self, obj):
+        if self.debug: 
+            print ("generation methode iterative BICGCR " , obj.valeur)
+        self.kEpsilonGCP =  obj.valeur["Precision"]   
+        self.precond=obj.valeur["Preconditionneur"]
+        self.nbIterationMax=obj.valeur["Nombre_iterations_max"]
+
+
+   def generMETHODE_DIRECTE_MUMPS(self, obj):
+        texte=""
+        if self.debug:
+            print ("_____________directe_____________")
+
+   def generSOLVEUR_NON_LINEAIRE(self, obj):
+        if self.debug: 
+            print ("generation solveur_non_lineaire",  obj.valeur)
+        correspondance_methodeNonLineaire = {"Methode de Newton":2,"Methode de substitution":1} # correspondance sur la méthode non-linéaire entre le catalogue et le XML    
+        self.methodeNonLineaire = correspondance_methodeNonLineaire[obj.valeur["Methode_non_lineaire"]]
+        self.kEpsilonNonLinearite=obj.valeur["PrecisionNonLineaire"]
+        self.kCoefficientRelaxation=obj.valeur["Coefficient_de_Relaxation"]
+
+   def generMATERIAL(self,obj):
+        """preparation du bloc correspondant a un materiau du fichier PHYS"""
+        texte=""
+        if self.debug: 
+            print ("generation material obj.valeur" , obj.valeur)
+        try :
+            nomMaterial = obj.getSdname() 
+            self.dictMaterial[nomMaterial]=obj.valeur
+            print ("self.dictMaterial=" ,self.dictMaterial)
+        except ValueError as  err:
+            raise ValueError( str(err))
+#-------------------------------------------------------------------
+
+   def generSOURCE(self,obj):
+        """preparation du bloc correspondant a une source du fichier PHYS"""
+        if self.debug: 
+            print ("generation source obj valeur " , obj.valeur)
+        texte=""
+        try :
+            nomSource = obj.getSdname() 
+            self.dictSource[nomSource]=obj.valeur # dictionnaire
+            self.dictSource[nomSource]['milieux'] = [] # liste ordonnée des groupes associés à cette source
+            print ("mon dico des sources=" ,self.dictSource)
+        except ValueError as  err:
+            raise ValueError( str(err))
+
+#---------------------------------------------------------------------------------------
+# traitement fichier PHYS
+#---------------------------------------------------------------------------------------
+   def generBLOC_VERSION(self,obj) :
+      # constitution du bloc VERSION du fichier PHYS
+      # creation d une entite  VERSION ; elle sera du type PROC car decrit ainsi
+      # dans le du catalogue
+      version=obj.addEntite('VERSION',pos=None)
+      self.generPROC_ETAPE(obj.etapes[0])
+      self.texteCarmel3D+="["+obj.etapes[0].nom+"\n"
+      for cle in obj.etapes[0].valeur :
+          self.texteCarmel3D+="   "+cle+" "+str(obj.etapes[0].valeur[cle])+"\n"
+      self.texteCarmel3D+="]\n"
+      # destruction de l entite creee 
+      obj.suppEntite(version)
+      #print 'ERREUR : test erreur boite graphique BLOC_VERSION'
+      #raise ValueError, 'test erreur boite graphique BLOC_VERSION'
+
+
+   def generBLOC_PARAMETERS(self,obj):
+        if self.debug: 
+            print ("generation parameters " , obj.valeur    )
+
+        self.identification = obj.valeur["Identification_du_Modele"]
+        self.fichierMaillage = obj.valeur["Fichier_maillage"]
+        self.echelleMaillage = obj.valeur["Echelle_du_maillage"]
+        
+        self.kEpsilonDistance=obj.valeur["kEpsilonDistance"] 
+        self.kdistanceRef=obj.valeur["kdistanceRef"] 
+        self.jauge=obj.valeur["Jauge"]
+        self.NBoucleTemps=obj.valeur["Nb_pas_de_temps"]
+        self.dt=obj.valeur["Pas_de_temps"]
+
+        self.repertory=obj.valeur["RepCarmel"]
+        self.fcarmel=obj.valeur["Resoudre_probleme"]
+        self.postprocess=obj.valeur["Realiser_post_traitement_aposteriori"]
+        self.formulation=obj.valeur["Formulation"]
+
+   def generBLOC_SYMETRIE(self, obj): 
+        if self.debug: 
+            print ("generation de la symetrie obj.valeur " , obj.valeur  )
+
+        try:
+            self.listSymetrie.append(obj.valeur)
+        except ValueError as  err:
+            raise ValueError( str(err))
+#----------------------------------------------------------------------------------------
+
+   def generMOUVEMENT(self, obj):
+        if self.debug:
+            print ("generation du mouvement obj.valeur " , obj.valeur  )
+        
+        try:
+            nom = obj.getSdname()
+            self.nombreMouvements = self.nombreMouvements+1
+            self.dictMouvement[nom] = {'ordre': self.nombreMouvements, 'valeurs': obj.valeur}
+            self.dictMouvement['ordre'].append(nom)
+            if self.debug:
+                print ("self.dictMouvement " ,self.dictMouvement)
+                print ("self.nombreMouvements " ,self.nombreMouvements)
+        except ValueError as  err:
+            raise valueError(  str(err))
+#----------------------------------------------------------------------------------------
+   def generSTRANDED_INDUCTOR_GEOMETRY(self, obj):
+        """preparation du bloc STRANDED_INDUCTOR_GEOMETRY"""
+        if self.debug: 
+            print ("generation strand obj valeur =" , obj.valeur)
+        try :
+            nomStrand = obj.getSdname() 
+            self.dictStrand[nomStrand]=obj.valeur
+            print ("mon dico des stranded inductor geometry" ,self.dictStrand)
+
+        except ValueError as  err:
+            raise valueError(  str(err))
+
+   def generPOST_TRAITEMENT(self, obj):
+        if self.debug: 
+            print ("generation post traitement obj.valeur " , obj.valeur    )
+        self.carteChamp=obj.valeur["Cartes_des_champs"]
+        self.carteCourantInduit=obj.valeur["Cartes_des_courants_induits"]
+        self.carteForce=obj.valeur["Cartes_des_forces"]
+        if obj.valeur.has_key('GLOBAL'):
+            self.post_global = obj.valeur['GLOBAL']
+            # sauvegarde de la liste au format correct, en supprimant les guillemets simples et doubles extra générés par Eficas
+            # car Eficas génère une liste ["'Energie'","'Flux par inducteur'","'Force et couple'"] enrichie
+            # à partir de l'instruction .comm correctement formatée : GLOBAL=('Energie','Flux par inducteur','Force et couple',)
+            for i in range(len(self.post_global)): 
+                self.post_global[i] = self.post_global[i].replace("'", "") # suppression des guillement simples
+                self.post_global[i] = self.post_global[i].replace('"', "") # suppression des guillement doubles
+
+#-------------------------------------
+# Methodes utilitaires
+# ------------------------------------
+   def formateCOMPLEX(self,nbC):
+        """prise en compte des differentes formes de description d un nombre complexe
+        3 formats possibles : 2 listes (anciennement tuples?)  et 1 nombre complexe
+        """
+        if self.debug:
+            print ("formatage")
+        nbformate =""
+        if isinstance(nbC,(tuple,list)):
+            if nbC[0] == "'RI'" :
+                nbformate = "COMPLEX " + str(nbC[1])+" "+str(nbC[2])            
+            if nbC[0] == "'MP'" :
+                nbformate = "POLAR " + str(nbC[1])+" "+str(nbC[2])            
+        else:
+            nbformate = "COMPLEX " + str(nbC.real)+" "+str(nbC.imag)
+        if self.debug: 
+            print ("nbformate " , nbformate)
+        return nbformate
+
+
diff --git a/generator/oldCodes/oldGenerator_CARMEL3D_frequentiel.py b/generator/oldCodes/oldGenerator_CARMEL3D_frequentiel.py
new file mode 100755 (executable)
index 0000000..2bc21ca
--- /dev/null
@@ -0,0 +1,1444 @@
+# -*- coding: utf-8 -*-
+# Copyright (C) 2007-2017   EDF R&D
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+"""Ce module contient le plugin generateur de fichier au format  Code_Carmel3D pour EFICAS.
+"""
+
+import traceback
+import types,string,re,os
+from Extensions.i18n import tr
+from generator_python import PythonGenerator
+
+# Groupes de mailles dont les types sont definis par des prefixes dans leur nom
+usePrefix = False # les noms ont des prefixes (True) ou non (False)
+# liste des prefixes des groupes de mailles, sans le caractere _ separant le prefixe du reste du nom
+# Ce prefixe (et caractere _) doivent etre supprimes dans le fichier .phys
+listePrefixesGroupeMaille = ("DIEL","NOCOND","COND","CURRENT","EPORT","HPORT","TOPO","PB_MOBILE","NILMAT",
+                         "VCUT","VCUTN","EWALL","HWALL","GAMMAJ","PERIODIC","APERIODIC",
+                         "HPROBE","EPROBE","BFLUX","BFLUXN","JFLUX","JFLUXN",
+                         "PORT_OMEGA","POST_PHI","PB_GRID",
+                         "SCUTE","SCUTN","ZS","ZJ","ZT")
+# liste des prefixes des groupes de mailles, sans le separateur, par type de bloc du fichier PHYS sous la forme d'un dictionnaire
+dictPrefixesGroupeMaille = {'DIELECTRIC':('DIEL','NOCOND'), 
+                                             'CONDUCTOR':('COND',), 
+                                             'STRANDED_INDUCTOR':('CURRENT', ), 
+                                             'EPORT':('EPORT', ), 
+                                             'HPORT':('HPORT', ), 
+                                             'ZSURFACIC':('ZS', ), 
+                                             'ZINSULATOR':('ZJ', ), 
+                                             'NILMAT':('NILMAT', )}
+# separateur entre le prefixe et le reste du nom du groupe de maille
+sepNomGroupeMaille = '_'
+
+
+# types de problemes
+HARMONIC = 'HARMONIC' # probleme frequentiel
+TIME_DOMAIN = 'TIME_DOMAIN' # probleme temporel
+
+# nom du plugin, utilisé dans entryPoint et generMACRO_ETAPE()
+nomPlugin = 'CARMEL3DFV0'
+
+def entryPoint():
+   """
+      Retourne les informations necessaires pour le chargeur de plugins
+      Ces informations sont retournees dans un dictionnaire
+   """
+   return {
+        # Le nom du plugin
+          'name' : nomPlugin,
+        # La factory pour creer une instance du plugin
+          'factory' : CARMEL3DFV0Generator,
+          }
+
+
+
+class CARMEL3DFV0Generator(PythonGenerator):
+   """
+      Ce generateur parcourt un objet de type JDC et produit
+      un texte au format eficas et 
+      un texte au format attendu par le code Code_Carmel3D (fichier '.PHYS') 
+
+   """
+   # Les extensions de fichier permis?
+   extensions=('.comm',)
+
+#----------------------------------------------------------------------------------------
+   def gener(self,obj,format='brut',config=None):
+       
+      self.initDico()
+      
+      #self.debug = True
+      
+      # Cette instruction genere le contenu du fichier de commandes (persistance)
+      self.text=PythonGenerator.gener(self,obj,format)
+
+      if self.debug:
+         print "self.text = %s" % self.text
+
+      # Cette instruction genere le contenu du fichier de parametres pour le code Carmel3D
+      # si le jdc est valide (sinon cela n a pas de sens)
+      if obj.isValid() : 
+           try :
+             # constitution du bloc VERSION du fichier PHYS (existe toujours)
+             self.generBLOC_VERSION(obj)
+             # constitution du bloc MATERIALS du fichier PHYS (existe toujours)
+             self.generBLOC_MATERIALS()
+             # constitution du bloc SOURCES du fichier PHYS (existe toujours)
+             self.generBLOC_SOURCES()
+             
+           except ValueError, err:
+             raise ValueError(str(err))
+
+#      print "texte carmel3d :\n",self.texteCarmel3D
+#      print "dictMaterDielectric : ",self.dictMaterDielectric
+      if self.debug:
+         print "dictMaterDielectric : %s" % repr(self.dictMaterDielectric)
+         print "dictMaterConductor : %s" % repr(self.dictMaterConductor)
+      
+      return self.text
+
+
+
+
+#----------------------------------------------------------------------------------------
+# initialisations
+#----------------------------------------------------------------------------------------
+   
+   def initDico(self) :
+      self.texteCarmel3D=""
+      self.texteCarmel3D_PARAM=""
+      self.texteCarmel3D_PARAM_SOLV=""
+      self.texteCarmel3D_SH=""      
+      self.texteCarmel3D_INFC=""
+      self.texteCarmel3D_CMD=""
+      self.texteCarmel3D_INGEND1=""
+      self.texteCarmel3D_INGEND2=""
+      self.texteCarmel3D_INGEND3=""
+      self.texteCarmel3D_INPOST=""
+      self.debug = True # affichage de messages pour deboguage (.true.) ou non
+      self.dicoEtapeCourant=None
+      self.dicoMCFACTCourant=None
+      self.dicoCourant=None
+      self.dictGroupes = {'ordreMateriauxJdC':[], 'ordreSourcesJdC':[], 'ordreStrandJdC':[], 'ordreListeJdC':[], 'ordreDomaineJdC':[]} # association des noms de groupes de maillage avec les noms de materiaux ou de sources, en sauvegardant l'ordre du JdC en separant les groupes associes a des materiaux de ceux associes a des sources
+      self.dictMaterConductor={}
+      self.dictMaterDielectric={}
+      self.dictMaterZsurfacic={}
+      self.dictMaterEmIso={}
+      self.dictMaterEmAnIso={}
+      self.dictMaterNilmat={}
+      self.dictMaterZinsulator={}
+      self.dictSourceStInd={}
+      self.dictSourceEport={}
+      self.dictSourceHport={}
+      self.dictStrand={}
+      self.dictDomaine={}
+      self.dictPort={}
+      self.cutlineValeur=[]
+      self.cutplaneValeur=[]
+      self.visu3dValeur=[]
+      self.fieldmapValeur=[]
+      self.fielddumpValeur=[]
+      self.repertory=""
+      self.frequency=""
+      self.domaine=""
+      self.direction=""
+      self.section=""
+      self.forme=""
+      self.centre=""
+      self.echelle=""
+      self.visu=False
+      self.post_global=False
+      self.visu_format=""
+      self.visu_type=""
+      self.gendof=""
+      self.fcarmel=""
+      self.postprocess=""
+      self.formulation=""
+      # on force le probleme a etre frequentiel, seul possible en l'etat des choses
+      self.problem = HARMONIC
+      self.fichierMaillage = "" # chemin absolu ou relatif  du fichier contenant le maillage, défini dans PARAMETERS.Fichier_maillage.
+      self.nomFichierMaillage = "" # nom du fichier de maillage, sans le chemin
+      self.projet = "" # nom du projet, utilisé un peu partout, i.e., nom du fichier de maillage sans l'extension
+      self.materiauxGroupesTousHomogenes = True # Tous les groupes sont associés a priori à des matériaux tous homogènes mais pas forcément isotropes. On le vérifie ou modifie ci-dessous. 
+      self.materiauxGroupesTousIsotropes = True # Tous les groupes sont associés a priori à des matériaux tous isotropes mais pas forcément homogènes. On le vérifie ou modifie ci-dessous. 
+
+#----------------------------------------------------------------------------------------
+# ecriture
+#----------------------------------------------------------------------------------------
+
+   def writeDefault(self,fn) :
+        """Ecrit les fichiers de parametres et le fichier d'execution pour le code Carmel3D"""
+        
+        # fn est le chemin complet du fichier de l'étude, e.g., /home/toto/foo.comm
+        #file =  fn[:fn.rfind(".")]  # chemin complet du fichier de l'étude sans l'extension, e.g., /home/toto/foo
+        repertory=os.path.dirname(fn)  # répertoire de l'étude, e.g., /home/toto/
+        file = os.path.join(repertory, self.projet) # on crée le chemin complet des fichiers de configuration sans extension, à partir du nom du projet.
+        namefile=os.path.basename(file) # nom du projet e.g., foo
+            
+        
+        if self.debug: 
+            print "ecriture du fichier de parametres (PHYS)"
+        filePHYS = file + '.phys'
+        typeBloc = 'PHYS_FILES'
+        f = open( str(filePHYS), 'w')
+        f.write( self.texteCarmel3D)
+        f.close()
+        
+
+        if self.debug: 
+            print "ecriture du fichier de parametres (PARAM)"
+        filePARAM = file + '.param'
+        f = open( str(filePARAM), 'w')
+        f.write('[VERSION \n'
+                    '   NUM     1\n'
+                    '   FILETYPE PARAM\n]\n'
+                    '[PROBLEM\n'
+                    '   NAME HARMONIC\n]\n'
+                )                
+        typeBloc = 'CAR_FILES'
+        self.texteCarmel3D_PARAM+="["+typeBloc+"\n" # debut de bloc
+        self.texteCarmel3D_PARAM+="    NAME "+self.projet+".car"
+        self.texteCarmel3D_PARAM+="\n]\n" # fin de bloc
+        typeBloc = 'PHYS_FILES'
+        self.texteCarmel3D_PARAM+="["+typeBloc+"\n" # debut de bloc
+        self.texteCarmel3D_PARAM+="    NAME "+self.projet+".phys" 
+        self.texteCarmel3D_PARAM+="\n]\n" # fin de bloc
+        self.texteCarmel3D_PARAM+="[FREQUENCY\n"
+        self.texteCarmel3D_PARAM+="   SINGLE %g \n" % (self.frequency )
+        self.texteCarmel3D_PARAM+="] \n"
+        f.write( self.texteCarmel3D_PARAM)
+        f.write(self.texteCarmel3D_PARAM_SOLV)
+        f.close()
+        # ecriture du fichier de commandes du post-traitement (.cmd), à partir du texte self.textCarmel3D défini dans la routine generPOST_COMMANDS
+        if self.debug: 
+            print "ecriture du fichier de parametres (CMD)"
+        fileCMD =file + '.cmd'
+        f = open( str(fileCMD), 'w')
+        f.write(self.texteCarmel3D_CMD)
+        f.close()
+
+
+        if self.debug: 
+            print "ecriture du fichier de parametres (INGENDOF)"
+        fileINGEND = file + '.ingendof'
+        f = open(fileINGEND, 'w')
+        self.texteCarmel3D_INGEND1+=""+self.nomFichierMaillage # nom du fichier de maillage (chemin relatif)
+        
+        nomsGroupes = self.dictGroupes['ordreStrandJdC'][:] 
+        nomsGroupes.sort()
+
+        #if self.dictDomaine !={}:
+        try:
+            self.creaBLOC_STRANDED_INDUCTOR_GEOMETRY(nomsGroupes)
+        except ValueError, err:
+            raise ValueError(str(err))
+        if self.dictPort != {} :
+            self.creaBLOC_PORTS_GEOMETRY(nomsGroupes)
+        if self.formulation=="APHI": self.texteCarmel3D_INGEND3+="\n1"
+        if self.formulation=="TOMEGA": self.texteCarmel3D_INGEND3+="\n2"
+        f.write(self.texteCarmel3D_INGEND1)
+        f.write(self.texteCarmel3D_INGEND2)  
+        f.write(self.texteCarmel3D_INGEND3)
+        f.close()     
+
+        if self.debug: 
+            print "ecriture du fichier de parametres (INFCARMEL) "
+        fileINFC = file + '.infcarmel'
+        f = open(fileINFC, 'w')
+        self.texteCarmel3D_INFC+= self.projet+".param"
+        f.write(self.texteCarmel3D_INFC)
+        f.close()      
+        
+        if self.debug: 
+            print "ecriture du fichier de parametres (INPOSTPROCESS) "
+        fileINPOST = file + '.inpostprocess'
+        f = open(fileINPOST, 'w')
+        self.texteCarmel3D_INPOST+= self.projet+".param"
+        self.texteCarmel3D_INPOST+="\n"+self.projet+".xmat"
+        self.texteCarmel3D_INPOST+="\n"+self.projet+".cmd"
+        f.write(self.texteCarmel3D_INPOST)
+        f.close()            
+
+        print "dictionnaire complet=%s" %self.dictGroupes
+        print "dictionnaire des ports =%s"  %self.dictPort
+        if self.debug: 
+            print "ecriture du fichier d'execution (SH)"
+            print"LISTE DES DOMAINES=%s" %(self.dictGroupes['ordreDomaineJdC'])
+        RepCarmel= os.path.join(repertory,"lancer.sh")
+        f = open( str(RepCarmel), 'wb')
+        self.texteCarmel3D_SH+='cd ' + repertory + ' \n'
+        if self.gendof=="TRUE":
+            self.texteCarmel3D_SH+='echo "Debut execution gendof" \n'
+            if self.echelle=="Millimetre":
+                self.texteCarmel3D_SH+=self.repertory+"/gendof.exe -scale 0.001 < " + self.projet + ".ingendof\n"
+            else:
+                self.texteCarmel3D_SH+=self.repertory+"/gendof.exe < " + self.projet + ".ingendof\n"
+        if self.fcarmel=="TRUE": 
+            self.texteCarmel3D_SH+='echo "Debut execution fcarmel" \n'
+            self.texteCarmel3D_SH+=self.repertory+"/fcarmel.exe <  " + self.projet + ".infcarmel\n"
+        if self.postprocess=="TRUE":
+            self.texteCarmel3D_SH+= 'echo "Debut execution postprocess" \n'
+            self.texteCarmel3D_SH+= self.repertory+"/postprocess.exe < " + self.projet + ".inpostprocess\n"
+        f.write(self.texteCarmel3D_SH)
+        f.close()      
+        
+#----------------------------------------------------------------------------------------
+#  analyse de chaque noeud de l'arbre 
+#----------------------------------------------------------------------------------------
+
+   def generMCSIMP(self,obj) :
+        """recuperation de l objet MCSIMP"""
+        if self.debug: 
+            print "MCSIMP %(v_1)s  %(v_2)s" % {'v_1': obj.nom, "v_2": obj.valeur}
+        s=PythonGenerator.generMCSIMP(self,obj)
+        try:
+            self.dicoCourant[obj.nom]=obj.valeurFormatee
+        except:
+            print "Oubli des messages texte homo='information'"
+        return s
+
+  
+#----------------------------------------------------------------------------------------
+   def generMCFACT(self,obj) :
+        """recuperation de l objet MCFACT"""
+        if self.debug:
+            print "MCFACT debut %(v_1)s  %(v_2)s" % {'v_1': unicode(obj.nom), "v_2": unicode(obj.valeur)}
+        dico={}
+        self.dicoMCFACTCourant=dico
+        self.dicoCourant=self.dicoMCFACTCourant
+        s=PythonGenerator.generMCFACT(self,obj)
+        # sauvegarde, dans self.dicoEtapeCourant, de la valeur du FACT courant, pour utilisation ultérieure dans generETAPE et generPROC_ETAPE
+        # traitement des FACT CUTLINE et CUTPLANE multiples (max='**' dans le catalogue)
+        # Ce traitement spécial est nécessaire pour le moment car le générateur bogue sinon au niveau des matériaux (non-linéaires ?)
+        if obj.nom in ('FIELDDUMP','CUTLINE', 'CUTPLANE', 'FIELDMAP', 'VISU3D' ): 
+            # Remplissage se self.dicoEtapeCourant pour le nom du FACT courant
+            # Il ne contient qu'une seule valeur (un dictionnaire) par défaut lorsque le FACT est unique (max=1 dans le catalogue),
+            # mais il peut aussi contenir plusieurs valeurs (tableau) dans le cas contraire, e.g., max='**' dans le catalogue
+            if self.dicoEtapeCourant.has_key(obj.nom): # plusieurs valeurs
+                print "self.dicoEtapeCourant= %s"%self.dicoEtapeCourant
+                if type(self.dicoEtapeCourant[obj.nom]) == types.DictType: # une seule valeur entrée jusqu'à présent
+                    dicoMCFACTprecedent = self.dicoEtapeCourant[obj.nom] # sauvegarde de la valeur précédente
+                    print "dicoMCFACTpreceden= %s self.dicoEtapeCourant= %s"%(dicoMCFACTprecedent,self.dicoEtapeCourant) 
+                    self.dicoEtapeCourant[obj.nom] = [ dicoMCFACTprecedent, self.dicoMCFACTCourant ] # restructuration en liste et insertion de la valeur précédente et de la valeur courant
+                    print "self.dicoEtapeCourant[obj.nom]= %s"%self.dicoEtapeCourant[obj.nom]
+                else: # plusieurs valeurs entrées jusqu'à présent, sous la forme d'une liste de dictionnaires
+                    self.dicoEtapeCourant[obj.nom].append(self.dicoMCFACTCourant) # extension de la liste avec cette valeur, placée en dernier
+            else: # une seule valeur ou première valeur
+                self.dicoEtapeCourant[obj.nom]=self.dicoMCFACTCourant
+        else: # traitement usuel des FACT uniques, pour ignorer le bogue décrit plus haut
+            self.dicoEtapeCourant[obj.nom]=self.dicoMCFACTCourant
+        self.dicoMCFACTCourant=None
+        self.dicoCourant=self.dicoEtapeCourant
+        if self.debug:
+            print "MCFACT fin %(v_1)s  %(v_2)s" % {'v_1': unicode(obj.nom), "v_2": unicode(obj.valeur)}
+        return s
+
+
+#----------------------------------------------------------------------------------------
+   def generPROC_ETAPE(self,obj):
+        """analyse des PROC du catalogue  ( VERSION )"""
+        if self.debug: 
+            print "PROC_ETAPE initial: %(v_1)s  %(v_2)s" % {'v_1': unicode(obj.nom), "v_2": unicode(obj.valeur)}
+        dico={}
+        self.dicoEtapeCourant=dico
+        self.dicoCourant=self.dicoEtapeCourant
+        s=PythonGenerator.generPROC_ETAPE(self,obj)
+        obj.valeur=self.dicoEtapeCourant # on passe à obj la bonne structure générée par PythonGenerator.generPROC_ETAPE, pour le traitement de chaque partie ci-dessous
+        if self.debug: 
+            print "PROC_ETAPE mis a jour: %(v_1)s  %(v_2)s" % {'v_1': unicode(obj.nom), "v_2": unicode(obj.valeur)}
+        if obj.nom=="PARAMETERS" : self.generBLOC_PARAMETERS(obj)
+        if obj.nom=="SOLVEUR" : self.generSOLVEUR(obj)
+        if obj.nom=="POST_COMMANDS" : self.generPOST_COMMANDS(obj)
+        s=PythonGenerator.generPROC_ETAPE(self,obj) # obj.valeur a été modifiée pour le traitement ci-dessus, alors il faut tout remettre en ordre en appelant de nouveau PythonGenerator.generPROC_ETAPE
+        return s
+
+
+
+#----------------------------------------------------------------------------------------
+   def generETAPE(self,obj):
+        """analyse des OPER du catalogue"""
+        if self.debug: 
+            print "ETAPE mis a jour: obj.nom = %(v_1)s , obj.valeur= %(v_2)s" % {'v_1': obj.nom, 'v_2': obj.valeur}
+        dico={}
+        self.dicoEtapeCourant=dico
+        self.dicoCourant=self.dicoEtapeCourant
+        s=PythonGenerator.generETAPE(self,obj)
+        obj.valeur=self.dicoEtapeCourant # cf. generPROC_ETAPE
+        if self.debug: 
+            print "ETAPE mis a jour: obj.nom = %(v_1)s , obj.valeur= %(v_2)s" % {'v_1': obj.nom, 'v_2': obj.valeur}
+        if obj.nom=="MESHGROUP" : self.generMESHGROUP(obj)
+        if obj.nom=="MATERIAL" : self.generMATERIAL(obj)
+        if obj.nom=="SOURCE" : self.generSOURCE(obj)
+        if obj.nom=="STRANDED_INDUCTOR_GEOMETRY" : self.generSTRANDED_INDUCTOR_GEOMETRY(obj)
+        if obj.nom=="MACRO_GROUPE": self.generMACRO_GROUPE(obj)
+        s=PythonGenerator.generETAPE(self,obj) # cf. generPROC_ETAPE
+        return s
+
+#----------------------------------------------------------------------------------------
+   def generMACRO_ETAPE(self,obj):
+        dico={}
+        self.dicoEtapeCourant=dico
+        self.dicoCourant=self.dicoEtapeCourant
+        import generator
+        monGenerateur=generator.plugins[nomPlugin]()
+        jdc_aux_texte=monGenerateur.gener(obj.jdc_aux)
+        if self.debug: 
+            print "jdc_aux_texte : %s" % jdc_aux_texte
+
+        for cle in monGenerateur.dictMaterConductor:
+            self.dictMaterConductor[cle] = monGenerateur.dictMaterConductor[cle]
+        for cle in monGenerateur.dictMaterDielectric:
+            self.dictMaterDielectric[cle] = monGenerateur.dictMaterDielectric[cle]
+        for cle in monGenerateur.dictMaterZsurfacic:
+            self.dictMaterZsurfacic[cle] = monGenerateur.dictMaterZsurfacic[cle]
+        for cle in monGenerateur.dictMaterEmIso:
+            self.dictMaterEmIso[cle] = monGenerateur.dictMaterEmIso[cle]
+        for cle in monGenerateur.dictMaterEmAnIso:
+            self.dictMaterEmAnIso[cle] = monGenerateur.dictMaterEmAnIso[cle]
+        for cle in monGenerateur.dictMaterNilmat:
+            self.dictMaterNilMat[cle] = monGenerateur.dictMaterNilMat[cle]
+        for cle in monGenerateur.dictMaterZinsulator:
+            self.dictMaterZinsulator[cle] = monGenerateur.dictMaterZinsulator[cle]
+              
+        print "________FIN MACRO______________________________________"
+        s=PythonGenerator.generMACRO_ETAPE(self,obj)
+        return s
+
+#----------------------------------------------------------------------------------------
+#----------------------------------------------------------------------------------------
+   def generMESHGROUP(self,obj):
+        """preparation de la ligne NAME referencant le groupe de mailles 
+            associe le groupe de mailles au materiau ou a la source utilisateur
+            on sauvegarde aussi les noms des groupes de maillage
+        """
+        try:
+            if usePrefix:
+                nomGroupe = self.nomReelGroupe(obj.getSdname()) # nom du groupe de maillage, i.e. nom du concept, avec prefixes enleves
+                print "liste des noms sans prefixes %s" %(nomGroupe)
+            else:
+                nomGroupe = obj.getSdname() # nom du groupe de maillage, i.e. nom du concept
+                print "liste des noms sans prefixes %s" %(nomGroupe)
+
+            # test: un et un seul nom de materiau ou source doit etre associe a ce groupe de maillage, via les cles MATERIAL et SOURCE, respectivement.
+            # test sur un seul attribut, non pertinent car il peut y en avoir plusieurs.
+            #assert len(obj.valeur.keys())==1,"Un et un seul nom de materiau ou source doit etre associe a ce groupe du maillage :"+nomGroupe
+            #
+            # on utilise le fait que obj.valeur est un dictionnaire
+            self.dictGroupes[nomGroupe] = {}   
+#            nomGroupe={'SOURCE':[], 'MATERIAL':[], 'LISTE':[], 'STRAND':[], }   
+            if self.debug: 
+                print "obj.valeur.keys()= %s" % obj.valeur.keys()
+            if 'MATERIAL' in obj.valeur.keys() and 'SOURCE' in obj.valeur.keys(): # test d'erreur lors de presence de materiau et source a la fois
+                raise ValueError, nomGroupe + tr(" : ce groupe de maillage ne peut pas etre associe a un materiau et une source a la fois.")
+            # association a un materiau
+            if 'MATERIAL' in obj.valeur.keys():
+                self.dictGroupes[nomGroupe]['MATERIAL'] = obj.valeur['MATERIAL'].nom # sauvegarde de l'association entre ce groupe de maillage et un materiau ou source, par son nom, i.e. nom du concept du materiau ou de la source
+                self.dictGroupes['ordreMateriauxJdC'].append(nomGroupe) # sauvegarde du nom du groupe de maillage associe a un materiau, dans l'ordre du JdC
+            # association a une source
+            if 'SOURCE' in obj.valeur.keys():
+                self.dictGroupes[nomGroupe]['SOURCE'] = obj.valeur['SOURCE'].nom # sauvegarde de l'association entre ce groupe de maillage et un materiau ou source, par son nom, i.e. nom du concept du materiau ou de la source
+                self.dictGroupes['ordreSourcesJdC'].append(nomGroupe) # sauvegarde du nom du groupe de maillage associe a une source, dans l'ordre du JdC
+            # erreur ni materiau ni source associee
+            if 'STRANDED_INDUCTOR_GEOMETRY' in obj.valeur.keys():
+                    self.dictGroupes[nomGroupe]['STRAND'] = obj.valeur['STRANDED_INDUCTOR_GEOMETRY'].nom # sauvegarde de l'association entre ce groupe de maillage et un materiau ou source, par son nom, i.e. nom du concept du materiau ou de la source
+                    self.dictGroupes['ordreStrandJdC'].append(nomGroupe) # sauvegarde du nom du groupe de maillage associe a une source, dans l'ordre du JdC
+            if 'Domaine' in obj.valeur.keys():
+                self.dictGroupes[nomGroupe]['DOMAINE'] = obj.valeur['Domaine']
+                self.dictGroupes['ordreDomaineJdC'].append(nomGroupe)
+                texte=""
+                texte+="%s"%(obj.valeur['Domaine'])
+                print"le texte=%s" %(texte)
+                self.dictDomaine[obj.getSdname()]=texte  
+                print "liste des domaines =%s" %(self.dictGroupes[nomGroupe]['DOMAINE'])
+                    
+#            else:
+#                raise ValueError, tr("ce groupe de maillage %s n'est associe a aucun materiau, source ou stranded_inductor_geometry." % nomGroupe)
+            if self.debug:
+                print "self.dictGroupes= %s" % repr(self.dictGroupes)
+        except ValueError, err:
+            raise ValueError, str(err)
+            
+   def generMACRO_GROUPE(self, obj):
+        """preparation de la ligne NAME referencant le groupe de mailles 
+            associe le groupe de mailles au materiau ou a la source utilisateur
+            on sauvegarde aussi les noms des macros groupes
+        """
+        try:
+            #nomGroupe={'SOURCE':[], 'MATERIAL':[], 'LISTE':[], 'STRAND':[], }   
+            if usePrefix:
+                nomGroupe = self.nomReelGroupe(obj.getSdname()) # nom du groupe de maillage, i.e. nom du concept, avec prefixes enleves
+                print "liste des noms sans prefixes %s" %(nomGroupe)
+            else:
+                nomGroupe = obj.getSdname() # nom du macro groupe
+                print "liste des noms sans prefixes %s" %(nomGroupe)
+            self.dictGroupes[nomGroupe] = {}   
+                
+            # test: un et un seul nom de materiau ou source doit etre associe a ce groupe de maillage, via les cles MATERIAL et SOURCE, respectivement.
+            # test sur un seul attribut, non pertinent car il peut y en avoir plusieurs.
+            #assert len(obj.valeur.keys())==1,"Un et un seul nom de materiau ou source doit etre associe a ce groupe du maillage :"+nomGroupe
+            #
+            # on utilise le fait que obj.valeur est un dictionnaire
+            if self.debug: 
+                print "obj.valeur.keys()= %s" % obj.valeur.keys()
+            if 'MATERIAL' in obj.valeur.keys() and 'SOURCE' in obj.valeur.keys(): # test d'erreur lors de presence de materiau et source a la fois
+                raise ValueError, nomgroupe + tr(" : ce MACRO_GROUPE ne peut pas contenir a la fois un MATERIAL et une SOURCE.")
+            # association a une source
+            if 'SOURCE' in obj.valeur.keys():
+                self.dictGroupes[nomGroupe]['SOURCE'] = obj.valeur['SOURCE'].nom # sauvegarde de l'association entre ce macro groupe et un materiau ou source, par son nom, i.e. nom du concept du materiau ou de la source
+                self.dictGroupes['ordreSourcesJdC'].append(nomGroupe) # sauvegarde du nom du groupe de maillage associe a une source, dans l'ordre du JdC
+            # erreur ni materiau ni source associee
+            if 'LISTE_MESHGROUP' in obj.valeur.keys():
+                listeStrandedInductorGeometry = True # indicateur du fait que tous les groupes de la liste sont des inducteurs bobinés ou topologiques, en morceaux ou entier (True), ou non (False). Utilisé pour savoir si le Domaine est nécessaire ou non.
+                listeGroupesMauvaisFormat = obj.valeur['LISTE_MESHGROUP'] # sauvegarde de l'association entre ce macro groupe et un materiau ou source, par son nom, i.e. nom du concept du materiau ou de la source
+                self.dictGroupes[nomGroupe]['LISTE'] = [] # sauvegarde de l'association entre ce macro groupe et un materiau ou source, par son nom, i.e. nom du concept du materiau ou de la source
+                for groupe in listeGroupesMauvaisFormat: # sauvegarde de la liste au format correct
+                    groupe = groupe.replace("'", "") # suppression des guillement simpes
+                    groupe = groupe.replace('"', "") # suppression des guillement doubles
+                    self.dictGroupes[nomGroupe]['LISTE'].append(groupe) # sauvegarde du nom au formatage correct
+                    if not self.dictGroupes[groupe].has_key('STRAND'): listeStrandedInductorGeometry = False # au moins un groupe de la liste n'est pas un inducteur bobiné ou topologique (morceau ou entier).
+                self.dictGroupes['ordreListeJdC'].append(nomGroupe) # sauvegarde du nom du macro groupe associe a une source, dans l'ordre du JdC
+                if not listeStrandedInductorGeometry: # Erreur en cas de liste ne définissant pas que des inducteurs bobinés ou topologiques en morceaux
+                    raise ValueError, nomGroupe + tr(" : ce MACRO_GROUPE ne doit contenir, dans LISTE_MESHGROUP, que des morceaux d'inducteurs bobines ou topologiques.")
+                # test de présence du domaine pour les cas appropriés d'inducteur bobiné ou topologique en morceau.
+                if 'Domaine' in obj.valeur.keys():
+                    if listeStrandedInductorGeometry: # Domaine seulement  en cas de liste définissant des inducteurs bobinés ou topologiques en morceaux
+                        self.dictGroupes[nomGroupe]['DOMAINE'] = obj.valeur['Domaine']
+                        self.dictGroupes['ordreDomaineJdC'].append(nomGroupe)
+                        texte=""
+                        texte+="%s"%(obj.valeur['Domaine'])
+                        print"le texte=%s" %(texte)
+                        self.dictDomaine[obj.getSdname()]=texte                  
+                    else: # Erreur si Domaine et macro-groupe pas complètement inducteur
+                        raise ValueError, nomGroupe + tr(" : ce MACRO_GROUPE ne doit pas contenir de Domaine car il contient, dans LISTE_MESHGROUP, des groupes qui ne sont pas que des morceaux d'inducteurs bobines ou topologiques.")
+                else: # Domaine manquant
+                    if listeStrandedInductorGeometry: # Erreur en cas de liste définissant des inducteurs bobinés ou topologiques en morceaux
+                        raise ValueError, nomGroupe + tr(" : ce MACRO_GROUPE de morceaux d'inducteurs bobines ou topologiques doit contenir aussi un Domaine.")
+            else:
+                raise ValueError, nomGroupe + tr(" : ce MACRO_GROUPE doit contenir une liste de groupes LISTE_MESHGROUP.")
+            if self.debug:
+                print "self.dictGroupes= %s" % repr(self.dictGroupes)
+                print "self.dictDomaine=%s" %(self.dictDomaine)
+        except ValueError, err:
+            raise ValueError, str(err)
+
+
+   def generSOLVEUR(self, obj):
+        if self.debug:
+            print "generation material obj.valeur = %s" % obj.valeur
+        try :
+            nature = obj.valeur['Type']
+            if nature == "Solveur_lineaire" : self.generSOLVEUR_LINEAIRE(obj)
+        except ValueError,  err:
+            raise ValueError,  str(err)
+            
+   def generSOLVEUR_LINEAIRE(self, obj):
+        if self.debug:
+            print "generation material obj.valeur = %s" % obj.valeur    
+        try :
+            nature = obj.valeur['Methode_lineaire']
+            if nature =="Methode iterative BICGCR" : self.generMETHODE_ITERATIVE_BICGCR(obj)
+            if nature  =="Methode directe MUMPS" : self.generMETHODE_DIRECTE_MUMPS(obj)
+        except ValueError,  err:
+            raise ValueError,  str(err)
+            
+   def generMETHODE_ITERATIVE_BICGCR(self, obj):
+        texte=""
+        if self.debug:
+            print "_____________iter_____________"
+
+            self.texteCarmel3D_PARAM_SOLV+="[SOLVER \n"
+            self.texteCarmel3D_PARAM_SOLV+="    NAME BICGCR\n"      
+            self.texteCarmel3D_PARAM_SOLV+="    [ITERATIVE_PARAM \n"                         
+            self.texteCarmel3D_PARAM_SOLV+="        NITERMAX   "+str(obj.valeur["Nombre_iterations_max"])+"\n"
+            self.texteCarmel3D_PARAM_SOLV+="        EPSILON  "+str(obj.valeur["Precision"])+"\n"
+            self.texteCarmel3D_PARAM_SOLV+="    ]\n] \n"
+        if self.debug: 
+           print "texte = %s", texte
+
+       
+   def generMETHODE_DIRECTE_MUMPS(self, obj):
+        texte=""
+        if self.debug:
+            print "_____________directe_____________"
+
+            self.texteCarmel3D_PARAM_SOLV+="[SOLVER \n"
+            self.texteCarmel3D_PARAM_SOLV+="    NAME MUMPS\n"              
+            self.texteCarmel3D_PARAM_SOLV+="    [MUMPS_PARAMETER \n"
+            self.texteCarmel3D_PARAM_SOLV+="         SYM   "+str(obj.valeur["Type_de_matrice"])+"\n"
+            self.texteCarmel3D_PARAM_SOLV+="       ICNTL   "+str(obj.valeur["ICNTL_Control_Parameters"])+"     "+str(obj.valeur["CNTL_Control_Parameters"])+"\n"
+            self.texteCarmel3D_PARAM_SOLV+="    ]\n] \n"
+        if self.debug: 
+           print "texte = %s", texte
+        
+             
+
+   def generMATERIAL(self,obj):
+        """preparation du bloc correspondant a un materiau du fichier PHYS"""
+        texte=""
+        if self.debug: 
+            print "generation material obj.valeur = %s" % obj.valeur
+        try :
+            nature = obj.valeur['TYPE'] # la nature est le parametre TYPE du MATERIAL
+            if nature=="CONDUCTOR" : self.generMATERIAL_CONDUCTOR(obj)
+            if nature=="DIELECTRIC" : self.generMATERIAL_DIELECTRIC(obj)
+            if nature=="ZSURFACIC" : self.generMATERIAL_ZSURFACIC(obj)
+            if nature=="EM_ISOTROPIC" : self.generMATERIAL_EMISO(obj)
+            if nature=="EM_ANISOTROPIC" : self.generMATERIAL_EMANISO(obj)
+            if nature=="NILMAT" : self.generMATERIAL_NILMAT(obj)
+            if nature=="ZINSULATOR" : self.generMATERIAL_ZINSULATOR(obj)
+        except ValueError, err:
+            raise ValueError, str(err)
+
+   def generMATERIAL_CONDUCTOR(self,obj):
+       """preparation du sous bloc CONDUCTOR"""
+       texte=""
+       if self.debug: 
+           print "_____________cond_____________"
+       # verification des proprietes du sous bloc CONDUCTOR (PERMEABILITY, CONDUCTIVITY)
+       if 'PERMEABILITY' not in obj.valeur or 'CONDUCTIVITY' not in obj.valeur:
+            print "ERREUR! Le matériau conducteur (CONDUCTOR) de nom %s doit contenir les propriétés PERMEABILITY et CONDUCTIVITY." % obj.getSdname()
+            raise ValueError,  obj.getSdname() + tr(" : ce materiau conducteur (CONDUCTOR) doit contenir les proprietes PERMEABILITY et CONDUCTIVITY.")
+       else:
+          # parcours des proprietes du sous bloc CONDUCTOR (PERMEABILITY, CONDUCTIVITY)
+          for keyN1 in ('PERMEABILITY','CONDUCTIVITY') :
+             # debut du sous bloc de propriete du DIELECTRIC
+             texte+="         ["+keyN1+"\n"
+             texte+="            HOMOGENEOUS "+str(obj.valeur[keyN1]["HOMOGENEOUS"])+"\n"
+             texte+="            ISOTROPIC "+str(obj.valeur[keyN1]["ISOTROPIC"])+"\n"
+             # Ecriture des valeurs seulement pour un materiau homogene et isotrope,
+             # car sinon ces valeurs sont definies dans des fichiers annexes
+             homogeneous = str(obj.valeur[keyN1]["HOMOGENEOUS"]) == 'TRUE'
+             isotropic = str(obj.valeur[keyN1]["ISOTROPIC"]) == 'TRUE'
+             if homogeneous and isotropic:
+                # loi (lineaire ou non)
+                texte+="            LAW "+str(obj.valeur[keyN1]["LAW"])+"\n"
+                # valeur de la loi lineaire
+                texte+="            VALUE "+self.formateCOMPLEX(obj.valeur[keyN1]["VALUE"])+"\n"
+                # loi non lineaire de nature spline, Marrocco ou Marrocco et Saturation
+                #  seuls les reels sont pris en compte
+                if obj.valeur[keyN1]['LAW']=='NONLINEAR' :
+                   texte+="            [NONLINEAR \n"
+                   texte+="                ISOTROPY TRUE\n"
+                   texte+="                NATURE "+str(obj.valeur[keyN1]['NATURE'])+"\n"
+                   # ajout des autres parametres autres que ISOTROPY, NATURE, VALUE, LAW, HOMOGENEOUS, ISOTROPIC
+                   for keyN2 in obj.valeur[keyN1] :
+                      if keyN2 not in ('ISOTROPY','NATURE','VALUE','LAW','HOMOGENEOUS','ISOTROPIC') :
+                          texte+="                "+keyN2+" "+str(obj.valeur[keyN1][keyN2])+"\n"
+                   # fin du sous-bloc NONLINEAR
+                   texte+="            ]"+"\n"
+             # fin du sous bloc de propriete
+             texte+="         ]"+"\n"
+       if self.debug: 
+           print "texte = %s", texte
+       self.dictMaterConductor[obj.getSdname()]={'texte':  texte,  'valeur': obj.valeur} # sauvegarde du texte pour ce bloc, ainsi que de toutes les valeurs pour analyse ultérieure
+
+   def generMATERIAL_DIELECTRIC(self,obj):
+        """preparation du sous bloc DIELECTRIC"""
+        texte=""
+        if self.debug: 
+           print "______________nocond_____________"
+           # verification des proprietes du sous bloc DIELECTRIC (PERMEABILITY, PERMITTIVITY)
+        if 'PERMITTIVITY' not in obj.valeur:
+            print "obj.valeur=%s" %obj.valeur
+            obj.valeur["PERMITTIVITY"]={'HOMOGENEOUS': 'TRUE', 'LAW': 'LINEAR', 'ISOTROPIC': 'TRUE', 'VALUE': 1}
+    
+        # parcours des proprietes du sous bloc DIELECTRIC (PERMEABILITY, PERMITTIVITY)
+        for keyN1 in ('PERMEABILITY','PERMITTIVITY') :
+         # debut du sous bloc de propriete du DIELECTRIC
+         texte+="         ["+keyN1+"\n"
+         texte+="            HOMOGENEOUS "+str(obj.valeur[keyN1]["HOMOGENEOUS"])+"\n"
+         texte+="            ISOTROPIC "+str(obj.valeur[keyN1]["ISOTROPIC"])+"\n"
+         # Ecriture des valeurs seulement pour un materiau homogene et isotrope,
+         # car sinon ces valeurs sont definies dans des fichiers annexes
+         homogeneous = str(obj.valeur[keyN1]["HOMOGENEOUS"]) == 'TRUE'
+         isotropic = str(obj.valeur[keyN1]["ISOTROPIC"]) == 'TRUE'
+         if homogeneous and isotropic:
+            # loi (lineaire ou non)
+            texte+="            LAW "+str(obj.valeur[keyN1]["LAW"])+"\n"
+            # valeur de la loi lineaire
+            texte+="            VALUE "+self.formateCOMPLEX(obj.valeur[keyN1]["VALUE"])+"\n"   
+            # loi non lineaire de nature spline, Marrocco ou Marrocco et Saturation
+            #  seuls les reels sont pris en compte
+            if obj.valeur[keyN1]['LAW']=='NONLINEAR' :
+               texte+="            [NONLINEAR \n"
+               texte+="                ISOTROPY TRUE\n"
+               texte+="                NATURE "+str(obj.valeur[keyN1]['NATURE'])+"\n"
+               # ajout des autres parametres autres que ISOTROPY, NATURE, VALUE, LAW, HOMOGENEOUS, ISOTROPIC
+               for keyN2 in obj.valeur[keyN1] :
+                  if keyN2 not in ('ISOTROPY','NATURE','VALUE','LAW','HOMOGENEOUS','ISOTROPIC') :
+                      texte+="                "+keyN2+" "+str(obj.valeur[keyN1][keyN2])+"\n"
+               # fin du sous-bloc NONLINEAR
+               texte+="            ]"+"\n"
+         # fin du sous bloc de propriete
+         texte+="         ]"+"\n"
+        if self.debug: 
+           print "texte = %s" % texte
+        self.dictMaterDielectric[obj.getSdname()]={'texte':  texte,  'valeur': obj.valeur} # sauvegarde du texte pour ce bloc, ainsi que de toutes les valeurs pour analyse ultérieure
+
+   def generMATERIAL_ZSURFACIC(self,obj):
+       """preparation du sous bloc ZSURFACIC"""
+       texte=""
+       if self.debug: 
+           print "______________zsurf_____________"
+       # verification des proprietes du sous bloc ZSURFACIC (PERMEABILITY, CONDUCTIVITY)
+       if 'PERMEABILITY' not in obj.valeur or 'CONDUCTIVITY' not in obj.valeur:
+            print "ERREUR! Le matériau impedance de surface (ZSURFACIC) de nom %s doit contenir les propriétés PERMEABILITY et CONDUCTIVITY." % obj.getSdname()
+            raise ValueError, obj.getSdname() + tr(" : ce materiau impedance de surface (ZSURFACIC) doit contenir les proprietes PERMEABILITY et CONDUCTIVITY.")
+       else:
+          # parcours des proprietes du sous bloc ZSURFACIC (PERMEABILITY, CONDUCTIVITY)
+          for keyN1 in obj.valeur :
+             if keyN1=='TYPE': continue
+             # print "type loi = ", obj.valeur[keyN1]['LAW']
+             # debut du sous bloc de propriete du DIELECTRIC
+             texte+="         ["+keyN1+"\n"
+             texte+="            HOMOGENEOUS "+str(obj.valeur[keyN1]["HOMOGENEOUS"])+"\n"
+             texte+="            ISOTROPIC "+str(obj.valeur[keyN1]["ISOTROPIC"])+"\n"
+             # Ecriture des valeurs seulement pour un materiau homogene et isotrope,
+             # car sinon ces valeurs sont definies dans des fichiers annexes
+             homogeneous = str(obj.valeur[keyN1]["HOMOGENEOUS"]) == 'TRUE'
+             isotropic = str(obj.valeur[keyN1]["ISOTROPIC"]) == 'TRUE'
+             if homogeneous and isotropic:
+                # loi (lineaire ou non)
+                texte+="            LAW "+str(obj.valeur[keyN1]["LAW"])+"\n"
+                # valeur de la loi lineaire
+                texte+="            VALUE "+self.formateCOMPLEX(obj.valeur[keyN1]["VALUE"])+"\n"
+             # fin du sous bloc de propriete
+             texte+="         ]"+"\n"
+       if self.debug: 
+           print "texte = %s", texte
+       self.dictMaterZsurfacic[obj.getSdname()]=texte # sauvegarde du texte pour ce bloc
+
+   def generMATERIAL_EMISO(self,obj):
+       """preparation du sous bloc EM_ISOTROPIC_FILES.
+       Les fichiers sont indiques par le chemin absolu, i.e. le nom complet du JdC,
+        ce qui permet de deplacer les dossiers contenant le modele complet puisque le JdC permet les chemins relatifs.
+       """
+       if "CONDUCTIVITY_File" in obj.valeur:
+            texte ="        CONDUCTIVITY MED "+str(obj.valeur["CONDUCTIVITY_File"])+"\n"
+       if "PERMEABILITY_File" in obj.valeur:
+            texte+="        PERMEABILITY MED "+str(obj.valeur["PERMEABILITY_File"])+"\n"
+       # Possibilite de forcer le chemin relatif (nom de fichier seulement) plutot que le chemin absolu par defaut
+       #from os.path import basename
+       #texte ="        CONDUCTIVITY MED "+basename(str(obj.valeur["CONDUCTIVITY_File"]))+"\n"
+       #texte+="        PERMEABILITY MED "+basename(str(obj.valeur["PERMEABILITY_File"]))+"\n"
+       #      print "obj get sdname= ", obj.getSdname()
+       #   if obj.getSdname() in self.dictMaterEmIso.keys() :
+       #    self.dictMaterEmIso[obj.getSdname()].append(texte) 
+       # else :
+       self.dictMaterEmIso[obj.getSdname()]=texte
+  
+   def generMATERIAL_EMANISO(self,obj):
+        """preparation du sous bloc EM_ANISOTROPIC_FILES.
+        Les fichiers sont indiques par le chemin absolu, i.e. le nom complet du JdC,
+            ce qui permet de deplacer les dossiers contenant le modele complet puisque le JdC permet les chemins relatifs.
+        """
+        if "CONDUCTIVITY_File" in obj.valeur: 
+            texte ="        CONDUCTIVITY MATER "+str(obj.valeur["CONDUCTIVITY_File"])+"\n"
+        if "PERMEABILITY_File" in obj.valeur:
+            texte+="        PERMEABILITY MATER "+str(obj.valeur["PERMEABILITY_File"])+"\n"
+       #  print "obj get sdname= ", obj.getSdname()
+       #  if obj.getSdname() in self.dictMaterEmAnIso.keys() :
+       #    self.dictMaterEmAnIso[obj.getSdname()].append(texte) 
+       #  else :
+        self.dictMaterEmAnIso[obj.getSdname()]=texte
+   
+   def generMATERIAL_NILMAT(self,obj):
+       """preparation du sous bloc NILMAT"""
+       texte=""
+       self.dictMaterNilmat[obj.getSdname()]=texte
+   
+   def generMATERIAL_ZINSULATOR(self,obj):
+       """"preparation du sous bloc ZINSULATOR"""
+       texte=""
+       self.dictMaterZinsulator[obj.getSdname()]=texte
+
+#-------------------------------------------------------------------
+
+   def generSOURCE(self,obj):
+        """preparation du bloc correspondant a une source du fichier PHYS"""
+        if self.debug: 
+            print "generation source obj valeur = %s" % obj.valeur
+        texte=""
+        try :
+            # test de la presence des types de sources reconnus
+            # commes ces sources sont des mot-cles facteurs, i.e. une cle de dictionnaire,
+            # la source ne peut contenir au plus qu'un type de source.
+            if "STRANDED_INDUCTOR" in obj.valeur:
+               self.generSOURCE_STRANDED_INDUCTOR(obj)
+            elif "HPORT" in obj.valeur:
+               self.generSOURCE_HPORT(obj)
+            elif "EPORT" in obj.valeur:
+               self.generSOURCE_EPORT(obj)
+            else:
+               print "ERREUR! Une source du type STRANDED_INDUCTOR, HPORT ou EPORT est attendue."
+        except ValueError, err:
+            raise ValueError, str(err)
+
+   def generSOURCE_STRANDED_INDUCTOR(self,obj):
+        """preparation du sous bloc STRANDED_INDUCTOR"""
+        texte=""
+        sdict = obj.valeur['STRANDED_INDUCTOR'] # dictionnaire contenant les parametres de la source, outre la forme de la source
+        try :
+            texte+="        NTURNS %s\n" % str(sdict['NTURNS'])  
+            self.nturns=sdict['NTURNS']
+            # test de la presence d'une forme de source reconnue
+            # commes ces formes sont des mot-cles facteurs, i.e. une cle de dictionnaire,
+            # la source ne peut contenir au plus qu'un type de source.
+            if "WAVEFORM_CONSTANT" in obj.valeur:
+               wdict = obj.valeur['WAVEFORM_CONSTANT'] # dictionnaire contenant les parametres de la forme de la source
+               if self.problem == HARMONIC:
+                  texte+="        CURJ POLAR %s 0\n" % str(wdict['AMPLITUDE'])
+            elif "WAVEFORM_SINUS" in obj.valeur:
+               wdict = obj.valeur['WAVEFORM_SINUS'] # dictionnaire contenant les parametres de la forme de la source
+               if self.problem == HARMONIC:
+                  texte+="        CURJ POLAR %(ampli)s %(phase)s\n" \
+                         % {'ampli': str(wdict['AMPLITUDE']), 'phase': str(wdict['PHASE'])}
+            self.dictSourceStInd[obj.getSdname()]=texte
+            if self.debug: 
+                print texte
+        except ValueError, err:
+            raise ValueError, str(err)
+
+   def generSOURCE_HPORT(self,obj):
+        """preparation du sous bloc HPORT"""
+        texte=""
+        sdict = obj.valeur['HPORT'] # dictionnaire contenant les parametres de la source, outre la forme de la source
+        nomPort = obj.getSdname()
+        self.dictPort[nomPort] = {} 
+        self.dictPort[nomPort]['HPORT']=str(sdict['TYPE'])
+        try :
+            texte+="        TYPE %s\n" % str(sdict['TYPE'])
+            # test de la presence d'une forme de source reconnue
+            # commes ces formes sont des mot-cles facteurs, i.e. une cle de dictionnaire,
+            # la source ne peut contenir au plus qu'un type de source.
+            if "WAVEFORM_CONSTANT" in obj.valeur:
+               wdict = obj.valeur['WAVEFORM_CONSTANT'] # dictionnaire contenant les parametres de la forme de la source
+               if self.problem == HARMONIC:
+                  texte+="        AMP POLAR %s 0\n" % str(wdict['AMPLITUDE'])
+            elif "WAVEFORM_SINUS" in obj.valeur:
+               wdict = obj.valeur['WAVEFORM_SINUS'] # dictionnaire contenant les parametres de la forme de la source
+               if self.problem == HARMONIC:
+                  texte+="        AMP POLAR %(ampli)s %(phase)s\n" \
+                         % {'ampli': str(wdict['AMPLITUDE']), 'phase': str(wdict['PHASE'])}
+            self.dictSourceHport[obj.getSdname()]=texte
+            if self.debug: 
+                print texte
+        except ValueError, err:
+            raise ValueError, str(err)
+
+   def generSOURCE_EPORT(self,obj):
+       
+
+        """preparation du sous bloc EPORT"""
+        texte=""
+        sdict = obj.valeur['EPORT'] # dictionnaire contenant les parametres de la source, outre la forme de la source
+        nomPort = obj.getSdname()
+        self.dictPort[nomPort] = {} 
+        self.dictPort[nomPort]['EPORT']=str(sdict['TYPE'])
+        print "sdict=%s" %(sdict)
+        try :
+            texte+="        TYPE %s\n" % str(sdict['TYPE'])
+            # test de la presence d'une forme de source reconnue
+            # commes ces formes sont des mot-cles facteurs, i.e. une cle de dictionnaire,
+            # la source ne peut contenir au plus qu'un type de source.
+            if "WAVEFORM_CONSTANT" in obj.valeur:
+               wdict = obj.valeur['WAVEFORM_CONSTANT'] # dictionnaire contenant les parametres de la forme de la source
+               if self.problem == HARMONIC:
+                  texte+="        AMP POLAR %s 0\n" % str(wdict['AMPLITUDE'])
+            elif "WAVEFORM_SINUS" in obj.valeur:
+               wdict = obj.valeur['WAVEFORM_SINUS'] # dictionnaire contenant les parametres de la forme de la source
+               if self.problem == HARMONIC:
+                  texte+="        AMP POLAR %(ampli)s %(phase)s\n" \
+                         % {'ampli': str(wdict['AMPLITUDE']), 'phase': str(wdict['PHASE'])}
+            self.dictSourceEport[obj.getSdname()]=texte
+            if self.debug: 
+                print texte
+        except ValueError, err:
+            raise ValueError, str(err)
+    
+#      
+   def generPARAM_CIRCULAIRE(self, obj):
+        if self.debug: 
+            print "generation stranded inductor geometry obj.valeur = %s" % obj.valeur     
+        self.centre=obj.valeur["Centre"]  
+          
+   def generPOST_COMMANDS(self, obj):
+        """Création du texte de commandes de post-traitement toto.cmd"""
+        if self.debug: 
+            print "generation POST_COMMANDS obj.valeur = %s" % obj.valeur     
+            
+        if obj.valeur.has_key('GLOBAL'):
+            self.texteCarmel3D_CMD+="[\nGLOBAL\n]\n"
+            
+        if obj.valeur.has_key('DUMP'):
+            champsFieldkind={'total':'TOTAL', 'reaction':'REACTION', 'diffracted':'DIFFRACTED'}
+            self.texteCarmel3D_CMD+="[\nDUMP"
+            self.texteCarmel3D_CMD+="\n"+self.projet +  '_postgroups.txt'
+            self.texteCarmel3D_CMD+="\n"+champsFieldkind[obj.valeur["DUMP"]["fieldkind"]]+"\n]\n"
+            
+        if obj.valeur.has_key('FIELDDUMP'):
+            champs = {'T':'TFIELD','H':'HFIELD', 'B':'BFIELD', 'J':'JFIELD', 'E':'EFIELD', 'pertesJoule':'OHMLOSS_DENSITY', 'champSource':'SOURCEFIELD', 'A':'AFIELD', 'Phi':'PHIFIELD', 'Omega':'OMEGAFIELD'}
+            champsFieldkind={'total':'TOTAL', 'reaction':'REACTION', 'diffracted':'DIFFRACTED'}
+            self.texteCarmel3D_CMD+="[\nFIELDDUMP"
+            if type(obj.valeur["FIELDDUMP"]) == types.DictType: # correspondance sur une 'Fielddump'
+                self.fielddumpValeur.append(obj.valeur["FIELDDUMP"]) 
+            else:
+                self.fielddumpValeur=obj.valeur["FIELDDUMP"] # correspondance sur plusieurs 'Fielddump'
+            for indexFielddump in self.fielddumpValeur:
+                self.texteCarmel3D_CMD+="\n  [\n" +"   "+ champs[indexFielddump["field"]]
+                self.texteCarmel3D_CMD+="\n" + "   " + champsFieldkind[indexFielddump["fieldkind"]] + "\n  ]"
+            self.texteCarmel3D_CMD+="\n]\n"    
+            
+        
+        if obj.valeur.has_key('VISU'):
+            self.texteCarmel3D_CMD+="[\nVISU"
+            # test de fichier de maillage bien lu
+            if self.fichierMaillage == "":  raise ValueError, tr("Le fichier de maillage n'existe pas. Le bloc PARAMETERS doit etre defini au-dessus du bloc POST_COMMANDS.")
+            self.texteCarmel3D_CMD+="\n"+self.projet+"\n"
+            self.texteCarmel3D_CMD+=obj.valeur["VISU"]["visu_format"]+"\n"
+            self.texteCarmel3D_CMD+=obj.valeur["VISU"]["visu_type"]+"\n]\n"
+    
+        if obj.valeur.has_key('VISU3D'):
+            champsField = {'T':'TFIELD','H':'HFIELD', 'B':'BFIELD', 'J':'JFIELD', 'E':'EFIELD', 'pertesJoule':'OHMLOSS_DENSITY', 'champSource':'SOURCEFIELD', 'A':'AFIELD', 'Phi':'PHIFIELD', 'Omega':'OMEGAFIELD'} # correspondance sur le nom du champ entre le catalogue (clé) et le fichier de configuration de Code_Carmel3D (valeur)
+            champsFieldkind={'total':'TOTAL', 'reaction':'REACTION', 'diffracted':'DIFFRACTED'}
+            if type(obj.valeur["VISU3D"])==types.DictType:  # correspondance sur une 'VISU3D'
+                self.visu3dValeur.append(obj.valeur["VISU3D"])
+            else:
+                self.visu3dValeur=obj.valeur["VISU3D"] # correspondance sur plusieurs 'VISU3D'
+            self.texteCarmel3D_CMD+="[\nVISU3D"
+            if self.fichierMaillage == "":  raise ValueError, tr("Le fichier de maillage n'existe pas. Le bloc PARAMETERS doit etre defini au-dessus du bloc POST_COMMANDS.")
+            self.texteCarmel3D_CMD+="\n"+ self.projet
+            self.texteCarmel3D_CMD+="\n" + self.visu3dValeur[0]["visu_format"]
+            for indexVisu3d in self.visu3dValeur:
+                if indexVisu3d["visu_format"]!=self.visu3dValeur[0]["visu_format"]:
+                    print "ERREUR! Dans les multiples VISU3D du bloc POST_COMMANDS, le parametre visu_format doit prendre la meme valeur."
+                    raise ValueError, tr("Dans les multiples VISU3D du bloc POST_COMMANDS, le parametre visu_format doit prendre la meme valeur.")
+                self.texteCarmel3D_CMD+="\n   [\n   " + champsField[indexVisu3d["field"]]
+                self.texteCarmel3D_CMD+="\n   "+ champsFieldkind[indexVisu3d["fieldkind"]]
+                self.texteCarmel3D_CMD+="\n   "+ indexVisu3d["visu_type"]+"\n   ]"
+            self.texteCarmel3D_CMD+="\n]\n" 
+            
+        if obj.valeur.has_key('ASTER_RMS_LOSSES'):
+              self.texteCarmel3D_CMD+="[\nASTER_RMS_LOSSES"  
+              if self.fichierMaillage == "":  raise ValueError, tr("Le fichier de maillage n'existe pas. Le bloc PARAMETERS doit etre defini au-dessus du bloc POST_COMMANDS.")
+              self.texteCarmel3D_CMD+="\n"+self.projet+"\n"  
+              self.texteCarmel3D_CMD+= obj.valeur["ASTER_RMS_LOSSES"]["rms_losses_format"] +"\n]\n"
+              
+        if obj.valeur.has_key('CUTLINE'):
+            # création du champ, renommé par rapport à l'interface
+            champsField = {'H':'HFIELD', 'B':'BFIELD', 'J':'JFIELD', 'E':'EFIELD', 'pertesJoule':'OHMLOSS_DENSITY', 'champSource':'SOURCEFIELD', 'A':'AFIELD', 'Phi':'PHIFIELD', 'Omega':'OMEGAFIELD', 'T':'TFIELD'} # correspondance sur le nom du champ entre le catalogue (clé) et le fichier de configuration de Code_Carmel3D (valeur)
+            champsFieldkind={'total':'TOTAL', 'reaction':'REACTION', 'diffracted':'DIFFRACTED'}
+            champsOutput={'xgraphic':'XGRAPHIC', 'gnuplot':'GNUPLOT', 'gmsh':'GMSH'}
+            champsLissage={'aucun':'NONE', 'un seul point par element':'1PTELT'}
+            if type(obj.valeur["CUTLINE"]) == types.DictType: # correspondance sur une 'Cutline'
+                self.cutlineValeur.append(obj.valeur["CUTLINE"])  # transfert d'une dictionnaire à une liste
+            else:
+                self.cutlineValeur=obj.valeur["CUTLINE"] # correspondance sur plusieurs 'Cutline'
+            for indexCutline in self.cutlineValeur: 
+                self.texteCarmel3D_CMD+="[\nCUTLINE"
+                self.texteCarmel3D_CMD+="\n%s" % ' '.join(map(str,indexCutline["first_point"]), )
+                self.texteCarmel3D_CMD+="\n%s" % ' '.join(map(str,indexCutline["last_point"]), )
+                self.texteCarmel3D_CMD+="\n%d" % (indexCutline["number_of_points"], )
+                self.texteCarmel3D_CMD+="\n" +indexCutline["name"]
+                self.texteCarmel3D_CMD+="\n" + champsField[indexCutline["field"]]
+                if indexCutline.has_key('fieldkind'):
+                    self.texteCarmel3D_CMD+="\nFIELDKIND " + champsFieldkind[indexCutline["fieldkind"]]
+                if indexCutline.has_key('output'):
+                    self.texteCarmel3D_CMD+="\nOUTPUT " +champsOutput[indexCutline["output"]]
+                if indexCutline.has_key('lissage'):
+                    self.texteCarmel3D_CMD+="\nSMOOTHLEVEL " +champsLissage[indexCutline["lissage"]]
+                self.texteCarmel3D_CMD+="\n]\n"
+                
+        if obj.valeur.has_key('CUTPLANE'):
+            champs = {'T':'TFIELD','H':'HFIELD', 'B':'BFIELD', 'J':'JFIELD', 'E':'EFIELD','pertesJoule':'OHMLOSS_DENSITY', 'champSource':'SOURCEFIELD', 'A':'AFIELD', 'Phi':'PHIFIELD', 'Omega':'OMEGAFIELD'} # correspondance sur le nom du champ entre le catalogue (clé) et le fichier de configuration de Code_Carmel3D (valeur)
+            champsFieldkind= {'total':'TOTAL', 'reaction':'REACTION', 'diffracted':'DIFFRACTED'}
+            champsOutput={'xgraphic':'XGRAPHIC', 'gnuplot':'GNUPLOT', 'gmsh':'GMSH'}
+            champsLissage={'aucun':'NONE', 'un seul point par element':'1PTELT'}
+            axes = {'Ox':1, 'Oy':2, 'Oz':3} # correspondance de l'axe normal entre le catalogue (clé) et le fichier de configuration Code_Carmel3D (valeur)
+            if type(obj.valeur["CUTPLANE"]) == types.DictType:
+                self.cutplaneValeur.append(obj.valeur["CUTPLANE"]) # correspondance sur une 'Cutplane'
+            else:
+                self.cutplaneValeur=obj.valeur["CUTPLANE"] # correspondance sur plusieurs 'Cutplane'
+            for indexCutplane in self.cutplaneValeur:
+                self.texteCarmel3D_CMD+="[\nCUTPLANE" 
+                self.texteCarmel3D_CMD+="\n%d" % (axes[indexCutplane["normal_vector"]], )
+                self.texteCarmel3D_CMD+="\n%f" % (indexCutplane["plane_position"], )
+                self.texteCarmel3D_CMD+="\n%s" % ' '.join(map(str,indexCutplane["number_of_points"]))
+                self.texteCarmel3D_CMD+="\n" + indexCutplane["name"]
+                self.texteCarmel3D_CMD+="\n" + champs[indexCutplane["field"]]
+                if indexCutplane.has_key('fieldkind'):
+                    self.texteCarmel3D_CMD+="\nFIELDKIND " + champsFieldkind[indexCutplane["fieldkind"]]
+                if indexCutplane.has_key('output'):
+                    self.texteCarmel3D_CMD+="\nOUTPUT " +champsOutput[indexCutplane["output"]]
+                if indexCutplane.has_key('lissage'):
+                    self.texteCarmel3D_CMD+="\nSMOOTHLEVEL " +champsLissage[indexCutplane["lissage"]]
+                self.texteCarmel3D_CMD+="\n]\n"
+                
+        if obj.valeur.has_key('FIELDMAP'):
+            champs = {'T':'TFIELD','H':'HFIELD', 'B':'BFIELD', 'J':'JFIELD', 'E':'EFIELD','pertesJoule':'OHMLOSS_DENSITY', 'champSource':'SOURCEFIELD', 'A':'AFIELD', 'Phi':'PHIFIELD', 'Omega':'OMEGAFIELD'} # correspondance sur le nom du champ entre le catalogue (clé) et le fichier de configuration de Code_Carmel3D (valeur)
+            champsFieldkind= {'total':'TOTAL', 'reaction':'REACTION', 'diffracted':'DIFFRACTED'}
+            champsOutput={'xgraphic':'XGRAPHIC', 'gnuplot':'GNUPLOT', 'gmsh':'GMSH'}
+            champsFieldmap_type={'equation':'EQUATION', 'fichier':'FILE'}
+            champsType={'plane':'PLANE', 'line':'LINE'}
+            axes = {'Ox':1, 'Oy':2, 'Oz':3} # correspondance de l'axe normal entre le catalogue (clé) et le fichier de configuration Code_Carmel3D (valeur)
+            if type(obj.valeur["FIELDMAP"]) == types.DictType: 
+                self.fieldmapValeur.append(obj.valeur["FIELDMAP"]) # correspondance sur une 'Fieldmap'
+            else:
+                self.fieldmapValeur=obj.valeur["FIELDMAP"]# correspondance sur plusieurs 'Fieldmap'
+            for indexFieldmap in self.fieldmapValeur:
+                self.texteCarmel3D_CMD+="[\nFIELDMAP"
+                self.texteCarmel3D_CMD+="\n" + champsFieldmap_type[indexFieldmap["fieldmap_type"]]
+                if indexFieldmap["fieldmap_type"]=="equation":
+                    self.texteCarmel3D_CMD+="\n" + champsType[indexFieldmap["type"]]
+                    if indexFieldmap["type"]=="line":
+                        self.texteCarmel3D_CMD+="\n%s" % ' '.join(map(str,indexFieldmap["first_point"]), )
+                        self.texteCarmel3D_CMD+="\n%s" % ' '.join(map(str,indexFieldmap["last_point"]), )
+                        self.texteCarmel3D_CMD+="\n%d" % (indexFieldmap["number_of_points"], )
+                    if indexFieldmap["type"]=="plane":
+                        self.texteCarmel3D_CMD+="\n%d" % (axes[indexFieldmap["normal_vector"]], )
+                        self.texteCarmel3D_CMD+="\n%f" % (indexFieldmap["plane_position"], )
+                        self.texteCarmel3D_CMD+="\n%s" % ' '.join(map(str,indexFieldmap["number_of_points"]))
+                if indexFieldmap["fieldmap_type"]=="fichier":
+                        self.fichierFieldmap=indexFieldmap["filename"]
+                        self.nomFichierFieldmap = os.path.basename(self.fichierFieldmap) # nom du fichier de fieldmap, sans le chemin
+                        self.texteCarmel3D_CMD+="\n" + self.nomFichierFieldmap
+                self.texteCarmel3D_CMD+="\n" + champs[indexFieldmap["field"]]
+                self.texteCarmel3D_CMD+="\n" + champsFieldkind[indexFieldmap["fieldkind"]]
+                self.texteCarmel3D_CMD+="\n" +indexFieldmap["name"] # nom systématique, quel que soit le fieldmap_type, placé entre fieldkind et output
+                self.texteCarmel3D_CMD+="\n" +champsOutput[indexFieldmap["output"]]
+                self.texteCarmel3D_CMD+="\n]\n"
+                        
+                
+
+
+#---------------------------------------------------------------------------------------
+# traitement fichier PHYS
+#---------------------------------------------------------------------------------------
+   def generBLOC_VERSION(self,obj) :
+      # constitution du bloc VERSION du fichier PHYS
+      # creation d une entite  VERSION ; elle sera du type PROC car decrit ainsi
+      # dans le du catalogue
+      version=obj.addEntite('VERSION',pos=None)
+      self.generPROC_ETAPE(obj.etapes[0])
+      self.texteCarmel3D+="["+obj.etapes[0].nom+"\n"
+      for cle in obj.etapes[0].valeur :
+          self.texteCarmel3D+="   "+cle+" "+str(obj.etapes[0].valeur[cle])+"\n"
+      self.texteCarmel3D+="]\n"
+      # destruction de l entite creee 
+      obj.suppEntite(version)
+      #print 'ERREUR : test erreur boite graphique BLOC_VERSION'
+      #raise ValueError, 'test erreur boite graphique BLOC_VERSION'
+
+
+   def generBLOC_PARAMETERS(self,obj):
+        if self.debug: 
+            print "generation parameters obj.valeur = %s" % obj.valeur    
+
+        self.frequency=obj.valeur["FREQUENCY"]
+        self.repertory=obj.valeur["RepCarmel"]
+        self.fichierMaillage=obj.valeur["Fichier_maillage"]
+        self.nomFichierMaillage = os.path.basename(self.fichierMaillage) # nom du fichier de maillage, sans le chemin
+        self.projet = self.nomFichierMaillage.split(".")[0] # nom du projet, utilisé un peu partout, équivalent au nom du fichier de maillage sans l'extension
+        self.echelle=obj.valeur["Echelle_du_maillage"]
+        self.gendof=obj.valeur["Realiser_topologie_gendof"]
+        self.fcarmel=obj.valeur["Resoudre_probleme"]
+        self.postprocess=obj.valeur["Realiser_post_traitement_aposteriori"]
+        self.formulation=obj.valeur["Formulation"]
+#----------------------------------------------------------------------------------------
+   def generBLOC_MATERIALS(self) :
+        """Prepare une partie du contenu du fichier de parametres (PHYS) pour le code Carmel3D (bloc MATERIALS).
+        Le bloc MATERIALS existe toujours ! 
+        """
+        if self.debug:
+            print "cle dictionnaire materconductor : %s" % self.dictMaterConductor.keys()
+            print "cle dictionnaire materdielectric : %s" % self.dictMaterDielectric.keys()
+        # constitution du bloc MATERIALS du fichier PHYS
+        self.texteCarmel3D+="[MATERIALS\n"
+        # tri alphabetique de tous les groupes de maillage associes a des sources (plus necessaire Code_Carmel3D V_2_3_1 et +, mais avant oui)
+        nomsGroupes = self.dictGroupes['ordreMateriauxJdC'][:] # copie de l'original, qui est une liste
+        nomsGroupes.sort() # tri alphabetique, avec les prefixes eventuels
+        if self.debug:
+            print "noms groupes de mailles associes a des materiaux \
+                            (ordre JdC puis tri)= %(v_1)s %(v_2)s" % \
+                            {'v_1': self.dictGroupes['ordreMateriauxJdC'], \
+                             'v_2': nomsGroupes}
+        try:  # mise à jour du fichier .phys selon les matériaux trouvés                  
+            # constitution du bloc CONDUCTOR du fichier PHYS si existe
+            if self.dictMaterConductor != {} : self.creaBLOC_CONDUCTOR(nomsGroupes)            
+            # constitution du bloc DIELECTRIC du fichier PHYS si exixte
+            if self.dictMaterDielectric != {} : self.creaBLOC_DIELECTRIC(nomsGroupes)            
+            # constitution du bloc ZSURFACIC du fichier PHYS si exixte
+            if self.dictMaterZsurfacic != {} : self.creaBLOC_ZSURFACIC(nomsGroupes)
+            # constitution du bloc NILMAT du fichier PHYS si exixte
+            if self.dictMaterNilmat != {} : self.creaBLOC_NILMAT(nomsGroupes)
+            # constitution du bloc ZINSULATOR du fichier PHYS si exixte
+            if self.dictMaterZinsulator != {} : self.creaBLOC_ZINSULATOR(nomsGroupes)
+            # Les blocs EM_ISOTROPIC_FILES et EM_ANISOTROPIC_FILES sont places en dernier dans le fichier PHYS
+            # constitution du bloc EM_ISOTROPIC_FILES du fichier PHYS si exixte
+            if self.dictMaterEmIso != {} and self.materiauxGroupesTousIsotropes and not self.materiauxGroupesTousHomogenes : self.creaBLOC_EMISO() # bloc isotrope si au moins un matériau isotrope et non homogene
+            # constitution du bloc EM_ANISOTROPIC_FILES du fichier PHYS si exixte
+            if self.dictMaterEmAnIso != {} and not self.materiauxGroupesTousIsotropes : self.creaBLOC_EMANISO() # bloc non isotrope si au moins un matériau non isotrope
+        except ValueError, err:
+            raise ValueError(str(err))
+            
+
+        # fin du bloc MATERIALS du fichier PHYS
+        self.texteCarmel3D+="]\n"  
+
+       
+       
+   def creaBLOC_CONDUCTOR(self, nomsGroupes) :
+        """Constitution du bloc CONDUCTOR du fichier PHYS"""
+        typeBloc = 'CONDUCTOR' # initialisation du type de bloc
+        dictProprietes = self.dictMaterConductor # initialisation du dictionnaire des proprietes du bloc
+        if self.debug: 
+            print 'cles materiaux de type %(type_bloc)s = %(cle_bloc)s' % {'type_bloc': typeBloc, 'cle_bloc': dictProprietes.keys()}
+        for nom in nomsGroupes: # parcours des noms des groupes de maillage
+            if self.dictGroupes[nom]['MATERIAL'][:]  in dictProprietes.keys(): # test si le nom du materiau associe est du bon type
+                if dictProprietes[self.dictGroupes[nom]['MATERIAL'][:]]['valeur']['PERMEABILITY']['LAW'] == 'NONLINEAR': # Erreur si ce matériau est non-linéaire
+                    print u"ERREUR! Le matériau de nom %s associé au groupe %s doit avoir sa perméabilité (PERMEABILITY) linéaire (LINEAR) seulement." % (self.dictGroupes[nom]['MATERIAL'][:],  nom)
+                    raise ValueError, self.dictGroupes[nom]['MATERIAL'][:] + ',' +  nom + tr(" : ce materiau (nom, groupe associe) doit avoir sa permeabilite (PERMEABILITY) lineaire (LINEAR) seulement.")
+                if dictProprietes[self.dictGroupes[nom]['MATERIAL'][:]]['valeur']['PERMEABILITY']['HOMOGENEOUS'] == 'FALSE' \
+                 or dictProprietes[self.dictGroupes[nom]['MATERIAL'][:]]['valeur']['CONDUCTIVITY']['HOMOGENEOUS'] == 'FALSE': # recherche si matériau non-homogène
+                    self.materiauxGroupesTousHomogenes = False # alors tous les matériaux ne sont pas homogènes
+                if dictProprietes[self.dictGroupes[nom]['MATERIAL'][:]]['valeur']['PERMEABILITY']['ISOTROPIC'] == 'FALSE' \
+                 or dictProprietes[self.dictGroupes[nom]['MATERIAL'][:]]['valeur']['CONDUCTIVITY']['ISOTROPIC'] == 'FALSE': # recherche si matériau non-homogène
+                    self.materiauxGroupesTousIsotropes = False # alors tous les matériaux ne sont pas isotropes
+                # ecriture du bloc complet
+                self.texteCarmel3D+="     ["+typeBloc+"\n" # debut de bloc
+                if usePrefix:
+                    nomReel = self.nomReelGroupe(nom, typeBloc)
+                else:
+                    nomReel = nom
+                self.texteCarmel3D+="        NAME "+nomReel+"\n" # ecriture du nom (reel) du groupe du maillage
+                self.texteCarmel3D+=  dictProprietes[self.dictGroupes[nom]['MATERIAL'][:]]['texte'] # ecriture des proprietes du type associe
+                self.texteCarmel3D+="     ]\n" # fin de bloc
+
+   def creaBLOC_DIELECTRIC(self, nomsGroupes) :
+        """Constitution du bloc DIELECTRIC du fichier PHYS"""
+        typeBloc = 'DIELECTRIC' # initialisation du type de bloc
+        dictProprietes = self.dictMaterDielectric # initialisation du dictionnaire des proprietes du bloc
+        if self.debug: 
+            print 'cles materiaux de type %(type_bloc)s=%(cle_bloc)s' % {'type_bloc': typeBloc, 'cle_bloc': dictProprietes.keys()}
+        for nom in nomsGroupes: # parcours des noms des groupes de maillage
+            print "jdc materiaux= %s" %(self.dictGroupes['ordreMateriauxJdC'])
+            if self.dictGroupes[nom]['MATERIAL'][:] in dictProprietes.keys(): # test si le nom du materiau associe est du bon type
+                if dictProprietes[self.dictGroupes[nom]['MATERIAL'][:]]['valeur']['PERMEABILITY']['LAW'] == 'NONLINEAR': # Erreur si ce matériau est non-linéaire
+                    print u"ERREUR! Le matériau de nom %s associé au groupe %s doit avoir sa perméabilité (PERMEABILITY) linéaire (LINEAR) seulement." % (self.dictGroupes[nom]['MATERIAL'][:],  nom)
+                    raise ValueError, self.dictGroupes[nom]['MATERIAL'][:] + ',' +  nom + tr(" : ce materiau (nom, groupe associe) doit avoir sa permeabilite (PERMEABILITY) lineaire (LINEAR) seulement.")
+                if dictProprietes[self.dictGroupes[nom]['MATERIAL'][:]]['valeur']['PERMEABILITY']['HOMOGENEOUS'] == 'FALSE': # recherche si matériau non-homogène
+                    self.materiauxGroupesTousHomogenes = False # alors tous les matériaux ne sont pas homogènes
+                if dictProprietes[self.dictGroupes[nom]['MATERIAL'][:]]['valeur']['PERMEABILITY']['ISOTROPIC'] == 'FALSE': # recherche si matériau non-homogène
+                    self.materiauxGroupesTousIsotropes = False # alors tous les matériaux ne sont pas isotropes
+                 # ecriture du bloc complet
+                self.texteCarmel3D+="     ["+typeBloc+"\n" # debut de bloc
+                self.texteCarmel3D+="        NAME "+nom+"\n" # ecriture du nom (reel) du groupe du maillage
+                self.texteCarmel3D+=  dictProprietes[self.dictGroupes[nom]['MATERIAL'][:]]['texte'] # ecriture des proprietes du type associe
+                self.texteCarmel3D+="     ]\n" # fin de bloc
+    
+   def creaBLOC_ZSURFACIC(self, nomsGroupes) :
+        """Constitution du bloc ZSURFACIC du fichier PHYS"""
+        typeBloc = 'ZSURFACIC' # initialisation du type de bloc
+        dictProprietes = self.dictMaterZsurfacic # initialisation du dictionnaire des proprietes du bloc
+        if self.debug: 
+            print 'cles materiaux de type %(type_bloc)s=%(cle_bloc)s' % {'type_bloc': typeBloc, 'cle_bloc': dictProprietes.keys()}
+        for nom in nomsGroupes: # parcours des noms des groupes de maillage
+            if self.dictGroupes[nom]['MATERIAL'][:]  in dictProprietes.keys(): # test si le nom du materiau associe est du bon type
+                # ecriture du bloc complet
+                self.texteCarmel3D+="     ["+typeBloc+"\n" # debut de bloc
+                if usePrefix:
+                    nomReel = self.nomReelGroupe(nom, typeBloc)
+                else:
+                    nomReel = nom
+                self.texteCarmel3D+="        NAME "+nomReel+"\n" # ecriture du nom (reel) du groupe du maillage
+                self.texteCarmel3D+=  dictProprietes[self.dictGroupes[nom]['MATERIAL'][:] ] # ecriture des proprietes du type associe
+                self.texteCarmel3D+="     ]\n" # fin de bloc
+
+   def creaBLOC_EMISO(self) :
+        """constitution du bloc EM_ISOTROPIC_FILES du fichier PHYS"""
+        for cle in self.dictMaterEmIso.keys():
+            self.texteCarmel3D+="     [EM_ISOTROPIC_FILES\n"
+            self.texteCarmel3D+= self.dictMaterEmIso[cle] 
+            self.texteCarmel3D+="     ]\n"
+
+   def creaBLOC_EMANISO(self) :
+        """constitution du bloc EM_ANISOTROPIC_FILES du fichier PHYS"""
+        for cle in self.dictMaterEmAnIso.keys():
+            self.texteCarmel3D+="     [EM_ANISOTROPIC_FILES\n"
+            self.texteCarmel3D+=  self.dictMaterEmAnIso[cle] 
+            self.texteCarmel3D+="     ]\n"
+
+   def creaBLOC_ZINSULATOR(self, nomsGroupes) :
+        """Constitution du bloc ZINSULATOR du fichier PHYS"""
+        typeBloc = 'ZINSULATOR' # initialisation du type de bloc
+        dictProprietes = self.dictMaterZinsulator # initialisation du dictionnaire des proprietes du bloc
+        if self.debug: print 'cles materiaux de type '+typeBloc+'=', dictProprietes.keys()
+        for nom in nomsGroupes: # parcours des noms des groupes de maillage
+            if self.dictGroupes[nom]['MATERIAL'][:]  in dictProprietes.keys(): # test si le nom du materiau associe est du bon type
+                # ecriture du bloc complet
+                self.texteCarmel3D+="     ["+typeBloc+"\n" # debut de bloc
+                if usePrefix:
+                    nomReel = self.nomReelGroupe(nom, typeBloc)
+                else:
+                    nomReel = nom
+                self.texteCarmel3D+="        NAME "+nomReel+"\n" # ecriture du nom (reel) du groupe du maillage
+                self.texteCarmel3D+=  dictProprietes[self.dictGroupes[nom]['MATERIAL'][:] ] # ecriture des proprietes du type associe
+                self.texteCarmel3D+="     ]\n" # fin de bloc
+
+   def creaBLOC_NILMAT(self, nomsGroupes) :
+        """Constitution du bloc NILMAT du fichier PHYS"""
+        typeBloc = 'NILMAT' # initialisation du type de bloc
+        dictProprietes = self.dictMaterNilmat # initialisation du dictionnaire des proprietes du bloc
+        if self.debug: 
+            print 'cles materiaux de type %(type_bloc)s=%(cle_bloc)s' % {'type_bloc': typeBloc, 'cle_bloc': dictProprietes.keys()}
+        for nom in nomsGroupes: # parcours des noms des groupes de maillage
+            if self.dictGroupes[nom]['MATERIAL'][:]  in dictProprietes.keys(): # test si le nom du materiau associe est du bon type
+                # ecriture du bloc complet
+                self.texteCarmel3D+="     ["+typeBloc+"\n" # debut de bloc
+                if usePrefix:
+                    nomReel = self.nomReelGroupe(nom, typeBloc)
+                else:
+                    nomReel = nom
+                self.texteCarmel3D+="        NAME "+nomReel+"\n" # ecriture du nom (reel) du groupe du maillage
+                self.texteCarmel3D+=  dictProprietes[self.dictGroupes[nom]['MATERIAL'][:]] # ecriture des proprietes du type associe
+                self.texteCarmel3D+="     ]\n" # fin de bloc
+
+#----------------------------------------------------------------------------------------
+   def generBLOC_SOURCES(self):
+        """constitution du bloc SOURCES du fichier PHYS"""
+        self.texteCarmel3D+="[SOURCES\n"
+#        # tri alphabetique de tous les groupes de maillage associes a des sources
+        nomsGroupes = self.dictGroupes['ordreSourcesJdC'][:] 
+        nomsGroupes.sort() 
+     #   print "RESULTAT APRES FUSION  self.dictGroupes= %s" %(self.dictGroupesnomsGroupes)
+        
+        if self.debug:
+            print 'noms groupes de mailles associes a des sources \
+                            (ordre JdC puis tri)=%(g_maillage_orig)s %(g_maillage_trie)s' % \
+                            {'g_maillage_orig': self.dictGroupes['ordreSourcesJdC'], \
+                             'g_maillage_trie': nomsGroupes}
+        if self.dictSourceStInd != {}: self.creaBLOC_STRANDED_INDUCTOR(nomsGroupes)
+        if self.dictSourceEport != {}: self.creaBLOC_EPORT(nomsGroupes)
+        if self.dictSourceHport != {}: self.creaBLOC_HPORT(nomsGroupes)
+        # fin du bloc SOURCES du fichier PHYS
+        self.texteCarmel3D+="]\n"
+
+
+   def creaBLOC_STRANDED_INDUCTOR(self, nomsGroupes) :
+        """constitution du bloc STRANDED_INDUCTOR du fichier PHYS"""
+        if self.debug: 
+            print 'cles sources STRANDED_INDUCTOR= %s' % self.dictSourceStInd.keys()
+        typeBloc = 'STRANDED_INDUCTOR'
+#        print "liste des NOM=%s" %(nom)
+        for nom in nomsGroupes: # parcours des noms des groupes de maillage
+            if self.dictGroupes[nom]['SOURCE'][:]  in self.dictSourceStInd.keys(): # test si le nom de la source associee est un inducteur bobine
+                # ecriture du bloc de l'inducteur bobine
+                self.texteCarmel3D+="     [STRANDED_INDUCTOR\n" # debut de bloc
+                self.texteCarmel3D+="        NAME "+nom+"\n" # ecriture du nom (reel) du groupe du maillage
+                self.texteCarmel3D+=  self.dictSourceStInd[self.dictGroupes[nom]['SOURCE'][:] ] # ecriture des proprietes de l'inducteur bobine
+                self.texteCarmel3D+="     ]\n" # fin de bloc
+
+   def creaBLOC_EPORT(self, nomsGroupes) :
+        """constitution du bloc EPORT du fichier PHYS"""
+        if self.debug: 
+            print 'cles sources EPORT= %s' % self.dictSourceEport.keys()
+        typeBloc = 'EPORT'
+        for nom in nomsGroupes: # parcours des noms des groupes de maillage
+            if self.dictGroupes[nom]['SOURCE'][:]  in self.dictSourceEport.keys(): # test si le nom de la source associee est un port electrique
+                # ecriture du bloc du port electrique
+                self.texteCarmel3D+="     [EPORT\n" # debut de bloc
+                if usePrefix:
+                    nomReel = self.nomReelGroupe(nom, typeBloc)
+                else:
+                    nomReel = nom
+                self.texteCarmel3D+="        NAME "+nomReel+"\n" # ecriture du nom (reel) du groupe du maillage
+                self.texteCarmel3D+=  self.dictSourceEport[self.dictGroupes[nom]['SOURCE'][:] ] # ecriture des proprietes du port electrique
+                self.texteCarmel3D+="     ]\n" # fin de bloc
+
+   def creaBLOC_HPORT(self, nomsGroupes) :
+        """constitution du bloc HPORT du fichier PHYS"""
+        if self.debug: 
+            print 'cles sources HPORT= %s' % self.dictSourceHport.keys()
+        typeBloc = 'HPORT'
+        for nom in nomsGroupes: # parcours des noms des groupes de maillage
+            if self.dictGroupes[nom]['SOURCE'][:] in self.dictSourceHport.keys(): # test si le nom de la source associee est un port magnetique
+                # ecriture du bloc du port magnetique
+                self.texteCarmel3D+="     [HPORT\n" # debut de bloc
+                if usePrefix:
+                    nomReel = self.nomReelGroupe(nom, typeBloc)
+                else:
+                    nomReel = nom
+                self.texteCarmel3D+="        NAME "+nomReel+"\n" # ecriture du nom (reel) du groupe du maillage
+                self.texteCarmel3D+=  self.dictSourceHport[self.dictGroupes[nom]['SOURCE'][:]] # ecriture des proprietes du port magnetique
+                self.texteCarmel3D+="     ]\n" # fin de bloc
+                
+   def generSTRANDED_INDUCTOR_GEOMETRY(self, obj):
+        """preparation du bloc STRANDED_INDUCTOR_GEOMETRY"""
+
+        texte=""
+        self.direction=obj.valeur["Direction"]
+        self.section=obj.valeur["Section"]
+        self.forme=obj.valeur["Forme"]
+#        texte+="\n%s" %(self.domaine)
+
+        if self.forme=="Circulaire" : self.generCIRCULAR_STRANDED_INDUCTOR_GEOMETRY(obj)
+        else: 
+            texte+="\n1"
+            texte+="\n%s" % ' '.join(map(str, self.direction))
+            texte+="\n%g" % (self.section)
+            self.dictStrand[obj.getSdname()]=texte  
+        if self.debug: 
+            print texte 
+
+   def generCIRCULAR_STRANDED_INDUCTOR_GEOMETRY(self, obj):
+            texte=""
+            self.centre=obj.valeur["Centre"]
+            texte+="\n2"
+            texte+="\n%s" % ' '.join(map(str,self.direction))
+            texte+="\n%s" % ' '.join(map(str, self.centre))
+            texte+="\n%g" % (self.section)
+            self.dictStrand[obj.getSdname()]=texte  
+            if self.debug: 
+                print texte
+
+
+   def creaBLOC_STRANDED_INDUCTOR_GEOMETRY(self, nomsGroupes):  
+        """Ecriture de chaque inducteur bobiné dans le in.gendof. Gestion des inducteurs en un ou plusieurs morceaux, avec le domaine.
+        Attention! L'argument nomSGroupes n'est pas utile ici. A supprimer. Routine à renommer aussi.
+        """
+        if self.debug: 
+            print 'dictGroupes=', self.dictGroupes
+            print 'cles sources STRANDED_INDUCTOR_GEOMETRY= %s' % self.dictStrand.keys()
+            print "nomsGroupes=%s" %(nomsGroupes)
+        nomsSources=self.dictGroupes['ordreDomaineJdC']
+        nomsSources.sort() # tri alphabétique des inducteurs, réclamé par gendof.exe
+        if self.debug: print"nomsSources=%s" %nomsSources
+        for nom in nomsSources:  
+            if self.debug: print "nomSource courant=",nom
+            if self.dictGroupes[nom].has_key('SOURCE'):
+                if self.dictGroupes[nom]['SOURCE'] not in self.dictPort :
+                    if not self.dictGroupes[nom].has_key('DOMAINE'): raise ValueError, nom + tr(" : il manque un Domaine a cet inducteur.")
+                    self.texteCarmel3D_INGEND2+="\n%s" %(self.dictGroupes[nom]['DOMAINE']) # écriture du nom de domaine
+            else:
+                    if not self.dictGroupes[nom].has_key('DOMAINE'): raise ValueError,  nom + tr(" : il manque un Domaine a cet inducteur.")
+                    self.texteCarmel3D_INGEND2+="\n%s" %(self.dictGroupes[nom]['DOMAINE']) # écriture du nom de domaine                
+            if self.dictGroupes[nom].has_key('STRAND'): # inducteur en un seul morceau
+                if not self.dictGroupes[nom].has_key('DOMAINE'): raise ValueError,  nom + tr(" : il manque un Domaine a cet inducteur.")
+                strand = self.dictGroupes[nom]['STRAND'] 
+                if self.debug: print "un seul morceau : nomStrand courant=", strand
+                self.texteCarmel3D_INGEND2+=  self.dictStrand[strand]
+            if self.dictGroupes[nom].has_key('LISTE'): # inducteur en plusieurs morceaux
+                listeStrand = self.dictGroupes[nom]['LISTE'] # liste des groupes de maillage composant l'inducteur, ou groupe tout seul si inducteur en un seul morceau
+                for strand in listeStrand: 
+                    #strand = strand.replace("'", "") # suppression des guillemets simples
+                    if self.debug: print "plusieurs morceaux : nomStrand courant=",strand
+                    if self.debug: print "self.dictGroupes[strand]=", self.dictGroupes[strand]
+                    self.texteCarmel3D_INGEND2+=  self.dictStrand[self.dictGroupes[strand]['STRAND'] ]
+                                                                    
+   def creaBLOC_PORTS_GEOMETRY(self, nomsGroupes):  
+        if self.debug:
+           print "self.dictSourceEport=",  self.dictSourceEport
+           print "self.dictSourceHport=",  self.dictSourceHport
+        nomsSources=self.dictGroupes['ordreDomaineJdC']
+        nomsSources.sort() # tri alphabétique des inducteurs, réclamé par gendof.exe
+
+        for nom in nomsSources: 
+            port=self.dictGroupes[nom]['SOURCE']
+            if self.dictGroupes[nom]['SOURCE'] in self.dictPort :
+                self.texteCarmel3D_INGEND2+="\n%s" %(self.dictGroupes[nom]['DOMAINE']) # écriture du nom de domaine
+                port=self.dictGroupes[nom]['SOURCE']
+
+                if self.dictPort[port].has_key('EPORT'):# inducteur en un seul morceau   
+                    if self.dictPort[port]['EPORT']=="VOLTAGE":
+                        self.texteCarmel3D_INGEND2+= "\n1"
+                    else:
+                        self.texteCarmel3D_INGEND2+= "\n2"
+                if self.dictPort[port].has_key('HPORT'):# inducteur en un seul morceau   
+                    if self.dictPort[port]['HPORT']=="VOLTAGE":
+                        self.texteCarmel3D_INGEND2+= "\n1"
+                    else:
+                        self.texteCarmel3D_INGEND2+= "\n2"  
+
+#-------------------------------------
+# Methodes utilitaires
+# ------------------------------------
+   def formateCOMPLEX(self,nbC):
+        """prise en compte des differentes formes de description d un nombre complexe
+        3 formats possibles : 2 listes (anciennement tuples?)  et 1 nombre complexe
+        """
+        if self.debug:
+            print "formatage"
+            print "type : %(type_nb_c)s pour %(nb_c)s" % {'type_nb_c': type(nbC), 'nb_c': nbC}
+        nbformate =""
+        if isinstance(nbC,(tuple,list)):
+            if nbC[0] == "'RI'" :
+                nbformate = "COMPLEX " + str(nbC[1])+" "+str(nbC[2])            
+            if nbC[0] == "'MP'" :
+                nbformate = "POLAR " + str(nbC[1])+" "+str(nbC[2])            
+        else:
+            nbformate = "COMPLEX " + str(nbC.real)+" "+str(nbC.imag)
+        if self.debug: 
+            print "nbformate : %s" % nbformate
+        return nbformate
+   
+   def nomReelGroupe(self, nom, typeBloc=None):
+        """Calcule et retourne le nom reel du groupe de maillage donne en entree,
+        en tenant compte de l'utilisation de prefixes ou pas, et cela pour le type
+        de bloc du fichier PHYS specifie.
+        Cette routine verifie aussi, en cas d'utilisation de prefixes, si le prefixe est en adequation avec le type du bloc.
+        """
+        from string import join
+        if self.debug: 
+            print "nom groupe original : %(nom)s avec usePrefix=%(use_prefix)s devient...", \
+                            {'nom': nom, 'use_prefix': str(usePrefix)}
+        nomReel= None # nom affiche dans le fichier PHYS, sans prefixe a priori
+        if usePrefix:
+            # suppression du prefixe si present
+            partiesNom = nom.split(sepNomGroupeMaille) # separation du nom du groupe en parties
+            # les tests suivants ne generent une erreur que si le prefixe est obligatoire
+            if len(partiesNom) < 2: # test d'erreur, pas de separateur donc nom incorrect, i.e. sans prefixe c'est sur
+                print "ERREUR! ce groupe de maille (%s) n'a pas de prefixe \
+                                indiquant le type de materiau ou de source associee" % (nom, )
+            elif partiesNom[0] not in listePrefixesGroupeMaille: # prefixe non defini
+                print "ERREUR! ce groupe de maille (%s) n'a pas de prefixe valable" %  (nom, )
+            else:   
+                # verification de l'adequation du prefixe avec le type de bloc demande, si fourni    
+                if typeBloc is not None:
+                    if typeBloc not in dictPrefixesGroupeMaille: # test validite de typeBloc, devant etre une cle du dictionnaire
+                        print "ERREUR! ce type de bloc (%s) n'est pas valable" % (str(typeBloc), )
+                    elif partiesNom[0] not in dictPrefixesGroupeMaille[typeBloc]: # pas de prefixe correct pour ce type de bloc
+                        print "ERREUR! ce groupe de maille (%(nom)s) n'a pas \
+                                        le prefixe correct pour etre associe a un type %(type_bloc)s", \
+                                         {'nom': nom, 'type_bloc': str(typeBloc)}
+                    else: # c'est bon
+                        nomReel = join(partiesNom[1:], sepNomGroupeMaille) # reconstruction du nom du groupe sans prefixe complet
+                        if self.debug: 
+                            print "ce groupe de maille (%(nom)s) a un prefixe qui \
+                                            est supprime automatiquement pour devenir : %(nom_reel)s", \
+                                            {'nom': nom, 'nom_reel': nomReel}
+                else: # c'est bon
+                    nomReel = join(partiesNom[1:], sepNomGroupeMaille) # reconstruction du nom du groupe sans prefixe complet
+                    if self.debug: 
+                        print "ce groupe de maille (%(nom)s) a un prefixe qui \
+                                        est supprime automatiquement pour devenir : %(nom_reel)s", \
+                                        {'nom': nom, 'nom_reel': nomReel}
+        if self.debug: 
+            print "... %s", nomReel
+        return nomReel