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")
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)) """
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():
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)
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)
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)
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)
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")
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)
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")