1 #@ MODIF macr_ecre_calc_ops Macro DATE 28/02/2011 AUTEUR BOTTONI M.BOTTONI
2 # -*- coding: iso-8859-1 -*-
3 # CONFIGURATION MANAGEMENT OF EDF VERSION
4 # ======================================================================
5 # COPYRIGHT (C) 1991 - 2011 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
61 self.DeclareOut('__TAB',TABLE)
62 self.DeclareOut('__DEB',DEBIT)
64 # La macro compte pour 1 dans la numerotation des commandes
72 # Parametres Developpeur
73 tmp_ecrevisse = "tmp_ecrevisse"
74 fichier_data = "data.dat"
77 # IMPORTATION DE COMMANDES ASTER
78 EXEC_LOGICIEL = self.get_cmd("EXEC_LOGICIEL")
79 CREA_TABLE = self.get_cmd("CREA_TABLE")
80 # IMPR_TABLE = self.get_cmd("IMPR_TABLE")
81 IMPR_FONCTION = self.get_cmd("IMPR_FONCTION")
83 # RECUPERATION DES MOTS-CLES FACTEURS
84 dFISSURE=FISSURE[0].cree_dict_valeurs(FISSURE[0].mc_liste)
85 for i in dFISSURE.keys():
86 if dFISSURE[i]==None : del dFISSURE[i]
88 dECOULEMENT=ECOULEMENT[0].cree_dict_valeurs(ECOULEMENT[0].mc_liste)
89 for i in dECOULEMENT.keys():
90 if dECOULEMENT[i]==None : del dECOULEMENT[i]
92 dTEMPERATURE=TEMPERATURE[0].cree_dict_valeurs(TEMPERATURE[0].mc_liste)
93 for i in dTEMPERATURE.keys():
94 if dTEMPERATURE[i]==None : del dTEMPERATURE[i]
96 dMODELE_ECRE=MODELE_ECRE[0].cree_dict_valeurs(MODELE_ECRE[0].mc_liste)
97 for i in dMODELE_ECRE.keys():
98 if dMODELE_ECRE[i]==None : del dMODELE_ECRE[i]
100 dCONVERGENCE=CONVERGENCE[0].cree_dict_valeurs(CONVERGENCE[0].mc_liste)
101 for i in dCONVERGENCE.keys():
102 if dCONVERGENCE[i]==None : del dCONVERGENCE[i]
105 print 'dFISSURE = ', dFISSURE
106 print 'dECOULEMENT = ', dECOULEMENT
107 print 'dTEMPERATURE = ', dTEMPERATURE
108 print 'dMODELE_ECRE = ', dMODELE_ECRE
109 print 'dCONVERGENCE = ', dCONVERGENCE
110 print 'ENTETE = ', ENTETE
111 print 'IMPRESSION = ', IMPRESSION
112 print 'INFO = ', INFO
117 # ---------------------------------------------------------------------
118 # CONSTRUCTION DU JEU DE PARAMETRES
125 d[ 2 ] = str(len(dFISSURE['LISTE_COTES_AH'])),
126 d[ 3 ] = dFISSURE['LISTE_COTES_AH'],
127 d[ 4 ] = dFISSURE['LISTE_VAL_AH'],
128 d[ 5 ] = str(len(dFISSURE['LISTE_COTES_BL'])),
129 d[ 6 ] = dFISSURE['LISTE_COTES_BL'],
130 d[ 7 ] = dFISSURE['LISTE_VAL_BL'],
131 d[ 8 ] = dFISSURE['LONGUEUR'],
132 d[ 9 ] = dFISSURE['ANGLE'],
133 d[ 10 ] = dFISSURE['RUGOSITE'],
134 d[ 11 ] = dFISSURE['ZETA'],
135 if dFISSURE['SECTION'] == 'ELLIPSE':
137 if dFISSURE['SECTION'] == 'RECTANGLE':
141 d[ 20 ] = dECOULEMENT['PRES_ENTREE'],
142 d[ 21 ] = dECOULEMENT['PRES_SORTIE'],
143 d[ 22 ] = dECOULEMENT['FLUIDE_ENTREE'],
147 if dECOULEMENT['FLUIDE_ENTREE'] in [1, 3, 4, 6]:
148 d[ 23 ] = dECOULEMENT['TEMP_ENTREE'],
149 if dECOULEMENT['FLUIDE_ENTREE'] in [2, 5]:
150 d[ 24 ] = dECOULEMENT['TITR_MASS'],
151 if dECOULEMENT['FLUIDE_ENTREE'] in [4, 5]:
152 d[ 25 ] = dECOULEMENT['PRES_PART'],
166 if dTEMPERATURE['GRADIENT'] == 'FOURNI':
168 d[ 31 ] = len(dTEMPERATURE['LISTE_COTES_TEMP'])
169 d[ 32 ] = dTEMPERATURE['LISTE_COTES_TEMP']
170 d[ 33 ] = dTEMPERATURE['LISTE_VAL_TEMP']
171 if dTEMPERATURE['GRADIENT'] == 'IMPOSE':
173 d[ 34 ] = dTEMPERATURE['TEMP1']
174 d[ 35 ] = dTEMPERATURE['TEMP2']
175 if dTEMPERATURE['GRADIENT'] == 'CALCULE':
177 d[ 36 ] = dTEMPERATURE['EPAISSEUR_PAROI']
178 d[ 37 ] = dTEMPERATURE['CONVECTION_AMONT']
179 d[ 38 ] = dTEMPERATURE['CONVECTION_AVAL']
180 d[ 39 ] = dTEMPERATURE['LAMBDA']
181 d[ 40 ] = dTEMPERATURE['TEMP_FLUIDE_AVAL']
186 if dMODELE_ECRE['ECOULEMENT'] == 'SATURATION':
188 if dMODELE_ECRE['ECOULEMENT'] == 'GELE':
190 d[ 61 ] = dMODELE_ECRE['PRESS_EBULLITION'],
192 d[ 70 ] = dMODELE_ECRE['FROTTEMENT'],
198 if dMODELE_ECRE['FROTTEMENT'] < 0:
199 d[ 71 ] = dMODELE_ECRE['REYNOLDS_LIM'],
200 d[ 72 ] = dMODELE_ECRE['FROTTEMENT_LIM'],
202 d[ 73 ] = dMODELE_ECRE['TRANSFERT_CHAL'],
204 if dMODELE_ECRE['TRANSFERT_CHAL'] == 0: pass # Pour memoire 3 cas >0, =0, <0
205 if dMODELE_ECRE['TRANSFERT_CHAL'] > 0: pass # Pour memoire 3 cas >0, =0, <0
206 if dMODELE_ECRE['TRANSFERT_CHAL'] < 0:
207 d[74] = dMODELE_ECRE['XMINCH'],
208 d[75] = dMODELE_ECRE['XMAXCH'],
210 d[79] = dMODELE_ECRE['IVENAC'],
212 if IMPRESSION == 'OUI':
214 if IMPRESSION == 'NON':
218 d[ 88 ] = dCONVERGENCE['KGTEST'],
219 d[ 89 ] = dCONVERGENCE['ITER_GLOB_MAXI'],
220 d[ 90 ] = dCONVERGENCE['CRIT_CONV_DEBI'],
227 # ---------------------------------------------------------------------
228 # GENERATION DU FICHIER DATA.DAT
230 txt = fichier_data_ecrevisse()
232 for num_param in d.keys():
233 if type(d[num_param]) in [int, float]:
234 txt0 = str(d[num_param])
235 elif type(d[num_param]) in [tuple, list]:
236 txt0 = str(d[num_param]).replace('(', '')
237 txt0 = txt0.replace(')', '')
238 txt0 = txt0.replace(',', '')
239 txt0 = txt0.replace("'", '')
240 txt0 = txt0.replace("[", '')
241 txt0 = txt0.replace("]", '')
243 try: txt0 = str(d[num_param])
244 except: UTMESS('F','ECREVISSE0_11')
246 # On remplace la variable dans le fichier par sa valeur
247 txt = txt.replace( '$V['+str(num_param)+']', txt0 )
254 # ---------------------------------------------------------------------
255 # CREATION DE L'ENVIRONNEMENT D'ETUDE POUR ECREVISSE
258 # Repertoire temporaire d'execution d'Ecrevisse
259 tmp_ecrevisse = os.path.join(os.getcwd(),tmp_ecrevisse)
261 if not os.path.isdir(tmp_ecrevisse) :
263 os.mkdir(tmp_ecrevisse)
264 except os.error,erreur :
266 print "Code d'erreur de mkdir : " + str(erreur[0]) + " : " + str(erreur[1])
267 UTMESS('F','ECREVISSE0_12',valk=[tmp_ecrevisse])
269 # On recopie eventuellement l'ancien fichier debits
270 src = os.path.join('.', 'REPE_OUT', 'debits_dernier')
271 dst = os.path.join(tmp_ecrevisse, 'debits')
272 if os.path.isfile(src):
274 shutil.copyfile(src, dst)
276 UTMESS('F','ECREVISSE0_24',valk=[src, dst])
277 #print "ERREUR : copyfile %s -> %s" % (src, dst)
279 # Executable Ecrevisse
281 if not os.path.isfile(str(LOGICIEL)):
282 UTMESS('F','ECREVISSE0_13')
284 chemin_executable = str(LOGICIEL)
286 chemin_executable = os.path.join(aster.repout(), 'ecrevisse')
287 #chemin_executable = os.path.join(aster.repout(),version,'ecrevisse')
289 print 'chemin_executable:',chemin_executable
291 # Soit on fait un lien symbolique (incompatible avec certaines plate-formes) soit on recopie l'executable
292 if not os.path.isfile(os.path.join(tmp_ecrevisse, 'ecrevisse')):
294 os.symlink( chemin_executable, os.path.join(tmp_ecrevisse, 'ecrevisse') )
296 UTMESS('A','ECREVISSE0_14')
297 cmd = 'cp ' + chemin_executable + ' ' + os.path.join(tmp_ecrevisse, 'ecrevisse')
299 os.chmod( os.path.join(tmp_ecrevisse, 'ecrevisse') ,0755)
300 if (res!=0): UTMESS('F','ECREVISSE0_15')
302 # Ecriture du fichier de donnees pour Ecrevisse
303 fw = open(os.path.join(tmp_ecrevisse, fichier_data),'w')
307 # Sauvegarde dans REPE_OUT du data.dat
308 os.system('cp ' + tmp_ecrevisse + '/data.dat REPE_OUT/')
311 # ---------------------------------------------------------------------
312 # EXECUTION D'ECREVISSE
316 for shell in ['/bin/sh', '/bin/bash', '/usr/bin/sh']:
317 if os.path.isfile(shell):
321 # #Ligne suivante a ajouter avec la version LINUX compilee avec GFORTRAN
322 # cmd = cmd + '\nexport LD_LIBRARY_PATH=/logiciels/aster/Linux/GF4/public/gcc-4.1.1/lib:$LD_LIBRARY_PATH'
324 # Creation du contenu du script de lancement ecrevisse.sh
325 cmd = cmd + '\ncd ' + tmp_ecrevisse + '\n' + os.path.join(tmp_ecrevisse, 'ecrevisse') + ' ' + str(VERSION) + '\nset iret=$?\ncd ..\nexit $iret'
326 fw = open(os.path.join(tmp_ecrevisse, 'ecrevisse.sh'),'w')
329 os.chmod(os.path.join(tmp_ecrevisse, 'ecrevisse.sh') ,0755)
331 # Lancement d'Ecrevisse
332 UTMESS('I','ECREVISSE0_16')
333 res = ExecCommand(os.path.join(tmp_ecrevisse, 'ecrevisse.sh'),follow_output=True,verbose=True)
334 UTMESS('I','ECREVISSE0_17')
337 if info2: os.system('ls -al ' + tmp_ecrevisse)
342 # ---------------------------------------------------------------------
343 # RECUPERATION DES RESULTATS DEPUIS ECREVISSE
346 # 1) 5 COLONNES (a partir de ECREVISSE 3.1.e)
347 # COTE z (m), FLUX THERMIQUE (W/m2), PRESSION TOTALE ABSOLUE (Pa),
348 # TEMPERATURE FLUIDE (degres C), COEFFICIENT DE CONVECTION (W/m2/K)
350 f_ast = open(os.path.join(tmp_ecrevisse, 'pour_aster'),'r')
353 # transforme le texte en liste
355 # transforme la liste de textes en liste de float
356 _lst = map( float, _lst )
358 # ATTENTION : les cotes _ecr_c sont celles des resultats ecrevisse,
359 # c'est a dire les points de milieu du maillage aster,
360 # eventuellement multiplies par 1/TORTUOSITE!
361 _ecr_c = _lst[1:len(_lst):5]
362 _ecr_f = _lst[2:len(_lst):5]
363 _ecr_p = _lst[3:len(_lst):5]
364 _ecr_t = _lst[4:len(_lst):5]
365 _ecr_cc = _lst[5:len(_lst):5]
368 UTMESS('F','ECREVISSE0_18')
376 # On elimine les eventuels points en plus
377 # (cela arrive si la longueur de la fissure est plus grande de la derniere cotes)
378 # mais on considere quand meme la derniere cote du maillage aster
379 lx_ast = dFISSURE['LISTE_COTES_AH']
380 nbCotesEcre = len(lx_ast)
381 _ecr_c = _ecr_c[0:nbCotesEcre]
382 _ecr_f = _ecr_f[0:nbCotesEcre]
383 _ecr_p = _ecr_p[0:nbCotesEcre]
384 _ecr_t = _ecr_t[0:nbCotesEcre]
385 _ecr_cc = _ecr_cc[0:nbCotesEcre]
389 # 2) DEBIT - 5 COLONNES (a partir de ECREVISSE 3.1.e)
390 # DEBIT TOTAL (kg/s), DEBIT AIR (kg/s), DEBIT VAPEUR (kg/s),
391 # DEBIT LIQUIDE (kg/s), TYPE ECOULEMENT
393 f_deb = open(os.path.join(tmp_ecrevisse, 'debits'),'r')
397 _lis = map( float, _lis )
399 _dtot = _lis[0:len(_lis):5]
400 _dair = _lis[1:len(_lis):5]
401 _dvap = _lis[2:len(_lis):5]
402 _dliq = _lis[3:len(_lis):5]
403 _ecou = _lis[4:len(_lis):5]
406 UTMESS('A','ECREVISSE0_18')
415 # ---------------------------------------------------------------------
416 # CREATION DES SD-TABLE DE RESULTATS
418 __TAB=CREA_TABLE(LISTE=(_F(LISTE_R=_ecr_c,
430 __DEB=CREA_TABLE(LISTE=(_F(LISTE_R=_dtot,
445 # ---------------------------------------------------------------------
448 print 'DEBUT DEBUG MACR_ECRE_CALC'
449 print 'Chargements donnes par Ecrevisse'
450 print 'cotes aster :', lx_ast
451 print '_ecr_c : min=', min(_ecr_c), ' / max=', max(_ecr_c), ' / ', _ecr_c
452 print '_ecr_f : min=', min(_ecr_f), ' / max=', max(_ecr_f), ' / ', _ecr_f
453 print '_ecr_p : min=', min(_ecr_p), ' / max=', max(_ecr_p), ' / ', _ecr_p
454 print '_ecr_t : min=', min(_ecr_t), ' / max=', max(_ecr_t), ' / ', _ecr_t
455 print '_ecr_cc : min=', min(_ecr_cc), ' / max=', max(_ecr_cc), ' / ', _ecr_cc
456 print '_dtot=', _dtot
457 print '_dair=', _dair
458 print '_dvap=', _dvap
459 print '_dliq=', _dliq
460 print '_ecou=', _ecou
461 print __DEB.EXTR_TABLE()
462 print __TAB.EXTR_TABLE()
463 print 'FIN DEBUG MACR_ECRE_CALC'
467 # ---------------------------------------------------------------------
468 # RECUPERATION DES RESULTATS OPTIONNELS DEPUIS ECREVISSE
470 # lst_fic = os.listdir(tmp_ecrevisse)
474 # ---------------------------------------------------------------------
481 # ---------------------------------------------------------------------
482 def fichier_data_ecrevisse():
485 Modele du fichier data.dat a la syntaxe Ecrevisse 3.0
486 Cette chaine de caractere est l'exacte replique d'un fichier de donnees
487 Ecrevisse 3.0 dans lequel toutes les donnees numeriques ont ete
488 remplacees par $V[x].
494 DONNEES GEOMETRIQUES RELATIVES A LA FISSURE
495 *******************************************
497 $V[1] is: type de section (is=1 ellipse is=2 rectangle)
498 $V[2] nb points decrivant ah: grand axe (m)
501 $V[5] nb points decrivant bl: petit axe (m)
504 $V[8] zl: longueur totale de la fissure (m)
505 $V[9] theta: angle par rapport a la verticale ascendante (en degres)
506 $V[10] eps: rugosite absolu (m)
507 $V[11] zeta: coefficient de la perte de charge singuliere a l'entree
509 DONNEES RELATIVES A L"ECOULEMENT
510 ********************************
512 $V[20] pe: pression de stagnation a l'entree (Pa)
513 $V[21] ps: pression de stagnation a la sortie (Pa)
514 $V[22] iflow : condition du fluide a l'entree
515 iflow=1 : eau sous-refroidie ou saturee
516 iflow=2 : fluide diphasique
517 iflow=3 : vapeur saturee ou surchauffee
518 iflow=4 : air + vapeur surchauffee
519 iflow=5 : air + vapeur saturee
521 $V[23] te: temperature a l'entree (deg C) (utilise si iflow=1,3,4,6)
522 $V[24] xe: titre m. eau vap/eau tot a l'entree (utilise si iflow=2 ou 5)
523 $V[25] pae : pression partielle air en entree (Pa) (utilise si iflow>3)
525 DONNEES RELATIVES AU PROFIL DE TEMPERATURE A TRAVERS LA PAROI
526 *************************************************************
528 $V[30] imograd : modele de calcul du gradient de temperature
529 imograd=-1/ distribution imposee de temperature (max 100pts)
530 imograd=0 : profil impose de la temperature
531 imograd=1 : calcul du profil
532 $V[31] cas imograd = -1 : ntmat, nb de points donnes ensuite (max=100)
535 $V[34] tm1: grad. temp. paroi le lg de l'ecoul.(utilise si imograd=0) (degC/m)
536 $V[35] tm2: temperature de la paroi a l'entree (utilise si imograd=0) (degC)
537 $V[36] epp: epaisseur de la paroi (utilise si imograd=1) (m)
538 $V[37] alphe: coeff. convection face amont (utilise si imograd=1) (W/degC/m2)
539 $V[38] alphs: coeff. convection face aval (utilise si imograd=1) (W/degC/m2)
540 $V[39] lambd: conduct. thermique de la paroi (utilise si imograd=1) (W/degC/m)
541 $V[40] ts: temperature du fluide cote aval (utilise si imograd=1) (degC)
546 Modeles d'ecoulement diphasique
547 -------------------------------
548 $V[60] imod : type de modele d'ecoulement diphasique
549 imod=1 : modele d'ecoulement a saturation a l'entree
550 imod=2 : modele d'ecoulement 'gele' a l'entree
551 $V[61] corrp: press. d'ebullition = corrp*psat(t)
553 Choix des correlations de frottement et de transfert de chaleur
554 ---------------------------------------------------------------
555 $V[70] ifrot : frottement (avec : ifrot=1 ou -1 ; sans : ifrot=0 )
556 $V[71] cas ifrot=-1 : relim = Re limite
557 $V[72] cas ifrot=-1 : frtlim = coeff frottement si Re > relim
559 $V[73] ichal : transfert de chaleur (-2 <= ichal <= 2 ichal=0 ==> Pas d'echange de chaleur)
560 $V[74] cas ichal < 0 : xminch = titre m. gaz avec corr. Chen ou liq pour x<xminch
561 $V[75] cas ichal < 0 : xmaxch = titre m. gaz avec corr. melange pour x>xmaxch
563 Modelisation de la vena contracta
564 ---------------------------------
565 $V[79] ivenac : avec = 1, sans = 0
567 Procedure d'impression
568 ----------------------
569 $V[84] iprint : impression profils ecran ( oui:1 non:0 )
571 DONNEES RELATIVES A LA CONVERGENCE NUMERIQUE
572 ********************************************
574 $V[88] kgtest (0 < kgtest < 1) tel que g=kgtest*gmax+(1-kgtest)*gmin
575 $V[89] itnmax : nombre maximum iterations methode newton
576 $V[90] precdb : critere de convergence en debit