예제 #1
0
def test_network_missing_data_in_individual_design_case_file():
    """
    Test for missing data in individual design case files.
    """
    nw = network(['water'])
    source = basics.source('source')
    pipe = piping.pipe('pipe', Q=0, pr=0.95, design=['pr'], offdesign=['zeta'])
    sink = basics.sink('sink')
    a = connection(source,
                   'out1',
                   pipe,
                   'in1',
                   m=1,
                   p=1e5,
                   T=293.15,
                   fluid={'water': 1})
    b = connection(pipe, 'out1', sink, 'in1', design_path='tmp2')
    nw.add_conns(a, b)
    nw.solve('design')
    nw.save('tmp')
    nw.save('tmp2')

    inputs = open('./tmp/conn.csv')
    all_lines = inputs.readlines()
    all_lines.pop(len(all_lines) - 1)
    inputs.close()

    with open('./tmp2/conn.csv', 'w') as out:
        for line in all_lines:
            out.write(line.strip() + '\n')

    offdesign_TESPyNetworkError(nw, design_path='tmp', init_only=True)

    shutil.rmtree('./tmp', ignore_errors=True)
    shutil.rmtree('./tmp2', ignore_errors=True)
예제 #2
0
    def setup_pipeline_network(self, fluid_list):
        """Setup a pipeline network."""
        self.nw = network(fluids=fluid_list)
        self.nw.set_attr(p_unit='bar', T_unit='C', iterinfo=False)

        # %% components

        # main components
        pu = pump('pump')
        pi = pipe('pipeline')
        es = heat_exchanger_simple('energy balance closing')

        closer = cycle_closer('cycle closer')

        pu_pi = connection(pu, 'out1', pi, 'in1')
        pi_es = connection(pi, 'out1', es, 'in1')
        es_closer = connection(es, 'out1', closer, 'in1')
        closer_pu = connection(closer, 'out1', pu, 'in1')
        self.nw.add_conns(pu_pi, pi_es, es_closer, closer_pu)

        # %% parametrization of components

        pu.set_attr(eta_s=0.7)
        pi.set_attr(pr=0.95, L=100, ks=1e-5, D='var', Q=0)
        es.set_attr(pr=1)

        # %% parametrization of connections

        pu_pi.set_attr(p=20, T=100, m=10, fluid={self.nw.fluids[0]: 1})

        # %% solving
        self.nw.solve('design')
예제 #3
0
 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)
예제 #4
0
    def test_network_missing_data_in_design_case_files(self):
        """Test for missing data in design case files."""
        self.setup_network_tests()
        pipe = piping.pipe('pipe', Q=0, pr=0.95, design=['pr'],
                           offdesign=['zeta'])
        a = connection(self.source, 'out1', pipe, 'in1', m=1, p=1, T=293.15,
                       fluid={'water': 1})
        b = connection(pipe, 'out1', self.sink, 'in1')
        self.nw.add_conns(a, b)
        self.nw.solve('design')
        self.nw.save('tmp')
        self.nw.save('tmp2')

        inputs = open('./tmp/connections.csv')
        all_lines = inputs.readlines()
        all_lines.pop(len(all_lines) - 1)
        inputs.close()

        with open('./tmp2/connections.csv', 'w') as out:
            for line in all_lines:
                out.write(line.strip() + '\n')

        self.offdesign_TESPyNetworkError(design_path='tmp2', init_only=True)

        shutil.rmtree('./tmp', ignore_errors=True)
        shutil.rmtree('./tmp2', ignore_errors=True)
예제 #5
0
    def setup(self):
        """
        Set up network for electrolyzer tests.
        """
        self.nw = network(['O2', 'H2', 'H2O'], T_unit='C', p_unit='bar')
        self.instance = water_electrolyzer('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_c=0.99)

        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', m=0.1, T=20, p=10)
        el_o2 = connection(self.instance, 'out2', o2, 'in1')
        el_h2 = connection(self.instance, 'out3', h2, 'in1', T=50)

        self.nw.add_conns(fw_el, el_o2, el_h2)
예제 #6
0
 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)
예제 #7
0
 def setup_combustion_chamber_stoich_error_tests(self):
     self.nw = network(['fuel', 'fuel_fg', 'Air'], p_range=[1e4, 1e6])
     label = 'combustion chamber'
     self.instance = combustion.combustion_chamber_stoich(label)
     c1 = connection(basics.source('air'), 'out1', self.instance, 'in1')
     c2 = connection(basics.source('fuel'), 'out1', self.instance, 'in2')
     c3 = connection(self.instance, 'out1', basics.sink('flue gas'), 'in1')
     self.nw.add_conns(c1, c2, c3)
