Пример #1
0
class TestRankineBasic(unittest.TestCase):
    wf = mc.FlowState("R123")
    pEvap = 10.e5
    superheat = 30.
    TCond = 300.
    subcool = 0
    comp = mc.CompBasic(nan, 0.7, sizeAttr="pRatio")
    sourceIn = mc.FlowState("Air", 0.09, mc.PT_INPUTS, 1.116e5, 1170.)
    evap = mc.library.alfaLaval_AC30EQ()
    evap.update({'sizeAttr': "NPlate", 'plate.T': 573.15})
    exp = mc.ExpBasic(nan, 0.7, sizeAttr="pRatio")
    sinkIn = mc.FlowState("Air", 0.20, mc.PT_INPUTS, 0.88260e5, 281.65)
    sinkAmbient = sinkIn.copy()
    sourceAmbient = sinkIn.copy()
    cond = mc.ClrBasic(mc.CONSTANT_P, nan, 1, sizeAttr="QCool")
    config = mc.Config()
    config.update({
        'dpEvap': False,
        'dpCond': False,
        'dpAcc': False,
        'dpPort': False,
        'dpHead': False
    })
    config.set_method("savostinTikhonov_sp", "GeomHxPlateChevron",
                      mc.TRANSFER_ALL, mc.UNITPHASE_ALL, mc.SECONDARY_FLUID)
    cycle = mc.RankineBasic(wf, evap, exp, cond, comp, pEvap, superheat, nan,
                            subcool, config)
    cycle.setAll_config(config)
    cycle.update({
        'TCond': TCond,
        'sourceIn': sourceIn,
        #'sinkIn': sinkIn,
        'sourceAmbient': sourceAmbient,
        #'sinkAmbient': sinkAmbient
    })
    cycle.pptdEvap = 10.

    def test_0_setup_cycle(self):
        self.assertAlmostEqual(self.cycle.pCond, 97797.60828695059, 5)
        self.assertIs(self.cycle.exp.config, self.config)
        self.assertAlmostEqual(self.cycle.mWf, 0.34307814292524513, 10)

    def test_1_size(self):
        self.cycle.update({"config.dpEvap": False, "evap.L": 0.269})
        self.cycle.size()
        self.assertEqual(self.cycle.evap.NPlate, 23)
        self.assertAlmostEqual(
            abs(self.cycle.evap.L - 0.268278920236407), 0, 2)
        self.assertAlmostEqual(self.cycle.comp.pRatio, 10.22519893, 4)
        self.assertAlmostEqual(self.cycle.exp.pRatio, 10.22519893, 4)
        self.assertAlmostEqual(self.cycle.evap.Q(), 83891.17350428084, 4)

    def test_1_size_dpEvap_True(self):
        self.cycle.update({"config.dpEvap": True, "evap.L": 0.269})
        self.cycle.size()
        self.assertAlmostEqual(
            abs(self.cycle.evap.L - 0.268278920236407), 0, 2)
        self.assertAlmostEqual(
            (self.cycle.comp.pRatio - 10.22519893) / 10.22519893, 0, 4)
        self.assertAlmostEqual(
            self.cycle.exp.pRatio,
            (self.cycle.pEvap - 39607.4552153897) / self.cycle.pCond, 4)
        self.assertAlmostEqual(self.cycle.evap.Q(), 83891.17350428084, 4)

    def test_1_run_from_comp(self):
        self.cycle.update({
            "config.dpEvap": False,
            "evap.NPlate": 23,
            "evap.L": 0.269,
            "pRatioExp": 10.22519893,
            "pRatioComp": 10.22519893,
            "cond.QCool": 73582.4417680011
        })
        self.cycle.clearWf_flows()
        rb0 = self.wf.copyUpdateState(mc.PT_INPUTS, self.pEvap,
                                      self.cycle.TEvap + 20.).h()
        rb1 = self.wf.copyUpdateState(mc.PT_INPUTS, self.pEvap,
                                      self.cycle.TEvap + 32.).h()
        self.evap.update({"runBounds": [rb0, rb1]})
        self.cycle.set_state6(
            self.wf.copyUpdateState(mc.QT_INPUTS, 0, self.TCond))
        self.cycle.run()
        self.assertAlmostEqual(
            abs(self.cycle.state4.T() / 3.6047e+02) - 1, 0, 3)
        self.assertAlmostEqual(
            abs(self.cycle.state4.p() / self.cycle.pCond) - 1, 0, 5)
        self.assertAlmostEqual(
            abs(self.cycle.state3.T() / (self.cycle.TEvap + 30)) - 1, 0, 3)

    '''
    def test_1_run_from_comp_dpEvap_True(self):
        self.cycle.update({
            "config.dpEvap": True,
            "evap.NPlate": 23,
            "evap.L": 0.269,
            "exp.pRatio": 9.820204742676,
            "comp.pRatio": 10.22519893,
            "cond.QCool": 73582.4417680011
        })
        self.cycle.clearWf_flows()
        rb0 = self.wf.copyUpdateState(mc.PT_INPUTS, self.pEvap,
                                self.cycle.TEvap + 20.).h()
        rb1 = self.wf.copyUpdateState(mc.PT_INPUTS, self.pEvap,
                                self.cycle.TEvap + 32.).h()
        self.evap.update({"runBounds": [rb0, rb1]})
        self.cycle.set_state6(self.wf.copyUpdateState(mc.QT_INPUTS, 0, self.TCond))
        self.cycle.run()
        self.assertAlmostEqual(
            abs(self.cycle.state4.T() / 3.6047e+02) - 1, 0, 3)
        self.assertAlmostEqual(
            abs(self.cycle.state4.p() / self.cycle.pCond) - 1, 0, 5)
        self.assertAlmostEqual(abs(self.cycle.state3.T() / (413.67)) - 1, 0, 2)
        self.assertAlmostEqual(
            abs(self.cycle.state3.p() / (9.6039e5)) - 1, 0, 1)
    '''

    def test_1_run_from_exp(self):
        self.cycle.update({
            "config.dpEvap": False,
            "evap.NPlate": 23,
            "evap.L": 0.269,
            "pRatioExp": 10.22519893,
            "pRatioComp": 10.22519893,
            "cond.QCool": 73582.4417680011
        })
        self.cycle.clearWf_flows()
        rb0 = self.wf.copyUpdateState(mc.PT_INPUTS, self.pEvap,
                                      self.cycle.TEvap + 20.).h()
        rb1 = self.wf.copyUpdateState(mc.PT_INPUTS, self.pEvap,
                                      self.cycle.TEvap + 32.).h()
        self.evap.update({"runBounds": [rb0, rb1]})
        self.cycle.set_state3(
            self.wf.copyUpdateState(mc.PT_INPUTS, self.cycle.pEvap,
                                    self.cycle.TEvap + 30))
        self.cycle.run()
        self.assertAlmostEqual(
            abs(self.cycle.state4.T() / 3.6047e+02) - 1, 0, 3)
        self.assertAlmostEqual(
            abs(self.cycle.state4.p() / self.cycle.pCond) - 1, 0, 5)
        self.assertAlmostEqual(
            abs(self.cycle.state3.T() / (self.cycle.TEvap + 30)) - 1, 0, 3)

    def test_cycle_plot(self):
        import os
        self.cycle.sizeSetup(True, True)
        self.cycle.plot(
            title="test_cycle_plot",
            show=False,
            savefig=True,
            savefig_name="test_cycle_plot",
            savefig_format="png",
            savefig_folder=".")
        cwd = os.getcwd()
        os.remove("./test_cycle_plot.png")
