Source code for CADRE.test.test_components

import unittest
import numpy as np
import pickle
import random
import warnings

from openmdao.main.api import Assembly, set_as_top
from openmdao.util.testutil import assert_rel_error

from CADRE.attitude import Attitude_Angular, Attitude_AngularRates, \
    Attitude_Attitude, Attitude_Roll, Attitude_RotationMtx, \
    Attitude_RotationMtxRates, Attitude_Sideslip, Attitude_Torque
from CADRE.battery import BatteryConstraints, BatteryPower, BatterySOC
from CADRE.comm import Comm_AntRotation, Comm_AntRotationMtx, Comm_BitRate, \
    Comm_DataDownloaded, Comm_Distance, Comm_EarthsSpin, Comm_EarthsSpinMtx, \
    Comm_GainPattern, Comm_GSposEarth, Comm_GSposECI, Comm_LOS, Comm_VectorAnt, \
    Comm_VectorBody, Comm_VectorECI, Comm_VectorSpherical
from CADRE.orbit import Orbit_Initial, Orbit_Dynamics
from CADRE.parameters import BsplineParameters
from CADRE.power import Power_CellVoltage, Power_SolarPower, Power_Total
from CADRE.reactionwheel import ReactionWheel_Motor, ReactionWheel_Power, \
    ReactionWheel_Torque, ReactionWheel_Dynamics
from CADRE.solar import Solar_ExposedArea
from CADRE.sun import Sun_LOS, Sun_PositionBody, Sun_PositionECI, \
    Sun_PositionSpherical
from CADRE.thermal_temperature import ThermalTemperature
import os

# Ignore the numerical warnings from performing the rel error calc.
warnings.simplefilter("ignore")

idx = '5'

setd = {}
fpath = os.path.dirname(os.path.realpath(__file__))
data = pickle.load(open(fpath + "/data1346.pkl", 'rb'))

for key in data.keys():
    if key[0] == idx or not key[0].isdigit():
        if not key[0].isdigit():
            shortkey = key
        else:
            shortkey = key[2:]
        # set floats correctly
        if data[key].shape == (1,) and shortkey != "iSOC":
            setd[shortkey] = data[key][0]
        else:
            setd[shortkey] = data[key]

n = setd['P_comm'].size
m = setd['CP_P_comm'].size
h = 43200. / (n - 1)

setd['r_e2b_I0'] = np.zeros(6)
setd['r_e2b_I0'][:3] = data[idx + ":r_e2b_I0"]
setd['r_e2b_I0'][3:] = data[idx + ":v_e2b_I0"]
setd['Gamma'] = data[idx + ":gamma"]


class Testcase_CADRE(unittest.TestCase):
[docs] """ Test run/step/stop aspects of a simple workflow. """ def setUp(self):
[docs] """ Called before each test. """ self.model = set_as_top(Assembly()) def tearDown(self):
[docs] """ Called after each test. """ self.model = None def setup(self, compname, inputs):
[docs] try: self.model.add('comp', eval('%s(n)' % compname)) except TypeError: # At least one comp has no args. self.model.add('comp', eval('%s()' % compname)) self.model.driver.workflow.add('comp') for var in inputs: self.model.set('comp.%s' % var, setd[var]) def run_model(self):
[docs] self.model.comp.h = h self.model.run() def compare_results(self, outputs):
[docs] for var in outputs: tval = setd[var] assert np.linalg.norm(tval - self.model.get( 'comp.%s' % var)) / np.linalg.norm(tval) < 1e-3 def test_Comm_DataDownloaded(self):
[docs] compname = 'Comm_DataDownloaded' inputs = ['Dr'] outputs = ['Data'] self.setup(compname, inputs) self.run_model() self.compare_results(outputs) def test_Comm_AntRotation(self):
[docs] compname = 'Comm_AntRotation' inputs = ['antAngle'] outputs = ['q_A'] self.setup(compname, inputs) self.run_model() self.compare_results(outputs) def test_Comm_BitRate(self):
[docs] compname = 'Comm_BitRate' inputs = ['P_comm', 'gain', 'GSdist', 'CommLOS'] outputs = ['Dr'] self.setup(compname, inputs) self.run_model() self.compare_results(outputs) def test_Comm_Distance(self):
[docs] compname = 'Comm_Distance' inputs = ['r_b2g_A'] outputs = ['GSdist'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) def test_Comm_EarthsSpin(self):
[docs] compname = 'Comm_EarthsSpin' inputs = ['t'] outputs = ['q_E'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) def test_Comm_EarthsSpinMtx(self):
[docs] compname = 'Comm_EarthsSpinMtx' inputs = ['q_E'] outputs = ['O_IE'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) def test_Comm_GainPattern(self):
[docs] compname = 'Comm_GainPattern' inputs = ['azimuthGS', 'elevationGS'] outputs = ['gain'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) def test_Comm_GSposEarth(self):
[docs] compname = 'Comm_GSposEarth' inputs = ['lon', 'lat', 'alt'] outputs = ['r_e2g_E'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) def test_Comm_GSposECI(self):
[docs] compname = 'Comm_GSposECI' inputs = ['O_IE', 'r_e2g_E'] outputs = ['r_e2g_I'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) def test_Comm_LOS(self):
[docs] compname = 'Comm_LOS' inputs = ['r_b2g_I', 'r_e2g_I'] outputs = ['CommLOS'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) def test_Comm_VectorAnt(self):
[docs] compname = 'Comm_VectorAnt' inputs = ['r_b2g_B', 'O_AB'] outputs = ['r_b2g_A'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) def test_Comm_VectorBody(self):
[docs] compname = 'Comm_VectorBody' inputs = ['r_b2g_I', 'O_BI'] outputs = ['r_b2g_B'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) def test_Comm_VectorECI(self):
[docs] compname = 'Comm_VectorECI' inputs = ['r_e2g_I', 'r_e2b_I'] outputs = ['r_b2g_I'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) def test_Comm_VectorSpherical(self):
[docs] compname = 'Comm_VectorSpherical' inputs = ['r_b2g_A'] outputs = ['azimuthGS', 'elevationGS'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) def test_ThermalTemperature(self):
[docs] compname = 'ThermalTemperature' inputs = ['exposedArea', 'cellInstd', 'LOS', 'P_comm'] outputs = ['temperature'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) def test_Attitude_Angular(self):
[docs] compname = 'Attitude_Angular' inputs = ['O_BI', 'Odot_BI'] outputs = ['w_B'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) def test_Attitude_AngularRates(self):
[docs] compname = 'Attitude_AngularRates' inputs = ['w_B'] outputs = ['wdot_B'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) def test_Attitude_Attitude(self):
[docs] compname = 'Attitude_Attitude' inputs = ['r_e2b_I'] outputs = ['O_RI'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) def test_Attitude_Roll(self):
[docs] compname = 'Attitude_Roll' inputs = ['Gamma'] outputs = ['O_BR'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) def test_Attitude_RotationMtx(self):
[docs] compname = 'Attitude_RotationMtx' inputs = ['O_BR', 'O_RI'] outputs = ['O_BI'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) def test_Attitude_RotationMtxRates(self):
[docs] compname = 'Attitude_RotationMtxRates' inputs = ['O_BI'] outputs = ['Odot_BI'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) def test_Attitude_Sideslip(self):
[docs] compname = 'Attitude_Sideslip' inputs = ['r_e2b_I', 'O_BI'] outputs = ['v_e2b_B'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) def test_Attitude_Torque(self):
[docs] compname = 'Attitude_Torque' inputs = ['w_B', 'wdot_B'] outputs = ['T_tot'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) def test_Sun_LOS(self):
[docs] compname = 'Sun_LOS' inputs = ['r_e2b_I', 'r_e2s_I'] outputs = ['LOS'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) def test_Sun_PositionBody(self):
[docs] compname = 'Sun_PositionBody' inputs = ['O_BI', 'r_e2s_I'] outputs = ['r_e2s_B'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) def test_Sun_PositionECI(self):
[docs] compname = 'Sun_PositionECI' inputs = ['t', 'LD'] outputs = ['r_e2s_I'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) def test_Sun_PositionSpherical(self):
[docs] compname = 'Sun_PositionSpherical' inputs = ['r_e2s_B'] outputs = ['azimuth', 'elevation'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) def test_Solar_ExposedArea(self):
[docs] compname = 'Solar_ExposedArea' inputs = ['finAngle', 'azimuth', 'elevation'] outputs = ['exposedArea'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) def test_Power_CellVoltage(self):
[docs] compname = 'Power_CellVoltage' inputs = ['LOS', 'temperature', 'exposedArea', 'Isetpt'] outputs = ['V_sol'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) def test_Power_SolarPower(self):
[docs] compname = 'Power_SolarPower' inputs = ['V_sol', 'Isetpt'] outputs = ['P_sol'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) def test_Power_Total(self):
[docs] compname = 'Power_Total' inputs = ['P_sol', 'P_comm', 'P_RW'] outputs = ['P_bat'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) def test_ReactionWheel_Motor(self):
[docs] compname = 'ReactionWheel_Motor' inputs = ['T_RW', 'w_B', 'w_RW'] outputs = ['T_m'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) def test_ReactionWheel_Dynamics(self):
[docs] compname = 'ReactionWheel_Dynamics' inputs = ['w_B', 'T_RW'] outputs = ['w_RW'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) def test_ReactionWheel_Power(self):
[docs] compname = 'ReactionWheel_Power' inputs = ['w_RW', 'T_RW'] outputs = ['P_RW'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) def test_ReactionWheel_Torque(self):
[docs] compname = 'ReactionWheel_Torque' inputs = ['T_tot'] outputs = ['T_RW'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) def test_BatterySOC(self):
[docs] compname = 'BatterySOC' inputs = ['P_bat', 'temperature'] outputs = ['SOC'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) def test_BatteryPower(self):
[docs] compname = 'BatteryPower' inputs = ['SOC', 'temperature', 'P_bat'] outputs = ['I_bat'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) def test_BatteryConstraints(self):
[docs] compname = 'BatteryConstraints' inputs = ['I_bat', 'SOC'] outputs = ['ConCh', 'ConDs', 'ConS0', 'ConS1'] self.setup(compname, inputs) self.run_model() self.compare_results(inputs) if __name__ == "__main__":
unittest.main()