RCAIDE-GUI 1.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- common_widgets/__init__.py +6 -0
- common_widgets/animated_toggle.py +141 -0
- common_widgets/color.py +17 -0
- common_widgets/data_entry_widget.py +337 -0
- common_widgets/image_widget.py +21 -0
- common_widgets/unit_picker_widget.py +48 -0
- main.py +168 -0
- rcaide_gui-1.0.0.dist-info/METADATA +96 -0
- rcaide_gui-1.0.0.dist-info/RECORD +170 -0
- rcaide_gui-1.0.0.dist-info/WHEEL +5 -0
- rcaide_gui-1.0.0.dist-info/entry_points.txt +2 -0
- rcaide_gui-1.0.0.dist-info/top_level.txt +5 -0
- rcaide_io.py +818 -0
- tabs/__init__.py +10 -0
- tabs/aircraft_configs/__init__.py +3 -0
- tabs/aircraft_configs/aircraft_configs.py +301 -0
- tabs/analysis/__init__.py +4 -0
- tabs/analysis/analysis.py +92 -0
- tabs/analysis/widgets/__init__.py +13 -0
- tabs/analysis/widgets/aeroacoustics_widget.py +158 -0
- tabs/analysis/widgets/aerodynamics_widget.py +108 -0
- tabs/analysis/widgets/analysis_data_widget.py +29 -0
- tabs/analysis/widgets/atmosphere_widget.py +49 -0
- tabs/analysis/widgets/costs_widget.py +35 -0
- tabs/analysis/widgets/energy_widget.py +32 -0
- tabs/analysis/widgets/geometry_widget.py +55 -0
- tabs/analysis/widgets/planets_widget.py +34 -0
- tabs/analysis/widgets/propulsion_widget.py +53 -0
- tabs/analysis/widgets/stability_widget.py +34 -0
- tabs/analysis/widgets/weights_widget.py +94 -0
- tabs/geometry/__init__.py +6 -0
- tabs/geometry/aircraft_configs.py +232 -0
- tabs/geometry/frames/__init__.py +15 -0
- tabs/geometry/frames/booms/__init__.py +5 -0
- tabs/geometry/frames/booms/boom_frame.py +238 -0
- tabs/geometry/frames/cargo_bays/__init__.py +5 -0
- tabs/geometry/frames/cargo_bays/cargo_bay_frame.py +159 -0
- tabs/geometry/frames/default_frame.py +23 -0
- tabs/geometry/frames/energy_network/__init__.py +2 -0
- tabs/geometry/frames/energy_network/turbofan_network/__init__.py +3 -0
- tabs/geometry/frames/energy_network/turbofan_network/frames/__init__.py +1 -0
- tabs/geometry/frames/energy_network/turbofan_network/widgets/__init__.py +1 -0
- tabs/geometry/frames/fuselages/__init__.py +5 -0
- tabs/geometry/frames/fuselages/fuselage_frame.py +294 -0
- tabs/geometry/frames/geometry_frame.py +91 -0
- tabs/geometry/frames/landing_gears/__init__.py +5 -0
- tabs/geometry/frames/landing_gears/landing_gear_frame.py +189 -0
- tabs/geometry/frames/nacelles/__init__.py +1 -0
- tabs/geometry/frames/powertrain/__init__.py +6 -0
- tabs/geometry/frames/powertrain/converters/__init__.py +5 -0
- tabs/geometry/frames/powertrain/converters/converter_frame.py +137 -0
- tabs/geometry/frames/powertrain/distributors/__init__.py +5 -0
- tabs/geometry/frames/powertrain/distributors/distributor_frame.py +143 -0
- tabs/geometry/frames/powertrain/nacelles/__init__.py +5 -0
- tabs/geometry/frames/powertrain/nacelles/nacelle_frame.py +283 -0
- tabs/geometry/frames/powertrain/powertrain_frame.py +259 -0
- tabs/geometry/frames/powertrain/propulsors/__init__.py +5 -0
- tabs/geometry/frames/powertrain/propulsors/propulsor_frame.py +146 -0
- tabs/geometry/frames/powertrain/sources/__init__.py +6 -0
- tabs/geometry/frames/powertrain/sources/energy_source_frame.py +147 -0
- tabs/geometry/frames/vehicle_frame.py +171 -0
- tabs/geometry/frames/wings/__init__.py +5 -0
- tabs/geometry/frames/wings/wings_frame.py +457 -0
- tabs/geometry/geometry.py +513 -0
- tabs/geometry/widgets/__init__.py +12 -0
- tabs/geometry/widgets/booms/__init__.py +6 -0
- tabs/geometry/widgets/booms/boom_section_widget.py +109 -0
- tabs/geometry/widgets/cargo_bays/__init__.py +1 -0
- tabs/geometry/widgets/fuselages/__init__.py +8 -0
- tabs/geometry/widgets/fuselages/cabin_class_widget.py +188 -0
- tabs/geometry/widgets/fuselages/cabin_widget.py +217 -0
- tabs/geometry/widgets/fuselages/fuselage_section_widget.py +190 -0
- tabs/geometry/widgets/geometry_data_widget.py +25 -0
- tabs/geometry/widgets/landing_gears/__init__.py +6 -0
- tabs/geometry/widgets/nacelles/__init__.py +1 -0
- tabs/geometry/widgets/powertrain/__init__.py +9 -0
- tabs/geometry/widgets/powertrain/converters/__init__.py +5 -0
- tabs/geometry/widgets/powertrain/converters/turboelectric_generator_widget.py +74 -0
- tabs/geometry/widgets/powertrain/distributors/__init__.py +5 -0
- tabs/geometry/widgets/powertrain/distributors/fuel_line_widget.py +81 -0
- tabs/geometry/widgets/powertrain/modulators/__init__.py +5 -0
- tabs/geometry/widgets/powertrain/modulators/esc_widget.py +58 -0
- tabs/geometry/widgets/powertrain/nacelles/__init__.py +5 -0
- tabs/geometry/widgets/powertrain/nacelles/nacelle_section_widget.py +115 -0
- tabs/geometry/widgets/powertrain/powertrain_connector_widget.py +136 -0
- tabs/geometry/widgets/powertrain/powertrain_widget.py +206 -0
- tabs/geometry/widgets/powertrain/propulsors/__init__.py +5 -0
- tabs/geometry/widgets/powertrain/propulsors/turbofan_widget.py +462 -0
- tabs/geometry/widgets/powertrain/sources/__init__.py +6 -0
- tabs/geometry/widgets/powertrain/sources/fuel_tank_widget.py +103 -0
- tabs/geometry/widgets/powertrain/sources/source_selector_widget.py +35 -0
- tabs/geometry/widgets/wings/__init__.py +7 -0
- tabs/geometry/widgets/wings/wing_cs_widget.py +198 -0
- tabs/geometry/widgets/wings/wing_section_widget.py +298 -0
- tabs/home/__init__.py +3 -0
- tabs/home/home.py +585 -0
- tabs/mission/__init__.py +4 -0
- tabs/mission/mission.py +1124 -0
- tabs/mission/widgets/__init__.py +3 -0
- tabs/mission/widgets/flight_controls_widget.py +186 -0
- tabs/mission/widgets/mission_analysis_widget.py +166 -0
- tabs/mission/widgets/mission_segment_helper.py +358 -0
- tabs/mission/widgets/mission_segment_widget.py +358 -0
- tabs/solve/__init__.py +4 -0
- tabs/solve/plots/__init__.py +12 -0
- tabs/solve/plots/aeroacoustics/__init__.py +6 -0
- tabs/solve/plots/aeroacoustics/plot_2D_noise_contour.py +184 -0
- tabs/solve/plots/aeroacoustics/plot_3D_noise_contour.py +219 -0
- tabs/solve/plots/aeroacoustics/plot_noise_certification_contour.py +115 -0
- tabs/solve/plots/aeroacoustics/plot_noise_level.py +118 -0
- tabs/solve/plots/aerodynamics/__init__.py +10 -0
- tabs/solve/plots/aerodynamics/plot_aerodynamic_coefficients.py +156 -0
- tabs/solve/plots/aerodynamics/plot_aerodynamic_forces.py +155 -0
- tabs/solve/plots/aerodynamics/plot_aircraft_aerodynamics.py +136 -0
- tabs/solve/plots/aerodynamics/plot_drag_components.py +157 -0
- tabs/solve/plots/aerodynamics/plot_lift_distribution.py +107 -0
- tabs/solve/plots/aerodynamics/plot_rotor_conditions.py +255 -0
- tabs/solve/plots/aerodynamics/plot_rotor_disc_performance.py +144 -0
- tabs/solve/plots/aerodynamics/plot_rotor_performance.py +124 -0
- tabs/solve/plots/common/__init__.py +4 -0
- tabs/solve/plots/common/plot_style.py +71 -0
- tabs/solve/plots/common/set_axes.py +55 -0
- tabs/solve/plots/create_plot_widgets.py +34 -0
- tabs/solve/plots/emissions/__init__.py +3 -0
- tabs/solve/plots/emissions/plot_emissions.py +167 -0
- tabs/solve/plots/energy/__init__.py +12 -0
- tabs/solve/plots/energy/plot_altitude_sfc_weight.py +134 -0
- tabs/solve/plots/energy/plot_battery_cell_conditions.py +154 -0
- tabs/solve/plots/energy/plot_battery_degradation.py +157 -0
- tabs/solve/plots/energy/plot_battery_module_C_rates.py +139 -0
- tabs/solve/plots/energy/plot_battery_module_conditions.py +157 -0
- tabs/solve/plots/energy/plot_battery_pack_conditions.py +164 -0
- tabs/solve/plots/energy/plot_battery_ragone_diagram.py +97 -0
- tabs/solve/plots/energy/plot_battery_temperature.py +136 -0
- tabs/solve/plots/energy/plot_electric_propulsor_efficiencies.py +136 -0
- tabs/solve/plots/energy/plot_propulsor_throttles.py +119 -0
- tabs/solve/plots/mission/__init__.py +5 -0
- tabs/solve/plots/mission/plot_aircraft_velocities.py +145 -0
- tabs/solve/plots/mission/plot_flight_conditions.py +236 -0
- tabs/solve/plots/mission/plot_flight_trajectory.py +172 -0
- tabs/solve/plots/stability/__init__.py +5 -0
- tabs/solve/plots/stability/plot_flight_forces_and_moments.py +163 -0
- tabs/solve/plots/stability/plot_lateral_stability.py +151 -0
- tabs/solve/plots/stability/plot_longitudinal_stability.py +173 -0
- tabs/solve/plots/thermal_management/__init__.py +7 -0
- tabs/solve/plots/thermal_management/plot_air_cooled_conditions.py +152 -0
- tabs/solve/plots/thermal_management/plot_cross_flow_heat_exchanger_conditions.py +185 -0
- tabs/solve/plots/thermal_management/plot_reservoir_conditions.py +141 -0
- tabs/solve/plots/thermal_management/plot_thermal_management_performance.py +105 -0
- tabs/solve/plots/thermal_management/plot_wavy_channel_conditions.py +161 -0
- tabs/solve/plots/weights/__init__.py +4 -0
- tabs/solve/plots/weights/plot_load_diagram.py +163 -0
- tabs/solve/plots/weights/plot_weight_breakdown.py +164 -0
- tabs/solve/solve.py +1498 -0
- tabs/style_sheet.py +114 -0
- tabs/tab_widget.py +14 -0
- tabs/visualize_geometry/__init__.py +4 -0
- tabs/visualize_geometry/core_3d_viewer.py +253 -0
- tabs/visualize_geometry/features/__init__.py +10 -0
- tabs/visualize_geometry/features/axes_gizmo.py +173 -0
- tabs/visualize_geometry/features/background.py +161 -0
- tabs/visualize_geometry/features/blueprint.py +685 -0
- tabs/visualize_geometry/features/camera.py +364 -0
- tabs/visualize_geometry/features/drag_aircraft.py +219 -0
- tabs/visualize_geometry/features/grid.py +194 -0
- tabs/visualize_geometry/features/measurement.py +367 -0
- tabs/visualize_geometry/features/screenshot.py +91 -0
- tabs/visualize_geometry/geometry_helper_functions.py +3 -0
- tabs/visualize_geometry/visualize_geometry.py +731 -0
- utilities.py +257 -0
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
# RCAIDE_GUI/tabs/solve/plots/mission/plot_flight_trajectory.py
|
|
2
|
+
|
|
3
|
+
# RCAIDE imports
|
|
4
|
+
from RCAIDE.Framework.Core import Units
|
|
5
|
+
from RCAIDE.Library.Plots.Common import set_axes, plot_style
|
|
6
|
+
|
|
7
|
+
# Python imports
|
|
8
|
+
import matplotlib.pyplot as plt
|
|
9
|
+
import matplotlib.cm as cm
|
|
10
|
+
import numpy as np
|
|
11
|
+
|
|
12
|
+
# ------------------------------------------------------------------------------
|
|
13
|
+
# Plot Flight Trajectory
|
|
14
|
+
# ------------------------------------------------------------------------------
|
|
15
|
+
def plot_flight_trajectory(results,
|
|
16
|
+
line_color = 'bo-',
|
|
17
|
+
line_color2 = 'rs--',
|
|
18
|
+
save_figure = False,
|
|
19
|
+
show_legend = True,
|
|
20
|
+
save_filename = "Flight_Trajectory",
|
|
21
|
+
file_type = ".png",
|
|
22
|
+
width = 11, height = 7):
|
|
23
|
+
"""
|
|
24
|
+
Creates a multi-panel visualization of aircraft trajectory and mission profile.
|
|
25
|
+
|
|
26
|
+
Parameters
|
|
27
|
+
----------
|
|
28
|
+
results : Results
|
|
29
|
+
RCAIDE results data structure containing:
|
|
30
|
+
|
|
31
|
+
- segments[i].conditions.frames.inertial.time[:,0]
|
|
32
|
+
Time history for each segment
|
|
33
|
+
- segments[i].conditions.frames.inertial.aircraft_range[:,0]
|
|
34
|
+
Range history for each segment
|
|
35
|
+
- segments[i].conditions.frames.inertial.position_vector[:,0:3]
|
|
36
|
+
3D position vector containing:
|
|
37
|
+
- [:,0]: x-position
|
|
38
|
+
- [:,1]: y-position
|
|
39
|
+
- [:,2]: z-position
|
|
40
|
+
- segments[i].tag
|
|
41
|
+
Name/identifier of each segment
|
|
42
|
+
|
|
43
|
+
line_color : str, optional
|
|
44
|
+
Primary line style specification (default: 'bo-')
|
|
45
|
+
|
|
46
|
+
line_color2 : str, optional
|
|
47
|
+
Secondary line style specification (default: 'rs--')
|
|
48
|
+
|
|
49
|
+
save_figure : bool, optional
|
|
50
|
+
Flag for saving the figure (default: False)
|
|
51
|
+
|
|
52
|
+
show_legend : bool, optional
|
|
53
|
+
Flag to display segment legend (default: True)
|
|
54
|
+
|
|
55
|
+
save_filename : str, optional
|
|
56
|
+
Name of file for saved figure (default: "Flight_Trajectory")
|
|
57
|
+
|
|
58
|
+
file_type : str, optional
|
|
59
|
+
File extension for saved figure (default: ".png")
|
|
60
|
+
|
|
61
|
+
width : float, optional
|
|
62
|
+
Figure width in inches (default: 11)
|
|
63
|
+
|
|
64
|
+
height : float, optional
|
|
65
|
+
Figure height in inches (default: 7)
|
|
66
|
+
|
|
67
|
+
Returns
|
|
68
|
+
-------
|
|
69
|
+
fig : matplotlib.figure.Figure
|
|
70
|
+
Handle to the generated figure containing four subplots:
|
|
71
|
+
- Range vs time
|
|
72
|
+
- Top view (x-y plane)
|
|
73
|
+
- Altitude vs time
|
|
74
|
+
- 3D trajectory
|
|
75
|
+
|
|
76
|
+
Notes
|
|
77
|
+
-----
|
|
78
|
+
Creates a four-panel plot showing:
|
|
79
|
+
1. Mission range profile
|
|
80
|
+
2. Top-down view of flight path
|
|
81
|
+
3. Altitude profile
|
|
82
|
+
4. Complete 3D trajectory
|
|
83
|
+
|
|
84
|
+
**Major Assumptions**
|
|
85
|
+
|
|
86
|
+
* Time is in minutes
|
|
87
|
+
* Range is in nautical miles
|
|
88
|
+
* Position coordinates are in meters
|
|
89
|
+
* Z-axis points downward in inertial frame
|
|
90
|
+
|
|
91
|
+
**Definitions**
|
|
92
|
+
|
|
93
|
+
'Range'
|
|
94
|
+
Total ground distance covered
|
|
95
|
+
'Ground Track'
|
|
96
|
+
Projection of flight path onto x-y plane
|
|
97
|
+
'Altitude Profile'
|
|
98
|
+
Variation of height with time
|
|
99
|
+
|
|
100
|
+
See Also
|
|
101
|
+
--------
|
|
102
|
+
RCAIDE.Library.Plots.Mission.plot_flight_conditions : Detailed flight condition analysis
|
|
103
|
+
RCAIDE.Library.Plots.Mission.plot_aircraft_velocities : Aircraft speed profiles
|
|
104
|
+
"""
|
|
105
|
+
|
|
106
|
+
# get plotting style
|
|
107
|
+
ps = plot_style()
|
|
108
|
+
|
|
109
|
+
parameters = {'axes.labelsize': ps.axis_font_size,
|
|
110
|
+
'xtick.labelsize': ps.axis_font_size,
|
|
111
|
+
'ytick.labelsize': ps.axis_font_size,
|
|
112
|
+
'axes.titlesize': ps.title_font_size}
|
|
113
|
+
plt.rcParams.update(parameters)
|
|
114
|
+
|
|
115
|
+
fig = plt.figure(save_filename)
|
|
116
|
+
fig.set_size_inches(width,height)
|
|
117
|
+
|
|
118
|
+
# get line colors for plots
|
|
119
|
+
line_colors = cm.inferno(np.linspace(0,0.9,len(results.segments)))
|
|
120
|
+
|
|
121
|
+
for i in range(len(results.segments)):
|
|
122
|
+
time = results.segments[i].conditions.frames.inertial.time[:,0] / Units.min
|
|
123
|
+
Range = results.segments[i].conditions.frames.inertial.aircraft_range[:,0]/Units.nmi
|
|
124
|
+
x = results.segments[i].conditions.frames.inertial.position_vector[:,0]
|
|
125
|
+
y = results.segments[i].conditions.frames.inertial.position_vector[:,1]
|
|
126
|
+
z = -results.segments[i].conditions.frames.inertial.position_vector[:,2]
|
|
127
|
+
|
|
128
|
+
segment_tag = results.segments[i].tag
|
|
129
|
+
segment_name = segment_tag.replace('_', ' ')
|
|
130
|
+
|
|
131
|
+
axes = plt.subplot(2,2,1)
|
|
132
|
+
axes.plot( time , Range, color = line_colors[i], marker = ps.markers[0], linewidth = ps.line_width , label = segment_name)
|
|
133
|
+
axes.set_ylabel('Distance (nmi)')
|
|
134
|
+
axes.set_xlabel('Time (min)')
|
|
135
|
+
set_axes(axes)
|
|
136
|
+
|
|
137
|
+
axes = plt.subplot(2,2,2)
|
|
138
|
+
axes.plot(x, y , line_color, color = line_colors[i], marker = ps.markers[0], linewidth = ps.line_width )
|
|
139
|
+
axes.set_xlabel('x (m)')
|
|
140
|
+
axes.set_ylabel('y (m)')
|
|
141
|
+
set_axes(axes)
|
|
142
|
+
|
|
143
|
+
axes = plt.subplot(2,2,3)
|
|
144
|
+
axes.plot( time , z, line_color , color = line_colors[i], marker = ps.markers[0], linewidth = ps.line_width )
|
|
145
|
+
axes.set_ylabel('z (m)')
|
|
146
|
+
axes.set_xlabel('Time (min)')
|
|
147
|
+
set_axes(axes)
|
|
148
|
+
|
|
149
|
+
axes = plt.subplot(2,2,4, projection='3d')
|
|
150
|
+
axes.scatter(x, y, z, marker='o',color = line_colors[i])
|
|
151
|
+
axes.set_xlabel('x')
|
|
152
|
+
axes.set_ylabel('y')
|
|
153
|
+
axes.set_zlabel('z')
|
|
154
|
+
axes.set_box_aspect([1,1,1])
|
|
155
|
+
set_axes(axes)
|
|
156
|
+
|
|
157
|
+
if show_legend:
|
|
158
|
+
leg = fig.legend(bbox_to_anchor=(0.5, 0.95), loc='upper center', ncol = 4)
|
|
159
|
+
leg.set_title('Flight Segment', prop={'size': ps.legend_font_size, 'weight': 'heavy'})
|
|
160
|
+
|
|
161
|
+
# Adjusting the sub-plots for legend
|
|
162
|
+
fig.tight_layout()
|
|
163
|
+
fig.subplots_adjust(top=0.8)
|
|
164
|
+
|
|
165
|
+
# set title of plot
|
|
166
|
+
title_text = 'Flight Trajectory'
|
|
167
|
+
fig.suptitle(title_text)
|
|
168
|
+
|
|
169
|
+
if save_figure:
|
|
170
|
+
plt.savefig(save_filename + file_type)
|
|
171
|
+
|
|
172
|
+
return fig
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
# RCAIDE_GUI/tabs/solve/plots/stability/plot_flight_forces_and_moments.py
|
|
2
|
+
|
|
3
|
+
# RCAIDE imports
|
|
4
|
+
from RCAIDE.Framework.Core import Units
|
|
5
|
+
from RCAIDE.Library.Plots.Common import set_axes, plot_style
|
|
6
|
+
|
|
7
|
+
# Python imports
|
|
8
|
+
import matplotlib.pyplot as plt
|
|
9
|
+
import matplotlib.cm as cm
|
|
10
|
+
import numpy as np
|
|
11
|
+
|
|
12
|
+
# ------------------------------------------------------------------------------
|
|
13
|
+
# Plot Flight Forces and Moments
|
|
14
|
+
# ------------------------------------------------------------------------------
|
|
15
|
+
def plot_flight_forces_and_moments(results,
|
|
16
|
+
save_figure = False,
|
|
17
|
+
show_legend = True,
|
|
18
|
+
save_filename = "Aerodynamic_Wind_Frame_Forces_and_Moments",
|
|
19
|
+
file_type = ".png",
|
|
20
|
+
width = 12, height = 8):
|
|
21
|
+
"""
|
|
22
|
+
Creates a multi-panel visualization of aircraft forces and moments in the inertial frame.
|
|
23
|
+
|
|
24
|
+
Parameters
|
|
25
|
+
----------
|
|
26
|
+
results : Results
|
|
27
|
+
RCAIDE results data structure containing:
|
|
28
|
+
- segments[i].conditions.frames.inertial.time[:,0]
|
|
29
|
+
Time history for each segment
|
|
30
|
+
- segments[i].conditions.frames.inertial.total_force_vector[:,0:3]
|
|
31
|
+
Force components [X, Y, Z] in inertial frame
|
|
32
|
+
- segments[i].conditions.frames.inertial.total_moment_vector[:,0:3]
|
|
33
|
+
Moment components [L, M, N] in inertial frame
|
|
34
|
+
- segments[i].tag
|
|
35
|
+
Name/identifier of each segment
|
|
36
|
+
|
|
37
|
+
save_figure : bool, optional
|
|
38
|
+
Flag for saving the figure (default: False)
|
|
39
|
+
|
|
40
|
+
show_legend : bool, optional
|
|
41
|
+
Flag to display segment legend (default: True)
|
|
42
|
+
|
|
43
|
+
save_filename : str, optional
|
|
44
|
+
Name of file for saved figure (default: "Inertial_Forces_and_Moments")
|
|
45
|
+
|
|
46
|
+
file_type : str, optional
|
|
47
|
+
File extension for saved figure (default: ".png")
|
|
48
|
+
|
|
49
|
+
width : float, optional
|
|
50
|
+
Figure width in inches (default: 12)
|
|
51
|
+
|
|
52
|
+
height : float, optional
|
|
53
|
+
Figure height in inches (default: 8)
|
|
54
|
+
|
|
55
|
+
Returns
|
|
56
|
+
-------
|
|
57
|
+
fig : matplotlib.figure.Figure
|
|
58
|
+
|
|
59
|
+
Notes
|
|
60
|
+
-----
|
|
61
|
+
Creates visualization showing:
|
|
62
|
+
* All force components in inertial frame
|
|
63
|
+
* All moment components in inertial frame
|
|
64
|
+
* Time history for each segment
|
|
65
|
+
* Color-coded flight segments
|
|
66
|
+
|
|
67
|
+
**Major Assumptions**
|
|
68
|
+
* Forces are in Newtons
|
|
69
|
+
* Moments are in Newton-meters
|
|
70
|
+
* Time is in minutes
|
|
71
|
+
* Forces/moments are total (aerodynamic + propulsive + gravity)
|
|
72
|
+
|
|
73
|
+
**Definitions**
|
|
74
|
+
|
|
75
|
+
'Inertial Forces'
|
|
76
|
+
Forces in earth-fixed reference frame
|
|
77
|
+
'Inertial Moments'
|
|
78
|
+
Moments in earth-fixed reference frame
|
|
79
|
+
'Flight Segment'
|
|
80
|
+
Distinct portion of mission profile
|
|
81
|
+
|
|
82
|
+
See Also
|
|
83
|
+
--------
|
|
84
|
+
RCAIDE.Library.Plots.Stability.plot_longitudinal_stability : Longitudinal dynamics analysis
|
|
85
|
+
RCAIDE.Library.Plots.Stability.plot_lateral_stability : Lateral-directional dynamics analysis
|
|
86
|
+
"""
|
|
87
|
+
|
|
88
|
+
# get plotting style
|
|
89
|
+
ps = plot_style()
|
|
90
|
+
|
|
91
|
+
parameters = {'axes.labelsize': ps.axis_font_size,
|
|
92
|
+
'xtick.labelsize': ps.axis_font_size,
|
|
93
|
+
'ytick.labelsize': ps.axis_font_size,
|
|
94
|
+
'axes.titlesize': ps.title_font_size}
|
|
95
|
+
plt.rcParams.update(parameters)
|
|
96
|
+
|
|
97
|
+
# get line colors for plots
|
|
98
|
+
line_colors = cm.inferno(np.linspace(0,0.9,len(results.segments)))
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
fig = plt.figure(save_filename)
|
|
102
|
+
fig.set_size_inches(width,height)
|
|
103
|
+
|
|
104
|
+
axis_1 = plt.subplot(3,2,1)
|
|
105
|
+
axis_2 = plt.subplot(3,2,2)
|
|
106
|
+
axis_3 = plt.subplot(3,2,3)
|
|
107
|
+
axis_4 = plt.subplot(3,2,4)
|
|
108
|
+
axis_5 = plt.subplot(3,2,5)
|
|
109
|
+
axis_6 = plt.subplot(3,2,6)
|
|
110
|
+
|
|
111
|
+
for i in range(len(results.segments)):
|
|
112
|
+
time = results.segments[i].conditions.frames.inertial.time[:,0] / Units.min
|
|
113
|
+
X = results.segments[i].conditions.frames.wind.total_force_vector[:,0] # Changed to wind form inertial
|
|
114
|
+
Y = results.segments[i].conditions.frames.wind.total_force_vector[:,1]
|
|
115
|
+
Z = results.segments[i].conditions.frames.wind.total_force_vector[:,2]
|
|
116
|
+
L = results.segments[i].conditions.frames.wind.total_moment_vector[:,0]
|
|
117
|
+
M = results.segments[i].conditions.frames.wind.total_moment_vector[:,1]
|
|
118
|
+
N = results.segments[i].conditions.frames.wind.total_moment_vector[:,2]
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
segment_tag = results.segments[i].tag
|
|
122
|
+
segment_name = segment_tag.replace('_', ' ')
|
|
123
|
+
axis_1.plot(time,X, color = line_colors[i], marker = ps.markers[0], linewidth = ps.line_width, label = segment_name)
|
|
124
|
+
axis_1.set_ylabel(r'X (N)')
|
|
125
|
+
set_axes(axis_1)
|
|
126
|
+
|
|
127
|
+
axis_2.set_ylabel(r'L (Nm)')
|
|
128
|
+
axis_2.plot(time,L, color = line_colors[i], marker = ps.markers[0], linewidth = ps.line_width)
|
|
129
|
+
set_axes(axis_2)
|
|
130
|
+
|
|
131
|
+
axis_3.plot(time,Y, color = line_colors[i], marker = ps.markers[0], linewidth = ps.line_width)
|
|
132
|
+
axis_3.set_ylabel(r'Y (N)')
|
|
133
|
+
set_axes(axis_3)
|
|
134
|
+
|
|
135
|
+
axis_4.plot(time,M, color = line_colors[i], marker = ps.markers[0], linewidth = ps.line_width)
|
|
136
|
+
axis_4.set_ylabel(r'M (Nm)')
|
|
137
|
+
set_axes(axis_4)
|
|
138
|
+
|
|
139
|
+
axis_5.plot(time, Z, color = line_colors[i], marker = ps.markers[0], linewidth = ps.line_width)
|
|
140
|
+
axis_5.set_xlabel('Time (mins)')
|
|
141
|
+
axis_5.set_ylabel(r'Z (N)')
|
|
142
|
+
set_axes(axis_5)
|
|
143
|
+
|
|
144
|
+
axis_6.plot(time, N, color = line_colors[i], marker = ps.markers[0], linewidth = ps.line_width)
|
|
145
|
+
axis_6.set_xlabel('Time (mins)')
|
|
146
|
+
axis_6.set_ylabel(r'N (Nm)')
|
|
147
|
+
set_axes(axis_6)
|
|
148
|
+
|
|
149
|
+
if show_legend:
|
|
150
|
+
leg = fig.legend(bbox_to_anchor=(0.5, 0.95), loc='upper center', ncol = 4)
|
|
151
|
+
leg.set_title('Flight Segment', prop={'size': ps.legend_font_size, 'weight': 'heavy'})
|
|
152
|
+
|
|
153
|
+
# Adjusting the sub-plots for legend
|
|
154
|
+
fig.tight_layout()
|
|
155
|
+
fig.subplots_adjust(top=0.8)
|
|
156
|
+
|
|
157
|
+
# set title of plot
|
|
158
|
+
title_text = 'Intertial Forces and Moments'
|
|
159
|
+
fig.suptitle(title_text)
|
|
160
|
+
|
|
161
|
+
if save_figure:
|
|
162
|
+
plt.savefig(save_filename + file_type)
|
|
163
|
+
return fig
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# RCAIDE/Library/Plots/Performance/Stability/plot_lateral_stability.py
|
|
2
|
+
#
|
|
3
|
+
#
|
|
4
|
+
# Created: Jul 2023, M. Clarke
|
|
5
|
+
|
|
6
|
+
# ----------------------------------------------------------------------------------------------------------------------
|
|
7
|
+
# IMPORT
|
|
8
|
+
# ----------------------------------------------------------------------------------------------------------------------
|
|
9
|
+
from RCAIDE.Framework.Core import Units
|
|
10
|
+
from RCAIDE.Library.Plots.Common import set_axes, plot_style
|
|
11
|
+
import matplotlib.pyplot as plt
|
|
12
|
+
import matplotlib.cm as cm
|
|
13
|
+
import numpy as np
|
|
14
|
+
|
|
15
|
+
# ----------------------------------------------------------------------------------------------------------------------
|
|
16
|
+
# PLOTS
|
|
17
|
+
# ----------------------------------------------------------------------------------------------------------------------
|
|
18
|
+
def plot_lateral_stability(results,
|
|
19
|
+
save_figure = False,
|
|
20
|
+
show_legend = True,
|
|
21
|
+
save_filename = "Lateral_Stability",
|
|
22
|
+
file_type = ".png",
|
|
23
|
+
width = 11, height = 7):
|
|
24
|
+
"""
|
|
25
|
+
Creates a multi-panel visualization of lateral-directional stability characteristics.
|
|
26
|
+
|
|
27
|
+
Parameters
|
|
28
|
+
----------
|
|
29
|
+
results : Results
|
|
30
|
+
RCAIDE results data structure containing:
|
|
31
|
+
- segments[i].conditions.frames.inertial.time[:,0]
|
|
32
|
+
Time history for each segment
|
|
33
|
+
- segments[i].conditions.aerodynamics.angles.phi[:,0]
|
|
34
|
+
Bank angle history
|
|
35
|
+
- segments[i].conditions.control_surfaces.aileron.deflection[:,0]
|
|
36
|
+
Aileron deflection history
|
|
37
|
+
- segments[i].conditions.control_surfaces.rudder.deflection[:,0]
|
|
38
|
+
Rudder deflection history
|
|
39
|
+
- segments[i].tag
|
|
40
|
+
Name/identifier of each segment
|
|
41
|
+
|
|
42
|
+
save_figure : bool, optional
|
|
43
|
+
Flag for saving the figure (default: False)
|
|
44
|
+
|
|
45
|
+
show_legend : bool, optional
|
|
46
|
+
Flag to display segment legend (default: True)
|
|
47
|
+
|
|
48
|
+
save_filename : str, optional
|
|
49
|
+
Name of file for saved figure (default: "Lateral_Stability")
|
|
50
|
+
|
|
51
|
+
file_type : str, optional
|
|
52
|
+
File extension for saved figure (default: ".png")
|
|
53
|
+
|
|
54
|
+
width : float, optional
|
|
55
|
+
Figure width in inches (default: 11)
|
|
56
|
+
|
|
57
|
+
height : float, optional
|
|
58
|
+
Figure height in inches (default: 7)
|
|
59
|
+
|
|
60
|
+
Returns
|
|
61
|
+
-------
|
|
62
|
+
fig : matplotlib.figure.Figure
|
|
63
|
+
Handle to the generated figure containing three subplots:
|
|
64
|
+
* Bank angle vs time
|
|
65
|
+
* Aileron deflection vs time
|
|
66
|
+
* Rudder deflection vs time
|
|
67
|
+
|
|
68
|
+
Notes
|
|
69
|
+
-----
|
|
70
|
+
Creates visualization showing:
|
|
71
|
+
* Roll attitude response
|
|
72
|
+
* Lateral control inputs
|
|
73
|
+
* Directional control inputs
|
|
74
|
+
* Time history for each segment
|
|
75
|
+
|
|
76
|
+
**Major Assumptions**
|
|
77
|
+
* Angles are in degrees
|
|
78
|
+
* Time is in minutes
|
|
79
|
+
* Positive deflections follow right-hand rule
|
|
80
|
+
|
|
81
|
+
**Definitions**
|
|
82
|
+
|
|
83
|
+
'Bank Angle'
|
|
84
|
+
Roll attitude relative to horizon
|
|
85
|
+
'Aileron Deflection'
|
|
86
|
+
Roll control surface position
|
|
87
|
+
'Rudder Deflection'
|
|
88
|
+
Yaw control surface position
|
|
89
|
+
|
|
90
|
+
See Also
|
|
91
|
+
--------
|
|
92
|
+
RCAIDE.Library.Plots.Stability.plot_longitudinal_stability : Longitudinal stability analysis
|
|
93
|
+
RCAIDE.Library.Plots.Stability.plot_flight_forces_and_moments : Force/moment visualization
|
|
94
|
+
"""
|
|
95
|
+
|
|
96
|
+
# get plotting style
|
|
97
|
+
ps = plot_style()
|
|
98
|
+
|
|
99
|
+
parameters = {'axes.labelsize': ps.axis_font_size,
|
|
100
|
+
'xtick.labelsize': ps.axis_font_size,
|
|
101
|
+
'ytick.labelsize': ps.axis_font_size,
|
|
102
|
+
'axes.titlesize': ps.title_font_size}
|
|
103
|
+
plt.rcParams.update(parameters)
|
|
104
|
+
|
|
105
|
+
# get line colors for plots
|
|
106
|
+
line_colors = cm.inferno(np.linspace(0,0.9,len(results.segments)))
|
|
107
|
+
|
|
108
|
+
fig = plt.figure(save_filename)
|
|
109
|
+
fig.set_size_inches(width,height)
|
|
110
|
+
axis_1 = plt.subplot(2,2,1)
|
|
111
|
+
axis_2 = plt.subplot(2,2,2)
|
|
112
|
+
axis_3 = plt.subplot(2,2,3)
|
|
113
|
+
|
|
114
|
+
for i in range(len(results.segments)):
|
|
115
|
+
time = results.segments[i].conditions.frames.inertial.time[:,0] / Units.min
|
|
116
|
+
phi = -results.segments[i].conditions.aerodynamics.angles.phi[:,0] / Units.deg
|
|
117
|
+
delta_a = results.segments[i].conditions.control_surfaces.aileron.deflection[:,0] / Units.deg
|
|
118
|
+
delta_r = results.segments[i].conditions.control_surfaces.rudder.deflection[:,0] / Units.deg
|
|
119
|
+
|
|
120
|
+
segment_tag = results.segments[i].tag
|
|
121
|
+
segment_name = segment_tag.replace('_', ' ')
|
|
122
|
+
|
|
123
|
+
axis_1.plot(time, phi, color = line_colors[i], marker = ps.markers[0], linewidth = ps.line_width, label = segment_name)
|
|
124
|
+
axis_1.set_ylabel(r'$Bank Angle (deg)$')
|
|
125
|
+
set_axes(axis_1)
|
|
126
|
+
|
|
127
|
+
axis_2.plot(time,delta_a , color = line_colors[i], marker = ps.markers[0], linewidth = ps.line_width)
|
|
128
|
+
axis_2.set_xlabel('Time (mins)')
|
|
129
|
+
axis_2.set_ylabel(r'Aileron Defl. (deg)')
|
|
130
|
+
set_axes(axis_2)
|
|
131
|
+
|
|
132
|
+
axis_3.plot(time,delta_r , color = line_colors[i], marker = ps.markers[0], linewidth = ps.line_width)
|
|
133
|
+
axis_3.set_xlabel('Time (mins)')
|
|
134
|
+
axis_3.set_ylabel(r'Rudder Defl. (deg)')
|
|
135
|
+
set_axes(axis_3)
|
|
136
|
+
|
|
137
|
+
if show_legend:
|
|
138
|
+
leg = fig.legend(bbox_to_anchor=(0.5, 0.95), loc='upper center', ncol = 4)
|
|
139
|
+
leg.set_title('Flight Segment', prop={'size': ps.legend_font_size, 'weight': 'heavy'})
|
|
140
|
+
|
|
141
|
+
# Adjusting the sub-plots for legend
|
|
142
|
+
fig.tight_layout()
|
|
143
|
+
fig.subplots_adjust(top=0.8)
|
|
144
|
+
|
|
145
|
+
# set title of plot
|
|
146
|
+
title_text = 'Stability Coeffiicents'
|
|
147
|
+
fig.suptitle(title_text)
|
|
148
|
+
|
|
149
|
+
if save_figure:
|
|
150
|
+
plt.savefig(save_filename + file_type)
|
|
151
|
+
return fig
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
# RCAIDE/Library/Plots/Performance/Stability/plot_longitudinal_stability.py
|
|
2
|
+
#
|
|
3
|
+
#
|
|
4
|
+
# Created: Jul 2023, M. Clarke
|
|
5
|
+
|
|
6
|
+
# ----------------------------------------------------------------------------------------------------------------------
|
|
7
|
+
# IMPORT
|
|
8
|
+
# ----------------------------------------------------------------------------------------------------------------------
|
|
9
|
+
from RCAIDE.Framework.Core import Units
|
|
10
|
+
from RCAIDE.Library.Plots.Common import set_axes, plot_style
|
|
11
|
+
import matplotlib.pyplot as plt
|
|
12
|
+
import matplotlib.cm as cm
|
|
13
|
+
import numpy as np
|
|
14
|
+
|
|
15
|
+
# ----------------------------------------------------------------------------------------------------------------------
|
|
16
|
+
# PLOTS
|
|
17
|
+
# ----------------------------------------------------------------------------------------------------------------------
|
|
18
|
+
def plot_longitudinal_stability(results,
|
|
19
|
+
save_figure = False,
|
|
20
|
+
show_legend = True,
|
|
21
|
+
save_filename = "Longitudinal_Stability",
|
|
22
|
+
file_type = ".png",
|
|
23
|
+
width = 11, height = 7):
|
|
24
|
+
"""
|
|
25
|
+
Creates a multi-panel visualization of longitudinal stability characteristics.
|
|
26
|
+
|
|
27
|
+
Parameters
|
|
28
|
+
----------
|
|
29
|
+
results : Results
|
|
30
|
+
RCAIDE results data structure containing:
|
|
31
|
+
- segments[i].conditions.frames.inertial.time[:,0]
|
|
32
|
+
Time history for each segment
|
|
33
|
+
- segments[i].conditions.aerodynamics.angles.theta[:,0]
|
|
34
|
+
Pitch angle history
|
|
35
|
+
- segments[i].conditions.aerodynamics.angles.alpha[:,0]
|
|
36
|
+
Angle of attack history
|
|
37
|
+
- segments[i].conditions.control_surfaces.elevator.deflection[:,0]
|
|
38
|
+
Elevator deflection history
|
|
39
|
+
- segments[i].tag
|
|
40
|
+
Name/identifier of each segment
|
|
41
|
+
|
|
42
|
+
save_figure : bool, optional
|
|
43
|
+
Flag for saving the figure (default: False)
|
|
44
|
+
|
|
45
|
+
show_legend : bool, optional
|
|
46
|
+
Flag to display segment legend (default: True)
|
|
47
|
+
|
|
48
|
+
save_filename : str, optional
|
|
49
|
+
Name of file for saved figure (default: "Longitudinal_Stability")
|
|
50
|
+
|
|
51
|
+
file_type : str, optional
|
|
52
|
+
File extension for saved figure (default: ".png")
|
|
53
|
+
|
|
54
|
+
width : float, optional
|
|
55
|
+
Figure width in inches (default: 11)
|
|
56
|
+
|
|
57
|
+
height : float, optional
|
|
58
|
+
Figure height in inches (default: 7)
|
|
59
|
+
|
|
60
|
+
Returns
|
|
61
|
+
-------
|
|
62
|
+
fig : matplotlib.figure.Figure
|
|
63
|
+
|
|
64
|
+
Notes
|
|
65
|
+
-----
|
|
66
|
+
Creates visualization showing:
|
|
67
|
+
* Pitch attitude response
|
|
68
|
+
* Aerodynamic angle evolution
|
|
69
|
+
* Longitudinal control inputs
|
|
70
|
+
* Trajectory angle history
|
|
71
|
+
* Time history for each segment
|
|
72
|
+
|
|
73
|
+
**Major Assumptions**
|
|
74
|
+
* Angles are in degrees
|
|
75
|
+
* Time is in minutes
|
|
76
|
+
* Positive deflections follow right-hand rule
|
|
77
|
+
|
|
78
|
+
**Definitions**
|
|
79
|
+
|
|
80
|
+
'Pitch Angle'
|
|
81
|
+
Nose-up/down attitude relative to horizon
|
|
82
|
+
'Angle of Attack'
|
|
83
|
+
Angle between velocity vector and body reference line
|
|
84
|
+
'Flight Path Angle'
|
|
85
|
+
Angle between velocity vector and horizon
|
|
86
|
+
'Elevator Deflection'
|
|
87
|
+
Pitch control surface position
|
|
88
|
+
|
|
89
|
+
See Also
|
|
90
|
+
--------
|
|
91
|
+
RCAIDE.Library.Plots.Stability.plot_lateral_stability : Lateral-directional stability analysis
|
|
92
|
+
RCAIDE.Library.Plots.Stability.plot_flight_forces_and_moments : Force/moment visualization
|
|
93
|
+
"""
|
|
94
|
+
|
|
95
|
+
# get plotting style
|
|
96
|
+
ps = plot_style()
|
|
97
|
+
|
|
98
|
+
parameters = {'axes.labelsize': ps.axis_font_size,
|
|
99
|
+
'xtick.labelsize': ps.axis_font_size,
|
|
100
|
+
'ytick.labelsize': ps.axis_font_size,
|
|
101
|
+
'axes.titlesize': ps.title_font_size}
|
|
102
|
+
plt.rcParams.update(parameters)
|
|
103
|
+
|
|
104
|
+
# get line colors for plots
|
|
105
|
+
line_colors = cm.inferno(np.linspace(0,0.9,len(results.segments)))
|
|
106
|
+
|
|
107
|
+
fig = plt.figure(save_filename)
|
|
108
|
+
fig.set_size_inches(width,height)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
axis_1 = plt.subplot(3,2,1)
|
|
112
|
+
axis_2 = plt.subplot(3,2,2)
|
|
113
|
+
axis_3 = plt.subplot(3,2,3)
|
|
114
|
+
axis_4 = plt.subplot(3,2,4)
|
|
115
|
+
axis_5 = plt.subplot(3,2,5)
|
|
116
|
+
axis_6 = plt.subplot(3,2,6)
|
|
117
|
+
|
|
118
|
+
for i in range(len(results.segments)):
|
|
119
|
+
time = results.segments[i].conditions.frames.inertial.time[:,0] / Units.min
|
|
120
|
+
c_m = results.segments[i].conditions.static_stability.coefficients.M[:,0]
|
|
121
|
+
SM = results.segments[i].conditions.static_stability.static_margin[:,0]
|
|
122
|
+
delta_e = results.segments[i].conditions.control_surfaces.elevator.deflection[:,0] / Units.deg
|
|
123
|
+
CM_delta_e = results.segments[i].conditions.static_stability.derivatives.CM_delta_e[:,0]
|
|
124
|
+
Cm_alpha = results.segments[i].conditions.static_stability.derivatives.CM_alpha[:,0]
|
|
125
|
+
CL_alpha = results.segments[i].conditions.static_stability.derivatives.Clift_alpha[:,0]
|
|
126
|
+
|
|
127
|
+
segment_tag = results.segments[i].tag
|
|
128
|
+
segment_name = segment_tag.replace('_', ' ')
|
|
129
|
+
|
|
130
|
+
axis_1.plot(time, c_m, color = line_colors[i], marker = ps.markers[0], linewidth = ps.line_width, label = segment_name)
|
|
131
|
+
axis_1.set_ylabel(r'$C_M$')
|
|
132
|
+
set_axes(axis_1)
|
|
133
|
+
|
|
134
|
+
axis_2.plot(time, Cm_alpha, color = line_colors[i], marker = ps.markers[0], linewidth = ps.line_width)
|
|
135
|
+
axis_2.set_ylabel(r'$C_M\alpha$')
|
|
136
|
+
set_axes(axis_2)
|
|
137
|
+
|
|
138
|
+
axis_3.plot(time,SM , color = line_colors[i], marker = ps.markers[0], linewidth = ps.line_width)
|
|
139
|
+
axis_3.set_xlabel('Time (mins)')
|
|
140
|
+
axis_3.set_ylabel(r'Static Margin (%)')
|
|
141
|
+
set_axes(axis_3)
|
|
142
|
+
|
|
143
|
+
axis_4.plot(time,delta_e , color = line_colors[i], marker = ps.markers[0], linewidth = ps.line_width)
|
|
144
|
+
axis_4.set_xlabel('Time (mins)')
|
|
145
|
+
axis_4.set_ylabel(r'Elevator Defl.n')
|
|
146
|
+
set_axes(axis_4)
|
|
147
|
+
|
|
148
|
+
axis_5.plot(time,CM_delta_e , color = line_colors[i], marker = ps.markers[0], linewidth = ps.line_width)
|
|
149
|
+
axis_5.set_xlabel('Time (mins)')
|
|
150
|
+
axis_5.set_ylabel(r'$C_M\delta_e$')
|
|
151
|
+
set_axes(axis_5)
|
|
152
|
+
|
|
153
|
+
axis_6.plot(time,CL_alpha, color = line_colors[i], marker = ps.markers[0], linewidth = ps.line_width)
|
|
154
|
+
axis_6.set_xlabel('Time (mins)')
|
|
155
|
+
axis_6.set_ylabel(r'$C_L\alpha$')
|
|
156
|
+
set_axes(axis_6)
|
|
157
|
+
|
|
158
|
+
if show_legend:
|
|
159
|
+
leg = fig.legend(bbox_to_anchor=(0.5, 0.95), loc='upper center', ncol = 4)
|
|
160
|
+
leg.set_title('Flight Segment', prop={'size': ps.legend_font_size, 'weight': 'heavy'})
|
|
161
|
+
|
|
162
|
+
# Adjusting the sub-plots for legend
|
|
163
|
+
fig.tight_layout()
|
|
164
|
+
fig.subplots_adjust(top=0.8)
|
|
165
|
+
|
|
166
|
+
# set title of plot
|
|
167
|
+
title_text = 'Stability Coefficients'
|
|
168
|
+
fig.suptitle(title_text)
|
|
169
|
+
|
|
170
|
+
if save_figure:
|
|
171
|
+
plt.savefig(save_filename + file_type)
|
|
172
|
+
return fig
|
|
173
|
+
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# RCAIDE_GUI/tabs/solve/plots/thermal_management/__init__.py
|
|
2
|
+
|
|
3
|
+
from .plot_thermal_management_performance import plot_thermal_management_performance
|
|
4
|
+
from .plot_wavy_channel_conditions import plot_wavy_channel_conditions
|
|
5
|
+
from .plot_cross_flow_heat_exchanger_conditions import plot_cross_flow_heat_exchanger_conditions
|
|
6
|
+
from .plot_reservoir_conditions import plot_reservoir_conditions
|
|
7
|
+
from .plot_air_cooled_conditions import plot_air_cooled_conditions
|