def setup(self): """Set up network for electrolyzer tests.""" self.nw = Network(['O2', 'H2', 'H2O'], T_unit='C', p_unit='bar') self.instance = WaterElectrolyzer('electrolyzer') fw = Source('feed water') cw_in = Source('cooling water') o2 = Sink('oxygen sink') h2 = Sink('hydrogen sink') cw_out = Sink('cooling water sink') self.instance.set_attr(pr=0.99, eta=1) cw_el = Connection(cw_in, 'out1', self.instance, 'in1', fluid={ 'H2O': 1, 'H2': 0, 'O2': 0 }, T=20, p=1) el_cw = Connection(self.instance, 'out1', cw_out, 'in1', T=45) self.nw.add_conns(cw_el, el_cw) fw_el = Connection(fw, 'out1', self.instance, 'in2', label='h2o') el_o2 = Connection(self.instance, 'out2', o2, 'in1') el_h2 = Connection(self.instance, 'out3', h2, 'in1', label='h2') self.nw.add_conns(fw_el, el_o2, el_h2)
def setup_CombustionChamberStoich_model(self): """Set up the model using the stoichimetric combustion chamber.""" # %% network setup fluid_list = ['myAir', 'myFuel', 'myFuel_fg'] self.nw2 = Network(fluids=fluid_list, p_unit='bar', T_unit='C', p_range=[0.5, 20], T_range=[10, 2000]) # %% components amb = Source('ambient') sf = Source('fuel') cc = CombustionChamberStoich('combustion') cp = Compressor('compressor') gt = Turbine('turbine') fg = Sink('flue gas outlet') # %% connections amb_cp = Connection(amb, 'out1', cp, 'in1') cp_cc = Connection(cp, 'out1', cc, 'in1') sf_cc = Connection(sf, 'out1', cc, 'in2') cc_gt = Connection(cc, 'out1', gt, 'in1', label='flue gas after cc') gt_fg = Connection(gt, 'out1', fg, 'in1', label='flue gas after gt') self.nw2.add_conns(amb_cp, cp_cc, sf_cc, cc_gt, gt_fg) # %% component parameters cc.set_attr(fuel={ 'CH4': 0.96, 'CO2': 0.04 }, air={ 'Ar': 0.0129, 'N2': 0.7553, 'CO2': 0.0004, 'O2': 0.2314 }, fuel_alias='myFuel', air_alias='myAir', lamb=3) cp.set_attr(eta_s=0.9, pr=15) gt.set_attr(eta_s=0.9) # %% connection parameters amb_cp.set_attr(T=20, p=1, m=100, fluid={ 'myAir': 1, 'myFuel': 0, 'myFuel_fg': 0 }) sf_cc.set_attr(T=20, fluid={'myAir': 0, 'myFuel': 1, 'myFuel_fg': 0}) gt_fg.set_attr(p=1) # %% solving self.nw2.solve(mode='design')
def test_duplicate_Connection_labels(self): source1 = Source('source1') source2 = Source('source2') sink1 = Sink('sink1') sink2 = Sink('sink2') a = Connection(source1, 'out1', sink1, 'in1', label='myconn') b = Connection(source2, 'out1', sink2, 'in1', label='myconn') with raises(ValueError): self.nw.add_conns(a, b)
def setup(self): self.nw = Network(['H2O', 'N2', 'O2', 'Ar', 'CO2', 'CH4'], T_unit='C', p_unit='bar', v_unit='m3 / s') self.fuel = Source('fuel') self.air = Source('ambient air') self.fg = Sink('flue gas')
def setup_CombustionChamberStoich_error_tests(self): Memorise.add_fluids({'CH4': 'HEOS', 'O2': 'HEOS', 'N2': 'HEOS'}) self.nw = Network(['fuel', 'fuel_fg', 'Air'], p_range=[1e4, 1e6]) label = 'combustion chamber' self.instance = CombustionChamberStoich(label) c1 = Connection(Source('air'), 'out1', self.instance, 'in1') c2 = Connection(Source('fuel'), 'out1', self.instance, 'in2') c3 = Connection(self.instance, 'out1', Sink('flue gas'), 'in1') self.nw.add_conns(c1, c2, c3)
def test_Connection_error_target(self): source1 = Source('source1') source2 = Source('source2') sink = Sink('sink') a = Connection(source1, 'out1', sink, 'in1') b = Connection(source2, 'out1', sink, 'in1') self.nw.add_conns(a, b) with raises(TESPyNetworkError): self.nw.check_network()
def test_CombustionChamber_missing_oxygen(): """Test no oxygen in network.""" nw = Network(['H2O', 'N2', 'Ar', 'CO2', 'CH4']) instance = CombustionChamber('combustion chamber') c1 = Connection(Source('air'), 'out1', instance, 'in1') c2 = Connection(Source('fuel'), 'out1', instance, 'in2') c3 = Connection(instance, 'out1', Sink('flue gas'), 'in1') nw.add_conns(c1, c2, c3) with raises(TESPyComponentError): nw.solve('design', init_only=True)
def test_bad_fluids_in_fluid_vector(self): source1 = Source('source1') sink1 = Sink('sink1') a = Connection(source1, 'out1', sink1, 'in1', fluid={'air': 1}) self.nw.add_conns(a) with raises(TESPyNetworkError): self.nw.solve('design')
def setup(self): self.Tamb = 20 self.pamb = 1 fluids = ['Air'] # turbine part self.nw = Network(fluids=fluids) self.nw.set_attr(p_unit='bar', T_unit='C', h_unit='kJ / kg') # components so = Source('inlet') tu = Turbine('compressor') si = Sink('outlet') # fuel exergy bus self.exergy_fuel = Bus('fuel exergy') self.exergy_fuel.add_comps({'comp': si}, {'comp': so, 'base': 'bus'}) # product exergy bus self.exergy_prod = Bus('product exergy') self.exergy_prod.add_comps({'comp': tu, 'char': 0.9}) # create connections c1 = Connection(so, 'out1', tu, 'in1', '1') c2 = Connection(tu, 'out1', si, 'in1', '2') self.nw.add_conns(c1, c2) # component parameters tu.set_attr(eta_s=0.85, pr=1 / 5) # connection parameters c1.set_attr(m=2, p=10, fluid={'Air': 1}) c2.set_attr(T=self.Tamb) # solve network self.nw.solve('design')
def setup_CombustionEngine_network(self, instance): self.cw1_in = Source('cooling water 1 source') self.cw2_in = Source('cooling water 2 source') self.cw1_out = Sink('cooling water 1 sink') self.cw2_out = Sink('cooling water 2 sink') self.c1 = Connection(self.air, 'out1', instance, 'in3') self.c2 = Connection(self.fuel, 'out1', instance, 'in4') self.c3 = Connection(instance, 'out3', self.fg, 'in1') self.c4 = Connection(self.cw1_in, 'out1', instance, 'in1') self.c5 = Connection(self.cw2_in, 'out1', instance, 'in2') self.c6 = Connection(instance, 'out1', self.cw1_out, 'in1') self.c7 = Connection(instance, 'out2', self.cw2_out, 'in1') self.nw.add_conns(self.c1, self.c2, self.c3, self.c4, self.c5, self.c6, self.c7)
def test_missing_offdesign_path(self): source = Source('source') sink = Sink('sink') a = Connection(source, 'out1', sink, 'in1') self.nw.add_conns(a) with raises(TESPyNetworkError): self.nw.solve('offdesign')
def setup_piping_network(self, instance): self.nw = Network(['CH4'], T_unit='C', p_unit='bar') self.source = Source('source') self.sink = Sink('sink') self.c1 = Connection(self.source, 'out1', instance, 'in1') self.c2 = Connection(instance, 'out1', self.sink, 'in1') self.nw.add_conns(self.c1, self.c2)
def test_consistency_outlets(self): source = Source('source') splitter = Splitter('splitter') a = Connection(source, 'out1', splitter, 'in1') self.nw.add_conns(a) with raises(TESPyNetworkError): self.nw.check_network()
def setup(self): self.nw = Network( ['H2O', 'Ar', 'INCOMP::S800'], T_unit='C', p_unit='bar', v_unit='m3 / s') self.inl1 = Source('inlet 1') self.outl1 = Sink('outlet 1')
def test_underdetermination(self): source = Source('source') sink = Sink('sink') a = Connection(source, 'out1', sink, 'in1', m=1) self.nw.add_conns(a) with raises(TESPyNetworkError): self.nw.solve('design')
def test_bad_mode_specification(self): source = Source('source') sink = Sink('sink') a = Connection(source, 'out1', sink, 'in1') self.nw.add_conns(a) with raises(ValueError): self.nw.solve('ofdesign')
def test_component_label_duplicates(self): source = Source('label') sink = Sink('label') a = Connection(source, 'out1', sink, 'in1') self.nw.add_conns(a) with raises(TESPyNetworkError): self.nw.check_network()
def test_Network_instanciation_no_fluids(): nw = Network([]) so = Source('source') si = Sink('sink') conn = Connection(so, 'out1', si, 'in1') nw.add_conns(conn) with raises(TESPyNetworkError): nw.solve('design', init_only=True)
def test_overdetermination(self): source = Source('source') sink = Sink('sink') a = Connection(source, 'out1', sink, 'in1', m=1, p=1e5, x=1, h=1e6, fluid={'water': 1}, fluid_balance=True) self.nw.add_conns(a) with raises(TESPyNetworkError): self.nw.solve('design')
def test_Connection_error_source(self): source = Source('source') sink1 = Sink('sink1') sink2 = Sink('sink2') a = Connection(source, 'out1', sink1, 'in1') b = Connection(source, 'out1', sink2, 'in1') self.nw.add_conns(a, b) with raises(TESPyNetworkError): self.nw.check_network()
def setup_Network_individual_offdesign(self): """Set up network for individual offdesign tests.""" self.nw = Network(['H2O'], T_unit='C', p_unit='bar', v_unit='m3 / s') so = Source('source') sp = Splitter('splitter', num_out=2) self.pump1 = Pump('pump 1') self.sc1 = SolarCollector('collector field 1') v1 = Valve('valve1') self.pump2 = Pump('pump 2') self.sc2 = SolarCollector('collector field 2') v2 = Valve('valve2') me = Merge('merge', num_in=2) si = Sink('sink') self.pump1.set_attr(eta_s=0.8, design=['eta_s'], offdesign=['eta_s_char']) self.pump2.set_attr(eta_s=0.8, design=['eta_s'], offdesign=['eta_s_char']) self.sc1.set_attr(pr=0.95, lkf_lin=3.33, lkf_quad=0.011, A=1252, E=700, Tamb=20, eta_opt=0.92, design=['pr'], offdesign=['zeta']) self.sc2.set_attr(pr=0.95, lkf_lin=3.5, lkf_quad=0.011, A=700, E=800, Tamb=20, eta_opt=0.92, design=['pr'], offdesign=['zeta']) fl = {'H2O': 1} inlet = Connection(so, 'out1', sp, 'in1', T=50, p=3, fluid=fl) outlet = Connection(me, 'out1', si, 'in1', p=3) self.sp_p1 = Connection(sp, 'out1', self.pump1, 'in1') self.p1_sc1 = Connection(self.pump1, 'out1', self.sc1, 'in1') self.sc1_v1 = Connection(self.sc1, 'out1', v1, 'in1', p=3.1, T=90) v1_me = Connection(v1, 'out1', me, 'in1') self.sp_p2 = Connection(sp, 'out2', self.pump2, 'in1') self.p2_sc2 = Connection(self.pump2, 'out1', self.sc2, 'in1') self.sc2_v2 = Connection(self.sc2, 'out1', v2, 'in1', p=3.1, m=0.1) v2_me = Connection(v2, 'out1', me, 'in2') self.nw.add_conns(inlet, outlet, self.sp_p1, self.p1_sc1, self.sc1_v1, v1_me, self.sp_p2, self.p2_sc2, self.sc2_v2, v2_me)
def setup_network(self, instance): self.nw = Network(['INCOMP::DowQ', 'NH3', 'N2', 'O2', 'Ar'], T_unit='C', p_unit='bar', v_unit='m3 / s') self.source = Source('source') self.sink = Sink('sink') self.c1 = Connection(self.source, 'out1', instance, 'in1') self.c2 = Connection(instance, 'out1', self.sink, 'in1') self.nw.add_conns(self.c1, self.c2)
def setup_HeatExchanger_network(self, instance): self.inl2 = Source('inlet 2') self.outl2 = Sink('outlet 2') self.c1 = Connection(self.inl1, 'out1', instance, 'in1') self.c2 = Connection(instance, 'out1', self.outl1, 'in1') self.c3 = Connection(self.inl2, 'out1', instance, 'in2') self.c4 = Connection(instance, 'out2', self.outl2, 'in1') self.nw.add_conns(self.c1, self.c2, self.c3, self.c4)
def setup_electrolyzer_Network(self): """Set up Network for electrolyzer tests.""" self.instance = WaterElectrolyzer('electrolyzer') fw = Source('feed water') cw_in = Source('cooling water') o2 = Sink('oxygen sink') h2 = Sink('hydrogen sink') cw_out = Sink('cooling water sink') cw_el = Connection(cw_in, 'out1', self.instance, 'in1') el_cw = Connection(self.instance, 'out1', cw_out, 'in1') self.nw.add_conns(cw_el, el_cw) fw_el = Connection(fw, 'out1', self.instance, 'in2') el_o2 = Connection(self.instance, 'out2', o2, 'in1') el_h2 = Connection(self.instance, 'out3', h2, 'in1') self.nw.add_conns(fw_el, el_o2, el_h2)
def setup_clausius_rankine(self, fluid_list): """Setup a Clausius-Rankine cycle.""" self.nw = Network(fluids=fluid_list) self.nw.set_attr(p_unit='bar', T_unit='C', iterinfo=True) # %% components # main components turb = Turbine('turbine') con = Condenser('condenser') pu = Pump('pump') steam_generator = HeatExchangerSimple('steam generator') closer = CycleCloser('cycle closer') # cooling water so_cw = Source('cooling water inlet') si_cw = Sink('cooling water outlet') # %% connections # main cycle fs_in = Connection(closer, 'out1', turb, 'in1', label='livesteam') ws = Connection(turb, 'out1', con, 'in1', label='wastesteam') cond = Connection(con, 'out1', pu, 'in1', label='condensate') fw = Connection(pu, 'out1', steam_generator, 'in1', label='feedwater') fs_out = Connection(steam_generator, 'out1', closer, 'in1') self.nw.add_conns(fs_in, ws, cond, fw, fs_out) # cooling water cw_in = Connection(so_cw, 'out1', con, 'in2') cw_out = Connection(con, 'out2', si_cw, 'in1') self.nw.add_conns(cw_in, cw_out) # %% parametrization of components turb.set_attr(eta_s=0.9) con.set_attr(pr1=1, pr2=0.99, ttd_u=5) steam_generator.set_attr(pr=0.9) # %% parametrization of connections fs_in.set_attr(p=100, T=500, m=100, fluid={self.nw.fluids[0]: 1}) fw.set_attr(h=200e3) cw_in.set_attr(T=20, p=5, fluid={self.nw.fluids[0]: 1}) cw_out.set_attr(T=30) # %% solving self.nw.solve('design') pu.set_attr(eta_s=0.7) fw.set_attr(h=None) self.nw.solve('design')
def setup(self): """Set up air compressed air turbine.""" self.Tamb = 20 self.pamb = 1 fluids = ['Air'] # turbine part self.nw = Network(fluids=fluids) self.nw.set_attr(p_unit='bar', T_unit='C', h_unit='kJ / kg') # components cas = Source('compressed air storage') reheater = HeatExchangerSimple('reheating') turb = Turbine('turbine') amb = Sink('air outlet') # power ouput bus self.power_out = Bus('power output') self.power_out.add_comps({'comp': turb, 'char': 1}) # compressed air bus self.cas_out = Bus('exergy in') self.cas_out.add_comps({ 'comp': cas, 'base': 'bus' }, { 'comp': reheater, 'base': 'bus' }) # exergy loss bus self.ex_loss = Bus('exergy loss') self.ex_loss.add_comps({'comp': amb, 'base': 'component'}) self.nw.add_busses(self.power_out, self.cas_out) # create connections cas_reheater = Connection(cas, 'out1', reheater, 'in1') reheater_turb = Connection(reheater, 'out1', turb, 'in1') turb_amb = Connection(turb, 'out1', amb, 'in1', label='outlet') self.nw.add_conns(cas_reheater, reheater_turb, turb_amb) # component parameters turb.set_attr(eta_s=1) reheater.set_attr(pr=1) # connection parameters cas_reheater.set_attr(m=2, T=self.Tamb, p=10, fluid={'Air': 1}) reheater_turb.set_attr() turb_amb.set_attr(p=self.pamb, T=self.Tamb) # solve network self.nw.solve('design') convergence_check(self.nw.lin_dep)
def test_Turbine_missing_char_parameter(): """Turbine with invalid parameter for eta_s_char function.""" nw = Network(['CH4']) so = Source('source') si = Sink('sink') instance = Turbine('turbine') c1 = Connection(so, 'out1', instance, 'in1') c2 = Connection(instance, 'out1', si, 'in1') nw.add_conns(c1, c2) instance.set_attr(eta_s_char={ 'char_func': CharLine([0, 1], [1, 2]), 'is_set': True, 'param': None}) nw.solve('design', init_only=True) with raises(ValueError): instance.eta_s_char_func()
def setup(self): self.nw = Network(['water', 'Isopentane'], T_unit='C', p_unit='bar', h_unit='kJ / kg') self.inl1 = Source('inlet 1') self.outl1 = Sink('outlet 1') self.inl2 = Source('inlet 2') self.outl2 = Sink('outlet 2') self.inl3 = Source('inlet 3') self.outl3 = Sink('outlet 3') self.instance = ORCEvaporator('orc evaporator') self.c1 = Connection(self.inl1, 'out1', self.instance, 'in1') self.c2 = Connection(self.instance, 'out1', self.outl1, 'in1') self.c3 = Connection(self.inl2, 'out1', self.instance, 'in2') self.c4 = Connection(self.instance, 'out2', self.outl2, 'in1') self.c5 = Connection(self.inl3, 'out1', self.instance, 'in3') self.c6 = Connection(self.instance, 'out3', self.outl3, 'in1') self.nw.add_conns(self.c1, self.c2, self.c3, self.c4, self.c5, self.c6)
def setup(self): """Set up air compressor.""" self.Tamb = 20 self.pamb = 1 fluids = ['Air'] # compressor part self.nw = Network(fluids=fluids) self.nw.set_attr(p_unit='bar', T_unit='C', h_unit='kJ / kg') # components amb = Source('air intake') cp = Compressor('compressor') cooler = HeatExchangerSimple('cooling') cas = Sink('compressed air storage') # power input bus self.power_in = Bus('power input') self.power_in.add_comps({'comp': cp, 'char': 1, 'base': 'bus'}) # compressed air bus (not sure about this!) self.cas_in = Bus('massflow into storage') self.cas_in.add_comps({'comp': cas}, {'comp': amb, 'base': 'bus'}) self.nw.add_busses(self.power_in, self.cas_in) # create connections amb_cp = Connection(amb, 'out1', cp, 'in1') cp_cool = Connection(cp, 'out1', cooler, 'in1') cool_cas = Connection(cooler, 'out1', cas, 'in1') self.nw.add_conns(amb_cp, cp_cool, cool_cas) # component parameters cp.set_attr(eta_s=1) cooler.set_attr(pr=1) # connection parameters amb_cp.set_attr(m=2, T=self.Tamb, p=self.pamb, fluid={'Air': 1}) cool_cas.set_attr(T=self.Tamb, p=10) # solve network self.nw.solve('design') convergence_check(self.nw.lin_dep)
from tespy.tools import CharLine import numpy as np # %% network fluid_list = ['Ar', 'N2', 'O2', 'CO2', 'CH4', 'H2O'] nw = Network(fluids=fluid_list, p_unit='bar', T_unit='C', h_unit='kJ / kg') # %% components # gas turbine part comp = Compressor('compressor') c_c = CombustionChamber('combustion') g_turb = Turbine('gas turbine') CH4 = Source('fuel source') air = Source('ambient air') # waste heat recovery suph = HeatExchanger('superheater') evap = HeatExchanger('evaporator') dr = Drum('drum') eco = HeatExchanger('economizer') dh_whr = HeatExchanger('waste heat recovery') ch = Sink('chimney') # steam turbine part turb = Turbine('steam turbine') cond = Condenser('condenser') pu = Pump('feed water pump') cc = CycleCloser('ls cycle closer')