• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

OpenMDAO / dymos / 14334339264

08 Apr 2025 01:07PM UTC coverage: 92.981% (-0.1%) from 93.097%
14334339264

push

github

web-flow
Picard control continuity (#1167)

* Starting to add control continuity conditions to PicardShooting

* Added a continuity constraint component to enforce control continuity in PicardShooting.

* undo a reversion from last PR.

* missed a @use_tempdirs

45 of 48 new or added lines in 2 files covered. (93.75%)

61 existing lines in 6 files now uncovered.

33487 of 36015 relevant lines covered (92.98%)

5.65 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

70.3
/dymos/examples/goddard_rocket_problem/test/test_goddard_rocket_problem.py
UNCOV
1
import openmdao.api as om
×
UNCOV
2
import dymos as dm
×
UNCOV
3
import unittest
×
UNCOV
4
import os
×
5

UNCOV
6
try:
×
UNCOV
7
    import matplotlib  # noqa: F401
×
UNCOV
8
    SHOW_PLOTS = True
×
9
except ImportError:
×
10
    SHOW_PLOTS = False
×
11

UNCOV
12
from openmdao.utils.assert_utils import assert_near_equal, assert_check_partials
×
UNCOV
13
from openmdao.utils.testing_utils import use_tempdirs, require_pyoptsparse
×
14

UNCOV
15
from dymos.examples.goddard_rocket_problem import RocketODE
×
16

17

UNCOV
18
@require_pyoptsparse(optimizer='IPOPT')
×
UNCOV
19
def goddard_rocket_direct_collocation(grid_type='lgl'):
×
20

21
    optimizer = 'IPOPT'
4✔
22
    p = om.Problem(model=om.Group())
4✔
23
    p.driver = om.pyOptSparseDriver()
4✔
24
    p.driver.options['optimizer'] = optimizer
4✔
25
    p.driver.declare_coloring()
4✔
26
    if optimizer == 'SNOPT':
4✔
27
        p.driver.opt_settings['Major iterations limit'] = 1000
×
28
        p.driver.opt_settings['Major feasibility tolerance'] = 1.0E-6
×
29
        p.driver.opt_settings['Major optimality tolerance'] = 1.0E-3
×
30
        p.driver.opt_settings['iSumm'] = 6
×
31

32
    t = dm.Birkhoff(num_nodes=150, grid_type=grid_type)
4✔
33

34
    traj = p.model.add_subsystem('traj', dm.Trajectory())
4✔
35

36
    phase = traj.add_phase('phase0', dm.Phase(ode_class=RocketODE, transcription=t))
4✔
37

38
    phase.set_time_options(fix_initial=True, fix_duration=False, duration_bounds=(20, 80), units='s',
4✔
39
                           duration_ref=100)
40

41
    phase.add_state('h', fix_initial=True, fix_final=False, rate_source='h_dot', units='ft', lower=0, ref=20000)
4✔
42
    phase.add_state('v', fix_initial=True, fix_final=False, rate_source='v_dot', units='ft/s', ref=1000, lower=0)
4✔
43
    phase.add_state('m', fix_initial=True, fix_final=True, rate_source='m_dot', units='slug',
4✔
44
                    lower=1e-3, ref=3, upper=3.0)
45

46
    phase.add_control('T', units='lbf', lower=0, upper=200, ref=200)
4✔
47

48
    # Minimize the control effort
49
    phase.add_objective('h', loc='final', scaler=-1)
4✔
50

51
    p.model.linear_solver = om.DirectSolver()
4✔
52

53
    p.setup(check=True, force_alloc_complex=True)
4✔
54

55
    phase.set_time_val(initial=0.0, duration=40.0)
4✔
56
    phase.set_state_val('h', [0.0, 10000.0])
4✔
57
    phase.set_state_val('v', [0.0, 0.0])
4✔
58
    phase.set_state_val('m', [3.0, 1.0])
4✔
59
    phase.set_control_val('T', [0.0, 0.0])
4✔
60

61
    return p
4✔
62

63

UNCOV
64
@use_tempdirs
×
UNCOV
65
class TestGoddardRocketProblem(unittest.TestCase):
×
66

UNCOV
67
    @classmethod
×
UNCOV
68
    def tearDownClass(cls):
×
69
        for filename in ['total_coloring.pkl', 'SLSQP.out', 'SNOPT_print.out']:
7✔
70
            if os.path.exists(filename):
7✔
71
                os.remove(filename)
×
72

UNCOV
73
    @staticmethod
×
UNCOV
74
    def _assert_results(p, tol=1.0E-4):
×
75
        h = p.get_val('traj.phase0.timeseries.h')
4✔
76
        assert_near_equal(h[-1], 18745.0, tolerance=tol)
4✔
77

UNCOV
78
    def test_goddard_rocket_problem_lgl(self):
×
79
        p = goddard_rocket_direct_collocation(grid_type='lgl')
7✔
80
        dm.run_problem(p)
4✔
81
        if SHOW_PLOTS:
4✔
82
            t = p.get_val('traj.phase0.timeseries.time')
4✔
83
            h = p.get_val('traj.phase0.timeseries.h')
4✔
84
            v = p.get_val('traj.phase0.timeseries.v')
4✔
85
            m = p.get_val('traj.phase0.timeseries.m')
4✔
86
            T = p.get_val('traj.phase0.timeseries.T')
4✔
87

88
            import matplotlib.pyplot as plt
4✔
89
            fig, axs = plt.subplots(2, 2)
4✔
90
            axs[0, 0].plot(t, h)
4✔
91
            axs[0, 0].set_xlabel('time (s)')
4✔
92
            axs[0, 0].set_ylabel('altitude (ft)')
4✔
93
            axs[0, 1].plot(t, v)
4✔
94
            axs[0, 1].set_xlabel('time (s)')
4✔
95
            axs[0, 1].set_ylabel('velocity (ft/s)')
4✔
96
            axs[1, 0].plot(t, m)
4✔
97
            axs[1, 0].set_xlabel('time (s)')
4✔
98
            axs[1, 0].set_ylabel('mass (slug)')
4✔
99
            axs[1, 1].plot(t, T)
4✔
100
            axs[1, 1].set_xlabel('time (s)')
4✔
101
            axs[1, 1].set_ylabel('thrust (lb)')
4✔
102
            plt.show()
4✔
103

104
        self._assert_results(p)
4✔
105

UNCOV
106
    def test_goddard_rocket_problem_cgl(self):
×
107
        p = goddard_rocket_direct_collocation(grid_type='cgl')
7✔
108
        dm.run_problem(p)
4✔
109
        if SHOW_PLOTS:
4✔
110
            t = p.get_val('traj.phase0.timeseries.time')
4✔
111
            h = p.get_val('traj.phase0.timeseries.h')
4✔
112
            v = p.get_val('traj.phase0.timeseries.v')
4✔
113
            m = p.get_val('traj.phase0.timeseries.m')
4✔
114
            T = p.get_val('traj.phase0.timeseries.T')
4✔
115

116
            import matplotlib.pyplot as plt
4✔
117
            fig, axs = plt.subplots(2, 2)
4✔
118
            axs[0, 0].plot(t, h)
4✔
119
            axs[0, 1].plot(t, v)
4✔
120
            axs[1, 0].plot(t, m)
4✔
121
            axs[1, 1].plot(t, T)
4✔
122
            plt.show()
4✔
123
        self._assert_results(p)
4✔
124

UNCOV
125
    def test_check_partials(self):
×
126
        p = goddard_rocket_direct_collocation(grid_type='cgl')
7✔
127
        p.run_model()
4✔
128
        cpd = p.check_partials(method='cs', out_stream=None)
4✔
129
        assert_check_partials(cpd)
4✔
130

131

UNCOV
132
if __name__ == "__main__":
×
133
    unittest.main()
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc