Esempio n. 1
0
    def setup(self):
        # Raw data to load is in 'data' directory
        data_path = os.path.dirname(os.path.realpath(__file__))
        data_path = os.path.join(data_path, 'data')

        launch_data = np.loadtxt(data_path + '/Launch/launch1.dat')

        # orbit position and velocity data for each design point
        r_e2b_I0s = launch_data[1::2, 1:]

        # number of days since launch for each design point
        LDs = launch_data[1::2, 0] - 2451545

        # Create IndepVarComp for broadcast parameters.
        bp = self.add_subsystem('bp', IndepVarComp())
        bp.add_output('cellInstd', np.ones((7, 12)))
        bp.add_output('finAngle', np.pi/4.0, units='rad')
        bp.add_output('antAngle', 0.0, units='rad')

        # CADRE instances go into a Parallel Group
        para = self.add_subsystem('parallel', ParallelGroup(), promotes=['*'])

        # build design points
        names = ['pt%s' % i for i in range(self.npts)]
        for i, name in enumerate(names):
            # Some initial values
            inits = {
                'LD': float(LDs[i]),
                'r_e2b_I0': r_e2b_I0s[i]
            }

            para.add_subsystem(name, CADRE(n=self.n, m=self.m, initial_inputs=inits))

            # Hook up broadcast inputs
            self.connect('bp.cellInstd', '%s.cellInstd' % name)
            self.connect('bp.finAngle', '%s.finAngle' % name)
            self.connect('bp.antAngle', '%s.antAngle' % name)

            self.add_subsystem('%s_con5' % name, ExecComp('val = SOCi - SOCf'))

            self.connect('%s.SOC' % name, '%s_con5.SOCi' % name,
                         src_indices=[0], flat_src_indices=True)
            self.connect('%s.SOC' % name, '%s_con5.SOCf' % name,
                         src_indices=[self.n-1], flat_src_indices=True)

        # objective: sum of data from all design points
        data_totals = ['%s_DataTot' % name for name in names]
        obj = ''.join([' - %s' % data_tot for data_tot in data_totals])

        meta_dicts = {}
        for dt in data_totals:
            meta_dicts[dt] = {'units': 'Gibyte'}

        self.add_subsystem('obj', ExecComp('val='+obj, **meta_dicts))
        for name in names:
            self.connect('%s.Data' % name, 'obj.%s_DataTot' % name,
                         src_indices=[self.n-1], flat_src_indices=True)
Esempio n. 2
0
    def test_CADRE(self):
        n, m, h, setd = load_validation_data(idx='0')

        prob = Problem(CADRE(n=n, m=m))
        prob.setup(check=verbose)

        input_data = [
            'CP_P_comm', 'LD', 'cellInstd', 'CP_gamma', 'finAngle', 'lon',
            'CP_Isetpt', 'antAngle', 't', 'r_e2b_I0', 'lat', 'alt', 'iSOC'
        ]
        for inp in input_data:
            prob[inp] = setd[inp]

        prob.run_driver()

        if verbose:
            inputs = prob.model.list_inputs()
            outputs = prob.model.list_outputs()
        else:
            inputs = prob.model.list_inputs(out_stream=None)
            outputs = prob.model.list_outputs(out_stream=None)

        good = []
        fail = []

        for varpath, meta in inputs + outputs:
            var = varpath.split('.')[-1]
            if var in setd:
                actual = setd[var]
                computed = prob[var]

                if isinstance(computed, np.ndarray):
                    rel = np.linalg.norm(actual -
                                         computed) / np.linalg.norm(actual)
                else:
                    rel = np.abs(actual - computed) / np.abs(actual)

                if np.mean(actual) > 1e-3 or np.mean(computed) > 1e-3:
                    if rel > 1e-3:
                        fail.append(varpath)
                        if verbose:
                            print(varpath, 'failed:\n', computed, '\n---\n',
                                  actual, '\n')
                else:
                    good.append(varpath)
                    if verbose:
                        print(varpath, 'is good.')
            elif verbose:
                print(var, 'not in data.')

        fails = len(fail)
        total = fails + len(good)

        self.assertEqual(
            fails, 0, '%d (of %d) mismatches with validation data:\n%s' %
            (fails, total, '\n'.join(sorted(fail))))
