Exemple #1
0
    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)
Exemple #2
0
    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)
Exemple #3
0
    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)
Exemple #4
0
    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)
Exemple #5
0
    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)