]> SALOME platform Git repositories - tools/eficas.git/commitdiff
Salome HOME
il : prise en compte des modifs de Lille
authorilct <>
Tue, 16 Oct 2012 07:48:05 +0000 (07:48 +0000)
committerilct <>
Tue, 16 Oct 2012 07:48:05 +0000 (07:48 +0000)
generator/generator_CARMEL3D.py

index 3d41cadc5a241097ba324e5190248d204dda5e64..41c3c3321a38e7dc70aa059624d9abdc6a63df17 100644 (file)
-# -*- coding: utf-8 -*-\r
-# Copyright (C) 2007-2012   EDF R&D\r
-#\r
-# This library is free software; you can redistribute it and/or\r
-# modify it under the terms of the GNU Lesser General Public\r
-# License as published by the Free Software Foundation; either\r
-# version 2.1 of the License.\r
-#\r
-# This library is distributed in the hope that it will be useful,\r
-# but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
-# Lesser General Public License for more details.\r
-#\r
-# You should have received a copy of the GNU Lesser General Public\r
-# License along with this library; if not, write to the Free Software\r
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA\r
-#\r
-# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com\r
-#\r
-"""\r
-   Ce module contient le plugin generateur de fichier au format \r
-   CARMEL3D pour EFICAS.\r
-\r
-"""\r
-import traceback\r
-import types,string,re,os\r
-\r
-from generator_python import PythonGenerator\r
-\r
-# dictionnaire contenant la liste des materiaux :\r
-#     cle = nom du materiau \r
-#     valeur = nature du materiau ; correspond a un sous bloc du bloc MATERIALS du fichier de parametres Carmel3D\r
-#\r
-# les materiaux sont : \r
-#  - des materiaux de reference connus fournis par THEMIS,\r
-#  - ou des materiaux generiques theoriques \r
-#\r
-#\r
-dictNatureMaterRef={"ACIER_CIMBLOT":"CONDUCTOR", \r
-                    "ACIER_Noir":"CONDUCTOR", \r
-                    "ACIER_PE":"CONDUCTOR", \r
-                    "ALU":"CONDUCTOR", \r
-                    "BRONZE":"CONDUCTOR", \r
-                    "CUIVRE":"CONDUCTOR", \r
-                    "FERRITE_Mn_Zn":"CONDUCTOR", \r
-                    "FERRITE_Ni_Zn":"CONDUCTOR", \r
-                    "INCONEL600":"CONDUCTOR", \r
-                    "POTASSE":"CONDUCTOR",\r
-                    "COND_LINEAR":"CONDUCTOR",\r
-                    "M6X2ISO1":"CONDUCTOR", \r
-                    "AIR":"NOCOND", \r
-                    "FERRITEB30":"NOCOND", \r
-                    "E24":"NOCOND",\r
-                    "FEV470":"NOCOND",\r
-                    "FEV600":"NOCOND",\r
-                    "FEV800":"NOCOND",\r
-                    "FEV1000":"NOCOND",\r
-                    "HA600":"NOCOND",\r
-                    "M600_65":"NOCOND",\r
-                    "NOCOND_LINEAR":"NOCOND",\r
-                    "NOCOND_NL_MAR":"NOCOND",\r
-                    "NOCOND_NL_MARSAT":"NOCOND",\r
-                    "M6X":"EMANISO",\r
-                    "M6X_lineaire":"EMANISO",\r
-                    "M6X_homog":"EMANISO",\r
-                    "EM_ISOTROPIC":"EMISO",\r
-                    "EM_ANISOTROPIC":"EMANISO",\r
-                    "ZSURFACIC":"ZSURFACIC",\r
-                    "ZINSULATOR":"ZINSULATOR",\r
-                    "NILMAT":"NILMAT"\r
-                    }\r
-\r
-def entryPoint():\r
-   """\r
-      Retourne les informations necessaires pour le chargeur de plugins\r
-      Ces informations sont retournees dans un dictionnaire\r
-   """\r
-   return {\r
-        # Le nom du plugin\r
-          'name' : 'CARMEL3D',\r
-        # La factory pour creer une instance du plugin\r
-          'factory' : CARMEL3DGenerator,\r
-          }\r
-\r
-\r
-class CARMEL3DGenerator(PythonGenerator):\r
-   """\r
-      Ce generateur parcourt un objet de type JDC et produit\r
-      un texte au format eficas et \r
-      un texte au format attendu par le code Carmel3D (fichier '.PHYS') \r
-\r
-   """\r
-   # Les extensions de fichier permis?\r
-   extensions=('.comm',)\r
-\r
-#----------------------------------------------------------------------------------------\r
-   def gener(self,obj,format='brut',config=None):\r
-       \r
-      self.initDico()\r
-      \r
-      # Cette instruction genere le contenu du fichier de commandes (persistance)\r
-      self.text=PythonGenerator.gener(self,obj,format)\r
-\r
-      # Cette instruction genere le contenu du fichier de parametres pour le code Carmel3D\r
-      # si le jdc est valide (sinon cela n a pas de sens)\r
-      if obj.isvalid() : \r
-           # constitution du bloc VERSION du fichier PHYS (existe toujours)\r
-           self.generBLOC_VERSION(obj)\r
-\r
-           # constitution du bloc MATERIALS du fichier PHYS (existe toujours)\r
-           self.generBLOC_MATERIALS()\r
-\r
-           # constitution du bloc SOURCES du fichier PHYS s il existe\r
-           if self.source == "oui" : self.generBLOC_SOURCES()\r
-\r
-#      print "texte carmel3d :\n",self.texteCarmel3D\r
-      print "dictName : ",self.dictName\r
-      print "dictMaterConductor : ",self.dictMaterConductor\r
-#      print "dictMaterNocond : ",self.dictMaterNocond\r
-      \r
-      return self.text\r
-\r
-\r
-#----------------------------------------------------------------------------------------\r
-# initialisations\r
-#----------------------------------------------------------------------------------------\r
-   \r
-   def initDico(self) :\r
\r
-      self.texteCarmel3D=""\r
-      self.source="non"\r
-      self.dicoEtapeCourant=None\r
-      self.dicoMCFACTCourant=None\r
-      self.dicoCourant=None\r
-      self.dictName={"grm_def":"        NAME      gr_maille_a_saisir\n"}\r
-      self.dictMaterConductor={}\r
-      self.dictMaterNocond={}\r
-      self.dictMaterZsurfacic={}\r
-      self.dictMaterEmIso={}\r
-      self.dictMaterEmAnIso={}\r
-      self.dictMaterNilmat={}\r
-      self.dictMaterZinsulator={}\r
-      self.dictSourceStInd={}\r
-      self.dictSourceEport={}\r
-      self.dictSourceHport={}\r
-\r
-\r
-#----------------------------------------------------------------------------------------\r
-# ecriture\r
-#----------------------------------------------------------------------------------------\r
-\r
-   def writeDefault(self,fn) :\r
-      '''\r
-      Ecrit le fichier de parametres (PHYS) pour le code Carmel3D\r
-      '''\r
-      #print "ecriture fic phys"\r
-      filePHYS = fn[:fn.rfind(".")] + '.phys'\r
-      f = open( str(filePHYS), 'wb')\r
-      f.write( self.texteCarmel3D)\r
-      f.close()\r
-\r
-#----------------------------------------------------------------------------------------\r
-#  analyse de chaque noeud de l'arbre \r
-#----------------------------------------------------------------------------------------\r
-\r
-   def generMCSIMP(self,obj) :\r
-      """\r
-      recuperation de l objet MCSIMP\r
-      """\r
-      \r
-   #   print "MCSIMP", obj.nom, "  ", obj.valeur\r
-      \r
-      s=PythonGenerator.generMCSIMP(self,obj)\r
-      self.dicoCourant[obj.nom]=obj.valeurFormatee\r
-      return s\r
-\r
-  \r
-#----------------------------------------------------------------------------------------\r
-   def generMCFACT(self,obj) :\r
-      """\r
-      recuperation de l objet MCFACT\r
-      """\r
-      dico={}\r
-      self.dicoMCFACTCourant=dico\r
-      self.dicoCourant=self.dicoMCFACTCourant\r
-      s=PythonGenerator.generMCFACT(self,obj)\r
-      self.dicoEtapeCourant[obj.nom]=self.dicoMCFACTCourant\r
-      self.dicoMCFACTCourant=None\r
-      self.dicoCourant=self.dicoEtapeCourant\r
-      return s\r
-\r
-  \r
-#----------------------------------------------------------------------------------------\r
-   def generPROC_ETAPE(self,obj):\r
-      # analyse des PROC du catalogue  ( VERSION )   \r
-         \r
-      dico={}\r
-      self.dicoEtapeCourant=dico\r
-      self.dicoCourant=self.dicoEtapeCourant\r
-      s=PythonGenerator.generPROC_ETAPE(self,obj)\r
-      obj.valeur=self.dicoEtapeCourant\r
-      \r
- #     print "PROC_ETAPE", obj.nom, "  ", obj.valeur\r
-     \r
-      s=PythonGenerator.generPROC_ETAPE(self,obj)\r
-      return s\r
-\r
-  \r
-#----------------------------------------------------------------------------------------\r
-   def generETAPE(self,obj):\r
-      # analyse des OPER du catalogue\r
-      dico={}\r
-      self.dicoEtapeCourant=dico\r
-      self.dicoCourant=self.dicoEtapeCourant\r
-      s=PythonGenerator.generETAPE(self,obj)\r
-      obj.valeur=self.dicoEtapeCourant\r
-\r
-      print "ETAPE :obj.nom =", obj.nom, " , obj.valeur= ", obj.valeur\r
-\r
-      if obj.nom=="MESH_GROUPE" : self.generMESHGROUPE(obj)\r
-      if obj.nom=="MATERIALS" : self.generMATERIALS(obj)\r
-      if obj.nom=="SOURCES" : self.generSOURCES(obj)\r
-\r
-      s=PythonGenerator.generETAPE(self,obj)\r
-      return s\r
-\r
-#----------------------------------------------------------------------------------------\r
-#----------------------------------------------------------------------------------------\r
-   def generMESHGROUPE(self,obj):\r
-      # preparation de la ligne NAME referencant le groupe de mailles \r
-      # associe le groupe de mailles au materiau ou a la source utilisateur\r
-       try :\r
-           texteName="        NAME     "+obj.get_sdname()+"\n"\r
-           for cle in obj.valeur :\r
-               print "cle : ", cle\r
-               print "cle sd  : ", obj.valeur[cle].nom\r
-               print "cle dico : ",self.dictName.keys()\r
-               if  obj.valeur[cle].nom in self.dictName :\r
-                   self.dictName[obj.valeur[cle].nom] += (texteName,)\r
-               else:     \r
-                   self.dictName[obj.valeur[cle].nom]=(texteName,) \r
-\r
-               print "dans gener_mesh 2 dictName : ",self.dictName\r
-       except:\r
-           pass\r
-\r
-\r
-   def generMATERIALS(self,obj):\r
-      # preparation du bloc MATERIALS du fichier PHYS \r
-          texte=""\r
-         # print "gener materials obj valeur = ", obj.valeur\r
-         try :\r
-              nature=dictNatureMaterRef[obj.valeur['MAT_REF']]\r
-              if nature=="CONDUCTOR" : self.generMATERIALSCONDUCTOR(obj)\r
-             if nature=="NOCOND" : self.generMATERIALSNOCOND(obj)\r
-             if nature=="ZSURFACIC" : self.generMATERIALSZSURFACIC(obj)\r
-             if nature=="EMISO" : self.generMATERIALSEMISO(obj)\r
-             if nature=="EMANISO" : self.generMATERIALSEMANISO(obj)\r
-             if nature=="NILMAT" : self.generMATERIALSNILMAT(obj)\r
-             if nature=="ZINSULATOR" : self.generMATERIALSZINSULATOR(obj)\r
-         except:\r
-             pass\r
-\r
-   def generMATERIALSCONDUCTOR(self,obj):\r
-      # preparation du sous bloc CONDUCTOR\r
-       texte=""\r
-      # print "__________cond_________________"\r
-      # parcours des proprietes du sous bloc CONDUCTOR\r
-       for keyN1 in obj.valeur :\r
-          if keyN1=='MAT_REF': continue\r
-      #     print "keyN1=", keyN1\r
-#         print obj.valeur[keyN1]['TYPE_LAW']\r
-          texte+="         ["+keyN1+"\n"\r
-      # loi lineaire reelle\r
-          if obj.valeur[keyN1]['TYPE_LAW']=='LINEAR_REAL' :\r
-             texte+="            LAW LINEAR\n"\r
-             texte+="            HOMOGENOUS TRUE\n"\r
-             texte+="            ISOTROPIC TRUE\n"\r
-             texte+="            VALUE COMPLEX "+str(obj.valeur[keyN1]["VALUE_REAL"])+" 0\n"\r
-      # loi lineaire complexe\r
-          if obj.valeur[keyN1]['TYPE_LAW']=='LINEAR_COMPLEX' :\r
-#               print "si avec linear complex"\r
-                 texte+="            LAW LINEAR\n"\r
-                texte+="            HOMOGENOUS TRUE\n"\r
-                texte+="            ISOTROPIC TRUE\n"\r
-                texte+="            VALUE "\r
-  #               print "nbre a formater : ",obj.valeur[keyN1]["VALUE_COMPLEX"]\r
-                 chC= self.formateCOMPLEX(obj.valeur[keyN1]["VALUE_COMPLEX"])\r
-                texte+= chC+"\n"\r
-      # loi non lineaire de nature spline, Marrocco ou Marrocco et Saturation\r
-      #  seuls les reels sont pris en compte\r
-          if obj.valeur[keyN1]['TYPE_LAW']=='NONLINEAR' :\r
-                     texte+="            LAW NONLINEAR\n"\r
-                     texte+="            HOMOGENOUS TRUE\n"\r
-                     texte+="            ISOTROPIC TRUE\n"\r
-                     texte+="            VALUE COMPLEX "+str(obj.valeur[keyN1]["VALUE"])+" 0\n"\r
-                     texte+="            [NONLINEAR \n"\r
-                     texte+="                ISOTROPY TRUE\n"\r
-                     texte+="                NATURE "+str(obj.valeur[keyN1]['NATURE'])+"\n"\r
-                     for keyN2 in obj.valeur[keyN1] :\r
-                         if keyN2 != 'TYPE_LAW' and keyN2 != 'VALUE' and keyN2 != 'NATURE' :\r
-                              texte+="                "+keyN2+" "+str(obj.valeur[keyN1][keyN2])+"\n"\r
-                     texte+="            ]"+"\n"\r
-\r
-          texte+="         ]"+"\n"\r
-\r
-       self.dictMaterConductor[obj.get_sdname()]=texte\r
-     #  self.dictMaterConductor[obj.get_sdname()]=[texte,]\r
-#       print texte\r
-   \r
-\r
-   def generMATERIALSNOCOND(self,obj):\r
-      # preparation du sous bloc NOCOND\r
-       texte=""\r
-      # print "______________nocond_____________"\r
-      # parcours des proprietes du sous bloc NOCOND\r
-       for keyN1 in obj.valeur :\r
-          if keyN1=='MAT_REF': continue\r
-          # print "type loi = ", obj.valeur[keyN1]['TYPE_LAW']\r
-      # debut du sous bloc de propriete du NOCOND\r
-          texte+="         ["+keyN1+"\n"\r
-      # loi lineaire reelle\r
-          if obj.valeur[keyN1]['TYPE_LAW']=='LINEAR_REAL' :\r
-             texte+="            LAW LINEAR\n"\r
-             texte+="            HOMOGENOUS TRUE\n"\r
-             texte+="            ISOTROPIC TRUE\n"\r
-             texte+="            VALUE COMPLEX "+str(obj.valeur[keyN1]["VALUE_REAL"])+" 0\n"\r
-      # loi lineaire complexe\r
-          if obj.valeur[keyN1]['TYPE_LAW']=='LINEAR_COMPLEX' :\r
-                texte+="            LAW LINEAR\n"\r
-                texte+="            HOMOGENOUS TRUE\n"\r
-                texte+="            ISOTROPIC TRUE\n"\r
-                texte+="            VALUE "\r
-                 chC= self.formateCOMPLEX(obj.valeur[keyN1]["VALUE_COMPLEX"])\r
-                texte+= chC+"\n"\r
-                 \r
-      # loi non lineaire de nature spline, Marrocco ou Marrocco et Saturation\r
-      #  seuls les reels sont pris en compte\r
-          if obj.valeur[keyN1]['TYPE_LAW']=='NONLINEAR' :\r
-                     texte+="            LAW NONLINEAR\n"\r
-                     texte+="            HOMOGENOUS TRUE\n"\r
-                     texte+="            ISOTROPIC TRUE\n"\r
-                     texte+="            VALUE COMPLEX "+str(obj.valeur[keyN1]["VALUE"])+" 0\n"\r
-                     texte+="            [NONLINEAR \n"\r
-                     texte+="                ISOTROPY TRUE\n"\r
-                     texte+="                NATURE "+str(obj.valeur[keyN1]['NATURE'])+"\n"\r
-                     for keyN2 in obj.valeur[keyN1] :\r
-                         if keyN2 != 'TYPE_LAW' and keyN2 != 'VALUE' and keyN2 != 'NATURE' :\r
-                              texte+="                "+keyN2+" "+str(obj.valeur[keyN1][keyN2])+"\n"\r
-                     texte+="            ]"+"\n"\r
-\r
-      # fin du sous bloc de propriete\r
-          texte+="         ]"+"\n"\r
-       #print "texte = ", texte    \r
-       self.dictMaterNocond[obj.get_sdname()]=texte\r
\r
-   def generMATERIALSZSURFACIC(self,obj):\r
-      # preparation du sous bloc ZSURFACIC\r
-       texte=""\r
-       #print "______________zsurf_____________"\r
-       for keyN1 in obj.valeur :\r
-          if keyN1=='MAT_REF': continue\r
-  #         print "keyN1=", keyN1\r
-#         print obj.valeur[keyN1]['TYPE_LAW']\r
-          texte+="         ["+keyN1+"\n"\r
-      # loi lineaire reelle\r
-          if obj.valeur[keyN1]['TYPE_LAW']=='LINEAR_REAL' :\r
-             texte+="            LAW LINEAR\n"\r
-             texte+="            HOMOGENOUS TRUE\n"\r
-             texte+="            ISOTROPIC TRUE\n"\r
-             texte+="            VALUE COMPLEX "+str(obj.valeur[keyN1]["VALUE_REAL"])+" 0\n"\r
-      # loi lineaire complexe\r
-          if obj.valeur[keyN1]['TYPE_LAW']=='LINEAR_COMPLEX' :\r
-                texte+="            LAW LINEAR\n"\r
-                texte+="            HOMOGENOUS TRUE\n"\r
-                texte+="            ISOTROPIC TRUE\n"\r
-                texte+="            VALUE "\r
-                 chC= self.formateCOMPLEX(obj.valeur[keyN1]["VALUE_COMPLEX"])\r
-                texte+= chC+"\n"\r
-                 \r
-          texte+="         ]"+"\n"\r
-\r
-       self.dictMaterZsurfacic[obj.get_sdname()]=texte\r
-\r
-   def generMATERIALSEMISO(self,obj):\r
-      # preparation du sous bloc EMISO\r
-       texte=""\r
-       texte+="        CONDUCTIVITY MED "+str(obj.valeur["CONDUCTIVITY_File"])+"\n"\r
-       texte+="        PERMEABILITY MED "+str(obj.valeur["PERMEABILITY_File"])+"\n"\r
-\r
- #      print "obj get sdname= ", obj.get_sdname()\r
-    #   if obj.get_sdname() in self.dictMaterEmIso.keys() :\r
-     #    self.dictMaterEmIso[obj.get_sdname()].append(texte) \r
-      # else :\r
-       self.dictMaterEmIso[obj.get_sdname()]=texte\r
-  \r
-   def generMATERIALSEMANISO(self,obj):\r
-      # preparation du sous bloc EMANISO\r
-       texte=""\r
-       texte+="        CONDUCTIVITY  "+str(obj.valeur["CONDUCTIVITY_File"])+"\n"\r
-       texte+="        PERMEABILITY  "+str(obj.valeur["PERMEABILITY_File"])+"\n"\r
-\r
-     #  print "obj get sdname= ", obj.get_sdname()\r
-     #  if obj.get_sdname() in self.dictMaterEmAnIso.keys() :\r
-     #    self.dictMaterEmAnIso[obj.get_sdname()].append(texte) \r
-     #  else :\r
-       self.dictMaterEmAnIso[obj.get_sdname()]=texte\r
-   \r
-   def generMATERIALSNILMAT(self,obj):\r
-      # preparation du sous bloc NILMAT\r
-       texte=""\r
-       self.dictMaterNilmat[obj.get_sdname()]=texte\r
-   \r
-   def generMATERIALSZINSULATOR(self,obj):\r
-      # preparation du sous bloc ZINSULATOR\r
-       texte=""\r
-       self.dictMaterZinsulator[obj.get_sdname()]=texte\r
-\r
-#-------------------------------------------------------------------\r
-\r
-   def generSOURCES(self,obj):\r
-      # preparation du bloc SOURCES du fichier PHYS \r
-     #     print "gener sources obj valeur = ", obj.valeur\r
-          texte=""\r
-         try :\r
-              self.source="oui"\r
-              typesource=obj.valeur['TYPE_SOURCE']\r
-              if typesource=="STRANDED_INDUCTOR" : self.generSOURCES_ST_IND(obj)\r
-              if typesource=="HPORT" : self.generSOURCES_H_PORT(obj)\r
-              if typesource=="EPORT" : self.generSOURCES_E_PORT(obj)\r
-         except:\r
-             pass\r
-\r
-   def generSOURCES_ST_IND(self,obj):\r
-      # preparation du sous bloc STRANDED INDUCTOR \r
-          texte=""\r
-         try :\r
-             texte+="        NTURNS "+ str(obj.valeur['NTURNS']) + "\n"\r
-             texte+="        CURJ POLAR " + str(obj.valeur['CURJ']) +" " +str(obj.valeur['POLAR'])+"\n" \r
-              self.dictSourceStInd[obj.get_sdname()]=texte\r
-  #            print texte\r
-         except:\r
-             pass\r
-\r
-   def generSOURCES_H_PORT(self,obj):\r
-      # preparation du sous bloc HPORT  \r
-          texte=""\r
-         try :\r
-             texte+="        TYPE "+ str(obj.valeur['TYPE']) + "\n"\r
-             texte+="        AMP POLAR " + str(obj.valeur['AMP']) +" " +str(obj.valeur['POLAR'])+"\n" \r
-              self.dictSourceHport[obj.get_sdname()]=texte\r
-  #            print texte\r
-         except:\r
-             pass\r
-\r
-   def generSOURCES_E_PORT(self,obj):\r
-      # preparation du sous bloc EPORT  \r
-          texte=""\r
-         try :\r
-             texte+="        TYPE "+ str(obj.valeur['TYPE']) + "\n"\r
-             texte+="        AMP POLAR " + str(obj.valeur['AMP']) +" " +str(obj.valeur['POLAR'])+"\n" \r
-              self.dictSourceEport[obj.get_sdname()]=texte\r
-  #            print texte\r
-         except:\r
-             pass\r
-\r
-#---------------------------------------------------------------------------------------\r
-# traitement fichier PHYS\r
-#---------------------------------------------------------------------------------------\r
-\r
-   def generBLOC_VERSION(self,obj) :\r
-      # constitution du bloc VERSION du fichier PHYS\r
-      # creation d une entite  VERSION ; elle sera du type PROC car decrit ainsi\r
-      # dans le du catalogue\r
-      version=obj.addentite('VERSION',pos=None)\r
-      self.generPROC_ETAPE(obj.etapes[0])\r
-      self.texteCarmel3D+="["+obj.etapes[0].nom+"\n"\r
-      for cle in obj.etapes[0].valeur :\r
-          self.texteCarmel3D+="   "+cle+" "+str(obj.etapes[0].valeur[cle])+"\n"\r
-      self.texteCarmel3D+="]\n"\r
-      # destruction de l entite creee \r
-      obj.suppentite(version)\r
-\r
-#----------------------------------------------------------------------------------------\r
-   def generBLOC_MATERIALS(self) :\r
-      '''\r
-      Prepare une partie du contenu du fichier de parametres (PHYS) pour le code Carmel3D\r
-      (bloc MATERIALS) \r
-      le bloc MATERIALS existe toujours ! \r
-      '''\r
-      #print "cle dico materconductor : " , self.dictMaterConductor.keys()\r
-      #print "cle dico materdielectric : " , self.dictMaterNocond.keys()\r
-    \r
-      # constitution du bloc MATERIALS du fichier PHYS\r
-      self.texteCarmel3D+="[MATERIALS\n"\r
-\r
-      # constitution du bloc CONDUCTOR du fichier PHYS si existe\r
-      if self.dictMaterConductor != {} : self.creaBLOC_CONDUCTOR()\r
-     \r
-      # constitution du bloc NOCOND du fichier PHYS si exixte\r
-      if self.dictMaterNocond != {} : self.creaBLOC_NOCOND()\r
-     \r
-      # constitution du bloc ZSURFACIC du fichier PHYS si exixte\r
-      if self.dictMaterZsurfacic != {} : self.creaBLOC_ZSURFACIC()\r
-     \r
-      # constitution du bloc EM_ISOTROPIC_FILES du fichier PHYS si exixte\r
-      if self.dictMaterEmIso != {} : self.creaBLOC_EMISO()\r
-     \r
-      # constitution du bloc EM_ANISOTROPIC_FILES du fichier PHYS si exixte\r
-      if self.dictMaterEmAnIso != {} : self.creaBLOC_EMANISO()\r
-     \r
-      # constitution du bloc NILMAT du fichier PHYS si exixte\r
-      if self.dictMaterNilmat != {} : self.creaBLOC_NILMAT()\r
-     \r
-      # constitution du bloc ZINSULATOR du fichier PHYS si exixte\r
-      if self.dictMaterZinsulator != {} : self.creaBLOC_ZINSULATOR()\r
-     \r
-      # fin du bloc MATERIALS du fichier PHYS\r
-      self.texteCarmel3D+="]\n"\r
-  \r
-    \r
-   def creaBLOC_CONDUCTOR(self) :\r
-      # constitution du bloc CONDUCTOR du fichier PHYS\r
-    \r
-      for cle in self.dictMaterConductor.keys():\r
-          if cle not in self.dictName.keys():\r
-              self.texteCarmel3D+="     [CONDUCTOR\n"\r
-              print "Attention : groupe de maille non defini pour materiau : ",cle\r
-              print "fichier phys incomplet "\r
-              self.texteCarmel3D+=str(self.dictName["grm_def"])\r
-              self.texteCarmel3D+= self.dictMaterConductor[cle] \r
-              self.texteCarmel3D+="     ]\n"\r
-          else : \r
-              for elt_tup in self.dictName[cle] :\r
-                   self.texteCarmel3D+="     [CONDUCTOR\n"\r
-                   self.texteCarmel3D+=str(elt_tup)\r
-                   self.texteCarmel3D+= self.dictMaterConductor[cle] \r
-                   self.texteCarmel3D+="     ]\n"\r
-     \r
-\r
-\r
-   def creaBLOC_NOCOND(self) :\r
-      # constitution du bloc NOCOND du fichier PHYS\r
-    \r
-      for cle in self.dictMaterNocond.keys():\r
-          if cle not in self.dictName.keys():\r
-              self.texteCarmel3D+="     [NOCOND\n"\r
-              print "Attention : groupe de maille non defini pour materiau : ",cle\r
-              print "fichier phys incomplet "\r
-              self.texteCarmel3D+=str(self.dictName["grm_def"])\r
-              self.texteCarmel3D+= self.dictMaterNocond[cle] \r
-              self.texteCarmel3D+="     ]\n"\r
-          else : \r
-              for elt_tup in self.dictName[cle] :\r
-                   self.texteCarmel3D+="     [NOCOND\n"\r
-                   self.texteCarmel3D+=str(elt_tup)\r
-                   self.texteCarmel3D+= self.dictMaterNocond[cle] \r
-                   self.texteCarmel3D+="     ]\n"\r
-\r
-\r
-   def creaBLOC_ZSURFACIC(self) :\r
-      # constitution du bloc ZSURFACIC du fichier PHYS\r
-    \r
-      for cle in self.dictMaterZsurfacic.keys():\r
-          if cle not in self.dictName.keys():\r
-              self.texteCarmel3D+="     [ZSURFACIC\n"\r
-              print "Attention : groupe de maille non defini pour materiau : ",cle\r
-              print "fichier phys incomplet "\r
-              self.texteCarmel3D+=str(self.dictName["grm_def"])\r
-              self.texteCarmel3D+= self.dictMaterZsurfacic[cle] \r
-              self.texteCarmel3D+="     ]\n"\r
-          else : \r
-              for elt_tup in self.dictName[cle] :\r
-                   self.texteCarmel3D+="     [ZSURFACIC\n"\r
-                   self.texteCarmel3D+=str(elt_tup)\r
-                   self.texteCarmel3D+= self.dictMaterZsurfacic[cle] \r
-                   self.texteCarmel3D+="     ]\n"\r
-\r
-   def creaBLOC_EMISO(self) :\r
-      # constitution du bloc EMISO du fichier PHYS\r
-    \r
-      for cle in self.dictMaterEmIso.keys():\r
-          self.texteCarmel3D+="     [EM_ISOTROPIC_FILES\n"\r
-          self.texteCarmel3D+= self.dictMaterEmIso[cle] \r
-          self.texteCarmel3D+="     ]\n"\r
-\r
-   def creaBLOC_EMANISO(self) :\r
-      # constitution du bloc EMANISO du fichier PHYS\r
-    \r
-      for cle in self.dictMaterEmAnIso.keys():\r
-          self.texteCarmel3D+="     [EM_ANISOTROPIC_FILES\n"\r
-          self.texteCarmel3D+=  self.dictMaterEmAnIso[cle] \r
-          self.texteCarmel3D+="     ]\n"\r
-\r
-   def creaBLOC_ZINSULATOR(self) :\r
-      # constitution du bloc ZINSULATOR du fichier PHYS\r
-    \r
-      for cle in self.dictMaterZinsulator.keys():\r
-          if cle not in self.dictName.keys():\r
-              self.texteCarmel3D+="     [ZINSULATOR\n"\r
-              print "Attention : groupe de maille non defini pour materiau : ",cle\r
-              print "fichier phys incomplet "\r
-              self.texteCarmel3D+=str(self.dictName["grm_def"])\r
-              self.texteCarmel3D+="     ]\n"\r
-          else : \r
-              for elt_tup in self.dictName[cle] :\r
-                  self.texteCarmel3D+="     [ZINSULATOR\n"\r
-                  self.texteCarmel3D+=str(elt_tup)\r
-                  self.texteCarmel3D+="     ]\n"\r
-\r
-   def creaBLOC_NILMAT(self) :\r
-      # constitution du bloc NILMAT du fichier PHYS\r
-    \r
-      for cle in self.dictMaterNilmat.keys():\r
-          if cle not in self.dictName.keys():\r
-              self.texteCarmel3D+="     [NILMAT\n"\r
-              print "Attention : groupe de maille non defini pour materiau : ",cle\r
-              print "fichier phys incomplet "\r
-              self.texteCarmel3D+=str(self.dictName["grm_def"])\r
-              self.texteCarmel3D+="     ]\n"\r
-          else : \r
-              for elt_tup in self.dictName[cle] :\r
-                  self.texteCarmel3D+="     [NILMAT\n"\r
-                  self.texteCarmel3D+=str(elt_tup)\r
-                  self.texteCarmel3D+="     ]\n"\r
-\r
-#----------------------------------------------------------------------------------------\r
-   def generBLOC_SOURCES(self):\r
-      \r
-      # constitution du bloc SOURCES du fichier PHYS\r
-      self.texteCarmel3D+="[SOURCES\n"\r
-\r
-      if self.dictSourceStInd != {} : self.creaBLOC_ST_IND()\r
-\r
-      if self.dictSourceEport != {} : self.creaBLOC_EPORT()\r
-\r
-      if self.dictSourceHport != {} : self.creaBLOC_HPORT()\r
-\r
-      # fin du bloc SOURCES du fichier PHYS\r
-      self.texteCarmel3D+="]\n"\r
-\r
-\r
-   def creaBLOC_ST_IND(self) :\r
-      # constitution du bloc STRANDED INDUCTOR du fichier PHYS\r
-    \r
-      for cle in self.dictSourceStInd.keys():\r
-          if cle not in self.dictName.keys():\r
-              self.texteCarmel3D+="     [STRANDED INDUCTOR\n"\r
-              print "Attention : groupe de maille non defini pour source : ",cle\r
-              print "fichier phys incomplet "\r
-              self.texteCarmel3D+=str(self.dictName["grm_def"])\r
-              self.texteCarmel3D+= self.dictSourceStInd[cle] \r
-              self.texteCarmel3D+="     ]\n"\r
-          else : \r
-              for elt_tup in self.dictName[cle] :\r
-                   self.texteCarmel3D+="     [STRANDED INDUCTOR\n"\r
-                   self.texteCarmel3D+=str(elt_tup)\r
-                   self.texteCarmel3D+=  self.dictSourceStInd[cle] \r
-                   self.texteCarmel3D+="     ]\n"\r
-\r
-   def creaBLOC_EPORT(self) :\r
-      # constitution du bloc EPORT du fichier PHYS\r
-    \r
-      for cle in self.dictSourceEport.keys():\r
-          if cle not in self.dictName.keys():\r
-              self.texteCarmel3D+="     [EPORT\n"\r
-              print "Attention : groupe de maille non defini pour source : ",cle\r
-              print "fichier phys incomplet "\r
-              self.texteCarmel3D+=str(self.dictName["grm_def"])\r
-              self.texteCarmel3D+= self.dictSourceEport[cle] \r
-              self.texteCarmel3D+="     ]\n"\r
-          else : \r
-              for elt_tup in self.dictName[cle] :\r
-                   self.texteCarmel3D+="     [EPORT\n"\r
-                   self.texteCarmel3D+=str(elt_tup)\r
-                   self.texteCarmel3D+=  self.dictSourceEport[cle] \r
-                   self.texteCarmel3D+="     ]\n"\r
-\r
-   def creaBLOC_HPORT(self) :\r
-      # constitution du bloc HPORT du fichier PHYS\r
-    \r
-      for cle in self.dictSourceHport.keys():\r
-          if cle not in self.dictName.keys():\r
-              self.texteCarmel3D+="     [HPORT\n"\r
-              print "Attention : groupe de maille non defini pour source : ",cle\r
-              print "fichier phys incomplet "\r
-              self.texteCarmel3D+=str(self.dictName["grm_def"])\r
-              self.texteCarmel3D+= self.dictSourceHport[cle] \r
-              self.texteCarmel3D+="     ]\n"\r
-          else : \r
-              for elt_tup in self.dictName[cle] :\r
-                   self.texteCarmel3D+="     [HPORT\n"\r
-                   self.texteCarmel3D+=str(elt_tup)\r
-                   self.texteCarmel3D+=  self.dictSourceHport[cle] \r
-                   self.texteCarmel3D+="     ]\n"\r
-\r
-#----------------------------------------------------------------------------\r
-\r
-   def formateCOMPLEX(self,nbC):\r
- # prise en compte des differentes formes de description d un nombre complexe\r
- # 3 formats possibles : 2 listes (anciennement tuples?)  et 1 nombre complexe\r
- #      print "formatage "\r
- #      print "type : ", type(nbC), "pour ", nbC\r
-       nbformate =""\r
-       if isinstance(nbC,(tuple,list)) :\r
-          if nbC[0] == "'RI'" :\r
-                nbformate = "COMPLEX " + str(nbC[1])+" "+str(nbC[2])            \r
-      \r
-          if nbC[0] == "'MP'" :\r
-                nbformate = "POLAR " + str(nbC[1])+" "+str(nbC[2])            \r
-\r
-       else :\r
-          nbformate = "COMPLEX " + str(nbC.real)+" "+str(nbC.imag)\r
-\r
-  #     print "nbformate : ", nbformate\r
-       return nbformate\r
-\r
+# -*- coding: utf-8 -*-
+# Copyright (C) 2007-2012   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 generator_python import PythonGenerator
+
+# dictionnaire contenant la liste des materiaux :
+#     cle = nom du materiau 
+#     valeur = nature du materiau ; correspond a un sous bloc du bloc MATERIALS du fichier de parametres Carmel3D
+#
+# les materiaux sont : 
+#  - des materiaux de reference connus fournis par THEMIS,
+#  - ou des materiaux generiques theoriques 
+#
+#
+dictNatureMaterRef={"DIELECTRIC":"DIELECTRIC",
+                    "CONDUCTOR":"CONDUCTOR",
+                    "ZSURFACIC":"ZSURFACIC",
+                    "ZINSULATOR":"ZINSULATOR",
+                    "NILMAT":"NILMAT",
+                    "EM_ISOTROPIC":"EMISO",
+                    "EM_ANISOTROPIC":"EMANISO",
+                    "ACIER_CIMBLOT":"CONDUCTOR", 
+                    "ACIER_Noir":"CONDUCTOR", 
+                    "ACIER_PE":"CONDUCTOR", 
+                    "ALU":"CONDUCTOR", 
+                    "BRONZE":"CONDUCTOR", 
+                    "CUIVRE":"CONDUCTOR", 
+                    "FERRITE_Mn_Zn":"CONDUCTOR", 
+                    "FERRITE_Ni_Zn":"CONDUCTOR", 
+                    "INCONEL600":"CONDUCTOR", 
+                    "POTASSE":"CONDUCTOR",
+                    "M6X2ISO1":"CONDUCTOR", 
+                    "AIR":"DIELECTRIC", 
+                    "FERRITEB30":"DIELECTRIC", 
+                    "E24":"DIELECTRIC",
+                    "FEV470":"DIELECTRIC",
+                    "FEV600":"DIELECTRIC",
+                    "FEV800":"DIELECTRIC",
+                    "FEV1000":"DIELECTRIC",
+                    "HA600":"DIELECTRIC",
+                    "M600_65":"DIELECTRIC",
+                    "M6X":"EMANISO",
+                    "M6X_lineaire":"EMANISO",
+                    "M6X_homog":"EMANISO"
+                    }
+
+# Groupes de mailles dont les types sont définis par des préfixes dans leur nom
+usePrefix = False # les noms ont des préfixes (True) ou non (False)
+# liste des préfixes des groupes de mailles, sans le caractère _ séparant le préfixe du reste du nom
+# Ce préfixe (et caractère _) doivent être supprimés 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 préfixes des groupes de mailles, sans le séparateur, 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', )}
+# séparateur entre le préfixe et le reste du nom du groupe de maille
+sepNomGroupeMaille = '_'
+
+def entryPoint():
+   """
+      Retourne les informations necessaires pour le chargeur de plugins
+      Ces informations sont retournees dans un dictionnaire
+   """
+   return {
+        # Le nom du plugin
+          'name' : 'CARMEL3D',
+        # La factory pour creer une instance du plugin
+          'factory' : CARMEL3DGenerator,
+          }
+
+
+class CARMEL3DGenerator(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()
+      
+      # 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() : 
+           # 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()
+
+#      print "texte carmel3d :\n",self.texteCarmel3D
+#      print "dictMaterDielectric : ",self.dictMaterDielectric
+      if self.debug:
+         print "dictMaterConductor : ",self.dictMaterConductor
+      
+      return self.text
+
+
+#----------------------------------------------------------------------------------------
+# initialisations
+#----------------------------------------------------------------------------------------
+   
+   def initDico(self) :
+      self.texteCarmel3D=""
+      self.debug = False # affichage de messages pour déboguage (.true.) ou non
+      self.dicoEtapeCourant=None
+      self.dicoMCFACTCourant=None
+      self.dicoCourant=None
+      self.dictGroupesMaillage = {'ordreMateriauxJdC':[], 'ordreSourcesJdC':[]} # association des noms de groupes de maillage avec les noms de matériaux ou de sources, en sauvegardant l'ordre du JdC en séparant les groupes associés à des matériaux de ceux associés à des sources
+      self.dictMaterConductor={}
+      self.dictMaterDielectric={}
+      self.dictMaterZsurfacic={}
+      self.dictMaterEmIso={}
+      self.dictMaterEmAnIso={}
+      self.dictMaterNilmat={}
+      self.dictMaterZinsulator={}
+      self.dictSourceStInd={}
+      self.dictSourceEport={}
+      self.dictSourceHport={}
+
+
+#----------------------------------------------------------------------------------------
+# ecriture
+#----------------------------------------------------------------------------------------
+
+   def writeDefault(self,fn) :
+        """Ecrit le fichier de parametres (PHYS) pour le code Carmel3D"""
+        if self.debug: print "ecriture fic phys"
+        filePHYS = fn[:fn.rfind(".")] + '.phys'
+        f = open( str(filePHYS), 'wb')
+        f.write( self.texteCarmel3D)
+        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)
+        self.dicoCourant[obj.nom]=obj.valeurFormatee
+        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, "  ", obj.valeur
+        s=PythonGenerator.generPROC_ETAPE(self,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 =", obj.nom, " , obj.valeur= ", obj.valeur
+        if obj.nom=="MESHGROUP" : self.generMESHGROUP(obj)
+        if obj.nom=="MATERIAL" : self.generMATERIAL(obj)
+        if obj.nom=="SOURCE" : self.generSOURCE(obj)
+        s=PythonGenerator.generETAPE(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:
+                nomGroupeMaillage = self.nomReelGroupeMaillage(obj.get_sdname()) # nom du groupe de maillage, i.e. nom du concept, avec préfixes enlevés
+            else:
+                nomGroupeMaillage = obj.get_sdname() # nom du groupe de maillage, i.e. nom du concept
+            # test: un et un seul nom de matériau ou source doit être associé à ce groupe de maillage, via les clés MATERIAL et SOURCE, respectivement.
+            # test sur un seul attribut, non pertinent car il peut y en avoir plusieurs.
+            #assert len(obj.valeur.keys())==1,u"Un et un seul nom de matériau ou source doit être associé à ce groupe du maillage :"+nomGroupeMaillage
+            #
+            # on utilise le fait que obj.valeur est un dictionnaire
+            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 présence de matériau et source à la fois
+                raise ValueError, u"ce groupe de maillage ("+nomGroupeMaillage+") est associé à au moins un matériau et au moins une source."
+            # association à un matériau
+            if 'MATERIAL' in obj.valeur.keys():
+                self.dictGroupesMaillage[nomGroupeMaillage] = obj.valeur['MATERIAL'].nom # sauvegarde de l'association entre ce groupe de maillage et un matériau ou source, par son nom, i.e. nom du concept du matériau ou de la source
+                self.dictGroupesMaillage['ordreMateriauxJdC'].append(nomGroupeMaillage) # sauvegarde du nom du groupe de maillage associé à un matériau, dans l'ordre du JdC
+            # association à une source
+            elif 'SOURCE' in obj.valeur.keys():
+                self.dictGroupesMaillage[nomGroupeMaillage] = obj.valeur['SOURCE'].nom # sauvegarde de l'association entre ce groupe de maillage et un matériau ou source, par son nom, i.e. nom du concept du matériau ou de la source
+                self.dictGroupesMaillage['ordreSourcesJdC'].append(nomGroupeMaillage) # sauvegarde du nom du groupe de maillage associé à une source, dans l'ordre du JdC
+            # erreur ni matériau ni source associée
+            else:
+                raise ValueError, u"ce groupe de maillage ("+nomGroupeMaillage+") n'est associé à aucun matériau ou source."
+            if self.debug:
+                print "self.dictGroupesMaillage=",self.dictGroupesMaillage
+        except:
+            pass
+
+
+   def generMATERIAL(self,obj):
+        """préparation du bloc correspondant à un matériau du fichier PHYS"""
+        texte=""
+        if self.debug: print "gener material obj valeur = ", obj.valeur
+        try :
+            nature=dictNatureMaterRef[obj.valeur['MAT_REF']]
+            if nature=="CONDUCTOR" : self.generMATERIAL_CONDUCTOR(obj)
+            if nature=="DIELECTRIC" : self.generMATERIAL_DIELECTRIC(obj)
+            if nature=="ZSURFACIC" : self.generMATERIAL_ZSURFACIC(obj)
+            if nature=="EMISO" : self.generMATERIAL_EMISO(obj)
+            if nature=="EMANISO" : self.generMATERIAL_EMANISO(obj)
+            if nature=="NILMAT" : self.generMATERIAL_NILMAT(obj)
+            if nature=="ZINSULATOR" : self.generMATERIAL_ZINSULATOR(obj)
+        except:
+            pass
+
+   def generMATERIAL_CONDUCTOR(self,obj):
+      # preparation du sous bloc CONDUCTOR
+      texte=""
+      # print "__________cond_________________"
+      # parcours des proprietes du sous bloc CONDUCTOR
+      for keyN1 in obj.valeur :
+       if keyN1=='MAT_REF': continue
+      #     print "keyN1=", keyN1
+#      print obj.valeur[keyN1]['TYPE_LAW']
+       texte+="         ["+keyN1+"\n"
+      # loi lineaire reelle
+       if obj.valeur[keyN1]['TYPE_LAW']=='LINEAR_REAL' :
+          texte+="            LAW LINEAR\n"
+          texte+="            HOMOGENEOUS "+str(obj.valeur[keyN1]["HOMOGENEOUS"])+"\n"
+          texte+="            ISOTROPIC "+str(obj.valeur[keyN1]["ISOTROPIC"])+"\n"
+          texte+="            VALUE COMPLEX "+str(obj.valeur[keyN1]["VALUE_REAL"])+" 0\n"
+      # loi lineaire complexe
+          if obj.valeur[keyN1]['TYPE_LAW']=='LINEAR_COMPLEX' :
+   #            print "si avec linear complex"
+            texte+="            LAW LINEAR\n"
+            texte+="            HOMOGENEOUS "+str(obj.valeur[keyN1]["HOMOGENEOUS"])+"\n"
+            texte+="            ISOTROPIC "+str(obj.valeur[keyN1]["ISOTROPIC"])+"\n"
+            texte+="            VALUE "
+  #               print "nbre a formater : ",obj.valeur[keyN1]["VALUE_COMPLEX"]
+            chC= self.formateCOMPLEX(obj.valeur[keyN1]["VALUE_COMPLEX"])
+            texte+= chC+"\n"
+      # loi non lineaire de nature spline, Marrocco ou Marrocco et Saturation
+      #  seuls les reels sont pris en compte
+       if obj.valeur[keyN1]['TYPE_LAW']=='NONLINEAR' :
+          texte+="            LAW NONLINEAR\n"
+          texte+="            HOMOGENEOUS "+str(obj.valeur[keyN1]["HOMOGENEOUS"])+"\n"
+          texte+="            ISOTROPIC "+str(obj.valeur[keyN1]["ISOTROPIC"])+"\n"
+          texte+="            VALUE COMPLEX "+str(obj.valeur[keyN1]["VALUE"])+" 0\n"
+          texte+="            [NONLINEAR \n"
+          texte+="                ISOTROPY TRUE\n"
+          texte+="                NATURE "+str(obj.valeur[keyN1]['NATURE'])+"\n"
+          for keyN2 in obj.valeur[keyN1] :
+              if keyN2 != 'TYPE_LAW' and keyN2 != 'VALUE' and keyN2 != 'NATURE' :
+                   texte+="                "+keyN2+" "+str(obj.valeur[keyN1][keyN2])+"\n"
+          texte+="            ]"+"\n"
+          texte+="         ]"+"\n"
+
+       self.dictMaterConductor[obj.get_sdname()]=texte
+     #  self.dictMaterConductor[obj.get_sdname()]=[texte,]
+#       print texte
+   
+
+   def generMATERIAL_DIELECTRIC(self,obj):
+      # preparation du sous bloc DIELECTRIC
+       texte=""
+      # print "______________nocond_____________"
+      # parcours des proprietes du sous bloc DIELECTRIC
+       for keyN1 in obj.valeur :
+           if keyN1=='MAT_REF': continue
+              # print "type loi = ", obj.valeur[keyN1]['TYPE_LAW']
+          # debut du sous bloc de propriete du DIELECTRIC
+           texte+="         ["+keyN1+"\n"
+          # loi lineaire reelle
+           if obj.valeur[keyN1]['TYPE_LAW']=='LINEAR_REAL' :
+              texte+="            LAW LINEAR\n"
+              texte+="            HOMOGENEOUS "+str(obj.valeur[keyN1]["HOMOGENEOUS"])+"\n"
+              texte+="            ISOTROPIC "+str(obj.valeur[keyN1]["ISOTROPIC"])+"\n"
+              texte+="            VALUE COMPLEX "+str(obj.valeur[keyN1]["VALUE_REAL"])+" 0\n"
+          # loi lineaire complexe
+           if obj.valeur[keyN1]['TYPE_LAW']=='LINEAR_COMPLEX' :
+                 texte+="            LAW LINEAR\n"
+                 texte+="            HOMOGENEOUS "+str(obj.valeur[keyN1]["HOMOGENEOUS"])+"\n"
+                 texte+="            ISOTROPIC "+str(obj.valeur[keyN1]["ISOTROPIC"])+"\n"
+                 texte+="            VALUE "
+                 chC= self.formateCOMPLEX(obj.valeur[keyN1]["VALUE_COMPLEX"])
+                 texte+= chC+"\n"
+                  
+          # loi non lineaire de nature spline, Marrocco ou Marrocco et Saturation
+          #  seuls les reels sont pris en compte
+           if obj.valeur[keyN1]['TYPE_LAW']=='NONLINEAR' :
+                texte+="            LAW NONLINEAR\n"
+                texte+="            HOMOGENEOUS "+str(obj.valeur[keyN1]["HOMOGENEOUS"])+"\n"
+                texte+="            ISOTROPIC "+str(obj.valeur[keyN1]["ISOTROPIC"])+"\n"
+                texte+="            VALUE COMPLEX "+str(obj.valeur[keyN1]["VALUE"])+" 0\n"
+                texte+="            [NONLINEAR \n"
+                texte+="                ISOTROPY TRUE\n"
+                texte+="                NATURE "+str(obj.valeur[keyN1]['NATURE'])+"\n"
+                for keyN2 in obj.valeur[keyN1] :
+                    if keyN2 != 'TYPE_LAW' and keyN2 != 'VALUE' and keyN2 != 'NATURE' :
+                       texte+="                "+keyN2+" "+str(obj.valeur[keyN1][keyN2])+"\n"
+                texte+="            ]"+"\n"
+           # fin du sous bloc de propriete
+           texte+="         ]"+"\n"
+        #print "texte = ", texte    
+       self.dictMaterDielectric[obj.get_sdname()]=texte
+   def generMATERIAL_ZSURFACIC(self,obj):
+      # preparation du sous bloc ZSURFACIC
+       texte=""
+       #print "______________zsurf_____________"
+       for keyN1 in obj.valeur :
+           if keyN1=='MAT_REF': continue
+      #         print "keyN1=", keyN1
+    #      print obj.valeur[keyN1]['TYPE_LAW']
+           texte+="         ["+keyN1+"\n"
+          # loi lineaire reelle
+           if obj.valeur[keyN1]['TYPE_LAW']=='LINEAR_REAL' :
+              texte+="            LAW LINEAR\n"
+              texte+="            HOMOGENEOUS "+str(obj.valeur[keyN1]["HOMOGENEOUS"])+"\n"
+              texte+="            ISOTROPIC "+str(obj.valeur[keyN1]["ISOTROPIC"])+"\n"
+              texte+="            VALUE COMPLEX "+str(obj.valeur[keyN1]["VALUE_REAL"])+" 0\n"
+          # loi lineaire complexe
+           if obj.valeur[keyN1]['TYPE_LAW']=='LINEAR_COMPLEX' :
+                texte+="            LAW LINEAR\n"
+                texte+="            HOMOGENEOUS "+str(obj.valeur[keyN1]["HOMOGENEOUS"])+"\n"
+                texte+="            ISOTROPIC "+str(obj.valeur[keyN1]["ISOTROPIC"])+"\n"
+                texte+="            VALUE "
+                chC= self.formateCOMPLEX(obj.valeur[keyN1]["VALUE_COMPLEX"])
+                texte+= chC+"\n"             
+           texte+="         ]"+"\n"
+       self.dictMaterZsurfacic[obj.get_sdname()]=texte
+
+   def generMATERIAL_EMISO(self,obj):
+        """preparation du sous bloc EM_ISOTROPIC_FILES.
+        Les fichiers sont indiqués par le chemin indiqué dans Eficas, i.e. le chemin absolu par défaut
+        """
+        texte ="        CONDUCTIVITY MED "+str(obj.valeur["CONDUCTIVITY_File"])+"\n"
+        texte+="        PERMEABILITY MED "+str(obj.valeur["PERMEABILITY_File"])+"\n"
+        # Possibilité de forcer le chemin relatif (nom de fichier seulement) plutôt que le chemin absolu par défaut
+        #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.get_sdname()
+        #   if obj.get_sdname() in self.dictMaterEmIso.keys() :
+        #    self.dictMaterEmIso[obj.get_sdname()].append(texte) 
+        # else :
+        self.dictMaterEmIso[obj.get_sdname()]=texte
+  
+   def generMATERIAL_EMANISO(self,obj):
+        """preparation du sous bloc EM_ANISOTROPIC_FILES.
+        Les fichiers sont indiqués par le chemin indiqué dans Eficas, i.e. le chemin absolu par défaut
+        """
+        texte ="        CONDUCTIVITY  "+str(obj.valeur["CONDUCTIVITY_File"])+"\n"
+        texte+="        PERMEABILITY  "+str(obj.valeur["PERMEABILITY_File"])+"\n"
+        # Possibilité de forcer le chemin relatif (nom de fichier seulement) plutôt que le chemin absolu par défaut
+        #from os.path import basename
+        #texte ="        CONDUCTIVITY  "+basename(str(obj.valeur["CONDUCTIVITY_File"]))+"\n"
+        #texte+="        PERMEABILITY  "+basename(str(obj.valeur["PERMEABILITY_File"]))+"\n"
+        #  print "obj get sdname= ", obj.get_sdname()
+        #  if obj.get_sdname() in self.dictMaterEmAnIso.keys() :
+        #    self.dictMaterEmAnIso[obj.get_sdname()].append(texte) 
+        #  else :
+        self.dictMaterEmAnIso[obj.get_sdname()]=texte
+   
+   def generMATERIAL_NILMAT(self,obj):
+      # preparation du sous bloc NILMAT
+       texte=""
+       self.dictMaterNilmat[obj.get_sdname()]=texte
+   
+   def generMATERIAL_ZINSULATOR(self,obj):
+        """"preparation du sous bloc ZINSULATOR"""
+        texte=""
+        self.dictMaterZinsulator[obj.get_sdname()]=texte
+
+#-------------------------------------------------------------------
+
+   def generSOURCE(self,obj):
+        """preparation du bloc correspondant à une source du fichier PHYS"""
+        if self.debug: print "gener source obj valeur = ", obj.valeur
+        texte=""
+        try :
+            typesource=obj.valeur['TYPE_SOURCE']
+            if typesource=="STRANDED_INDUCTOR" : self.generSOURCE_STRANDED_INDUCTOR(obj)
+            if typesource=="HPORT" : self.generSOURCE_HPORT(obj)
+            if typesource=="EPORT" : self.generSOURCE_EPORT(obj)
+        except:
+            pass
+
+   def generSOURCE_STRANDED_INDUCTOR(self,obj):
+        """preparation du sous bloc STRANDED_INDUCTOR"""
+        texte=""
+        try :
+            texte+="        NTURNS "+ str(obj.valeur['NTURNS']) + "\n"
+            texte+="        CURJ " + self.formateCOMPLEX(obj.valeur['CURJ']) + "\n"
+            self.dictSourceStInd[obj.get_sdname()]=texte
+            if self.debug: print texte
+        except:
+            pass
+
+   def generSOURCE_HPORT(self,obj):
+        """preparation du sous bloc HPORT"""
+        texte=""
+        try :
+            texte+="        TYPE "+ str(obj.valeur['TYPE']) + "\n"
+            texte+="        AMP " + self.formateCOMPLEX(obj.valeur['AMP']) + "\n"
+            self.dictSourceHport[obj.get_sdname()]=texte
+            if self.debug: print texte
+        except:
+            pass
+
+   def generSOURCE_EPORT(self,obj):
+        """preparation du sous bloc EPORT"""
+        texte=""
+        try :
+            texte+="        TYPE "+ str(obj.valeur['TYPE']) + "\n"
+            texte+="        AMP " + self.formateCOMPLEX(obj.valeur['AMP']) + "\n"
+            self.dictSourceEport[obj.get_sdname()]=texte
+            if self.debug: print texte
+        except:
+            pass
+
+#---------------------------------------------------------------------------------------
+# 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)
+
+#----------------------------------------------------------------------------------------
+   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 dico materconductor : " , self.dictMaterConductor.keys()
+            print "cle dico materdielectric : " , self.dictMaterDielectric.keys()
+        # constitution du bloc MATERIALS du fichier PHYS
+        self.texteCarmel3D+="[MATERIALS\n"
+        # tri alphabétique de tous les groupes de maillage associés à des sources (plus nécessaire Code_Carmel3D V_2_3_1 et +, mais avant oui)
+        nomsGroupesMaillage = self.dictGroupesMaillage['ordreMateriauxJdC'][:] # copie de l'original, qui est une liste
+        nomsGroupesMaillage.sort() # tri alphabétique, avec les préfixes éventuels
+        if self.debug:
+            print u"noms groupes de mailles associés à des matériaux (ordre JdC puis tri)=", self.dictGroupesMaillage['ordreMateriauxJdC'], nomsGroupesMaillage
+        # constitution du bloc CONDUCTOR du fichier PHYS si existe
+        if self.dictMaterConductor != {} : self.creaBLOC_CONDUCTOR(nomsGroupesMaillage)
+        # constitution du bloc DIELECTRIC du fichier PHYS si exixte
+        if self.dictMaterDielectric != {} : self.creaBLOC_DIELECTRIC(nomsGroupesMaillage)
+        # constitution du bloc ZSURFACIC du fichier PHYS si exixte
+        if self.dictMaterZsurfacic != {} : self.creaBLOC_ZSURFACIC(nomsGroupesMaillage)
+        # constitution du bloc NILMAT du fichier PHYS si exixte
+        if self.dictMaterNilmat != {} : self.creaBLOC_NILMAT(nomsGroupesMaillage)
+        # constitution du bloc ZINSULATOR du fichier PHYS si exixte
+        if self.dictMaterZinsulator != {} : self.creaBLOC_ZINSULATOR(nomsGroupesMaillage)
+        # Les blocs EM_ISOTROPIC_FILES et EM_ANISOTROPIC_FILES sont placés en dernier dans le fichier PHYS
+        # constitution du bloc EM_ISOTROPIC_FILES du fichier PHYS si exixte
+        if self.dictMaterEmIso != {} : self.creaBLOC_EMISO()
+        # constitution du bloc EM_ANISOTROPIC_FILES du fichier PHYS si exixte
+        if self.dictMaterEmAnIso != {} : self.creaBLOC_EMANISO()
+        # fin du bloc MATERIALS du fichier PHYS
+        self.texteCarmel3D+="]\n"  
+    
+   def creaBLOC_CONDUCTOR(self, nomsGroupesMaillage) :
+        """Constitution du bloc CONDUCTOR du fichier PHYS"""
+        typeBloc = 'CONDUCTOR' # initialisation du type de bloc
+        dictProprietes = self.dictMaterConductor # initialisation du dictionnaire des propriétés du bloc
+        if self.debug: print u'clés matériaux de type '+typeBloc+'=', dictProprietes.keys()
+        for nom in nomsGroupesMaillage: # parcours des noms des groupes de maillage
+            if self.dictGroupesMaillage[nom] in dictProprietes.keys(): # test si le nom du matériau associé est du bon type
+                # ecriture du bloc complet
+                self.texteCarmel3D+="     ["+typeBloc+"\n" # début de bloc
+                if usePrefix:
+                    nomReel = self.nomReelGroupeMaillage(nom, typeBloc)
+                else:
+                    nomReel = nom
+                self.texteCarmel3D+="        NAME "+nomReel+"\n" # ecriture du nom (réel) du groupe du maillage
+                self.texteCarmel3D+=  dictProprietes[self.dictGroupesMaillage[nom]] # ecriture des propriétés du type associé
+                self.texteCarmel3D+="     ]\n" # fin de bloc
+
+   def creaBLOC_DIELECTRIC(self, nomsGroupesMaillage) :
+        """Constitution du bloc DIELECTRIC du fichier PHYS"""
+        typeBloc = 'DIELECTRIC' # initialisation du type de bloc
+        dictProprietes = self.dictMaterDielectric # initialisation du dictionnaire des propriétés du bloc
+        if self.debug: print u'clés matériaux de type '+typeBloc+'=', dictProprietes.keys()
+        for nom in nomsGroupesMaillage: # parcours des noms des groupes de maillage
+            if self.dictGroupesMaillage[nom] in dictProprietes.keys(): # test si le nom du matériau associé est du bon type
+                # ecriture du bloc complet
+                self.texteCarmel3D+="     ["+typeBloc+"\n" # début de bloc
+                self.texteCarmel3D+="        NAME "+nom+"\n" # ecriture du nom (réel) du groupe du maillage
+                self.texteCarmel3D+=  dictProprietes[self.dictGroupesMaillage[nom]] # ecriture des propriétés du type associé
+                self.texteCarmel3D+="     ]\n" # fin de bloc
+
+   def creaBLOC_ZSURFACIC(self, nomsGroupesMaillage) :
+        """Constitution du bloc ZSURFACIC du fichier PHYS"""
+        typeBloc = 'ZSURFACIC' # initialisation du type de bloc
+        dictProprietes = self.dictMaterZsurfacic # initialisation du dictionnaire des propriétés du bloc
+        if self.debug: print u'clés matériaux de type '+typeBloc+'=', dictProprietes.keys()
+        for nom in nomsGroupesMaillage: # parcours des noms des groupes de maillage
+            if self.dictGroupesMaillage[nom] in dictProprietes.keys(): # test si le nom du matériau associé est du bon type
+                # ecriture du bloc complet
+                self.texteCarmel3D+="     ["+typeBloc+"\n" # début de bloc
+                if usePrefix:
+                    nomReel = self.nomReelGroupeMaillage(nom, typeBloc)
+                else:
+                    nomReel = nom
+                self.texteCarmel3D+="        NAME "+nomReel+"\n" # ecriture du nom (réel) du groupe du maillage
+                self.texteCarmel3D+=  dictProprietes[self.dictGroupesMaillage[nom]] # ecriture des propriétés du type associé
+                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, nomsGroupesMaillage) :
+        """Constitution du bloc ZINSULATOR du fichier PHYS"""
+        typeBloc = 'ZINSULATOR' # initialisation du type de bloc
+        dictProprietes = self.dictMaterZinsulator # initialisation du dictionnaire des propriétés du bloc
+        if self.debug: print u'clés matériaux de type '+typeBloc+'=', dictProprietes.keys()
+        for nom in nomsGroupesMaillage: # parcours des noms des groupes de maillage
+            if self.dictGroupesMaillage[nom] in dictProprietes.keys(): # test si le nom du matériau associé est du bon type
+                # ecriture du bloc complet
+                self.texteCarmel3D+="     ["+typeBloc+"\n" # début de bloc
+                if usePrefix:
+                    nomReel = self.nomReelGroupeMaillage(nom, typeBloc)
+                else:
+                    nomReel = nom
+                self.texteCarmel3D+="        NAME "+nomReel+"\n" # ecriture du nom (réel) du groupe du maillage
+                self.texteCarmel3D+=  dictProprietes[self.dictGroupesMaillage[nom]] # ecriture des propriétés du type associé
+                self.texteCarmel3D+="     ]\n" # fin de bloc
+
+   def creaBLOC_NILMAT(self, nomsGroupesMaillage) :
+        """Constitution du bloc NILMAT du fichier PHYS"""
+        typeBloc = 'NILMAT' # initialisation du type de bloc
+        dictProprietes = self.dictMaterNilmat # initialisation du dictionnaire des propriétés du bloc
+        if self.debug: print u'clés matériaux de type '+typeBloc+'=', dictProprietes.keys()
+        for nom in nomsGroupesMaillage: # parcours des noms des groupes de maillage
+            if self.dictGroupesMaillage[nom] in dictProprietes.keys(): # test si le nom du matériau associé est du bon type
+                # ecriture du bloc complet
+                self.texteCarmel3D+="     ["+typeBloc+"\n" # début de bloc
+                if usePrefix:
+                    nomReel = self.nomReelGroupeMaillage(nom, typeBloc)
+                else:
+                    nomReel = nom
+                self.texteCarmel3D+="        NAME "+nomReel+"\n" # ecriture du nom (réel) du groupe du maillage
+                self.texteCarmel3D+=  dictProprietes[self.dictGroupesMaillage[nom]] # ecriture des propriétés du type associé
+                self.texteCarmel3D+="     ]\n" # fin de bloc
+
+#----------------------------------------------------------------------------------------
+   def generBLOC_SOURCES(self):
+        """constitution du bloc SOURCES du fichier PHYS"""
+        self.texteCarmel3D+="[SOURCES\n"
+        # tri alphabétique de tous les groupes de maillage associés à des sources
+        nomsGroupesMaillage = self.dictGroupesMaillage['ordreSourcesJdC'][:] # copie de l'original, qui est une liste
+        nomsGroupesMaillage.sort() # tri alphabétique, avec les préfixes éventuels
+        if self.debug:
+            print u'noms groupes de mailles associés à des sources (ordre JdC puis tri)=', self.dictGroupesMaillage['ordreSourcesJdC'], nomsGroupesMaillage
+        if self.dictSourceStInd != {}: self.creaBLOC_STRANDED_INDUCTOR(nomsGroupesMaillage)
+        if self.dictSourceEport != {}: self.creaBLOC_EPORT(nomsGroupesMaillage)
+        if self.dictSourceHport != {}: self.creaBLOC_HPORT(nomsGroupesMaillage)
+        # fin du bloc SOURCES du fichier PHYS
+        self.texteCarmel3D+="]\n"
+
+
+   def creaBLOC_STRANDED_INDUCTOR(self, nomsGroupesMaillage) :
+        """constitution du bloc STRANDED_INDUCTOR du fichier PHYS"""
+        if self.debug: print u'clés sources STRANDED_INDUCTOR=', self.dictSourceStInd.keys()
+        typeBloc = 'STRANDED_INDUCTOR'
+        for nom in nomsGroupesMaillage: # parcours des noms des groupes de maillage
+            if self.dictGroupesMaillage[nom] in self.dictSourceStInd.keys(): # test si le nom de la source associée est un inducteur bobiné
+                # ecriture du bloc de l'inducteur bobiné
+                self.texteCarmel3D+="     [STRANDED_INDUCTOR\n" # début de bloc
+                self.texteCarmel3D+="        NAME "+nom+"\n" # ecriture du nom (réel) du groupe du maillage
+                self.texteCarmel3D+=  self.dictSourceStInd[self.dictGroupesMaillage[nom]] # ecriture des propriétés de l'inducteur bobiné
+                self.texteCarmel3D+="     ]\n" # fin de bloc
+                
+   def creaBLOC_EPORT(self, nomsGroupesMaillage) :
+        """constitution du bloc EPORT du fichier PHYS"""
+        if self.debug: print u'clés sources EPORT=', self.dictSourceEport.keys()
+        typeBloc = 'EPORT'
+        for nom in nomsGroupesMaillage: # parcours des noms des groupes de maillage
+            if self.dictGroupesMaillage[nom] in self.dictSourceEport.keys(): # test si le nom de la source associée est un port électrique
+                # ecriture du bloc du port électrique
+                self.texteCarmel3D+="     [EPORT\n" # début de bloc
+                if usePrefix:
+                    nomReel = self.nomReelGroupeMaillage(nom, typeBloc)
+                else:
+                    nomReel = nom
+                self.texteCarmel3D+="        NAME "+nomReel+"\n" # ecriture du nom (réel) du groupe du maillage
+                self.texteCarmel3D+=  self.dictSourceEport[self.dictGroupesMaillage[nom]] # ecriture des propriétés du port électrique
+                self.texteCarmel3D+="     ]\n" # fin de bloc
+
+   def creaBLOC_HPORT(self, nomsGroupesMaillage) :
+        """constitution du bloc HPORT du fichier PHYS"""
+        if self.debug: print u'clés sources HPORT=', self.dictSourceHport.keys()
+        typeBloc = 'HPORT'
+        for nom in nomsGroupesMaillage: # parcours des noms des groupes de maillage
+            if self.dictGroupesMaillage[nom] in self.dictSourceHport.keys(): # test si le nom de la source associée est un port magnétique
+                # ecriture du bloc du port magnétique
+                self.texteCarmel3D+="     [HPORT\n" # début de bloc
+                if usePrefix:
+                    nomReel = self.nomReelGroupeMaillage(nom, typeBloc)
+                else:
+                    nomReel = nom
+                self.texteCarmel3D+="        NAME "+nomReel+"\n" # ecriture du nom (réel) du groupe du maillage
+                self.texteCarmel3D+=  self.dictSourceHport[self.dictGroupesMaillage[nom]] # ecriture des propriétés du port magnétique
+                self.texteCarmel3D+="     ]\n" # fin de bloc
+
+#-------------------------------------
+# Méthodes 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(nbC), "pour ", 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 : ", nbformate
+        return nbformate
+   
+   def nomReelGroupeMaillage(self, nom, typeBloc=None):
+        """Calcule et retourne le nom réel du groupe de maillage donné en entrée,
+        en tenant compte de l'utilisation de préfixes ou pas, et cela pour le type
+        de bloc du fichier PHYS spécifié.
+        Cette routine vérifie aussi, en cas d'utilisation de préfixes, si le préfixe est en adéquation avec le type du bloc.
+        """
+        from string import join
+        if self.debug: print "nom groupe original : "+nom+" avec usePrefix="+str(usePrefix)+" devient... "
+        nomReel= None # nom affiché dans le fichier PHYS, sans préfixe a priori
+        if usePrefix:
+            # suppression du préfixe si présent
+            partiesNom = nom.split(sepNomGroupeMaille) # séparation du nom du groupe en parties
+            # les tests suivants ne génèrent une erreur que si le préfixe est obligatoire
+            if len(partiesNom) < 2: # test d'erreur, pas de séparateur donc nom incorrect, i.e. sans préfixe c'est sûr
+                print u"ERREUR! ce groupe de maille ("+nom+") n'a pas de préfixe indiquant le type de matériau ou de source associée"
+            elif partiesNom[0] not in listePrefixesGroupeMaille: # préfixe non défini
+                print u"ERREUR! ce groupe de maille ("+nom+") n'a pas de préfixe valable"
+            else:   
+                # vérification de l'adéquation du préfixe avec le type de bloc demandé, si fourni    
+                if typeBloc is not None:
+                    if typeBloc not in dictPrefixesGroupeMaille: # test validité de typeBloc, devant être une clé du dictionnaire
+                        print u"ERREUR! ce type de bloc ("+str(typeBloc)+") n'est pas valable"
+                    elif partiesNom[0] not in dictPrefixesGroupeMaille[typeBloc]: # pas de préfixe correct pour ce type de bloc
+                        print u"ERREUR! ce groupe de maille ("+nom+") n'a pas le préfixe correct pour être associé à un type "+str(typeBloc)
+                    else: # c'est bon
+                        nomReel = join(partiesNom[1:], sepNomGroupeMaille) # reconstruction du nom du groupe sans préfixe complet
+                        if self.debug: print u"ce groupe de maille ("+nom+") a un préfixe qui est supprimé automatiquement pour devenir : "+nomReel
+                else: # c'est bon
+                    nomReel = join(partiesNom[1:], sepNomGroupeMaille) # reconstruction du nom du groupe sans préfixe complet
+                    if self.debug: print u"ce groupe de maille ("+nom+") a un préfixe qui est supprimé automatiquement pour devenir : "+nomReel
+        if self.debug: print "... "+nomReel
+        return nomReel