Esempio n. 3
0
    def test_RK4_issue(self):
        n = 60
        m = 20

        LDs = [5233.5, 5294.5, 5356.5, 5417.5, 5478.5, 5537.5]

        r_e2b_I0s = [np.array([4505.29362, -3402.16069, -3943.74582,
                               4.1923899, -1.56280012, 6.14347427]),
                     np.array([-1005.46693, -597.205348, -6772.86532,
                               -0.61047858, -7.54623146, 0.75907455]),
                     np.array([4401.10539, 2275.95053, -4784.13188,
                               -5.26605537, -1.08194926, -5.37013745]),
                     np.array([-4969.91222, 4624.84149, 1135.9414,
                               0.1874654, -1.62801666, 7.4302362]),
                     np.array([-235.021232, 2195.72976, 6499.79919,
                               -2.55956031, -6.82743519, 2.21628099]),
                     np.array([-690.314375, -1081.78239, -6762.90367,
                               7.44316722, 1.19745345, -0.96035904])]

        i = 0
        init = {
            'LD': LDs[i],
            'r_e2b_I0': r_e2b_I0s[i]
        }

        prob = Problem()
        prob.model.add_subsystem('pt', CADRE(n=n, m=m, initial_inputs=init), promotes=['*'])
        prob.setup(check=verbose)
        prob.run_model()

        inputs = ['CP_gamma']
        outputs = ['Data']

        # check partials
        # partials = prob.check_partials()  # out_stream=None)
        # assert_check_partials(partials)

        # check totals
        if verbose:
            J = prob.check_totals(of=outputs, wrt=inputs)
        else:
            J = prob.check_totals(of=outputs, wrt=inputs, out_stream=None)

        for outp in outputs:
            for inp in inputs:
                Jn = J[outp, inp]['J_fd']
                Jf = J[outp, inp]['J_fwd']
                if verbose:
                    np.set_printoptions(threshold='nan')
                    print(np.nonzero(Jn))
                    print(np.nonzero(Jf))
                diff = abs(Jf - Jn)
                assert_rel_error(self, diff.max(), 0.0, 1e-4)
Esempio n. 4
0
    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

t0 = time.time()
assembly = Problem(root=CADRE(n, m))
print("Instantiation: ", time.time() - t0)

t0 = time.time()
assembly.setup(check=False)
print("Setup: ", time.time() - t0)

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"]

assembly['CP_P_comm'] = setd['CP_P_comm']
assembly['LD'] = setd['LD']
assembly['cellInstd'] = setd['cellInstd']
assembly['CP_gamma'] = setd['CP_gamma']
Esempio n. 5
0
    def test_RK4_issue(self):

        n = 60
        m = 20

        LDs = [5233.5, 5294.5, 5356.5, 5417.5, 5478.5, 5537.5]

        r_e2b_I0s = [
            np.array([
                4505.29362, -3402.16069, -3943.74582, 4.1923899, -1.56280012,
                6.14347427
            ]),
            np.array([
                -1005.46693, -597.205348, -6772.86532, -0.61047858,
                -7.54623146, 0.75907455
            ]),
            np.array([
                4401.10539, 2275.95053, -4784.13188, -5.26605537, -1.08194926,
                -5.37013745
            ]),
            np.array([
                -4969.91222, 4624.84149, 1135.9414, 0.1874654, -1.62801666,
                7.4302362
            ]),
            np.array([
                -235.021232, 2195.72976, 6499.79919, -2.55956031, -6.82743519,
                2.21628099
            ]),
            np.array([
                -690.314375, -1081.78239, -6762.90367, 7.44316722, 1.19745345,
                -0.96035904
            ])
        ]

        top = Problem(root=Group())

        i = 0
        init = {}
        init["LD"] = LDs[i]
        init["r_e2b_I0"] = r_e2b_I0s[i]

        top.root.add('pt', CADRE(n, m, initial_params=init), promotes=['*'])

        #from openmdao.solvers.ln_gauss_seidel import LinearGaussSeidel
        #top.root.ln_solver = LinearGaussSeidel()
        #top.root.pt.ln_solver = LinearGaussSeidel()

        top.setup(check=False)
        top.run()

        inputs = ['CP_gamma']
        outputs = ['Data']

        from time import time
        t0 = time()
        J1 = top.calc_gradient(inputs, outputs, mode='fwd')
        print('Forward', time() - t0)
        t0 = time()
        J2 = top.calc_gradient(inputs, outputs, mode='rev')
        print('Reverse', time() - t0)
        t0 = time()
        Jfd = top.calc_gradient(inputs, outputs, mode='fd')
        print('Fd', time() - t0)

        np.set_printoptions(threshold='nan')
        #print np.nonzero(J1)
        #print np.nonzero(J2)
        #print np.nonzero(Jfd)
        #print J1
        #print J2
        #print Jfd
        print np.max(abs(J1 - Jfd))
        print np.max(abs(J2 - Jfd))
        print np.max(abs(J1 - J2))

        self.assertTrue(np.max(abs(J1 - J2)) < 1.0e-6)
        self.assertTrue(np.max(abs(J1 - Jfd)) < 1.0e-4)
        self.assertTrue(np.max(abs(J2 - Jfd)) < 1.0e-4)
