Source code for hyperloop.Python.pod.magnetic_levitation.levitation_group

from openmdao.api import Group, Component, Problem, IndepVarComp, ExecComp, ScipyOptimizer
from hyperloop.Python.pod.magnetic_levitation.breakpoint_levitation import BreakPointDrag
from hyperloop.Python.pod.magnetic_levitation.breakpoint_levitation import MagMass
from hyperloop.Python.pod.magnetic_levitation.magnetic_drag import MagDrag

[docs]class LevGroup(Group): """The Levitation group represents a `Group` of the size of magnets required for levitation at breakpoint velocity, and the magnetic drag resulting from this levitation at a given speed. These values are computed in an OpenMDAO model. Models the levitation parameters following previous work from [1]_ Components ---------- Drag : BreakPointDrag Represents the drag and magnetic parameters need for levitation at breakpoint speed. Mass : MagMass Represents the mass of magnets needed for levitation at breakpoint speed. MDrag : MagDrag Represents the magnetic drag acquired from levitation at a given speed. Params ------ m_pod : float mass of the pod (kg) l_pod : float length of the pod (m) d_pod : float diameter of the pod (m) vel_b : float desired breakpoint levitation speed (m/s) h_lev : float Levitation height. Default value is .01 vel : float desired magnetic drag speed (m/s) Outputs ------- mag_drag : float magnetic drag from levitation system (N) total_pod_mass : float total mass of the pod including magnets (kg) References ---------- .. [1] Friend, Paul. Magnetic Levitation Train Technology 1. Thesis. Bradley University, 2004. N.p.: n.p., n.d. Print. """ def __init__(self): super(LevGroup, self).__init__() # Creates components of the group. self.add('Drag', BreakPointDrag(), promotes=['m_pod', 'd_pod', 'l_pod', 'vel_b', 'h_lev']) self.add('Mass', MagMass(), promotes=['total_pod_mass']) self.add('MDrag', MagDrag(), promotes=['vel', 'mag_drag']) # Connects promoted group params to rest of group self.connect('m_pod', 'Mass.m_pod') self.connect('d_pod', 'Mass.d_pod') self.connect('l_pod', 'Mass.l_pod') # Connect Drag outputs to MDrag inputs self.connect('Drag.track_res', 'MDrag.track_res') self.connect('Drag.track_ind', 'MDrag.track_ind') self.connect('Drag.pod_weight', 'MDrag.pod_weight') self.connect('Drag.lam', 'MDrag.lam')
if __name__ == "__main__": prob = Problem() root = prob.root = Group() root.add('lev', LevGroup()) # Define Parameters params = (('m_pod', 3000.0, {'units': 'kg'}), ('l_pod', 22.0, {'units': 'm'}), ('d_pod', 1.0, {'units': 'm'}), ('vel_b', 23.0, {'units': 'm/s'}), ('h_lev', 0.01, {'unit': 'm'}), ('vel', 350.0, {'units': 'm/s'})) prob.root.add('input_vars', IndepVarComp(params)) # Constraint Equation #root.add('con1', ExecComp('c1 = (fyu - m_pod * g)/1e5')) # Connect #prob.root.connect('lev.Drag.fyu', 'con1.fyu') #prob.root.connect('lev.Drag.g', 'con1.g') prob.root.connect('input_vars.m_pod', 'lev.m_pod') #prob.root.connect('lev.m_pod', 'con1.m_pod') prob.root.connect('input_vars.l_pod', 'lev.l_pod') prob.root.connect('input_vars.d_pod', 'lev.d_pod') prob.root.connect('input_vars.vel_b', 'lev.vel_b') prob.root.connect('input_vars.h_lev', 'lev.h_lev') prob.root.connect('input_vars.vel', 'lev.vel') # Finite Difference #root.deriv_options['type'] = 'fd' #root.fd_options['form'] = 'forward' #root.fd_options['step_size'] = 1.0e-6 # Optimizer Driver #top.driver = ScipyOptimizer() #top.driver.options['optimizer'] = 'COBYLA' # Design Variables #top.driver.add_desvar('input_vars.mag_thk', lower=.01, upper=.15, scaler=100) #top.driver.add_desvar('input_vars.gamma', lower=0.1, upper=1.0) # Add Constraint #top.driver.add_constraint('con1.c1', lower=0.0) # Problem Objective #alpha = .5 #root.add('obj_cmp', ExecComp('obj = (alpha*fxu)/1000 + ((1-alpha)*m_mag)')) #prob.root.connect('lev.Drag.fxu', 'obj_cmp.fxu') #prob.root.connect('lev.m_mag', 'obj_cmp.m_mag') #top.driver.add_objective('obj_cmp.obj') prob.setup() #prob.root.list_connections() #from openmdao.api import view_tree #view_tree(prob) prob.run() print('Mag_drag %f N' % prob['lev.mag_drag']) print('Total pod mass %f kg' % prob['lev.total_pod_mass'])