Commit 33b23f77 authored by Salko Jr, Robert's avatar Salko Jr, Robert
Browse files

Expose friction factor model in SubKit

Description:
Also exposes Dittus-Boelter model coefficients.
parent a0412b46
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -153,6 +153,10 @@ class InpBuilder(object):
            for key in vuq_param.keys():
                me.model.addVUQParam(key, vuq_param[key])

        friction = me.inp.getFrictionModel()
        if friction['model'] is not None:
            me.model.setFrictionModel(friction)

        me.model.setAveragePower(qprime=me.inp.getInitialQprime())
        me.model.generateModel(me.getOutputFilename())

+26 −0
Original line number Diff line number Diff line
@@ -820,3 +820,29 @@ class InpParse(object):
            raw = vuq.get('param')
            if raw:
                return me._processDict(raw)

    def getFrictionModel(me):
        """ Returns the name of the friction model to use

        Returns a dictionary:
           {model: name, options: {}}

        Options will be another dictionary that gives an option name and option value.

        Returns None if no model was specified by user.
        """
        frict = {'model': None, 'options': {}}
        models = me.inpDict.get('models')
        if models:
            modelDict = models.get('friction')
            if modelDict is not None:
                keys = modelDict.keys()
                assert len(keys) == 1
                frict['model'] = keys[0]
            else:
                frict['model'] = None
            if frict['model'] == 'custom':
                frict['options']['A'] = me.inpDict['models']['friction']['custom']['A']['value']
                frict['options']['B'] = me.inpDict['models']['friction']['custom']['B']['value']
                frict['options']['C'] = me.inpDict['models']['friction']['custom']['C']['value']
        return frict
+21 −0
Original line number Diff line number Diff line
@@ -151,6 +151,9 @@ class Model:
        # Takes a VUQ parameter name and returns its value
        me.vuq_param = {}

        # Dictionary stores the friction model to use
        me.frictionModel = {'model': 'modified', 'options': {}}

        # Single-phase turbulent mixing coefficient
        me.beta = 0.037

