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.
Files changed (170) hide show
  1. common_widgets/__init__.py +6 -0
  2. common_widgets/animated_toggle.py +141 -0
  3. common_widgets/color.py +17 -0
  4. common_widgets/data_entry_widget.py +337 -0
  5. common_widgets/image_widget.py +21 -0
  6. common_widgets/unit_picker_widget.py +48 -0
  7. main.py +168 -0
  8. rcaide_gui-1.0.0.dist-info/METADATA +96 -0
  9. rcaide_gui-1.0.0.dist-info/RECORD +170 -0
  10. rcaide_gui-1.0.0.dist-info/WHEEL +5 -0
  11. rcaide_gui-1.0.0.dist-info/entry_points.txt +2 -0
  12. rcaide_gui-1.0.0.dist-info/top_level.txt +5 -0
  13. rcaide_io.py +818 -0
  14. tabs/__init__.py +10 -0
  15. tabs/aircraft_configs/__init__.py +3 -0
  16. tabs/aircraft_configs/aircraft_configs.py +301 -0
  17. tabs/analysis/__init__.py +4 -0
  18. tabs/analysis/analysis.py +92 -0
  19. tabs/analysis/widgets/__init__.py +13 -0
  20. tabs/analysis/widgets/aeroacoustics_widget.py +158 -0
  21. tabs/analysis/widgets/aerodynamics_widget.py +108 -0
  22. tabs/analysis/widgets/analysis_data_widget.py +29 -0
  23. tabs/analysis/widgets/atmosphere_widget.py +49 -0
  24. tabs/analysis/widgets/costs_widget.py +35 -0
  25. tabs/analysis/widgets/energy_widget.py +32 -0
  26. tabs/analysis/widgets/geometry_widget.py +55 -0
  27. tabs/analysis/widgets/planets_widget.py +34 -0
  28. tabs/analysis/widgets/propulsion_widget.py +53 -0
  29. tabs/analysis/widgets/stability_widget.py +34 -0
  30. tabs/analysis/widgets/weights_widget.py +94 -0
  31. tabs/geometry/__init__.py +6 -0
  32. tabs/geometry/aircraft_configs.py +232 -0
  33. tabs/geometry/frames/__init__.py +15 -0
  34. tabs/geometry/frames/booms/__init__.py +5 -0
  35. tabs/geometry/frames/booms/boom_frame.py +238 -0
  36. tabs/geometry/frames/cargo_bays/__init__.py +5 -0
  37. tabs/geometry/frames/cargo_bays/cargo_bay_frame.py +159 -0
  38. tabs/geometry/frames/default_frame.py +23 -0
  39. tabs/geometry/frames/energy_network/__init__.py +2 -0
  40. tabs/geometry/frames/energy_network/turbofan_network/__init__.py +3 -0
  41. tabs/geometry/frames/energy_network/turbofan_network/frames/__init__.py +1 -0
  42. tabs/geometry/frames/energy_network/turbofan_network/widgets/__init__.py +1 -0
  43. tabs/geometry/frames/fuselages/__init__.py +5 -0
  44. tabs/geometry/frames/fuselages/fuselage_frame.py +294 -0
  45. tabs/geometry/frames/geometry_frame.py +91 -0
  46. tabs/geometry/frames/landing_gears/__init__.py +5 -0
  47. tabs/geometry/frames/landing_gears/landing_gear_frame.py +189 -0
  48. tabs/geometry/frames/nacelles/__init__.py +1 -0
  49. tabs/geometry/frames/powertrain/__init__.py +6 -0
  50. tabs/geometry/frames/powertrain/converters/__init__.py +5 -0
  51. tabs/geometry/frames/powertrain/converters/converter_frame.py +137 -0
  52. tabs/geometry/frames/powertrain/distributors/__init__.py +5 -0
  53. tabs/geometry/frames/powertrain/distributors/distributor_frame.py +143 -0
  54. tabs/geometry/frames/powertrain/nacelles/__init__.py +5 -0
  55. tabs/geometry/frames/powertrain/nacelles/nacelle_frame.py +283 -0
  56. tabs/geometry/frames/powertrain/powertrain_frame.py +259 -0
  57. tabs/geometry/frames/powertrain/propulsors/__init__.py +5 -0
  58. tabs/geometry/frames/powertrain/propulsors/propulsor_frame.py +146 -0
  59. tabs/geometry/frames/powertrain/sources/__init__.py +6 -0
  60. tabs/geometry/frames/powertrain/sources/energy_source_frame.py +147 -0
  61. tabs/geometry/frames/vehicle_frame.py +171 -0
  62. tabs/geometry/frames/wings/__init__.py +5 -0
  63. tabs/geometry/frames/wings/wings_frame.py +457 -0
  64. tabs/geometry/geometry.py +513 -0
  65. tabs/geometry/widgets/__init__.py +12 -0
  66. tabs/geometry/widgets/booms/__init__.py +6 -0
  67. tabs/geometry/widgets/booms/boom_section_widget.py +109 -0
  68. tabs/geometry/widgets/cargo_bays/__init__.py +1 -0
  69. tabs/geometry/widgets/fuselages/__init__.py +8 -0
  70. tabs/geometry/widgets/fuselages/cabin_class_widget.py +188 -0
  71. tabs/geometry/widgets/fuselages/cabin_widget.py +217 -0
  72. tabs/geometry/widgets/fuselages/fuselage_section_widget.py +190 -0
  73. tabs/geometry/widgets/geometry_data_widget.py +25 -0
  74. tabs/geometry/widgets/landing_gears/__init__.py +6 -0
  75. tabs/geometry/widgets/nacelles/__init__.py +1 -0
  76. tabs/geometry/widgets/powertrain/__init__.py +9 -0
  77. tabs/geometry/widgets/powertrain/converters/__init__.py +5 -0
  78. tabs/geometry/widgets/powertrain/converters/turboelectric_generator_widget.py +74 -0
  79. tabs/geometry/widgets/powertrain/distributors/__init__.py +5 -0
  80. tabs/geometry/widgets/powertrain/distributors/fuel_line_widget.py +81 -0
  81. tabs/geometry/widgets/powertrain/modulators/__init__.py +5 -0
  82. tabs/geometry/widgets/powertrain/modulators/esc_widget.py +58 -0
  83. tabs/geometry/widgets/powertrain/nacelles/__init__.py +5 -0
  84. tabs/geometry/widgets/powertrain/nacelles/nacelle_section_widget.py +115 -0
  85. tabs/geometry/widgets/powertrain/powertrain_connector_widget.py +136 -0
  86. tabs/geometry/widgets/powertrain/powertrain_widget.py +206 -0
  87. tabs/geometry/widgets/powertrain/propulsors/__init__.py +5 -0
  88. tabs/geometry/widgets/powertrain/propulsors/turbofan_widget.py +462 -0
  89. tabs/geometry/widgets/powertrain/sources/__init__.py +6 -0
  90. tabs/geometry/widgets/powertrain/sources/fuel_tank_widget.py +103 -0
  91. tabs/geometry/widgets/powertrain/sources/source_selector_widget.py +35 -0
  92. tabs/geometry/widgets/wings/__init__.py +7 -0
  93. tabs/geometry/widgets/wings/wing_cs_widget.py +198 -0
  94. tabs/geometry/widgets/wings/wing_section_widget.py +298 -0
  95. tabs/home/__init__.py +3 -0
  96. tabs/home/home.py +585 -0
  97. tabs/mission/__init__.py +4 -0
  98. tabs/mission/mission.py +1124 -0
  99. tabs/mission/widgets/__init__.py +3 -0
  100. tabs/mission/widgets/flight_controls_widget.py +186 -0
  101. tabs/mission/widgets/mission_analysis_widget.py +166 -0
  102. tabs/mission/widgets/mission_segment_helper.py +358 -0
  103. tabs/mission/widgets/mission_segment_widget.py +358 -0
  104. tabs/solve/__init__.py +4 -0
  105. tabs/solve/plots/__init__.py +12 -0
  106. tabs/solve/plots/aeroacoustics/__init__.py +6 -0
  107. tabs/solve/plots/aeroacoustics/plot_2D_noise_contour.py +184 -0
  108. tabs/solve/plots/aeroacoustics/plot_3D_noise_contour.py +219 -0
  109. tabs/solve/plots/aeroacoustics/plot_noise_certification_contour.py +115 -0
  110. tabs/solve/plots/aeroacoustics/plot_noise_level.py +118 -0
  111. tabs/solve/plots/aerodynamics/__init__.py +10 -0
  112. tabs/solve/plots/aerodynamics/plot_aerodynamic_coefficients.py +156 -0
  113. tabs/solve/plots/aerodynamics/plot_aerodynamic_forces.py +155 -0
  114. tabs/solve/plots/aerodynamics/plot_aircraft_aerodynamics.py +136 -0
  115. tabs/solve/plots/aerodynamics/plot_drag_components.py +157 -0
  116. tabs/solve/plots/aerodynamics/plot_lift_distribution.py +107 -0
  117. tabs/solve/plots/aerodynamics/plot_rotor_conditions.py +255 -0
  118. tabs/solve/plots/aerodynamics/plot_rotor_disc_performance.py +144 -0
  119. tabs/solve/plots/aerodynamics/plot_rotor_performance.py +124 -0
  120. tabs/solve/plots/common/__init__.py +4 -0
  121. tabs/solve/plots/common/plot_style.py +71 -0
  122. tabs/solve/plots/common/set_axes.py +55 -0
  123. tabs/solve/plots/create_plot_widgets.py +34 -0
  124. tabs/solve/plots/emissions/__init__.py +3 -0
  125. tabs/solve/plots/emissions/plot_emissions.py +167 -0
  126. tabs/solve/plots/energy/__init__.py +12 -0
  127. tabs/solve/plots/energy/plot_altitude_sfc_weight.py +134 -0
  128. tabs/solve/plots/energy/plot_battery_cell_conditions.py +154 -0
  129. tabs/solve/plots/energy/plot_battery_degradation.py +157 -0
  130. tabs/solve/plots/energy/plot_battery_module_C_rates.py +139 -0
  131. tabs/solve/plots/energy/plot_battery_module_conditions.py +157 -0
  132. tabs/solve/plots/energy/plot_battery_pack_conditions.py +164 -0
  133. tabs/solve/plots/energy/plot_battery_ragone_diagram.py +97 -0
  134. tabs/solve/plots/energy/plot_battery_temperature.py +136 -0
  135. tabs/solve/plots/energy/plot_electric_propulsor_efficiencies.py +136 -0
  136. tabs/solve/plots/energy/plot_propulsor_throttles.py +119 -0
  137. tabs/solve/plots/mission/__init__.py +5 -0
  138. tabs/solve/plots/mission/plot_aircraft_velocities.py +145 -0
  139. tabs/solve/plots/mission/plot_flight_conditions.py +236 -0
  140. tabs/solve/plots/mission/plot_flight_trajectory.py +172 -0
  141. tabs/solve/plots/stability/__init__.py +5 -0
  142. tabs/solve/plots/stability/plot_flight_forces_and_moments.py +163 -0
  143. tabs/solve/plots/stability/plot_lateral_stability.py +151 -0
  144. tabs/solve/plots/stability/plot_longitudinal_stability.py +173 -0
  145. tabs/solve/plots/thermal_management/__init__.py +7 -0
  146. tabs/solve/plots/thermal_management/plot_air_cooled_conditions.py +152 -0
  147. tabs/solve/plots/thermal_management/plot_cross_flow_heat_exchanger_conditions.py +185 -0
  148. tabs/solve/plots/thermal_management/plot_reservoir_conditions.py +141 -0
  149. tabs/solve/plots/thermal_management/plot_thermal_management_performance.py +105 -0
  150. tabs/solve/plots/thermal_management/plot_wavy_channel_conditions.py +161 -0
  151. tabs/solve/plots/weights/__init__.py +4 -0
  152. tabs/solve/plots/weights/plot_load_diagram.py +163 -0
  153. tabs/solve/plots/weights/plot_weight_breakdown.py +164 -0
  154. tabs/solve/solve.py +1498 -0
  155. tabs/style_sheet.py +114 -0
  156. tabs/tab_widget.py +14 -0
  157. tabs/visualize_geometry/__init__.py +4 -0
  158. tabs/visualize_geometry/core_3d_viewer.py +253 -0
  159. tabs/visualize_geometry/features/__init__.py +10 -0
  160. tabs/visualize_geometry/features/axes_gizmo.py +173 -0
  161. tabs/visualize_geometry/features/background.py +161 -0
  162. tabs/visualize_geometry/features/blueprint.py +685 -0
  163. tabs/visualize_geometry/features/camera.py +364 -0
  164. tabs/visualize_geometry/features/drag_aircraft.py +219 -0
  165. tabs/visualize_geometry/features/grid.py +194 -0
  166. tabs/visualize_geometry/features/measurement.py +367 -0
  167. tabs/visualize_geometry/features/screenshot.py +91 -0
  168. tabs/visualize_geometry/geometry_helper_functions.py +3 -0
  169. tabs/visualize_geometry/visualize_geometry.py +731 -0
  170. 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,5 @@
1
+ # RCAIDE_GUI/tabs/solve/plots/stability/__init__.py
2
+
3
+ from .plot_flight_forces_and_moments import plot_flight_forces_and_moments
4
+ from .plot_longitudinal_stability import plot_longitudinal_stability
5
+ from .plot_lateral_stability import plot_lateral_stability
@@ -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