Пример #2
0
def run_example():
    """run example: zarati2017.py"""
    # ************************************************
    # Set up formatting
    # ************************************************
    # cycle.plot parameters
    plots_folder = "plots"
    plots_format = "png"  # change to "jpg" if preferred
    plots_dpi = 600
    if not os.path.exists(plots_folder):
        os.makedirs(plots_folder)
    # custom format for matplotlib
    mpl.rc("lines", lw=2.0)
    mpl.rc("lines", markersize=2)
    colours = ["blue", "red", "green", "black"]
    linestyles = ["-", "--", "-.", ":"]
    markerstyles = ["o", "v", "s", "^"]

    # ************************************************
    # Set up default cycle parameters
    # ************************************************
    #
    comp = mc.CompBasic(None, 0.9, sizeAttr="pRatio")
    #
    exp = mc.ExpBasic(None, 0.85, sizeAttr="pRatio")
    #
    sourceFluid = "Air"
    sourceIn_m = 5.5
    sourceIn_T = 744.  # from Table 9
    sourceIn_p = 0.37e5  # from cp=1085.4
    sourceIn = mc.FlowState(sourceFluid, "HEOS", None, sourceIn_m,
                            CP.PT_INPUTS, sourceIn_p, sourceIn_T)
    evapGeomPlateWf = mc.GeomHxPlateSmooth(b=0.024375)
    evapGeomPlateSf = mc.GeomHxPlateFinOffset(s=0.008,
                                              h=0.03,
                                              t=0.0002,
                                              l=0.02)
    stainlessSteel = mc.SolidMaterial(rho=8010., k=17.)
    evap = mc.HxPlate(flowSense="counterflow",
                      NPlate=17,
                      RfWf=0,
                      RfSf=0,
                      plate=stainlessSteel,
                      tPlate=0.2e-3,
                      geomPlateWf=evapGeomPlateWf,
                      geomPlateSf=evapGeomPlateSf,
                      L=0.2,
                      W=0.44,
                      effThermal=1.0)
    #
    ambient = mc.isa(mc.ft2m(20000))
    sinkFluid = "Air"
    sinkIn_m = None
    sinkIn_T = ambient.T / mc.TTotalRatio(gamma=1.4,
                                          M=0.49)  # from alt=20000ft
    sinkIn_p = ambient.p / mc.pTotalRatio(gamma=1.4,
                                          M=0.49)  # TODO from alt=20000ft
    sinkIn = mc.FlowState(sinkFluid, "HEOS", None, sinkIn_m, CP.PT_INPUTS,
                          sinkIn_p, sinkIn_T)
    sinkDead = sinkIn.copy()
    sourceDead = mc.FlowState(sourceFluid, "HEOS", None, None, CP.PT_INPUTS,
                              sinkIn_p, sinkIn_T)
    cond = mc.ClrBasicConstP(None, 1, sizeAttr="Q")
    #
    config = mc.Config(dpEvap=False,
                       dpCond=False,
                       dpF=True,
                       dpAcc=False,
                       dpPort=False,
                       dpHead=False)
    config.methods.set("shah_1phase_h", ["GeomHxPlateSmooth"], ["heat"],
                       ["wf"], "all-sp")
    cycle = mc.RankineBasic(wf=mc.FlowState("R245fa", "HEOS", None),
                            evap=evap,
                            exp=exp,
                            cond=cond,
                            comp=comp,
                            TEvap=416.18,
                            superheat=1.,
                            pCond=180.e3,
                            subcool=3.,
                            config=config,
                            sourceIn=sourceIn,
                            sinkIn=sinkIn,
                            sourceDead=sourceDead,
                            sinkDead=sinkDead)

    # ************************************************
    # Computations
    # ************************************************
    mWf_vals = np.linspace(1.0, 10.0, 20)
    plot_x = []
    plot_y0 = []
    plot_y1 = []
    plot_y2 = []
    for m in mWf_vals:
        cycle.update(mWf=m)
        cycle.sizeSetup(True, False)
        try:
            cycle.evap.run()
            print("---------")
            print(cycle.evap.L)
            plot_x.append(m)
            plot_y0.append(cycle.evap.flowOutSf.cp)
            plot_y1.append(cycle.evap.flowOutWf.T)
            plot_y2.append(cycle.evap.dpSf / cycle.evap.flowInSf.p)
        except:
            print("No convergence for m={}".format(m))

    plt.figure()
    plt.plot(plot_x, plot_y0)
    plt.savefig("{}/cp_vs_mWf.{}".format(plots_folder, plots_format))
    plt.figure()
    plt.plot(plot_x, plot_y1)
    plt.savefig("{}/T3Wf_vs_mWf.{}".format(plots_folder, plots_format))
    plt.figure()
    plt.plot(plot_x, plot_y2)
    plt.savefig("{}/dpSf/pSf_vs_mWf.{}".format(plots_folder, plots_format))
    """
Пример #3
0
wf = mc.FlowState(
    fluid="R245fa",
    m=1.0,
    inputPair=mc.PT_INPUTS,
    input1=mc.atm2Pa(1),
    input2=298)
print("  - created working fluid")
exp = mc.ExpBasic(pRatio=1, efficiencyIsentropic=0.9, sizeAttr="pRatio")
print("  - created expander")
cond = mc.ClrBasic(constraint=mc.CONSTANT_P, QCool=1, efficiencyThermal=1.0, sizeAttr="Q")
print("  - created condenser")
comp = mc.CompBasic(pRatio=1, efficiencyIsentropic=0.85, sizeAttr="pRatio")
print("  - created compressor")
evap = mc.HtrBasic(constraint=mc.CONSTANT_P, QHeat=1, efficiencyThermal=1.0, sizeAttr="Q")
print("  - created evaporator")
config = mc.Config()
print("  - created configuration object")
cycle = mc.RankineBasic(
    wf=wf, evap=evap, exp=exp, cond=cond, comp=comp, config=config)
cycle.update({
    "pEvap": mc.bar2Pa(10),
    "superheat": 10.,
    "TCond": mc.degC2K(25),
    "subcool": 5.
})
print("  - created cycle")
print("setup done.")


@mc.timer
def plot_cycle():
Пример #4
0
class TestHxUnitPlateCorrChevron(unittest.TestCase):
    hxUnit = mc.HxUnitPlate(
        flowConfig=mc.HxFlowConfig(mc.COUNTERFLOW, 1, '', True, True),
        NPlate=23,
        RfWf=0,
        RfSf=0,
        plate=mc.library.materials.stainlessSteel_316(573.15),
        tPlate=0.424e-3,
        geomWf=mc.GeomHxPlateChevron(1.096e-3, 60, 10e-3, 1.117),
        geomSf=mc.GeomHxPlateChevron(1.096e-3, 60, 10e-3, 1.117),
        L=269e-3,
        W=95e-3,
        efficiencyThermal=1.0,
        config=mc.Config())
    hxUnit.config.set_method("savostinTikhonov_sp", "GeomHxPlateChevron",
                             mc.TRANSFER_ALL, mc.UNITPHASE_ALL,
                             mc.SECONDARY_FLUID)
    hxUnit.config.set_method("chisholmWannairachchi_sp", "GeomHxPlateChevron",
                             mc.TRANSFER_ALL, mc.UNITPHASE_ALL,
                             mc.WORKING_FLUID)
    hxUnit._methodHeatWf = "chisholmWannairachchi_sp"
    hxUnit._methodFrictionWf = "chisholmWannairachchi_sp"
    hxUnit._methodHeatSf = "savostinTikhonov_sp"
    hxUnit._methodFrictionSf = "savostinTikhonov_sp"

    def test_size_liq(self):
        flowInWf = mc.FlowState("R123", 0.34307814292524513, mc.PT_INPUTS,
                                1000000., 300.57890653991495)
        flowOutWf = mc.FlowState("R123", 0.34307814292524513, mc.PT_INPUTS,
                                 1000000., 305.79345550292123)
        flowInSf = mc.FlowState("Air", 0.09, mc.PT_INPUTS, 111600.,
                                330.77794902610714)
        flowOutSf = mc.FlowState("Air", 0.09, mc.PT_INPUTS, 111600.,
                                 310.57890653991586)
        self.hxUnit.update({
            'flowInWf': flowInWf,
            'flowInSf': flowInSf,
            'flowOutWf': flowOutWf,
            'flowOutSf': flowOutSf
        })
        self.hxUnit._methodHeatWf = "chisholmWannairachchi_sp"
        self.hxUnit._methodFrictionWf = "chisholmWannairachchi_sp"

        self.hxUnit.update({'sizeAttr': 'L', 'sizeBounds': [0.005, 0.5]})
        self.hxUnit.sizeUnits()
        self.assertAlmostEqual(
            abs(self.hxUnit.L - 0.0636564105282744) / 0.0636564105282744, 0, 4)
        self.hxUnit.update({'sizeAttr': 'W', 'sizeBounds': [50e-3, 500e-3]})
        self.hxUnit.sizeUnits()
        self.assertAlmostEqual(self.hxUnit.W, 95e-3, 7)
        self.hxUnit.update({
            'sizeAttr': 'geomWf.b',
            'sizeBounds': [0.1e-3, 10e-3]
        })
        self.hxUnit.sizeUnits()
        self.assertAlmostEqual(
            abs(self.hxUnit.geomWf.b - 1.096e-3) / 1.096e-3, 0, 2)
        #
        self.assertAlmostEqual(
            abs(self.hxUnit._dpFWf() - 7200.2135758720115) /
            7200.2135758720115, 0, 2)

    def test_size_tp(self):
        flowInWf = mc.FlowState("R123", 0.34307814292524513, mc.PQ_INPUTS,
                                1000000., 0.4)
        flowOutWf = mc.FlowState("R123", 0.34307814292524513, mc.PQ_INPUTS,
                                 1000000., 0.5)
        flowInSf = mc.FlowState("Air", 0.09, mc.PT_INPUTS, 111600.,
                                868.7758979999346)
        flowOutSf = mc.FlowState("Air", 0.09, mc.PT_INPUTS, 111600.,
                                 825.2114243937383)
        self.hxUnit.update({
            'flowInWf': flowInWf,
            'flowInSf': flowInSf,
            'flowOutWf': flowOutWf,
            'flowOutSf': flowOutSf
        })
        self.hxUnit._methodHeatWf = "yanLin_tpEvap"
        self.hxUnit._methodFrictionWf = "yanLin_tpEvap"
        #
        self.hxUnit.update({'sizeAttr': 'L', 'sizeBounds': [0.001, 0.5]})
        self.hxUnit.sizeUnits()
        self.assertAlmostEqual(
            abs(self.hxUnit.L - 0.003778819723856917) / 0.003778819723856917,
            0, 4)
        #
        self.assertAlmostEqual(
            abs(self.hxUnit._dpFWf() - 722.9638885277705) / 722.9638885277705,
            0, 2)

    def test_size_vap(self):
        flowInWf = mc.FlowState("R123", 0.34307814292524513, mc.PT_INPUTS,
                                1000000., 409.2350351214396)
        flowOutWf = mc.FlowState("R123", 0.34307814292524513, mc.PT_INPUTS,
                                 1000000., 414.3019814953263)
        flowInSf = mc.FlowState("Air", 0.09, mc.PT_INPUTS, 111600., 1170.)
        flowOutSf = mc.FlowState("Air", 0.09, mc.PT_INPUTS, 111600.,
                                 1155.3292007981324)
        self.hxUnit.update({
            'flowInWf': flowInWf,
            'flowInSf': flowInSf,
            'flowOutWf': flowOutWf,
            'flowOutSf': flowOutSf
        })
        self.hxUnit._methodHeatWf = "chisholmWannairachchi_sp"
        self.hxUnit._methodFrictionWf = "chisholmWannairachchi_sp"
        #
        self.hxUnit.update({'sizeAttr': 'L', 'sizeBounds': [0.0001, 0.5]})
        self.hxUnit.sizeUnits()
        self.assertAlmostEqual(
            abs(self.hxUnit.L - 0.0009979724829425561) / 0.0009979724829425561,
            0, 4)
        #
        self.assertAlmostEqual(
            abs(self.hxUnit._dpFWf() - 1363.6424738901792) /
            1363.6424738901792, 0, 2)
Пример #5
0
class TestHxPlateCorrChevron(unittest.TestCase):
    hx = mc.HxPlate(
        flowSense="counterflow",
        RfWf=0,
        RfSf=0,
        plate=mc.library.stainlessSteel_316,
        tPlate=0.424e-3,
        geomPlateWf=mc.GeomHxPlateCorrChevron(1.096e-3, 60, 10e-3, 1.117),
        geomPlateSf=mc.GeomHxPlateCorrChevron(1.096e-3, 60, 10e-3, 1.117),
        L=269e-3,
        W=95e-3,
        DPortWf=0.0125,
        DPortSf=0.0125,
        ARatioWf=1,
        ARatioSf=1,
        ARatioPlate=1,
        NPlate=23,
        coeffs_LPlate=[0.056, 1],
        coeffs_WPlate=[0, 1],
        effThermal=1.0,
        config=mc.Config(dpAcc=False, dpPort=False, dpHead=False))
    flowInWf = mc.FlowState("R123", "HEOS", None, 0.34307814292524513,
                            CP.PT_INPUTS, 1000000., 300.57890653991603)
    flowOutWf = mc.FlowState("R123", "HEOS", None, 0.34307814292524513,
                             CP.PT_INPUTS, 1000000., 414.30198149532583)
    flowInSf = mc.FlowState("Air", "HEOS", None, 0.09, CP.PT_INPUTS, 111600.,
                            1170.)
    flowOutSf = mc.FlowState("Air", "HEOS", None, 0.09, CP.PT_INPUTS, 111600.,
                             310.57890653991603)

    def test_0_unitise(self):
        self.hx.update(flowInWf=self.flowInWf,
                       flowInSf=self.flowInSf,
                       flowOutWf=self.flowOutWf,
                       flowOutSf=self.flowOutSf)

        self.hx.unitise()

    def test_1_size_L(self):
        self.hx.update(L=269e-3, NPlate=23, geomPlateWf__b=1.096e-3, W=95e-3)
        self.hx.size("L", [0.005, 0.5])
        self.assertAlmostEqual(abs(self.hx.L - 269e-3) / 269e-3, 0, 2)
        #
        self.assertAlmostEqual(
            abs(self.hx.dpWf - 39607.4552153897) / 39607.4552153897, 0, 2)

    def test_1_size_W(self):
        self.hx.update(L=0.268278920236407,
                       NPlate=23,
                       geomPlateWf__b=1.096e-3,
                       W=95e-3)
        self.hx.size("W", [50e-3, 500e-3])
        self.assertAlmostEqual(abs(self.hx.W - 95e-3) / 95e-3, 0, 4)

    def test_1_size_geomPlateWf_b(self):
        self.hx.update(L=0.268278920236407,
                       NPlate=23,
                       geomPlateWf__b=1.096e-3,
                       W=95e-3)
        self.hx.size("geomPlateWf__b", [0.1e-3, 10e-3])
        self.assertAlmostEqual(abs(self.hx.geomPlateWf.b - 1.096e-3), 0, 4)

    def test_1_size_NPlate(self):
        self.hx.update(L=0.268278920236407,
                       NPlate=23,
                       geomPlateWf__b=1.096e-3,
                       W=95e-3)
        self.hx.size("NPlate", [10, 50])
        self.assertEqual(self.hx.NPlate, 23)

    def test_1_size_L_solution_not_in_bracket_Exception(self):
        self.hx.size("L", [0.5, 5.])
        self.assertRaises(Exception)
Пример #6
0
def benchmark_HxPlate():
    config = mc.Config()
    config.update({'dpAcc': False, 'dpPort': False, 'dpHead': False})
    config.set_method("savostinTikhonov_sp", "GeomHxPlateCorrugatedChevron",
                      mc.TRANSFER_ALL, mc.UNITPHASE_ALL, mc.SECONDARY_FLUID)
    hx = mc.HxPlateCorrugated(
        flowConfig=mc.HxFlowConfig(mc.COUNTERFLOW, 1, '', True, True),
        RfWf=0,
        RfSf=0,
        plate=mc.library.stainlessSteel_316(573.15),
        tPlate=0.424e-3,
        geomWf=mc.GeomHxPlateCorrugatedChevron(1.096e-3, 60, 10e-3, 1.117),
        geomSf=mc.GeomHxPlateCorrugatedChevron(1.096e-3, 60, 10e-3, 1.117),
        L=269e-3,
        W=95e-3,
        DPortWf=0.0125,
        DPortSf=0.0125,
        ARatioWf=1,
        ARatioSf=1,
        ARatioPlate=1,
        NPlate=23,
        coeffs_LPlate=[0.056, 1],
        coeffs_WPlate=[0, 1],
        efficiencyThermal=1.0,
        config=config)
    flowInWf = mc.FlowState("R123", 0.34307814292524513,
                            mc.constants.PT_INPUTS, 1000000.,
                            300.57890653991603)
    flowOutWf = mc.FlowState("R123", 0.34307814292524513, mc.PT_INPUTS,
                             1000000., 414.30198149532583)
    flowInSf = mc.FlowState("Air", 0.09, mc.PT_INPUTS, 111600., 1170.)
    flowOutSf = mc.FlowState("Air", 0.09, mc.PT_INPUTS, 111600.,
                             310.57890653991603)
    #
    hx.update({
        'flowInWf': flowInWf,
        'flowInSf': flowInSf,
        'flowOutWf': flowOutWf,
        'flowOutSf': flowOutSf
    })
    hx.unitise()
    hx.update({
        'L': 269e-3,
        'NPlate': 23,
        'geomWf.b': 1.096e-3,
        'W': 95e-3,
        'sizeAttr': 'L',
        'sizeBounds': [0.005, 0.5]
    })
    hx.size()
    assert (abs(hx.L - 269e-3) / 269e-3 < 0.01)
    #
    assert (abs(hx.dpWf() - 39607.4552153897) / 39607.4552153897 < 0.01)

    hx.update({
        'L': 0.268278920236407,
        'NPlate': 23,
        'geomWf.b': 1.096e-3,
        'W': 95e-3,
        'sizeAttr': 'W',
        'sizeBounds': [50e-3, 500e-3]
    })
    hx.size()
    assert (abs(hx.W - 95e-3) / 95e-3 < 0.0001)

    hx.update({
        'L': 0.268278920236407,
        'NPlate': 23,
        'geomWf.b': 0,
        'W': 95e-3,
        'sizeAttr': 'geomWf.b',
        'sizeBounds': [0.1e-3, 10e-3]
    })
    hx.size()
    assert (abs(hx.geomWf.b - 1.096e-3) < 0.0001)

    hx.update({
        'L': 0.268278920236407,
        'NPlate': 23,
        'geomWf.b': 1.096e-3,
        'W': 95e-3,
        'sizeAttr': 'NPlate',
        'sizeBounds': [10, 50]
    })
    hx.size()

    flowInWf = mc.FlowState("R245fa", 2, mc.PT_INPUTS, 2e5, 300.)
    flowInSf = mc.FlowState("water", 5., mc.PT_INPUTS, 1e5, 600.)

    hLowerBound = flowInWf.h() * 1.01
    hUpperBound = flowInWf.copyUpdateState(mc.PT_INPUTS, 2e5, 350.).h()

    hx.update({
        'L': 0.269,
        'NPlate': 5,
        'geomWf.b': 1.096e-3,
        'W': 95e-3,
        'flowInWf': flowInWf,
        'flowInSf': flowInSf,
        'sizeUnitsBounds': [1e-5, 1.],
        'runBounds': [hLowerBound, hUpperBound]
    })
    hx.run()
    assert (abs(hx.flowOutWf.T() - 318.22) < 0.01)

    flowInWf = mc.FlowState("water", 0.1, mc.PT_INPUTS, 1.1e5, 700.)
    flowInSf = mc.FlowState("water", 0.1, mc.PT_INPUTS, 1e5, 500.)

    hLowerBound = flowInWf.h() * 0.99
    hUpperBound = flowInWf.copyUpdateState(mc.constants.PT_INPUTS, 1.1e5,
                                           600.).h()

    hx.update({
        'L': 0.1,
        'NPlate': 3,
        'geomWf.b': 1.096e-3,
        'W': 95e-3,
        'flowInWf': flowInWf,
        'flowInSf': flowInSf,
        'sizeUnitsBounds': [1e-5, 5.],
        'runBounds': [hLowerBound, hUpperBound]
    })
    hx.run()
    assert (abs(hx.flowOutWf.T() - 643.66) < 0.01)
Пример #7
0
class TestHxPlate(unittest.TestCase):
    config = mc.Config()
    config.update({'dpAcc': False, 'dpPort': False, 'dpHead': False})
    config.set_method("savostinTikhonov_sp", "GeomHxPlateChevron",
                      mc.TRANSFER_ALL, mc.UNITPHASE_ALL, mc.SECONDARY_FLUID)
    hx = mc.HxPlate(flowConfig=mc.HxFlowConfig(mc.COUNTERFLOW, 1, '', True,
                                               True),
                    RfWf=0,
                    RfSf=0,
                    plate=mc.library.stainlessSteel_316(573.15),
                    tPlate=0.424e-3,
                    geomWf=mc.GeomHxPlateChevron(1.096e-3, 60, 10e-3, 1.117),
                    geomSf=mc.GeomHxPlateChevron(1.096e-3, 60, 10e-3, 1.117),
                    L=269e-3,
                    W=95e-3,
                    portWf=mc.Port(d=0.0125),
                    portSf=mc.Port(d=0.0125),
                    NPlate=23,
                    coeffs_LPlate=[0.056, 1],
                    coeffs_WPlate=[0, 1],
                    efficiencyThermal=1.0,
                    config=config)
    flowInWf = mc.FlowState("R123", 0.34307814292524513, mc.PT_INPUTS,
                            1000000., 300.57890653991603)
    flowOutWf = mc.FlowState("R123", 0.34307814292524513, mc.PT_INPUTS,
                             1000000., 414.30198149532583)
    flowInSf = mc.FlowState("Air", 0.09, mc.PT_INPUTS, 111600., 1170.)
    flowOutSf = mc.FlowState("Air", 0.09, mc.PT_INPUTS, 111600.,
                             310.57890653991603)

    def test_0_unitise(self):
        self.hx.update({
            'flowInWf': self.flowInWf,
            'flowInSf': self.flowInSf,
            'flowOutWf': self.flowOutWf,
            'flowOutSf': self.flowOutSf
        })
        self.hx.unitise()

    def test_1_size_L(self):
        self.hx.update({
            'L': 269e-3,
            'NPlate': 23,
            'geomWf.b': 1.096e-3,
            'W': 95e-3
        })
        self.hx.update({'sizeAttr': 'L', 'sizeBounds': [0.005, 0.5]})
        self.hx.size()
        self.assertAlmostEqual(abs(self.hx.L - 269e-3) / 269e-3, 0, 2)
        #
        self.assertAlmostEqual(
            abs(self.hx.dpWf() - 39607.4552153897) / 39607.4552153897, 0, 2)

    def test_1_size_W(self):
        self.hx.update({
            'L': 0.268278920236407,
            'NPlate': 23,
            'geomWf.b': 1.096e-3,
            'W': 95e-3
        })
        self.hx.update({'sizeAttr': 'W', 'sizeBounds': [50e-3, 500e-3]})
        self.hx.size()
        self.assertAlmostEqual(abs(self.hx.W - 95e-3) / 95e-3, 0, 4)

    def test_1_size_geomWf_b(self):
        self.hx.update({
            'L': 0.268278920236407,
            'NPlate': 23,
            'geomWf.b': 0,
            'W': 95e-3
        })
        self.hx.update({'sizeAttr': 'geomWf.b', 'sizeBounds': [0.1e-3, 10e-3]})
        self.hx.size()
        self.assertAlmostEqual(abs(self.hx.geomWf.b - 1.096e-3), 0, 4)

    def test_1_size_NPlate(self):
        self.hx.update({
            'L': 0.268278920236407,
            'NPlate': 23,
            'geomWf.b': 1.096e-3,
            'W': 95e-3
        })
        self.hx.update({'sizeAttr': 'NPlate', 'sizeBounds': [10, 50]})
        self.hx.size()
        self.assertEqual(self.hx.NPlate, 23)

    def test_1_size_L_solution_not_in_bounds_Exception(self):
        self.hx.update({'sizeAttr': 'L', 'sizeBounds': [0.5, 5.]})
        self.hx.size()
        self.assertRaises(Exception)

    def test_run1(self):
        flowInWf = mc.FlowState("R245fa", 2, mc.PT_INPUTS, 2e5, 300.)
        flowInSf = mc.FlowState("water", 5., mc.PT_INPUTS, 1e5, 600.)

        hLowerBound = flowInWf.h() * 1.01
        hUpperBound = flowInWf.copyUpdateState(mc.PT_INPUTS, 2e5, 350.).h()

        self.hx.update({
            'L': 0.269,
            'NPlate': 5,
            'geomWf.b': 1.096e-3,
            'W': 95e-3,
            'flowInWf': flowInWf,
            'flowInSf': flowInSf,
            'sizeUnitsBounds': [1e-5, 1.],
            'runBounds': [hLowerBound, hUpperBound]
        })
        self.hx.run()
        #self.hx.summary(flowKeys='all')
        self.assertAlmostEqual(self.hx.flowOutWf.T(), 318.22, 2)

    def test_run2(self):
        flowInWf = mc.FlowState("water", 0.1, mc.PT_INPUTS, 1.1e5, 700.)
        flowInSf = mc.FlowState("water", 0.1, mc.PT_INPUTS, 1e5, 500.)

        hLowerBound = flowInWf.h() * 0.99
        hUpperBound = flowInWf.copyUpdateState(mc.PT_INPUTS, 1.1e5, 600.).h()

        self.hx.update({
            'L': 0.1,
            'NPlate': 3,
            'geomWf.b': 1.096e-3,
            'W': 95e-3,
            'flowInWf': flowInWf,
            'flowInSf': flowInSf,
            'sizeUnitsBounds': [1e-5, 5.],
            'runBounds': [hLowerBound, hUpperBound]
        })
        self.hx.run()
        #self.hx.summary(flowKeys='all')
        self.assertAlmostEqual(self.hx.flowOutWf.T(), 643.66, 2)
Пример #8
0
class TestMethods(unittest.TestCase):
    configTest = mc.Config()
    methods = configTest.methods

    def test_add_method_success(self):
        def custom_method(p0, p1, p2):
            return {"h": 0}

        mc.add_method(custom_method, "heat_transfer")
        self.assertEqual(
            getattr(mc.methods.heat_transfer, "custom_method"), custom_method)

    def test_add_method_fail_method_is_string(self):
        with self.assertRaises(TypeError):
            mc.add_method("custom_method", "heat_transfer")

    def test_add_method_fail_submodule_not_valid(self):
        with self.assertRaises(ValueError):

            def custom_method(p0, p1, p2):
                return {"h": 0}

            mc.add_method(custom_method, "fail_submodule")

    def test_Methods_lookupMethod_HxPlateChevron_using_args(self):
        self.methods['GeomHxPlateChevron'][mc.TRANSFER_HEAT][
            mc.WORKING_FLUID] = {
                mc.UNITPHASE_TWOPHASE_EVAPORATING: "yanLin_tpEvap"
            }
        self.assertEqual(
            self.configTest.lookupMethod(
                "HxPlate",
                ("GeomHxPlateChevron", mc.TRANSFER_HEAT,
                 mc.UNITPHASE_TWOPHASE_EVAPORATING, mc.WORKING_FLUID)),
            "yanLin_tpEvap")

    def test_Methods_lookupMethod_HxPlateChevron_using_fallback_ALL_TWOPHASE(
            self):
        self.methods['GeomHxPlateChevron'][mc.TRANSFER_HEAT][
            mc.WORKING_FLUID] = {
                mc.UNITPHASE_ALL_TWOPHASE: "yanLin_tpEvap"
            }
        self.assertEqual(
            self.configTest.lookupMethod(
                "HxPlate",
                ("GeomHxPlateChevron", mc.TRANSFER_HEAT,
                 mc.UNITPHASE_TWOPHASE_EVAPORATING, mc.WORKING_FLUID)),
            "yanLin_tpEvap")

    def test_Methods_lookupMethod_HxPlateChevron_using_fallback_ALL(
            self):
        self.methods['GeomHxPlateChevron'][mc.TRANSFER_HEAT][
            mc.WORKING_FLUID] = {
                mc.UNITPHASE_ALL: "yanLin_tpEvap"
            }
        self.assertEqual(
            self.configTest.lookupMethod(
                "HxPlate",
                ("GeomHxPlateChevron", mc.TRANSFER_HEAT,
                 mc.UNITPHASE_TWOPHASE_EVAPORATING, mc.WORKING_FLUID)),
            "yanLin_tpEvap")

    def test_Methods_lookupMethod_HxPlateChevron_using_fallback_ALL_SINGLEPHASE_of_FLOW_ALL(
            self):
        self.methods['GeomHxPlateChevron'][mc.TRANSFER_HEAT] = {
            mc.UNITPHASE_ALL_SINGLEPHASE: "yanLin_tpEvap"
        }
        self.assertEqual(
            self.configTest.lookupMethod(
                "HxPlate", ("GeomHxPlateChevron", mc.TRANSFER_HEAT,
                            mc.UNITPHASE_LIQUID, mc.WORKING_FLUID)),
            "yanLin_tpEvap")

    #"""
    def test_Methods_lookupMethod_HxPlateChevron_Error_method_is_None(
            self):
        self.methods['GeomHxPlateChevron'][mc.TRANSFER_FRICTION] = {}
        with self.assertRaises(KeyError):
            self.configTest.lookupMethod(
                "HxPlate",
                ("GeomHxPlateChevron", mc.TRANSFER_FRICTION,
                 mc.UNITPHASE_LIQUID, mc.WORKING_FLUID))

    def test_Methods_lookupMethod_HxPlateChevron_Error_wrong_number_args(
            self):
        self.configTest.set_method(
            'test_method', 'GeomHxPlateChevron',
            mc.TRANSFER_FRICTION, mc.UNITPHASE_ALL, mc.WORKING_FLUID)
        with self.assertRaises(IndexError):
            self.configTest.lookupMethod(
                "HxPlate", ("GeomHxPlateChevron",
                            mc.TRANSFER_FRICTION, mc.UNITPHASE_LIQUID))

    #"""

    def test_Methods_lookupMethod_HxPlateFinOffset_using_args(self):
        self.methods['GeomHxPlateFinOffset'][mc.TRANSFER_FRICTION][
            mc.SECONDARY_FLUID] = {
                mc.UNITPHASE_LIQUID: "manglikBergles_offset_sp",
                mc.UNITPHASE_VAPOUR: "manglikBergles_offset_sp"
            }
        self.assertEqual(
            self.configTest.lookupMethod(
                "HxPlate", ("GeomHxPlateFinOffset", mc.TRANSFER_FRICTION,
                            mc.UNITPHASE_LIQUID, mc.SECONDARY_FLUID)),
            "manglikBergles_offset_sp")
