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)
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')
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')