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