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