def setup(self):
     nn = self.options['num_nodes']
     eff = self.options['efficiency']
     self.add_subsystem('coolant_temps',
                        PerfectHeatTransferComp(num_nodes=nn),
                        promotes=['T_in', 'mdot_coolant', 'T_out'])
     self.add_subsystem('electrical_loss',
                        ElementMultiplyDivideComp(
                            'elec_load',
                            input_names=['motor_power'],
                            vec_size=nn,
                            scaling_factor=(1 - eff),
                            input_units=['W']),
                        promotes=['*'])
     self.connect('elec_load', 'coolant_temps.q')
     self.add_subsystem('duct_pressure',
                        AddSubtractComp('delta_p_stack',
                                        input_names=[
                                            'delta_p_motor_hx',
                                            'delta_p_fault_prot_hx'
                                        ],
                                        vec_size=nn,
                                        units='Pa'),
                        promotes=['*'])
     self.add_subsystem('heat_transfer',
                        AddSubtractComp('heat_transfer',
                                        input_names=[
                                            'heat_transfer_motor_hx',
                                            'heat_transfer_fault_prot_hx'
                                        ],
                                        vec_size=nn,
                                        units='W'),
                        promotes=['*'])
    def test(self):
        """
        A simple example to compute the resultant force on an aircraft and demonstrate the AddSubtract component
        """
        import numpy as np
        #from openmdao.api import Problem, Group, IndepVarComp
        from openconcept.utilities.math.add_subtract_comp import AddSubtractComp
        from openmdao.utils.assert_utils import assert_rel_error

        n = 3

        p = Problem(model=Group())

        ivc = IndepVarComp()
        #the vector represents forces at 3 analysis points (rows) in 2 dimensional plane (cols)
        ivc.add_output(name='thrust', shape=(n, 2), units='kN')
        ivc.add_output(name='drag', shape=(n, 2), units='kN')
        ivc.add_output(name='lift', shape=(n, 2), units='kN')
        ivc.add_output(name='weight', shape=(n, 2), units='kN')
        p.model.add_subsystem(
            name='ivc',
            subsys=ivc,
            promotes_outputs=['thrust', 'drag', 'lift', 'weight'])

        #construct an adder/subtracter here. create a relationship through the add_equation method
        adder = AddSubtractComp()
        adder.add_equation('total_force',
                           input_names=['thrust', 'drag', 'lift', 'weight'],
                           vec_size=n,
                           length=2,
                           scaling_factors=[1, -1, 1, -1],
                           units='kN')
        #note the scaling factors. we assume all forces are positive sign upstream

        p.model.add_subsystem(name='totalforcecomp', subsys=adder)

        p.model.connect('thrust', 'totalforcecomp.thrust')
        p.model.connect('drag', 'totalforcecomp.drag')
        p.model.connect('lift', 'totalforcecomp.lift')
        p.model.connect('weight', 'totalforcecomp.weight')

        p.setup()

        #set thrust to exceed drag, weight to equal lift for this scenario
        p['thrust'][:, 0] = [500, 600, 700]
        p['drag'][:, 0] = [400, 400, 400]
        p['weight'][:, 1] = [1000, 1001, 1002]
        p['lift'][:, 1] = [1000, 1000, 1000]

        p.run_model()

        # print(p.get_val('totalforcecomp.total_force', units='kN'))

        # Verify the results
        expected_i = np.array([[100, 200, 300], [0, -1, -2]]).T
        assert_rel_error(self,
                         p.get_val('totalforcecomp.total_force', units='kN'),
                         expected_i)
