-
-
Notifications
You must be signed in to change notification settings - Fork 237
Closed
Description
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'.
Metadata
Metadata
Assignees
Labels
No labels