def test_bspline_parameters(self): compname = 'BsplineParameters' inputs = ['CP_P_comm', 'CP_gamma', 'CP_Isetpt'] outputs = ['P_comm', 'Gamma', 'Isetpt'] state0 = [] self.model.root.add('comp', BsplineParameters(NTIME, 5), promotes=['*']) for item in inputs: pshape = self.model.root.comp._params_dict[item]['shape'] if pshape == 1: initval = 0.0 else: initval = np.zeros((pshape)) self.model.root.add('p_%s' % item, IndepVarComp(item, initval), promotes=['*']) self.model.setup(check=False) for item in inputs: shape = self.model.root.comp._params_dict[item]['shape'] self.model[item] = np.random.random(shape) self.run_model() self.compare_derivatives(inputs+state0, outputs)
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')
def test_bspline_parameters(self): compname = 'BsplineParameters' inputs = ['CP_P_comm', 'CP_gamma', 'CP_Isetpt'] outputs = ['P_comm', 'Gamma', 'Isetpt'] state0 = [] self.model.add('comp', BsplineParameters(NTIME, 5)) self.model.driver.workflow.add('comp') for item in inputs: val = self.model.comp.get(item) shape1 = val.shape self.model.comp.set(item, np.random.random(shape1)) self.run_model() self.compare_derivatives(inputs + state0, outputs)
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', ])
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=['*'])
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()