]> SALOME platform Git repositories - tools/eficas.git/blob - generator/generator_CARMELCND.py
Salome HOME
ZS
[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   [CONDUCTOR\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 debutTexteBav ="[ZSURFACIC\n    NAME BAV\n    [CONDUCTIVITY\n"
49 debutTexteBav+="         LAW LINEAR\n"
50 debutTexteBav+="         HOMOGENEOUS TRUE\n"
51 debutTexteBav+="         ISOTROPIC TRUE\n"
52 debutTexteBav+="         VALUE COMPLEX  "
53 texteBav2     ="  0.0000000000000000E+00\n    ]\n"
54 texteBav2    +="    [PERMEABILITY\n         LAW LINEAR\n"
55 texteBav2    +="         HOMOGENEOUS TRUE\n"
56 texteBav2    +="         ISOTROPIC TRUE\n         VALUE COMPLEX  "
57 finTexteBav   ="  0.0000000000000000E+00\n    ]\n]\n"
58
59 def entryPoint():
60    """
61       Retourne les informations necessaires pour le chargeur de plugins
62       Ces informations sont retournees dans un dictionnaire
63    """
64    return {
65         # Le nom du plugin
66           'name' : 'CARMELCND',
67         # La factory pour creer une instance du plugin
68           'factory' : CARMELCNDGenerator,
69           }
70
71
72 class CARMELCNDGenerator(PythonGenerator):
73    """
74       Ce generateur parcourt un objet de type JDC et produit
75       un texte au format eficas et 
76       un texte au format dictionnaire
77
78    """
79    # Les extensions de fichier permis?
80    extensions=('.comm',)
81
82 #----------------------------------------------------------------------------------------
83    def gener(self,obj,format='brut',config=None):
84        
85       self.initDico()
86       
87       # Cette instruction genere le contenu du fichier de commandes (persistance)
88       self.text=PythonGenerator.gener(self,obj,format)
89       self.racine=obj
90       return self.text
91
92
93 #----------------------------------------------------------------------------------------
94 # initialisations
95 #----------------------------------------------------------------------------------------
96    
97    def initDico(self) :
98  
99       self.dictMCVal={}
100
101 #----------------------------------------------------------------------------------------
102 # ecriture
103 #----------------------------------------------------------------------------------------
104
105    def writeDefault(self,fn) :
106
107        self.texteIngendof=""
108        self.texteParam=debutTexteParam
109        self.chercheFichier()
110        self.traiteSourceVCut()
111        self.traiteZs_Bav()
112
113        fileIngendof = fn[:fn.rfind(".")] + '.ingendof'
114        f = open( str(fileIngendof), 'wb')
115        f.write( self.texteIngendof )
116        f.close()
117        f = open( str("/tmp/toto"), 'wb')
118        f.write( self.texteIngendof )
119        f.close()
120
121        self.textePhys=debutTextePhys
122        self.traiteMateriaux()
123        filePhys = fn[:fn.rfind(".")] + '.phys'
124        f = open( str(filePhys), 'wb')
125        f.write( self.textePhys )
126        f.close()
127
128        fileParam = fn[:fn.rfind(".")] + '.param'
129        self.traiteParam()
130        f = open( str(fileParam), 'wb')
131        f.write( self.texteParam )
132        f.close()
133        
134        self.texteCMD="[ \n    GLOBAL \n] \n[ \nVISU \nDomaine \nMED \nELEMENT \n] "
135        fileCMD = fn[:fn.rfind(".")] + '.cmd'
136        f = open( str(fileCMD), 'wb')
137        f.write( self.texteCMD )
138        f.close()
139        
140        nomBaseFichier=os.path.basename(fileParam).split(".med")[0]
141        
142        self.texteInfcarmel=nomBaseFichier
143        fileInfcarmel = fn[:fn.rfind(".")] + '.infcarmel'
144        f = open( str(fileInfcarmel), 'wb')
145        f.write( self.texteInfcarmel )
146        f.close()
147        
148        self.texteInpostpro=nomBaseFichier+"\n"+nomBaseFichier.split(".param")[0]+'.xmat\n'+nomBaseFichier.split(".param")[0]+'.cmd'
149        fileInpostpro = fn[:fn.rfind(".")] + '.inpostprocess'
150        f = open( str(fileInpostpro), 'wb')
151        f.write( self.texteInpostpro )
152        f.close()
153
154 #----------------------------------------------------------------------------------------
155 #  analyse des commentaires pour trouver le nom du fichier
156 #----------------------------------------------------------------------------------------
157
158    def chercheFichier(self) :
159        nomFichier="inconnu"
160        for e in self.racine.etapes:
161            if  isinstance(e,Accas.COMMENTAIRE):
162                print 'ùmasdkfh=',e.valeur[0:17]
163                if e.valeur[0:17]=="Cree - fichier : ":
164                   debut=e.valeur[17:]
165                   liste=debut.split(" - ")
166                   nomFichier=liste[0]
167                   print 'nom=',nomFichier
168                   print 'e.va=',e.valeur.split(" ")[-1]
169                   print 'liste=',liste
170                   nomDomaine=e.valeur.split(" ")[-1]
171                   break
172        self.texteIngendof =os.path.basename(nomFichier)+"\n"
173        self.texteParam += os.path.basename(nomFichier).split(".med")[0]+".car\n]\n"
174        self.texteParam +="[PHYS_FILES\n   NAME "+os.path.basename(nomFichier).split(".med")[0]+".phys\n]\n"
175
176 #----------------------------------------------------------------------------------------
177 #  analyse du dictionnaire  pour trouver les sources et les VCut
178 #----------------------------------------------------------------------------------------
179
180    def traiteSourceVCut(self) :
181        listeSource=[]
182        listeVCut=[]
183        self.texteSourcePhys="[SOURCES\n"
184        for k in self.dictMCVal.keys():
185            if k.find ("______SOURCE__") > -1 :
186               noms=k.split("_____")
187               if noms[0] not in listeSource : listeSource.append(noms[0])
188            if k.find ("______VCUT__") > -1 :
189               noms=k.split("_____")
190               if noms[0] not in listeVCut : listeVCut.append(noms[0])
191        listeSource.sort()
192        for source in listeSource:
193            debutKey=source+"______SOURCE__"
194            texteSource=self.dictMCVal[debutKey+"NomDomaine"]+"\n"
195            texteSource+="2\n"
196            for val in self.dictMCVal[debutKey+"VecteurDirecteur"] :
197                texteSource+=str(val)+" "
198            texteSource+="\n"
199            for val in self.dictMCVal[debutKey+"Centre"] :
200                texteSource+=str(val)+" "
201            texteSource+="\n"
202            texteSource+=str(self.dictMCVal[debutKey+"SectionDomaine"])+"\n"
203            self.texteIngendof+=texteSource
204            self.texteSourcePhys+="   [STRANDED_INDUCTOR\n"
205            self.texteSourcePhys+="      NAME "+source+"\n"
206            self.texteSourcePhys+="      NTURNS "+str(self.dictMCVal[debutKey+"NbdeTours"])+"\n"
207            self.texteSourcePhys+="      CURJ POLAR "+str(self.dictMCVal[debutKey+"Amplitude"])
208            self.texteSourcePhys+=" 0.0000000000000000E+00\n   ]\n"
209          
210        self.texteSourcePhys+="]\n"
211        for vcut in listeVCut:
212            self.texteIngendof+="1\n"
213            debutKey=vcut+"______VCUT__"
214            if self.dictMCVal[debutKey+"Orientation"] == "Oppose" :self.texteIngendof+="0\n"
215            else : self.texteIngendof+="1\n"
216        if self.dictMCVal["__PARAMETRES__TypedeFormule"]=="APHI" :self.texteIngendof+="1\n"
217        else : self.texteIngendof+="2\n"
218        
219 #----------------------------------------------------------------------------------------
220    def traiteZs_Bav(self):
221 #----------------------------------------------------------------------------------------
222        if "__ZS_BAV__Permeabilite"  in self.dictMCVal.keys():
223           self.texteSourcePhys+=debutTexteBav
224           self.texteSourcePhys+=str(self.dictMCVal["__ZS_BAV__Conductivite"])
225           self.texteSourcePhys+=texteBav2
226           self.texteSourcePhys+=str(self.dictMCVal["__ZS_BAV__Permeabilite"])
227           self.texteSourcePhys+=finTexteBav
228
229         
230 #----------------------------------------------------------------------------------------
231    def traiteMateriaux(self) :
232 #----------------------------------------------------------------------------------------
233        listeCond=[]
234        listeNoCond=[]
235        for k in self.dictMCVal.keys():
236            if k.find ("______CONDUCTEUR") > -1 :
237               noms=k.split("_____")
238               if noms[0] not in listeCond : listeCond.append(noms[0])
239            if k.find ("______NOCOND") > -1 :
240               noms=k.split("_____")
241               if noms[0] not in listeNoCond : listeNoCond.append(noms[0])
242    
243        for c in listeCond:
244            self.textePhys +="      NAME "+c+"\n"
245            self.textePhys +=texteConductor
246            self.textePhys+="         VALUE COMPLEX "
247            self.textePhys+=str(self.dictMCVal[c+"______CONDUCTEUR__Conductivite"])
248            self.textePhys+=texteConducto2 
249            self.textePhys+="         VALUE COMPLEX "
250            self.textePhys+=str(self.dictMCVal[c+"______CONDUCTEUR__Permeabilite"])
251            self.textePhys+="  0.0000000000000000E+00\n      ]\n   ]\n"
252
253        for c in listeNoCond:
254            self.textePhys+="   [DIELECTRIC\n"
255            self.textePhys +="      NAME "+c+"\n"
256            self.textePhys += texteNoCond
257            self.textePhys+="         VALUE COMPLEX "
258            self.textePhys+=str(self.dictMCVal[c+"______NOCOND__Permeabilite"])
259            self.textePhys+="  0.0000000000000000E+00\n      ]\n   ]\n"
260
261        self.textePhys+="]\n"
262        self.textePhys+=self.texteSourcePhys
263
264 #----------------------------------------------------------------------------------------
265 #  Creation du fichier Param
266 #----------------------------------------------------------------------------------------
267    def traiteParam(self):
268        self.texteParam +="[FREQUENCY\n   SINGLE  "+str(self.dictMCVal["__PARAMETRES__Frequence_en_Hz"])+"\n]\n"
269        self.texteParam +="[SOLVER\n   NAME BICGCR\n"
270        self.texteParam +="   [ITERATIVE_PARAM\n"
271        self.texteParam +="      NITERMAX  "+str(self.dictMCVal["__PARAMETRES__Nb_Max_Iterations"])+"\n"
272        self.texteParam +="       EPSILON  "+ str(self.dictMCVal["__PARAMETRES__Erreur_Max"])+"\n   ]\n]"
273
274
275 #----------------------------------------------------------------------------------------
276 #  analyse de chaque noeud de l'arbre 
277 #----------------------------------------------------------------------------------------
278
279    def generMCSIMP(self,obj) :
280         """recuperation de l objet MCSIMP"""
281         s=PythonGenerator.generMCSIMP(self,obj)
282         if hasattr(obj.etape,'sdnom'): clef=obj.etape.sdnom+"____"
283         else: clef=""
284         for i in obj.get_genealogie() :
285             clef=clef+"__"+i
286         self.dictMCVal[clef]=obj.valeur
287
288         return s
289
290    def get_repExeCarmel(self) :
291        return self.dictMCVal["__PARAMETRES__RepCarmel"]
292