# -*- 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 thermal scalar management. This module contains the following classes and function: - ThermalScalarModel - ThermalScalarView - PageText - ThermalScalarTestCase """ #------------------------------------------------------------------------------- # Library modules import #------------------------------------------------------------------------------- import Tix, unittest from Tkconstants import * import sys #------------------------------------------------------------------------------- # Application modules import #------------------------------------------------------------------------------- from Base.Common import * import Base.Toolbox as Tool import Base.Dialog as Dialog import Base.TkPage as TkPage from Base.XMLvariables import Variables #------------------------------------------------------------------------------- # Thermal scalar model class #------------------------------------------------------------------------------- class ThermalScalarModel(Variables): """ The thermal scalar could be temperature (Celsius degrees or Kelvin) either enthalpy. """ def __init__(self, case): """ Constuctor. """ self.case = case # TODO: the InitZoneView class ! zone_label = "1" self.zone = zone_label self.node_models = self.case.xmlGetNode('thermophysical_models') self.node_bc = self.case.xmlGetNode('boundary_conditions') self.node_therm = self.node_models.xmlInitChildNode('thermal_scalar', 'model') self.node_user_sca = self.case.xmlGetNode('additional_scalars') self.node_prop = self.case.xmlGetNode('physical_properties').xmlGetNode('fluid_properties') self.node_coal = self.node_models.xmlGetChildNode('pulverized_coal', 'model') self.node_joule = self.node_models.xmlGetChildNode('joule_effect', 'model') self.node_gas = self.node_models.xmlGetChildNode('gas_combustion', 'model') self.node_ray = self.node_models.xmlGetChildNode('radiative_transfer', 'model') self.old_scaTh = "off" self.thermalModel = ('off', 'temperature_celsius', 'temperature_kelvin', 'enthalpy') def defaultThermalScalarValues(self): """ Return in a dictionnary which contains default values """ default = {} default['thermal_scalar'] = "off" return default def getAllThermalScalarModel(self): """ Return all defined thermal scalar in a tuple """ return self.thermalModel def thermalScalarModelsList(self): """ Create a tuple with the thermal scalar allowed by the analysis features (multi-phases model, and reactive flow models). """ thermalScalarList = self.thermalModel for node in (self.node_gas, self.node_coal, self.node_joule): if node: if node['model'] != 'off': thermalScalarList = ('off') return thermalScalarList def setThermalScalar(self, thermal_scalar): """ Update the thermal scalar markup from the XML document. """ if thermal_scalar not in self.thermalScalarModelsList(): sys.exit(1) if thermal_scalar in ('temperature_celsius', 'temperature_kelvin', 'enthalpy'): self.old_scaTh = self.node_therm['model'] self.node_therm['model'] = thermal_scalar self.setNewThermalScalar(self.node_therm, thermal_scalar, self.zone) self.setNewFluidProperty(self.node_prop, 'thermal_conductivity') l, u = self.getThermalScalarLabel() from DefineBoundaryRegions import DefBCModel for nature in ('inlet', 'outlet'): for bc in self.node_bc.xmlGetChildNodeList(nature): DefBCModel(self.case).setCondTherm(bc, 'dirichlet', thermal_scalar, l, '0') del DefBCModel else: self.node_therm['model'] = 'off' self.RemoveThermTimeStep() # delete thermal scalar variance if the new thermal scalar # is different from the previous one # if thermal_scalar != self.old_scaTh: if self.old_scaTh == "off": old_label = "" else: old_label = Tool.dicoLabel(self.old_scaTh) self.cancelThermalVariance(old_label) nodeList1 = self.node_user_sca.xmlGetNodeList('scalar', type='todelete') for node in nodeList1: node.xmlRemoveNode() # nodeList2 = self.node_bc.xmlGetNodeList('scalar', type='todelete') # for node in nodeList2: # node.xmlRemoveNode() def thermalRadiativeModel(self): """ """ if self.node_ray['model'] != 'off': return 0 else: return 1 def getThermalScalar(self): """ Return the current thermal scalar. """ model = self.node_therm['model'] if model not in self.thermalScalarModelsList(): model = self.defaultThermalScalarValues()['thermal_scalar'] self.setThermalScalar(model) return model def getThermalScalarLabel(self): """ Return the label of the thermal scalar and its unity. """ model = self.getThermalScalar() if model != 'off': node = self.node_therm.xmlGetNode('scalar', name=model, type='thermal') if not node: sys.exit(1) namesca = node['label'] if model == "temperature_celsius": unit = "°C" elif model == "temperature_kelvin": unit = "Kelvin" elif model == "enthalpy": unit = "J/kg" else: sys.exit(1) else: namesca = 'off' unit = None return namesca, unit def cancelThermalVariance(self, label): """ Delete the current selected entries from the Hlist and of course from the XML file. """ if not label : return nodeList0 = self.node_user_sca.xmlGetNodeList('scalar') # nodeList1 = self.node_bc.xmlGetNodeList('scalar') for node0 in nodeList0: if node0.xmlGetString('variance') == label: node0['type'] = 'todelete' self.cancelThermalVariance(node0['label']) def RemoveThermTimeStep(self): """ Remove node 'thermal_time_step' in time_parameters we call function from TimeStepModel """ from TimeStep import TimeStepModel TimeStepModel(self.case).RemoveThermalTimeStepNode() del TimeStepModel def turnOffThermalScalar(self): """ When a reactive flow model is turned on, the thermal scalar is is set to off. """ if self.node_therm['model'] == 'off': self.node_ray['model'] = 'off' self.RemoveThermTimeStep() def setInitialValue(self, nameZone, value): """ set initial value on the nameZone zone """ node_scal = self.node_therm.xmlGetChildNode('scalar') node_init = node_scal.xmlInitChildNode('initial_value', zone=nameZone) node_init.xmlSetTextNode(value) #------------------------------------------------------------------------------- # Main view class #------------------------------------------------------------------------------- class ThermalScalarView(TkPage.Page): """ Class to open Thermal Scalar Transport Page. """ def _dependsPages(self, name): """ Construction of the list of dependencies Pages. """ # self.case[name]['depends'] = ['models/initia', # 'bounda/scalar'] self.case[name]['depends'] = ['models/initia'] def _tkControlVariables(self): """ Tkinter variables declaration. """ self.scalar = Tix.StringVar() def _pageControl(self): """ Instantiate the thermal scalar modelling class. """ self.thermal = ThermalScalarModel(self.case) def putThermalScalar(self, event=None): """ Update the thermal scalar markup. """ self.stbar.busy() th = self.scalar.get() self.thermal.setThermalScalar(th) if th in ('temperature_celsius', 'temperature_kelvin', 'enthalpy'): if self.myTree.tree.getmode('models') == 'close': self.myTree.tree.hlist.show_entry('models/radiat') if not self.thermal.thermalRadiativeModel(): self.myTree.tree.hlist.show_entry('output/solutray') else: self.myTree.tree.hlist.hide_entry('output/solutray') else: if self.myTree.tree.getmode('models') == 'close': self.myTree.tree.hlist.hide_entry('models/radiat') self.myTree.tree.hlist.hide_entry('output/solutray') self.stbar.idle() def _createWidgets(self): """ Create the Page layout. """ t = PageText() lf = Tix.LabelFrame(self.myPage, bd=2, label=t.THERMAL_SCALAR, relief=FLAT) lf.label.config(font=fT) lf.pack(side=TOP, fill=X, padx=10, pady=10) # Button for the thermal scalar # self.b = Tix.OptionMenu(lf.frame, options='menubutton.width 45') self.b.menubutton.config(bd=2, relief=RAISED) self.balloon.bind_widget(self.b, statusmsg=t.MSG_SCALAR, balloonmsg=t.KEYWORD+' ISCALT, ISCSTH') self.b.pack(side=TOP, pady=15, padx=10) self.b.add_command('off', label=t.NO_SCALAR) self.b.add_separator('') self.b.add_command('temperature_celsius', label=t.TEMP_CELSIUS) self.b.add_command('temperature_kelvin', label=t.TEMP_KELVIN) self.b.add_command('enthalpy', label=t.ENTHALPY) self.b.config(variable=self.scalar , command= self.putThermalScalar) 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. """ # Update the thermal scalar list with the analysis features # for sca in self.thermal.thermalModel: if sca not in self.thermal.thermalScalarModelsList(): self.b.disable(sca) # Select the thermal scalar model # model = self.thermal.getThermalScalar() self.b.config(value=model) #------------------------------------------------------------------------------- # 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.ENTHALPY = "Enthalpie (J/kg)" self.KEYWORD = "Mots clé Code_Saturne : " self.NO_SCALAR = "Pas de scalaire thermique" self.TEMP_CELSIUS = "Température (degrés Celsius)" self.TEMP_KELVIN = "Température (Kelvin)" self.THERMAL_SCALAR = "Transport d'un scalaire thermique" else: self.ENTHALPY = "Enthalpy (J/kg)" self.KEYWORD = "Code_Saturne key words: " self.NO_SCALAR = "No thermal scalar" self.TEMP_CELSIUS = "Temperature (Celsius degrees)" self.TEMP_KELVIN = "Temperature (Kelvin)" self.THERMAL_SCALAR = "Thermal scalar conservation" # 2) Messages # if Tool.GuiParam.lang == 'fr': self.MSG_SCALAR = "Sélectionner le scalaire thermique" else: self.MSG_SCALAR = "Select the thermal scalar" #------------------------------------------------------------------------------- # Turbulence test case #------------------------------------------------------------------------------- class ThermalScalarTestCase(unittest.TestCase): """ """ def setUp(self): """ This method is executed before all "check" methods. """ ## from Base.XMLengine import Case ## self.case = Case() from Base.XMLengine import Case, XMLDocument from Base.XMLinitialize import XMLinit Tool.GuiParam.lang = 'en' self.case = Case(None) XMLinit(self.case) self.doc = XMLDocument() def tearDown(self): """ This method is executed after all "check" methods. """ del self.case def checkThermalInstantiation(self): """ Check whether the ThermalScalarModel class could be instantiated """ model = None model = ThermalScalarModel(self.case) assert model != None, 'Could not instantiate ThermalScalarModel' def checkThermalScalarModelsList(self): """ Check whether the ThermalScalarModelsList could be get """ mdl = ThermalScalarModel(self.case) mdl.node_gas['model'] = 'on' ## assert mdl.thermalScalarModelsList() == ('enthalpy'),\ assert mdl.thermalScalarModelsList() == ('off'),\ 'Could not use the thermalScalarModelsList method' def checkSetTemperatureKelvin(self): """ Check whether the temperature kelvin thermal scalar could be set """ mdl = ThermalScalarModel(self.case) mdl.node_therm.xmlRemoveChild('scalar') mdl.node_prop.xmlRemoveChild('property') mdl.setThermalScalar('temperature_kelvin') truc = mdl.node_therm.toString() doc = ''\ ''\ '293.15'\ '-1e+12'\ '1e+12'\ ''\ '' assert doc == truc, 'Could not set the temperature kelvin thermal scalar' truc = mdl.node_prop.toString() doc = ''\ ''\ ''\ ''\ ''\ '' assert doc == truc, 'Could not set the thermal conductivity property' def checkGetThermalScalar(self): """ Check whether the thermal scalar could be get """ mdl = ThermalScalarModel(self.case) mdl.setThermalScalar('enthalpy') assert mdl.getThermalScalar() == 'enthalpy', \ 'Could not get the thermal scalar' def checkGetThermalScalarLabel(self): """ Check whether the thermal scalar label and unity could be get """ mdl = ThermalScalarModel(self.case) mdl.setThermalScalar('enthalpy') node = mdl.node_therm.xmlGetNode('scalar', name='enthalpy') node['label'] = "H" n, u = mdl.getThermalScalarLabel() assert (n,u) == ('H','J/kg') , \ 'Could not get the thermal scalar label and unity' def suite(): testSuite = unittest.makeSuite(ThermalScalarTestCase, "check") return testSuite def runTest(): print "ThermalScalarTestCase" runner = unittest.TextTestRunner() runner.run(suite()) #------------------------------------------------------------------------------- # End #-------------------------------------------------------------------------------