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)
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))))
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)
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']
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)
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',
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'
""" 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',