Salome HOME
3b52f688074248e062cf92058dc1e5349b122a74
[tools/eficas.git] / generator / generator_TELEMAC.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 from __future__ import absolute_import
24 from __future__ import print_function
25 try :
26    from builtins import str
27 except : pass
28
29 import traceback
30 import types,re,os
31 from Extensions.i18n import tr
32 from .generator_python import PythonGenerator
33
34 extensions=('.comm',)
35
36
37
38
39 def entryPoint():
40    """
41       Retourne les informations necessaires pour le chargeur de plugins
42       Ces informations sont retournees dans un dictionnaire
43    """
44    return {
45         # Le nom du plugin
46           'name' : 'TELEMAC',
47         # La factory pour creer une instance du plugin
48           'factory' : TELEMACGenerator,
49           }
50
51
52 class TELEMACGenerator(PythonGenerator):
53    """
54       Ce generateur parcourt un objet de type JDC et produit
55       un texte au format eficas et
56       un texte au format dictionnaire
57
58    """
59
60 #----------------------------------------------------------------------------------------
61    def gener(self,obj,format='brut',config=None,appli=None,statut="Leger"):
62  
63       self.statut        = statut
64       self.langue        = appli.langue
65       try : self.TelemacdicoEn = appli.readercata.TelemacdicoEn
66       except : 
67         print ('Attention : pas de TelemacdicoEn declare') 
68         self.TelemacdicoEn = {}
69       self.DicoEnumCasEnInverse = {}
70       #from enum_Telemac2d_auto       import self.TelemacdicoEn
71       for motClef in self.TelemacdicoEn:
72           d={}
73           for valTelemac in self.TelemacdicoEn[motClef]:
74              valEficas   = self.TelemacdicoEn[motClef][valTelemac]
75              d[valEficas] =valTelemac
76           self.DicoEnumCasEnInverse[motClef]=d
77       if self.langue == 'fr' : 
78          #from  enum_Telemac2d_auto import DicoEnumCasFrToEnumCasEn
79          self.DicoEnumCasFrToEnumCasEn = appli.readercata.DicoEnumCasFrToEnumCasEn
80          for motClef in self.DicoEnumCasFrToEnumCasEn:
81               d={}
82               for valTelemac in self.DicoEnumCasFrToEnumCasEn[motClef]:
83                  valEficas    = self.DicoEnumCasFrToEnumCasEn[motClef][valTelemac]
84                  d[valEficas] = valTelemac
85               self.DicoEnumCasEnInverse[motClef]=d
86       self.initDico()
87       # Pour Simplifier les verifs d ecriture
88       if hasattr(appli,'listeTelemac') : self.listeTelemac=appli.listeTelemac
89       else : self.listeTelemac = ()
90
91       self.dicoCataToCas={}
92       try :
93         self.dicoCasToCata=appli.readercata.dicoCasToCata
94       except :
95         print ('Attention pas de dicoCasToCata declare')
96         self.dicoCasToCata={}
97         self.dicoCataToCas={} 
98       for motClef in self.dicoCasToCata:
99            self.dicoCataToCas[self.dicoCasToCata[motClef]]=motClef
100
101
102
103       # Cette instruction genere le contenu du fichier de commandes (persistance)
104       self.text=PythonGenerator.gener(self,obj,format)
105       return self.text
106
107
108 #----------------------------------------------------------------------------------------
109 # initialisations
110 #----------------------------------------------------------------------------------------
111
112    def initDico(self) :
113
114       self.PE=False
115       self.FE=False
116       self.VE=False
117       self.commentaireAvant = False
118       self.texteCom=''
119       if self.langue == "fr" :
120         self.textPE = 'COTES IMPOSEES :'
121         self.textFE = 'DEBITS IMPOSES :'
122         self.textVE = 'VITESSES IMPOSEES :'
123       else :
124         self.textPE = 'PRESCRIBED ELEVATIONS :'
125         self.textFE = 'PRESCRIBED FLOWRATES :'
126         self.textVE = 'PRESCRIBED VELOCITIES :'
127       self.nbTracers = 0
128       self.texteDico = ""
129
130
131
132
133 #----------------------------------------------------------------------------------------
134 # ecriture de tout
135 #----------------------------------------------------------------------------------------
136
137    def writeDefault(self,fn) :
138        self.texteDico+='&ETA\n'
139        #if self.statut == 'Leger' : extension = ".Lcas"
140        #else                      : extension = ".cas"
141        extension=".cas"
142        fileDico = fn[:fn.rfind(".")] + extension
143        f = open( str(fileDico), 'w')
144        f.write( self.texteDico )
145        f.close()
146
147 #----------------------------------------------------------------------------------------
148 # ecriture de Leger
149 #----------------------------------------------------------------------------------------
150
151    def writeComplet(self,fn,jdc,config,appli) :
152        jdc_formate=self.gener(jdc,config=config,appli=appli,statut="Entier")
153        self.writeDefault(fn)
154
155
156 #----------------------------------------------------------------------------------------
157 #  analyse de chaque noeud de l'arbre
158 #----------------------------------------------------------------------------------------
159
160    def generPROC_ETAPE(self,obj):
161         if  not self.commentaireAvant or self.texteCom.find(obj.nom) < 0:
162             self.texteDico += '/------------------------------------------------------------------/\n'
163             self.texteDico += '/\t\t\t'+obj.nom +'\n'
164             self.texteDico += '/------------------------------------------------------------------/\n'
165         self.commentaireAvant = False
166         self.texteCom=''
167         s=PythonGenerator.generPROC_ETAPE(self,obj)
168         if obj.nom in TELEMACGenerator.__dict__ : TELEMACGenerator.__dict__[obj.nom](*(self,obj))
169
170         return s
171
172    def generMCSIMP(self,obj) :
173         """recuperation de l objet MCSIMP"""
174         s=PythonGenerator.generMCSIMP(self,obj)
175
176
177         # Attention pas sur --> ds certains cas non traite par MCFACT ?
178         # a reflechir avec Yoann
179         # ajouter le statut ?
180         if self.statut == 'Leger' :
181           if hasattr(obj.definition,'defaut') and (obj.definition.defaut == obj.valeur) and (obj.nom not in self.listeTelemac) : return s
182           if hasattr(obj.definition,'defaut') and obj.definition.defaut != None and (type(obj.valeur) == tuple or type(obj.valeur) == list) and (tuple(obj.definition.defaut) == tuple(obj.valeur)) and (obj.nom not in self.listeTelemac) : return s
183
184
185         #nomMajuscule=obj.nom.upper()
186         #nom=nomMajuscule.replace('_',' ')
187         #if nom in listeSupprime or s == "" : return s
188         if s == "None," : s=None 
189         if s == "" or s==None : return s
190
191         sTelemac=s[0:-1]
192         if not( type(obj.valeur) in (tuple,list) ):
193            if obj.nom in self.DicoEnumCasEnInverse:
194              try : sTelemac=str(self.DicoEnumCasEnInverse[obj.nom][obj.valeur])
195              except :
196                if obj.valeur==None :  sTelemac=obj.valeur
197                else : print(("generMCSIMP Pb valeur avec ", obj.nom, obj.valeur))
198              # Si le resultat est du texte on ajoute des guillemets
199              if sTelemac[0] not in '0123456789':
200                sTelemac = "'" + sTelemac +"'"
201
202         if type(obj.valeur) in (tuple,list) :
203            if obj.nom in self.DicoEnumCasEnInverse:
204              #sT = "'"
205              sT=''
206              for v in obj.valeur:
207                try : sT +=str(self.DicoEnumCasEnInverse[obj.nom][v]) +";"
208                except :
209                  if obj.definition.intoSug != [] : sT +=str(v) + ";"
210                  else : print(("generMCSIMP Pb Tuple avec ", obj.nom, v, obj.valeur))
211              #sTelemac=sT[0:-1]+"'"
212              sTelemac=sT[0:-1]
213            else  :
214              sTelemac=sTelemac[0:-1]
215              if sTelemac.find("'") > 0 :
216                 sTelemac= sTelemac.replace (',',';\n    ')
217                 # on enleve le dernier  ';'
218                 index=(sTelemac.rfind(";"))
219                 sTelemac=sTelemac[:index]+' '+sTelemac[index+1:]
220
221         if self.langue=='fr' :
222            s1=str(sTelemac).replace('True','OUI')
223            s2=s1.replace('False','NON')
224         else :
225            s1=str(sTelemac).replace('True','YES')
226            s2=s1.replace('False','NO')
227         if hasattr(obj.definition,'max'):
228            if obj.definition.max != 1:
229               s3=s2.replace(',',';')
230            else:
231               s3=s2
232         if s3 != "" and s3[0]=='(' :
233           try : s3=s3[1:-1] # cas de liste vide
234           except : s3 = ' '
235
236
237         # LIQUID_BOUNDARIES
238         #if obj.nom in ('PRESCRIBED_FLOWRATES','PRESCRIBED_VELOCITIES','PRESCRIBED_ELEVATIONS') :
239         #   return s
240
241         # cas des Tuples
242         if obj.waitTuple()  and s3 != '' and s3  != 'None':
243            s3=s
244            if s3[-1] == ',': s3=s3[:-1] 
245
246
247         if obj.nom not in self.dicoCataToCas :
248            if obj.nom == 'Consigne' : return ""
249            return s
250
251         nom=self.dicoCataToCas[obj.nom]
252         if nom in ["VARIABLES FOR GRAPHIC PRINTOUTS", "VARIABLES POUR LES SORTIES GRAPHIQUES", "VARIABLES TO BE PRINTED","VARIABLES A IMPRIMER"] :
253               if s3 != '' and s3  != 'None':
254                 s3=s3.replace(';',',')
255                 s3="'"+ s3 +"'"
256               else:
257                 s3 = "''"
258         if s3 == "" or s3 == " " : s3 = " "
259         ligne=nom+ " : " + s3 + "\n"
260         if len(ligne) > 72 : ligne=self.redecoupeLigne(nom,s3)
261         self.texteDico+=ligne
262
263    def generMCFACT(self,obj):
264       """
265       """
266       s=PythonGenerator.generMCFACT(self,obj)
267       if obj.nom in TELEMACGenerator.__dict__ : TELEMACGenerator.__dict__[obj.nom](self,obj)
268
269       return s
270
271
272    def TRACERS(self,obj):
273        if self.nbTracers != 0 :  self.texteDico += 'NUMBER_OF_TRACERS : '+str(self.nbTracers) + '\n'
274
275
276    def NAME_OF_TRACER(self,obj):
277        print((dir(obj) ))
278        print((obj.getGenealogiePrecise()))
279
280    def Validation(self,obj):
281        self.texteDico += "VALIDATION : True \n"
282
283    def Date_De_L_Origine_Des_Temps (self,obj):
284        an=obj.getChild('Year').valeur
285        mois=obj.getChild('Month').valeur
286        jour=obj.getChild('Day').valeur
287        self.texteDico += "ORIGINAL DATE OF TIME  :"+ str(an)+ " ,"+str(mois)+ "," +str(jour)+ "\n"
288
289    def Original_Hour_Of_Time (self,obj):
290        hh=obj.getChild('Hour').valeur
291        mm=obj.getChild('Minute').valeur
292        ss=obj.getChild('Second').valeur
293        self.texteDico += "ORIGINAL HOUR OF TIME :"+str(hh)+" ,"+str(mm)+ ","+str(ss)+"\n"
294
295    def Type_Of_Advection(self,obj):
296        listeAdvection=[1,5,1,1]
297        listeSupg=[2,2,2,2]
298        listeUpwind=[1.,1.,1.,1.]
299        self.listeMCAdvection=[]
300        self.chercheChildren(obj)
301        dicoSuf={ 'U_And_V' : 0, 'H' : 1, 'K_And_Epsilon' : 2, 'Tracers' : 3}
302        for c in  self.listeMCAdvection:
303            if c.nom[0:18] == 'Type_Of_Advection_' and c.valeur!=None:
304               suf=c.nom[18:]
305               index=dicoSuf[suf]
306               listeAdvection[index]=self.DicoEnumCasEnInverse['Type_Of_Advection'][c.valeur]
307            if c.nom[0:13] == 'Supg_Option_' and c.valeur!=None:
308               suf=c.nom[13:]
309               index=dicoSuf[suf]
310               listeAdvection[index]=self.DicoEnumCasEnInverse['Supg_Option'][c.valeur]
311            if c.nom[0:23] == 'Upwind_Coefficients_Of_' and c.valeur!=None:
312               suf=c.nom[23:]
313               index=dicoSuf[suf]
314               listeUpwind[index]=c.valeur
315        self.texteDico += "TYPE OF ADVECTION = "+ str(listeAdvection) + "\n"
316        self.texteDico += "SUPG OPTION = "+ str(listeSupg) + "\n"
317        self.texteDico += "UPWIND COEFFICIENTS = "+ str(listeUpwind) + "\n"
318
319    def chercheChildren(self,obj):
320        for c in obj.listeMcPresents():
321            objc=obj.getChild(c)
322            if hasattr(objc,'listeMcPresents') and objc.listeMcPresents() != [] : self.chercheChildren(objc)
323            else : self.listeMCAdvection.append(objc)
324
325
326
327    def redecoupeLigne(self,nom,valeur) :
328        text=nom+ " : \n"
329        valeur=valeur
330        if valeur.find("'") > -1:
331           lval=valeur.split(";")
332           for v in lval : text+='   '+v+';'
333           text=text[0:-1]+'\n'
334        else :
335          lval=valeur.split(";")
336          ligne="   "
337          for v in lval :
338            if len(ligne+ str(v)+'; ') < 70 : ligne += str(v)+'; '
339            else :
340               text+= ligne+"\n"
341               ligne="   "+str(v)+'; '
342          text+= ligne[0:-2]+'\n'
343        return text
344
345    def generCOMMENTAIRE(self,obj):
346        sans_saut = re.sub("\n$","",obj.valeur)
347        l_lignes = sans_saut.split('\n')
348        txt='/'+66*'-'+'/'+'\n'
349        i=1
350        for ligne in l_lignes:
351          self.texteCom+=ligne+'\n'
352          txt = txt + '/'+ligne+'\n'
353        txt= txt + '/'+66*'-'+'/'+'\n'
354        self.texteDico += txt
355        self.commentaireAvant= True
356        return PythonGenerator.generCOMMENTAIRE(self,obj)
357
358