def test_results_radau(self): gd = GridData(num_segments=3, transcription_order=[5, 3, 3], segment_ends=_segends, transcription='radau-ps') p = om.Problem(model=om.Group()) ivc = p.model.add_subsystem(name='ivc', subsys=om.IndepVarComp(), promotes_outputs=['*']) ivc.add_output('t_initial', val=0.0, units='s') ivc.add_output('t_duration', val=100.0, units='s') p.model.add_subsystem('time', TimeComp(num_nodes=gd.num_nodes, node_ptau=gd.node_ptau, node_dptau_dstau=gd.node_dptau_dstau, units='s')) p.model.connect('t_initial', 'time.t_initial') p.model.connect('t_duration', 'time.t_duration') p.setup(check=True, force_alloc_complex=True) p.run_model() # Affine transform the nodes [0, 100] dt_dptau = (p['t_duration'] - p['t_initial']) / 2.0 nodes = [] dt_dstau_per_node = [] for i in range(gd.num_segments): a, b = gd.segment_ends[i], gd.segment_ends[i + 1] # segment ends in phase tau space # ratio of phase tau to segment tau within the segment dptau_dstau = (b - a) / 2.0 dt_dstau = dt_dptau * dptau_dstau * np.ones(gd.subset_num_nodes_per_segment['all'][i]) dt_dstau_per_node.extend(dt_dstau.tolist()) # nodes of current segment in segment tau space nodes_segi_stau = _lgr_nodes[gd.transcription_order[i]] # nodes of current segment in phase tau space nodes_segi_ptau = a + (nodes_segi_stau + 1) * dptau_dstau # nodes in time nodes_time = (nodes_segi_ptau + 1) * dt_dptau nodes.extend(nodes_time.tolist()) assert_almost_equal(p['time.time'], nodes, decimal=4) assert_almost_equal(p['time.dt_dstau'], dt_dstau_per_node)
def test_polynomial_control_group_scalar_gl(self): transcription = 'gauss-lobatto' compressed = True segends = np.array([0.0, 3.0, 10.0]) gd = GridData(num_segments=2, transcription_order=5, segment_ends=segends, transcription=transcription, compressed=compressed) p = om.Problem(model=om.Group()) controls = { 'a': PolynomialControlOptionsDictionary(), 'b': PolynomialControlOptionsDictionary() } controls['a']['units'] = 'm' controls['a']['order'] = 3 controls['a']['shape'] = (1, ) controls['a']['opt'] = True controls['b']['units'] = 'm' controls['b']['order'] = 3 controls['b']['shape'] = (1, ) controls['b']['opt'] = True ivc = om.IndepVarComp() p.model.add_subsystem('ivc', ivc, promotes_outputs=['*']) ivc.add_output('t_initial', val=0.0, units='s') ivc.add_output('t_duration', val=10.0, units='s') p.model.add_subsystem('time_comp', subsys=TimeComp( num_nodes=gd.num_nodes, node_ptau=gd.node_ptau, node_dptau_dstau=gd.node_dptau_dstau, units='s'), promotes_inputs=['t_initial', 't_duration'], promotes_outputs=['time', 'dt_dstau']) polynomial_control_group = PolynomialControlGroup( grid_data=gd, polynomial_control_options=controls, time_units='s') p.model.add_subsystem('polynomial_control_group', subsys=polynomial_control_group, promotes_inputs=['*'], promotes_outputs=['*']) p.setup(force_alloc_complex=True) p['t_initial'] = 0.0 p['t_duration'] = 3.0 p.run_model() control_nodes_ptau, _ = lgl(controls['a']['order'] + 1) t_control_input = p['t_initial'] + 0.5 * (control_nodes_ptau + 1) * p['t_duration'] t_all = p['time'] p['polynomial_controls:a'][:, 0] = f_a(t_control_input) p['polynomial_controls:b'][:, 0] = f_b(t_control_input) p.run_model() a_value_expected = f_a(t_all) b_value_expected = f_b(t_all) a_rate_expected = f1_a(t_all) b_rate_expected = f1_b(t_all) a_rate2_expected = f2_a(t_all) b_rate2_expected = f2_b(t_all) assert_almost_equal(p['polynomial_control_values:a'], np.atleast_2d(a_value_expected).T) assert_almost_equal(p['polynomial_control_values:b'], np.atleast_2d(b_value_expected).T) assert_almost_equal(p['polynomial_control_rates:a_rate'], np.atleast_2d(a_rate_expected).T) assert_almost_equal(p['polynomial_control_rates:b_rate'], np.atleast_2d(b_rate_expected).T) assert_almost_equal(p['polynomial_control_rates:a_rate2'], np.atleast_2d(a_rate2_expected).T) assert_almost_equal(p['polynomial_control_rates:b_rate2'], np.atleast_2d(b_rate2_expected).T) np.set_printoptions(linewidth=1024) cpd = p.check_partials(compact_print=False, out_stream=None, method='cs') assert_check_partials(cpd)
def test_control_interp_scalar(self, transcription='gauss-lobatto', compressed=True): segends = np.array([0.0, 3.0, 10.0]) gd = GridData(num_segments=2, transcription_order=5, segment_ends=segends, transcription=transcription, compressed=compressed) p = om.Problem(model=om.Group()) controls = { 'a': { 'units': 'm', 'shape': (1, ), 'dynamic': True }, 'b': { 'units': 'm', 'shape': (1, ), 'dynamic': True } } ivc = om.IndepVarComp() p.model.add_subsystem('ivc', ivc, promotes_outputs=['*']) ivc.add_output('controls:a', val=np.zeros((gd.subset_num_nodes['control_input'], 1)), units='m') ivc.add_output('controls:b', val=np.zeros((gd.subset_num_nodes['control_input'], 1)), units='m') ivc.add_output('t_initial', val=0.0, units='s') ivc.add_output('t_duration', val=10.0, units='s') p.model.add_subsystem('time_comp', subsys=TimeComp( num_nodes=gd.num_nodes, node_ptau=gd.node_ptau, node_dptau_dstau=gd.node_dptau_dstau, units='s'), promotes_inputs=['t_initial', 't_duration'], promotes_outputs=['time', 'dt_dstau']) p.model.add_subsystem('control_interp_comp', subsys=ControlInterpComp( grid_data=gd, control_options=controls, time_units='s'), promotes_inputs=['controls:*']) p.model.connect('dt_dstau', 'control_interp_comp.dt_dstau') p.setup(force_alloc_complex=True) p['t_initial'] = 0.0 p['t_duration'] = 3.0 p.run_model() t = p['time'] p['controls:a'][:, 0] = f_a(t[gd.subset_node_indices['control_input']]) p['controls:b'][:, 0] = f_b(t[gd.subset_node_indices['control_input']]) p.run_model() a_value_expected = f_a(t) b_value_expected = f_b(t) a_rate_expected = f1_a(t) b_rate_expected = f1_b(t) a_rate2_expected = f2_a(t) b_rate2_expected = f2_b(t) assert_almost_equal(p['control_interp_comp.control_values:a'], np.atleast_2d(a_value_expected).T) assert_almost_equal(p['control_interp_comp.control_values:b'], np.atleast_2d(b_value_expected).T) assert_almost_equal(p['control_interp_comp.control_rates:a_rate'], np.atleast_2d(a_rate_expected).T) assert_almost_equal(p['control_interp_comp.control_rates:b_rate'], np.atleast_2d(b_rate_expected).T) assert_almost_equal(p['control_interp_comp.control_rates:a_rate2'], np.atleast_2d(a_rate2_expected).T) assert_almost_equal(p['control_interp_comp.control_rates:b_rate2'], np.atleast_2d(b_rate2_expected).T) np.set_printoptions(linewidth=1024) cpd = p.check_partials(compact_print=False, out_stream=None, method='cs') assert_check_partials(cpd)
def test_polynomial_control_group_matrix_rungekutta(self): transcription = 'runge-kutta' compressed = True segends = np.array([0.0, 3.0, 10.0]) gd = GridData(num_segments=2, transcription_order='RK4', segment_ends=segends, transcription=transcription, compressed=compressed) p = om.Problem(model=om.Group()) controls = {'a': PolynomialControlOptionsDictionary()} controls['a']['units'] = 'm' controls['a']['order'] = 3 controls['a']['opt'] = True controls['a']['shape'] = (3, 1) ivc = om.IndepVarComp() p.model.add_subsystem('ivc', ivc, promotes_outputs=['*']) ivc.add_output('t_initial', val=0.0, units='s') ivc.add_output('t_duration', val=10.0, units='s') p.model.add_subsystem('time_comp', subsys=TimeComp(num_nodes=gd.num_nodes, node_ptau=gd.node_ptau, node_dptau_dstau=gd.node_dptau_dstau, units='s'), promotes_inputs=['t_initial', 't_duration'], promotes_outputs=['time', 'dt_dstau']) polynomial_control_group = PolynomialControlGroup(grid_data=gd, polynomial_control_options=controls, time_units='s') p.model.add_subsystem('polynomial_control_group', subsys=polynomial_control_group, promotes_inputs=['*'], promotes_outputs=['*']) # p.model.connect('dt_dstau', 'control_interp_comp.dt_dstau') p.setup(force_alloc_complex=True) p['t_initial'] = 0.0 p['t_duration'] = 3.0 p.run_model() control_nodes_ptau, _ = lgl(controls['a']['order'] + 1) t_control_input = p['t_initial'] + 0.5 * (control_nodes_ptau + 1) * p['t_duration'] t_all = p['time'] p['polynomial_controls:a'][:, 0, 0] = f_a(t_control_input) p['polynomial_controls:a'][:, 1, 0] = f_b(t_control_input) p['polynomial_controls:a'][:, 2, 0] = f_c(t_control_input) p.run_model() a0_value_expected = f_a(t_all) a1_value_expected = f_b(t_all) a2_value_expected = f_c(t_all) a0_rate_expected = f1_a(t_all) a1_rate_expected = f1_b(t_all) a2_rate_expected = f1_c(t_all) a0_rate2_expected = f2_a(t_all) a1_rate2_expected = f2_b(t_all) a2_rate2_expected = f2_c(t_all) assert_almost_equal(p['polynomial_control_values:a'][:, 0, 0], a0_value_expected) assert_almost_equal(p['polynomial_control_values:a'][:, 1, 0], a1_value_expected) assert_almost_equal(p['polynomial_control_values:a'][:, 2, 0], a2_value_expected) assert_almost_equal(p['polynomial_control_rates:a_rate'][:, 0, 0], a0_rate_expected) assert_almost_equal(p['polynomial_control_rates:a_rate'][:, 1, 0], a1_rate_expected) assert_almost_equal(p['polynomial_control_rates:a_rate'][:, 2, 0], a2_rate_expected) assert_almost_equal(p['polynomial_control_rates:a_rate2'][:, 0, 0], a0_rate2_expected) assert_almost_equal(p['polynomial_control_rates:a_rate2'][:, 1, 0], a1_rate2_expected) assert_almost_equal(p['polynomial_control_rates:a_rate2'][:, 2, 0], a2_rate2_expected) np.set_printoptions(linewidth=1024) cpd = p.check_partials(method='cs', out_stream=None) assert_check_partials(cpd)
def test_control_interp_matrix_2x2(self, transcription='gauss-lobatto', compressed=True): segends = np.array([0.0, 3.0, 10.0]) gd = GridData(num_segments=2, transcription_order=5, segment_ends=segends, transcription=transcription, compressed=compressed) p = om.Problem(model=om.Group()) controls = {'a': {'units': 'm', 'shape': (2, 2), 'dynamic': True}} ivc = om.IndepVarComp() p.model.add_subsystem('ivc', ivc, promotes_outputs=['*']) ivc.add_output('controls:a', val=np.zeros( (gd.subset_num_nodes['control_input'], 2, 2)), units='m') ivc.add_output('t_initial', val=0.0, units='s') ivc.add_output('t_duration', val=10.0, units='s') p.model.add_subsystem('time_comp', subsys=TimeComp( num_nodes=gd.num_nodes, node_ptau=gd.node_ptau, node_dptau_dstau=gd.node_dptau_dstau, units='s'), promotes_inputs=['t_initial', 't_duration'], promotes_outputs=['time', 'dt_dstau']) p.model.add_subsystem('control_interp_comp', subsys=ControlInterpComp( grid_data=gd, control_options=controls, time_units='s'), promotes_inputs=['controls:*']) p.model.connect('dt_dstau', 'control_interp_comp.dt_dstau') p.setup(force_alloc_complex=True) p['t_initial'] = 0.0 p['t_duration'] = 3.0 p.run_model() t = p['time'] control_input_idxs = gd.subset_node_indices['control_input'] p['controls:a'][:, 0, 0] = f_a(t[control_input_idxs]) p['controls:a'][:, 0, 1] = f_b(t[control_input_idxs]) p['controls:a'][:, 1, 0] = f_c(t[control_input_idxs]) p['controls:a'][:, 1, 1] = f_d(t[control_input_idxs]) p.run_model() a0_value_expected = f_a(t) a1_value_expected = f_b(t) a2_value_expected = f_c(t) a3_value_expected = f_d(t) a0_rate_expected = f1_a(t) a1_rate_expected = f1_b(t) a2_rate_expected = f1_c(t) a3_rate_expected = f1_d(t) a0_rate2_expected = f2_a(t) a1_rate2_expected = f2_b(t) a2_rate2_expected = f2_c(t) a3_rate2_expected = f2_d(t) assert_almost_equal(p['control_interp_comp.control_values:a'][:, 0, 0], a0_value_expected) assert_almost_equal(p['control_interp_comp.control_values:a'][:, 0, 1], a1_value_expected) assert_almost_equal(p['control_interp_comp.control_values:a'][:, 1, 0], a2_value_expected) assert_almost_equal(p['control_interp_comp.control_values:a'][:, 1, 1], a3_value_expected) assert_almost_equal( p['control_interp_comp.control_rates:a_rate'][:, 0, 0], a0_rate_expected) assert_almost_equal( p['control_interp_comp.control_rates:a_rate'][:, 0, 1], a1_rate_expected) assert_almost_equal( p['control_interp_comp.control_rates:a_rate'][:, 1, 0], a2_rate_expected) assert_almost_equal( p['control_interp_comp.control_rates:a_rate'][:, 1, 1], a3_rate_expected) assert_almost_equal( p['control_interp_comp.control_rates:a_rate2'][:, 0, 0], a0_rate2_expected) assert_almost_equal( p['control_interp_comp.control_rates:a_rate2'][:, 0, 1], a1_rate2_expected) assert_almost_equal( p['control_interp_comp.control_rates:a_rate2'][:, 1, 0], a2_rate2_expected) assert_almost_equal( p['control_interp_comp.control_rates:a_rate2'][:, 1, 1], a3_rate2_expected) with np.printoptions(linewidth=100000, edgeitems=100000): cpd = p.check_partials(compact_print=True, method='cs') assert_check_partials(cpd)