Esempio n. 6
0
from __future__ import print_function

import time

import numpy as np

from openmdao.api import Problem, DirectSolver

from CADRE.CADRE_group import CADRE
from CADRE.test.util import load_validation_data

n, m, h, setd = load_validation_data(idx='0')

# instantiate Problem with CADRE model
t0 = time.time()
model = CADRE(n=n, m=m)
#model = CADRE(n=n, m=m, assembled_jac_type='csc')

prob = Problem(model)
#model.linear_solver = DirectSolver(assemble_jac=True)

print("Instantiation:  ", time.time() - t0, 's')

# do problem setup
t0 = time.time()
prob.setup(check=False)
print("Problem Setup:  ", time.time() - t0, 's')

# set initial values from validation data
input_data = [
    'CP_P_comm', 'LD', 'cellInstd', 'CP_gamma', 'finAngle', 'lon', 'CP_Isetpt',
Esempio n. 7
0
    def __init__(self, n=1500, m=300, npts=6):
        super(CADRE_MDP_Group, self).__init__()

        # Raw data to load
        fpath = os.path.dirname(os.path.realpath(__file__))
        fpath = os.path.join(fpath, 'data')
        solar_raw1 = np.genfromtxt(fpath + '/Solar/Area10.txt')
        solar_raw2 = np.loadtxt(fpath + '/Solar/Area_all.txt')
        comm_rawGdata = np.genfromtxt(fpath + '/Comm/Gain.txt')
        comm_raw = (10**(comm_rawGdata / 10.0)).reshape((361, 361), order='F')
        power_raw = np.genfromtxt(fpath + '/Power/curve.dat')

        # Load launch data
        launch_data = np.loadtxt(fpath + '/Launch/launch1.dat')

        # orbit position and velocity data for each design point
        r_e2b_I0s = launch_data[1::2, 1:]

        # number of days since launch for each design point
        LDs = launch_data[1::2, 0] - 2451545

        # Create ParmComps for broadcast parameters.
        self.add('bp1', IndepVarComp('cellInstd', np.ones((7, 12))))
        self.add('bp2', IndepVarComp('finAngle', np.pi / 4.0))
        self.add('bp3', IndepVarComp('antAngle', 0.0))

        # CADRE instances go into a Parallel Group
        para = self.add('parallel', ParallelGroup(), promotes=['*'])

        # build design points
        names = ['pt%s' % i for i in range(npts)]
        for i, name in enumerate(names):

            # Some initial values
            inits = {}
            inits['LD'] = float(LDs[i])
            inits['r_e2b_I0'] = r_e2b_I0s[i]

            comp = para.add(
                name,
                CADRE(n,
                      m,
                      solar_raw1,
                      solar_raw2,
                      comm_raw,
                      power_raw,
                      initial_params=inits))

            # Hook up broadcast params
            self.connect('bp1.cellInstd', "%s.cellInstd" % name)
            self.connect('bp2.finAngle', "%s.finAngle" % name)
            self.connect('bp3.antAngle', "%s.antAngle" % name)

            self.add('%s_con5' % name, ExecComp("val = SOCi - SOCf"))
            self.connect("%s.SOC" % name,
                         '%s_con5.SOCi' % name,
                         src_indices=[0])
            self.connect("%s.SOC" % name,
                         '%s_con5.SOCf' % name,
                         src_indices=[n - 1])

        obj = ''.join([" - %s_DataTot" % name for name in names])
        self.add('obj', ExecComp('val=' + obj))
        for name in names:
            self.connect("%s.Data" % name,
                         "obj.%s_DataTot" % name,
                         src_indices=[n - 1])

        # Set our groups to auto
        self.ln_solver.options['mode'] = 'auto'
        para.ln_solver.options['mode'] = 'auto'
Esempio n. 8
0
"""
from __future__ import print_function

import time

from openmdao.api import Problem

from CADRE.CADRE_group import CADRE
from CADRE.test.util import load_validation_data


n, m, h, setd = load_validation_data(idx='0')

# instantiate Problem with CADRE model
t0 = time.time()
model = CADRE(n=n, m=m)
prob = Problem(model)
print("Instantiation:  ", time.time() - t0, 's')

# do problem setup
t0 = time.time()
prob.setup(check=False)
print("Problem Setup:  ", time.time() - t0, 's')

# set initial values from validation data
input_data = [
    'CP_P_comm',
    'LD',
    'cellInstd',
    'CP_gamma',
    'finAngle',