예제 #8
0
    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 = basics.source('source')
        sp = nodes.splitter('splitter', num_out=2)
        self.pump1 = turbomachinery.pump('pump 1')
        self.sc1 = heat_exchangers.solar_collector('collector field 1')
        v1 = piping.valve('valve1')
        self.pump2 = turbomachinery.pump('pump 2')
        self.sc2 = heat_exchangers.solar_collector('collector field 2')
        v2 = piping.valve('valve2')
        me = nodes.merge('merge', num_in=2)
        si = basics.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)
예제 #9
0
 def test_duplicate_connection_labels(self):
     source1 = basics.source('source1')
     source2 = basics.source('source2')
     sink1 = basics.sink('sink1')
     sink2 = basics.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)
예제 #10
0
def test_combustion_chamber_missing_fuel():
    """Test no fuel in network."""
    nw = network(['H2O', 'N2', 'O2', 'Ar', 'CO2'])
    instance = combustion.combustion_chamber('combustion chamber')
    c1 = connection(basics.source('air'), 'out1', instance, 'in1')
    c2 = connection(basics.source('fuel'), 'out1', instance, 'in2')
    c3 = connection(instance, 'out1', basics.sink('flue gas'), 'in1')
    nw.add_conns(c1, c2, c3)
    with raises(TESPyComponentError):
        nw.solve('design', init_only=True)
예제 #11
0
def test_connection_creation_ValueError():
    """Test ValueErrors creating connections."""
    comb = combustion.combustion_engine('combustion engine')
    pipeline = piping.pipe('pipeline')

    with raises(ValueError):
        connection(comb, 'out6', pipeline, 'in1')

    with raises(ValueError):
        connection(comb, 'out1', pipeline, 'in5')
예제 #12
0
    def setup_heat_exchanger_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)
예제 #13
0
 def test_network_no_progress(self):
     """Test no convergence progress."""
     self.setup_network_tests()
     pipe = piping.pipe('pipe', pr=1, Q=-100e3)
     a = connection(self.source, 'out1', pipe, 'in1', m=1, p=1, T=280,
                    fluid={'water': 1})
     b = connection(pipe, 'out1', self.sink, 'in1')
     self.nw.add_conns(a, b)
     self.nw.solve('design')
     msg = ('This test must result in a calculation making no progress, as '
            'the pipe\'s outlet enthalpy is below fluid property range.')
     assert self.nw.progress is False, msg
예제 #14
0
 def test_network_max_iter(self):
     """Test reaching maximum iteration count."""
     self.setup_network_tests()
     pipe = piping.pipe('pipe', pr=1, Q=100e3)
     a = connection(self.source, 'out1', pipe, 'in1', m=1, p=1, T=280,
                    fluid={'water': 1})
     b = connection(pipe, 'out1', self.sink, 'in1')
     self.nw.add_conns(a, b)
     self.nw.solve('design', max_iter=2)
     msg = ('This test must result in the itercount being equal to the max '
            'iter statement.')
     assert self.nw.max_iter == self.nw.iter + 1, msg
예제 #15
0
def test_network_max_iter():
    nw = network(['water'])
    source = basics.source('source')
    pipe = piping.pipe('pipe', pr=1, Q=100e3)
    sink = basics.sink('sink')
    a = connection(source, 'out1', pipe, 'in1', m=1, p=1e5, T=280,
                   fluid={'water': 1})
    b = connection(pipe, 'out1', sink, 'in1')
    nw.add_conns(a, b)
    nw.solve('design', max_iter=2)
    msg = ('This test must result in the itercount being equal to the max '
           'iter statement.')
    eq_(nw.max_iter, nw.iter + 1, msg)
예제 #16
0
def test_network_no_progress():
    nw = network(['water'])
    source = basics.source('source')
    pipe = piping.pipe('pipe', pr=1, Q=-100e3)
    sink = basics.sink('sink')
    a = connection(source, 'out1', pipe, 'in1', m=1, p=1e5, T=280,
                   fluid={'water': 1})
    b = connection(pipe, 'out1', sink, 'in1')
    nw.add_conns(a, b)
    nw.solve('design')
    msg = ('This test must result in a calculation making no progress, as the '
           'pipe\'s outlet enthalpy is below fluid property range.')
    eq_(nw.progress, False, msg)
예제 #17
0
def test_turbine_missing_char_parameter():
    """Turbine with invalid parameter for eta_s_char function."""
    nw = network(['CH4'])
    so = basics.source('source')
    si = basics.sink('sink')
    instance = turbomachinery.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=dc_cc(
        func=char_line([0, 1], [1, 2]), is_set=True, param=None))
    nw.solve('design', init_only=True)
    with raises(ValueError):
        instance.eta_s_char_func()