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

Expose dtmin and dmax for steady state solutions

Description:
parent 33b23f77
Loading
Loading
Loading
Loading
+15 −7
Original line number Diff line number Diff line
@@ -112,3 +112,11 @@ class Mass(BoundaryCondition):
        BoundaryCondition.__init__(me)
        me.mdot = mdot
        me.mdotRamp = mdotRamp


def isMassFlowBC(bc):
    """ Returns True if the passed boundary condition object contains mdot"""
    if isinstance(bc, Mass) or isinstance(bc, MassTemperature) or isinstance(bc, MassEnthalpy):
        return True
    else:
        return False
+3 −1
Original line number Diff line number Diff line
@@ -106,7 +106,9 @@ class InpBuilder(object):
                'vv_linf_norm'],
                vd_l2=me.inp.getSteadyStoppingCriteria()[
                'vd_l2_norm'],
                vd_linf=me.inp.getSteadyStoppingCriteria()['vd_linf_norm'])
                vd_linf=me.inp.getSteadyStoppingCriteria()['vd_linf_norm'],
                dtmin=me.inp.getSteadyState_dtmin(),
                dtmax=me.inp.getSteadyState_dtmax())

        # Axial power tables
        if me.inp.getAxialPowerIDs():
+20 −0
Original line number Diff line number Diff line
@@ -742,6 +742,26 @@ class InpParse(object):
                'Tsolid_l2_norm': Tsolid_l2_norm,
                'Tsolid_linf_norm': Tsolid_linf_norm}

    def getSteadyState_dtmin(me):
        """ Returns minimum timestep size if modeling steady-state"""
        result = None
        if 'solution' in me.inpDict:
            if 'steady' in me.inpDict['solution']:
                if 'dtmin' in me.inpDict['solution']['steady']:
                    result = me.inpDict['solution']['steady'].get('dtmin')[
                        'value']
        return result

    def getSteadyState_dtmax(me):
        """ Returns maximum timestep size if modeling steady-state"""
        result = None
        if 'solution' in me.inpDict:
            if 'steady' in me.inpDict['solution']:
                if 'dtmax' in me.inpDict['solution']['steady']:
                    result = me.inpDict['solution']['steady'].get('dtmax')[
                        'value']
        return result

    def getNumFormLosses(me):
        """ Returns number of form losses in the model"""
        return me.numLossGroups
+38 −3
Original line number Diff line number Diff line
@@ -86,7 +86,12 @@ class Model:

        # Time group information
        me.dtMin = []
        me.dtMin_DEFAULT = 1.0e-6
        me.dtMin_steady = me.dtMin_DEFAULT
        me.dtMax = []
        me.dtMax_DEFAULT = 1.0e-1
        me.dtMax_steady = me.dtMax_DEFAULT

        me.editInterval = []
        me.tEnd = []

@@ -801,9 +806,9 @@ class Model:
        else:
            me.editInterval.append(editInterval)
        if not dtMin:
            dtMin = 1.0e-6
            dtMin = me.dtMin_DEFAULT
        if not dtMax:
            dtMax = 1.0e-1
            dtMax = me.dtMax_DEFAULT
        me.dtMin.append(dtMin)
        me.dtMax.append(dtMax)
        me.rtwfp = 1.0
@@ -811,7 +816,7 @@ class Model:
    def setSteadyState(me, energyBalance=None, massBalance=None, maxIterations=None, rtwfp=None,
                       p_l2=None, p_linf=None, Tcool_l2=None, Tcool_linf=None,
                       Tsolid_l2=None, Tsolid_linf=None, vl_l2=None, vl_linf=None, vv_l2=None, vv_linf=None,
                       vd_l2=None, vd_linf=None):
                       vd_l2=None, vd_linf=None, dtmin=None, dtmax=None):
        """ Call to specify the model as steady state.

        Throws exception if transient groups specified already.
@@ -839,6 +844,8 @@ class Model:
           vv_linf (float): l-infinity-norm criteria on vapor velocity
           vd_l2 (float): l2-norm criteria on droplet velocity
           vd_linf (float): l-infinity-norm criteria on droplet velocity
           dtmin (float): Minimum allowable timestep size (steady-state is modeled as a pseudo-transient)
           dtmax (float): Maximum allowable timestep size (steady-state is modeled as a pseudo-transient)

        """
        if not me.runSteadyState:
