Exemplo n.º 1
0
    def setup(self):
        m = self.m
        n = self.n

        param = IndepVarComp()
        param.add_output('LOS', self.LOS, units=None)
        param.add_output('temperature', self.temp, units='degK')
        param.add_output('exposedArea', self.area, units='m**2')
        param.add_output('CP_Isetpt', np.zeros((12, m)), units='A')

        self.add_subsystem('param', param)
        self.add_subsystem('bspline', BsplineParameters(n, m))
        self.add_subsystem('voltage', Power_CellVoltage(n))
        self.add_subsystem('power', Power_SolarPower(n))

        # self.add_subsystem('perf', Perf(n))

        self.connect('param.LOS', 'voltage.LOS')
        self.connect('param.temperature', 'voltage.temperature')
        self.connect('param.exposedArea', 'voltage.exposedArea')

        self.connect('param.CP_Isetpt', 'bspline.CP_Isetpt')
        self.connect('bspline.Isetpt', 'voltage.Isetpt')

        self.connect('bspline.Isetpt', 'power.Isetpt')
        self.connect('voltage.V_sol', 'power.V_sol')
Exemplo n.º 2
0
    def setup(self):
        # collect options
        opts = self.options
        n = opts['n']
        m = opts['m']

        solar_raw1 = opts['solar_raw1']
        solar_raw2 = opts['solar_raw2']
        comm_raw = opts['comm_raw']
        power_raw = opts['power_raw']

        initial_inputs = opts['initial_inputs']

        h = 43200.0 / (n - 1)

        # User-defined initial parameters
        if 't1' not in initial_inputs:
            initial_inputs['t1'] = 0.0
        if 't2' not in initial_inputs:
            initial_inputs['t2'] = 43200.0
        if 't' not in initial_inputs:
            initial_inputs['t'] = np.array(range(0, n)) * h
        if 'CP_Isetpt' not in initial_inputs:
            initial_inputs['CP_Isetpt'] = 0.2 * np.ones((12, m))
        if 'CP_gamma' not in initial_inputs:
            initial_inputs['CP_gamma'] = np.pi / 4 * np.ones((m, ))
        if 'CP_P_comm' not in initial_inputs:
            initial_inputs['CP_P_comm'] = 0.1 * np.ones((m, ))
        if 'iSOC' not in initial_inputs:
            initial_inputs['iSOC'] = np.array([0.5])

        # Fixed Station Parameters for the CADRE problem.
        # McMurdo station: -77.85, 166.666667
        # Ann Arbor: 42.2708, -83.7264
        if 'LD' not in initial_inputs:
            initial_inputs['LD'] = 5000.0
        if 'lat' not in initial_inputs:
            initial_inputs['lat'] = 42.2708
        if 'lon' not in initial_inputs:
            initial_inputs['lon'] = -83.7264
        if 'alt' not in initial_inputs:
            initial_inputs['alt'] = 0.256

        # Initial Orbital Elements
        if 'r_e2b_I0' not in initial_inputs:
            initial_inputs['r_e2b_I0'] = np.zeros((6, ))

        # Some initial setup.
        indeps = IndepVarComp()
        indeps.add_output('t1', initial_inputs['t1'], units='s')
        indeps.add_output('t2', initial_inputs['t2'], units='s')
        indeps.add_output('t', initial_inputs['t'], units='s')

        # Design parameters
        design = IndepVarComp()
        design.add_output('CP_Isetpt',
                          initial_inputs['CP_Isetpt'].T,
                          units='A')
        design.add_output('CP_gamma', initial_inputs['CP_gamma'], units='rad')
        design.add_output('CP_P_comm', initial_inputs['CP_P_comm'], units='W')
        design.add_output('iSOC', initial_inputs['iSOC'])

        # These are broadcast inputs in the MDP.
        # mdp_in = IndepVarComp()
        # mdp_in.add_output('lat', 'cellInstd', np.ones((7, 12)))
        # mdp_in.add_output('lon', 'finAngle', np.pi / 4.)
        # mdp_in.add_output('alt', 'antAngle', 0.0)
        # self.add_subsystem('mdp_in', mdp_in, promotes=['*'])

        # params
        params = IndepVarComp()
        params.add_output('LD', initial_inputs['LD'])
        params.add_output('lat', initial_inputs['lat'], units='rad')
        params.add_output('lon', initial_inputs['lon'], units='rad')
        params.add_output('alt', initial_inputs['alt'], units='km')
        params.add_output('r_e2b_I0', initial_inputs['r_e2b_I0'])

        # add independent vars
        self.add_subsystem('indeps', indeps, promotes=['*'])
        self.add_subsystem('design', design, promotes=['*'])
        self.add_subsystem('params', params, promotes=['*'])

        # Add Component Models
        self.add_subsystem('BsplineParameters',
                           BsplineParameters(n, m),
                           promotes=['*'])
        self.add_subsystem('Attitude_Angular',
                           Attitude_Angular(n),
                           promotes=['*'])
        self.add_subsystem('Attitude_AngularRates',
                           Attitude_AngularRates(n, h),
                           promotes=['*'])
        self.add_subsystem('Attitude_Attitude',
                           Attitude_Attitude(n),
                           promotes=['*'])
        self.add_subsystem('Attitude_Roll', Attitude_Roll(n), promotes=['*'])
        self.add_subsystem('Attitude_RotationMtx',
                           Attitude_RotationMtx(n),
                           promotes=['*'])
        self.add_subsystem('Attitude_RotationMtxRates',
                           Attitude_RotationMtxRates(n, h),
                           promotes=['*'])

        # Not needed?
        # self.add_subsystem('Attitude_Sideslip', Attitude_Sideslip(n))

        self.add_subsystem('Attitude_Torque',
                           Attitude_Torque(n),
                           promotes=['*'])
        self.add_subsystem('BatteryConstraints',
                           BatteryConstraints(n),
                           promotes=['*'])
        self.add_subsystem('BatteryPower', BatteryPower(n), promotes=['*'])
        self.add_subsystem('BatterySOC', BatterySOC(n, h), promotes=['*'])
        self.add_subsystem('Comm_AntRotation',
                           Comm_AntRotation(n),
                           promotes=['*'])
        self.add_subsystem('Comm_AntRotationMtx',
                           Comm_AntRotationMtx(n),
                           promotes=['*'])
        self.add_subsystem('Comm_BitRate', Comm_BitRate(n), promotes=['*'])
        self.add_subsystem('Comm_DataDownloaded',
                           Comm_DataDownloaded(n, h),
                           promotes=['*'])
        self.add_subsystem('Comm_Distance', Comm_Distance(n), promotes=['*'])
        self.add_subsystem('Comm_EarthsSpin',
                           Comm_EarthsSpin(n),
                           promotes=['*'])
        self.add_subsystem('Comm_EarthsSpinMtx',
                           Comm_EarthsSpinMtx(n),
                           promotes=['*'])
        self.add_subsystem('Comm_GainPattern',
                           Comm_GainPattern(n, comm_raw),
                           promotes=['*'])
        self.add_subsystem('Comm_GSposEarth',
                           Comm_GSposEarth(n),
                           promotes=['*'])
        self.add_subsystem('Comm_GSposECI', Comm_GSposECI(n), promotes=['*'])
        self.add_subsystem('Comm_LOS', Comm_LOS(n), promotes=['*'])
        self.add_subsystem('Comm_VectorAnt', Comm_VectorAnt(n), promotes=['*'])
        self.add_subsystem('Comm_VectorBody',
                           Comm_VectorBody(n),
                           promotes=['*'])
        self.add_subsystem('Comm_VectorECI', Comm_VectorECI(n), promotes=['*'])
        self.add_subsystem('Comm_VectorSpherical',
                           Comm_VectorSpherical(n),
                           promotes=['*'])

        # Not needed?
        # self.add_subsystem('Orbit_Initial', Orbit_Initial())

        self.add_subsystem('Orbit_Dynamics',
                           Orbit_Dynamics(n, h),
                           promotes=['*'])
        self.add_subsystem('Power_CellVoltage',
                           Power_CellVoltage(n, power_raw),
                           promotes=['*'])
        self.add_subsystem('Power_SolarPower',
                           Power_SolarPower(n),
                           promotes=['*'])
        self.add_subsystem('Power_Total', Power_Total(n), promotes=['*'])

        # Not needed?
        # self.add_subsystem('ReactionWheel_Motor', ReactionWheel_Motor(n))

        self.add_subsystem('ReactionWheel_Power',
                           ReactionWheel_Power(n),
                           promotes=['*'])
        self.add_subsystem('ReactionWheel_Torque',
                           ReactionWheel_Torque(n),
                           promotes=['*'])
        self.add_subsystem('ReactionWheel_Dynamics',
                           ReactionWheel_Dynamics(n, h),
                           promotes=['*'])
        self.add_subsystem('Solar_ExposedArea',
                           Solar_ExposedArea(n, solar_raw1, solar_raw2),
                           promotes=['*'])
        self.add_subsystem('Sun_LOS', Sun_LOS(n), promotes=['*'])
        self.add_subsystem('Sun_PositionBody',
                           Sun_PositionBody(n),
                           promotes=['*'])
        self.add_subsystem('Sun_PositionECI',
                           Sun_PositionECI(n),
                           promotes=['*'])
        self.add_subsystem('Sun_PositionSpherical',
                           Sun_PositionSpherical(n),
                           promotes=['*'])
        self.add_subsystem('ThermalTemperature',
                           ThermalTemperature(n, h),
                           promotes=['*'])

        self.set_order([
            # independent vars
            'indeps',
            'design',
            'params',

            # Component Models
            'BsplineParameters',
            'Orbit_Dynamics',
            'Attitude_Attitude',
            'Attitude_Roll',
            'Attitude_RotationMtx',
            'Attitude_RotationMtxRates',
            'Attitude_Angular',
            'Attitude_AngularRates',
            'Attitude_Torque',
            'ReactionWheel_Torque',
            'ReactionWheel_Dynamics',
            'ReactionWheel_Power',
            'Sun_PositionECI',
            'Sun_PositionBody',
            'Sun_PositionSpherical',
            'Sun_LOS',
            'Solar_ExposedArea',
            'ThermalTemperature',
            'Power_CellVoltage',
            'Power_SolarPower',
            'Power_Total',
            'BatterySOC',
            'BatteryPower',
            'BatteryConstraints',
            'Comm_AntRotation',
            'Comm_AntRotationMtx',
            'Comm_EarthsSpin',
            'Comm_EarthsSpinMtx',
            'Comm_GSposEarth',
            'Comm_GSposECI',
            'Comm_VectorECI',
            'Comm_VectorBody',
            'Comm_VectorAnt',
            'Comm_VectorSpherical',
            'Comm_LOS',
            'Comm_GainPattern',
            'Comm_Distance',
            'Comm_BitRate',
            'Comm_DataDownloaded',
        ])