Пример #9
0
 def test_changing_default(self):
     mc.defaults.TOLREL = 4  #updateDefaults({'TOLREL': 4})
     print(mc.defaults.TOLREL)
     config = mc.Config()
     print(config.dpPortSf)
     self.assertEqual(config.tolRel, 4)
Пример #10
0
class TestRankineBasic(unittest.TestCase):
    wf = mc.FlowState("R123", "HEOS", None)
    pEvap = 10.e5
    superheat = 30.
    TCond = 300.
    subcool = None
    comp = mc.CompBasic(None, 0.7, sizeAttr="pRatio")
    sourceIn = mc.FlowState("Air", "HEOS", None, 0.09, CP.PT_INPUTS, 1.116e5,
                            1170.)
    evap = mc.library.alfaLaval_AC30EQ()
    evap.update(sizeAttr="NPlate")
    exp = mc.ExpBasic(None, 0.7, sizeAttr="pRatio")
    sinkIn = mc.FlowState("Air", "HEOS", None, 0.20, CP.PT_INPUTS, 0.88260e5,
                          281.65)
    sinkDead = sinkIn.copy()
    sourceDead = sinkIn.copy()
    #cond = mc.library.alfaLaval_CBXP27, sizeAttr="NPlate")
    cond = mc.ClrBasicConstP(None, 1, sizeAttr="Q")
    config = mc.Config(dpEvap=False,
                       dpCond=False,
                       dpAcc=False,
                       dpPort=False,
                       dpHead=False)
    cycle = mc.RankineBasic(wf,
                            evap,
                            exp,
                            cond,
                            comp,
                            pEvap,
                            superheat,
                            None,
                            subcool,
                            config,
                            TCond=TCond,
                            sourceIn=sourceIn,
                            sinkIn=sinkIn,
                            sourceDead=sourceDead,
                            sinkDead=sinkDead)
    cycle.pptdEvap = 10.

    def test_0_setup_cycle(self):
        self.assertAlmostEqual(self.cycle.pCond, 97797.60828695059, 5)
        self.assertIs(self.cycle.exp.config, self.config)
        self.assertAlmostEqual(self.cycle.mWf, 0.34307814292524513, 10)

    def test_1_size(self):
        self.cycle.config.dpEvap = False
        self.cycle.size()
        self.assertAlmostEqual(abs(self.cycle.evap.L - 0.268278920236407), 0,
                               2)
        self.assertAlmostEqual(self.cycle.comp.pRatio, 10.22519893, 4)
        self.assertAlmostEqual(self.cycle.exp.pRatio, 10.22519893, 4)
        self.assertAlmostEqual(self.cycle.evap.Q, 83891.17350428084, 6)

    def test_1_size_dpEvap_True(self):
        self.cycle.config.dpEvap = True
        self.cycle.size()
        self.assertAlmostEqual(abs(self.cycle.evap.L - 0.268278920236407), 0,
                               2)
        self.assertAlmostEqual(
            (self.cycle.comp.pRatio - 10.22519893) / 10.22519893, 0, 4)
        self.assertAlmostEqual(self.cycle.exp.pRatio,
                               (self.cycle.pEvap - 39607.4552153897) /
                               self.cycle.pCond, 4)
        self.assertAlmostEqual(self.cycle.evap.Q, 83891.17350428084, 4)

    def test_cycle_plot(self):
        import os
        self.cycle.sizeSetup()
        self.cycle.plot(title="test_cycle_plot",
                        show=False,
                        savefig=True,
                        savefig_name="test_cycle_plot",
                        savefig_format="png",
                        savefig_folder="")
        cwd = os.getcwd()
        os.remove(cwd + "/test_cycle_plot.png")