# -*- coding: iso-8859-1 -*- # #------------------------------------------------------------------------------- # Code_Saturne version 1.3 # ------------------------ # # # This file is part of the Code_Saturne User Interface, element of the # Code_Saturne CFD tool. # # Copyright (C) 1998-2007 EDF S.A., France # # contact: saturne-support@edf.fr # # The Code_Saturne User Interface is free software; you can redistribute it # and/or modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # The Code_Saturne User Interface is distributed in the hope that it will be # useful, but WITHOUT ANY WARRANTY; without even the implied warranty # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the Code_Saturne Kernel; if not, write to the # Free Software Foundation, Inc., # 51 Franklin St, Fifth Floor, # Boston, MA 02110-1301 USA # #------------------------------------------------------------------------------- """ This module defines the differents possible outputs : listings, for ensights chronologic and historic files .... captors .... used variables ... This module defines the following classes: - NumericalParamGlobalModel - NumericalParamGlobalView - PageText """ #------------------------------------------------------------------------------- # Library modules import #------------------------------------------------------------------------------- from xml.dom.minidom import parse import Tix, unittest from Tkconstants import * #------------------------------------------------------------------------------- # Application modules import #------------------------------------------------------------------------------- from Base.Common import * import Base.Toolbox as Tool import Base.Dialog as Dialog import Base.TkPage as TkPage #from Base.XMLmodel import XMLmodel from Base.XMLvariables import Variables #------------------------------------------------------------------------------- # NumericalParamGlobal model class #------------------------------------------------------------------------------- class NumericalParamGlobalModel: """ Manage the input/output markups in the xml doc about Turbulence """ def __init__(self, case): """ Xml node declaration and supplementary default value settings. """ self.case = case self.node_np = self.case.xmlInitNode('numerical_parameters') self.node_ivisse = self.node_np.xmlInitNode('gradient_transpose') self.node_relaxp = self.node_np.xmlInitNode('pressure_relaxation') self.node_extrag = self.node_np.xmlInitNode('wall_pressure_extrapolation') self.node_ipucou = self.node_np.xmlInitNode('velocity_pressure_coupling') self.node_imrgra = self.node_np.xmlInitNode('gradient_reconstruction') def defaultValues(self, event=None): """ default values """ self.default = {} self.default['gradient_transpose'] = 'on' self.default['pressure_relaxation'] = 1. self.default['velocity_pressure_coupling'] ='off' self.default['wall_pressure_extrapolation'] = '0' self.default['gradient_reconstruction'] = 0 return self.default def mGetGradTransp(self, event=None): """ get IVISSE value """ value = self.node_ivisse['status'] if not value: value = self.defaultValues()['gradient_transpose'] self.mSetGradTransp(value) return value def mGetVelPressCoupl(self, event=None): """ get IPUCOU value """ value = self.node_ipucou['status'] if not value: value = self.defaultValues()['velocity_pressure_coupling'] self.mSetVelPressCoupl(value) return value def mGetWallPrExtrap(self, event=None): """ get EXTRAG value """ value = self.node_np.xmlGetString('wall_pressure_extrapolation') if not value: value = self.defaultValues()['wall_pressure_extrapolation'] self.mSetWallPrExtrap(value) return value def mGetPressRelax(self, event=None): """ get RELAXP value """ value = self.node_np.xmlGetDouble('pressure_relaxation') if not value: value = self.defaultValues()['pressure_relaxation'] self.mSetPressRelax(value) return value def mGetGradReconst(self, event=None): """ get IMRGRA value """ value = self.node_imrgra['choice'] if not value: value = self.defaultValues()['gradient_reconstruction'] self.mSetGradReconst(value) return value def mSetGradTransp(self, value): self.node_ivisse['status'] = value def mSetPressRelax(self, value): self.node_np.xmlSetData('pressure_relaxation', value) def mSetVelPressCoupl(self, value): self.node_ipucou['status'] = value if value== 'on': Variables(self.case).setWeightMatrixComponents() def mSetWallPrExtrap(self, value): self.node_np.xmlSetData('wall_pressure_extrapolation', value) def mSetGradReconst(self, value): self.node_imrgra['choice'] = value #------------------------------------------------------------------------------- # Main class #------------------------------------------------------------------------------- class NumericalParamGlobalView(TkPage.Page): """ Class to open Turbulence Page. """ def _pageControl(self): """ Xml node declaration and supplementary default value settings. """ self.model = NumericalParamGlobalModel(self.case) def _tkControlVariables(self): """ Tkinter variables declaration. """ self.ivisse = Tix.StringVar() self.relaxp = Tix.DoubleVar() self.ipucou = Tix.StringVar() self.extrag = Tix.StringVar() self.imrgra = Tix.StringVar() def setIVISSE(self, event=None): self.model.mSetGradTransp(self.ivisse.get()) def setIPUCOU(self, event=None): value = self.ipucou.get() self.model.mSetVelPressCoupl(value) def setEXTRAG(self, event=None): self.model.mSetWallPrExtrap(self.extrag.get()) def setRELAXP(self, event=None): self.stbar.busy() val1 = 1e-15 val2 = 1 + val1 if self.check2.isBetween(self.e2, self.relaxp, val1, val2): self.model.mSetPressRelax(self.relaxp.get()) self.stbar.idle() def setIMRGRA(self, event=None): self.model.mSetGradReconst(self.imrgra.get()) def _createWidgets(self): """ Create the Page layout. """ t = PageText() w1 = Tix.LabelFrame(self.myPage, bd=2, label=t.GLOBPARAM_TITLE, relief=FLAT) w1.label.config(font=fT) w1.pack(side=TOP, fill=BOTH, pady = 10) self.c = [0]*3 self.l = [0]*3 self.s = [0]*3 padyy = 15 for (i, txt, var, command, kword) in \ [(0, t.IVISSE, self.ivisse, self.setIVISSE, 'IVISSE'), (2, t.IPUCOU, self.ipucou, self.setIPUCOU, 'IPUCOU')]: self.l[i] = Tix.Label(w1.frame, text=txt) self.l[i].grid(row=i, column=0, pady=padyy, sticky=W) self.c[i] = Tix.Checkbutton(w1.frame, onvalue='on', offvalue='off', variable=var, command=command) self.c[i].grid(row=i, column=1, pady=padyy, sticky=E) self.balloon.bind_widget(self.l[i], balloonmsg=t.KEYWORD+kword) self.balloon.bind_widget(self.c[i], balloonmsg=t.KEYWORD+kword) self.s[i] = Tix.Frame(w1.frame, height=2, bd=2, relief=SUNKEN) self.s[i].grid(row=i+1, column=0, columnspan=2,pady=padyy, sticky=W+E) self.l1 = Tix.Label(w1.frame, text=t.EXTRAG) self.l1.grid(row=4, column=0, padx=5, pady=padyy, sticky=W) self.o1 = Tix.OptionMenu(w1.frame) self.o1.menubutton.config(width=10, bd=2, relief=RAISED) self.o1.grid(row=4, column=1, padx=1, pady=padyy, sticky=E) self.o1.add_command('0', label=t.NEUMANN1) # la valeur 0.5 est vérouillée # self.o1.add_command('0.5', label=t.NEUMANN2) self.o1.add_command('1', label=t.EXTRAPOL) self.o1.config(variable=self.extrag, command=self.setEXTRAG) self.balloon.bind_widget(self.l1, balloonmsg=t.KEYWORD+'EXTRAG') self.balloon.bind_widget(self.o1, balloonmsg=t.KEYWORD+'EXTRAG') self.s2 = Tix.Frame(w1.frame, height=2, bd=2, relief=SUNKEN) self.s2.grid(row=5, column=0, columnspan=2,pady=padyy, sticky=W+E) self.l2 = Tix.Label(w1.frame, text=t.RELAXP) self.l2.grid(row=6, column=0, padx=5, pady=padyy, sticky=W) self.e2 = Tix.Entry(w1.frame, bd=2, width=6, textvariable=self.relaxp) self.e2.grid(row=6, column=1, padx=1, pady=padyy, sticky=E) self.e2.event_add("<>", "", "", "") self.e2.bind("<>", self.setRELAXP) self.balloon.bind_widget(self.l2, balloonmsg=t.KEYWORD+'RELAXP') self.balloon.bind_widget(self.e2, balloonmsg=t.KEYWORD+'RELAXP') self.s3 = Tix.Frame(w1.frame, height=2, bd=2, relief=SUNKEN) self.s3.grid(row=7, column=0, columnspan=2,pady=padyy, sticky=W+E) self.l3 = Tix.Label(w1.frame, text=t.IMRGRA) self.l3.grid(row=8, column=0, padx=5, pady=padyy, sticky=W) self.o3 = Tix.OptionMenu(w1.frame) self.o3.menubutton.config(width=22, bd=2, relief=RAISED) self.o3.grid(row=8, column=1, padx=1, pady=padyy, sticky=E) self.o3.add_command('0', label=t.RECONST97) self.o3.add_command('1', label=t.MC_CELVOI) self.o3.add_command('2', label=t.MC_SUPETCOMP) self.o3.add_command('3', label=t.MC_SUPETREST) self.o3.add_command('4', label=t.INI_MC) self.o3.config(variable=self.imrgra, command=self.setIMRGRA) self.balloon.bind_widget(self.l3, balloonmsg=t.KEYWORD+'IMRGRA') self.balloon.bind_widget(self.o3, balloonmsg=t.KEYWORD+'IMRGRA') def _initializeWidgets(self): """ Extract resquested informations from XML document. This informations are used to initialize the widgets. For this page default values of all widgets are necessary included in the XML file. """ t = PageText() if self.model.mGetGradTransp() == 'on': self.c[0].select() else: self.c[0].deselect() if self.model.mGetVelPressCoupl() == 'on': self.c[2].select() else: self.c[2].deselect() self.relaxp.set(self.model.mGetPressRelax()) self.o1.config(value=self.model.mGetWallPrExtrap()) self.o3.config(value=self.model.mGetGradReconst()) #------------------------------------------------------------------------------- # Text and messages for this page #------------------------------------------------------------------------------- class PageText: """ Storage of all texts and messages for this page. """ def __init__(self): # 1) Texts # if Tool.GuiParam.lang == 'fr': self.GLOBPARAM_TITLE = "PARAMETRES GLOBAUX" self.KEYWORD = "Mot clé Code_Saturne: " self.IVISSE = "Prise en compte des termes sources\n" +\ "en gradient transposé\net divergence de vitesse" self.RELAXP = "Coefficient de relaxation de\nl'incrément de pression" self.IPUCOU = "Couplage Vitesse - Pression" self.EXTRAG = "Extrapolation du gradient de pression\nau bord" self.YES = "Oui" self.NO = "Non" self.NEUMANN1 = "Neum. ordre 1" self.NEUMANN2 = "Neum. ordre 2" self.EXTRAPOL = "Extrapolation" self.RECONST97 = "Reconstruction 97" self.MC_CELVOI = "M.C. Cellules voisines" self.MC_SUPETCOMP = "M.C. Support étendu complet" self.MC_SUPETREST = "M.C. Support étendu restreint" self.INI_MC = "Initialisation M.C." self.IMRGRA = "Reconstruction des gradients" else: self.GLOBPARAM_TITLE = "GLOBAL PARAMETERS" self.KEYWORD = "Code_Saturne key word: " self.IVISSE = "Handling of transposed gradient\nand " +\ "divergence source terms\nin momentum equation" self.RELAXP = "Relaxation of pressure increase" self.IPUCOU = "Velocity- Pressure Coupling" self.EXTRAG = "Extrapolation of pressure gradient\n" +\ "on domain boundary" self.YES = "Yes" self.NO = "No" self.NEUMANN1 = "Neum. order 1" self.NEUMANN2 = "Neum. order 2" self.EXTRAPOL = "Extrapolation" self.IMRGRA = "Gradient reconstruction type" # self.RECONST97 = "Reconstruction 97" # self.MC_CELVOI = "M.C. Cellules voisines" # self.MC_SUPETCOMP = "M.C. Support étendu complet" # self.MC_SUPETREST = "M.C. Support étendu restreint" # self.INI_MC = "Initialization M.C." self.RECONST97 = "Iter. hand. of N.O." self.MC_CELVOI = "L.S. over neigh. cells" self.MC_SUPETCOMP = "L.S. over ext. cell neigh." self.MC_SUPETREST = "L.S. over part. ext. cell neigh." self.INI_MC = "L.S. Initialization" # 2) Messages # if Tool.GuiParam.lang == 'fr': self.MSG_ERR_VIT = "Votre fichier xml a été 'trafiqué'" self.MSG_HLIST = "Cliquer le bouton droit pour " +\ "le menu contextuel." self.MSG_POSITIV = "Cette valeur est forcément positive" else: self.MSG_ERR_VIT = "Your xmlfile has been corrupted" self.MSG_HLIST = "Click right button for popup menu." self.MSG_POSITIV = "This value is obligatory positive" #------------------------------------------------------------------------------- # NumericalParamEquat test case #------------------------------------------------------------------------------- class NumericalParamGlobalTestCase(unittest.TestCase): """ """ def setUp(self): """ This method is executed before all "check" methods. """ from Base.XMLengine import Case from Base.XMLinitialize import XMLinit Tool.GuiParam.lang = 'en' self.case = Case(None) XMLinit(self.case) def tearDown(self): """ This method is executed after all "check" methods. """ del self.case def checkNumericalParamGlobalInstantiation(self): """ Check whether the NumericalParamEquatModel class could be instantiated """ model = None model = NumericalParamGlobalModel(self.case) assert model != None, 'Could not instantiate NumericalParamGlobalModel' def checkgetGradTransp(self): """ Check whether the NumericalParamEquatModel class could get gradient transpose """ model = None model = NumericalParamGlobalModel(self.case) resu = model.mGetGradTransp() test = 'on' assert resu == test, 'Could not get gradient transpose' def checkgetWallPrExtrap(self): """ Check whether the NumericalParamEquatModel class could get wall pressure extrapolation """ model = None model = NumericalParamGlobalModel(self.case) resu = model.mGetWallPrExtrap() test = '0' assert resu == test, 'Could not get wall pressure extrapolation' def checkgetGradReconst(self): """ Check whether the NumericalParamEquatModel class could get gradient reconstruction """ model = None model = NumericalParamGlobalModel(self.case) resu = model.mGetGradReconst() test = 0 assert resu == test, 'Could not get gradient reconstruction' def checksetWallPrExtrap(self): """ Check whether the NumericalParamEquatModel class could set wall pressure extrapolation """ model = None model = NumericalParamGlobalModel(self.case) model.mSetWallPrExtrap(0.8) resu = model.node_np.toString() test = ''\ ''\ ''\ '0.8'\ ''\ ''\ '' assert resu == test, 'Could not set wall pressure extrapolation' def suite(): testSuite = unittest.makeSuite(NumericalParamGlobalTestCase, "check") return testSuite def runTest(): runner = unittest.TextTestRunner() runner.run(suite()) #------------------------------------------------------------------------------- # End #-------------------------------------------------------------------------------