Exemplo n.º 3
0
    def __init__(self,
                 n,
                 m,
                 solar_raw1=None,
                 solar_raw2=None,
                 comm_raw=None,
                 power_raw=None,
                 initial_params=None):

        super(CADRE, self).__init__()

        self.ln_solver.options['mode'] = 'auto'

        # Analysis parameters
        self.n = n
        self.m = m
        h = 43200.0 / (self.n - 1)

        # User-defined initial parameters
        if initial_params is None:
            initial_params = {}
        if 't1' not in initial_params:
            initial_params['t1'] = 0.0
        if 't2' not in initial_params:
            initial_params['t2'] = 43200.0
        if 't' not in initial_params:
            initial_params['t'] = np.array(range(0, n)) * h
        if 'CP_Isetpt' not in initial_params:
            initial_params['CP_Isetpt'] = 0.2 * np.ones((12, self.m))
        if 'CP_gamma' not in initial_params:
            initial_params['CP_gamma'] = np.pi / 4 * np.ones((self.m, ))
        if 'CP_P_comm' not in initial_params:
            initial_params['CP_P_comm'] = 0.1 * np.ones((self.m, ))

        if 'iSOC' not in initial_params:
            initial_params['iSOC'] = np.array([0.5])

        # Fixed Station Parameters for the CADRE problem.
        # McMurdo station: -77.85, 166.666667
        # Ann Arbor: 42.2708, -83.7264
        if 'LD' not in initial_params:
            initial_params['LD'] = 5000.0
        if 'lat' not in initial_params:
            initial_params['lat'] = 42.2708
        if 'lon' not in initial_params:
            initial_params['lon'] = -83.7264
        if 'alt' not in initial_params:
            initial_params['alt'] = 0.256

        # Initial Orbital Elements
        if 'r_e2b_I0' not in initial_params:
            initial_params['r_e2b_I0'] = np.zeros((6, ))

        # Some initial setup.
        self.add('p_t1',
                 IndepVarComp('t1', initial_params['t1']),
                 promotes=['*'])
        self.add('p_t2',
                 IndepVarComp('t2', initial_params['t2']),
                 promotes=['*'])
        self.add('p_t', IndepVarComp('t', initial_params['t']), promotes=['*'])

        # Design parameters
        self.add('p_CP_Isetpt',
                 IndepVarComp('CP_Isetpt', initial_params['CP_Isetpt']),
                 promotes=['*'])
        self.add('p_CP_gamma',
                 IndepVarComp('CP_gamma', initial_params['CP_gamma']),
                 promotes=['*'])
        self.add('p_CP_P_comm',
                 IndepVarComp('CP_P_comm', initial_params['CP_P_comm']),
                 promotes=['*'])
        self.add('p_iSOC',
                 IndepVarComp('iSOC', initial_params['iSOC']),
                 promotes=['*'])

        # These are broadcast params in the MDP.
        #self.add('p_cellInstd', IndepVarComp('cellInstd', np.ones((7, 12))),
        #         promotes=['*'])
        #self.add('p_finAngle', IndepVarComp('finAngle', np.pi / 4.), promotes=['*'])
        #self.add('p_antAngle', IndepVarComp('antAngle', 0.0), promotes=['*'])

        self.add('param_LD',
                 IndepVarComp('LD', initial_params['LD']),
                 promotes=['*'])
        self.add('param_lat',
                 IndepVarComp('lat', initial_params['lat']),
                 promotes=['*'])
        self.add('param_lon',
                 IndepVarComp('lon', initial_params['lon']),
                 promotes=['*'])
        self.add('param_alt',
                 IndepVarComp('alt', initial_params['alt']),
                 promotes=['*'])
        self.add('param_r_e2b_I0',
                 IndepVarComp('r_e2b_I0', initial_params['r_e2b_I0']),
                 promotes=['*'])

        # Add Component Models
        self.add("BsplineParameters", BsplineParameters(n, m), promotes=['*'])
        self.add("Attitude_Angular", Attitude_Angular(n), promotes=['*'])
        self.add("Attitude_AngularRates",
                 Attitude_AngularRates(n, h),
                 promotes=['*'])
        self.add("Attitude_Attitude", Attitude_Attitude(n), promotes=['*'])
        self.add("Attitude_Roll", Attitude_Roll(n), promotes=['*'])
        self.add("Attitude_RotationMtx",
                 Attitude_RotationMtx(n),
                 promotes=['*'])
        self.add("Attitude_RotationMtxRates",
                 Attitude_RotationMtxRates(n, h),
                 promotes=['*'])

        # Not needed?
        #self.add("Attitude_Sideslip", Attitude_Sideslip(n))

        self.add("Attitude_Torque", Attitude_Torque(n), promotes=['*'])
        self.add("BatteryConstraints", BatteryConstraints(n), promotes=['*'])
        self.add("BatteryPower", BatteryPower(n), promotes=['*'])
        self.add("BatterySOC", BatterySOC(n, h), promotes=['*'])
        self.add("Comm_AntRotation", Comm_AntRotation(n), promotes=['*'])
        self.add("Comm_AntRotationMtx", Comm_AntRotationMtx(n), promotes=['*'])
        self.add("Comm_BitRate", Comm_BitRate(n), promotes=['*'])
        self.add("Comm_DataDownloaded",
                 Comm_DataDownloaded(n, h),
                 promotes=['*'])
        self.add("Comm_Distance", Comm_Distance(n), promotes=['*'])
        self.add("Comm_EarthsSpin", Comm_EarthsSpin(n), promotes=['*'])
        self.add("Comm_EarthsSpinMtx", Comm_EarthsSpinMtx(n), promotes=['*'])
        self.add("Comm_GainPattern",
                 Comm_GainPattern(n, comm_raw),
                 promotes=['*'])
        self.add("Comm_GSposEarth", Comm_GSposEarth(n), promotes=['*'])
        self.add("Comm_GSposECI", Comm_GSposECI(n), promotes=['*'])
        self.add("Comm_LOS", Comm_LOS(n), promotes=['*'])
        self.add("Comm_VectorAnt", Comm_VectorAnt(n), promotes=['*'])
        self.add("Comm_VectorBody", Comm_VectorBody(n), promotes=['*'])
        self.add("Comm_VectorECI", Comm_VectorECI(n), promotes=['*'])
        self.add("Comm_VectorSpherical",
                 Comm_VectorSpherical(n),
                 promotes=['*'])

        # Not needed?
        #self.add("Orbit_Initial", Orbit_Initial())

        self.add("Orbit_Dynamics", Orbit_Dynamics(n, h), promotes=['*'])
        self.add("Power_CellVoltage",
                 Power_CellVoltage(n, power_raw),
                 promotes=['*'])
        self.add("Power_SolarPower", Power_SolarPower(n), promotes=['*'])
        self.add("Power_Total", Power_Total(n), promotes=['*'])

        # Not needed?
        #self.add("ReactionWheel_Motor", ReactionWheel_Motor(n))

        self.add("ReactionWheel_Power", ReactionWheel_Power(n), promotes=['*'])
        self.add("ReactionWheel_Torque",
                 ReactionWheel_Torque(n),
                 promotes=['*'])
        self.add("ReactionWheel_Dynamics",
                 ReactionWheel_Dynamics(n, h),
                 promotes=['*'])
        self.add("Solar_ExposedArea",
                 Solar_ExposedArea(n, solar_raw1, solar_raw2),
                 promotes=['*'])
        self.add("Sun_LOS", Sun_LOS(n), promotes=['*'])
        self.add("Sun_PositionBody", Sun_PositionBody(n), promotes=['*'])
        self.add("Sun_PositionECI", Sun_PositionECI(n), promotes=['*'])
        self.add("Sun_PositionSpherical",
                 Sun_PositionSpherical(n),
                 promotes=['*'])
        self.add("ThermalTemperature",
                 ThermalTemperature(n, h),
                 promotes=['*'])
