1# -*- coding: utf-8 -*- 2 3#------------------------------------------------------------------------------- 4 5# This file is part of Code_Saturne, a general-purpose CFD tool. 6# 7# Copyright (C) 1998-2021 EDF S.A. 8# 9# This program is free software; you can redistribute it and/or modify it under 10# the terms of the GNU General Public License as published by the Free Software 11# Foundation; either version 2 of the License, or (at your option) any later 12# version. 13# 14# This program is distributed in the hope that it will be useful, but WITHOUT 15# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 16# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 17# details. 18# 19# You should have received a copy of the GNU General Public License along with 20# this program; if not, write to the Free Software Foundation, Inc., 51 Franklin 21# Street, Fifth Floor, Boston, MA 02110-1301, USA. 22 23#------------------------------------------------------------------------------- 24 25""" 26This module defines the turbulence model data management. 27 28This module contains the following classes and function: 29- TurbulenceModel 30- TurbulenceTestCase 31""" 32 33#------------------------------------------------------------------------------- 34# Library modules import 35#------------------------------------------------------------------------------- 36 37import sys, unittest 38 39#------------------------------------------------------------------------------- 40# Application modules import 41#------------------------------------------------------------------------------- 42 43from code_saturne.model.Common import * 44from code_saturne.model.XMLvariables import Variables, Model 45from code_saturne.model.XMLmodel import ModelTest 46from code_saturne.model.NumericalParamGlobalModel import NumericalParamGlobalModel 47from code_saturne.model.DefineUserScalarsModel import DefineUserScalarsModel 48 49#------------------------------------------------------------------------------- 50# Turbulence model class 51#------------------------------------------------------------------------------- 52 53class TurbulenceModel(Variables, Model): 54 """ 55 Manage the input/output markups in the xml doc about Turbulence 56 """ 57 def __init__(self, case): 58 """ 59 Constructor. 60 """ 61 self.case = case 62 63 self.node_models = self.case.xmlGetNode('thermophysical_models') 64 self.node_lagr = self.case.xmlGetNode('lagrangian') 65 self.node_coal = self.node_models.xmlGetChildNode('solid_fuels', 'model') 66 self.node_joule = self.node_models.xmlGetChildNode('joule_effect', 'model') 67 self.node_gas = self.node_models.xmlGetChildNode('gas_combustion', 'model') 68 self.node_turb = self.node_models.xmlInitChildNode('turbulence', 'model') 69 self.node_bc = self.case.xmlGetNode('boundary_conditions') 70 self.node_ana = self.case.xmlInitNode('analysis_control') 71 self.node_prof = self.node_ana.xmlInitNode('profiles') 72 self.node_ava = self.node_ana.xmlInitNode('time_averages') 73 74 self.__turbModel = ('off', 75 'mixing_length', 76 'k-epsilon', 77 'k-epsilon-PL', 78 'Rij-epsilon', 79 'Rij-SSG', 80 'Rij-EBRSM', 81 'v2f-BL-v2/k', 82 'k-omega-SST', 83 'Spalart-Allmaras', 84 'LES_Smagorinsky', 85 'LES_dynamique', 86 'LES_WALE') 87 88 self.__turbLESmodel = ('LES_Smagorinsky', 89 'LES_dynamique', 90 'LES_WALE') 91 92 self.__allVariables = ['r11', 93 'r22', 94 'r33', 95 'r12', 96 'r13', 97 'r23', 98 'rij', 99 'k', 100 'epsilon', 101 'phi', 102 'alpha', 103 'omega', 104 'nu_tilda'] 105 106 107 def turbulenceModels(self): 108 """ 109 Return all turbulence models known. 110 111 @rtype: C{Tuple} 112 @return: list of turbulence models 113 """ 114 return self.__turbModel 115 116 117 def LESmodels(self): 118 """ 119 Return only LES turbulence models. 120 121 @rtype: C{Tuple} 122 @return: list of LES models 123 """ 124 return self.__turbLESmodel 125 126 127 def RANSmodels(self): 128 """ 129 Return only RANS turbulence models. 130 131 @rtype: C{Tuple} 132 @return: list of RANS models 133 """ 134 l = [] 135 for m in self.__turbModel: 136 if m not in self.__turbLESmodel and \ 137 m not in ("off", "mixing_length"): 138 l.append(m) 139 return l 140 141 142 def defaultTurbulenceValues(self): 143 """ 144 Return in a dictionnary which contains default values. 145 146 @rtype: C{Dictionary} 147 @return: default values 148 """ 149 default = {} 150 default['turbulence_model'] = "k-epsilon-PL" 151 default['length_scale'] = 1.0 152 default['turbulent_diffusion_model'] = 'shir' 153 default['wall_function'] = 3 154 default['gravity_terms'] = "on" 155 default['reference_velocity'] = 1.0 156 default['reference_length_choice'] = 'automatic' 157 default['reference_length'] = 1.0 158 159 return default 160 161 162 def turbulenceModelsList(self): 163 """ 164 Create a tuple with the turbulence models allowed by the calculation 165 features (multi-phases model, and reactive flow models). 166 167 @rtype: C{Tuple} 168 @return: list of avalaible models 169 """ 170 turbList = self.__turbModel 171 172 if self.node_lagr and self.node_lagr['model'] == 'on': 173 turbList = self.RANSmodels() 174 turbList.insert(0, "off") 175 176 if self.node_gas and self.node_gas['model'] != 'off': 177 turbList = self.RANSmodels() 178 179 if self.node_coal and self.node_coal['model'] != 'off': 180 turbList = ('off', 'k-epsilon', 'k-epsilon-PL') 181 182 return turbList 183 184 185 def __removeVariablesAndProperties(self, varList, propName): 186 """ 187 Delete variables and property that are useless accordingly to the model. 188 """ 189 for v in self.__allVariables: 190 if v not in varList: 191 self.node_turb.xmlRemoveChild('variable', name=v) 192 for node in self.node_prof.xmlGetNodeList('profile'): 193 node.xmlRemoveChild('var_prop', name=v) 194 for node in self.node_ava.xmlGetNodeList('time_average'): 195 node.xmlRemoveChild('var_prop', name=v) 196 self.node_turb.xmlRemoveChild('property', name=propName) 197 for node in self.node_prof.xmlGetNodeList('profile'): 198 node.xmlRemoveChild('var_prop', name=propName) 199 for node in self.node_ava.xmlGetNodeList('time_average'): 200 node.xmlRemoveChild('var_prop', name=propName) 201 202 203 @Variables.undoGlobal 204 def setTurbulenceModel(self, model_turb): 205 """ 206 Input ITURB 207 """ 208 self.isInList(model_turb, self.turbulenceModelsList()) 209 210 model_turb_old = self.node_turb['model'] 211 self.node_turb['model'] = model_turb 212 213 NumericalParamGlobalModel(self.case).setTimeSchemeOrder(1) 214 215 if model_turb == 'mixing_length': 216 self.setNewProperty(self.node_turb, 'turbulent_viscosity') 217 self.__removeVariablesAndProperties([], 'smagorinsky_constant^2') 218 self.node_turb.xmlRemoveChild('wall_function') 219 220 elif model_turb in ('k-epsilon', 'k-epsilon-PL'): 221 lst = ('k', 'epsilon') 222 for v in lst: 223 self.setNewVariable(self.node_turb, v, label=v) 224 self.setNewProperty(self.node_turb, 'turbulent_viscosity') 225 self.__updateInletsForTurbulence() 226 self.__removeVariablesAndProperties(lst, 'smagorinsky_constant^2') 227 228 elif model_turb in ('Rij-epsilon', 'Rij-SSG', 'Rij-EBRSM'): 229 # Rij is now considered as a tensor (vector of length 6, 230 # since it is symmetric) 231 lst = ['rij', 'epsilon'] 232 if model_turb == 'Rij-EBRSM': 233 lst.append('alpha') 234 for v in lst: 235 if v == 'rij': 236 self.setNewVariable(self.node_turb, 'rij', label='Rij', dim='6') 237 else: 238 self.setNewVariable(self.node_turb, v, label=v) 239 self.setNewProperty(self.node_turb, 'turbulent_viscosity') 240 self.__updateInletsForTurbulence() 241 self.__removeVariablesAndProperties(lst, 'smagorinsky_constant^2') 242 243 elif model_turb in self.LESmodels(): 244 if model_turb == 'LES_dynamique': 245 self.setNewProperty(self.node_turb, 'smagorinsky_constant^2') 246 else: 247 self.__removeVariablesAndProperties([], 'smagorinsky_constant^2') 248 249 if self.node_lagr['model'] != "off": 250 lst = ('k', 'epsilon') 251 for v in lst: 252 self.setNewVariable(self.node_turb, v, label=v) 253 254 self.setNewProperty(self.node_turb, 'turbulent_viscosity') 255 self.__updateInletsForTurbulence() 256 self.node_turb.xmlRemoveChild('wall_function') 257 258 from code_saturne.model.TimeStepModel import TimeStepModel 259 TimeStepModel(self.case).setTimePassing(0) 260 del TimeStepModel 261 262 NumericalParamGlobalModel(self.case).setTimeSchemeOrder(2) 263 264 elif model_turb == 'v2f-BL-v2/k': 265 lst = ('k', 'epsilon', 'phi', 'alpha') 266 for v in lst: 267 self.setNewVariable(self.node_turb, v, label=v) 268 self.setNewProperty(self.node_turb, 'turbulent_viscosity') 269 self.__updateInletsForTurbulence() 270 self.__removeVariablesAndProperties(lst, 'smagorinsky_constant^2') 271 wall_function = 0 272 self.setWallFunction(wall_function) 273 274 elif model_turb == 'k-omega-SST': 275 lst = ('k', 'omega') 276 for v in lst: 277 self.setNewVariable(self.node_turb, v, label=v) 278 self.setNewProperty(self.node_turb, 'turbulent_viscosity') 279 self.__updateInletsForTurbulence() 280 self.__removeVariablesAndProperties(lst, 'smagorinsky_constant^2') 281 282 elif model_turb == 'Spalart-Allmaras': 283 lst = ('nu_tilda') 284 self.setNewVariable(self.node_turb, 'nu_tilda', label='nu_tilda') 285 self.setNewProperty(self.node_turb, 'turbulent_viscosity') 286 self.__updateInletsForTurbulence() 287 self.__removeVariablesAndProperties(lst, 'smagorinsky_constant^2') 288 self.node_turb.xmlRemoveChild('wall_function') 289 290 else: 291 model_turb = 'off' 292 self.node_turb.xmlRemoveChild('variable') 293 self.node_turb.xmlRemoveChild('property') 294 self.node_turb.xmlRemoveChild('wall_function') 295 self.__removeVariablesAndProperties([], 'smagorinsky_constant^2') 296 wall_function = 0 297 self.setWallFunction(wall_function) 298 299 # If the user changes the turbulence model, reset the default 300 # numerical parameters 301 if model_turb != model_turb_old: 302 from code_saturne.model.NumericalParamEquationModel import NumericalParamEquationModel 303 NumericalParamEquationModel(self.case).setSchemeDefaultValues() 304 del NumericalParamEquationModel 305 306 DefineUserScalarsModel(self.case).setTurbulentFluxGlobalModel(model_turb) 307 308 309 def __updateInletsForTurbulence(self): 310 """ 311 Put boundaries conditions if it's necessary 312 """ 313 from code_saturne.model.Boundary import Boundary 314 for nodbc in self.node_bc.xmlGetChildNodeList('inlet'): 315 model = Boundary('inlet', nodbc['label'], self.case) 316 model.getTurbulenceChoice() 317 318 del Boundary 319 320 @Variables.noUndo 321 def getTurbulenceModel(self): 322 """ 323 Return the current turbulence model. 324 """ 325 model = self.node_turb['model'] 326 if model not in self.turbulenceModelsList(): 327 model = self.defaultTurbulenceValues()['turbulence_model'] 328 self.setTurbulenceModel(model) 329 return model 330 331 332 @Variables.undoLocal 333 def setLengthScale(self, l_scale): 334 """ 335 Input XLOMLG. 336 """ 337 self.isGreater(l_scale, 0.0) 338 if self.getTurbulenceModel() == 'mixing_length': 339 self.node_turb.xmlSetData('mixing_length_scale', l_scale) 340 341 342 @Variables.noUndo 343 def getLengthScale(self): 344 """ 345 Return XLOMLG. 346 """ 347 l_scale = self.node_turb.xmlGetDouble('mixing_length_scale') 348 if l_scale == None: 349 l_scale = self.defaultTurbulenceValues()['length_scale'] 350 self.setLengthScale(l_scale) 351 return l_scale 352 353 354 @Variables.undoLocal 355 def setVelocity(self, value): 356 """ 357 Set value of reference velocity into xml file. 358 """ 359 self.isGreaterOrEqual(value, 0.0) 360 self.node_turb.xmlSetData('reference_velocity',value) 361 362 363 @Variables.noUndo 364 def getVelocity(self): 365 """ 366 Return the value of reference velocity. 367 """ 368 value = self.node_turb.xmlGetDouble('reference_velocity') 369 if value == None: 370 value = self.defaultTurbulenceValues()['reference_velocity'] 371 self.setVelocity(value) 372 373 return value 374 375 376 @Variables.undoLocal 377 def setLengthChoice(self, choice): 378 """ 379 Set the Length choice. 380 """ 381 self.isInList(choice, ['automatic','prescribed']) 382 383 node_init = self.node_turb.xmlInitNode('reference_length') 384 node_init['choice'] = choice 385 if choice == 'automatic': 386 self.node_turb.xmlRemoveChild('reference_length') 387 388 389 @Variables.noUndo 390 def getLengthChoice(self): 391 """ 392 Get the Length choice. 393 """ 394 node_init = self.node_turb.xmlInitNode('reference_length') 395 choice = node_init['choice'] 396 if choice == None: 397 choice = self.defaultTurbulenceValues()['reference_length_choice'] 398 self.setLengthChoice(choice) 399 return choice 400 401 402 @Variables.undoLocal 403 def setLength(self, value): 404 """ 405 Set value of reference length into xml file. 406 """ 407 self.isGreaterOrEqual(value, 0.0) 408 self.node_turb.xmlSetData('reference_length',value) 409 410 411 @Variables.noUndo 412 def getLength(self): 413 """ 414 Return the value of reference length. 415 """ 416 value = self.node_turb.xmlGetDouble('reference_length') 417 if value == None: 418 value = self.defaultTurbulenceValues()['reference_length'] 419 self.setLength(value) 420 421 return value 422 423 424 @Variables.noUndo 425 def getWallFunction(self): 426 """ 427 Return wall function from advanced options. 428 """ 429 wall_function = self.node_turb.xmlGetInt('wall_function') 430 model_turb = self.getTurbulenceModel() 431 if wall_function == None: 432 wall_function = -1 # for next test 433 if model_turb == 'Rij-EBRSM' : 434 if wall_function not in (0,7) : 435 # Force default wall function to iwallf = 7 436 # for Rij EB-RSM model 437 wall_function = 7 438 self.setWallFunction(wall_function) 439 elif model_turb == 'k-omega-SST' : 440 if wall_function < 0 or wall_function > 7 : 441 wall_function = self.defaultTurbulenceValues()['wall_function'] 442 self.setWallFunction(wall_function) 443 else : 444 if wall_function < 0 or wall_function > 5 : 445 wall_function = self.defaultTurbulenceValues()['wall_function'] 446 self.setWallFunction(wall_function) 447 return wall_function 448 449 450 @Variables.undoLocal 451 def setWallFunction(self, wall_function): 452 """ 453 Input wall function for advanced options. 454 """ 455 self.isIntInList(wall_function, [0, 1, 2, 3, 4, 5, 7]) 456 self.node_turb.xmlSetData('wall_function', wall_function) 457 458 459 @Variables.noUndo 460 def getTurbDiffModel(self): 461 """ 462 Return turbulent diffusion model from advanced options. 463 """ 464 turb_diff_model = self.node_turb.xmlGetString('turbulent_diffusion_model') 465 if not turb_diff_model: 466 turb_diff_model = self.defaultTurbulenceValues()['turbulent_diffusion_model'] 467 return turb_diff_model 468 469 470 @Variables.undoLocal 471 def setTurbDiffModel(self, turb_diff_model): 472 """ 473 Input turbulent diffusion model for advanced options. 474 """ 475 if turb_diff_model == self.defaultTurbulenceValues()['turbulent_diffusion_model']: 476 self.node_turb.xmlRemoveChild('turbulent_diffusion_model') 477 else: 478 self.node_turb.xmlSetData('turbulent_diffusion_model', turb_diff_model) 479 480 481 @Variables.noUndo 482 def getGravity(self): 483 """ 484 Return scale model from advanced options . 485 """ 486 node_gravity = self.node_turb.xmlInitNode('gravity_terms', 'status') 487 gravity = node_gravity['status'] 488 if not gravity: 489 gravity = self.defaultTurbulenceValues()['gravity_terms'] 490 self.setGravity(gravity) 491 492 # force gravity force to off for Spalart-Allmaras model 493 if self.getTurbulenceModel() == 'Spalart-Allmaras': 494 gravity = 'off' 495 self.setGravity(gravity) 496 497 return gravity 498 499 500 @Variables.undoLocal 501 def setGravity(self, gravity): 502 """ 503 Input gravity for advanced options. 504 """ 505 self.isOnOff(gravity) 506 node_gravity = self.node_turb.xmlInitNode('gravity_terms', 'status') 507 node_gravity ['status'] = gravity 508 509 510 def getTurbulenceVariable(self): 511 """ 512 Return the turbulence <variable> markup list. 513 """ 514 model = self.getTurbulenceModel() 515 nodeList = [] 516 517 if model in ('k-epsilon','k-epsilon-PL'): 518 nodeList.append(self.node_turb.xmlGetNode('variable', name='k')) 519 nodeList.append(self.node_turb.xmlGetNode('variable', name='epsilon')) 520 elif model in self.LESmodels(): 521 if self.node_lagr['model'] != "off": 522 nodeList.append(self.node_turb.xmlGetNode('variable', name='k')) 523 nodeList.append(self.node_turb.xmlGetNode('variable', name='epsilon')) 524 elif model in ('Rij-epsilon', 'Rij-SSG', 'Rij-EBRSM'): 525 for var in ('r11', 'r22', 'r33', 526 'r12', 'r13', 'r23', 'epsilon'): 527 nodeList.append(self.node_turb.xmlGetNode('variable', name=var)) 528 if model == 'Rij-EBRSM': 529 nodeList.append(self.node_turb.xmlGetNode('variable', name='alpha')) 530 elif model == 'v2f-BL-v2/k': 531 nodeList.append(self.node_turb.xmlGetNode('variable', name='k')) 532 nodeList.append(self.node_turb.xmlGetNode('variable', name='epsilon')) 533 nodeList.append(self.node_turb.xmlGetNode('variable', name='phi')) 534 nodeList.append(self.node_turb.xmlGetNode('variable', name='alpha')) 535 elif model == 'k-omega-SST': 536 nodeList.append(self.node_turb.xmlGetNode('variable', name='k')) 537 nodeList.append(self.node_turb.xmlGetNode('variable', name='omega')) 538 elif model == 'Spalart-Allmaras': 539 nodeList.append(self.node_turb.xmlGetNode('variable', name='nu_tilda')) 540 return nodeList 541 542#------------------------------------------------------------------------------- 543# TurbulenceModel test case 544#------------------------------------------------------------------------------- 545 546class TurbulenceModelTestCase(ModelTest): 547 """ 548 """ 549 def checkTurbulenceInstantiation(self): 550 """Check whether the TurbulenceModel class could be instantiated""" 551 model = None 552 model = TurbulenceModel(self.case) 553 assert model != None, 'Could not instantiate TurbulenceModel' 554 555 def checkTurbulenceModelsList(self): 556 """Check whether the TurbulenceModelList could be get""" 557 from code_saturne.model.LagrangianModel import LagrangianModel 558 LagrangianModel(self.case).setLagrangianStatus('on') 559 del LagrangianModel 560 mdl = TurbulenceModel(self.case) 561 562 l = mdl.RANSmodels() 563 l.insert(0, "off") 564 assert mdl.turbulenceModelsList() == l, \ 565 'Could not return turbulence models for particles tracking' 566 567 mdl.node_gas['model'] = 'on' 568 assert mdl.turbulenceModelsList() == mdl.RANSmodels(), \ 569 'Could not return turbulence models for particular physics' 570 571 def checkSetMixingLength(self): 572 """Check whether the mixing length turbulence model could be set""" 573 mdl = TurbulenceModel(self.case) 574 mdl.node_turb.xmlRemoveChild('variable') 575 mdl.setTurbulenceModel('mixing_length') 576 mdl.setLengthScale(1) 577 doc ='''<turbulence model="mixing_length"> 578 <property label="TurbVisc" name="turbulent_viscosity"/> 579 <initialization choice="reference_velocity"> 580 <reference_velocity>1</reference_velocity> 581 </initialization> 582 <mixing_length_scale>1</mixing_length_scale> 583 </turbulence>''' 584 585 assert mdl.node_turb == self.xmlNodeFromString(doc),\ 586 'Could not set the mixing length turbulence model' 587 588 def checkSetkepsilon(self): 589 """Check whether the k-epsilon turbulence model could be set""" 590 mdl = TurbulenceModel(self.case) 591 mdl.setTurbulenceModel('k-epsilon') 592 doc ='''<turbulence model="k-epsilon"> 593 <variable label="TurbEner" name="k"/> 594 <variable label="Dissip" name="epsilon"/> 595 <property label="TurbVisc" name="turbulent_viscosity"/> 596 <initialization choice="reference_velocity"> 597 <reference_velocity>1</reference_velocity> 598 </initialization> 599 </turbulence>''' 600 601 assert mdl.node_turb == self.xmlNodeFromString(doc),\ 602 'Could not set the k-epsilon turbulence model' 603 604 def checkSetkepsilonPL(self): 605 """Check whether the k-epsilon turbulence model could be set""" 606 mdl = TurbulenceModel(self.case) 607 mdl.setTurbulenceModel('k-epsilon-PL') 608 doc ='''<turbulence model="k-epsilon-PL"> 609 <variable label="TurbEner" name="k"/> 610 <variable label="Dissip" name="epsilon"/> 611 <property label="TurbVisc" name="turbulent_viscosity"/> 612 <initialization choice="reference_velocity"> 613 <reference_velocity>1</reference_velocity> 614 </initialization> 615 </turbulence>''' 616 assert mdl.node_turb == self.xmlNodeFromString(doc),\ 617 'Could not set the linear production k-epsilon turbulence model' 618 619 def checkSetRijepsilon(self): 620 """Check whether the Rij-epsilon turbulence model could be set""" 621 mdl = TurbulenceModel(self.case) 622 mdl.node_turb.xmlRemoveChild('variable') 623 mdl.setTurbulenceModel('Rij-epsilon') 624 doc ='''<turbulence model="Rij-epsilon"> 625 <property label="TurbVisc" name="turbulent_viscosity"/> 626 <variable label="R11" name="r11"/> 627 <variable label="R22" name="r22"/> 628 <variable label="R33" name="r33"/> 629 <variable label="R12" name="r12"/> 630 <variable label="R13" name="r13"/> 631 <variable label="R23" name="r23"/> 632 <variable label="Dissip" name="epsilon"/> 633 <initialization choice="reference_velocity"> 634 <reference_velocity>1</reference_velocity> 635 </initialization> 636 </turbulence>''' 637 assert mdl.node_turb == self.xmlNodeFromString(doc),\ 638 'Could not set the Rij-epsilon turbulence model' 639 640 def checkSetRijepsilonSSG(self): 641 """Check whether the Rij-epsilon SSG turbulence model could be set""" 642 mdl = TurbulenceModel(self.case) 643 mdl.node_turb.xmlRemoveChild('variable') 644 mdl.setTurbulenceModel('Rij-SSG') 645 truc = mdl.node_turb 646 doc ='''<turbulence model="Rij-SSG"> 647 <property label="TurbVisc" name="turbulent_viscosity"/> 648 <initialization choice="reference_velocity"> 649 <reference_velocity>1</reference_velocity> 650 </initialization> 651 <variable label="R11" name="r11"/> 652 <variable label="R22" name="r22"/> 653 <variable label="R33" name="r33"/> 654 <variable label="R12" name="r12"/> 655 <variable label="R13" name="r13"/> 656 <variable label="R23" name="r23"/> 657 <variable label="Dissip" name="epsilon"/> 658 </turbulence>''' 659 assert mdl.node_turb == self.xmlNodeFromString(doc),\ 660 'Could not set the Rij-epsilon SSG turbulence model' 661 662 def checkSetRijepsilonEBRSM(self): 663 """Check whether the Rij-epsilon EBRSM turbulence model could be set""" 664 mdl = TurbulenceModel(self.case) 665 mdl.node_turb.xmlRemoveChild('variable') 666 mdl.setTurbulenceModel('Rij-EBRSM') 667 truc = mdl.node_turb 668 doc ='''<turbulence model="Rij-EBRSM"> 669 <property label="TurbVisc" name="turbulent_viscosity"/> 670 <initialization choice="reference_velocity"> 671 <reference_velocity>1</reference_velocity> 672 </initialization> 673 <variable label="R11" name="r11"/> 674 <variable label="R22" name="r22"/> 675 <variable label="R33" name="r33"/> 676 <variable label="R12" name="r12"/> 677 <variable label="R13" name="r13"/> 678 <variable label="R23" name="r23"/> 679 <variable label="Dissip" name="epsilon"/> 680 <variable label="alpha" name="alpha"/> 681 </turbulence>''' 682 assert mdl.node_turb == self.xmlNodeFromString(doc),\ 683 'Could not set the Rij-epsilon EBRSM turbulence model' 684 685 def checkSetLESSmagorinsky(self): 686 """Check whether the classical LES turbulence model could be set""" 687 mdl = TurbulenceModel(self.case) 688 mdl.node_turb.xmlRemoveChild('variable') 689 mdl.node_turb.xmlRemoveChild('property') 690 mdl.node_turb.xmlRemoveChild('initialization') 691 mdl.setTurbulenceModel('LES_Smagorinsky') 692 truc = mdl.node_turb 693 doc ='''<turbulence model="LES_Smagorinsky"> 694 <property label="Csdyn2" name="smagorinsky_constant^2"/> 695 </turbulence>''' 696 assert mdl.node_turb == self.xmlNodeFromString(doc),\ 697 'Could not set the LES turbulence model' 698 699 def checkSetLESdynamique(self): 700 """Check whether the dynamique LES turbulence model could be set""" 701 mdl = TurbulenceModel(self.case) 702 mdl.node_turb.xmlRemoveChild('variable') 703 mdl.node_turb.xmlRemoveChild('property') 704 mdl.node_turb.xmlRemoveChild('initialization') 705 mdl.setTurbulenceModel('LES_dynamique') 706 truc = mdl.node_turb 707 doc = '''<turbulence model="LES_dynamique"> 708 <property label="Csdyn2" name="smagorinsky_constant^2"/> 709 </turbulence>''' 710 assert mdl.node_turb == self.xmlNodeFromString(doc),\ 711 'Could not set the dynamique LES turbulence model' 712 713 def checkSetV2F(self): 714 """Check whether the v2f phi turbulence model could be set""" 715 mdl = TurbulenceModel(self.case) 716 mdl.setTurbulenceModel('v2f-BL-v2/k') 717 doc = '''<turbulence model="v2f-BL-v2/k"> 718 <variable label="TurbEner" name="k"/> 719 <variable label="Dissip" name="epsilon"/> 720 <variable label="phi" name="phi"/> 721 <variable label="alpha" name="alpha"/> 722 <property label="TurbVisc" name="turbulent_viscosity"/> 723 <initialization choice="reference_velocity"> 724 <reference_velocity>1.0</reference_velocity> 725 </initialization> 726 </turbulence>''' 727 assert mdl.node_turb == self.xmlNodeFromString(doc),\ 728 'Could not set the v2f phi turbulence model' 729 730 def checkkOmegaSST(self): 731 """Check whether the k-Omega SST turbulence model could be set""" 732 mdl = TurbulenceModel(self.case) 733 mdl.setTurbulenceModel('k-omega-SST') 734 doc = '''<turbulence model="k-omega-SST"> 735 <variable label="TurbEner" name="k"/> 736 <variable label="Dissip" name="epsilon"/> 737 <property label="TurbVisc" name="turbulent_viscosity"/> 738 <variable label="omega" name="omega"/> 739 <initialization choice="reference_velocity"> 740 <reference_velocity>1.0</reference_velocity> 741 </initialization> 742 </turbulence>''' 743 assert mdl.node_turb == self.xmlNodeFromString(doc),\ 744 'Could not set the k_Omega SST turbulence model' 745 746 def checkSpalartAllmaras(self): 747 """Check whether the Spalart-Allmaras turbulence model could be set""" 748 mdl = TurbulenceModel(self.case) 749 mdl.setTurbulenceModel('Spalart-Allmaras') 750 doc = '''<turbulence model="Spalart-Allmaras"> 751 <variable label="NuTilda" name="nu_tilda"/> 752 <property label="TurbVisc" name="turbulent_viscosity"/> 753 <initialization choice="reference_velocity"> 754 <reference_velocity>1.0</reference_velocity> 755 </initialization> 756 </turbulence>''' 757 assert mdl.node_turb == self.xmlNodeFromString(doc),\ 758 'Could not set the Spalart-Allmaras turbulence model' 759 760 def checkGetTurbulenceModel(self): 761 """Check whether the turbulence model could be get""" 762 mdl = TurbulenceModel(self.case) 763 mdl.setTurbulenceModel('Rij-epsilon') 764 765 assert mdl.getTurbulenceModel() == 'Rij-epsilon', \ 766 'Could not get the turbulence model' 767 768 def checkSetLengthScale(self): 769 """Check whether the mixing length scale could be set""" 770 mdl = TurbulenceModel(self.case) 771 mdl.setTurbulenceModel('mixing_length') 772 mdl.node_turb.xmlRemoveChild('variable') 773 mdl.node_turb.xmlRemoveChild('property') 774 mdl.node_turb.xmlRemoveChild('initialization') 775 mdl.setLengthScale(123.0) 776 doc = '''<turbulence model="mixing_length"> 777 <mixing_length_scale>123</mixing_length_scale> 778 </turbulence>''' 779 assert mdl.node_turb == self.xmlNodeFromString(doc),\ 780 'Could not set the mixing length scale' 781 782 def checkSetandGetWallFunction(self): 783 """Check whether the wall function could be get""" 784 mdl = TurbulenceModel(self.case) 785 mdl.setTurbulenceModel('k-epsilon') 786 mdl.setWallFunction(2) 787 788 doc = '''<turbulence model="k-epsilon"> 789 <variable label="TurbEner" name="k"/> 790 <variable label="Dissip" name="epsilon"/> 791 <property label="TurbVisc" name="turbulent_viscosity"/> 792 <initialization choice="reference_velocity"> 793 <reference_velocity>1</reference_velocity> 794 </initialization> 795 <wall_function>2</wall_function> 796 </turbulence>''' 797 assert mdl.node_turb == self.xmlNodeFromString(doc),\ 798 'Could not set the wall function ' 799 assert mdl.getWallFunction() == 2,\ 800 'Could not get the wall function ' 801 802 def checkSetandGetgravity(self): 803 """Check whether the gravity could be get""" 804 mdl = TurbulenceModel(self.case) 805 mdl.setTurbulenceModel('k-epsilon') 806 mdl.setGravity('off') 807 doc = '''<turbulence model="k-epsilon"> 808 <variable label="TurbEner" name="k"/> 809 <variable label="Dissip" name="epsilon"/> 810 <property label="TurbVisc" name="turbulent_viscosity"/> 811 <initialization choice="reference_velocity"> 812 <reference_velocity>1</reference_velocity> 813 </initialization> 814 <gravity_terms status="off"/> 815 </turbulence>''' 816 assert mdl.node_turb == self.xmlNodeFromString(doc),\ 817 'Could not set gravity status ' 818 assert mdl.getGravity() == "off",\ 819 'Could not get gravity status ' 820 821 822def suite(): 823 testSuite = unittest.makeSuite(TurbulenceModelTestCase, "check") 824 return testSuite 825 826def runTest(): 827 print("TurbulenceModelTestCase") 828 runner = unittest.TextTestRunner() 829 runner.run(suite()) 830 831#------------------------------------------------------------------------------- 832# End 833#------------------------------------------------------------------------------- 834