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')
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') # district heating dh_in = Source('district heating backflow') dh_out = Sink('district heating feedflow') # %% connections # gas turbine part c_in = Connection(air, 'out1', comp, 'in1') c_out = Connection(comp, 'out1', c_c, 'in1') fuel = Connection(CH4, 'out1', c_c, 'in2') gt_in = Connection(c_c, 'out1', g_turb, 'in1') gt_out = Connection(g_turb, 'out1', suph, 'in1')
# %% components # sources & sinks cc = CycleCloser('coolant cycle closer') cc_cons = CycleCloser('consumer cycle closer') amb = Source('ambient air') amb_out1 = Sink('sink ambient 1') amb_out2 = Sink('sink ambient 2') # ambient air system sp = Splitter('splitter') fan = Compressor('fan') # consumer system cd = Condenser('condenser') dhp = Pump('district heating pump') cons = HeatExchangerSimple('consumer') # evaporator system ves = Valve('valve') dr = Drum('drum') ev = HeatExchanger('evaporator') su = HeatExchanger('superheater') erp = Pump('evaporator reciculation pump') # compressor-system cp1 = Compressor('compressor 1') cp2 = Compressor('compressor 2')
def setup(self): """ Full model validation of SEGS model in TESPy vs. EBSILON. Find original models at https://github.com/fwitte/SEGS_exergy. """ # specification of ambient state self.pamb = 1.013 self.Tamb = 25 # setting up network self.nw = Network(fluids=['water', 'INCOMP::TVP1', 'air']) self.nw.set_attr(T_unit='C', p_unit='bar', h_unit='kJ / kg', m_unit='kg / s', s_unit="kJ / kgK") # components definition air_in = Source('Ambient air source', fkt_group='CW') air_out = Sink('Ambient air sink', fkt_group='CW') closer_pt = CycleCloser('Cycle closer pt', fkt_group='SF') pt = ParabolicTrough('Parabolic trough', fkt_group='SF') ptpump = Pump('HTF pump', fkt_group='SF') closer = CycleCloser('Cycle closer power cycle', fkt_group='SG') eco = HeatExchanger('Economizer', fkt_group='SG') eva = HeatExchanger('Evaporator', fkt_group='SG') sup = HeatExchanger('Superheater', fkt_group='SG') drum = Drum('Drum', fkt_group='SG') reh = HeatExchanger('Reheater', fkt_group='RH') hpt1 = Turbine('HP turbine 1', fkt_group='HPT') hpt2 = Turbine('HP turbine 2', fkt_group='HPT') lpt1 = Turbine('LP turbine 1', fkt_group='LPT') lpt2 = Turbine('LP turbine 2', fkt_group='LPT') lpt3 = Turbine('LP turbine 3', fkt_group='LPT') lpt4 = Turbine('LP turbine 4', fkt_group='LPT') lpt5 = Turbine('LP turbine 5', fkt_group='LPT') cond = Condenser('Condenser', fkt_group='CW') condpump = Pump('Condenser pump', fkt_group='CW') fwt = Merge('Feedwater tank', num_in=3, fkt_group='LPP') fwp = Pump('Feedwater pump', fkt_group='FWP') cwp = Pump('Cooling water pump', fkt_group='CW') closer_cw = CycleCloser('Cycle closer cw', fkt_group='CW') ct = HeatExchanger('Cooling tower', fkt_group='CW') fan = Compressor('Cooling tower fan', fkt_group='CW') sp1 = Splitter('Splitter 1', fkt_group='HPT') sp2 = Splitter('Splitter 2', fkt_group='HPT') sp3 = Splitter('Splitter 3', fkt_group='LPT') sp4 = Splitter('Splitter 4', fkt_group='LPT') sp5 = Splitter('Splitter 5', fkt_group='LPT') sp6 = Splitter('Splitter 6', fkt_group='LPT') sp7 = Splitter('Splitter 7', fkt_group='SF') m1 = Merge('Merge 1', fkt_group='CW') m2 = Merge('Merge 2', fkt_group='HPP') m3 = Merge('Merge 3', fkt_group='LPP') m4 = Merge('Merge 4', fkt_group='LPP') m5 = Merge('Merge 5', fkt_group='SF') v1 = Valve('Valve 1', fkt_group='HPP') v2 = Valve('Valve 2', fkt_group='HPP') v3 = Valve('Valve 3', fkt_group='LPP') v4 = Valve('Valve 4', fkt_group='LPP') v5 = Valve('Valve 5', fkt_group='LPP') hppre1 = Condenser('High pressure preheater 1', fkt_group='HPP') hppre2 = Condenser('High pressure preheater 2', fkt_group='HPP') hppre1_sub = HeatExchanger('High pressure preheater 1 subcooling', fkt_group='HPP') hppre2_sub = HeatExchanger('High pressure preheater 2 subcooling', fkt_group='HPP') lppre1 = Condenser('Low pressure preheater 1', fkt_group='LPP') lppre2 = Condenser('Low pressure preheater 2', fkt_group='LPP') lppre3 = Condenser('Low pressure preheater 3', fkt_group='LPP') lppre1_sub = HeatExchanger('Low pressure preheater 1 subcooling', fkt_group='LPP') lppre2_sub = HeatExchanger('Low pressure preheater 2 subcooling', fkt_group='LPP') lppre3_sub = HeatExchanger('Low pressure preheater 3 subcooling', fkt_group='LPP') # connections definition # power cycle c1 = Connection(sup, 'out2', closer, 'in1', label='1') c2 = Connection(closer, 'out1', hpt1, 'in1', label='2') c3 = Connection(hpt1, 'out1', sp1, 'in1', label='3') c4 = Connection(sp1, 'out1', hpt2, 'in1', label='4') c5 = Connection(hpt2, 'out1', sp2, 'in1', label='5') c6 = Connection(sp2, 'out1', reh, 'in2', label='6') c7 = Connection(reh, 'out2', lpt1, 'in1', label='7') c8 = Connection(lpt1, 'out1', sp3, 'in1', label='8') c9 = Connection(sp3, 'out1', lpt2, 'in1', label='9') c10 = Connection(lpt2, 'out1', sp4, 'in1', label='10') c11 = Connection(sp4, 'out1', lpt3, 'in1', label='11') c12 = Connection(lpt3, 'out1', sp5, 'in1', label='12') c13 = Connection(sp5, 'out1', lpt4, 'in1', label='13') c14 = Connection(lpt4, 'out1', sp6, 'in1', label='14') c15 = Connection(sp6, 'out1', lpt5, 'in1', label='15') c16 = Connection(lpt5, 'out1', m1, 'in1', label='16') c17 = Connection(m1, 'out1', cond, 'in1', label='17') c18 = Connection(cond, 'out1', condpump, 'in1', label='18') c19 = Connection(condpump, 'out1', lppre1, 'in2', label='19') # c19 = Connection(condpump, 'out1', lppre1_sub, 'in2', label='19') # c20 = Connection(lppre1_sub, 'out2', lppre1, 'in2', label='20') c21 = Connection(lppre1, 'out2', lppre2, 'in2', label='21') # c21 = Connection(lppre1, 'out2', lppre2_sub, 'in2', label='21') # c22 = Connection(lppre2_sub, 'out2', lppre2, 'in2', label='22') c23 = Connection(lppre2, 'out2', lppre3, 'in2', label='23') # c23 = Connection(lppre2, 'out2', lppre3_sub, 'in2', label='23') # c24 = Connection(lppre3_sub, 'out2', lppre3, 'in2', label='24') c25 = Connection(lppre3, 'out2', fwt, 'in1', label='25') c26 = Connection(fwt, 'out1', fwp, 'in1', label='26') c27 = Connection(fwp, 'out1', hppre1, 'in2', label='27') c29 = Connection(hppre1, 'out2', hppre2, 'in2', label='29') c31 = Connection(hppre2, 'out2', eco, 'in2', label='31') c36 = Connection(sp1, 'out2', hppre2, 'in1', label='36') c37 = Connection(hppre2, 'out1', v1, 'in1', label='37') c39 = Connection(v1, 'out1', m2, 'in2', label='39') c40 = Connection(sp2, 'out2', m2, 'in1', label='40') c41 = Connection(m2, 'out1', hppre1, 'in1', label='41') c42 = Connection(hppre1, 'out1', v2, 'in1', label='42') c44 = Connection(v2, 'out1', fwt, 'in2', label='44') c45 = Connection(sp3, 'out2', fwt, 'in3', label='45') c46 = Connection(sp4, 'out2', lppre3, 'in1', label='46') c47 = Connection(lppre3, 'out1', v3, 'in1', label='47') # c47 = Connection(lppre3, 'out1', lppre3_sub, 'in1', label='47') # c48 = Connection(lppre3_sub, 'out1', v3, 'in1', label='48') c49 = Connection(v3, 'out1', m3, 'in1', label='49') c50 = Connection(sp5, 'out2', m3, 'in2', label='50') c51 = Connection(m3, 'out1', lppre2, 'in1', label='51') c52 = Connection(lppre2, 'out1', v4, 'in1', label='52') # c52 = Connection(lppre2, 'out1', lppre2_sub, 'in1', label='52') # c53 = Connection(lppre2_sub, 'out1', v4, 'in1', label='53') c54 = Connection(v4, 'out1', m4, 'in2', label='54') c55 = Connection(sp6, 'out2', m4, 'in1', label='55') c56 = Connection(m4, 'out1', lppre1, 'in1', label='56') c57 = Connection(lppre1, 'out1', v5, 'in1', label='57') # c57 = Connection(lppre1, 'out1', lppre1_sub, 'in1', label='57') # c58 = Connection(lppre1_sub, 'out1', v5, 'in1', label='58') c59 = Connection(v5, 'out1', m1, 'in2', label='59') # components from subsystem c32 = Connection(eco, 'out2', drum, 'in1', label='32') c33 = Connection(drum, 'out1', eva, 'in2', label='33') c34 = Connection(eva, 'out2', drum, 'in2', label='34') c35 = Connection(drum, 'out2', sup, 'in2', label='35') c73 = Connection(sup, 'out1', eva, 'in1', label='73') c74 = Connection(eva, 'out1', eco, 'in1', label='74') # cooling water c60 = Connection(cond, 'out2', closer_cw, 'in1', label='60') c61 = Connection(closer_cw, 'out1', ct, 'in1', label='61') c62 = Connection(ct, 'out1', cwp, 'in1', label='62') c63 = Connection(cwp, 'out1', cond, 'in2', label='63') # cooling tower c64 = Connection(air_in, 'out1', fan, 'in1', label='64') c65 = Connection(fan, 'out1', ct, 'in2', label='65') c66 = Connection(ct, 'out2', air_out, 'in1', label='66') # parabolic trough cycle c70 = Connection(pt, 'out1', closer_pt, 'in1', label='67') c71 = Connection(closer_pt, 'out1', sp7, 'in1', label='71') c72 = Connection(sp7, 'out1', sup, 'in1', label='72') c75 = Connection(eco, 'out1', m5, 'in1', label='75') c76 = Connection(sp7, 'out2', reh, 'in1', label='76') c77 = Connection(reh, 'out1', m5, 'in2', label='77') c78 = Connection(m5, 'out1', ptpump, 'in1', label='78') c79 = Connection(ptpump, 'out1', pt, 'in1', label='79') # add connections to network self.nw.add_conns(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16, c17, c18, c19, c21, c23, c25, c26, c27, c29, c31, c32, c33, c34, c35, c36, c37, c39, c40, c41, c42, c44, c45, c46, c47, c49, c50, c51, c52, c54, c55, c56, c57, c59, c60, c61, c62, c63, c64, c65, c66, c70, c71, c72, c73, c74, c75, c76, c77, c78, c79) # power bus power = Bus('total output power') power.add_comps({ 'comp': hpt1, 'char': 0.97, 'base': 'component' }, { 'comp': hpt2, 'char': 0.97, 'base': 'component' }, { 'comp': lpt1, 'char': 0.97, 'base': 'component' }, { 'comp': lpt2, 'char': 0.97, 'base': 'component' }, { 'comp': lpt3, 'char': 0.97, 'base': 'component' }, { 'comp': lpt4, 'char': 0.97, 'base': 'component' }, { 'comp': lpt5, 'char': 0.97, 'base': 'component' }, { 'comp': fwp, 'char': 0.95, 'base': 'bus' }, { 'comp': condpump, 'char': 0.95, 'base': 'bus' }, { 'comp': ptpump, 'char': 0.95, 'base': 'bus' }, { 'comp': cwp, 'char': 0.95, 'base': 'bus' }, { 'comp': fan, 'char': 0.95, 'base': 'bus' }) heat_input_bus = Bus('heat input') heat_input_bus.add_comps({'comp': pt, 'base': 'bus'}) exergy_loss_bus = Bus('exergy loss') exergy_loss_bus.add_comps({ 'comp': air_in, 'base': 'bus' }, {'comp': air_out}) self.nw.add_busses(power, heat_input_bus, exergy_loss_bus) # component parameters pt.set_attr(doc=0.95, aoi=0, Tamb=25, A='var', eta_opt=0.73, c_1=0.00496, c_2=0.000691, E=1000, iam_1=1, iam_2=1) ptpump.set_attr(eta_s=0.6) eco.set_attr() eva.set_attr(ttd_l=5) sup.set_attr() hpt1.set_attr(eta_s=0.8376) hpt2.set_attr(eta_s=0.8463) lpt1.set_attr(eta_s=0.8623) lpt2.set_attr(eta_s=0.917) lpt3.set_attr(eta_s=0.9352) lpt4.set_attr(eta_s=0.88) lpt5.set_attr(eta_s=0.6445) cond.set_attr(pr1=1, pr2=0.9, ttd_u=5) condpump.set_attr(eta_s=0.7) fwp.set_attr(eta_s=0.7) cwp.set_attr(eta_s=0.7) ct.set_attr(pr1=0.95) fan.set_attr(eta_s=0.6) lppre1.set_attr(pr1=1, ttd_u=5) lppre2.set_attr(pr1=1, ttd_u=5) lppre3.set_attr(pr1=1, ttd_u=5) hppre1.set_attr(pr1=1, ttd_u=5) hppre2.set_attr(pr1=1, ttd_u=5) lppre1_sub.set_attr(pr1=1, pr2=1, ttd_l=10) lppre2_sub.set_attr(pr1=1, pr2=1, ttd_l=10) lppre3_sub.set_attr(pr1=1, pr2=1, ttd_l=10) hppre1_sub.set_attr(pr1=1, pr2=1, ttd_l=10) hppre2_sub.set_attr(pr1=1, pr2=1, ttd_l=10) # connection parameters # parabolic trough cycle c70.set_attr(fluid={'TVP1': 1, 'water': 0, 'air': 0}, T=390, p=23.304) c76.set_attr(m=Ref(c70, 0.1284, 0)) c73.set_attr(p=22.753) c74.set_attr(p=21.167) c78.set_attr(p=20.34) c79.set_attr(p=41.024) # cooling water c62.set_attr(fluid={ 'TVP1': 0, 'water': 1, 'air': 0 }, T=30, p=self.pamb) # cooling tower c64.set_attr(fluid={ 'water': 0, 'TVP1': 0, 'air': 1 }, p=self.pamb, T=self.Tamb) c65.set_attr(p=self.pamb + 0.0005) c66.set_attr(p=self.pamb, T=30) # power cycle c32.set_attr(Td_bp=-2) c34.set_attr(x=0.5) c1.set_attr(fluid={'water': 1, 'TVP1': 0, 'air': 0}, p=100, T=371) # steam generator pressure values c31.set_attr(p=103.56) c35.set_attr(p=103.42) # turbine pressure values c3.set_attr(p=33.61, m=38.969) c5.set_attr(p=18.58) c7.set_attr(p=17.1, T=371) c8.set_attr(p=7.98) c10.set_attr(p=2.73) c12.set_attr(p=0.96) c14.set_attr(p=0.29) # preheater pressure values c19.set_attr(p=14.755, state='l') c21.set_attr(p=9.9975, state='l') c23.set_attr(p=8.7012, state='l') c25.set_attr(state='l') c27.set_attr(p=125) c29.set_attr(p=112) # condensation c16.set_attr(p=0.08) # feedwater tank c26.set_attr(x=0) # a stable solution is generated for parts of the network self.nw.solve(mode='design') self.nw.del_conns(c19, c21, c23, c27, c29, c37, c42, c47, c52, c57) c19 = Connection(condpump, 'out1', lppre1_sub, 'in2', label='19') c20 = Connection(lppre1_sub, 'out2', lppre1, 'in2', label='20') c21 = Connection(lppre1, 'out2', lppre2_sub, 'in2', label='21') c22 = Connection(lppre2_sub, 'out2', lppre2, 'in2', label='22') c23 = Connection(lppre2, 'out2', lppre3_sub, 'in2', label='23') c24 = Connection(lppre3_sub, 'out2', lppre3, 'in2', label='24') c27 = Connection(fwp, 'out1', hppre1_sub, 'in2', label='27') c28 = Connection(hppre1_sub, 'out2', hppre1, 'in2', label='28') c29 = Connection(hppre1, 'out2', hppre2_sub, 'in2', label='29') c30 = Connection(hppre2_sub, 'out2', hppre2, 'in2', label='30') c37 = Connection(hppre2, 'out1', hppre2_sub, 'in1', label='37') c38 = Connection(hppre2_sub, 'out1', v1, 'in1', label='38') c42 = Connection(hppre1, 'out1', hppre1_sub, 'in1', label='42') c43 = Connection(hppre1_sub, 'out1', v2, 'in1', label='43') c47 = Connection(lppre3, 'out1', lppre3_sub, 'in1', label='47') c48 = Connection(lppre3_sub, 'out1', v3, 'in1', label='48') c52 = Connection(lppre2, 'out1', lppre2_sub, 'in1', label='52') c53 = Connection(lppre2_sub, 'out1', v4, 'in1', label='53') c57 = Connection(lppre1, 'out1', lppre1_sub, 'in1', label='57') c58 = Connection(lppre1_sub, 'out1', v5, 'in1', label='58') self.nw.add_conns(c19, c20, c21, c22, c23, c24, c27, c28, c29, c30, c37, c38, c42, c43, c47, c48, c52, c53, c57, c58) # specification of missing parameters c19.set_attr(p=14.755) c21.set_attr(p=9.9975, state='l') c23.set_attr(p=8.7012, state='l') c27.set_attr(p=125) c29.set_attr(p=112) # solve final state self.nw.solve(mode='design')
# mean geothermal temperature (mean value of ground feed and return flow) Tgeo = 9.5 nw = Network(fluids=['water', 'R410A'], T_unit='C', p_unit='bar', h_unit='kJ / kg', m_unit='kg / s') # %% components cc = CycleCloser('cycle closer') # heat pump system cd = Condenser('condenser') va = Valve('valve') ev = HeatExchanger('evaporator') cp = Compressor('compressor') # geothermal heat collector gh_in = Source('ground heat feed flow') gh_out = Sink('ground heat return flow') ghp = Pump('ground heat loop pump') # heating system hs_feed = Sink('heating system feed flow') hs_ret = Source('heating system return flow') hsp = Pump('heating system pump') # %% connections
def __init__(self): self.nw = Network(fluids=['BICUBIC::water'], p_unit='bar', T_unit='C', h_unit='kJ / kg', iterinfo=False) # components # main cycle eco = HeatExchangerSimple('economizer') eva = HeatExchangerSimple('evaporator') sup = HeatExchangerSimple('superheater') cc = CycleCloser('cycle closer') hpt = Turbine('high pressure turbine') sp1 = Splitter('splitter 1', num_out=2) mpt = Turbine('mid pressure turbine') sp2 = Splitter('splitter 2', num_out=2) lpt = Turbine('low pressure turbine') con = Condenser('condenser') pu1 = Pump('feed water pump') fwh1 = Condenser('feed water preheater 1') fwh2 = Condenser('feed water preheater 2') dsh = Desuperheater('desuperheater') me2 = Merge('merge2', num_in=2) pu2 = Pump('feed water pump 2') pu3 = Pump('feed water pump 3') me = Merge('merge', num_in=2) # cooling water cwi = Source('cooling water source') cwo = Sink('cooling water sink') # connections # main cycle cc_hpt = Connection(cc, 'out1', hpt, 'in1', label='feed steam') hpt_sp1 = Connection(hpt, 'out1', sp1, 'in1', label='extraction1') sp1_mpt = Connection(sp1, 'out1', mpt, 'in1', state='g') mpt_sp2 = Connection(mpt, 'out1', sp2, 'in1', label='extraction2') sp2_lpt = Connection(sp2, 'out1', lpt, 'in1') lpt_con = Connection(lpt, 'out1', con, 'in1') con_pu1 = Connection(con, 'out1', pu1, 'in1') pu1_fwh1 = Connection(pu1, 'out1', fwh1, 'in2') fwh1_me = Connection(fwh1, 'out2', me, 'in1', state='l') me_fwh2 = Connection(me, 'out1', fwh2, 'in2', state='l') fwh2_dsh = Connection(fwh2, 'out2', dsh, 'in2', state='l') dsh_me2 = Connection(dsh, 'out2', me2, 'in1') me2_eco = Connection(me2, 'out1', eco, 'in1', state='l') eco_eva = Connection(eco, 'out1', eva, 'in1') eva_sup = Connection(eva, 'out1', sup, 'in1') sup_cc = Connection(sup, 'out1', cc, 'in1') self.nw.add_conns(cc_hpt, hpt_sp1, sp1_mpt, mpt_sp2, sp2_lpt, lpt_con, con_pu1, pu1_fwh1, fwh1_me, me_fwh2, fwh2_dsh, dsh_me2, me2_eco, eco_eva, eva_sup, sup_cc) # cooling water cwi_con = Connection(cwi, 'out1', con, 'in2') con_cwo = Connection(con, 'out2', cwo, 'in1') self.nw.add_conns(cwi_con, con_cwo) # preheating sp1_dsh = Connection(sp1, 'out2', dsh, 'in1') dsh_fwh2 = Connection(dsh, 'out1', fwh2, 'in1') fwh2_pu2 = Connection(fwh2, 'out1', pu2, 'in1') pu2_me2 = Connection(pu2, 'out1', me2, 'in2') sp2_fwh1 = Connection(sp2, 'out2', fwh1, 'in1') fwh1_pu3 = Connection(fwh1, 'out1', pu3, 'in1') pu3_me = Connection(pu3, 'out1', me, 'in2') self.nw.add_conns(sp1_dsh, dsh_fwh2, fwh2_pu2, pu2_me2, sp2_fwh1, fwh1_pu3, pu3_me) # busses # power bus self.power = Bus('power') self.power.add_comps({ 'comp': hpt, 'char': -1 }, { 'comp': mpt, 'char': -1 }, { 'comp': lpt, 'char': -1 }, { 'comp': pu1, 'char': -1 }, { 'comp': pu2, 'char': -1 }, { 'comp': pu3, 'char': -1 }) # heating bus self.heat = Bus('heat') self.heat.add_comps({ 'comp': eco, 'char': 1 }, { 'comp': eva, 'char': 1 }, { 'comp': sup, 'char': 1 }) self.nw.add_busses(self.power, self.heat) # parametrization # components hpt.set_attr(eta_s=0.9) mpt.set_attr(eta_s=0.9) lpt.set_attr(eta_s=0.9) pu1.set_attr(eta_s=0.8) pu2.set_attr(eta_s=0.8) pu3.set_attr(eta_s=0.8) eco.set_attr(pr=0.99) eva.set_attr(pr=0.99) sup.set_attr(pr=0.99) con.set_attr(pr1=1, pr2=0.99, ttd_u=5) fwh1.set_attr(pr1=1, pr2=0.99, ttd_u=5) fwh2.set_attr(pr1=1, pr2=0.99, ttd_u=5) dsh.set_attr(pr1=0.99, pr2=0.99) # connections eco_eva.set_attr(x=0) eva_sup.set_attr(x=1) cc_hpt.set_attr(m=200, T=650, p=100, fluid={'water': 1}) hpt_sp1.set_attr(p=20) mpt_sp2.set_attr(p=3) lpt_con.set_attr(p=0.05) cwi_con.set_attr(T=20, p=10, fluid={'water': 1}) # test run self.nw.solve('design') document_model(self.nw)
def __init__(self, working_fluid): """Set up model.""" self.working_fluid = working_fluid fluids = ['water', self.working_fluid, 'air'] self.nw = Network(fluids=fluids) self.nw.set_attr(p_unit='bar', T_unit='C', h_unit='kJ / kg') # geo parameters self.geo_mass_flow = 200 geo_steam_share = 0.1 self.T_brine_in = 140 # ambient parameters self.T_amb = 5 self.p_amb = 0.6 # main components geo_steam = Source('geosteam source') geo_brine = Source('geobrine source') geo_reinjection = Sink('re-injection') air_in = Source('air source') air_out = Sink('air sink') air_fan = Compressor('air fan') air_cond = Condenser('condenser') orc_cc = CycleCloser('orc cycle closer') evap_splitter = Splitter('splitter evaporation') evap_merge = Merge('merge evaporation') evap_steam = Condenser('geosteam evaporator') evap_brine = HeatExchanger('geobrine evaporator') dr = Drum('drum') geo_merge = Merge('merge brine') pre = HeatExchanger('preheater') feed_working_fluid_pump = Pump('feed pump') tur = Turbine('turbine') ihe = HeatExchanger('internal heat exchanger') # busses net_power = Bus('net power output') net_power.add_comps( {'comp': tur, 'char': 0.97}, {'comp': feed_working_fluid_pump, 'char': 0.97, 'base': 'bus'}, {'comp': air_fan, 'char': 0.97, 'base': 'bus'} ) ORC_power_bus = Bus('cycle gross power output') ORC_power_bus.add_comps( {'comp': tur}, {'comp': feed_working_fluid_pump} ) geothermal_bus = Bus('thermal input') geothermal_bus.add_comps( {'comp': pre, 'char': -1}, {'comp': evap_brine, 'char': -1}, {'comp': evap_steam, 'char': -1} ) self.nw.add_busses(net_power, ORC_power_bus, geothermal_bus) # turbine to condenser c1 = Connection(orc_cc, 'out1', tur, 'in1', label='1') c2 = Connection(tur, 'out1', ihe, 'in1', label='2') c3 = Connection(ihe, 'out1', air_cond, 'in1', label='3') self.nw.add_conns(c1, c2, c3) # condenser to steam generator c4 = Connection(air_cond, 'out1', feed_working_fluid_pump, 'in1', label='4') c5 = Connection(feed_working_fluid_pump, 'out1', ihe, 'in2', label='5') self.nw.add_conns(c4, c5) # steam generator c6 = Connection(ihe, 'out2', pre, 'in2', label='6') c7 = Connection(pre, 'out2', dr, 'in1', label='7') c8 = Connection(dr, 'out1', evap_splitter, 'in1', label='8') c9 = Connection(evap_splitter, 'out2', evap_steam, 'in2', label='9') c10 = Connection(evap_steam, 'out2', evap_merge, 'in2', label='10') c11 = Connection(evap_splitter, 'out1', evap_brine, 'in2', label='11') c12 = Connection(evap_brine, 'out2', evap_merge, 'in1', label='12') c13 = Connection(evap_merge, 'out1', dr, 'in2', label='13') c0 = Connection(dr, 'out2', orc_cc, 'in1', label='0') self.nw.add_conns(c6, c7, c8, c11, c9, c12, c10, c13, c0) # condenser cold side c20 = Connection(air_in, 'out1', air_fan, 'in1', label='20') c21 = Connection(air_fan, 'out1', air_cond, 'in2', label='21') c22 = Connection(air_cond, 'out2', air_out, 'in1', label='22') self.nw.add_conns(c20, c21, c22) # geo source c30 = Connection(geo_steam, 'out1', evap_steam, 'in1', label='30') c31 = Connection(evap_steam, 'out1', geo_merge, 'in1', label='31') c32 = Connection(geo_brine, 'out1', geo_merge, 'in2', label='32') c33 = Connection(geo_merge, 'out1', evap_brine, 'in1', label='33') self.nw.add_conns(c30, c31, c32, c33) c34 = Connection(evap_brine, 'out1', pre, 'in1', label='34') c35 = Connection(pre, 'out1', geo_reinjection, 'in1', label='35') self.nw.add_conns(c34, c35) # generate a set of stable starting values of every working fluid # fluid settings c6.set_attr(fluid={self.working_fluid: 1.0, 'air': 0.0, 'water': 0.0}) c20.set_attr(fluid={self.working_fluid: 0.0, 'air': 1.0, 'water': 0.0}) c30.set_attr(fluid={self.working_fluid: 0.0, 'air': 0.0, 'water': 1.0}) c32.set_attr(fluid={self.working_fluid: 0.0, 'air': 0.0, 'water': 1.0}) # connection parameters p0 = PSI('P', 'T', self.T_brine_in + 273.15, 'Q', 1, self.working_fluid) c1.set_attr(p0=p0 / 1e5) ws_stable_h0 = ( PSI('H', 'T', self.T_amb + 273.15, 'Q', 1, self.working_fluid) + 0.5 * ( PSI('H', 'T', self.T_brine_in + 273.15, 'Q', 1, self.working_fluid) - PSI('H', 'T', self.T_amb + 273.15, 'Q', 1, self.working_fluid) ) ) / 1e3 c2.set_attr(h=ws_stable_h0) p0 = PSI('P', 'T', self.T_amb + 273.15, 'Q', 1, self.working_fluid) c3.set_attr(Td_bp=5, design=['Td_bp'], p0=p0 / 1e5) c5.set_attr(h=Ref(c4, 1, 1)) # steam generator c30.set_attr( m=self.geo_mass_flow * geo_steam_share, T=self.T_brine_in, x=1, p0=5) c32.set_attr( m=self.geo_mass_flow * (1 - geo_steam_share), T=self.T_brine_in, x=0) c13.set_attr() c12.set_attr(x=0.5) c10.set_attr(x=0.5, design=['x']) c34.set_attr(h=Ref(c33, 1, -50)) c7.set_attr(Td_bp=-2) # main condenser c20.set_attr(p=self.p_amb, T=self.T_amb) c22.set_attr(T=self.T_amb + 15, p=self.p_amb) # component parameters # condensing ihe.set_attr(pr1=0.98, pr2=0.98) air_cond.set_attr(pr1=1, pr2=0.995, ttd_u=10) air_fan.set_attr(eta_s=0.6) # steam generator evap_brine.set_attr(pr1=0.98, ttd_l=8) pre.set_attr(pr1=0.98, pr2=0.98) self.nw.set_attr(iterinfo=False) self.nw.solve('design') self.nw.save('stable_' + self.working_fluid) # specify actual parameters tur.set_attr(eta_s=0.9) feed_working_fluid_pump.set_attr(eta_s=0.75) c2.set_attr(h=None) c5.set_attr(h=None) c34.set_attr(h=None, T=Ref(c33, 1, -10)) self.nw.solve('design') c22.set_attr(T=None) c3.set_attr(Td_bp=None) self.ude_IHE_size = UserDefinedEquation( label='ihe deshuperheat ratio', func=desuperheat, deriv=desuperheat_deriv, latex={ 'equation': r'0 = h_3 - h_2 - x_\mathrm{IHE} \cdot \left(h_3 -' r'h\left(p_2, T_5 + \Delta T_\mathrm{t,u,min} \right)' r'\right)'}, conns=[ self.nw.get_conn('2'), self.nw.get_conn('3'), self.nw.get_conn('5')], params={'distance': 0.0, 'ttd_min': 2} ) if self.nw.lin_dep or self.nw.res[-1] > 1e-3: msg = 'No stable solution found.' raise TESPyNetworkError(msg) print( 'Generated stable starting values for working fluid ' + self.working_fluid + '.')
def test_Condenser(self): """Test component properties of Condenser.""" instance = Condenser('condenser') self.setup_HeatExchanger_network(instance) # design specification instance.set_attr(pr1=0.98, pr2=0.98, ttd_u=5, offdesign=['zeta2', 'kA_char']) self.c1.set_attr(T=100, p0=0.5, fluid={'Ar': 0, 'H2O': 1, 'S800': 0}) self.c3.set_attr(T=30, p=5, fluid={'Ar': 0, 'H2O': 1, 'S800': 0}) self.c4.set_attr(T=40) instance.set_attr(Q=-80e3) self.nw.solve('design') convergence_check(self.nw.lin_dep) self.nw.save('tmp') Q_design = instance.Q.val # test specified kA value instance.set_attr(kA=instance.kA.val * 2 / 3, Q=None) self.nw.solve('design') convergence_check(self.nw.lin_dep) # test heat transfer Q = self.c1.m.val_SI * (self.c2.h.val_SI - self.c1.h.val_SI) msg = ( 'Value of heat flow must be ' + str(round(Q_design * 2 / 3, 0)) + ', is ' + str(round(Q, 0)) + '.') assert round(Q, 1) == round(Q_design * 2 / 3, 1), msg # back to design case instance.set_attr(kA=None, Q=Q_design) self.nw.solve('design') convergence_check(self.nw.lin_dep) # test heat transfer Q = self.c1.m.val_SI * (self.c2.h.val_SI - self.c1.h.val_SI) msg = ('Value of heat flow must be ' + str(round(instance.Q.val, 0)) + ', is ' + str(round(Q, 0)) + '.') assert round(Q, 1) == round(instance.Q.val, 1), msg # test upper terminal temperature difference. For the component # condenser the temperature of the condensing fluid is relevant. ttd_u = round(T_bp_p(self.c1.get_flow()) - self.c4.T.val_SI, 1) p = round(self.c1.p.val_SI, 5) msg = ('Value of terminal temperature difference must be ' + str(round(instance.ttd_u.val, 1)) + ', is ' + str(ttd_u) + '.') assert ttd_u == round(instance.ttd_u.val, 1), msg # test lower terminal temperature difference instance.set_attr(ttd_l=20, ttd_u=np.nan, design=['pr2', 'ttd_l']) self.nw.solve('design') convergence_check(self.nw.lin_dep) msg = ('Value of terminal temperature difference must be ' + str(instance.ttd_l.val) + ', is ' + str(self.c2.T.val - self.c3.T.val) + '.') ttd_l_calc = round(self.c2.T.val - self.c3.T.val, 1) ttd_l = round(instance.ttd_l.val, 1) assert ttd_l_calc == ttd_l, msg # check kA value with condensing pressure in offdesign mode: # no changes to design point means: identical pressure self.nw.solve('offdesign', design_path='tmp') convergence_check(self.nw.lin_dep) msg = ('Value of condensing pressure be ' + str(p) + ', is ' + str(round(self.c1.p.val_SI, 5)) + '.') assert p == round(self.c1.p.val_SI, 5), msg shutil.rmtree('./tmp', ignore_errors=True)
import numpy as np # %% network fluids = ['water'] nw = Network(fluids=fluids) nw.set_attr( p_unit='bar', T_unit='C', h_unit='kJ / kg', p_range=[0.01, 150], h_range=[10, 5000]) # %% 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') ws = Connection(turb, 'out1', con, 'in1') cond = Connection(con, 'out1', pu, 'in1') fw = Connection(pu, 'out1', steam_generator, 'in1')
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') drum = Drum('drum') eco = HeatExchanger('economizer') ch = Sink('chimney') # steam turbine part turb_hp = Turbine('steam turbine high pressure') cond_dh = Condenser('district heating condenser') mp_split = Splitter('mp split') turb_lp = Turbine('steam turbine low pressure') cond = Condenser('condenser') merge = Merge('merge') pump1 = Pump('feed water pump 1') pump2 = Pump('feed water pump 2') ls_out = Sink('ls sink') ls_in = Source('ls source') mp_valve = Valve('mp valve') # district heating dh_in = Source('district heating backflow') dh_out = Sink('district heating feedflow') # cooling water
fluid_list = ['BICUBIC::H2O'] nw = Network(fluids=fluid_list, p_unit='bar', T_unit='C', h_unit='kJ / kg', v_unit='l / s', iterinfo=False) T_dh_in = 50 T_dh_out = 124 # might change due to 4GDH # %% components st = Turbine('steam Turbine') con = Condenser('Condenser') pu = Pump('feed water Pump') sg1 = HeatExchangerSimple('steam generator: feed water heater') sg2 = HeatExchangerSimple('steam generator: evaporater') sg3 = HeatExchangerSimple('steam generator: superheater') cc = CycleCloser('cycle closer') dh_Source = Source('district heating Source') dh_Sink = Sink('district heating Sink') # %% Connection # steam part cc_st = Connection(cc, 'out1', st, 'in1') st_con = Connection(st, 'out1', con, 'in1') con_pu = Connection(con, 'out1', pu, 'in1')
# %% network fluids = ['water'] nw = Network(fluids=fluids, p_unit='bar', T_unit='C', h_unit='kJ / kg', iterinfo=False) # %% components # turbine part valve_turb = Valve('turbine inlet valve') turbine_hp = Turbine('high pressure turbine') split = Splitter('extraction splitter') turbine_lp = Turbine('low pressure turbine') # condenser and preheater cond = Condenser('condenser') preheater = Condenser('preheater') merge_ws = Merge('waste steam merge') valve_pre = Valve('preheater valve') # feed water pump = Pump('pump') steam_generator = HeatExchangerSimple('steam generator') closer = CycleCloser('cycle closer') # source and sink for cooling water source_cw = Source('source_cw') sink_cw = Sink('sink_cw') # %% connections