@@ -187,6 +190,24 @@ class Model:
        if beta is not None:
            me.beta = beta

    def setFrictionModel(me, model):
        """ Sets the friction model option

        Args:
           model (dict): Shall be of the form {'model': name, 'options': {}}.  Valid names are "original",
              "modified", "zigrang", "churchill", and "custom".  If "custom" is provided, then 'options' must
              be present in the dict to specify the A/B/C coefficients in the model.
        """
        validNames = ['original', 'modified', 'zigrang', 'churchill', 'custom']
        assert 'model' in model
        assert model['model'] in validNames
        if model['model'] == 'custom':
            assert 'options' in model
            assert 'A' in model['options']
            assert 'B' in model['options']
            assert 'C' in model['options']
        me.frictionModel = model

    def setFluidProperties(me, fluidprops):
        """Set the fluid property table to use.

+29 −12
Original line number Diff line number Diff line
@@ -106,8 +106,19 @@ def writeDeck(model, filename):
        hasmaps = 1
    else:
        hasmaps = 0
    group1Data.append("     1    2    0    3{:5d}{:15.5e}{:6d}    1{:5d}{:5d}{:5d}    0   7     0\n".format(
        model.solver, mdotInit, notrans, hasmaps, fluidprops, mflx))
    modelName = model.frictionModel['model']
    if modelName == 'original':
        irfc = 1
    elif modelName == 'modified':
        irfc = 2
    elif modelName == 'zigrang':
        irfc = 3
    elif modelName == 'churchill':
        irfc = 4
    else:
        irfc = 5
    group1Data.append("     1{:5d}    0    3{:5d}{:15.5e}{:6d}    1{:5d}{:5d}{:5d}    0   7     0\n".format(
        irfc, model.solver, mdotInit, notrans, hasmaps, fluidprops, mflx))
    group1Data.append("*Card 1.2\n")
    if mflx == 1:
        group1Data.append(
@@ -130,6 +141,11 @@ def writeDeck(model, filename):
    if model.editOptions['hdf5'] == True and model.is_nodal:
        group1Data.append("*Card 1.5\n")
        group1Data.append("     {nodal_model}     .true.\n")
    if irfc == 5:
        group1Data.append("*Card 1.5\n")
        group1Data.append("**         A           B           C\n")
        group1Data.append("{:12.4e}{:12.4e}{:12.4e}\n".format(
            model.frictionModel['options']['A'], model.frictionModel['options']['B'], model.frictionModel['options']['C']))

    # The Card Group 2 data to be written to the deck
    group2Data = []
@@ -481,7 +497,7 @@ def writeDeck(model, filename):
            group9Data.append("*Card 9.2\n")
            group9Data.append(
                "**  I FTYP       DROD       DFUL  NFUL IMTF IMTC IMOX DCRE        TCLD        FTDS IGPC IGFC IRDP  EPSO\n")
            group9Data.append("{0:5d}{1:>5s}{2:11.7f}{3:11.7f}{4:5d}    0    0    0    0{5:15.5e}{6:15.5e}    0    0    0   0.0\n".format(i, charID(
            group9Data.append("{0:5d}{1:>5s}{2:11.7f}{3:11.7f}{4:6d}    0    0    0    0{5:12.5e}{6:12.5e}    0    0    0   0.0\n".format(i, charID(
                typeobj), typeobj.d_outer, typeobj.d_pellet, typeobj.num_rings, 0.5 * (typeobj.d_outer - typeobj.d_inner), typeobj.percentTheoreticalDensity))
        else:
            group9Data.append(
@@ -923,12 +939,13 @@ def writeDeck(model, filename):

    if len(model.vuq_mult) > 0:
        with open('vuq_mult.txt', 'w') as vuq:
            for key in model.vuq_mult.keys():
            # Need to keep ordering consistent so we do not fail regression tests
            for key in sorted(model.vuq_mult.keys()):
                vuq.write('{:s} = {:e}\n'.format(key, model.vuq_mult[key]))

    if len(model.vuq_param) > 0:
        with open('vuq_param.txt', 'w') as vuq:
            for key in model.vuq_param.keys():
            for key in sorted(model.vuq_param.keys()):
                vuq.write('{:s} = {:e}\n'.format(key, model.vuq_param[key]))


+153 −2
Original line number Diff line number Diff line
@@ -244,6 +244,90 @@ solution{
   }
}

models{
   Description="Select models to use for simulation."
   MinOccurs=0
   MaxOccurs=1
   InputTmpl="flag"
   friction{
      Description="Selects the model to use for calculation of the friction factor."
      MinOccurs=0
      MaxOccurs=1
      InputTmpl="flag"
      ChildExactlyOne=[original, modified, zigrang, churchill, custom]
      original{
         Description="Selects the original friction factor model."
         ### Appearance=":math:`$\lambda = \max(1.691{Re}^{-0.43}, 0.117{Re}^{-0.14})$`"
         MinOccurs=0
         MaxOccurs=1
         InputTmpl="flag"
      }
      modified{
         Description="Selects the modified friction factor model."
         ### Appearance=":math:`$\lambda = 0.204 {Re}^{-0.2}$`"
         MinOccurs=0
         MaxOccurs=1
         InputTmpl="flag"
      }
      zigrang{
         Description="Selects the Zigrang-Sylvester friction factor model."
         ### Appearance=":math:`{$\lambda = \left(- 2.0 \log_{10}\right(\dfrac{\epsilon}{3.7D}+\dfrac{2.51}{Re}\left[1.14-2\log_{10}\left(\dfrac{\epsilon}{D}+\dfrac{21.25}{{Re}^{0.9}}\right)\right]\left)\right)^{-2}$`"
         MinOccurs=0
         MaxOccurs=1
         InputTmpl="flag"
      }
      churchill{
         Description="Selects the Churchill friction factor model."
         ### Appearance=":math:`$f_{f} = 2\left[\left(\dfrac{8}{Re}\right)^{12}+\dfrac{1}{(a+b)^{3/2}}\right]^{1/12};a = \left(2.475\ln\left[\dfrac{1}{\left(\dfrac{7}{Re}\right)^{0.9}+0.27\left(\dfrac{\epsilon}{D}\right)}\right]\right)^{16};b = \left(\dfrac{3.753x10^{4}}{Re}\right)^{16}$`"
         MinOccurs=0
         MaxOccurs=1
         InputTmpl="flag"
      }
      custom{
         Description="Select user-defined friction factor model.  Must enter model coefficients."
         ### Appearance=":math:`$\lambda = A {Re}^{B}+C$`"
         MinOccurs=0
         MaxOccurs=1
         InputTmpl="flag"
         A{
            Description="The A coefficient in custom friction model."
            MinOccurs=1
            MaxOccurs=1
            InputTmpl="value.flag"
            value{
               MinOccurs=1
               MaxOccurs=1
               ValType=Real
               MinValInc=0.0
            }
         }
         B{
            Description="The B coefficient in custom friction model."
            MinOccurs=1
            MaxOccurs=1
            InputTmpl="value.flag"
            value{
               MinOccurs=1
               MaxOccurs=1
               ValType=Real
            }
         }
         C{
            Description="The C coefficient in custom friction model."
            MinOccurs=1
            MaxOccurs=1
            InputTmpl="value.flag"
            value{
               MinOccurs=1
               MaxOccurs=1
               ValType=Real
            }
         }

      }
   }
}


initial{
   Description="Declares the initial condition block."
@@ -1281,6 +1365,28 @@ vuq{
            ValType=Real
         }
      }
      k_hspl{
         Description="Multiplier on the single-phase liquid heat transfer coefficient."
         MinOccurs=0
         MaxOccurs=1
         InputTmpl="value.flag"
         value{
            MinOccurs=1
            MaxOccurs=1
            ValType=Real
         }
      }
      ka_hspl{
         Description="Adder on the single-phase liquid heat transfer coefficient."
         MinOccurs=0
         MaxOccurs=1
         InputTmpl="value.flag"
         value{
            MinOccurs=1
            MaxOccurs=1
            ValType=Real
         }
      }
   }
   param{
      Description="Specify parameters in code models.  These are actual modeling coefficients."
@@ -1288,7 +1394,7 @@ vuq{
      MaxOccurs=1
      InputTmpl="flag"
      k_xkwlxA{
         Description="A coefficient in CTF two-phase multiplier model Phi**2=A*alpha_liq**B."
         Description="A coefficient in CTF two-phase multiplier model: :math:`\Phi^2=A*\alpha_l^B`."
         MinOccurs=0
         MaxOccurs=1
         InputTmpl="value.flag"
@@ -1299,7 +1405,18 @@ vuq{
         }
      }
      k_xkwlxB{
         Description="B coefficient in CTF two-phase multiplier model Phi**2=A*alpha_liq**B."
         Description="B coefficient in CTF two-phase multiplier model: :math:`\Phi^2=A*\alpha_l^B`."
         MinOccurs=0
         MaxOccurs=1
         InputTmpl="value.flag"
         value{
            MinOccurs=1
            MaxOccurs=1
            ValType=Real
         }
      }
      k_db_1{
         Description="Coefficient in Dittus-Boelter equation: :math:`k\_db\_1*{Re}^{k\_db\_2}*{Pr}^{k\_db\_3}`."
         MinOccurs=0
         MaxOccurs=1
         InputTmpl="value.flag"
@@ -1309,5 +1426,39 @@ vuq{
            ValType=Real
         }
      }
      k_db_2{
         Description="Coefficient in Dittus-Boelter equation: :math:`k\_db\_1*{Re}^{k\_db\_2}*{Pr}^{k\_db\_3}`."
         MinOccurs=0
         MaxOccurs=1
         InputTmpl="value.flag"
         value{
            MinOccurs=1
            MaxOccurs=1
            ValType=Real
         }
      }
      k_db_3{
         Description="Coefficient in Dittus-Boelter equation: :math:`k\_db\_1*{Re}^{k\_db\_2}*{Pr}^{k\_db\_3}`."
         MinOccurs=0
         MaxOccurs=1
         InputTmpl="value.flag"
         value{
            MinOccurs=1
            MaxOccurs=1
            ValType=Real
         }
      }
      k_db_4{
         Description="Minimum value of the Nusselt number (represents laminar flow heat transfer).  Nusselt will be the maximum of this or the turbulent single-phase heat transfer model."
         MinOccurs=0
         MaxOccurs=1
         InputTmpl="value.flag"
         value{
            MinOccurs=1
            MaxOccurs=1
            ValType=Real
         }
      }

   }
}
Loading