Salome HOME
pour PSEN et Telemac
[tools/eficas.git] / generator / generator_CARMELCND.py
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2013   EDF R&D
3 #
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License.
8 #
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 # Lesser General Public License for more details.
13 #
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20 """Ce module contient le plugin generateur de fichier au format  Code_Carmel3D pour EFICAS.
21 """
22
23 import traceback
24 import types,string,re,os
25 from Extensions.i18n import tr
26 from generator_python import PythonGenerator
27 import Accas
28
29 debutTextePhys ="[VERSION\n  NUM      1\n  FILETYPE PHYS\n]\n"
30 debutTextePhys+="[MATERIALS\n"
31 texteConductor ="      [CONDUCTIVITY\n         LAW LINEAR\n"
32 texteConductor+="         HOMOGENEOUS TRUE\n"
33 texteConductor+="         ISOTROPIC  TRUE\n"
34 texteConducto2 ="  0.0000000000000000E+00\n      ]\n"
35 texteConducto2+="      [PERMEABILITY\n         LAW LINEAR\n"
36 texteConducto2+="         HOMOGENEOUS TRUE\n"
37 texteConducto2+="         ISOTROPIC  TRUE\n"
38 texteNoCond ="      [PERMITTIVITY\n         LAW LINEAR\n"
39 texteNoCond+="         HOMOGENEOUS TRUE\n         ISOTROPIC TRUE\n"
40 texteNoCond+="         VALUE COMPLEX  0.1000000000000000E+01  0.0000000000000000E+00\n"
41 texteNoCond+="      ]\n      [PERMEABILITY\n         LAW LINEAR\n"
42 texteNoCond+="         HOMOGENEOUS TRUE\n         ISOTROPIC TRUE\n"
43
44 debutTexteParam ="[VERSION\n   NUM     1\n   FILETYPE PARAM\n]\n"
45 debutTexteParam+="[PROBLEM\n   NAME HARMONIC\n]\n"
46 debutTexteParam+="[CAR_FILES\n   NAME "
47
48 debutTexteZs0 ="   [ZSURFACIC\n      NAME "
49 debutTexteZs ="\n      [CONDUCTIVITY\n"
50 debutTexteZs+="         LAW LINEAR\n"
51 debutTexteZs+="         HOMOGENEOUS TRUE\n"
52 debutTexteZs+="         ISOTROPIC TRUE\n"
53 debutTexteZs+="         VALUE COMPLEX  "
54 texteZs2     ="  0.0000000000000000E+00\n      ]\n"
55 texteZs2    +="      [PERMEABILITY\n         LAW LINEAR\n"
56 texteZs2    +="         HOMOGENEOUS TRUE\n"
57 texteZs2    +="         ISOTROPIC TRUE\n         VALUE COMPLEX  "
58 finTexteZs   ="  0.0000000000000000E+00\n      ]\n   ]\n"
59
60 def entryPoint():
61    """
62       Retourne les informations necessaires pour le chargeur de plugins
63       Ces informations sont retournees dans un dictionnaire
64    """
65    return {
66         # Le nom du plugin
67           'name' : 'CARMELCND',
68         # La factory pour creer une instance du plugin
69           'factory' : CARMELCNDGenerator,
70           }
71
72
73 class CARMELCNDGenerator(PythonGenerator):
74    """
75       Ce generateur parcourt un objet de type JDC et produit
76       un texte au format eficas et 
77       un texte au format dictionnaire
78
79    """
80    # Les extensions de fichier permis?
81    extensions=('.comm',)
82
83 #----------------------------------------------------------------------------------------
84    def gener(self,obj,format='brut',config=None):
85        
86       self.initDico()
87       
88       # Cette instruction genere le contenu du fichier de commandes (persistance)
89       self.text=PythonGenerator.gener(self,obj,format)
90       self.racine=obj
91       return self.text
92
93
94 #----------------------------------------------------------------------------------------
95 # initialisations
96 #----------------------------------------------------------------------------------------
97    
98    def initDico(self) :
99  
100       self.dictMCVal={}
101
102 #----------------------------------------------------------------------------------------
103 # ecriture
104 #----------------------------------------------------------------------------------------
105
106    def writeDefault(self,file) :
107 #file ne sert pas
108
109        self.texteIngendof=""
110        self.texteParam=debutTexteParam
111        self.chercheFichier()
112        self.traiteSourceVCut()
113
114        fn=self.fnBase
115        fileIngendofDeb = fn[:fn.rfind(".")] + '.ingendof'
116        fileIngendof = os.path.join(self.sauveDirectory,fileIngendofDeb)
117        f = open( str(fileIngendof), 'wb')
118        f.write( self.texteIngendof )
119        f.close()
120
121        self.textePhys=debutTextePhys
122        self.traiteMateriaux()
123        filePhysDeb = fn[:fn.rfind(".")] + '.phys'
124        filePhys = os.path.join(self.sauveDirectory,filePhysDeb)
125        f = open( str(filePhys), 'wb')
126        f.write( self.textePhys )
127        f.close()
128
129        fileParamDeb = fn[:fn.rfind(".")] + '.param'
130        fileParam = os.path.join(self.sauveDirectory,fileParamDeb)
131        self.traiteParam()
132        f = open( str(fileParam), 'wb')
133        f.write( self.texteParam )
134        f.close()
135        
136        self.texteCMD="[ \n    GLOBAL \n] \n[ \nVISU \n"+self.fnBase.split(".med")[0]+"\nMED \nELEMENT \n] "
137        fileCMDDeb = fn[:fn.rfind(".")] + '.cmd'
138        fileCMD =os.path.join(self.sauveDirectory,fileCMDDeb)
139        f = open( str(fileCMD), 'wb')
140        f.write( self.texteCMD )
141        f.close()
142        
143        nomBaseFichier=os.path.basename(fileParam).split(".med")[0]
144        
145        self.texteInfcarmel=nomBaseFichier
146        fileInfcarmelDeb = fn[:fn.rfind(".")] + '.infcarmel'
147        fileInfcarmel=os.path.join(self.sauveDirectory,fileInfcarmelDeb)
148        f = open( str(fileInfcarmel), 'wb')
149        f.write( self.texteInfcarmel )
150        f.close()
151        
152        self.texteInpostpro=nomBaseFichier+"\n"+nomBaseFichier.split(".param")[0]+'.xmat\n'+nomBaseFichier.split(".param")[0]+'.cmd'
153        fileInpostproDeb = fn[:fn.rfind(".")] + '.inpostprocess'
154        fileInpostpro = os.path.join(self.sauveDirectory,fileInpostproDeb)
155        f = open( str(fileInpostpro), 'wb')
156        f.write( self.texteInpostpro )
157        f.close()
158
159 #----------------------------------------------------------------------------------------
160 #  analyse des commentaires pour trouver le nom du fichier
161 #----------------------------------------------------------------------------------------
162
163    def chercheFichier(self) :
164        nomFichier="inconnu"
165        for e in self.racine.etapes:
166            if  isinstance(e,Accas.COMMENTAIRE):
167                print 'ùmasdkfh=',e.valeur[0:17]
168                if e.valeur[0:17]=="Cree - fichier : ":
169                   debut=e.valeur[17:]
170                   liste=debut.split(" - ")
171                   nomFichier=liste[0]
172                   #print 'nom=',nomFichier
173                   #print 'e.va=',e.valeur.split(" ")[-1]
174                   #print 'liste=',liste
175                   nomDomaine=e.valeur.split(" ")[-1]
176                   break
177        self.sauveDirectory=os.path.dirname(nomFichier)
178        self.fnBase=os.path.basename(nomFichier)
179        self.texteIngendof =os.path.basename(nomFichier)+"\n"
180        self.texteParam += os.path.basename(nomFichier).split(".med")[0]+".car\n]\n"
181        self.texteParam +="[PHYS_FILES\n   NAME "+os.path.basename(nomFichier).split(".med")[0]+".phys\n]\n"
182
183 #----------------------------------------------------------------------------------------
184 #  analyse du dictionnaire  pour trouver les sources et les VCut et les ZS
185 #----------------------------------------------------------------------------------------
186
187    def traiteSourceVCut(self) :
188        listeSource=[]
189        listeVCut=[]
190        self.listeZS=[]
191        self.texteSourcePhys="[SOURCES\n"
192        for k in self.dictMCVal.keys():
193            if k.find ("______SOURCE__") > -1 :
194               noms=k.split("_____")
195               if noms[0] not in listeSource : listeSource.append(noms[0])
196            if k.find ("______VCUT__") > -1 :
197               noms=k.split("_____")
198               if noms[0] not in listeVCut : listeVCut.append(noms[0])
199            if k.find ("______ZS") > -1 :
200               noms=k.split("_____")
201               if noms[0] not in self.listeZS : self.listeZS.append(noms[0])
202        listeSource.sort()
203        for source in listeSource:
204            debutKey=source+"______SOURCE__"
205            texteSource=self.dictMCVal[debutKey+"EnveloppeConnexeInducteur"]+"\n"
206            texteSource+="2\n"
207            for val in self.dictMCVal[debutKey+"VecteurDirecteur"] :
208                texteSource+=str(val)+" "
209            texteSource+="\n"
210            for val in self.dictMCVal[debutKey+"Centre"] :
211                texteSource+=str(val)+" "
212            texteSource+="\n"
213            texteSource+=str(self.dictMCVal[debutKey+"SectionBobine"])+"\n"
214            self.texteIngendof+=texteSource
215            self.texteSourcePhys+="   [STRANDED_INDUCTOR\n"
216            self.texteSourcePhys+="      NAME "+source+"\n"
217            self.texteSourcePhys+="      NTURNS "+str(self.dictMCVal[debutKey+"NbdeTours"])+"\n"
218            self.texteSourcePhys+="      CURJ POLAR "+str(self.dictMCVal[debutKey+"Amplitude"])
219            self.texteSourcePhys+=" 0.0000000000000000E+00\n   ]\n"
220          
221        self.texteSourcePhys+="]\n"
222        for vcut in listeVCut:
223            self.texteIngendof+="1\n"
224            debutKey=vcut+"______VCUT__"
225            if self.dictMCVal[debutKey+"Orientation"] == "Oppose" :self.texteIngendof+="0\n"
226            else : self.texteIngendof+="1\n"
227        if self.dictMCVal["__PARAMETRES__TypedeFormule"]=="APHI" :self.texteIngendof+="1\n"
228        else : self.texteIngendof+="2\n"
229        
230
231         
232 #----------------------------------------------------------------------------------------
233    def traiteMateriaux(self) :
234 #----------------------------------------------------------------------------------------
235        listeCond=[]
236        listeNoCond=[]
237        for k in self.dictMCVal.keys():
238            if k.find ("______CONDUCTEUR") > -1 :
239               noms=k.split("_____")
240               if noms[0] not in listeCond : listeCond.append(noms[0])
241            if k.find ("______NOCOND") > -1 :
242               noms=k.split("_____")
243               if noms[0] not in listeNoCond : listeNoCond.append(noms[0])
244    
245        for c in listeCond:
246            self.textePhys +="   [CONDUCTOR\n"
247            self.textePhys +="      NAME "+c+"\n"
248            self.textePhys +=texteConductor
249            self.textePhys+="         VALUE COMPLEX "
250            self.textePhys+=str(self.dictMCVal[c+"______CONDUCTEUR__Conductivite"])
251            self.textePhys+=texteConducto2 
252            self.textePhys+="         VALUE COMPLEX "
253            self.textePhys+=str(self.dictMCVal[c+"______CONDUCTEUR__PermeabiliteRelative"])
254            self.textePhys+="  0.0000000000000000E+00\n      ]\n   ]\n"
255
256        for c in listeNoCond:
257            self.textePhys+="   [DIELECTRIC\n"
258            self.textePhys +="      NAME "+c+"\n"
259            self.textePhys += texteNoCond
260            self.textePhys+="         VALUE COMPLEX "
261            self.textePhys+=str(self.dictMCVal[c+"______NOCOND__PermeabiliteRelative"])
262            self.textePhys+="  0.0000000000000000E+00\n      ]\n   ]\n"
263
264        for zs in self.listeZS:
265           self.textePhys+=debutTexteZs0+zs
266           self.textePhys+=debutTexteZs
267           self.textePhys+=str(self.dictMCVal[zs+"______ZS__Conductivite"])
268           self.textePhys+=texteZs2
269           self.textePhys+=str(self.dictMCVal[zs+"______ZS__PermeabiliteRelative"])
270           self.textePhys+=finTexteZs
271
272        self.textePhys+="]\n"
273        self.textePhys+=self.texteSourcePhys
274
275 #----------------------------------------------------------------------------------------
276 #  Creation du fichier Param
277 #----------------------------------------------------------------------------------------
278    def traiteParam(self):
279        self.texteParam +="[FREQUENCY\n   SINGLE  "+str(self.dictMCVal["__PARAMETRES__Frequence"])+"\n]\n"
280        self.texteParam +="[SOLVER\n   NAME BICGCR\n"
281        self.texteParam +="   [ITERATIVE_PARAM\n"
282        self.texteParam +="      NITERMAX  "+str(self.dictMCVal["__PARAMETRES__Nb_Max_Iterations"])+"\n"
283        self.texteParam +="       EPSILON  "+ str(self.dictMCVal["__PARAMETRES__Erreur_Max"])+"\n   ]\n]"
284
285
286 #----------------------------------------------------------------------------------------
287 #  analyse de chaque noeud de l'arbre 
288 #----------------------------------------------------------------------------------------
289
290    def generMCSIMP(self,obj) :
291         """recuperation de l objet MCSIMP"""
292         s=PythonGenerator.generMCSIMP(self,obj)
293         if hasattr(obj.etape,'sdnom'): clef=obj.etape.sdnom+"____"
294         else: clef=""
295         for i in obj.get_genealogie() :
296             clef=clef+"__"+i
297         self.dictMCVal[clef]=obj.valeur
298
299         return s
300
301    def get_repExeCarmel(self) :
302        return self.dictMCVal["__PARAMETRES__RepCarmel"]
303