StochasticNoseCone does not support "powerseries" nose cones
Describe the bug
The StochasticNoseCone class does not support nose cones of kind 'powerseries' as the constructor does not accept a power parameter.
To Reproduce
Attempt to call simulate() on any Monte Carlo simulation object that was initialised with a nose cone of kind "powerseries". The following is an example modified from the documentation:
import datetime from rocketpy import Environment, Flight, Function, MonteCarlo, Rocket, SolidMotor from rocketpy.stochastic import ( StochasticEnvironment, StochasticFlight, StochasticNoseCone, StochasticParachute, StochasticRailButtons, StochasticRocket, StochasticSolidMotor, StochasticTail, StochasticTrapezoidalFins, ) # Environment env = Environment(latitude=39.389700, longitude=-8.288964, elevation=113) tomorrow = datetime.date.today() + datetime.timedelta(days=1) env.set_date((tomorrow.year, tomorrow.month, tomorrow.day, 12)) env.set_atmospheric_model(type="Ensemble", file="GEFS") # Motor motor = SolidMotor( thrust_source="Data/K1102.eng", dry_mass=1.815, dry_inertia=(0.125, 0.125, 0.002), nozzle_radius=33 / 1000, grain_number=5, grain_density=1815, grain_outer_radius=33 / 1000, grain_initial_inner_radius=15 / 1000, grain_initial_height=120 / 1000, grain_separation=5 / 1000, grains_center_of_mass_position=0.397, center_of_dry_mass_position=0.317, nozzle_position=0, burn_time=3.9, throat_radius=11 / 1000, coordinate_system_orientation="nozzle_to_combustion_chamber", ) print(f"Total Impulse of the Solid Motor: {motor.total_impulse} Ns") drag_curve = Function("Data/cleaned_drag.csv") # Rocket rocket = Rocket( radius=127 / 2000, mass=14.426, inertia=(6.321, 6.321, 0.034), power_off_drag=drag_curve, power_on_drag=drag_curve, center_of_mass_without_motor=0, coordinate_system_orientation="tail_to_nose", ) rail_buttons = rocket.set_rail_buttons( upper_button_position=0.0818, lower_button_position=-0.618, angular_position=45, ) rocket.add_motor(motor, position=-1.255) nose_cone = rocket.add_nose(length=0.55829, kind="powerseries", power=0.7, position=1.278) fin_set = rocket.add_trapezoidal_fins( n=4, root_chord=0.120, tip_chord=0.060, span=0.110, position=-1.04956, cant_angle=0.5, ) tail = rocket.add_tail( top_radius=0.0635, bottom_radius=0.0435, length=0.060, position=-1.194656 ) Main = rocket.add_parachute( "Main", cd_s=10.0, trigger=800, sampling_rate=105, lag=1.5, noise=(0, 8.3, 0.5), ) Drogue = rocket.add_parachute( "Drogue", cd_s=1.0, trigger="apogee", sampling_rate=105, lag=1.5, noise=(0, 8.3, 0.5), ) # Flight test_flight = Flight( rocket=rocket, environment=env, rail_length=5, inclination=84, heading=133, ) stochastic_env = StochasticEnvironment( environment=env, ensemble_member=list(range(env.num_ensemble_members)), ) stochastic_env.visualize_attributes() wind_speed_at_1000m = [] for i in range(5): rnd_env = stochastic_env.create_object() wind_speed_at_1000m.append(rnd_env.wind_velocity_x(1000)) print(wind_speed_at_1000m) stochastic_motor = StochasticSolidMotor( solid_motor=motor, burn_start_time=(0, 0.1, "binomial"), grains_center_of_mass_position=0.001, grain_density=50, grain_separation=1 / 1000, grain_initial_height=1 / 1000, grain_initial_inner_radius=0.375 / 1000, grain_outer_radius=0.375 / 1000, total_impulse=(6500, 1000), throat_radius=0.5 / 1000, nozzle_radius=0.5 / 1000, nozzle_position=0.001, ) stochastic_motor.visualize_attributes() total_impulse = [] for i in range(5): rnd_motor = stochastic_motor.create_object() total_impulse.append(rnd_motor.total_impulse) print(total_impulse) stochastic_rocket = StochasticRocket( rocket=rocket, radius=0.0127 / 2000, mass=(15.426, 0.5, "normal"), inertia_11=(6.321, 0), inertia_22=0.01, inertia_33=0.01, center_of_mass_without_motor=0, ) stochastic_rocket.visualize_attributes() stochastic_nose_cone = StochasticNoseCone( nosecone=nose_cone, length=0.001, ) stochastic_fin_set = StochasticTrapezoidalFins( trapezoidal_fins=fin_set, root_chord=0.0005, tip_chord=0.0005, span=0.0005, ) stochastic_tail = StochasticTail( tail=tail, top_radius=0.001, bottom_radius=0.001, length=0.001, ) stochastic_rail_buttons = StochasticRailButtons( rail_buttons=rail_buttons, buttons_distance=0.001 ) stochastic_main = StochasticParachute( parachute=Main, cd_s=0.1, lag=0.1, ) stochastic_drogue = StochasticParachute( parachute=Drogue, cd_s=0.07, lag=0.2, ) stochastic_rocket.add_motor(stochastic_motor, position=0.001) stochastic_rocket.add_nose(stochastic_nose_cone, position=(1.134, 0.001)) stochastic_rocket.add_trapezoidal_fins(stochastic_fin_set, position=(0.001, "normal")) stochastic_rocket.add_tail(stochastic_tail) stochastic_rocket.set_rail_buttons( stochastic_rail_buttons, lower_button_position=(0.001, "normal") ) stochastic_rocket.add_parachute(stochastic_main) stochastic_rocket.add_parachute(stochastic_drogue) stochastic_flight = StochasticFlight( flight=test_flight, inclination=(84.7, 1), # mean= 84.7, std=1 heading=(53, 2), # mean= 53, std=2 ) test_dispersion = MonteCarlo( filename="monte_carlo_analysis_outputs/monte_carlo_class_example", environment=stochastic_env, rocket=stochastic_rocket, flight=stochastic_flight, ) test_dispersion.simulate( number_of_simulations=10, append=False, include_function_data=False, parallel=False, n_workers=4, )
Expected behavior
Simulation should run normally. Currently, this results in:
ValueError: Parameter 'power' cannot be None when using a nose cone kind 'powerseries'.