1 #@ MODIF macr_ecre_calc_ops Macro DATE 21/04/2010 AUTEUR BOTTONI M.BOTTONI
2 # -*- coding: iso-8859-1 -*-
3 # CONFIGURATION MANAGEMENT OF EDF VERSION
4 # ======================================================================
5 # COPYRIGHT (C) 1991 - 2009 EDF R&D WWW.CODE-ASTER.ORG
6 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
7 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
8 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
9 # (AT YOUR OPTION) ANY LATER VERSION.
11 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
12 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
13 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
14 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
16 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
17 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
18 # 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
19 # ======================================================================
22 def macr_ecre_calc_ops(
40 Procedure de couplage Aster-Ecrevisse
41 Generation par Aster du fichier de donnees d'Ecrevisse et lancement d'Ecrevisse
44 import os, string, types, shutil
47 #from Noyau.N_utils import AsType
48 from Utilitai.Utmess import UTMESS
49 from Utilitai.System import ExecCommand
60 self.DeclareOut('__TAB',TABLE)
61 self.DeclareOut('__DEB',DEBIT)
63 # La macro compte pour 1 dans la numerotation des commandes
71 # Parametres Developpeur
72 tmp_ecrevisse = "tmp_ecrevisse"
73 fichier_data = "data.dat"
76 # IMPORTATION DE COMMANDES ASTER
77 EXEC_LOGICIEL = self.get_cmd("EXEC_LOGICIEL")
78 CREA_TABLE = self.get_cmd("CREA_TABLE")
79 # IMPR_TABLE = self.get_cmd("IMPR_TABLE")
80 IMPR_FONCTION = self.get_cmd("IMPR_FONCTION")
82 # RECUPERATION DES MOTS-CLES FACTEURS
83 dFISSURE=FISSURE[0].cree_dict_valeurs(FISSURE[0].mc_liste)
84 for i in dFISSURE.keys():
85 if dFISSURE[i]==None : del dFISSURE[i]
87 dECOULEMENT=ECOULEMENT[0].cree_dict_valeurs(ECOULEMENT[0].mc_liste)
88 for i in dECOULEMENT.keys():
89 if dECOULEMENT[i]==None : del dECOULEMENT[i]
91 dTEMPERATURE=TEMPERATURE[0].cree_dict_valeurs(TEMPERATURE[0].mc_liste)
92 for i in dTEMPERATURE.keys():
93 if dTEMPERATURE[i]==None : del dTEMPERATURE[i]
95 dMODELE_ECRE=MODELE_ECRE[0].cree_dict_valeurs(MODELE_ECRE[0].mc_liste)
96 for i in dMODELE_ECRE.keys():
97 if dMODELE_ECRE[i]==None : del dMODELE_ECRE[i]
99 dCONVERGENCE=CONVERGENCE[0].cree_dict_valeurs(CONVERGENCE[0].mc_liste)
100 for i in dCONVERGENCE.keys():
101 if dCONVERGENCE[i]==None : del dCONVERGENCE[i]
104 print 'dFISSURE = ', dFISSURE
105 print 'dECOULEMENT = ', dECOULEMENT
106 print 'dTEMPERATURE = ', dTEMPERATURE
107 print 'dMODELE_ECRE = ', dMODELE_ECRE
108 print 'dCONVERGENCE = ', dCONVERGENCE
109 print 'ENTETE = ', ENTETE
110 print 'IMPRESSION = ', IMPRESSION
111 print 'INFO = ', INFO
116 # ---------------------------------------------------------------------
117 # CONSTRUCTION DU JEU DE PARAMETRES
124 d[ 2 ] = str(len(dFISSURE['LISTE_COTES_AH'])),
125 d[ 3 ] = dFISSURE['LISTE_COTES_AH'],
126 d[ 4 ] = dFISSURE['LISTE_VAL_AH'],
127 d[ 5 ] = str(len(dFISSURE['LISTE_COTES_BL'])),
128 d[ 6 ] = dFISSURE['LISTE_COTES_BL'],
129 d[ 7 ] = dFISSURE['LISTE_VAL_BL'],
130 d[ 8 ] = dFISSURE['LONGUEUR'],
131 d[ 9 ] = dFISSURE['ANGLE'],
132 d[ 10 ] = dFISSURE['RUGOSITE'],
133 d[ 11 ] = dFISSURE['ZETA'],
134 if dFISSURE['SECTION'] == 'ELLIPSE':
136 if dFISSURE['SECTION'] == 'RECTANGLE':
140 d[ 20 ] = dECOULEMENT['PRES_ENTREE'],
141 d[ 21 ] = dECOULEMENT['PRES_SORTIE'],
142 d[ 22 ] = dECOULEMENT['FLUIDE_ENTREE'],
146 if dECOULEMENT['FLUIDE_ENTREE'] in [1, 3, 4, 6]:
147 d[ 23 ] = dECOULEMENT['TEMP_ENTREE'],
148 if dECOULEMENT['FLUIDE_ENTREE'] in [2, 5]:
149 d[ 24 ] = dECOULEMENT['TITR_MASS'],
150 if dECOULEMENT['FLUIDE_ENTREE'] in [4, 5]:
151 d[ 25 ] = dECOULEMENT['PRES_PART'],
165 if dTEMPERATURE['GRADIENT'] == 'FOURNI':
167 d[ 31 ] = len(dTEMPERATURE['LISTE_COTES_TEMP'])
168 d[ 32 ] = dTEMPERATURE['LISTE_COTES_TEMP']
169 d[ 33 ] = dTEMPERATURE['LISTE_VAL_TEMP']
170 if dTEMPERATURE['GRADIENT'] == 'IMPOSE':
172 d[ 34 ] = dTEMPERATURE['TEMP1']
173 d[ 35 ] = dTEMPERATURE['TEMP2']
174 if dTEMPERATURE['GRADIENT'] == 'CALCULE':
176 d[ 36 ] = dTEMPERATURE['EPAISSEUR_PAROI']
177 d[ 37 ] = dTEMPERATURE['CONVECTION_AMONT']
178 d[ 38 ] = dTEMPERATURE['CONVECTION_AVAL']
179 d[ 39 ] = dTEMPERATURE['LAMBDA']
180 d[ 40 ] = dTEMPERATURE['TEMP_FLUIDE_AVAL']
185 if dMODELE_ECRE['ECOULEMENT'] == 'SATURATION':
187 if dMODELE_ECRE['ECOULEMENT'] == 'GELE':
189 d[ 61 ] = dMODELE_ECRE['PRESS_EBULLITION'],
191 d[ 70 ] = dMODELE_ECRE['FROTTEMENT'],
197 if dMODELE_ECRE['FROTTEMENT'] < 0:
198 d[ 71 ] = dMODELE_ECRE['REYNOLDS_LIM'],
199 d[ 72 ] = dMODELE_ECRE['FROTTEMENT_LIM'],
201 d[ 73 ] = dMODELE_ECRE['TRANSFERT_CHAL'],
203 if dMODELE_ECRE['TRANSFERT_CHAL'] == 0: pass # Pour memoire 3 cas >0, =0, <0
204 if dMODELE_ECRE['TRANSFERT_CHAL'] > 0: pass # Pour memoire 3 cas >0, =0, <0
205 if dMODELE_ECRE['TRANSFERT_CHAL'] < 0:
206 d[74] = dMODELE_ECRE['XMINCH'],
207 d[75] = dMODELE_ECRE['XMAXCH'],
209 d[79] = dMODELE_ECRE['IVENAC'],
211 if IMPRESSION == 'OUI':
213 if IMPRESSION == 'NON':
217 d[ 88 ] = dCONVERGENCE['KGTEST'],
218 d[ 89 ] = dCONVERGENCE['ITER_GLOB_MAXI'],
219 d[ 90 ] = dCONVERGENCE['CRIT_CONV_DEBI'],
226 # ---------------------------------------------------------------------
227 # GENERATION DU FICHIER DATA.DAT
229 txt = fichier_data_ecrevisse()
231 for num_param in d.keys():
232 if type(d[num_param]) in [int, float]:
233 txt0 = str(d[num_param])
234 elif type(d[num_param]) in [tuple, list]:
235 txt0 = str(d[num_param]).replace('(', '')
236 txt0 = txt0.replace(')', '')
237 txt0 = txt0.replace(',', '')
238 txt0 = txt0.replace("'", '')
239 txt0 = txt0.replace("[", '')
240 txt0 = txt0.replace("]", '')
242 try: txt0 = str(d[num_param])
243 except: UTMESS('F','ECREVISSE0_11')
245 # On remplace la variable dans le fichier par sa valeur
246 txt = txt.replace( '$V['+str(num_param)+']', txt0 )
253 # ---------------------------------------------------------------------
254 # CREATION DE L'ENVIRONNEMENT D'ETUDE POUR ECREVISSE
257 # Repertoire temporaire d'execution d'Ecrevisse
258 tmp_ecrevisse = os.path.join(os.getcwd(),tmp_ecrevisse)
260 if not os.path.isdir(tmp_ecrevisse) :
262 os.mkdir(tmp_ecrevisse)
263 except os.error,erreur :
265 print "Code d'erreur de mkdir : " + str(erreur[0]) + " : " + str(erreur[1])
266 UTMESS('F','ECREVISSE0_12',valk=[tmp_ecrevisse])
268 # On recopie eventuellement l'ancien fichier debits
269 src = os.path.join('.', 'REPE_OUT', 'debits_dernier')
270 dst = os.path.join(tmp_ecrevisse, 'debits')
271 if os.path.isfile(src):
273 shutil.copyfile(src, dst)
275 UTMESS('F','ECREVISSE0_24',valk=[src, dst])
276 #print "ERREUR : copyfile %s -> %s" % (src, dst)
278 # Executable Ecrevisse
280 if not os.path.isfile(str(LOGICIEL)):
281 UTMESS('F','ECREVISSE0_13')
283 chemin_executable = str(LOGICIEL)
285 chemin_executable = os.path.join(aster.repout(), 'ecrevisse')
286 #chemin_executable = os.path.join(aster.repout(),version,'ecrevisse')
288 print 'chemin_executable:',chemin_executable
290 # Soit on fait un lien symbolique (incompatible avec certaines plate-formes) soit on recopie l'executable
291 if not os.path.isfile(os.path.join(tmp_ecrevisse, 'ecrevisse')):
293 os.symlink( chemin_executable, os.path.join(tmp_ecrevisse, 'ecrevisse') )
295 UTMESS('A','ECREVISSE0_14')
296 cmd = 'cp ' + chemin_executable + ' ' + os.path.join(tmp_ecrevisse, 'ecrevisse')
298 os.chmod( os.path.join(tmp_ecrevisse, 'ecrevisse') ,0755)
299 if (res!=0): UTMESS('F','ECREVISSE0_15')
301 # Ecriture du fichier de donnees pour Ecrevisse
302 fw = open(os.path.join(tmp_ecrevisse, fichier_data),'w')
306 # Sauvegarde dans REPE_OUT du data.dat
307 os.system('cp ' + tmp_ecrevisse + '/data.dat REPE_OUT/')
310 # ---------------------------------------------------------------------
311 # EXECUTION D'ECREVISSE
315 for shell in ['/bin/sh', '/bin/bash', '/usr/bin/sh']:
316 if os.path.isfile(shell):
320 # #Ligne suivante a ajouter avec la version LINUX compilee avec GFORTRAN
321 # cmd = cmd + '\nexport LD_LIBRARY_PATH=/logiciels/aster/Linux/GF4/public/gcc-4.1.1/lib:$LD_LIBRARY_PATH'
323 # Creation du contenu du script de lancement ecrevisse.sh
324 cmd = cmd + '\ncd ' + tmp_ecrevisse + '\n' + os.path.join(tmp_ecrevisse, 'ecrevisse') + ' ' + str(VERSION) + '\nset iret=$?\ncd ..\nexit $iret'
325 fw = open(os.path.join(tmp_ecrevisse, 'ecrevisse.sh'),'w')
328 os.chmod(os.path.join(tmp_ecrevisse, 'ecrevisse.sh') ,0755)
330 # Lancement d'Ecrevisse
331 UTMESS('I','ECREVISSE0_16')
332 res = ExecCommand(os.path.join(tmp_ecrevisse, 'ecrevisse.sh'),follow_output=True,verbose=True)
333 UTMESS('I','ECREVISSE0_17')
336 if info2: os.system('ls -al ' + tmp_ecrevisse)
341 # ---------------------------------------------------------------------
342 # RECUPERATION DES RESULTATS DEPUIS ECREVISSE
345 # 1) 5 COLONNES (a partir de ECREVISSE 3.1.e)
346 # COTE z (m), FLUX THERMIQUE (W/m2), PRESSION TOTALE ABSOLUE (Pa),
347 # TEMPERATURE FLUIDE (degres C), COEFFICIENT DE CONVECTION (W/m2/K)
349 f_ast = open(os.path.join(tmp_ecrevisse, 'pour_aster'),'r')
352 # transforme le texte en liste
354 # transforme la liste de textes en liste de float
355 _lst = map( float, _lst )
357 # ATTENTION : les cotes _ecr_c sont celles des resultats ecrevisse,
358 # c'est a dire les points de milieu du maillage aster,
359 # eventuellement multiplies par 1/TORTUOSITE!
360 _ecr_c = _lst[1:len(_lst):5]
361 _ecr_f = _lst[2:len(_lst):5]
362 _ecr_p = _lst[3:len(_lst):5]
363 _ecr_t = _lst[4:len(_lst):5]
364 _ecr_cc = _lst[5:len(_lst):5]
367 UTMESS('F','ECREVISSE0_18')
375 # On elimine les eventuels points en plus
376 # (cela arrive si la longueur de la fissure est plus grande de la derniere cotes)
377 # mais on considere quand meme la derniere cote du maillage aster
378 lx_ast = dFISSURE['LISTE_COTES_AH']
379 nbCotesEcre = len(lx_ast)
380 _ecr_c = _ecr_c[0:nbCotesEcre]
381 _ecr_f = _ecr_f[0:nbCotesEcre]
382 _ecr_p = _ecr_p[0:nbCotesEcre]
383 _ecr_t = _ecr_t[0:nbCotesEcre]
384 _ecr_cc = _ecr_cc[0:nbCotesEcre]
388 # 2) DEBIT - 5 COLONNES (a partir de ECREVISSE 3.1.e)
389 # DEBIT TOTAL (kg/s), DEBIT AIR (kg/s), DEBIT VAPEUR (kg/s),
390 # DEBIT LIQUIDE (kg/s), TYPE ECOULEMENT
392 f_deb = open(os.path.join(tmp_ecrevisse, 'debits'),'r')
396 _lis = map( float, _lis )
398 _dtot = _lis[0:len(_lis):5]
399 _dair = _lis[1:len(_lis):5]
400 _dvap = _lis[2:len(_lis):5]
401 _dliq = _lis[3:len(_lis):5]
402 _ecou = _lis[4:len(_lis):5]
405 UTMESS('A','ECREVISSE0_18')
414 # ---------------------------------------------------------------------
415 # CREATION DES SD-TABLE DE RESULTATS
417 __TAB=CREA_TABLE(LISTE=(_F(LISTE_R=_ecr_c,
429 __DEB=CREA_TABLE(LISTE=(_F(LISTE_R=_dtot,
444 # ---------------------------------------------------------------------
447 print 'DEBUT DEBUG MACR_ECRE_CALC'
448 print 'Chargements donnes par Ecrevisse'
449 print 'cotes aster :', lx_ast
450 print '_ecr_c : min=', min(_ecr_c), ' / max=', max(_ecr_c), ' / ', _ecr_c
451 print '_ecr_f : min=', min(_ecr_f), ' / max=', max(_ecr_f), ' / ', _ecr_f
452 print '_ecr_p : min=', min(_ecr_p), ' / max=', max(_ecr_p), ' / ', _ecr_p
453 print '_ecr_t : min=', min(_ecr_t), ' / max=', max(_ecr_t), ' / ', _ecr_t
454 print '_ecr_cc : min=', min(_ecr_cc), ' / max=', max(_ecr_cc), ' / ', _ecr_cc
455 print '_dtot=', _dtot
456 print '_dair=', _dair
457 print '_dvap=', _dvap
458 print '_dliq=', _dliq
459 print '_ecou=', _ecou
460 print __DEB.EXTR_TABLE()
461 print __TAB.EXTR_TABLE()
462 print 'FIN DEBUG MACR_ECRE_CALC'
466 # ---------------------------------------------------------------------
467 # RECUPERATION DES RESULTATS OPTIONNELS DEPUIS ECREVISSE
469 # lst_fic = os.listdir(tmp_ecrevisse)
473 # ---------------------------------------------------------------------
480 # ---------------------------------------------------------------------
481 def fichier_data_ecrevisse():
484 Modele du fichier data.dat a la syntaxe Ecrevisse 3.0
485 Cette chaine de caractere est l'exacte replique d'un fichier de donnees
486 Ecrevisse 3.0 dans lequel toutes les donnees numeriques ont ete
487 remplacees par $V[x].
493 DONNEES GEOMETRIQUES RELATIVES A LA FISSURE
494 *******************************************
496 $V[1] is: type de section (is=1 ellipse is=2 rectangle)
497 $V[2] nb points decrivant ah: grand axe (m)
500 $V[5] nb points decrivant bl: petit axe (m)
503 $V[8] zl: longueur totale de la fissure (m)
504 $V[9] theta: angle par rapport a la verticale ascendante (en degres)
505 $V[10] eps: rugosite absolu (m)
506 $V[11] zeta: coefficient de la perte de charge singuliere a l'entree
508 DONNEES RELATIVES A L"ECOULEMENT
509 ********************************
511 $V[20] pe: pression de stagnation a l'entree (Pa)
512 $V[21] ps: pression de stagnation a la sortie (Pa)
513 $V[22] iflow : condition du fluide a l'entree
514 iflow=1 : eau sous-refroidie ou saturee
515 iflow=2 : fluide diphasique
516 iflow=3 : vapeur saturee ou surchauffee
517 iflow=4 : air + vapeur surchauffee
518 iflow=5 : air + vapeur saturee
520 $V[23] te: temperature a l'entree (deg C) (utilise si iflow=1,3,4,6)
521 $V[24] xe: titre m. eau vap/eau tot a l'entree (utilise si iflow=2 ou 5)
522 $V[25] pae : pression partielle air en entree (Pa) (utilise si iflow>3)
524 DONNEES RELATIVES AU PROFIL DE TEMPERATURE A TRAVERS LA PAROI
525 *************************************************************
527 $V[30] imograd : modele de calcul du gradient de temperature
528 imograd=-1/ distribution imposee de temperature (max 100pts)
529 imograd=0 : profil impose de la temperature
530 imograd=1 : calcul du profil
531 $V[31] cas imograd = -1 : ntmat, nb de points donnes ensuite (max=100)
534 $V[34] tm1: grad. temp. paroi le lg de l'ecoul.(utilise si imograd=0) (degC/m)
535 $V[35] tm2: temperature de la paroi a l'entree (utilise si imograd=0) (degC)
536 $V[36] epp: epaisseur de la paroi (utilise si imograd=1) (m)
537 $V[37] alphe: coeff. convection face amont (utilise si imograd=1) (W/degC/m2)
538 $V[38] alphs: coeff. convection face aval (utilise si imograd=1) (W/degC/m2)
539 $V[39] lambd: conduct. thermique de la paroi (utilise si imograd=1) (W/degC/m)
540 $V[40] ts: temperature du fluide cote aval (utilise si imograd=1) (degC)
545 Modeles d'ecoulement diphasique
546 -------------------------------
547 $V[60] imod : type de modele d'ecoulement diphasique
548 imod=1 : modele d'ecoulement a saturation a l'entree
549 imod=2 : modele d'ecoulement 'gele' a l'entree
550 $V[61] corrp: press. d'ebullition = corrp*psat(t)
552 Choix des correlations de frottement et de transfert de chaleur
553 ---------------------------------------------------------------
554 $V[70] ifrot : frottement (avec : ifrot=1 ou -1 ; sans : ifrot=0 )
555 $V[71] cas ifrot=-1 : relim = Re limite
556 $V[72] cas ifrot=-1 : frtlim = coeff frottement si Re > relim
557 $V[73] ichal : transfert de chaleur (-2 <= ichal <= 2 ichal=0 ==> Pas d'echange de chaleur)
558 $V[74] cas ichal < 0 : xminch = titre m. gaz avec corr. Chen ou liq pour x<xminch
559 $V[75] cas ichal < 0 : xmaxch = titre m. gaz avec corr. melange pour x>xmaxch
561 Modelisation de la vena contracta
562 ---------------------------------
563 $V[79] ivenac : avec = 1, sans = 0
565 Procedure d'impression
566 ----------------------
567 $V[84] iprint : impression profils ecran ( oui:1 non:0 )
569 DONNEES RELATIVES A LA CONVERGENCE NUMERIQUE
570 ********************************************
572 $V[88] kgtest (0 < kgtest < 1) tel que g=kgtest*gmax+(1-kgtest)*gmin
573 $V[89] itnmax : nombre maximum iterations methode newton
574 $V[90] precdb : critere de convergence en debit