Beispiel #3
0
    def promote_add(self,
                    sources,
                    prom_name,
                    promoted_sources=[],
                    factors=None,
                    vec_size=1,
                    units=None,
                    length=1,
                    val=1.0,
                    res_units=None,
                    desc='',
                    lower=None,
                    upper=None,
                    ref=1.0,
                    ref0=0.0,
                    res_ref=None):
        """Helper function called during setup"""
        add_index = self._n_auto_comps
        self._n_auto_comps += 1
        adder = AddSubtractComp()
        n_inputs = len(sources) + len(promoted_sources)
        if factors is None:
            factors = np.ones(n_inputs)
        adder.add_equation(
            output_name=prom_name,
            input_names=['_temp' + str(i) for i in range(n_inputs)],
            scaling_factors=factors,
            vec_size=vec_size,
            units=units,
            length=length,
            val=val,
            res_units=res_units,
            desc=desc,
            lower=lower,
            upper=upper,
            ref=ref,
            ref0=ref0,
            res_ref=res_ref)
        adder_name = 'add' + str(add_index)
        prom_in = []
        for i, promoted_source in enumerate(promoted_sources):
            prom_in.append(('_temp' + str(i + len(sources)), promoted_source))

        self.add_subsystem(adder_name,
                           adder,
                           promotes_inputs=prom_in,
                           promotes_outputs=['*'])
        for i, source in enumerate(sources):
            self.connect(source, adder_name + '._temp' + str(i))
    def setUp(self):
        self.nn = 5

        self.p = Problem(model=Group())

        ivc = IndepVarComp()
        ivc.add_output(name='a', shape=(self.nn,))
        ivc.add_output(name='b', val=3.0)

        self.p.model.add_subsystem(name='ivc',
                                   subsys=ivc,
                                   promotes_outputs=['a', 'b'])

        adder=self.p.model.add_subsystem(name='add_subtract_comp',
                                   subsys=AddSubtractComp())
        adder.add_equation('adder_output',['input_a','input_b'],vec_size=[self.nn,1])

        self.p.model.connect('a', 'add_subtract_comp.input_a')
        self.p.model.connect('b', 'add_subtract_comp.input_b')

        self.p.setup(force_alloc_complex=True)

        self.p['a'] = np.random.rand(self.nn,)

        self.p.run_model()
    def setUp(self):
        self.nn = 5

        self.p = Problem(model=Group())

        ivc = IndepVarComp()
        ivc.add_output(name='a', shape=(self.nn, 3), units='ft')
        ivc.add_output(name='b', shape=(self.nn, 3), units='m')
        ivc.add_output(name='c', shape=(self.nn, 3), units='m')

        self.p.model.add_subsystem(name='ivc',
                                   subsys=ivc,
                                   promotes_outputs=['a', 'b', 'c'])

        adder = self.p.model.add_subsystem(name='add_subtract_comp',
                                           subsys=AddSubtractComp())
        adder.add_equation('adder_output', ['input_a', 'input_b', 'input_c'],
                           vec_size=self.nn,
                           length=3,
                           units='ft')

        self.p.model.connect('a', 'add_subtract_comp.input_a')
        self.p.model.connect('b', 'add_subtract_comp.input_b')
        self.p.model.connect('c', 'add_subtract_comp.input_c')

        self.p.setup()

        self.p['a'] = np.random.rand(self.nn, 3)
        self.p['b'] = np.random.rand(self.nn, 3)
        self.p['c'] = np.random.rand(self.nn, 3)

        self.p.run_model()
    def setUp(self):
        self.nn = 5
        self.p = Problem(model=Group())

        ivc = IndepVarComp()
        ivc.add_output(name='a', shape=(self.nn, 3))
        ivc.add_output(name='b', shape=(self.nn, 3))
        ivc.add_output(name='c', shape=(self.nn, 3))

        self.p.model.add_subsystem(name='ivc',
                                   subsys=ivc,
                                   promotes_outputs=['a', 'b','c'])

        adder=self.p.model.add_subsystem(name='add_subtract_comp',
                                   subsys=AddSubtractComp())
        adder.add_equation('adder_output',['input_a','input_b','input_c'],vec_size=self.nn,length=3,scaling_factors=[1,-1])

        self.p.model.connect('a', 'add_subtract_comp.input_a')
        self.p.model.connect('b', 'add_subtract_comp.input_b')
        self.p.model.connect('c', 'add_subtract_comp.input_c')