@@ -882,6 +889,10 @@ class Model:
            me.steadyConvergenceCriteria['vd_l2'] = vd_l2
        if vd_linf:
            me.steadyConvergenceCriteria['vd_linf'] = vd_linf
        if dtmin:
            me.dtMin_steady = dtmin
        if dtmax:
            me.dtMax_steady = dtmax

    def setConductorModelOptions(me, nc=None, chfModel=None, postChfCheck=None):
        """ Set global modeling options for solid conductors in the model.
@@ -1333,6 +1344,13 @@ class Model:
                raise RuntimeError(
                    "setInitialConditions was not called and the channels do not all have inlet mass/temp and outlet pressure BCs with uniform values, so cannot infer the correct initial conditions")

        # If the inlet mass flow rate distribution was non-uniform, the initial absolute mass flow rate
        # must be defined in CTF, mass flux set to zero, and inlet mass flow rate set to zero
        if me._uniformInletMassFlux():
            me.nonuniformInletMdot = False
        else:
            me.nonuniformInletMdot = True

        # Determine the start/end axial locations of the sections
        z = 0.0
        for secID in sorted(me.sections.keys()):
@@ -1410,6 +1428,23 @@ class Model:

        me._gapChecks()

    def _uniformInletMassFlux(me):
        """ Returns True if the inlet mass flux in all Section 1 channels are the same and False otherwise.
        If no inlet mdot values are applied, this returns False.  If only some of the channels have inlet mass
        flow rate type BCs, this returns False, even if they all match."""
        mflux = []
        for chID in me.sections[1].channels.keys():
            ch = me.sections[1].channels[chID]
            for idx, j in enumerate(ch.bcLevels):
                if j == 1 and BoundaryCondition.isMassFlowBC(ch.bcs[idx]):
                    mflux.append(ch.bcs[idx].mdot / ch.area)
                else:
                    return False
        if np.all(np.isclose(mflux[0], np.array(mflux))):
            return True
        else:
            return False

    def _rodsInValidSections(me):
        """ Ensure rods are in continuous sections"""

+4 −4
Original line number Diff line number Diff line
@@ -741,17 +741,17 @@ def writeDeck(model, filename):
    group15Data.append("**NGR\n")
    group15Data.append("   15\n")
    group15Data.append("*Card 15.1\n")
    if notrans == 0 or notrans == 2:
    group15Data.append(
        "**        DTMIN          DTMAX           TEND          EDINT         DMPINT          RTWFP     MAXITS\n")
    if notrans == 0 or notrans == 2:
        for group, tEnd in enumerate(model.tEnd):
            group15Data.append("{:15.5e}{:15.5e}{:15.5e}{:15.5e}{:15.5e}{:15.5e}\n".format(model.dtMin[group],
                                                                                           model.dtMax[group], model.tEnd[group], model.editInterval[group], 0.0, model.rtwfp))
        group15Data.append(
            "    -1.0000E-06     1.0000E-01     1.0000E-01     0.0000E+00     0.0000E+00  {:15.6e}\n".format(model.rtwfp))
    elif notrans == 1:
        group15Data.append("  1.0000E-06  1.0000E-01  1.0000E-01  0.0000E+00  0.0000E+00  {:15.6e}{:11d}\n".format(
            model.rtwfp, model.steadyConvergenceCriteria['maxIterations']))
        group15Data.append("{:15.5e}{:15.5e}     1.0000E-01  0.0000E+00  0.0000E+00  {:15.6e}{:11d}\n".format(
            model.dtMin_steady, model.dtMax_steady, model.rtwfp, model.steadyConvergenceCriteria['maxIterations']))
    else:
        raise RuntimeError

Loading