Пример #1
0
 def test_ExpBasic_run(self):
     flowIn = mc.FlowState("water", "HEOS", None, 10., CP.PT_INPUTS, 3.e6,
                           mc.degC2K(500))
     exp = mc.ExpBasic(6, 0.8, flowIn)
     exp.run()
     self.assertAlmostEqual(exp.flowOut.T, 563.74, 2)
     self.assertAlmostEqual(exp.P_out / 1000, 4121.11, 2)
Пример #2
0
    def test_ExpBasic_size_pRatio(self):
        flowIn = mc.FlowState("water", -1, mc.PT_INPUTS, 2.e6, mc.degC2K(350))
        flowOut = mc.FlowState("water", -1, mc.PQ_INPUTS, 50000., 1)

        exp = mc.ExpBasic(-1, 0.686, flowIn, flowOut)
        exp.update({'m': 1.})
        exp.size()  # defaults to sizeAttr=pRatio,sizeBounds=[1,50]
        self.assertAlmostEqual(exp.pRatio, 40.0, 5)
Пример #3
0
    def test_ExpBasic_size_pRatio(self):
        flowIn = mc.FlowState("water", "HEOS", None, None, CP.PT_INPUTS, 2.e6,
                              mc.degC2K(350))
        flowOut = mc.FlowState("water", "HEOS", None, None, CP.PQ_INPUTS,
                               50000., 1)

        exp = mc.ExpBasic(None, 0.686, flowIn, flowOut, m=1.0)
        exp.size()  # defaults to sizeAttr=pRatio,sizeBracket=[1,50]
        self.assertAlmostEqual(exp.pRatio, 40.0, 5)
Пример #4
0
    def test_ExpBasic_size_effIsentropic(self):
        flowIn = mc.FlowState("water", "HEOS", None, None, CP.PT_INPUTS, 2.e6,
                              mc.degC2K(350))
        flowOut = mc.FlowState("water", "HEOS", None, None, CP.PQ_INPUTS,
                               50000., 1)

        exp = mc.ExpBasic(40, 1.0, flowIn, flowOut, m=1.0)
        exp.size("effIsentropic", [0.5, 0.8])
        self.assertAlmostEqual(exp.effIsentropic, 0.686, 3)
Пример #5
0
    def test_ExpBasic_size_efficiencyIsentropic(self):
        flowIn = mc.FlowState("water", -1, mc.PT_INPUTS, 2.e6, mc.degC2K(350))
        flowOut = mc.FlowState("water", -1, mc.PQ_INPUTS, 50000., 1)

        exp = mc.ExpBasic(40, 1.0, flowIn, flowOut)
        exp.update({
            'm': 1.,
            'sizeAttr': "efficiencyIsentropic",
            'sizeBounds': [0.5, 0.8]
        })
        exp.size()
        self.assertAlmostEqual(exp.efficiencyIsentropic, 0.686, 3)
Пример #6
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")
Пример #7
0
# ************************************************
print("Set MCycle defaults...")
mc.defaults.PLOT_DIR = ""
mc.defaults.PLOT_DPI = 200
mc.defaults.check()
print("defaults done.")

print("Begin Rankine cycle setup...")
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),
Пример #8
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))
    """
Пример #9
0
sourceIn_T = 1170.
sourceIn_p = 1.116e5
sourceFluid = "N2[{0}]&CO2[{1}]".format(0.75, 0.25)
TData = [300, 500, 700, 900, sourceIn_T]
sourceRefData = mc.RefData(sourceFluid,
                           2,
                           sourceIn_p, {'T': TData},
                           phaseCP=CP.iphase_gas)
sourceIn = mc.FlowStatePoly(sourceRefData, 0.09, CP.PT_INPUTS, sourceIn_p,
                            sourceIn_T)
sourceAmbient = mc.FlowState(sourceFluid, CP.iphase_gas, -1, CP.PT_INPUTS,
                             0.88260e5, 281.65)

evap = mc.library.alfaLaval_AC30EQ(sizeAttr="NPlate")
print("  - created evaporator")
exp = mc.ExpBasic(-1, 0.7, sizeAttr="pRatio")
print("  - created expander")
sinkIn = mc.FlowState("Air", -1, -1, CP.PT_INPUTS, 0.88260e5, 281.65)
sinkAmbient = sinkIn.copy()
cond = mc.ClrBasic(constraint=mc.CONSTANT_P, -1, 1, sizeAttr="Q")
print("  - created condenser")
config = mc.Config()
config.update({
    'dpEvap': False,
    'dpCond': False,
    'dpF': True,
    'dpAcc': False,
    'dpPort': False,
    'dpHead': False
})
config.set_method("chisholmWannairachchi_sp", ["GeomHxPlateCorrugatedChevron"],
Пример #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")