Beispiel #7
0
    def setup(self):
        nn = self.options['num_nodes']

        iv = self.add_subsystem('dv', IndepVarComp(), promotes_outputs=['cp','*_1','*_2','*_3','*_nozzle','convergence_hack'])
        iv.add_output('cp', val=1002.93, units='J/kg/K')

        iv.add_output('area_1', val=60, units='inch**2')
        iv.add_output('delta_p_1', val=np.zeros((nn,)), units='Pa')
        iv.add_output('heat_in_1', val=np.zeros((nn,)), units='W')
        iv.add_output('pressure_recovery_1', val=np.ones((nn,)))

        iv.add_output('delta_p_2', val=np.ones((nn,))*0., units='Pa')
        iv.add_output('heat_in_2', val=np.ones((nn,))*0., units='W')
        iv.add_output('pressure_recovery_2', val=np.ones((nn,)))

        iv.add_output('pressure_recovery_3', val=np.ones((nn,)))

        iv.add_output('area_nozzle', val=58*np.ones((nn,)), units='inch**2')
        iv.add_output('convergence_hack', val=-40, units='Pa')

        self.add_subsystem('inlet', Inlet(num_nodes=nn),
                           promotes_inputs=[('p','p_inf'),('T','T_inf'),'Utrue'])

        self.add_subsystem('sta1', DuctStation(num_nodes=nn), promotes_inputs=['mdot','cp',
                                                                               ('area','area_1'),
                                                                               ('delta_p','delta_p_1'),
                                                                               ('heat_in','heat_in_1'),
                                                                               ('factor_p','pressure_recovery_1')])
        self.connect('inlet.pt','sta1.pt_in')
        self.connect('inlet.Tt','sta1.Tt_in')


        self.add_subsystem('sta2', DuctStation(num_nodes=nn), promotes_inputs=['mdot','cp',
                                                                               ('area','area_2'),
                                                                               ('delta_p','delta_p_2'),
                                                                               ('heat_in','heat_in_2'),
                                                                               ('factor_p','pressure_recovery_2')])
        self.connect('sta1.pt_out','sta2.pt_in')
        self.connect('sta1.Tt_out','sta2.Tt_in')

        self.add_subsystem('hx', HXGroup(num_nodes=nn), promotes_inputs=[('mdot_cold','mdot'),'mdot_hot','T_in_hot','rho_hot'],
                                                        promotes_outputs=['T_out_hot'])
        self.connect('sta2.T','hx.T_in_cold')
        self.connect('sta2.rho','hx.rho_cold')

        self.add_subsystem('sta3', DuctStation(num_nodes=nn), promotes_inputs=['mdot','cp',
                                                                               ('factor_p','pressure_recovery_3'),
                                                                               ('area','area_3')])
        self.connect('sta2.pt_out','sta3.pt_in')
        self.connect('sta2.Tt_out','sta3.Tt_in')
        self.connect('hx.delta_p_cold','sta3.delta_p')
        self.connect('hx.heat_transfer','sta3.heat_in')
        self.connect('hx.frontal_area',['area_2','area_3'])
        self.add_subsystem('pexit',AddSubtractComp(output_name='p_exit',input_names=['p_inf','convergence_hack'],vec_size=[nn,1],units='Pa'),promotes_inputs=['*'],promotes_outputs=['*'])
        self.add_subsystem('nozzle', OutletNozzle(num_nodes=nn),
                                                  promotes_inputs=['p_exit',('area','area_nozzle')],
                                                  promotes_outputs=['mdot'])
        self.connect('sta3.pt_out','nozzle.pt')
        self.connect('sta3.Tt_out','nozzle.Tt')

        self.add_subsystem('force', NetForce(num_nodes=nn), promotes_inputs=['mdot','p_inf',('Utrue_inf','Utrue'),'area_nozzle'])
        self.connect('nozzle.p','force.p_nozzle')
        self.connect('nozzle.rho','force.rho_nozzle')