Exemplo n.º 4
0
    def __init__(self,
                 n,
                 m,
                 solar_raw1=None,
                 solar_raw2=None,
                 comm_raw=None,
                 power_raw=None):

        super(CADRE, self).__init__()

        # Analysis parameters
        self.n = n
        self.m = m
        self.add(
            't', Array(np.zeros((n, )),
                       size=(n, ),
                       dtype=np.float,
                       iotype="in"))
        self.add('t1', Float(0., iotype='in'))
        self.add('t2', Float(43200., iotype='in'))
        h = (self.t2 - self.t1) / (self.n - 1)
        self.add("h", Float(h, iotype="in", copy=None))

        self.t = np.array(range(0, n)) * h

        # Design parameters
        self.add(
            'CP_Isetpt',
            Array(0.2 * np.ones((12, self.m)),
                  size=(12, self.m),
                  dtype=float,
                  iotype='in'))
        self.add(
            'CP_gamma',
            Array(np.pi / 4 * np.ones((self.m, )),
                  size=(self.m, ),
                  dtype=float,
                  iotype='in'))
        self.add(
            'CP_P_comm',
            Array(0.1 * np.ones((self.m, )),
                  size=(self.m, ),
                  dtype=float,
                  iotype='in'))
        self.add(
            'iSOC',
            Array([0.5],
                  shape=(1, ),
                  dtype=np.float,
                  iotype="in",
                  desc="initial state of charge"))
        self.add(
            "cellInstd",
            Array(np.ones((7, 12)),
                  size=(7, 12),
                  dtype=np.float,
                  iotype="in",
                  desc="Cell/Radiator indication",
                  low=0,
                  high=1))
        self.add("finAngle", Float(np.pi / 4., iotype="in", copy=None))
        self.add("antAngle", Float(0., iotype="in", copy=None))

        # State parameters (?)
        self.add("LD", Float(5000., iotype="in"))
        self.add("lat", Float(42.2708, iotype="in"))
        self.add("lon", Float(-83.7264, iotype="in"))
        self.add("alt", Float(0.256, iotype="in"))
        # McMurdo station: -77.85, 166.666667
        # Ann Arbor: 42.2708, -83.7264

        self.add(
            'r_e2b_I0',
            Array(np.zeros((6, )), size=(6, ), iotype="in", dtype=np.float))

        # B-spline Parameters
        self.add("BsplineParameters", BsplineParameters(n, m))
        self.driver.workflow.add("BsplineParameters")

        # Attitude components
        self.add("Attitude_Angular", Attitude_Angular(n))
        self.driver.workflow.add("Attitude_Angular")

        self.add("Attitude_AngularRates", Attitude_AngularRates(n))
        self.driver.workflow.add("Attitude_AngularRates")

        self.add("Attitude_Attitude", Attitude_Attitude(n))
        self.driver.workflow.add("Attitude_Attitude")

        self.add("Attitude_Roll", Attitude_Roll(n))
        self.driver.workflow.add("Attitude_Roll")

        self.add("Attitude_RotationMtx", Attitude_RotationMtx(n))
        self.driver.workflow.add("Attitude_RotationMtx")

        self.add("Attitude_RotationMtxRates", Attitude_RotationMtxRates(n))
        self.driver.workflow.add("Attitude_RotationMtxRates")

        #self.add("Attitude_Sideslip", Attitude_Sideslip(n))
        # self.driver.workflow.add("Attitude_Sideslip")

        self.add("Attitude_Torque", Attitude_Torque(n))
        self.driver.workflow.add("Attitude_Torque")

        # Battery components
        self.add("BatteryConstraints", BatteryConstraints(n))
        self.driver.workflow.add("BatteryConstraints")
        self.create_passthrough("BatteryConstraints.ConCh")
        self.create_passthrough("BatteryConstraints.ConDs")
        self.create_passthrough("BatteryConstraints.ConS0")
        self.create_passthrough("BatteryConstraints.ConS1")

        self.add("BatteryPower", BatteryPower(n))
        self.driver.workflow.add("BatteryPower")

        self.add("BatterySOC", BatterySOC(n))
        self.driver.workflow.add("BatterySOC")
        self.create_passthrough("BatterySOC.SOC")

        # Comm components
        self.add("Comm_AntRotation", Comm_AntRotation(n))
        self.driver.workflow.add("Comm_AntRotation")

        self.add("Comm_AntRotationMtx", Comm_AntRotationMtx(n))
        self.driver.workflow.add("Comm_AntRotationMtx")

        self.add("Comm_BitRate", Comm_BitRate(n))
        self.driver.workflow.add("Comm_BitRate")

        self.add("Comm_DataDownloaded", Comm_DataDownloaded(n))
        self.driver.workflow.add("Comm_DataDownloaded")
        # self.create_passthrough("Comm_DataDownloaded.Data_Final")
        self.create_passthrough("Comm_DataDownloaded.Data")

        self.add("Comm_Distance", Comm_Distance(n))
        self.driver.workflow.add("Comm_Distance")

        self.add("Comm_EarthsSpin", Comm_EarthsSpin(n))
        self.driver.workflow.add("Comm_EarthsSpin")

        self.add("Comm_EarthsSpinMtx", Comm_EarthsSpinMtx(n))
        self.driver.workflow.add("Comm_EarthsSpinMtx")

        self.add("Comm_GainPattern", Comm_GainPattern(n, comm_raw))
        self.driver.workflow.add("Comm_GainPattern")

        self.add("Comm_GSposEarth", Comm_GSposEarth(n))
        self.driver.workflow.add("Comm_GSposEarth")

        self.add("Comm_GSposECI", Comm_GSposECI(n))
        self.driver.workflow.add("Comm_GSposECI")

        self.add("Comm_LOS", Comm_LOS(n))
        self.driver.workflow.add("Comm_LOS")

        self.add("Comm_VectorAnt", Comm_VectorAnt(n))
        self.driver.workflow.add("Comm_VectorAnt")

        self.add("Comm_VectorBody", Comm_VectorBody(n))
        self.driver.workflow.add("Comm_VectorBody")

        self.add("Comm_VectorECI", Comm_VectorECI(n))
        self.driver.workflow.add("Comm_VectorECI")

        self.add("Comm_VectorSpherical", Comm_VectorSpherical(n))
        self.driver.workflow.add("Comm_VectorSpherical")

        # Orbit components
        #self.add("Orbit_Initial", Orbit_Initial())
        #self.driver.workflow.add("Orbit_Initial")

        self.add("Orbit_Dynamics", Orbit_Dynamics(n))
        self.driver.workflow.add("Orbit_Dynamics")

        # Power
        self.add("Power_CellVoltage", Power_CellVoltage(n, power_raw))
        self.driver.workflow.add("Power_CellVoltage")

        self.add("Power_SolarPower", Power_SolarPower(n))
        self.driver.workflow.add("Power_SolarPower")

        self.add("Power_Total", Power_Total(n))
        self.driver.workflow.add("Power_Total")

        # Reaction wheel components
        #self.add("ReactionWheel_Motor", ReactionWheel_Motor(n))
        # self.driver.workflow.add("ReactionWheel_Motor")

        self.add("ReactionWheel_Power", ReactionWheel_Power(n))
        self.driver.workflow.add("ReactionWheel_Power")

        self.add("ReactionWheel_Torque", ReactionWheel_Torque(n))
        self.driver.workflow.add("ReactionWheel_Torque")

        self.add("ReactionWheel_Dynamics", ReactionWheel_Dynamics(n))
        self.driver.workflow.add("ReactionWheel_Dynamics")

        # Solar
        self.add("Solar_ExposedArea",
                 Solar_ExposedArea(n, solar_raw1, solar_raw2))
        self.driver.workflow.add("Solar_ExposedArea")

        # Sun components
        self.add("Sun_LOS", Sun_LOS(n))
        self.driver.workflow.add("Sun_LOS")

        self.add("Sun_PositionBody", Sun_PositionBody(n))
        self.driver.workflow.add("Sun_PositionBody")

        self.add("Sun_PositionECI", Sun_PositionECI(n))
        self.driver.workflow.add("Sun_PositionECI")

        self.add("Sun_PositionSpherical", Sun_PositionSpherical(n))
        self.driver.workflow.add("Sun_PositionSpherical")

        # Thermal temp components
        self.add("ThermalTemperature", ThermalTemperature(n))
        self.driver.workflow.add("ThermalTemperature")

        #self.add("debug", debug())
        #self.debug.force_execute = True
        # self.driver.workflow.add("debug")

        self.make_connections()