From 8316993324e0552a418a889604a7303ca7eb7c27 Mon Sep 17 00:00:00 2001 From: Pedro Bressan Date: Fri, 2 Aug 2024 23:13:25 -0300 Subject: [PATCH 1/7] FIX: parallel random value generation not being independent. --- .vscode/settings.json | 1 + .../monte_carlo_class_example.inputs.txt | 110 +-- .../monte_carlo_class_example.outputs.txt | 110 +-- .../monte_carlo_class_usage.ipynb | 192 +--- rocketpy/simulation/monte_carlo.py | 905 ++++-------------- rocketpy/stochastic/stochastic_model.py | 42 +- rocketpy/tools.py | 31 +- tests/integration/test_monte_carlo.py | 7 +- 8 files changed, 294 insertions(+), 1104 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 16014706e..71f500199 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -136,6 +136,7 @@ "meshgrid", "Metrum", "mult", + "multiprocess", "Mumma", "NASADEM", "NDAP", diff --git a/docs/notebooks/monte_carlo_analysis/monte_carlo_analysis_outputs/monte_carlo_class_example.inputs.txt b/docs/notebooks/monte_carlo_analysis/monte_carlo_analysis_outputs/monte_carlo_class_example.inputs.txt index 1034c95bb..c8a3dc0d5 100644 --- a/docs/notebooks/monte_carlo_analysis/monte_carlo_analysis_outputs/monte_carlo_class_example.inputs.txt +++ b/docs/notebooks/monte_carlo_analysis/monte_carlo_analysis_outputs/monte_carlo_class_example.inputs.txt @@ -1,100 +1,10 @@ -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350777333431341, "mass": 14.945932201962972, "I_11_without_motor": 6.321, "I_22_without_motor": 6.315614938495688, "I_33_without_motor": 0.03903265385225154, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 83.91570475056656, "heading": 50.44517227738547, "idx": 4} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350777333431341, "mass": 14.945932201962972, "I_11_without_motor": 6.321, "I_22_without_motor": 6.315614938495688, "I_33_without_motor": 0.03903265385225154, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 83.91570475056656, "heading": 50.44517227738547, "idx": 1} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350777333431341, "mass": 14.945932201962972, "I_11_without_motor": 6.321, "I_22_without_motor": 6.315614938495688, "I_33_without_motor": 0.03903265385225154, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 83.91570475056656, "heading": 50.44517227738547, "idx": 5} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350777333431341, "mass": 14.945932201962972, "I_11_without_motor": 6.321, "I_22_without_motor": 6.315614938495688, "I_33_without_motor": 0.03903265385225154, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 83.91570475056656, "heading": 50.44517227738547, "idx": 3} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350777333431341, "mass": 14.945932201962972, "I_11_without_motor": 6.321, "I_22_without_motor": 6.315614938495688, "I_33_without_motor": 0.03903265385225154, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 83.91570475056656, "heading": 50.44517227738547, "idx": 2} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350777333431341, "mass": 14.945932201962972, "I_11_without_motor": 6.321, "I_22_without_motor": 6.315614938495688, "I_33_without_motor": 0.03903265385225154, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 83.91570475056656, "heading": 50.44517227738547, "idx": 0} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350799787710694, "mass": 15.535409784629989, "I_11_without_motor": 6.321, "I_22_without_motor": 6.305184013880125, "I_33_without_motor": 0.02734260028750975, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.66467725196064, "heading": 53.044982437903506, "idx": 7} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350799787710694, "mass": 15.535409784629989, "I_11_without_motor": 6.321, "I_22_without_motor": 6.305184013880125, "I_33_without_motor": 0.02734260028750975, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.66467725196064, "heading": 53.044982437903506, "idx": 9} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350799787710694, "mass": 15.535409784629989, "I_11_without_motor": 6.321, "I_22_without_motor": 6.305184013880125, "I_33_without_motor": 0.02734260028750975, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.66467725196064, "heading": 53.044982437903506, "idx": 6} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350799787710694, "mass": 15.535409784629989, "I_11_without_motor": 6.321, "I_22_without_motor": 6.305184013880125, "I_33_without_motor": 0.02734260028750975, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.66467725196064, "heading": 53.044982437903506, "idx": 8} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350799787710694, "mass": 15.535409784629989, "I_11_without_motor": 6.321, "I_22_without_motor": 6.305184013880125, "I_33_without_motor": 0.02734260028750975, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.66467725196064, "heading": 53.044982437903506, "idx": 10} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350799787710694, "mass": 15.535409784629989, "I_11_without_motor": 6.321, "I_22_without_motor": 6.305184013880125, "I_33_without_motor": 0.02734260028750975, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.66467725196064, "heading": 53.044982437903506, "idx": 11} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350012857469824, "mass": 15.3596385828581, "I_11_without_motor": 6.321, "I_22_without_motor": 6.325488792143026, "I_33_without_motor": 0.03981894172796512, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.3562909816167, "heading": 54.333423027218736, "idx": 12} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350012857469824, "mass": 15.3596385828581, "I_11_without_motor": 6.321, "I_22_without_motor": 6.325488792143026, "I_33_without_motor": 0.03981894172796512, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.3562909816167, "heading": 54.333423027218736, "idx": 14} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350012857469824, "mass": 15.3596385828581, "I_11_without_motor": 6.321, "I_22_without_motor": 6.325488792143026, "I_33_without_motor": 0.03981894172796512, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.3562909816167, "heading": 54.333423027218736, "idx": 13} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350012857469824, "mass": 15.3596385828581, "I_11_without_motor": 6.321, "I_22_without_motor": 6.325488792143026, "I_33_without_motor": 0.03981894172796512, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.3562909816167, "heading": 54.333423027218736, "idx": 16} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350012857469824, "mass": 15.3596385828581, "I_11_without_motor": 6.321, "I_22_without_motor": 6.325488792143026, "I_33_without_motor": 0.03981894172796512, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.3562909816167, "heading": 54.333423027218736, "idx": 15} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350012857469824, "mass": 15.3596385828581, "I_11_without_motor": 6.321, "I_22_without_motor": 6.325488792143026, "I_33_without_motor": 0.03981894172796512, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.3562909816167, "heading": 54.333423027218736, "idx": 17} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349971795682773, "mass": 15.765762458841106, "I_11_without_motor": 6.321, "I_22_without_motor": 6.311008324956794, "I_33_without_motor": 0.027506172263613963, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.11928301392133, "heading": 54.6465022771567, "idx": 18} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349971795682773, "mass": 15.765762458841106, "I_11_without_motor": 6.321, "I_22_without_motor": 6.311008324956794, "I_33_without_motor": 0.027506172263613963, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.11928301392133, "heading": 54.6465022771567, "idx": 19} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349971795682773, "mass": 15.765762458841106, "I_11_without_motor": 6.321, "I_22_without_motor": 6.311008324956794, "I_33_without_motor": 0.027506172263613963, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.11928301392133, "heading": 54.6465022771567, "idx": 21} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349971795682773, "mass": 15.765762458841106, "I_11_without_motor": 6.321, "I_22_without_motor": 6.311008324956794, "I_33_without_motor": 0.027506172263613963, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.11928301392133, "heading": 54.6465022771567, "idx": 20} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349971795682773, "mass": 15.765762458841106, "I_11_without_motor": 6.321, "I_22_without_motor": 6.311008324956794, "I_33_without_motor": 0.027506172263613963, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.11928301392133, "heading": 54.6465022771567, "idx": 23} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349971795682773, "mass": 15.765762458841106, "I_11_without_motor": 6.321, "I_22_without_motor": 6.311008324956794, "I_33_without_motor": 0.027506172263613963, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.11928301392133, "heading": 54.6465022771567, "idx": 22} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350633583864475, "mass": 14.880212363159641, "I_11_without_motor": 6.321, "I_22_without_motor": 6.323232990545718, "I_33_without_motor": 0.03214984119680275, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.31991765066142, "heading": 54.05877965159275, "idx": 24} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350633583864475, "mass": 14.880212363159641, "I_11_without_motor": 6.321, "I_22_without_motor": 6.323232990545718, "I_33_without_motor": 0.03214984119680275, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.31991765066142, "heading": 54.05877965159275, "idx": 25} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350633583864475, "mass": 14.880212363159641, "I_11_without_motor": 6.321, "I_22_without_motor": 6.323232990545718, "I_33_without_motor": 0.03214984119680275, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.31991765066142, "heading": 54.05877965159275, "idx": 26} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350633583864475, "mass": 14.880212363159641, "I_11_without_motor": 6.321, "I_22_without_motor": 6.323232990545718, "I_33_without_motor": 0.03214984119680275, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.31991765066142, "heading": 54.05877965159275, "idx": 27} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350633583864475, "mass": 14.880212363159641, "I_11_without_motor": 6.321, "I_22_without_motor": 6.323232990545718, "I_33_without_motor": 0.03214984119680275, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.31991765066142, "heading": 54.05877965159275, "idx": 28} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350633583864475, "mass": 14.880212363159641, "I_11_without_motor": 6.321, "I_22_without_motor": 6.323232990545718, "I_33_without_motor": 0.03214984119680275, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.31991765066142, "heading": 54.05877965159275, "idx": 29} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349917820334404, "mass": 14.617994821329761, "I_11_without_motor": 6.321, "I_22_without_motor": 6.328358841157538, "I_33_without_motor": 0.022808096337636686, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.80686359751158, "heading": 50.68030197536621, "idx": 30} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349917820334404, "mass": 14.617994821329761, "I_11_without_motor": 6.321, "I_22_without_motor": 6.328358841157538, "I_33_without_motor": 0.022808096337636686, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.80686359751158, "heading": 50.68030197536621, "idx": 31} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349917820334404, "mass": 14.617994821329761, "I_11_without_motor": 6.321, "I_22_without_motor": 6.328358841157538, "I_33_without_motor": 0.022808096337636686, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.80686359751158, "heading": 50.68030197536621, "idx": 32} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349917820334404, "mass": 14.617994821329761, "I_11_without_motor": 6.321, "I_22_without_motor": 6.328358841157538, "I_33_without_motor": 0.022808096337636686, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.80686359751158, "heading": 50.68030197536621, "idx": 33} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349917820334404, "mass": 14.617994821329761, "I_11_without_motor": 6.321, "I_22_without_motor": 6.328358841157538, "I_33_without_motor": 0.022808096337636686, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.80686359751158, "heading": 50.68030197536621, "idx": 34} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349917820334404, "mass": 14.617994821329761, "I_11_without_motor": 6.321, "I_22_without_motor": 6.328358841157538, "I_33_without_motor": 0.022808096337636686, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.80686359751158, "heading": 50.68030197536621, "idx": 35} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349808934288596, "mass": 15.466012128071648, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3181495854435, "I_33_without_motor": 0.02641758386073672, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.97562003134496, "heading": 52.930416325260595, "idx": 39} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349808934288596, "mass": 15.466012128071648, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3181495854435, "I_33_without_motor": 0.02641758386073672, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.97562003134496, "heading": 52.930416325260595, "idx": 37} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349808934288596, "mass": 15.466012128071648, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3181495854435, "I_33_without_motor": 0.02641758386073672, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.97562003134496, "heading": 52.930416325260595, "idx": 36} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349808934288596, "mass": 15.466012128071648, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3181495854435, "I_33_without_motor": 0.02641758386073672, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.97562003134496, "heading": 52.930416325260595, "idx": 38} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349808934288596, "mass": 15.466012128071648, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3181495854435, "I_33_without_motor": 0.02641758386073672, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.97562003134496, "heading": 52.930416325260595, "idx": 40} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349808934288596, "mass": 15.466012128071648, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3181495854435, "I_33_without_motor": 0.02641758386073672, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.97562003134496, "heading": 52.930416325260595, "idx": 41} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349455455964755, "mass": 16.197708322150838, "I_11_without_motor": 6.321, "I_22_without_motor": 6.340869772657776, "I_33_without_motor": 0.026768019085362756, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.72241719567087, "heading": 53.652821678048625, "idx": 45} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349455455964755, "mass": 16.197708322150838, "I_11_without_motor": 6.321, "I_22_without_motor": 6.340869772657776, "I_33_without_motor": 0.026768019085362756, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.72241719567087, "heading": 53.652821678048625, "idx": 44} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349455455964755, "mass": 16.197708322150838, "I_11_without_motor": 6.321, "I_22_without_motor": 6.340869772657776, "I_33_without_motor": 0.026768019085362756, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.72241719567087, "heading": 53.652821678048625, "idx": 42} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349455455964755, "mass": 16.197708322150838, "I_11_without_motor": 6.321, "I_22_without_motor": 6.340869772657776, "I_33_without_motor": 0.026768019085362756, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.72241719567087, "heading": 53.652821678048625, "idx": 43} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349455455964755, "mass": 16.197708322150838, "I_11_without_motor": 6.321, "I_22_without_motor": 6.340869772657776, "I_33_without_motor": 0.026768019085362756, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.72241719567087, "heading": 53.652821678048625, "idx": 46} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349455455964755, "mass": 16.197708322150838, "I_11_without_motor": 6.321, "I_22_without_motor": 6.340869772657776, "I_33_without_motor": 0.026768019085362756, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.72241719567087, "heading": 53.652821678048625, "idx": 47} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349173177792923, "mass": 15.504062027694058, "I_11_without_motor": 6.321, "I_22_without_motor": 6.323153755649744, "I_33_without_motor": 0.01778296507923646, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.479400253999, "heading": 54.53377237970484, "idx": 48} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349173177792923, "mass": 15.504062027694058, "I_11_without_motor": 6.321, "I_22_without_motor": 6.323153755649744, "I_33_without_motor": 0.01778296507923646, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.479400253999, "heading": 54.53377237970484, "idx": 49} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349173177792923, "mass": 15.504062027694058, "I_11_without_motor": 6.321, "I_22_without_motor": 6.323153755649744, "I_33_without_motor": 0.01778296507923646, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.479400253999, "heading": 54.53377237970484, "idx": 50} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349173177792923, "mass": 15.504062027694058, "I_11_without_motor": 6.321, "I_22_without_motor": 6.323153755649744, "I_33_without_motor": 0.01778296507923646, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.479400253999, "heading": 54.53377237970484, "idx": 52} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349173177792923, "mass": 15.504062027694058, "I_11_without_motor": 6.321, "I_22_without_motor": 6.323153755649744, "I_33_without_motor": 0.01778296507923646, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.479400253999, "heading": 54.53377237970484, "idx": 51} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349173177792923, "mass": 15.504062027694058, "I_11_without_motor": 6.321, "I_22_without_motor": 6.323153755649744, "I_33_without_motor": 0.01778296507923646, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.479400253999, "heading": 54.53377237970484, "idx": 53} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350977890828662, "mass": 15.896575032553633, "I_11_without_motor": 6.321, "I_22_without_motor": 6.317807351138331, "I_33_without_motor": 0.03142831025494238, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 83.8221814512471, "heading": 55.09732269265791, "idx": 54} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350977890828662, "mass": 15.896575032553633, "I_11_without_motor": 6.321, "I_22_without_motor": 6.317807351138331, "I_33_without_motor": 0.03142831025494238, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 83.8221814512471, "heading": 55.09732269265791, "idx": 55} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350977890828662, "mass": 15.896575032553633, "I_11_without_motor": 6.321, "I_22_without_motor": 6.317807351138331, "I_33_without_motor": 0.03142831025494238, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 83.8221814512471, "heading": 55.09732269265791, "idx": 57} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350977890828662, "mass": 15.896575032553633, "I_11_without_motor": 6.321, "I_22_without_motor": 6.317807351138331, "I_33_without_motor": 0.03142831025494238, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 83.8221814512471, "heading": 55.09732269265791, "idx": 58} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350977890828662, "mass": 15.896575032553633, "I_11_without_motor": 6.321, "I_22_without_motor": 6.317807351138331, "I_33_without_motor": 0.03142831025494238, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 83.8221814512471, "heading": 55.09732269265791, "idx": 56} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350977890828662, "mass": 15.896575032553633, "I_11_without_motor": 6.321, "I_22_without_motor": 6.317807351138331, "I_33_without_motor": 0.03142831025494238, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 83.8221814512471, "heading": 55.09732269265791, "idx": 59} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350394156323581, "mass": 14.793966528627557, "I_11_without_motor": 6.321, "I_22_without_motor": 6.331863211073705, "I_33_without_motor": 0.046235827384290454, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.20617833316268, "heading": 53.45061868915785, "idx": 60} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350394156323581, "mass": 14.793966528627557, "I_11_without_motor": 6.321, "I_22_without_motor": 6.331863211073705, "I_33_without_motor": 0.046235827384290454, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.20617833316268, "heading": 53.45061868915785, "idx": 63} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350394156323581, "mass": 14.793966528627557, "I_11_without_motor": 6.321, "I_22_without_motor": 6.331863211073705, "I_33_without_motor": 0.046235827384290454, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.20617833316268, "heading": 53.45061868915785, "idx": 61} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350394156323581, "mass": 14.793966528627557, "I_11_without_motor": 6.321, "I_22_without_motor": 6.331863211073705, "I_33_without_motor": 0.046235827384290454, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.20617833316268, "heading": 53.45061868915785, "idx": 62} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350394156323581, "mass": 14.793966528627557, "I_11_without_motor": 6.321, "I_22_without_motor": 6.331863211073705, "I_33_without_motor": 0.046235827384290454, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.20617833316268, "heading": 53.45061868915785, "idx": 64} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350394156323581, "mass": 14.793966528627557, "I_11_without_motor": 6.321, "I_22_without_motor": 6.331863211073705, "I_33_without_motor": 0.046235827384290454, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.20617833316268, "heading": 53.45061868915785, "idx": 65} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350720117525216, "mass": 15.245132920253285, "I_11_without_motor": 6.321, "I_22_without_motor": 6.325374420547733, "I_33_without_motor": 0.03262318949463711, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.87930198633246, "heading": 52.84203478625352, "idx": 66} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350720117525216, "mass": 15.245132920253285, "I_11_without_motor": 6.321, "I_22_without_motor": 6.325374420547733, "I_33_without_motor": 0.03262318949463711, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.87930198633246, "heading": 52.84203478625352, "idx": 68} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350720117525216, "mass": 15.245132920253285, "I_11_without_motor": 6.321, "I_22_without_motor": 6.325374420547733, "I_33_without_motor": 0.03262318949463711, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.87930198633246, "heading": 52.84203478625352, "idx": 67} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350720117525216, "mass": 15.245132920253285, "I_11_without_motor": 6.321, "I_22_without_motor": 6.325374420547733, "I_33_without_motor": 0.03262318949463711, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.87930198633246, "heading": 52.84203478625352, "idx": 69} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350720117525216, "mass": 15.245132920253285, "I_11_without_motor": 6.321, "I_22_without_motor": 6.325374420547733, "I_33_without_motor": 0.03262318949463711, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.87930198633246, "heading": 52.84203478625352, "idx": 71} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350720117525216, "mass": 15.245132920253285, "I_11_without_motor": 6.321, "I_22_without_motor": 6.325374420547733, "I_33_without_motor": 0.03262318949463711, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.87930198633246, "heading": 52.84203478625352, "idx": 70} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350167271239417, "mass": 15.341543664612539, "I_11_without_motor": 6.321, "I_22_without_motor": 6.318710964254612, "I_33_without_motor": 0.041725400033672075, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.69213768925725, "heading": 51.25195367376733, "idx": 72} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350167271239417, "mass": 15.341543664612539, "I_11_without_motor": 6.321, "I_22_without_motor": 6.318710964254612, "I_33_without_motor": 0.041725400033672075, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.69213768925725, "heading": 51.25195367376733, "idx": 73} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350167271239417, "mass": 15.341543664612539, "I_11_without_motor": 6.321, "I_22_without_motor": 6.318710964254612, "I_33_without_motor": 0.041725400033672075, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.69213768925725, "heading": 51.25195367376733, "idx": 76} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350167271239417, "mass": 15.341543664612539, "I_11_without_motor": 6.321, "I_22_without_motor": 6.318710964254612, "I_33_without_motor": 0.041725400033672075, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.69213768925725, "heading": 51.25195367376733, "idx": 75} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350167271239417, "mass": 15.341543664612539, "I_11_without_motor": 6.321, "I_22_without_motor": 6.318710964254612, "I_33_without_motor": 0.041725400033672075, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.69213768925725, "heading": 51.25195367376733, "idx": 74} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350167271239417, "mass": 15.341543664612539, "I_11_without_motor": 6.321, "I_22_without_motor": 6.318710964254612, "I_33_without_motor": 0.041725400033672075, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.69213768925725, "heading": 51.25195367376733, "idx": 77} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350612301454828, "mass": 15.087912873120068, "I_11_without_motor": 6.321, "I_22_without_motor": 6.328762112896208, "I_33_without_motor": 0.02168469816236855, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.3394561614149, "heading": 55.9676860263811, "idx": 78} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350612301454828, "mass": 15.087912873120068, "I_11_without_motor": 6.321, "I_22_without_motor": 6.328762112896208, "I_33_without_motor": 0.02168469816236855, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.3394561614149, "heading": 55.9676860263811, "idx": 79} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350612301454828, "mass": 15.087912873120068, "I_11_without_motor": 6.321, "I_22_without_motor": 6.328762112896208, "I_33_without_motor": 0.02168469816236855, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.3394561614149, "heading": 55.9676860263811, "idx": 80} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350612301454828, "mass": 15.087912873120068, "I_11_without_motor": 6.321, "I_22_without_motor": 6.328762112896208, "I_33_without_motor": 0.02168469816236855, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.3394561614149, "heading": 55.9676860263811, "idx": 81} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350612301454828, "mass": 15.087912873120068, "I_11_without_motor": 6.321, "I_22_without_motor": 6.328762112896208, "I_33_without_motor": 0.02168469816236855, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.3394561614149, "heading": 55.9676860263811, "idx": 82} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350612301454828, "mass": 15.087912873120068, "I_11_without_motor": 6.321, "I_22_without_motor": 6.328762112896208, "I_33_without_motor": 0.02168469816236855, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.3394561614149, "heading": 55.9676860263811, "idx": 83} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350259931622232, "mass": 15.742857016733286, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3130073490539385, "I_33_without_motor": 0.020910410808846043, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.19685691727412, "heading": 52.31993730456948, "idx": 84} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350259931622232, "mass": 15.742857016733286, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3130073490539385, "I_33_without_motor": 0.020910410808846043, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.19685691727412, "heading": 52.31993730456948, "idx": 85} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350259931622232, "mass": 15.742857016733286, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3130073490539385, "I_33_without_motor": 0.020910410808846043, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.19685691727412, "heading": 52.31993730456948, "idx": 86} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350259931622232, "mass": 15.742857016733286, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3130073490539385, "I_33_without_motor": 0.020910410808846043, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.19685691727412, "heading": 52.31993730456948, "idx": 88} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350259931622232, "mass": 15.742857016733286, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3130073490539385, "I_33_without_motor": 0.020910410808846043, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.19685691727412, "heading": 52.31993730456948, "idx": 87} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350390524986724, "mass": 14.937619857590056, "I_11_without_motor": 6.321, "I_22_without_motor": 6.340449035940706, "I_33_without_motor": 0.015596691821431561, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.58893068379011, "heading": 52.948586112127906, "idx": 90} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350259931622232, "mass": 15.742857016733286, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3130073490539385, "I_33_without_motor": 0.020910410808846043, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.19685691727412, "heading": 52.31993730456948, "idx": 89} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350390524986724, "mass": 14.937619857590056, "I_11_without_motor": 6.321, "I_22_without_motor": 6.340449035940706, "I_33_without_motor": 0.015596691821431561, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.58893068379011, "heading": 52.948586112127906, "idx": 91} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350390524986724, "mass": 14.937619857590056, "I_11_without_motor": 6.321, "I_22_without_motor": 6.340449035940706, "I_33_without_motor": 0.015596691821431561, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.58893068379011, "heading": 52.948586112127906, "idx": 92} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350390524986724, "mass": 14.937619857590056, "I_11_without_motor": 6.321, "I_22_without_motor": 6.340449035940706, "I_33_without_motor": 0.015596691821431561, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.58893068379011, "heading": 52.948586112127906, "idx": 93} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350390524986724, "mass": 14.937619857590056, "I_11_without_motor": 6.321, "I_22_without_motor": 6.340449035940706, "I_33_without_motor": 0.015596691821431561, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.58893068379011, "heading": 52.948586112127906, "idx": 94} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350390524986724, "mass": 14.937619857590056, "I_11_without_motor": 6.321, "I_22_without_motor": 6.340449035940706, "I_33_without_motor": 0.015596691821431561, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.58893068379011, "heading": 52.948586112127906, "idx": 96} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06348698945998169, "mass": 14.968886577580285, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3349353949364255, "I_33_without_motor": 0.019014259860003133, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 86.1478283075365, "heading": 52.34061607683752, "idx": 95} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06348698945998169, "mass": 14.968886577580285, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3349353949364255, "I_33_without_motor": 0.019014259860003133, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 86.1478283075365, "heading": 52.34061607683752, "idx": 97} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06348698945998169, "mass": 14.968886577580285, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3349353949364255, "I_33_without_motor": 0.019014259860003133, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 86.1478283075365, "heading": 52.34061607683752, "idx": 98} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06348698945998169, "mass": 14.968886577580285, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3349353949364255, "I_33_without_motor": 0.019014259860003133, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 86.1478283075365, "heading": 52.34061607683752, "idx": 99} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350289434264267, "mass": 15.456135927990132, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3470082958698635, "I_33_without_motor": 0.03229593193345243, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.52959319334525, "heading": 55.57958707681996, "idx": 1} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350642685195844, "mass": 15.947943756465122, "I_11_without_motor": 6.321, "I_22_without_motor": 6.305034260224077, "I_33_without_motor": 0.012185784256634566, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 82.51857842566346, "heading": 54.00929681071917, "idx": 2} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06348693436942288, "mass": 15.56700310729182, "I_11_without_motor": 6.321, "I_22_without_motor": 6.327048745074772, "I_33_without_motor": 0.03231103830848155, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.53110383084815, "heading": 51.829403501192125, "idx": 0} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06351113888637025, "mass": 15.432331749142888, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3024514780732135, "I_33_without_motor": 0.03861989442356517, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.16198944235651, "heading": 52.941330785531, "idx": 6} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06351424065511635, "mass": 15.098615587482993, "I_11_without_motor": 6.321, "I_22_without_motor": 6.329640597262522, "I_33_without_motor": 0.02652243852750159, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 83.95224385275016, "heading": 54.12450364243022, "idx": 4} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350085654124574, "mass": 15.27389293993322, "I_11_without_motor": 6.321, "I_22_without_motor": 6.313645147120128, "I_33_without_motor": 0.022871111842170035, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 83.58711118421701, "heading": 55.62608499496386, "idx": 3} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350445203784565, "mass": 15.61156113400957, "I_11_without_motor": 6.321, "I_22_without_motor": 6.337935598753835, "I_33_without_motor": 0.046192115787341025, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.9192115787341, "heading": 52.19392581388304, "idx": 5} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350289434264267, "mass": 15.456135927990132, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3470082958698635, "I_33_without_motor": 0.03229593193345243, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.52959319334525, "heading": 55.57958707681996, "idx": 7} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350642685195844, "mass": 15.947943756465122, "I_11_without_motor": 6.321, "I_22_without_motor": 6.305034260224077, "I_33_without_motor": 0.012185784256634566, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 82.51857842566346, "heading": 54.00929681071917, "idx": 8} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06348693436942288, "mass": 15.56700310729182, "I_11_without_motor": 6.321, "I_22_without_motor": 6.327048745074772, "I_33_without_motor": 0.03231103830848155, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.53110383084815, "heading": 51.829403501192125, "idx": 9} diff --git a/docs/notebooks/monte_carlo_analysis/monte_carlo_analysis_outputs/monte_carlo_class_example.outputs.txt b/docs/notebooks/monte_carlo_analysis/monte_carlo_analysis_outputs/monte_carlo_class_example.outputs.txt index 4ceb69615..e4190b53d 100644 --- a/docs/notebooks/monte_carlo_analysis/monte_carlo_analysis_outputs/monte_carlo_class_example.outputs.txt +++ b/docs/notebooks/monte_carlo_analysis/monte_carlo_analysis_outputs/monte_carlo_class_example.outputs.txt @@ -1,100 +1,10 @@ -{"out_of_rail_velocity": 25.146363282033782, "frontal_surface_wind": 0.0, "y_impact": 311.48773844167255, "impact_velocity": -5.205588647074274, "max_mach_number": 0.8165284994722123, "apogee_time": 25.001371060903367, "apogee_y": 262.0406076665116, "lateral_surface_wind": 0.0, "apogee": 3200.3555155885065, "apogee_x": 317.49644391644597, "out_of_rail_time": 0.36444233754902033, "out_of_rail_stability_margin": 2.6457528317451255, "initial_stability_margin": 2.582705724307003, "t_final": 292.3653579712265, "x_impact": 377.27264200842393} -{"out_of_rail_velocity": 25.146363282033782, "frontal_surface_wind": 0.0, "y_impact": 311.48773844167255, "impact_velocity": -5.205588647074274, "max_mach_number": 0.8165284994722123, "apogee_time": 25.001371060903367, "apogee_y": 262.0406076665116, "lateral_surface_wind": 0.0, "apogee": 3200.3555155885065, "apogee_x": 317.49644391644597, "out_of_rail_time": 0.36444233754902033, "out_of_rail_stability_margin": 2.6457528317451255, "initial_stability_margin": 2.582705724307003, "t_final": 292.3653579712265, "x_impact": 377.27264200842393} -{"out_of_rail_velocity": 25.146363282033782, "frontal_surface_wind": 0.0, "y_impact": 311.48773844167255, "impact_velocity": -5.205588647074274, "max_mach_number": 0.8165284994722123, "apogee_time": 25.001371060903367, "apogee_y": 262.0406076665116, "lateral_surface_wind": 0.0, "apogee": 3200.3555155885065, "apogee_x": 317.49644391644597, "out_of_rail_time": 0.36444233754902033, "out_of_rail_stability_margin": 2.6457528317451255, "initial_stability_margin": 2.582705724307003, "t_final": 292.3653579712265, "x_impact": 377.27264200842393} -{"out_of_rail_velocity": 25.146363282033782, "frontal_surface_wind": 0.0, "y_impact": 311.48773844167255, "impact_velocity": -5.205588647074274, "max_mach_number": 0.8165284994722123, "apogee_time": 25.001371060903367, "apogee_y": 262.0406076665116, "lateral_surface_wind": 0.0, "apogee": 3200.3555155885065, "apogee_x": 317.49644391644597, "out_of_rail_time": 0.36444233754902033, "out_of_rail_stability_margin": 2.6457528317451255, "initial_stability_margin": 2.582705724307003, "t_final": 292.3653579712265, "x_impact": 377.27264200842393} -{"out_of_rail_velocity": 25.146363282033782, "frontal_surface_wind": 0.0, "y_impact": 311.48773844167255, "impact_velocity": -5.205588647074274, "max_mach_number": 0.8165284994722123, "apogee_time": 25.001371060903367, "apogee_y": 262.0406076665116, "lateral_surface_wind": 0.0, "apogee": 3200.3555155885065, "apogee_x": 317.49644391644597, "out_of_rail_time": 0.36444233754902033, "out_of_rail_stability_margin": 2.6457528317451255, "initial_stability_margin": 2.582705724307003, "t_final": 292.3653579712265, "x_impact": 377.27264200842393} -{"out_of_rail_velocity": 25.146363282033782, "frontal_surface_wind": 0.0, "y_impact": 311.48773844167255, "impact_velocity": -5.205588647074274, "max_mach_number": 0.8165284994722123, "apogee_time": 25.001371060903367, "apogee_y": 262.0406076665116, "lateral_surface_wind": 0.0, "apogee": 3200.3555155885065, "apogee_x": 317.49644391644597, "out_of_rail_time": 0.36444233754902033, "out_of_rail_stability_margin": 2.6457528317451255, "initial_stability_margin": 2.582705724307003, "t_final": 292.3653579712265, "x_impact": 377.27264200842393} -{"out_of_rail_velocity": 23.566432911509583, "frontal_surface_wind": 0.0, "y_impact": 356.23937220273865, "impact_velocity": -5.326085492261915, "max_mach_number": 0.723075187401653, "apogee_time": 23.452049183475886, "apogee_y": 298.42271613379376, "lateral_surface_wind": 0.0, "apogee": 2737.971649429715, "apogee_x": 397.24056630892323, "out_of_rail_time": 0.3843199949425503, "out_of_rail_stability_margin": 2.813562911782982, "initial_stability_margin": 2.7437738848160103, "t_final": 265.7419338302083, "x_impact": 474.0798061100266} -{"out_of_rail_velocity": 23.566432911509583, "frontal_surface_wind": 0.0, "y_impact": 356.23937220273865, "impact_velocity": -5.326085492261915, "max_mach_number": 0.723075187401653, "apogee_time": 23.452049183475886, "apogee_y": 298.42271613379376, "lateral_surface_wind": 0.0, "apogee": 2737.971649429715, "apogee_x": 397.24056630892323, "out_of_rail_time": 0.3843199949425503, "out_of_rail_stability_margin": 2.813562911782982, "initial_stability_margin": 2.7437738848160103, "t_final": 265.7419338302083, "x_impact": 474.0798061100266} -{"out_of_rail_velocity": 23.566432911509583, "frontal_surface_wind": 0.0, "y_impact": 356.23937220273865, "impact_velocity": -5.326085492261915, "max_mach_number": 0.723075187401653, "apogee_time": 23.452049183475886, "apogee_y": 298.42271613379376, "lateral_surface_wind": 0.0, "apogee": 2737.971649429715, "apogee_x": 397.24056630892323, "out_of_rail_time": 0.3843199949425503, "out_of_rail_stability_margin": 2.813562911782982, "initial_stability_margin": 2.7437738848160103, "t_final": 265.7419338302083, "x_impact": 474.0798061100266} -{"out_of_rail_velocity": 23.566432911509583, "frontal_surface_wind": 0.0, "y_impact": 356.23937220273865, "impact_velocity": -5.326085492261915, "max_mach_number": 0.723075187401653, "apogee_time": 23.452049183475886, "apogee_y": 298.42271613379376, "lateral_surface_wind": 0.0, "apogee": 2737.971649429715, "apogee_x": 397.24056630892323, "out_of_rail_time": 0.3843199949425503, "out_of_rail_stability_margin": 2.813562911782982, "initial_stability_margin": 2.7437738848160103, "t_final": 265.7419338302083, "x_impact": 474.0798061100266} -{"out_of_rail_velocity": 23.566432911509583, "frontal_surface_wind": 0.0, "y_impact": 356.23937220273865, "impact_velocity": -5.326085492261915, "max_mach_number": 0.723075187401653, "apogee_time": 23.452049183475886, "apogee_y": 298.42271613379376, "lateral_surface_wind": 0.0, "apogee": 2737.971649429715, "apogee_x": 397.24056630892323, "out_of_rail_time": 0.3843199949425503, "out_of_rail_stability_margin": 2.813562911782982, "initial_stability_margin": 2.7437738848160103, "t_final": 265.7419338302083, "x_impact": 474.0798061100266} -{"out_of_rail_velocity": 23.566432911509583, "frontal_surface_wind": 0.0, "y_impact": 356.23937220273865, "impact_velocity": -5.326085492261915, "max_mach_number": 0.723075187401653, "apogee_time": 23.452049183475886, "apogee_y": 298.42271613379376, "lateral_surface_wind": 0.0, "apogee": 2737.971649429715, "apogee_x": 397.24056630892323, "out_of_rail_time": 0.3843199949425503, "out_of_rail_stability_margin": 2.813562911782982, "initial_stability_margin": 2.7437738848160103, "t_final": 265.7419338302083, "x_impact": 474.0798061100266} -{"out_of_rail_velocity": 27.50266364774711, "frontal_surface_wind": 0.0, "y_impact": 434.3067315137961, "impact_velocity": -5.262784513563193, "max_mach_number": 0.9639859508415848, "apogee_time": 27.125819002267985, "apogee_y": 375.9568687046901, "lateral_surface_wind": 0.0, "apogee": 3895.4164361958374, "apogee_x": 524.239170000142, "out_of_rail_time": 0.3390201854139684, "out_of_rail_stability_margin": 2.7124108244630616, "initial_stability_margin": 2.6548573292295603, "t_final": 339.40668003507216, "x_impact": 605.3579617364504} -{"out_of_rail_velocity": 27.50266364774711, "frontal_surface_wind": 0.0, "y_impact": 434.3067315137961, "impact_velocity": -5.262784513563193, "max_mach_number": 0.9639859508415848, "apogee_time": 27.125819002267985, "apogee_y": 375.9568687046901, "lateral_surface_wind": 0.0, "apogee": 3895.4164361958374, "apogee_x": 524.239170000142, "out_of_rail_time": 0.3390201854139684, "out_of_rail_stability_margin": 2.7124108244630616, "initial_stability_margin": 2.6548573292295603, "t_final": 339.40668003507216, "x_impact": 605.3579617364504} -{"out_of_rail_velocity": 27.50266364774711, "frontal_surface_wind": 0.0, "y_impact": 434.3067315137961, "impact_velocity": -5.262784513563193, "max_mach_number": 0.9639859508415848, "apogee_time": 27.125819002267985, "apogee_y": 375.9568687046901, "lateral_surface_wind": 0.0, "apogee": 3895.4164361958374, "apogee_x": 524.239170000142, "out_of_rail_time": 0.3390201854139684, "out_of_rail_stability_margin": 2.7124108244630616, "initial_stability_margin": 2.6548573292295603, "t_final": 339.40668003507216, "x_impact": 605.3579617364504} -{"out_of_rail_velocity": 27.50266364774711, "frontal_surface_wind": 0.0, "y_impact": 434.3067315137961, "impact_velocity": -5.262784513563193, "max_mach_number": 0.9639859508415848, "apogee_time": 27.125819002267985, "apogee_y": 375.9568687046901, "lateral_surface_wind": 0.0, "apogee": 3895.4164361958374, "apogee_x": 524.239170000142, "out_of_rail_time": 0.3390201854139684, "out_of_rail_stability_margin": 2.7124108244630616, "initial_stability_margin": 2.6548573292295603, "t_final": 339.40668003507216, "x_impact": 605.3579617364504} -{"out_of_rail_velocity": 27.50266364774711, "frontal_surface_wind": 0.0, "y_impact": 434.3067315137961, "impact_velocity": -5.262784513563193, "max_mach_number": 0.9639859508415848, "apogee_time": 27.125819002267985, "apogee_y": 375.9568687046901, "lateral_surface_wind": 0.0, "apogee": 3895.4164361958374, "apogee_x": 524.239170000142, "out_of_rail_time": 0.3390201854139684, "out_of_rail_stability_margin": 2.7124108244630616, "initial_stability_margin": 2.6548573292295603, "t_final": 339.40668003507216, "x_impact": 605.3579617364504} -{"out_of_rail_velocity": 27.50266364774711, "frontal_surface_wind": 0.0, "y_impact": 434.3067315137961, "impact_velocity": -5.262784513563193, "max_mach_number": 0.9639859508415848, "apogee_time": 27.125819002267985, "apogee_y": 375.9568687046901, "lateral_surface_wind": 0.0, "apogee": 3895.4164361958374, "apogee_x": 524.239170000142, "out_of_rail_time": 0.3390201854139684, "out_of_rail_stability_margin": 2.7124108244630616, "initial_stability_margin": 2.6548573292295603, "t_final": 339.40668003507216, "x_impact": 605.3579617364504} -{"out_of_rail_velocity": 24.51732838642787, "frontal_surface_wind": 0.0, "y_impact": 321.6725604945372, "impact_velocity": -5.31391509491548, "max_mach_number": 0.7763409714646418, "apogee_time": 24.493859586374587, "apogee_y": 271.4197836841655, "lateral_surface_wind": 0.0, "apogee": 3026.2761040556384, "apogee_x": 383.0422125640637, "out_of_rail_time": 0.37232643533233667, "out_of_rail_stability_margin": 2.7318534970372066, "initial_stability_margin": 2.6704339408899056, "t_final": 285.1344958270966, "x_impact": 453.8740706166726} -{"out_of_rail_velocity": 24.51732838642787, "frontal_surface_wind": 0.0, "y_impact": 321.6725604945372, "impact_velocity": -5.31391509491548, "max_mach_number": 0.7763409714646418, "apogee_time": 24.493859586374587, "apogee_y": 271.4197836841655, "lateral_surface_wind": 0.0, "apogee": 3026.2761040556384, "apogee_x": 383.0422125640637, "out_of_rail_time": 0.37232643533233667, "out_of_rail_stability_margin": 2.7318534970372066, "initial_stability_margin": 2.6704339408899056, "t_final": 285.1344958270966, "x_impact": 453.8740706166726} -{"out_of_rail_velocity": 24.51732838642787, "frontal_surface_wind": 0.0, "y_impact": 321.6725604945372, "impact_velocity": -5.31391509491548, "max_mach_number": 0.7763409714646418, "apogee_time": 24.493859586374587, "apogee_y": 271.4197836841655, "lateral_surface_wind": 0.0, "apogee": 3026.2761040556384, "apogee_x": 383.0422125640637, "out_of_rail_time": 0.37232643533233667, "out_of_rail_stability_margin": 2.7318534970372066, "initial_stability_margin": 2.6704339408899056, "t_final": 285.1344958270966, "x_impact": 453.8740706166726} -{"out_of_rail_velocity": 24.51732838642787, "frontal_surface_wind": 0.0, "y_impact": 321.6725604945372, "impact_velocity": -5.31391509491548, "max_mach_number": 0.7763409714646418, "apogee_time": 24.493859586374587, "apogee_y": 271.4197836841655, "lateral_surface_wind": 0.0, "apogee": 3026.2761040556384, "apogee_x": 383.0422125640637, "out_of_rail_time": 0.37232643533233667, "out_of_rail_stability_margin": 2.7318534970372066, "initial_stability_margin": 2.6704339408899056, "t_final": 285.1344958270966, "x_impact": 453.8740706166726} -{"out_of_rail_velocity": 24.51732838642787, "frontal_surface_wind": 0.0, "y_impact": 321.6725604945372, "impact_velocity": -5.31391509491548, "max_mach_number": 0.7763409714646418, "apogee_time": 24.493859586374587, "apogee_y": 271.4197836841655, "lateral_surface_wind": 0.0, "apogee": 3026.2761040556384, "apogee_x": 383.0422125640637, "out_of_rail_time": 0.37232643533233667, "out_of_rail_stability_margin": 2.7318534970372066, "initial_stability_margin": 2.6704339408899056, "t_final": 285.1344958270966, "x_impact": 453.8740706166726} -{"out_of_rail_velocity": 24.51732838642787, "frontal_surface_wind": 0.0, "y_impact": 321.6725604945372, "impact_velocity": -5.31391509491548, "max_mach_number": 0.7763409714646418, "apogee_time": 24.493859586374587, "apogee_y": 271.4197836841655, "lateral_surface_wind": 0.0, "apogee": 3026.2761040556384, "apogee_x": 383.0422125640637, "out_of_rail_time": 0.37232643533233667, "out_of_rail_stability_margin": 2.7318534970372066, "initial_stability_margin": 2.6704339408899056, "t_final": 285.1344958270966, "x_impact": 453.8740706166726} -{"out_of_rail_velocity": 23.92678748465942, "frontal_surface_wind": 0.0, "y_impact": 368.8289811227234, "impact_velocity": -5.237158862703817, "max_mach_number": 0.745733761148732, "apogee_time": 23.703667646870787, "apogee_y": 316.9490193911751, "lateral_surface_wind": 0.0, "apogee": 2823.3182583527364, "apogee_x": 437.71650871910475, "out_of_rail_time": 0.37970845856261487, "out_of_rail_stability_margin": 2.5920043240887938, "initial_stability_margin": 2.5211773398825708, "t_final": 282.73704740632985, "x_impact": 509.2157754994405} -{"out_of_rail_velocity": 23.92678748465942, "frontal_surface_wind": 0.0, "y_impact": 368.8289811227234, "impact_velocity": -5.237158862703817, "max_mach_number": 0.745733761148732, "apogee_time": 23.703667646870787, "apogee_y": 316.9490193911751, "lateral_surface_wind": 0.0, "apogee": 2823.3182583527364, "apogee_x": 437.71650871910475, "out_of_rail_time": 0.37970845856261487, "out_of_rail_stability_margin": 2.5920043240887938, "initial_stability_margin": 2.5211773398825708, "t_final": 282.73704740632985, "x_impact": 509.2157754994405} -{"out_of_rail_velocity": 23.92678748465942, "frontal_surface_wind": 0.0, "y_impact": 368.8289811227234, "impact_velocity": -5.237158862703817, "max_mach_number": 0.745733761148732, "apogee_time": 23.703667646870787, "apogee_y": 316.9490193911751, "lateral_surface_wind": 0.0, "apogee": 2823.3182583527364, "apogee_x": 437.71650871910475, "out_of_rail_time": 0.37970845856261487, "out_of_rail_stability_margin": 2.5920043240887938, "initial_stability_margin": 2.5211773398825708, "t_final": 282.73704740632985, "x_impact": 509.2157754994405} -{"out_of_rail_velocity": 23.92678748465942, "frontal_surface_wind": 0.0, "y_impact": 368.8289811227234, "impact_velocity": -5.237158862703817, "max_mach_number": 0.745733761148732, "apogee_time": 23.703667646870787, "apogee_y": 316.9490193911751, "lateral_surface_wind": 0.0, "apogee": 2823.3182583527364, "apogee_x": 437.71650871910475, "out_of_rail_time": 0.37970845856261487, "out_of_rail_stability_margin": 2.5920043240887938, "initial_stability_margin": 2.5211773398825708, "t_final": 282.73704740632985, "x_impact": 509.2157754994405} -{"out_of_rail_velocity": 23.92678748465942, "frontal_surface_wind": 0.0, "y_impact": 368.8289811227234, "impact_velocity": -5.237158862703817, "max_mach_number": 0.745733761148732, "apogee_time": 23.703667646870787, "apogee_y": 316.9490193911751, "lateral_surface_wind": 0.0, "apogee": 2823.3182583527364, "apogee_x": 437.71650871910475, "out_of_rail_time": 0.37970845856261487, "out_of_rail_stability_margin": 2.5920043240887938, "initial_stability_margin": 2.5211773398825708, "t_final": 282.73704740632985, "x_impact": 509.2157754994405} -{"out_of_rail_velocity": 23.92678748465942, "frontal_surface_wind": 0.0, "y_impact": 368.8289811227234, "impact_velocity": -5.237158862703817, "max_mach_number": 0.745733761148732, "apogee_time": 23.703667646870787, "apogee_y": 316.9490193911751, "lateral_surface_wind": 0.0, "apogee": 2823.3182583527364, "apogee_x": 437.71650871910475, "out_of_rail_time": 0.37970845856261487, "out_of_rail_stability_margin": 2.5920043240887938, "initial_stability_margin": 2.5211773398825708, "t_final": 282.73704740632985, "x_impact": 509.2157754994405} -{"out_of_rail_velocity": 23.874817396484005, "frontal_surface_wind": 0.0, "y_impact": 462.9786484441807, "impact_velocity": -5.178040107449529, "max_mach_number": 0.7420398709273794, "apogee_time": 23.527341503368884, "apogee_y": 388.8839296755811, "lateral_surface_wind": 0.0, "apogee": 2783.738491626635, "apogee_x": 475.57700594298717, "out_of_rail_time": 0.3803962110850567, "out_of_rail_stability_margin": 2.7288497476869984, "initial_stability_margin": 2.65764906179713, "t_final": 274.06066320907485, "x_impact": 566.0619883661833} -{"out_of_rail_velocity": 23.874817396484005, "frontal_surface_wind": 0.0, "y_impact": 462.9786484441807, "impact_velocity": -5.178040107449529, "max_mach_number": 0.7420398709273794, "apogee_time": 23.527341503368884, "apogee_y": 388.8839296755811, "lateral_surface_wind": 0.0, "apogee": 2783.738491626635, "apogee_x": 475.57700594298717, "out_of_rail_time": 0.3803962110850567, "out_of_rail_stability_margin": 2.7288497476869984, "initial_stability_margin": 2.65764906179713, "t_final": 274.06066320907485, "x_impact": 566.0619883661833} -{"out_of_rail_velocity": 23.874817396484005, "frontal_surface_wind": 0.0, "y_impact": 462.9786484441807, "impact_velocity": -5.178040107449529, "max_mach_number": 0.7420398709273794, "apogee_time": 23.527341503368884, "apogee_y": 388.8839296755811, "lateral_surface_wind": 0.0, "apogee": 2783.738491626635, "apogee_x": 475.57700594298717, "out_of_rail_time": 0.3803962110850567, "out_of_rail_stability_margin": 2.7288497476869984, "initial_stability_margin": 2.65764906179713, "t_final": 274.06066320907485, "x_impact": 566.0619883661833} -{"out_of_rail_velocity": 23.874817396484005, "frontal_surface_wind": 0.0, "y_impact": 462.9786484441807, "impact_velocity": -5.178040107449529, "max_mach_number": 0.7420398709273794, "apogee_time": 23.527341503368884, "apogee_y": 388.8839296755811, "lateral_surface_wind": 0.0, "apogee": 2783.738491626635, "apogee_x": 475.57700594298717, "out_of_rail_time": 0.3803962110850567, "out_of_rail_stability_margin": 2.7288497476869984, "initial_stability_margin": 2.65764906179713, "t_final": 274.06066320907485, "x_impact": 566.0619883661833} -{"out_of_rail_velocity": 23.874817396484005, "frontal_surface_wind": 0.0, "y_impact": 462.9786484441807, "impact_velocity": -5.178040107449529, "max_mach_number": 0.7420398709273794, "apogee_time": 23.527341503368884, "apogee_y": 388.8839296755811, "lateral_surface_wind": 0.0, "apogee": 2783.738491626635, "apogee_x": 475.57700594298717, "out_of_rail_time": 0.3803962110850567, "out_of_rail_stability_margin": 2.7288497476869984, "initial_stability_margin": 2.65764906179713, "t_final": 274.06066320907485, "x_impact": 566.0619883661833} -{"out_of_rail_velocity": 23.874817396484005, "frontal_surface_wind": 0.0, "y_impact": 462.9786484441807, "impact_velocity": -5.178040107449529, "max_mach_number": 0.7420398709273794, "apogee_time": 23.527341503368884, "apogee_y": 388.8839296755811, "lateral_surface_wind": 0.0, "apogee": 2783.738491626635, "apogee_x": 475.57700594298717, "out_of_rail_time": 0.3803962110850567, "out_of_rail_stability_margin": 2.7288497476869984, "initial_stability_margin": 2.65764906179713, "t_final": 274.06066320907485, "x_impact": 566.0619883661833} -{"out_of_rail_velocity": 27.3844506634527, "frontal_surface_wind": 0.0, "y_impact": 504.1184757366571, "impact_velocity": -5.288512260865454, "max_mach_number": 0.952488007018488, "apogee_time": 26.993026677513825, "apogee_y": 433.8704390981541, "lateral_surface_wind": 0.0, "apogee": 3846.1825591020524, "apogee_x": 574.9307581066201, "out_of_rail_time": 0.34000740758463355, "out_of_rail_stability_margin": 2.6341050982662835, "initial_stability_margin": 2.580574401214709, "t_final": 327.6041997685319, "x_impact": 667.8725846098314} -{"out_of_rail_velocity": 27.3844506634527, "frontal_surface_wind": 0.0, "y_impact": 504.1184757366571, "impact_velocity": -5.288512260865454, "max_mach_number": 0.952488007018488, "apogee_time": 26.993026677513825, "apogee_y": 433.8704390981541, "lateral_surface_wind": 0.0, "apogee": 3846.1825591020524, "apogee_x": 574.9307581066201, "out_of_rail_time": 0.34000740758463355, "out_of_rail_stability_margin": 2.6341050982662835, "initial_stability_margin": 2.580574401214709, "t_final": 327.6041997685319, "x_impact": 667.8725846098314} -{"out_of_rail_velocity": 27.3844506634527, "frontal_surface_wind": 0.0, "y_impact": 504.1184757366571, "impact_velocity": -5.288512260865454, "max_mach_number": 0.952488007018488, "apogee_time": 26.993026677513825, "apogee_y": 433.8704390981541, "lateral_surface_wind": 0.0, "apogee": 3846.1825591020524, "apogee_x": 574.9307581066201, "out_of_rail_time": 0.34000740758463355, "out_of_rail_stability_margin": 2.6341050982662835, "initial_stability_margin": 2.580574401214709, "t_final": 327.6041997685319, "x_impact": 667.8725846098314} -{"out_of_rail_velocity": 27.3844506634527, "frontal_surface_wind": 0.0, "y_impact": 504.1184757366571, "impact_velocity": -5.288512260865454, "max_mach_number": 0.952488007018488, "apogee_time": 26.993026677513825, "apogee_y": 433.8704390981541, "lateral_surface_wind": 0.0, "apogee": 3846.1825591020524, "apogee_x": 574.9307581066201, "out_of_rail_time": 0.34000740758463355, "out_of_rail_stability_margin": 2.6341050982662835, "initial_stability_margin": 2.580574401214709, "t_final": 327.6041997685319, "x_impact": 667.8725846098314} -{"out_of_rail_velocity": 27.3844506634527, "frontal_surface_wind": 0.0, "y_impact": 504.1184757366571, "impact_velocity": -5.288512260865454, "max_mach_number": 0.952488007018488, "apogee_time": 26.993026677513825, "apogee_y": 433.8704390981541, "lateral_surface_wind": 0.0, "apogee": 3846.1825591020524, "apogee_x": 574.9307581066201, "out_of_rail_time": 0.34000740758463355, "out_of_rail_stability_margin": 2.6341050982662835, "initial_stability_margin": 2.580574401214709, "t_final": 327.6041997685319, "x_impact": 667.8725846098314} -{"out_of_rail_velocity": 27.3844506634527, "frontal_surface_wind": 0.0, "y_impact": 504.1184757366571, "impact_velocity": -5.288512260865454, "max_mach_number": 0.952488007018488, "apogee_time": 26.993026677513825, "apogee_y": 433.8704390981541, "lateral_surface_wind": 0.0, "apogee": 3846.1825591020524, "apogee_x": 574.9307581066201, "out_of_rail_time": 0.34000740758463355, "out_of_rail_stability_margin": 2.6341050982662835, "initial_stability_margin": 2.580574401214709, "t_final": 327.6041997685319, "x_impact": 667.8725846098314} -{"out_of_rail_velocity": 28.937328312944587, "frontal_surface_wind": 0.0, "y_impact": 445.66528729487885, "impact_velocity": -5.379987780928868, "max_mach_number": 1.0465860592791547, "apogee_time": 28.22266241137121, "apogee_y": 386.77262503288244, "lateral_surface_wind": 0.0, "apogee": 4273.52211973665, "apogee_x": 526.1960892132676, "out_of_rail_time": 0.3256445590249125, "out_of_rail_stability_margin": 2.702903180795301, "initial_stability_margin": 2.6519051519800425, "t_final": 345.8552808657848, "x_impact": 606.1434046716357} -{"out_of_rail_velocity": 28.937328312944587, "frontal_surface_wind": 0.0, "y_impact": 445.66528729487885, "impact_velocity": -5.379987780928868, "max_mach_number": 1.0465860592791547, "apogee_time": 28.22266241137121, "apogee_y": 386.77262503288244, "lateral_surface_wind": 0.0, "apogee": 4273.52211973665, "apogee_x": 526.1960892132676, "out_of_rail_time": 0.3256445590249125, "out_of_rail_stability_margin": 2.702903180795301, "initial_stability_margin": 2.6519051519800425, "t_final": 345.8552808657848, "x_impact": 606.1434046716357} -{"out_of_rail_velocity": 28.937328312944587, "frontal_surface_wind": 0.0, "y_impact": 445.66528729487885, "impact_velocity": -5.379987780928868, "max_mach_number": 1.0465860592791547, "apogee_time": 28.22266241137121, "apogee_y": 386.77262503288244, "lateral_surface_wind": 0.0, "apogee": 4273.52211973665, "apogee_x": 526.1960892132676, "out_of_rail_time": 0.3256445590249125, "out_of_rail_stability_margin": 2.702903180795301, "initial_stability_margin": 2.6519051519800425, "t_final": 345.8552808657848, "x_impact": 606.1434046716357} -{"out_of_rail_velocity": 28.937328312944587, "frontal_surface_wind": 0.0, "y_impact": 445.66528729487885, "impact_velocity": -5.379987780928868, "max_mach_number": 1.0465860592791547, "apogee_time": 28.22266241137121, "apogee_y": 386.77262503288244, "lateral_surface_wind": 0.0, "apogee": 4273.52211973665, "apogee_x": 526.1960892132676, "out_of_rail_time": 0.3256445590249125, "out_of_rail_stability_margin": 2.702903180795301, "initial_stability_margin": 2.6519051519800425, "t_final": 345.8552808657848, "x_impact": 606.1434046716357} -{"out_of_rail_velocity": 28.937328312944587, "frontal_surface_wind": 0.0, "y_impact": 445.66528729487885, "impact_velocity": -5.379987780928868, "max_mach_number": 1.0465860592791547, "apogee_time": 28.22266241137121, "apogee_y": 386.77262503288244, "lateral_surface_wind": 0.0, "apogee": 4273.52211973665, "apogee_x": 526.1960892132676, "out_of_rail_time": 0.3256445590249125, "out_of_rail_stability_margin": 2.702903180795301, "initial_stability_margin": 2.6519051519800425, "t_final": 345.8552808657848, "x_impact": 606.1434046716357} -{"out_of_rail_velocity": 28.937328312944587, "frontal_surface_wind": 0.0, "y_impact": 445.66528729487885, "impact_velocity": -5.379987780928868, "max_mach_number": 1.0465860592791547, "apogee_time": 28.22266241137121, "apogee_y": 386.77262503288244, "lateral_surface_wind": 0.0, "apogee": 4273.52211973665, "apogee_x": 526.1960892132676, "out_of_rail_time": 0.3256445590249125, "out_of_rail_stability_margin": 2.702903180795301, "initial_stability_margin": 2.6519051519800425, "t_final": 345.8552808657848, "x_impact": 606.1434046716357} -{"out_of_rail_velocity": 25.90665735111608, "frontal_surface_wind": 0.0, "y_impact": 424.3857269876557, "impact_velocity": -5.290006057286484, "max_mach_number": 0.8629636165776202, "apogee_time": 25.806201168103716, "apogee_y": 361.4506001071813, "lateral_surface_wind": 0.0, "apogee": 3438.9737199494275, "apogee_x": 508.2067490968724, "out_of_rail_time": 0.3553471684052594, "out_of_rail_stability_margin": 2.7458629701987967, "initial_stability_margin": 2.687161248211293, "t_final": 303.9552783574954, "x_impact": 596.5782799341775} -{"out_of_rail_velocity": 25.90665735111608, "frontal_surface_wind": 0.0, "y_impact": 424.3857269876557, "impact_velocity": -5.290006057286484, "max_mach_number": 0.8629636165776202, "apogee_time": 25.806201168103716, "apogee_y": 361.4506001071813, "lateral_surface_wind": 0.0, "apogee": 3438.9737199494275, "apogee_x": 508.2067490968724, "out_of_rail_time": 0.3553471684052594, "out_of_rail_stability_margin": 2.7458629701987967, "initial_stability_margin": 2.687161248211293, "t_final": 303.9552783574954, "x_impact": 596.5782799341775} -{"out_of_rail_velocity": 25.90665735111608, "frontal_surface_wind": 0.0, "y_impact": 424.3857269876557, "impact_velocity": -5.290006057286484, "max_mach_number": 0.8629636165776202, "apogee_time": 25.806201168103716, "apogee_y": 361.4506001071813, "lateral_surface_wind": 0.0, "apogee": 3438.9737199494275, "apogee_x": 508.2067490968724, "out_of_rail_time": 0.3553471684052594, "out_of_rail_stability_margin": 2.7458629701987967, "initial_stability_margin": 2.687161248211293, "t_final": 303.9552783574954, "x_impact": 596.5782799341775} -{"out_of_rail_velocity": 25.90665735111608, "frontal_surface_wind": 0.0, "y_impact": 424.3857269876557, "impact_velocity": -5.290006057286484, "max_mach_number": 0.8629636165776202, "apogee_time": 25.806201168103716, "apogee_y": 361.4506001071813, "lateral_surface_wind": 0.0, "apogee": 3438.9737199494275, "apogee_x": 508.2067490968724, "out_of_rail_time": 0.3553471684052594, "out_of_rail_stability_margin": 2.7458629701987967, "initial_stability_margin": 2.687161248211293, "t_final": 303.9552783574954, "x_impact": 596.5782799341775} -{"out_of_rail_velocity": 25.90665735111608, "frontal_surface_wind": 0.0, "y_impact": 424.3857269876557, "impact_velocity": -5.290006057286484, "max_mach_number": 0.8629636165776202, "apogee_time": 25.806201168103716, "apogee_y": 361.4506001071813, "lateral_surface_wind": 0.0, "apogee": 3438.9737199494275, "apogee_x": 508.2067490968724, "out_of_rail_time": 0.3553471684052594, "out_of_rail_stability_margin": 2.7458629701987967, "initial_stability_margin": 2.687161248211293, "t_final": 303.9552783574954, "x_impact": 596.5782799341775} -{"out_of_rail_velocity": 25.90665735111608, "frontal_surface_wind": 0.0, "y_impact": 424.3857269876557, "impact_velocity": -5.290006057286484, "max_mach_number": 0.8629636165776202, "apogee_time": 25.806201168103716, "apogee_y": 361.4506001071813, "lateral_surface_wind": 0.0, "apogee": 3438.9737199494275, "apogee_x": 508.2067490968724, "out_of_rail_time": 0.3553471684052594, "out_of_rail_stability_margin": 2.7458629701987967, "initial_stability_margin": 2.687161248211293, "t_final": 303.9552783574954, "x_impact": 596.5782799341775} -{"out_of_rail_velocity": 28.509173189562123, "frontal_surface_wind": 0.0, "y_impact": 432.1011543280743, "impact_velocity": -5.351671632955573, "max_mach_number": 1.0234190293314933, "apogee_time": 27.906366320421476, "apogee_y": 375.7181882980271, "lateral_surface_wind": 0.0, "apogee": 4164.863635926156, "apogee_x": 539.066599069825, "out_of_rail_time": 0.32938094186944317, "out_of_rail_stability_margin": 2.7091361525390956, "initial_stability_margin": 2.6555190803295297, "t_final": 345.61206139159475, "x_impact": 619.7608457367157} -{"out_of_rail_velocity": 28.509173189562123, "frontal_surface_wind": 0.0, "y_impact": 432.1011543280743, "impact_velocity": -5.351671632955573, "max_mach_number": 1.0234190293314933, "apogee_time": 27.906366320421476, "apogee_y": 375.7181882980271, "lateral_surface_wind": 0.0, "apogee": 4164.863635926156, "apogee_x": 539.066599069825, "out_of_rail_time": 0.32938094186944317, "out_of_rail_stability_margin": 2.7091361525390956, "initial_stability_margin": 2.6555190803295297, "t_final": 345.61206139159475, "x_impact": 619.7608457367157} -{"out_of_rail_velocity": 28.509173189562123, "frontal_surface_wind": 0.0, "y_impact": 432.1011543280743, "impact_velocity": -5.351671632955573, "max_mach_number": 1.0234190293314933, "apogee_time": 27.906366320421476, "apogee_y": 375.7181882980271, "lateral_surface_wind": 0.0, "apogee": 4164.863635926156, "apogee_x": 539.066599069825, "out_of_rail_time": 0.32938094186944317, "out_of_rail_stability_margin": 2.7091361525390956, "initial_stability_margin": 2.6555190803295297, "t_final": 345.61206139159475, "x_impact": 619.7608457367157} -{"out_of_rail_velocity": 28.509173189562123, "frontal_surface_wind": 0.0, "y_impact": 432.1011543280743, "impact_velocity": -5.351671632955573, "max_mach_number": 1.0234190293314933, "apogee_time": 27.906366320421476, "apogee_y": 375.7181882980271, "lateral_surface_wind": 0.0, "apogee": 4164.863635926156, "apogee_x": 539.066599069825, "out_of_rail_time": 0.32938094186944317, "out_of_rail_stability_margin": 2.7091361525390956, "initial_stability_margin": 2.6555190803295297, "t_final": 345.61206139159475, "x_impact": 619.7608457367157} -{"out_of_rail_velocity": 28.509173189562123, "frontal_surface_wind": 0.0, "y_impact": 432.1011543280743, "impact_velocity": -5.351671632955573, "max_mach_number": 1.0234190293314933, "apogee_time": 27.906366320421476, "apogee_y": 375.7181882980271, "lateral_surface_wind": 0.0, "apogee": 4164.863635926156, "apogee_x": 539.066599069825, "out_of_rail_time": 0.32938094186944317, "out_of_rail_stability_margin": 2.7091361525390956, "initial_stability_margin": 2.6555190803295297, "t_final": 345.61206139159475, "x_impact": 619.7608457367157} -{"out_of_rail_velocity": 28.509173189562123, "frontal_surface_wind": 0.0, "y_impact": 432.1011543280743, "impact_velocity": -5.351671632955573, "max_mach_number": 1.0234190293314933, "apogee_time": 27.906366320421476, "apogee_y": 375.7181882980271, "lateral_surface_wind": 0.0, "apogee": 4164.863635926156, "apogee_x": 539.066599069825, "out_of_rail_time": 0.32938094186944317, "out_of_rail_stability_margin": 2.7091361525390956, "initial_stability_margin": 2.6555190803295297, "t_final": 345.61206139159475, "x_impact": 619.7608457367157} -{"out_of_rail_velocity": 28.344820117261573, "frontal_surface_wind": 0.0, "y_impact": 332.2331612298767, "impact_velocity": -5.190389774517426, "max_mach_number": 1.009769022209867, "apogee_time": 27.446446342311965, "apogee_y": 285.1399858817136, "lateral_surface_wind": 0.0, "apogee": 4046.498838258764, "apogee_x": 384.8141150239655, "out_of_rail_time": 0.3314812190050872, "out_of_rail_stability_margin": 2.670710441476377, "initial_stability_margin": 2.6153075269519004, "t_final": 341.16656991271566, "x_impact": 448.1882661586142} -{"out_of_rail_velocity": 28.344820117261573, "frontal_surface_wind": 0.0, "y_impact": 332.2331612298767, "impact_velocity": -5.190389774517426, "max_mach_number": 1.009769022209867, "apogee_time": 27.446446342311965, "apogee_y": 285.1399858817136, "lateral_surface_wind": 0.0, "apogee": 4046.498838258764, "apogee_x": 384.8141150239655, "out_of_rail_time": 0.3314812190050872, "out_of_rail_stability_margin": 2.670710441476377, "initial_stability_margin": 2.6153075269519004, "t_final": 341.16656991271566, "x_impact": 448.1882661586142} -{"out_of_rail_velocity": 28.344820117261573, "frontal_surface_wind": 0.0, "y_impact": 332.2331612298767, "impact_velocity": -5.190389774517426, "max_mach_number": 1.009769022209867, "apogee_time": 27.446446342311965, "apogee_y": 285.1399858817136, "lateral_surface_wind": 0.0, "apogee": 4046.498838258764, "apogee_x": 384.8141150239655, "out_of_rail_time": 0.3314812190050872, "out_of_rail_stability_margin": 2.670710441476377, "initial_stability_margin": 2.6153075269519004, "t_final": 341.16656991271566, "x_impact": 448.1882661586142} -{"out_of_rail_velocity": 28.344820117261573, "frontal_surface_wind": 0.0, "y_impact": 332.2331612298767, "impact_velocity": -5.190389774517426, "max_mach_number": 1.009769022209867, "apogee_time": 27.446446342311965, "apogee_y": 285.1399858817136, "lateral_surface_wind": 0.0, "apogee": 4046.498838258764, "apogee_x": 384.8141150239655, "out_of_rail_time": 0.3314812190050872, "out_of_rail_stability_margin": 2.670710441476377, "initial_stability_margin": 2.6153075269519004, "t_final": 341.16656991271566, "x_impact": 448.1882661586142} -{"out_of_rail_velocity": 28.344820117261573, "frontal_surface_wind": 0.0, "y_impact": 332.2331612298767, "impact_velocity": -5.190389774517426, "max_mach_number": 1.009769022209867, "apogee_time": 27.446446342311965, "apogee_y": 285.1399858817136, "lateral_surface_wind": 0.0, "apogee": 4046.498838258764, "apogee_x": 384.8141150239655, "out_of_rail_time": 0.3314812190050872, "out_of_rail_stability_margin": 2.670710441476377, "initial_stability_margin": 2.6153075269519004, "t_final": 341.16656991271566, "x_impact": 448.1882661586142} -{"out_of_rail_velocity": 28.344820117261573, "frontal_surface_wind": 0.0, "y_impact": 332.2331612298767, "impact_velocity": -5.190389774517426, "max_mach_number": 1.009769022209867, "apogee_time": 27.446446342311965, "apogee_y": 285.1399858817136, "lateral_surface_wind": 0.0, "apogee": 4046.498838258764, "apogee_x": 384.8141150239655, "out_of_rail_time": 0.3314812190050872, "out_of_rail_stability_margin": 2.670710441476377, "initial_stability_margin": 2.6153075269519004, "t_final": 341.16656991271566, "x_impact": 448.1882661586142} -{"out_of_rail_velocity": 25.16157993702822, "frontal_surface_wind": 0.0, "y_impact": 428.4776044294352, "impact_velocity": -5.281725348079313, "max_mach_number": 0.8186313680543607, "apogee_time": 25.034283687185653, "apogee_y": 365.6962294463962, "lateral_surface_wind": 0.0, "apogee": 3204.526088891171, "apogee_x": 483.0340407150971, "out_of_rail_time": 0.36460833720114005, "out_of_rail_stability_margin": 2.5958988177535596, "initial_stability_margin": 2.531462755965427, "t_final": 297.1848472636716, "x_impact": 565.7696498234857} -{"out_of_rail_velocity": 25.16157993702822, "frontal_surface_wind": 0.0, "y_impact": 428.4776044294352, "impact_velocity": -5.281725348079313, "max_mach_number": 0.8186313680543607, "apogee_time": 25.034283687185653, "apogee_y": 365.6962294463962, "lateral_surface_wind": 0.0, "apogee": 3204.526088891171, "apogee_x": 483.0340407150971, "out_of_rail_time": 0.36460833720114005, "out_of_rail_stability_margin": 2.5958988177535596, "initial_stability_margin": 2.531462755965427, "t_final": 297.1848472636716, "x_impact": 565.7696498234857} -{"out_of_rail_velocity": 25.16157993702822, "frontal_surface_wind": 0.0, "y_impact": 428.4776044294352, "impact_velocity": -5.281725348079313, "max_mach_number": 0.8186313680543607, "apogee_time": 25.034283687185653, "apogee_y": 365.6962294463962, "lateral_surface_wind": 0.0, "apogee": 3204.526088891171, "apogee_x": 483.0340407150971, "out_of_rail_time": 0.36460833720114005, "out_of_rail_stability_margin": 2.5958988177535596, "initial_stability_margin": 2.531462755965427, "t_final": 297.1848472636716, "x_impact": 565.7696498234857} -{"out_of_rail_velocity": 25.16157993702822, "frontal_surface_wind": 0.0, "y_impact": 428.4776044294352, "impact_velocity": -5.281725348079313, "max_mach_number": 0.8186313680543607, "apogee_time": 25.034283687185653, "apogee_y": 365.6962294463962, "lateral_surface_wind": 0.0, "apogee": 3204.526088891171, "apogee_x": 483.0340407150971, "out_of_rail_time": 0.36460833720114005, "out_of_rail_stability_margin": 2.5958988177535596, "initial_stability_margin": 2.531462755965427, "t_final": 297.1848472636716, "x_impact": 565.7696498234857} -{"out_of_rail_velocity": 25.16157993702822, "frontal_surface_wind": 0.0, "y_impact": 428.4776044294352, "impact_velocity": -5.281725348079313, "max_mach_number": 0.8186313680543607, "apogee_time": 25.034283687185653, "apogee_y": 365.6962294463962, "lateral_surface_wind": 0.0, "apogee": 3204.526088891171, "apogee_x": 483.0340407150971, "out_of_rail_time": 0.36460833720114005, "out_of_rail_stability_margin": 2.5958988177535596, "initial_stability_margin": 2.531462755965427, "t_final": 297.1848472636716, "x_impact": 565.7696498234857} -{"out_of_rail_velocity": 25.16157993702822, "frontal_surface_wind": 0.0, "y_impact": 428.4776044294352, "impact_velocity": -5.281725348079313, "max_mach_number": 0.8186313680543607, "apogee_time": 25.034283687185653, "apogee_y": 365.6962294463962, "lateral_surface_wind": 0.0, "apogee": 3204.526088891171, "apogee_x": 483.0340407150971, "out_of_rail_time": 0.36460833720114005, "out_of_rail_stability_margin": 2.5958988177535596, "initial_stability_margin": 2.531462755965427, "t_final": 297.1848472636716, "x_impact": 565.7696498234857} -{"out_of_rail_velocity": 24.760204120750906, "frontal_surface_wind": 0.0, "y_impact": 447.99153435246336, "impact_velocity": -5.286975668423689, "max_mach_number": 0.7943061778623528, "apogee_time": 24.64030046554107, "apogee_y": 382.59688208756364, "lateral_surface_wind": 0.0, "apogee": 3083.844336656191, "apogee_x": 477.064325037626, "out_of_rail_time": 0.3687415748421617, "out_of_rail_stability_margin": 2.6708279896482914, "initial_stability_margin": 2.6067679558313808, "t_final": 290.8023842763272, "x_impact": 558.409099523829} -{"out_of_rail_velocity": 24.760204120750906, "frontal_surface_wind": 0.0, "y_impact": 447.99153435246336, "impact_velocity": -5.286975668423689, "max_mach_number": 0.7943061778623528, "apogee_time": 24.64030046554107, "apogee_y": 382.59688208756364, "lateral_surface_wind": 0.0, "apogee": 3083.844336656191, "apogee_x": 477.064325037626, "out_of_rail_time": 0.3687415748421617, "out_of_rail_stability_margin": 2.6708279896482914, "initial_stability_margin": 2.6067679558313808, "t_final": 290.8023842763272, "x_impact": 558.409099523829} -{"out_of_rail_velocity": 24.760204120750906, "frontal_surface_wind": 0.0, "y_impact": 447.99153435246336, "impact_velocity": -5.286975668423689, "max_mach_number": 0.7943061778623528, "apogee_time": 24.64030046554107, "apogee_y": 382.59688208756364, "lateral_surface_wind": 0.0, "apogee": 3083.844336656191, "apogee_x": 477.064325037626, "out_of_rail_time": 0.3687415748421617, "out_of_rail_stability_margin": 2.6708279896482914, "initial_stability_margin": 2.6067679558313808, "t_final": 290.8023842763272, "x_impact": 558.409099523829} -{"out_of_rail_velocity": 24.760204120750906, "frontal_surface_wind": 0.0, "y_impact": 447.99153435246336, "impact_velocity": -5.286975668423689, "max_mach_number": 0.7943061778623528, "apogee_time": 24.64030046554107, "apogee_y": 382.59688208756364, "lateral_surface_wind": 0.0, "apogee": 3083.844336656191, "apogee_x": 477.064325037626, "out_of_rail_time": 0.3687415748421617, "out_of_rail_stability_margin": 2.6708279896482914, "initial_stability_margin": 2.6067679558313808, "t_final": 290.8023842763272, "x_impact": 558.409099523829} -{"out_of_rail_velocity": 24.760204120750906, "frontal_surface_wind": 0.0, "y_impact": 447.99153435246336, "impact_velocity": -5.286975668423689, "max_mach_number": 0.7943061778623528, "apogee_time": 24.64030046554107, "apogee_y": 382.59688208756364, "lateral_surface_wind": 0.0, "apogee": 3083.844336656191, "apogee_x": 477.064325037626, "out_of_rail_time": 0.3687415748421617, "out_of_rail_stability_margin": 2.6708279896482914, "initial_stability_margin": 2.6067679558313808, "t_final": 290.8023842763272, "x_impact": 558.409099523829} -{"out_of_rail_velocity": 24.760204120750906, "frontal_surface_wind": 0.0, "y_impact": 447.99153435246336, "impact_velocity": -5.286975668423689, "max_mach_number": 0.7943061778623528, "apogee_time": 24.64030046554107, "apogee_y": 382.59688208756364, "lateral_surface_wind": 0.0, "apogee": 3083.844336656191, "apogee_x": 477.064325037626, "out_of_rail_time": 0.3687415748421617, "out_of_rail_stability_margin": 2.6708279896482914, "initial_stability_margin": 2.6067679558313808, "t_final": 290.8023842763272, "x_impact": 558.409099523829} -{"out_of_rail_velocity": 27.787437533122112, "frontal_surface_wind": 0.0, "y_impact": 521.9294731894299, "impact_velocity": -5.241371471525849, "max_mach_number": 0.9785963690639253, "apogee_time": 27.104290231175092, "apogee_y": 454.9078256705245, "lateral_surface_wind": 0.0, "apogee": 3912.7477594453735, "apogee_x": 674.5475109304022, "out_of_rail_time": 0.3363690497173902, "out_of_rail_stability_margin": 2.6714019928510844, "initial_stability_margin": 2.616961900454846, "t_final": 340.7934040882842, "x_impact": 773.8214546267134} -{"out_of_rail_velocity": 27.787437533122112, "frontal_surface_wind": 0.0, "y_impact": 521.9294731894299, "impact_velocity": -5.241371471525849, "max_mach_number": 0.9785963690639253, "apogee_time": 27.104290231175092, "apogee_y": 454.9078256705245, "lateral_surface_wind": 0.0, "apogee": 3912.7477594453735, "apogee_x": 674.5475109304022, "out_of_rail_time": 0.3363690497173902, "out_of_rail_stability_margin": 2.6714019928510844, "initial_stability_margin": 2.616961900454846, "t_final": 340.7934040882842, "x_impact": 773.8214546267134} -{"out_of_rail_velocity": 27.787437533122112, "frontal_surface_wind": 0.0, "y_impact": 521.9294731894299, "impact_velocity": -5.241371471525849, "max_mach_number": 0.9785963690639253, "apogee_time": 27.104290231175092, "apogee_y": 454.9078256705245, "lateral_surface_wind": 0.0, "apogee": 3912.7477594453735, "apogee_x": 674.5475109304022, "out_of_rail_time": 0.3363690497173902, "out_of_rail_stability_margin": 2.6714019928510844, "initial_stability_margin": 2.616961900454846, "t_final": 340.7934040882842, "x_impact": 773.8214546267134} -{"out_of_rail_velocity": 27.787437533122112, "frontal_surface_wind": 0.0, "y_impact": 521.9294731894299, "impact_velocity": -5.241371471525849, "max_mach_number": 0.9785963690639253, "apogee_time": 27.104290231175092, "apogee_y": 454.9078256705245, "lateral_surface_wind": 0.0, "apogee": 3912.7477594453735, "apogee_x": 674.5475109304022, "out_of_rail_time": 0.3363690497173902, "out_of_rail_stability_margin": 2.6714019928510844, "initial_stability_margin": 2.616961900454846, "t_final": 340.7934040882842, "x_impact": 773.8214546267134} -{"out_of_rail_velocity": 27.787437533122112, "frontal_surface_wind": 0.0, "y_impact": 521.9294731894299, "impact_velocity": -5.241371471525849, "max_mach_number": 0.9785963690639253, "apogee_time": 27.104290231175092, "apogee_y": 454.9078256705245, "lateral_surface_wind": 0.0, "apogee": 3912.7477594453735, "apogee_x": 674.5475109304022, "out_of_rail_time": 0.3363690497173902, "out_of_rail_stability_margin": 2.6714019928510844, "initial_stability_margin": 2.616961900454846, "t_final": 340.7934040882842, "x_impact": 773.8214546267134} -{"out_of_rail_velocity": 27.787437533122112, "frontal_surface_wind": 0.0, "y_impact": 521.9294731894299, "impact_velocity": -5.241371471525849, "max_mach_number": 0.9785963690639253, "apogee_time": 27.104290231175092, "apogee_y": 454.9078256705245, "lateral_surface_wind": 0.0, "apogee": 3912.7477594453735, "apogee_x": 674.5475109304022, "out_of_rail_time": 0.3363690497173902, "out_of_rail_stability_margin": 2.6714019928510844, "initial_stability_margin": 2.616961900454846, "t_final": 340.7934040882842, "x_impact": 773.8214546267134} -{"out_of_rail_velocity": 28.987212342194432, "frontal_surface_wind": 0.0, "y_impact": 357.7071441768116, "impact_velocity": -5.371061973611326, "max_mach_number": 1.0509421957973917, "apogee_time": 28.14223297994402, "apogee_y": 312.65378115977825, "lateral_surface_wind": 0.0, "apogee": 4265.542891078884, "apogee_x": 405.3928751422348, "out_of_rail_time": 0.3252969704532001, "out_of_rail_stability_margin": 2.6626046456679324, "initial_stability_margin": 2.609051097191596, "t_final": 354.18246813301676, "x_impact": 463.7075358733703} -{"out_of_rail_velocity": 28.987212342194432, "frontal_surface_wind": 0.0, "y_impact": 357.7071441768116, "impact_velocity": -5.371061973611326, "max_mach_number": 1.0509421957973917, "apogee_time": 28.14223297994402, "apogee_y": 312.65378115977825, "lateral_surface_wind": 0.0, "apogee": 4265.542891078884, "apogee_x": 405.3928751422348, "out_of_rail_time": 0.3252969704532001, "out_of_rail_stability_margin": 2.6626046456679324, "initial_stability_margin": 2.609051097191596, "t_final": 354.18246813301676, "x_impact": 463.7075358733703} -{"out_of_rail_velocity": 28.987212342194432, "frontal_surface_wind": 0.0, "y_impact": 357.7071441768116, "impact_velocity": -5.371061973611326, "max_mach_number": 1.0509421957973917, "apogee_time": 28.14223297994402, "apogee_y": 312.65378115977825, "lateral_surface_wind": 0.0, "apogee": 4265.542891078884, "apogee_x": 405.3928751422348, "out_of_rail_time": 0.3252969704532001, "out_of_rail_stability_margin": 2.6626046456679324, "initial_stability_margin": 2.609051097191596, "t_final": 354.18246813301676, "x_impact": 463.7075358733703} -{"out_of_rail_velocity": 28.987212342194432, "frontal_surface_wind": 0.0, "y_impact": 357.7071441768116, "impact_velocity": -5.371061973611326, "max_mach_number": 1.0509421957973917, "apogee_time": 28.14223297994402, "apogee_y": 312.65378115977825, "lateral_surface_wind": 0.0, "apogee": 4265.542891078884, "apogee_x": 405.3928751422348, "out_of_rail_time": 0.3252969704532001, "out_of_rail_stability_margin": 2.6626046456679324, "initial_stability_margin": 2.609051097191596, "t_final": 354.18246813301676, "x_impact": 463.7075358733703} -{"out_of_rail_velocity": 28.987212342194432, "frontal_surface_wind": 0.0, "y_impact": 357.7071441768116, "impact_velocity": -5.371061973611326, "max_mach_number": 1.0509421957973917, "apogee_time": 28.14223297994402, "apogee_y": 312.65378115977825, "lateral_surface_wind": 0.0, "apogee": 4265.542891078884, "apogee_x": 405.3928751422348, "out_of_rail_time": 0.3252969704532001, "out_of_rail_stability_margin": 2.6626046456679324, "initial_stability_margin": 2.609051097191596, "t_final": 354.18246813301676, "x_impact": 463.7075358733703} -{"out_of_rail_velocity": 22.307769960940472, "frontal_surface_wind": 0.0, "y_impact": 374.5084932743953, "impact_velocity": -5.229047684820335, "max_mach_number": 0.6517846611828555, "apogee_time": 21.932653711238448, "apogee_y": 311.9509920082, "lateral_surface_wind": 0.0, "apogee": 2354.042162756789, "apogee_x": 414.1172588313796, "out_of_rail_time": 0.402619963985756, "out_of_rail_stability_margin": 2.6895815444167663, "initial_stability_margin": 2.611485903163721, "t_final": 255.95325892152192, "x_impact": 497.06966266703523} -{"out_of_rail_velocity": 28.987212342194432, "frontal_surface_wind": 0.0, "y_impact": 357.7071441768116, "impact_velocity": -5.371061973611326, "max_mach_number": 1.0509421957973917, "apogee_time": 28.14223297994402, "apogee_y": 312.65378115977825, "lateral_surface_wind": 0.0, "apogee": 4265.542891078884, "apogee_x": 405.3928751422348, "out_of_rail_time": 0.3252969704532001, "out_of_rail_stability_margin": 2.6626046456679324, "initial_stability_margin": 2.609051097191596, "t_final": 354.18246813301676, "x_impact": 463.7075358733703} -{"out_of_rail_velocity": 22.307769960940472, "frontal_surface_wind": 0.0, "y_impact": 374.5084932743953, "impact_velocity": -5.229047684820335, "max_mach_number": 0.6517846611828555, "apogee_time": 21.932653711238448, "apogee_y": 311.9509920082, "lateral_surface_wind": 0.0, "apogee": 2354.042162756789, "apogee_x": 414.1172588313796, "out_of_rail_time": 0.402619963985756, "out_of_rail_stability_margin": 2.6895815444167663, "initial_stability_margin": 2.611485903163721, "t_final": 255.95325892152192, "x_impact": 497.06966266703523} -{"out_of_rail_velocity": 22.307769960940472, "frontal_surface_wind": 0.0, "y_impact": 374.5084932743953, "impact_velocity": -5.229047684820335, "max_mach_number": 0.6517846611828555, "apogee_time": 21.932653711238448, "apogee_y": 311.9509920082, "lateral_surface_wind": 0.0, "apogee": 2354.042162756789, "apogee_x": 414.1172588313796, "out_of_rail_time": 0.402619963985756, "out_of_rail_stability_margin": 2.6895815444167663, "initial_stability_margin": 2.611485903163721, "t_final": 255.95325892152192, "x_impact": 497.06966266703523} -{"out_of_rail_velocity": 22.307769960940472, "frontal_surface_wind": 0.0, "y_impact": 374.5084932743953, "impact_velocity": -5.229047684820335, "max_mach_number": 0.6517846611828555, "apogee_time": 21.932653711238448, "apogee_y": 311.9509920082, "lateral_surface_wind": 0.0, "apogee": 2354.042162756789, "apogee_x": 414.1172588313796, "out_of_rail_time": 0.402619963985756, "out_of_rail_stability_margin": 2.6895815444167663, "initial_stability_margin": 2.611485903163721, "t_final": 255.95325892152192, "x_impact": 497.06966266703523} -{"out_of_rail_velocity": 22.307769960940472, "frontal_surface_wind": 0.0, "y_impact": 374.5084932743953, "impact_velocity": -5.229047684820335, "max_mach_number": 0.6517846611828555, "apogee_time": 21.932653711238448, "apogee_y": 311.9509920082, "lateral_surface_wind": 0.0, "apogee": 2354.042162756789, "apogee_x": 414.1172588313796, "out_of_rail_time": 0.402619963985756, "out_of_rail_stability_margin": 2.6895815444167663, "initial_stability_margin": 2.611485903163721, "t_final": 255.95325892152192, "x_impact": 497.06966266703523} -{"out_of_rail_velocity": 22.307769960940472, "frontal_surface_wind": 0.0, "y_impact": 374.5084932743953, "impact_velocity": -5.229047684820335, "max_mach_number": 0.6517846611828555, "apogee_time": 21.932653711238448, "apogee_y": 311.9509920082, "lateral_surface_wind": 0.0, "apogee": 2354.042162756789, "apogee_x": 414.1172588313796, "out_of_rail_time": 0.402619963985756, "out_of_rail_stability_margin": 2.6895815444167663, "initial_stability_margin": 2.611485903163721, "t_final": 255.95325892152192, "x_impact": 497.06966266703523} -{"out_of_rail_velocity": 26.135749861788074, "frontal_surface_wind": 0.0, "y_impact": 474.7446340641195, "impact_velocity": -5.220613883573867, "max_mach_number": 0.8760617256346969, "apogee_time": 25.825305691202495, "apogee_y": 409.4277666898819, "lateral_surface_wind": 0.0, "apogee": 3466.463357620926, "apogee_x": 531.3274757411368, "out_of_rail_time": 0.3533049609480825, "out_of_rail_stability_margin": 2.5769296336285294, "initial_stability_margin": 2.5179482469738548, "t_final": 312.8943492321751, "x_impact": 616.0028933022503} -{"out_of_rail_velocity": 26.135749861788074, "frontal_surface_wind": 0.0, "y_impact": 474.7446340641195, "impact_velocity": -5.220613883573867, "max_mach_number": 0.8760617256346969, "apogee_time": 25.825305691202495, "apogee_y": 409.4277666898819, "lateral_surface_wind": 0.0, "apogee": 3466.463357620926, "apogee_x": 531.3274757411368, "out_of_rail_time": 0.3533049609480825, "out_of_rail_stability_margin": 2.5769296336285294, "initial_stability_margin": 2.5179482469738548, "t_final": 312.8943492321751, "x_impact": 616.0028933022503} -{"out_of_rail_velocity": 26.135749861788074, "frontal_surface_wind": 0.0, "y_impact": 474.7446340641195, "impact_velocity": -5.220613883573867, "max_mach_number": 0.8760617256346969, "apogee_time": 25.825305691202495, "apogee_y": 409.4277666898819, "lateral_surface_wind": 0.0, "apogee": 3466.463357620926, "apogee_x": 531.3274757411368, "out_of_rail_time": 0.3533049609480825, "out_of_rail_stability_margin": 2.5769296336285294, "initial_stability_margin": 2.5179482469738548, "t_final": 312.8943492321751, "x_impact": 616.0028933022503} -{"out_of_rail_velocity": 26.135749861788074, "frontal_surface_wind": 0.0, "y_impact": 474.7446340641195, "impact_velocity": -5.220613883573867, "max_mach_number": 0.8760617256346969, "apogee_time": 25.825305691202495, "apogee_y": 409.4277666898819, "lateral_surface_wind": 0.0, "apogee": 3466.463357620926, "apogee_x": 531.3274757411368, "out_of_rail_time": 0.3533049609480825, "out_of_rail_stability_margin": 2.5769296336285294, "initial_stability_margin": 2.5179482469738548, "t_final": 312.8943492321751, "x_impact": 616.0028933022503} +{"y_impact": 376.4093936666002, "lateral_surface_wind": 0.0, "initial_stability_margin": 2.480437369786049, "t_final": 297.6055162158094, "out_of_rail_time": 0.3644630325601292, "out_of_rail_velocity": 25.152119657668607, "impact_velocity": -5.296953388035182, "frontal_surface_wind": 0.0, "max_mach_number": 0.819174310760017, "apogee_time": 25.11789981221646, "apogee": 3222.1027729232774, "out_of_rail_stability_margin": 2.544734003612891, "apogee_y": 322.5722243035113, "x_impact": 549.7379022443392, "apogee_x": 471.2504049061847} +{"y_impact": 243.63933862204485, "lateral_surface_wind": 0.0, "initial_stability_margin": 2.5198541842854403, "t_final": 290.1213491019737, "out_of_rail_time": 0.36838848375952415, "out_of_rail_velocity": 24.80760014840061, "impact_velocity": -5.371851784584625, "frontal_surface_wind": 0.0, "max_mach_number": 0.7980769553290763, "apogee_time": 24.959016407901405, "apogee": 3157.3918762259696, "out_of_rail_stability_margin": 2.5841107044590683, "apogee_y": 206.75669940027146, "x_impact": 336.10623704541666, "apogee_x": 285.2758881288964} +{"y_impact": 372.02439705262657, "lateral_surface_wind": 0.0, "initial_stability_margin": 2.4901468057791645, "t_final": 296.0470110046021, "out_of_rail_time": 0.36529270648045564, "out_of_rail_velocity": 25.067317674479906, "impact_velocity": -5.31392965857208, "frontal_surface_wind": 0.0, "max_mach_number": 0.8143530498151831, "apogee_time": 25.093820748470794, "apogee": 3209.7128008872883, "out_of_rail_stability_margin": 2.5544421260829226, "apogee_y": 318.0130213913223, "x_impact": 473.6489271270285, "apogee_x": 404.96520784245683} +{"y_impact": 496.61166316874665, "lateral_surface_wind": 0.0, "initial_stability_margin": 2.478152355581192, "t_final": 297.1833587224625, "out_of_rail_time": 0.36408311791094367, "out_of_rail_velocity": 25.160807859850472, "impact_velocity": -5.293301337464766, "frontal_surface_wind": 0.0, "max_mach_number": 0.8204086535288839, "apogee_time": 25.050555048519215, "apogee": 3207.947515019143, "out_of_rail_stability_margin": 2.542400200486431, "apogee_y": 427.842259468107, "x_impact": 657.9531644117097, "apogee_x": 567.0252993471223} +{"y_impact": 463.89061951909554, "lateral_surface_wind": 0.0, "initial_stability_margin": 2.450019520222253, "t_final": 303.13871091704345, "out_of_rail_time": 0.3614804810522778, "out_of_rail_velocity": 25.398584294954205, "impact_velocity": -5.241834653200499, "frontal_surface_wind": 0.0, "max_mach_number": 0.8348907582345828, "apogee_time": 25.215811341848426, "apogee": 3268.0540721835323, "out_of_rail_stability_margin": 2.514298748324184, "apogee_y": 399.99963799941986, "x_impact": 642.1643391895884, "apogee_x": 553.8094033935843} +{"y_impact": 401.1114077443174, "lateral_surface_wind": 0.0, "initial_stability_margin": 2.4653674640426577, "t_final": 300.5363319517597, "out_of_rail_time": 0.3638737801046747, "out_of_rail_velocity": 25.357485734133984, "impact_velocity": -5.268929085025962, "frontal_surface_wind": 0.0, "max_mach_number": 0.827121352431483, "apogee_time": 25.180505941630155, "apogee": 3248.336781428359, "out_of_rail_stability_margin": 2.5298490268824274, "apogee_y": 344.6241139073043, "x_impact": 587.1447868872624, "apogee_x": 504.58858234172453} +{"y_impact": 484.3299624760172, "lateral_surface_wind": 0.0, "initial_stability_margin": 2.4930828238738156, "t_final": 294.21934603920414, "out_of_rail_time": 0.36564340061919365, "out_of_rail_velocity": 25.046284827320218, "impact_velocity": -5.32073724239022, "frontal_surface_wind": 0.0, "max_mach_number": 0.8127012661184341, "apogee_time": 24.98744801891824, "apogee": 3181.9046046872036, "out_of_rail_stability_margin": 2.55735050829616, "apogee_y": 416.41920527349623, "x_impact": 624.311863138006, "apogee_x": 536.9918416412263} +{"y_impact": 420.6430777646008, "lateral_surface_wind": 0.0, "initial_stability_margin": 2.45679122920561, "t_final": 321.58388898296556, "out_of_rail_time": 0.3478642776860374, "out_of_rail_velocity": 26.65103672553457, "impact_velocity": -5.281095604825058, "frontal_surface_wind": 0.0, "max_mach_number": 0.9135304357162811, "apogee_time": 26.53064259165833, "apogee": 3679.33021869783, "out_of_rail_stability_margin": 2.5171352111200815, "apogee_y": 360.36787114754355, "x_impact": 614.3029445393439, "apogee_x": 526.4300236006761} +{"y_impact": 273.2260215637811, "lateral_surface_wind": 0.0, "initial_stability_margin": 2.4964593557418198, "t_final": 314.5382053976061, "out_of_rail_time": 0.3514097436728618, "out_of_rail_velocity": 26.29081810827018, "impact_velocity": -5.355769573283248, "frontal_surface_wind": 0.0, "max_mach_number": 0.8912681726307177, "apogee_time": 26.437317720431484, "apogee": 3624.499656223051, "out_of_rail_stability_margin": 2.5567627592159825, "apogee_y": 232.28515137704224, "x_impact": 376.85248351134277, "apogee_x": 320.47661630506207} +{"y_impact": 416.1124922184138, "lateral_surface_wind": 0.0, "initial_stability_margin": 2.4665515328136935, "t_final": 320.1932561690099, "out_of_rail_time": 0.34853983844891023, "out_of_rail_velocity": 26.55272752087761, "impact_velocity": -5.298021039846923, "frontal_surface_wind": 0.0, "max_mach_number": 0.9084447316599489, "apogee_time": 26.52146827400213, "apogee": 3669.432568500049, "out_of_rail_stability_margin": 2.5268821641395993, "apogee_y": 355.7321070911121, "x_impact": 529.7365658131114, "apogee_x": 452.98676519140616} diff --git a/docs/notebooks/monte_carlo_analysis/monte_carlo_class_usage.ipynb b/docs/notebooks/monte_carlo_analysis/monte_carlo_class_usage.ipynb index b4aa8f242..5e1150f73 100644 --- a/docs/notebooks/monte_carlo_analysis/monte_carlo_class_usage.ipynb +++ b/docs/notebooks/monte_carlo_analysis/monte_carlo_class_usage.ipynb @@ -230,7 +230,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "23586dd854c944e0b673ca4aa2cb5314", + "model_id": "d84184a4d6cd4b308effd022952bd8b0", "version_major": 2, "version_minor": 0 }, @@ -507,7 +507,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "[8927.944495610685, 6524.481738856048, 6559.534235033352, 6489.874776358132, 8171.666908273743]\n" + "[7093.420133006473, 7575.9811666258265, 6351.320054638862, 6123.550282734476, 5674.177733305354]\n" ] } ], @@ -776,14 +776,14 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "/home/phmb/github/RocketPy/rocketpy/simulation/monte_carlo.py:136: UserWarning: This class is still under testing and some attributes may be changed in next versions\n", + "/home/phmb/github/RocketPy/rocketpy/simulation/monte_carlo.py:132: UserWarning: This class is still under testing and some attributes may be changed in next versions\n", " warnings.warn(\n" ] } @@ -810,134 +810,21 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Starting Monte Carlo analysis\n", - "Number of simulations: 100sis\n", - "Current iteration: 000004 | Average Time per Iteration: 0.902 s | Estimated time left: 84 s\n", - "Current iteration: 000001 | Average Time per Iteration: 0.785 s | Estimated time left: 72 s\n", - "Current iteration: 000005 | Average Time per Iteration: 0.703 s | Estimated time left: 64 s\n", - "Current iteration: 000003 | Average Time per Iteration: 0.630 s | Estimated time left: 57 s\n", - "Current iteration: 000002 | Average Time per Iteration: 0.576 s | Estimated time left: 51 s\n", - "Current iteration: 000000 | Average Time per Iteration: 0.526 s | Estimated time left: 46 s\n", - "Current iteration: 000007 | Average Time per Iteration: 0.674 s | Estimated time left: 59 s\n", - "Current iteration: 000009 | Average Time per Iteration: 0.639 s | Estimated time left: 55 s\n", - "Current iteration: 000006 | Average Time per Iteration: 0.629 s | Estimated time left: 54 s\n", - "Current iteration: 000008 | Average Time per Iteration: 0.608 s | Estimated time left: 51 s\n", - "Current iteration: 000010 | Average Time per Iteration: 0.578 s | Estimated time left: 48 s\n", - "Current iteration: 000011 | Average Time per Iteration: 0.547 s | Estimated time left: 45 s\n", - "Current iteration: 000012 | Average Time per Iteration: 0.697 s | Estimated time left: 57 s\n", - "Current iteration: 000014 | Average Time per Iteration: 0.681 s | Estimated time left: 55 s\n", - "Current iteration: 000013 | Average Time per Iteration: 0.649 s | Estimated time left: 51 s\n", - "Current iteration: 000016 | Average Time per Iteration: 0.643 s | Estimated time left: 50 s\n", - "Current iteration: 000015 | Average Time per Iteration: 0.627 s | Estimated time left: 48 s\n", - "Current iteration: 000017 | Average Time per Iteration: 0.610 s | Estimated time left: 46 s\n", - "Current iteration: 000018 | Average Time per Iteration: 0.691 s | Estimated time left: 52 s\n", - "Current iteration: 000019 | Average Time per Iteration: 0.671 s | Estimated time left: 50 s\n", - "Current iteration: 000021 | Average Time per Iteration: 0.650 s | Estimated time left: 48 s\n", - "Current iteration: 000020 | Average Time per Iteration: 0.629 s | Estimated time left: 45 s\n", - "Current iteration: 000023 | Average Time per Iteration: 0.636 s | Estimated time left: 45 s\n", - "Current iteration: 000022 | Average Time per Iteration: 0.621 s | Estimated time left: 44 s\n", - "Current iteration: 000024 | Average Time per Iteration: 0.652 s | Estimated time left: 45 s\n", - "Current iteration: 000025 | Average Time per Iteration: 0.652 s | Estimated time left: 45 s\n", - "Current iteration: 000026 | Average Time per Iteration: 0.637 s | Estimated time left: 43 s\n", - "Current iteration: 000027 | Average Time per Iteration: 0.621 s | Estimated time left: 41 s\n", - "Current iteration: 000028 | Average Time per Iteration: 0.631 s | Estimated time left: 41 s\n", - "Current iteration: 000029 | Average Time per Iteration: 0.617 s | Estimated time left: 40 s\n", - "Current iteration: 000030 | Average Time per Iteration: 0.661 s | Estimated time left: 42 s\n", - "Current iteration: 000031 | Average Time per Iteration: 0.647 s | Estimated time left: 40 s\n", - "Current iteration: 000032 | Average Time per Iteration: 0.644 s | Estimated time left: 39 s\n", - "Current iteration: 000033 | Average Time per Iteration: 0.629 s | Estimated time left: 38 s\n", - "Current iteration: 000034 | Average Time per Iteration: 0.628 s | Estimated time left: 37 s\n", - "Current iteration: 000035 | Average Time per Iteration: 0.624 s | Estimated time left: 36 s\n", - "Current iteration: 000039 | Average Time per Iteration: 0.682 s | Estimated time left: 39 s\n", - "Current iteration: 000037 | Average Time per Iteration: 0.670 s | Estimated time left: 38 s\n", - "Current iteration: 000036 | Average Time per Iteration: 0.656 s | Estimated time left: 36 s\n", - "Current iteration: 000038 | Average Time per Iteration: 0.642 s | Estimated time left: 35 s\n", - "Current iteration: 000040 | Average Time per Iteration: 0.642 s | Estimated time left: 34 s\n", - "Current iteration: 000041 | Average Time per Iteration: 0.643 s | Estimated time left: 34 s\n", - "Current iteration: 000045 | Average Time per Iteration: 0.703 s | Estimated time left: 36 s\n", - "Current iteration: 000044 | Average Time per Iteration: 0.692 s | Estimated time left: 35 s\n", - "Current iteration: 000042 | Average Time per Iteration: 0.680 s | Estimated time left: 34 s\n", - "Current iteration: 000043 | Average Time per Iteration: 0.670 s | Estimated time left: 32 s\n", - "Current iteration: 000046 | Average Time per Iteration: 0.664 s | Estimated time left: 31 s\n", - "Current iteration: 000047 | Average Time per Iteration: 0.653 s | Estimated time left: 30 s\n", - "Current iteration: 000048 | Average Time per Iteration: 0.706 s | Estimated time left: 32 s\n", - "Current iteration: 000049 | Average Time per Iteration: 0.697 s | Estimated time left: 31 s\n", - "Current iteration: 000050 | Average Time per Iteration: 0.689 s | Estimated time left: 30 s\n", - "Current iteration: 000052 | Average Time per Iteration: 0.690 s | Estimated time left: 30 s\n", - "Current iteration: 000051 | Average Time per Iteration: 0.668 s | Estimated time left: 28 s\n", - "Current iteration: 000053 | Average Time per Iteration: 0.661 s | Estimated time left: 27 s\n", - "Current iteration: 000054 | Average Time per Iteration: 0.711 s | Estimated time left: 28 s\n", - "Current iteration: 000055 | Average Time per Iteration: 0.712 s | Estimated time left: 27 s\n", - "Current iteration: 000057 | Average Time per Iteration: 0.705 s | Estimated time left: 26 s\n", - "Current iteration: 000058 | Average Time per Iteration: 0.699 s | Estimated time left: 25 s\n", - "Current iteration: 000056 | Average Time per Iteration: 0.694 s | Estimated time left: 24 s\n", - "Current iteration: 000059 | Average Time per Iteration: 0.689 s | Estimated time left: 24 s\n", - "Current iteration: 000060 | Average Time per Iteration: 0.723 s | Estimated time left: 24 s\n", - "Current iteration: 000063 | Average Time per Iteration: 0.732 s | Estimated time left: 24 s\n", - "Current iteration: 000061 | Average Time per Iteration: 0.722 s | Estimated time left: 23 s\n", - "Current iteration: 000062 | Average Time per Iteration: 0.715 s | Estimated time left: 22 s\n", - "Current iteration: 000064 | Average Time per Iteration: 0.718 s | Estimated time left: 21 s\n", - "Current iteration: 000065 | Average Time per Iteration: 0.708 s | Estimated time left: 20 s\n", - "Current iteration: 000066 | Average Time per Iteration: 0.711 s | Estimated time left: 19 s\n", - "Current iteration: 000068 | Average Time per Iteration: 0.723 s | Estimated time left: 19 s\n", - "Current iteration: 000067 | Average Time per Iteration: 0.723 s | Estimated time left: 18 s\n", - "Current iteration: 000069 | Average Time per Iteration: 0.716 s | Estimated time left: 17 s\n", - "Current iteration: 000071 | Average Time per Iteration: 0.708 s | Estimated time left: 16 s\n", - "Current iteration: 000070 | Average Time per Iteration: 0.707 s | Estimated time left: 16 s\n", - "Current iteration: 000072 | Average Time per Iteration: 0.702 s | Estimated time left: 15 s\n", - "Current iteration: 000073 | Average Time per Iteration: 0.718 s | Estimated time left: 15 s\n", - "Current iteration: 000076 | Average Time per Iteration: 0.720 s | Estimated time left: 14 s\n", - "Current iteration: 000075 | Average Time per Iteration: 0.715 s | Estimated time left: 13 s\n", - "Current iteration: 000074 | Average Time per Iteration: 0.707 s | Estimated time left: 12 s\n", - "Current iteration: 000077 | Average Time per Iteration: 0.701 s | Estimated time left: 11 s\n", - "Current iteration: 000078 | Average Time per Iteration: 0.713 s | Estimated time left: 11 s\n", - "Current iteration: 000079 | Average Time per Iteration: 0.731 s | Estimated time left: 10 s\n", - "Current iteration: 000080 | Average Time per Iteration: 0.726 s | Estimated time left: 10 s\n", - "Current iteration: 000081 | Average Time per Iteration: 0.724 s | Estimated time left: 9 s \n", - "Current iteration: 000082 | Average Time per Iteration: 0.716 s | Estimated time left: 8 s \n", - "Current iteration: 000083 | Average Time per Iteration: 0.715 s | Estimated time left: 7 s \n", - "Current iteration: 000084 | Average Time per Iteration: 0.723 s | Estimated time left: 7 s \n", - "Current iteration: 000085 | Average Time per Iteration: 0.741 s | Estimated time left: 6 s \n", - "Current iteration: 000086 | Average Time per Iteration: 0.736 s | Estimated time left: 5 s \n", - "Current iteration: 000088 | Average Time per Iteration: 0.735 s | Estimated time left: 5 s \n", - "Current iteration: 000087 | Average Time per Iteration: 0.729 s | Estimated time left: 4 s \n", - "Current iteration: 000090 | Average Time per Iteration: 0.723 s | Estimated time left: 3 s \n", - "Current iteration: 000089 | Average Time per Iteration: 0.723 s | Estimated time left: 2 s \n", - "Current iteration: 000091 | Average Time per Iteration: 0.724 s | Estimated time left: 2 s \n", - "Current iteration: 000092 | Average Time per Iteration: 0.724 s | Estimated time left: 1 s \n", - "Current iteration: 000093 | Average Time per Iteration: 0.723 s | Estimated time left: 0 s \n", - "Current iteration: 000094 | Average Time per Iteration: 0.722 s | Estimated time left: 0 s \n", - "Worker stopped.\n", - "Current iteration: 000096 | Average Time per Iteration: 0.731 s | Estimated time left: 0 s \n", - "Worker stopped.\n", - "Current iteration: 000095 | Average Time per Iteration: 0.739 s | Estimated time left: 0 s \n", - "Worker stopped.\n", - "Current iteration: 000097 | Average Time per Iteration: 0.744 s | Estimated time left: 0 s \n", - "Worker stopped.\n", - "Current iteration: 000098 | Average Time per Iteration: 0.747 s | Estimated time left: 0 s \n", - "Worker stopped.\n", - "Current iteration: 000099 | Average Time per Iteration: 0.754 s | Estimated time left: 0 s \n", - "Worker stopped.\n", - "Joining writer workers.\n", - "--------------------------------------------------------------------------------\n", - "\n", - "All workers joined, simulation complete.\n", - "In total, 100 simulations were performed.\n", - "Simulation took 75.49 seconds to run.\n", + "Completed 10 iterations. Total wall time: 7.4 s \n", "Results saved to /home/phmb/github/RocketPy/docs/notebooks/monte_carlo_analysis/monte_carlo_analysis_outputs/monte_carlo_class_example.outputs.txt\n" ] } ], "source": [ "test_dispersion.simulate(\n", - " number_of_simulations=100,\n", + " number_of_simulations=10,\n", " append=False,\n", " parallel=True,\n", " n_workers=None,\n", @@ -971,20 +858,9 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "A total of 100 simulations results were loaded from the following output file: monte_carlo_analysis_outputs/monte_carlo_class_example.outputs.txt\n", - "\n", - "The following input file was imported: monte_carlo_analysis_outputs/monte_carlo_class_example.inputs.txt\n", - "The following error file was imported: monte_carlo_analysis_outputs/monte_carlo_class_example.errors.txt\n" - ] - } - ], + "outputs": [], "source": [ "# You only need to import results if you did not run the simulations\n", "test_dispersion.import_results()" @@ -992,58 +868,18 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "100" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "test_dispersion.num_of_loaded_sims" ] }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Monte Carlo Simulation by RocketPy\n", - "Data Source: monte_carlo_analysis_outputs/monte_carlo_class_example\n", - "Number of simulations: 100\n", - "Results: \n", - "\n", - " Parameter Mean Std. Dev.\n", - "------------------------------------------------------------\n", - " out_of_rail_velocity 26.043 2.053\n", - " frontal_surface_wind 0.000 0.000\n", - " y_impact 410.468 61.706\n", - " impact_velocity -5.275 0.060\n", - " max_mach_number 0.872 0.124\n", - " apogee_time 25.665 1.856\n", - " apogee_y 351.443 55.161\n", - " lateral_surface_wind 0.000 0.000\n", - " apogee 3442.128 587.869\n", - " apogee_x 472.614 84.688\n", - " out_of_rail_time 0.356 0.023\n", - "out_of_rail_stability_margin 2.682 0.058\n", - " initial_stability_margin 2.621 0.058\n", - " t_final 309.069 30.988\n", - " x_impact 551.631 94.169\n" - ] - } - ], + "outputs": [], "source": [ "test_dispersion.prints.all()" ] @@ -1084,7 +920,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ diff --git a/rocketpy/simulation/monte_carlo.py b/rocketpy/simulation/monte_carlo.py index 2499e6c0e..b5bc4dde4 100644 --- a/rocketpy/simulation/monte_carlo.py +++ b/rocketpy/simulation/monte_carlo.py @@ -13,10 +13,9 @@ latest documentation. """ -import ctypes import json import os -import pickle +import queue import warnings from copy import deepcopy from pathlib import Path @@ -30,11 +29,6 @@ from rocketpy.plots.monte_carlo_plots import _MonteCarloPlots from rocketpy.prints.monte_carlo_prints import _MonteCarloPrints from rocketpy.simulation.flight import Flight -from rocketpy.stochastic import ( - StochasticEnvironment, - StochasticFlight, - StochasticRocket, -) from rocketpy.tools import ( generate_monte_carlo_ellipses, generate_monte_carlo_ellipses_coordinates, @@ -91,6 +85,8 @@ class MonteCarlo: spent waiting for I/O operations or other processes to complete. """ + _last_print_len = 0 # used to print on the same line + def __init__( self, filename, @@ -152,8 +148,6 @@ def __init__( self.processed_results = {} self.prints = _MonteCarloPrints(self) self.plots = _MonteCarloPlots(self) - self._inputs_dict = {} - self._last_print_len = 0 # used to print on the same line self.export_sample_time = export_sample_time if batch_path is None: @@ -223,14 +217,11 @@ def simulate( overwritten. Make sure to save the files with the results before running the simulation again with `append=False`. """ - # initialize counters self.number_of_simulations = number_of_simulations - self.__iteration_count = self.num_of_loaded_sims if append else 0 - self.__start_time = time() - self.__start_cpu_time = process_time() + self._initial_sim_idx = self.num_of_loaded_sims if append else 0 # Begin display - print("Starting Monte Carlo analysis", end="\r") + MonteCarlo._reprint("Starting Monte Carlo analysis", end="\r") # Setup files self.__setup_files(append) @@ -273,7 +264,7 @@ def __setup_files(self, append): ) except OSError as error: - raise OSError(f"Error creating files: {error}") + raise OSError(f"Error creating files: {error}") from error def __run_in_serial(self): """ @@ -288,43 +279,52 @@ def __run_in_serial(self): ------- None """ - input_file = open(self._input_file, 'a', encoding="utf-8") - output_file = open(self._output_file, 'a', encoding="utf-8") - error_file = open(self._error_file, 'a', encoding="utf-8") - + sim_monitor = SimMonitor( + initial_count=self._initial_sim_idx, + n_simulations=self.number_of_simulations, + start_time=time(), + ) try: - while self.__iteration_count < self.number_of_simulations: - self.__run_single_simulation( - self.__iteration_count + self.num_of_loaded_sims, - input_file, - output_file, + while sim_monitor.keep_simulating(): + sim_monitor.increment() + + inputs_dict, outputs_dict = MonteCarlo.__run_single_simulation( + sim_monitor.count, + self.environment, + self.rocket, + self.flight, + self.export_list, + self.export_sample_time, + ) + + MonteCarlo.__export_flight_data( + inputs_dict, + outputs_dict, + self._input_file, + self._output_file, ) - print( - f"Completed {self.__iteration_count} iterations. Total CPU time: " - f"{process_time() - self.__start_cpu_time:.1f} s. Total wall time: " - f"{time() - self.__start_time:.1f} s\n" - ) + + sim_monitor.update_status(sim_monitor.count, end="\r", flush=True) + + sim_monitor.finalize_status() except KeyboardInterrupt: print("Keyboard Interrupt, files saved.") - error_file.write(json.dumps(self._inputs_dict, cls=RocketPyEncoder) + "\n") + with open(self._error_file, "a", encoding="utf-8") as file: + file.write(json.dumps(inputs_dict, cls=RocketPyEncoder) + "\n") except Exception as error: - print(f"Error on iteration {self.__iteration_count}: {error}") - error_file.write(json.dumps(self._inputs_dict, cls=RocketPyEncoder) + "\n") + print(f"Error on iteration {self.__sim_monitor.count}: {error}") + with open(self._error_file, "a", encoding="utf-8") as file: + file.write(json.dumps(inputs_dict, cls=RocketPyEncoder) + "\n") raise error - finally: - self.__close_files(input_file, output_file, error_file) - def __run_in_parallel(self, n_workers=None): """ Runs the monte carlo simulation in parallel. Parameters ---------- - start_index : int - The index of the first simulation to be run. n_workers: int, optional Number of workers to be used. If None, the number of workers will be equal to the number of CPUs available. Default is None. @@ -333,677 +333,182 @@ def __run_in_parallel(self, n_workers=None): ------- None """ - parallel_start_time = time() - processes = [] - - if ( - n_workers is None or n_workers > os.cpu_count() - ): # leave 2 cores for the writer workers + if n_workers is None or n_workers > os.cpu_count(): n_workers = os.cpu_count() if n_workers < 3: raise ValueError("Number of workers must be at least 3 for parallel mode.") - # get the size of the serialized dictionary - inputs_size, results_size = self.__get_export_size() + multiprocess, managers = import_multiprocess() - # add safety margin to the buffer size - inputs_size += 1024 - results_size += 1024 + with create_multiprocess_manager(multiprocess, managers) as manager: + export_queue = manager.Queue() + mutex = manager.Lock() + consumer_stop_event = manager.Event() - # calculate the number of simulations that can be stored in memory - n_sim_memory = max(n_workers - 2, 2) # at least a double buffer - - multiprocess, shared_memory, managers = import_multiprocess() - - # initialize shared memory buffer - shared_inputs_buffer = shared_memory.SharedMemory( - create=True, size=inputs_size * n_sim_memory, name="shared_inputs" - ) - shared_results_buffer = shared_memory.SharedMemory( - create=True, size=results_size * n_sim_memory, name="shared_results" - ) - - try: - with create_multiprocess_manager(multiprocess, managers) as manager: - # initialize queue - errors_lock = manager.Lock() - - # initialize semaphores to control the shared memory buffer - # input file semaphores - go_write_inputs = [ - manager.Semaphore(value=1) for _ in range(n_sim_memory) - ] - go_read_inputs = [ - manager.Semaphore(value=1) for _ in range(n_sim_memory) - ] - - # output file semaphores - go_write_results = [ - manager.Semaphore(value=1) for _ in range(n_sim_memory) - ] - go_read_results = [ - manager.Semaphore(value=1) for _ in range(n_sim_memory) - ] - - # acquire all read semaphores to make sure the readers will wait for data - for sem in go_read_inputs: - sem.acquire() - - for sem in go_read_results: - sem.acquire() - - # Initialize simulation counter - sim_counter = manager.SimCounter( - self.num_of_loaded_sims, - self.number_of_simulations, - parallel_start_time, - ) - - print("\nStarting monte carlo analysis", end="\r") - print(f"Number of simulations: {self.number_of_simulations}") - - # Creates n_workers processes then starts them - for _ in range(n_workers - 2): # leave 2 cores for the writer workers - p = multiprocess.Process( - target=self.__run_simulation_worker, - args=( - shared_memory, - self.error_file, - self.export_list, - self.environment, - self.rocket, - self.flight, - sim_counter, - errors_lock, - go_write_inputs, - go_write_results, - go_read_inputs, - go_read_results, - shared_inputs_buffer.name, - shared_results_buffer.name, - inputs_size, - results_size, - n_sim_memory, - self.export_sample_time, - ), - ) - processes.append(p) - - # Starts all the processes - for p in processes: - p.start() + sim_monitor = manager.SimMonitor( + initial_count=self._initial_sim_idx, + n_simulations=self.number_of_simulations, + start_time=time(), + ) - # create writer workers - input_writer_stop_event = manager.Event() - results_writer_stop_event = manager.Event() + processes = [] + seeds = np.random.SeedSequence().spawn(n_workers - 1) - input_writer = multiprocess.Process( - target=self._write_data_worker, + for seed in seeds: + sim_producer = multiprocess.Process( + target=self.__sim_producer, args=( - shared_memory, - self.input_file, - go_write_inputs, - go_read_inputs, - shared_inputs_buffer.name, - inputs_size, - input_writer_stop_event, - n_sim_memory, + self.environment, + self.rocket, + self.flight, + sim_monitor, + self.export_list, + self.export_sample_time, + export_queue, + self._error_file, + mutex, + seed, ), ) + processes.append(sim_producer) + + for sim_producer in processes: + sim_producer.start() + + sim_consumer = multiprocess.Process( + target=self.__sim_consumer, + args=( + export_queue, + self._input_file, + self._output_file, + mutex, + consumer_stop_event, + ), + ) - results_writer = multiprocess.Process( - target=self._write_data_worker, - args=( - shared_memory, - self.output_file, - go_write_results, - go_read_results, - shared_results_buffer.name, - results_size, - results_writer_stop_event, - n_sim_memory, - ), - ) - - # start the writer workers - input_writer.start() - results_writer.start() - - # Joins all the processes - for p in processes: - p.join() - - print("Joining writer workers.") - # stop the writer workers - input_writer_stop_event.set() - results_writer_stop_event.set() + sim_consumer.start() - input_writer.join() - results_writer.join() + for sim_producer in processes: + sim_producer.join() - self.number_of_simulations = sim_counter.get_count() + consumer_stop_event.set() - parallel_end = time() + sim_consumer.join() - print("-" * 80 + "\n") - print("All workers joined, simulation complete.") - print( - f"In total, {sim_counter.get_count() - self.num_of_loaded_sims} simulations were performed." - ) - print( - f"Simulation took {(parallel_end - parallel_start_time):.2f} seconds to run." - ) - - finally: - # ensure shared memory is released - shared_inputs_buffer.close() - shared_results_buffer.close() - shared_inputs_buffer.unlink() - shared_results_buffer.unlink() + sim_monitor.finalize_status() @staticmethod - def __run_simulation_worker( - shared_memory, - error_file, - export_list, + def __sim_producer( sto_env, sto_rocket, sto_flight, - sim_counter, - errors_lock, - go_write_inputs, - go_write_results, - go_read_inputs, - go_read_results, - shared_inputs_name, - shared_results_name, - inputs_size, - results_size, - n_sim_memory, + sim_monitor, + export_list, export_sample_time, + export_queue, + error_file, + mutex, + seed, ): - """ - Runs a single simulation worker. - - Parameters - ---------- - shared_memory : module - Shared memory handler of multiprocess module. - error_file : Path - Path of the error file. - export_list : list - List of variables to export - sto_env : StochasticEnvironment - Stochastic environment object. - sto_rocket : StochasticRocket - Stochastic rocket object. - sto_flight : StochasticFlight - Stochastic flight object. - sim_counter : SimCounter - Simulation counter object. - errors_lock : Lock - Lock to write errors to the error file. - go_write_inputs : list - List of semaphores to write the inputs. - go_write_results : list - List of semaphores to write the results. - go_read_inputs : list - List of semaphores to read the inputs. - go_read_results : list - List of semaphores to read the results. - shared_inputs_name : str - Name of the shared memory buffer for the inputs. - shared_results_name : str - Name of the shared memory buffer for the results. - inputs_size : int - Size of the inputs to be written. - results_size : int - Size of the results to be written. - n_sim_memory : int - Number of simulations that can be stored in memory. - - Returns - ------- - None - """ - # open shared memory buffers - shm_inputs = shared_memory.SharedMemory(shared_inputs_name) - shm_results = shared_memory.SharedMemory(shared_results_name) - - shared_inputs_buffer = np.ndarray( - (n_sim_memory, inputs_size), dtype=ctypes.c_ubyte, buffer=shm_inputs.buf - ) - shared_results_buffer = np.ndarray( - (n_sim_memory, results_size), dtype=ctypes.c_ubyte, buffer=shm_results.buf - ) - try: - while True: - sim_idx = sim_counter.increment() - if sim_idx == -1: - break - - monte_carlo_flight = Flight( - rocket=sto_rocket.create_object(), - environment=sto_env.create_object(), - rail_length=sto_flight._randomize_rail_length(), - inclination=sto_flight._randomize_inclination(), - heading=sto_flight._randomize_heading(), - initial_solution=sto_flight.initial_solution, - terminate_on_apogee=sto_flight.terminate_on_apogee, - ) - - # Export to file - inputs_dict = dict( - item - for d in [ - sto_env.last_rnd_dict, - sto_rocket.last_rnd_dict, - sto_flight.last_rnd_dict, - ] - for item in d.items() - ) - - inputs_dict["idx"] = sim_idx - inputs_dict = MonteCarlo.prepare_export_data( - inputs_dict, export_sample_time, remove_functions=True - ) - - # Construct the dict with the results from the flight - results = { - export_item: getattr(monte_carlo_flight, export_item) - for export_item in export_list - } - - export_inputs = json.dumps(inputs_dict, cls=RocketPyEncoder) - export_outputs = json.dumps(results, cls=RocketPyEncoder) - - # convert to bytes - export_inputs_bytes = pickle.dumps(export_inputs) - export_outputs_bytes = pickle.dumps(export_outputs) - - if len(export_inputs_bytes) > inputs_size: - raise ValueError( - "Input data is too large to fit in the shared memory buffer." - ) + while sim_monitor.keep_simulating(): + sim_idx = sim_monitor.increment() - if len(export_outputs_bytes) > results_size: - raise ValueError( - "Output data is too large to fit in the shared memory buffer." - ) + sto_env._set_stochastic(seed) + sto_rocket._set_stochastic(seed) + sto_flight._set_stochastic(seed) - # add padding to make sure the byte stream fits in the allocated space - export_inputs_bytes = export_inputs_bytes.ljust(inputs_size, b'\0') - export_outputs_bytes = export_outputs_bytes.ljust(results_size, b'\0') - - # write to shared memory - MonteCarlo.__export_simulation_data( - go_write_inputs, - go_read_inputs, - shared_inputs_buffer, - export_inputs_bytes, + inputs_dict, outputs_dict = MonteCarlo.__run_single_simulation( + sim_idx, + sto_env, + sto_rocket, + sto_flight, + export_list, + export_sample_time, ) - # write data to the shared buffer - MonteCarlo.__export_simulation_data( - go_write_results, - go_read_results, - shared_results_buffer, - export_outputs_bytes, - ) + export_queue.put((inputs_dict, outputs_dict)) - # update user on progress - sim_counter.reprint( - sim_idx, - end="\n", - flush=False, - ) + sim_monitor.update_status(sim_idx, end="\r", flush=True) except Exception as error: - print(f"Error on iteration {sim_idx}: {error}") + mutex.acquire() + with open(error_file, "a", encoding="utf-8") as file: + file.write(json.dumps(inputs_dict, cls=RocketPyEncoder) + "\n") - # write error to file - errors_lock.acquire() - with open(error_file, "a", encoding="utf-8") as error_file: - error_file.write(json.dumps(inputs_dict, cls=RocketPyEncoder) + "\n") - errors_lock.release() + print(f"Error on iteration {sim_idx}: {error}") + mutex.release() raise error - finally: - print("Worker stopped.") - - def __run_single_simulation(self, sim_idx, input_file, output_file): - """ - Runs a single simulation and saves the inputs and outputs to the - respective files. - - Parameters - ---------- - sim_idx : int - Index of the simulation. - input_file : str - The file object to write the inputs. - output_file : str - The file object to write the outputs. - - Returns - ------- - None - """ - self.__iteration_count += 1 - - monte_carlo_flight = Flight( - rocket=self.rocket.create_object(), - environment=self.environment.create_object(), - rail_length=self.flight._randomize_rail_length(), - inclination=self.flight._randomize_inclination(), - heading=self.flight._randomize_heading(), - initial_solution=self.flight.initial_solution, - terminate_on_apogee=self.flight.terminate_on_apogee, - ) - - inputs_dict = dict( - item - for d in [ - self.environment.last_rnd_dict, - self.rocket.last_rnd_dict, - self.flight.last_rnd_dict, - ] - for item in d.items() - ) - inputs_dict["idx"] = sim_idx - - inputs_dict = MonteCarlo.prepare_export_data( - inputs_dict, self.export_sample_time, remove_functions=True - ) - - self._inputs_dict = inputs_dict - - # Export inputs and outputs to file - self.__export_flight_data( - flight=monte_carlo_flight, - inputs_dict=self._inputs_dict, - input_file=input_file, - output_file=output_file, - ) - - average_time = (process_time() - self.__start_cpu_time) / self.__iteration_count - estimated_time = int( - (self.number_of_simulations - self.__iteration_count) * average_time - ) - self.__reprint( - f"Current iteration: {self.__iteration_count:06d} | " - f"Average Time per Iteration: {average_time:.3f} s | " - f"Estimated time left: {estimated_time} s", - end="\r", - flush=True, - ) - - @staticmethod - def __export_simulation_data(go_write, go_read, shared_buffer, export_bytes): - """ - Export the simulation data to the shared memory buffer. This function - will loop through the shared memory buffer to find an empty slot, write - the data to the shared buffer, and signal the input reader that the data - is ready. - - Parameters - ---------- - go_write : list - List of semaphores to write the data. - go_read : list - List of semaphores to read the data. - shared_buffer : np.ndarray - Shared memory buffer with the data. - export_bytes : bytes - Data to be written to the shared buffer. - - Returns - ------- - bool - True if the data was saved. An error will be raised otherwise. - """ - i = 0 - found_slot = False - - # loop through the shared memory buffer to find an empty slot - while not found_slot: - if i >= len(go_write): - i = 0 - - # try to acquire the semaphore, skip if it is already acquired - if go_write[i].acquire(timeout=1e-3): - # write data to the shared buffer - shared_buffer[i] = np.frombuffer(export_bytes, dtype=ctypes.c_ubyte) - - # signal the input reader that the data is ready - go_read[i].release() - found_slot = True - else: - i += 1 - - return True - @staticmethod - def __loop_though_buffer( - file, - shared_buffer, - go_read_semaphores, - go_write_semaphores, - ): - """ - Loop through the shared buffer, writing the data to the file. - - Parameters - ---------- - file : TextIOWrapper - File object to write the data. - shared_buffer : np.ndarray - Shared memory buffer with the data. - go_read_semaphores : list - List of semaphores to read the data. - go_write_semaphores : list - List of semaphores to write the data. - - Returns - ------- - None - """ - # loop through all the semaphores - for i, sem in enumerate(go_read_semaphores): - # try to acquire the semaphore, skip if it is already acquired - if sem.acquire(timeout=1e-3): - # retrieve the data from the shared buffer - data = shared_buffer[i] - data_deserialized = pickle.loads(bytes(data)) - - # write data to the file - file.write(data_deserialized + "\n") - - # release the write semaphore // tell worker it can write again - go_write_semaphores[i].release() - - @staticmethod - def _write_data_worker( - shared_memory, - file_path, - go_write_semaphores, - go_read_semaphores, - shared_name, - data_size, + def __sim_consumer( + export_queue, + inputs_file, + outputs_file, + mutex, stop_event, - n_sim_memory, ): - """ - Worker function to write data to the file. - - Parameters - ---------- - shared_memory : module - Shared memory handler of multiprocess module. - file_path : str - Path to the file to write the data. - go_write_semaphores : list - List of semaphores to write the data. - go_read_semaphores : list - List of semaphores to read the data. - shared_name : str - Name of the shared memory buffer. - data_size : int - Size of the data to be written. - stop_event : Event - Event to stop the worker. - n_sim_memory : int - Number of simulations that can be stored in memory. - """ - shm = shared_memory.SharedMemory(shared_name) - shared_buffer = np.ndarray( - (n_sim_memory, data_size), dtype=ctypes.c_ubyte, buffer=shm.buf - ) - with open(file_path, "a", encoding="utf-8") as file: - while not stop_event.is_set(): - MonteCarlo.__loop_though_buffer( - file, - shared_buffer, - go_read_semaphores, - go_write_semaphores, + trials = 0 + while not stop_event.is_set(): + try: + mutex.acquire() + inputs_dict, outputs_dict = export_queue.get(timeout=0.5) + + MonteCarlo.__export_flight_data( + inputs_dict, + outputs_dict, + inputs_file, + outputs_file, ) - # loop through the remaining data - MonteCarlo.__loop_though_buffer( - file, - shared_buffer, - go_read_semaphores, - go_write_semaphores, - ) - - @staticmethod - def __downsample_recursive(data_dict, max_time, sample_time): - """ - Given a dictionary, this function will downsample all arrays in the - dictionary to the sample_time, filling the arrays up to the max_time. - The function is recursive, so it will go through all the nested - dictionaries. - - Parameters - ---------- - data_dict : dict - Dictionary to be downsampled. - max_time : float - Maximum time to fill the arrays. - sample_time : float - Sample time to downsample the arrays. - - Returns - ------- - dict - Downsampled dictionary. - """ - # calculate the new size of the arrays - new_size = int(max_time / sample_time) + 1 - - # downsample the arrays - for key, value in data_dict.items(): - if isinstance(value, dict): - data_dict[key] = MonteCarlo.__downsample_recursive( - value, max_time, sample_time - ) - elif isinstance(value, np.ndarray): - if len(value.shape) > 1: - new_array = np.zeros((new_size, value.shape[1]), dtype=value.dtype) - else: - new_array = np.zeros((new_size, 1), dtype=value.dtype) + except queue.Empty as exc: + trials += 1 - data_dict[key] = new_array - else: - data_dict[key] = value + if trials > 20: + raise TimeoutError( + "No simulations were received for 10 seconds." + ) from exc - return data_dict + finally: + mutex.release() - def __get_export_size(self): - """ - This function runs a simulation, fills all exported arrays up to the max - time, serializes the dictionary, and returns the size of the serialized - dictionary. The purpose is to estimate the size of the exported data. - """ - # Run trajectory simulation + @staticmethod + def __run_single_simulation( + sim_idx, sto_env, sto_rocket, sto_flight, export_list, export_sample_time + ): monte_carlo_flight = Flight( - rocket=self.rocket.create_object(), - environment=self.environment.create_object(), - rail_length=self.flight._randomize_rail_length(), - inclination=self.flight._randomize_inclination(), - heading=self.flight._randomize_heading(), - initial_solution=self.flight.initial_solution, - terminate_on_apogee=self.flight.terminate_on_apogee, + rocket=sto_rocket.create_object(), + environment=sto_env.create_object(), + rail_length=sto_flight._randomize_rail_length(), + inclination=sto_flight._randomize_inclination(), + heading=sto_flight._randomize_heading(), + initial_solution=sto_flight.initial_solution, + terminate_on_apogee=sto_flight.terminate_on_apogee, ) - if monte_carlo_flight.max_time is None or monte_carlo_flight.max_time <= 0: - raise ValueError( - "The max_time attribute must be greater than zero. To use parallel mode." - ) - - # Export inputs and outputs to file - export_inputs = dict( + inputs_dict = dict( item for d in [ - self.environment.last_rnd_dict, - self.rocket.last_rnd_dict, - self.flight.last_rnd_dict, + sto_env.last_rnd_dict, + sto_rocket.last_rnd_dict, + sto_flight.last_rnd_dict, ] for item in d.items() ) - export_inputs["idx"] = -1 - - export_inputs = self.prepare_export_data( - export_inputs, self.export_sample_time, remove_functions=True - ) + inputs_dict["idx"] = sim_idx - export_inputs = self.__downsample_recursive( - data_dict=export_inputs, - max_time=monte_carlo_flight.max_time, - sample_time=self.export_sample_time, + inputs_dict = MonteCarlo.prepare_export_data( + inputs_dict, export_sample_time, remove_functions=True ) - results = { + outputs_dict = { export_item: getattr(monte_carlo_flight, export_item) - for export_item in self.export_list + for export_item in export_list } - export_inputs_bytes = json.dumps(export_inputs, cls=RocketPyEncoder) - results_bytes = json.dumps(results, cls=RocketPyEncoder) - - # serialize the dictionary - export_inputs_bytes = pickle.dumps(export_inputs) - results_bytes = pickle.dumps(results) - - # get the size of the serialized dictionary - export_inputs_size = len(export_inputs_bytes) - results_size = len(results_bytes) - - return export_inputs_size, results_size - - def __close_files(self, input_file, output_file, error_file): - """ - Closes all the files. - - Parameters - ---------- - input_file : str - The file object to write the inputs. - output_file : str - The file object to write the outputs. - error_file : str - The file object to write the errors. - - Returns - ------- - None - """ - input_file.close() - output_file.close() - error_file.close() + return inputs_dict, outputs_dict def __terminate_simulation(self): """ @@ -1020,38 +525,35 @@ def __terminate_simulation(self): print(f"Results saved to {self._output_file}") + @staticmethod def __export_flight_data( - self, - flight, inputs_dict, - input_file, - output_file, + outputs_dict, + inputs_file, + outputs_file, ): """ Exports the flight data to the respective files. Parameters ---------- - flight : Flight - The Flight object containing the flight data. inputs_dict : dict - Dictionary containing the inputs used in the simulation. - input_file : str + Dictionary with the inputs of the simulation. + outputs_dict : dict + Dictionary with the outputs of the simulation. + inputs_file : str The file object to write the inputs. - output_file : str + outputs_file : str The file object to write the outputs. Returns ------- None """ - results = { - export_item: getattr(flight, export_item) - for export_item in self.export_list - } - - input_file.write(json.dumps(inputs_dict, cls=RocketPyEncoder) + "\n") - output_file.write(json.dumps(results, cls=RocketPyEncoder) + "\n") + with open(inputs_file, "a", encoding="utf-8") as file: + file.write(json.dumps(inputs_dict, cls=RocketPyEncoder) + "\n") + with open(outputs_file, "a", encoding="utf-8") as file: + file.write(json.dumps(outputs_dict, cls=RocketPyEncoder) + "\n") def __check_export_list(self, export_list): """ @@ -1157,7 +659,8 @@ def __check_export_list(self, export_list): return export_list - def __reprint(self, msg, end="\n", flush=False): + @staticmethod + def _reprint(msg, end="\n", flush=False): """ Prints a message on the same line as the previous one and replaces the previous message with the new one, deleting the extra characters from @@ -1177,10 +680,10 @@ def __reprint(self, msg, end="\n", flush=False): None """ len_msg = len(msg) - if len_msg < self._last_print_len: - msg += " " * (self._last_print_len - len_msg) + if len_msg < MonteCarlo._last_print_len: + msg += " " * (MonteCarlo._last_print_len - len_msg) else: - self._last_print_len = len_msg + MonteCarlo._last_print_len = len_msg print(msg, end=end, flush=flush) @@ -1691,10 +1194,9 @@ def import_multiprocess(): Tuple containing the imported modules. """ multiprocess = import_optional_dependency("multiprocess") - shared_memory = import_optional_dependency("multiprocess.shared_memory") managers = import_optional_dependency("multiprocess.managers") - return multiprocess, shared_memory, managers + return multiprocess, managers def create_multiprocess_manager(multiprocess, managers): @@ -1718,44 +1220,28 @@ class MonteCarloManager(managers.BaseManager): def __init__(self): super().__init__() self.register('Lock', multiprocess.Lock) + self.register('Queue', multiprocess.Queue) self.register('Event', multiprocess.Event) - self.register('Semaphore', multiprocess.Semaphore) - self.register('SimCounter', SimCounter) - self.register('StochasticEnvironment', StochasticEnvironment) - self.register('StochasticRocket', StochasticRocket) - self.register('StochasticFlight', StochasticFlight) + self.register('SimMonitor', SimMonitor) return MonteCarloManager() -class SimCounter: - def __init__(self, initial_count, n_simulations, parallel_start_time): +class SimMonitor: + def __init__(self, initial_count, n_simulations, start_time): self.initial_count = initial_count self.count = initial_count self.n_simulations = n_simulations - self._last_print_len = 0 # used to print on the same line - self.initial_time = parallel_start_time + self.start_time = start_time - def increment(self): - if self.count >= self.n_simulations: - return -1 + def keep_simulating(self): + return self.count < self.n_simulations + def increment(self): self.count += 1 return self.count - 1 - def set_count(self, count): - self.count = count - - def get_count(self): - return self.count - - def get_n_simulations(self): - return self.n_simulations - - def get_intial_time(self): - return self.initial_time - - def reprint(self, sim_idx, end="\n", flush=False): + def update_status(self, sim_idx, end="\n", flush=False): """Prints a message on the same line as the previous one and replaces the previous message with the new one, deleting the extra characters from the previous message. @@ -1773,7 +1259,7 @@ def reprint(self, sim_idx, end="\n", flush=False): ------- None """ - average_time = (time() - self.initial_time) / (self.count - self.initial_count) + average_time = (time() - self.start_time) / (self.count - self.initial_count) estimated_time = int( (self.n_simulations - (self.count - self.initial_count)) * average_time ) @@ -1782,10 +1268,21 @@ def reprint(self, sim_idx, end="\n", flush=False): msg += f" | Average Time per Iteration: {average_time:.3f} s" msg += f" | Estimated time left: {estimated_time} s" - len_msg = len(msg) - if len_msg < self._last_print_len: - msg += " " * (self._last_print_len - len_msg) - else: - self._last_print_len = len_msg + MonteCarlo._reprint(msg, end=end, flush=flush) - print(msg, end=end, flush=flush) + def finalize_status(self): + """Prints the final status of the simulation. + + Parameters + ---------- + show_process_time : bool, optional + If True, the process time will be shown. Default is True. + + Returns + ------- + None + """ + msg = f"Completed {self.count} iterations." + msg += f" Total wall time: {time() - self.start_time:.1f} s" + + MonteCarlo._reprint(msg, end="\n", flush=False) diff --git a/rocketpy/stochastic/stochastic_model.py b/rocketpy/stochastic/stochastic_model.py index 02341a11d..a96ed294b 100644 --- a/rocketpy/stochastic/stochastic_model.py +++ b/rocketpy/stochastic/stochastic_model.py @@ -40,7 +40,7 @@ class StochasticModel: "ensemble_member", ] - def __init__(self, obj, **kwargs): + def __init__(self, obj, seed=None, **kwargs): """ Initialize the StochasticModel class with validated input arguments. @@ -48,6 +48,9 @@ def __init__(self, obj, **kwargs): ---------- obj : object The main object of the class. + seed : int, optional + Seed for the random number generator. The default is None so that + a new ``numpy.random.Generator`` object is created. **kwargs : dict Dictionary of input arguments for the class. Valid argument types include tuples, lists, ints, floats, or None. Arguments will be @@ -63,9 +66,24 @@ def __init__(self, obj, **kwargs): self.obj = obj self.last_rnd_dict = {} + self.__stochastic_dict = kwargs + self._set_stochastic() + + def _set_stochastic(self, seed=None): + """Set the stochastic attributes from the input dictionary. + This method is useful to reset or reseed the attributes of the instance. + + Parameters + ---------- + seed : int, optional + Seed for the random number generator. + """ + self.__rng_generator = np.random.default_rng(seed) + self.last_rnd_dict = {} # TODO: This code block is too complex. Refactor it. - for input_name, input_value in kwargs.items(): + # TODO: Resetting a instance should not require re-validation. + for input_name, input_value in self.__stochastic_dict.items(): if input_name not in self.exception_list: attr_value = None if input_value is not None: @@ -163,14 +181,18 @@ def _validate_tuple_length_two( # is the standard deviation, and the second item is the distribution # function. In this case, the nominal value will be taken from the # object passed. - dist_func = get_distribution(input_value[1]) + dist_func = get_distribution(input_value[1], self.__rng_generator) return (getattr(self.obj, input_name), input_value[0], dist_func) else: # if second item is an int or float, then it is assumed that the # first item is the nominal value and the second item is the # standard deviation. The distribution function will be set to # "normal". - return (input_value[0], input_value[1], get_distribution("normal")) + return ( + input_value[0], + input_value[1], + get_distribution("normal", self.__rng_generator), + ) def _validate_tuple_length_three( self, input_name, input_value, getattr=getattr @@ -206,7 +228,7 @@ def _validate_tuple_length_three( f"'{input_name}': Third item of tuple must be a string containing the " "name of a valid numpy.random distribution function." ) - dist_func = get_distribution(input_value[2]) + dist_func = get_distribution(input_value[2], self.__rng_generator) return (input_value[0], input_value[1], dist_func) def _validate_list( @@ -265,7 +287,7 @@ def _validate_scalar( return ( getattr(self.obj, input_name), input_value, - get_distribution("normal"), + get_distribution("normal", self.__rng_generator), ) def _validate_factors(self, input_name, input_value): @@ -330,13 +352,17 @@ def _validate_tuple_factor(self, input_name, factor_tuple): ) if len(factor_tuple) == 2: - return (factor_tuple[0], factor_tuple[1], get_distribution("normal")) + return ( + factor_tuple[0], + factor_tuple[1], + get_distribution("normal", self.__rng_generator), + ) elif len(factor_tuple) == 3: assert isinstance(factor_tuple[2], str), ( f"'{input_name}`: Third item of tuple must be a string containing " "the name of a valid numpy.random distribution function" ) - dist_func = get_distribution(factor_tuple[2]) + dist_func = get_distribution(factor_tuple[2], self.__rng_generator) return (factor_tuple[0], factor_tuple[1], dist_func) def _validate_list_factor(self, input_name, factor_list): diff --git a/rocketpy/tools.py b/rocketpy/tools.py index 19445e0ff..ee9436e5a 100644 --- a/rocketpy/tools.py +++ b/rocketpy/tools.py @@ -232,7 +232,7 @@ def bilinear_interpolation(x, y, x1, x2, y1, y2, z11, z12, z21, z22): ) / ((x2 - x1) * (y2 - y1)) -def get_distribution(distribution_function_name): +def get_distribution(distribution_function_name, rng_generator=None): """Sets the distribution function to be used in the monte carlo analysis. Parameters @@ -240,24 +240,31 @@ def get_distribution(distribution_function_name): distribution_function_name : string The type of distribution to be used in the analysis. It can be 'uniform', 'normal', 'lognormal', etc. + rng_generator : np.random.Generator, optional + The random number generator to be used. If None, the default generator + is used. Returns ------- np.random distribution function The distribution function to be used in the analysis. """ + if rng_generator is None: + rng_generator = np.random.default_rng() + + # Dictionary mapping distribution names to RNG methods distributions = { - "normal": np.random.normal, - "binomial": np.random.binomial, - "chisquare": np.random.chisquare, - "exponential": np.random.exponential, - "gamma": np.random.gamma, - "gumbel": np.random.gumbel, - "laplace": np.random.laplace, - "logistic": np.random.logistic, - "poisson": np.random.poisson, - "uniform": np.random.uniform, - "wald": np.random.wald, + "normal": rng_generator.normal, + "binomial": rng_generator.binomial, + "chisquare": rng_generator.chisquare, + "exponential": rng_generator.exponential, + "gamma": rng_generator.gamma, + "gumbel": rng_generator.gumbel, + "laplace": rng_generator.laplace, + "logistic": rng_generator.logistic, + "poisson": rng_generator.poisson, + "uniform": rng_generator.uniform, + "wald": rng_generator.wald, } try: return distributions[distribution_function_name] diff --git a/tests/integration/test_monte_carlo.py b/tests/integration/test_monte_carlo.py index 538971d53..e42137e50 100644 --- a/tests/integration/test_monte_carlo.py +++ b/tests/integration/test_monte_carlo.py @@ -10,7 +10,8 @@ @pytest.mark.slow -def test_monte_carlo_simulate(monte_carlo_calisto): +@pytest.mark.parametrize("parallel", [False, True]) +def test_monte_carlo_simulate(monte_carlo_calisto, parallel): """Tests the simulate method of the MonteCarlo class. Parameters @@ -19,7 +20,9 @@ def test_monte_carlo_simulate(monte_carlo_calisto): The MonteCarlo object, this is a pytest fixture. """ # NOTE: this is really slow, it runs 10 flight simulations - monte_carlo_calisto.simulate(number_of_simulations=10, append=False) + monte_carlo_calisto.simulate( + number_of_simulations=10, append=False, parallel=parallel + ) assert monte_carlo_calisto.num_of_loaded_sims == 10 assert monte_carlo_calisto.number_of_simulations == 10 From 004bf23afca766cb137f287f52b983baca805a12 Mon Sep 17 00:00:00 2001 From: Pedro Bressan Date: Sat, 3 Aug 2024 13:16:28 -0300 Subject: [PATCH 2/7] MNT: improve docstrings for parallel MonteCarlo. --- rocketpy/simulation/monte_carlo.py | 110 ++++++++++++++++++++------ tests/integration/test_monte_carlo.py | 4 +- 2 files changed, 89 insertions(+), 25 deletions(-) diff --git a/rocketpy/simulation/monte_carlo.py b/rocketpy/simulation/monte_carlo.py index b5bc4dde4..3e54bc136 100644 --- a/rocketpy/simulation/monte_carlo.py +++ b/rocketpy/simulation/monte_carlo.py @@ -19,7 +19,7 @@ import warnings from copy import deepcopy from pathlib import Path -from time import process_time, time +from time import time import numpy as np import simplekml @@ -279,7 +279,7 @@ def __run_in_serial(self): ------- None """ - sim_monitor = SimMonitor( + sim_monitor = _SimMonitor( initial_count=self._initial_sim_idx, n_simulations=self.number_of_simulations, start_time=time(), @@ -346,7 +346,7 @@ def __run_in_parallel(self, n_workers=None): mutex = manager.Lock() consumer_stop_event = manager.Event() - sim_monitor = manager.SimMonitor( + sim_monitor = manager._SimMonitor( initial_count=self._initial_sim_idx, n_simulations=self.number_of_simulations, start_time=time(), @@ -411,9 +411,34 @@ def __sim_producer( mutex, seed, ): + """Simulation producer to be used in parallel by multiprocessing. + + Parameters + ---------- + sto_env : StochasticEnvironment + The stochastic environment object to be iterated over. + sto_rocket : StochasticRocket + The stochastic rocket object to be iterated over. + sto_flight : StochasticFlight + The stochastic flight object to be iterated over. + sim_monitor : _SimMonitor + The simulation monitor object to keep track of the simulations. + export_list : list + The list of variables to export at each simulation. + export_sample_time : float + Sample time to downsample the arrays in seconds. + export_queue : multiprocess.Queue + The queue to export the results. + error_file : str + The file to write the errors. + mutex : multiprocess.Lock + The mutex to lock access to critical regions. + seed : int + The seed to set the random number generator. + """ try: while sim_monitor.keep_simulating(): - sim_idx = sim_monitor.increment() + sim_idx = sim_monitor.increment() - 1 sto_env._set_stochastic(seed) sto_rocket._set_stochastic(seed) @@ -450,6 +475,23 @@ def __sim_consumer( mutex, stop_event, ): + """Simulation consumer to be used in parallel by multiprocessing. + It consumes the results from the queue and writes them to the files. + If no results are received for 10 seconds, a TimeoutError is raised. + + Parameters + ---------- + export_queue : multiprocess.Queue + The queue to export the results. + inputs_file : str + The file path to write the inputs. + outputs_file : str + The file path to write the outputs. + mutex : multiprocess.Lock + The mutex to lock access to critical regions. + stop_event : multiprocess.Event + The event indicating that the simulations are done. + """ trials = 0 while not stop_event.is_set(): try: @@ -478,6 +520,23 @@ def __sim_consumer( def __run_single_simulation( sim_idx, sto_env, sto_rocket, sto_flight, export_list, export_sample_time ): + """Runs a single simulation and returns the inputs and outputs. + + Parameters + ---------- + sim_idx : int + The index of the simulation. + sto_env : StochasticEnvironment + The stochastic environment object to be iterated over. + sto_rocket : StochasticRocket + The stochastic rocket object to be iterated over. + sto_flight : StochasticFlight + The stochastic flight object to be iterated over. + export_list : list + The list of variables to export at each simulation. + export_sample_time : float + Sample time to downsample the arrays in seconds. + """ monte_carlo_flight = Flight( rocket=sto_rocket.create_object(), environment=sto_env.create_object(), @@ -510,21 +569,6 @@ def __run_single_simulation( return inputs_dict, outputs_dict - def __terminate_simulation(self): - """ - Terminates the simulation, closes the files and prints the results. - - Returns - ------- - None - """ - # resave the files on self and calculate post simulation attributes - self.input_file = self.batch_path / f"{self.filename}.inputs.txt" - self.output_file = self.batch_path / f"{self.filename}.outputs.txt" - self.error_file = self.batch_path / f"{self.filename}.errors.txt" - - print(f"Results saved to {self._output_file}") - @staticmethod def __export_flight_data( inputs_dict, @@ -555,6 +599,21 @@ def __export_flight_data( with open(outputs_file, "a", encoding="utf-8") as file: file.write(json.dumps(outputs_dict, cls=RocketPyEncoder) + "\n") + def __terminate_simulation(self): + """ + Terminates the simulation, closes the files and prints the results. + + Returns + ------- + None + """ + # resave the files on self and calculate post simulation attributes + self.input_file = self.batch_path / f"{self.filename}.inputs.txt" + self.output_file = self.batch_path / f"{self.filename}.outputs.txt" + self.error_file = self.batch_path / f"{self.filename}.errors.txt" + + print(f"Results saved to {self._output_file}") + def __check_export_list(self, export_list): """ Checks if the export_list is valid and returns a valid list. If no @@ -1186,7 +1245,8 @@ def prepare_export_data(obj, sample_time=0.1, remove_functions=False): def import_multiprocess(): - """Import the necessary modules for the multiprocess module. + """Import the necessary modules and submodules for the + multiprocess library. Returns ------- @@ -1217,17 +1277,21 @@ def create_multiprocess_manager(multiprocess, managers): """ class MonteCarloManager(managers.BaseManager): + """Custom manager for shared objects in the Monte Carlo simulation.""" + def __init__(self): super().__init__() self.register('Lock', multiprocess.Lock) self.register('Queue', multiprocess.Queue) self.register('Event', multiprocess.Event) - self.register('SimMonitor', SimMonitor) + self.register('_SimMonitor', _SimMonitor) return MonteCarloManager() -class SimMonitor: +class _SimMonitor: + """Class to monitor the simulation progress and display the status.""" + def __init__(self, initial_count, n_simulations, start_time): self.initial_count = initial_count self.count = initial_count @@ -1239,7 +1303,7 @@ def keep_simulating(self): def increment(self): self.count += 1 - return self.count - 1 + return self.count def update_status(self, sim_idx, end="\n", flush=False): """Prints a message on the same line as the previous one and replaces diff --git a/tests/integration/test_monte_carlo.py b/tests/integration/test_monte_carlo.py index e42137e50..32bb171f1 100644 --- a/tests/integration/test_monte_carlo.py +++ b/tests/integration/test_monte_carlo.py @@ -30,12 +30,12 @@ def test_monte_carlo_simulate(monte_carlo_calisto, parallel): assert str(monte_carlo_calisto.error_file.name) == "monte_carlo_test.errors.txt" assert str(monte_carlo_calisto.output_file.name) == "monte_carlo_test.outputs.txt" assert np.isclose( - monte_carlo_calisto.processed_results["apogee"][0], 4711, rtol=0.15 + monte_carlo_calisto.processed_results["apogee"][0], 4711, rtol=0.2 ) assert np.isclose( monte_carlo_calisto.processed_results["impact_velocity"][0], -5.234, - rtol=0.15, + rtol=0.2, ) os.remove("monte_carlo_test.errors.txt") os.remove("monte_carlo_test.outputs.txt") From 26f692e6a8c2e9b357c2ed23d3a9bfdc77745e3e Mon Sep 17 00:00:00 2001 From: Pedro Bressan Date: Sat, 3 Aug 2024 14:25:52 -0300 Subject: [PATCH 3/7] MNT: fix printing and formatting issues. --- .../monte_carlo_class_example.inputs.txt | 110 ++++++++++++++-- .../monte_carlo_class_example.outputs.txt | 110 ++++++++++++++-- .../monte_carlo_class_usage.ipynb | 121 +++++++++++------- rocketpy/simulation/monte_carlo.py | 66 +++++----- 4 files changed, 312 insertions(+), 95 deletions(-) diff --git a/docs/notebooks/monte_carlo_analysis/monte_carlo_analysis_outputs/monte_carlo_class_example.inputs.txt b/docs/notebooks/monte_carlo_analysis/monte_carlo_analysis_outputs/monte_carlo_class_example.inputs.txt index c8a3dc0d5..73615d31a 100644 --- a/docs/notebooks/monte_carlo_analysis/monte_carlo_analysis_outputs/monte_carlo_class_example.inputs.txt +++ b/docs/notebooks/monte_carlo_analysis/monte_carlo_analysis_outputs/monte_carlo_class_example.inputs.txt @@ -1,10 +1,100 @@ -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350289434264267, "mass": 15.456135927990132, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3470082958698635, "I_33_without_motor": 0.03229593193345243, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.52959319334525, "heading": 55.57958707681996, "idx": 1} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350642685195844, "mass": 15.947943756465122, "I_11_without_motor": 6.321, "I_22_without_motor": 6.305034260224077, "I_33_without_motor": 0.012185784256634566, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 82.51857842566346, "heading": 54.00929681071917, "idx": 2} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06348693436942288, "mass": 15.56700310729182, "I_11_without_motor": 6.321, "I_22_without_motor": 6.327048745074772, "I_33_without_motor": 0.03231103830848155, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.53110383084815, "heading": 51.829403501192125, "idx": 0} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06351113888637025, "mass": 15.432331749142888, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3024514780732135, "I_33_without_motor": 0.03861989442356517, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.16198944235651, "heading": 52.941330785531, "idx": 6} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06351424065511635, "mass": 15.098615587482993, "I_11_without_motor": 6.321, "I_22_without_motor": 6.329640597262522, "I_33_without_motor": 0.02652243852750159, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 83.95224385275016, "heading": 54.12450364243022, "idx": 4} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350085654124574, "mass": 15.27389293993322, "I_11_without_motor": 6.321, "I_22_without_motor": 6.313645147120128, "I_33_without_motor": 0.022871111842170035, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 83.58711118421701, "heading": 55.62608499496386, "idx": 3} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350445203784565, "mass": 15.61156113400957, "I_11_without_motor": 6.321, "I_22_without_motor": 6.337935598753835, "I_33_without_motor": 0.046192115787341025, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.9192115787341, "heading": 52.19392581388304, "idx": 5} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350289434264267, "mass": 15.456135927990132, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3470082958698635, "I_33_without_motor": 0.03229593193345243, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.52959319334525, "heading": 55.57958707681996, "idx": 7} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350642685195844, "mass": 15.947943756465122, "I_11_without_motor": 6.321, "I_22_without_motor": 6.305034260224077, "I_33_without_motor": 0.012185784256634566, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 82.51857842566346, "heading": 54.00929681071917, "idx": 8} -{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06348693436942288, "mass": 15.56700310729182, "I_11_without_motor": 6.321, "I_22_without_motor": 6.327048745074772, "I_33_without_motor": 0.03231103830848155, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.53110383084815, "heading": 51.829403501192125, "idx": 9} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.0635123798425405, "mass": 15.41376302770614, "I_11_without_motor": 6.321, "I_22_without_motor": 6.303064489327069, "I_33_without_motor": 0.04197757771439317, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.49775777143932, "heading": 52.12898276395181, "idx": 0} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350663547773167, "mass": 16.05723653854209, "I_11_without_motor": 6.321, "I_22_without_motor": 6.328605779988375, "I_33_without_motor": 0.03369193435503788, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.66919343550379, "heading": 54.27656152074371, "idx": 5} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.0634988572455045, "mass": 16.338817676664625, "I_11_without_motor": 6.321, "I_22_without_motor": 6.316009992030016, "I_33_without_motor": 0.030727185276747237, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.37271852767472, "heading": 56.14908047672716, "idx": 1} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06351028909565555, "mass": 15.59817192109069, "I_11_without_motor": 6.321, "I_22_without_motor": 6.330279238201114, "I_33_without_motor": 0.03649131626863001, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.94913162686301, "heading": 53.726025901214435, "idx": 2} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349141969312458, "mass": 15.324767103775889, "I_11_without_motor": 6.321, "I_22_without_motor": 6.324411390727345, "I_33_without_motor": 0.037181630319945695, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.01816303199458, "heading": 55.04962513471625, "idx": 6} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350862152839436, "mass": 15.551601044525187, "I_11_without_motor": 6.321, "I_22_without_motor": 6.321026314463162, "I_33_without_motor": 0.028067239247621723, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.10672392476218, "heading": 53.811365688453506, "idx": 3} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349317227762415, "mass": 14.757137448702853, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3283281771302455, "I_33_without_motor": 0.05799460218112253, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 87.09946021811226, "heading": 55.5866427331118, "idx": 4} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350663547773167, "mass": 16.05723653854209, "I_11_without_motor": 6.321, "I_22_without_motor": 6.328605779988375, "I_33_without_motor": 0.03369193435503788, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.66919343550379, "heading": 54.27656152074371, "idx": 8} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.0635123798425405, "mass": 15.41376302770614, "I_11_without_motor": 6.321, "I_22_without_motor": 6.303064489327069, "I_33_without_motor": 0.04197757771439317, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.49775777143932, "heading": 52.12898276395181, "idx": 7} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349317227762415, "mass": 14.757137448702853, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3283281771302455, "I_33_without_motor": 0.05799460218112253, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 87.09946021811226, "heading": 55.5866427331118, "idx": 13} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06351028909565555, "mass": 15.59817192109069, "I_11_without_motor": 6.321, "I_22_without_motor": 6.330279238201114, "I_33_without_motor": 0.03649131626863001, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.94913162686301, "heading": 53.726025901214435, "idx": 10} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349141969312458, "mass": 15.324767103775889, "I_11_without_motor": 6.321, "I_22_without_motor": 6.324411390727345, "I_33_without_motor": 0.037181630319945695, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.01816303199458, "heading": 55.04962513471625, "idx": 11} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350862152839436, "mass": 15.551601044525187, "I_11_without_motor": 6.321, "I_22_without_motor": 6.321026314463162, "I_33_without_motor": 0.028067239247621723, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.10672392476218, "heading": 53.811365688453506, "idx": 12} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.0634988572455045, "mass": 16.338817676664625, "I_11_without_motor": 6.321, "I_22_without_motor": 6.316009992030016, "I_33_without_motor": 0.030727185276747237, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.37271852767472, "heading": 56.14908047672716, "idx": 9} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06351028909565555, "mass": 15.59817192109069, "I_11_without_motor": 6.321, "I_22_without_motor": 6.330279238201114, "I_33_without_motor": 0.03649131626863001, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.94913162686301, "heading": 53.726025901214435, "idx": 17} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350663547773167, "mass": 16.05723653854209, "I_11_without_motor": 6.321, "I_22_without_motor": 6.328605779988375, "I_33_without_motor": 0.03369193435503788, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.66919343550379, "heading": 54.27656152074371, "idx": 14} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.0635123798425405, "mass": 15.41376302770614, "I_11_without_motor": 6.321, "I_22_without_motor": 6.303064489327069, "I_33_without_motor": 0.04197757771439317, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.49775777143932, "heading": 52.12898276395181, "idx": 15} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.0634988572455045, "mass": 16.338817676664625, "I_11_without_motor": 6.321, "I_22_without_motor": 6.316009992030016, "I_33_without_motor": 0.030727185276747237, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.37271852767472, "heading": 56.14908047672716, "idx": 20} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349317227762415, "mass": 14.757137448702853, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3283281771302455, "I_33_without_motor": 0.05799460218112253, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 87.09946021811226, "heading": 55.5866427331118, "idx": 16} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350862152839436, "mass": 15.551601044525187, "I_11_without_motor": 6.321, "I_22_without_motor": 6.321026314463162, "I_33_without_motor": 0.028067239247621723, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.10672392476218, "heading": 53.811365688453506, "idx": 19} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349141969312458, "mass": 15.324767103775889, "I_11_without_motor": 6.321, "I_22_without_motor": 6.324411390727345, "I_33_without_motor": 0.037181630319945695, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.01816303199458, "heading": 55.04962513471625, "idx": 18} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350663547773167, "mass": 16.05723653854209, "I_11_without_motor": 6.321, "I_22_without_motor": 6.328605779988375, "I_33_without_motor": 0.03369193435503788, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.66919343550379, "heading": 54.27656152074371, "idx": 22} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06351028909565555, "mass": 15.59817192109069, "I_11_without_motor": 6.321, "I_22_without_motor": 6.330279238201114, "I_33_without_motor": 0.03649131626863001, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.94913162686301, "heading": 53.726025901214435, "idx": 21} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350862152839436, "mass": 15.551601044525187, "I_11_without_motor": 6.321, "I_22_without_motor": 6.321026314463162, "I_33_without_motor": 0.028067239247621723, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.10672392476218, "heading": 53.811365688453506, "idx": 26} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.0635123798425405, "mass": 15.41376302770614, "I_11_without_motor": 6.321, "I_22_without_motor": 6.303064489327069, "I_33_without_motor": 0.04197757771439317, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.49775777143932, "heading": 52.12898276395181, "idx": 23} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.0634988572455045, "mass": 16.338817676664625, "I_11_without_motor": 6.321, "I_22_without_motor": 6.316009992030016, "I_33_without_motor": 0.030727185276747237, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.37271852767472, "heading": 56.14908047672716, "idx": 24} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349317227762415, "mass": 14.757137448702853, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3283281771302455, "I_33_without_motor": 0.05799460218112253, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 87.09946021811226, "heading": 55.5866427331118, "idx": 25} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349141969312458, "mass": 15.324767103775889, "I_11_without_motor": 6.321, "I_22_without_motor": 6.324411390727345, "I_33_without_motor": 0.037181630319945695, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.01816303199458, "heading": 55.04962513471625, "idx": 27} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350663547773167, "mass": 16.05723653854209, "I_11_without_motor": 6.321, "I_22_without_motor": 6.328605779988375, "I_33_without_motor": 0.03369193435503788, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.66919343550379, "heading": 54.27656152074371, "idx": 28} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06351028909565555, "mass": 15.59817192109069, "I_11_without_motor": 6.321, "I_22_without_motor": 6.330279238201114, "I_33_without_motor": 0.03649131626863001, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.94913162686301, "heading": 53.726025901214435, "idx": 29} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.0635123798425405, "mass": 15.41376302770614, "I_11_without_motor": 6.321, "I_22_without_motor": 6.303064489327069, "I_33_without_motor": 0.04197757771439317, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.49775777143932, "heading": 52.12898276395181, "idx": 31} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350862152839436, "mass": 15.551601044525187, "I_11_without_motor": 6.321, "I_22_without_motor": 6.321026314463162, "I_33_without_motor": 0.028067239247621723, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.10672392476218, "heading": 53.811365688453506, "idx": 30} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.0634988572455045, "mass": 16.338817676664625, "I_11_without_motor": 6.321, "I_22_without_motor": 6.316009992030016, "I_33_without_motor": 0.030727185276747237, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.37271852767472, "heading": 56.14908047672716, "idx": 32} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349317227762415, "mass": 14.757137448702853, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3283281771302455, "I_33_without_motor": 0.05799460218112253, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 87.09946021811226, "heading": 55.5866427331118, "idx": 33} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350663547773167, "mass": 16.05723653854209, "I_11_without_motor": 6.321, "I_22_without_motor": 6.328605779988375, "I_33_without_motor": 0.03369193435503788, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.66919343550379, "heading": 54.27656152074371, "idx": 35} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349141969312458, "mass": 15.324767103775889, "I_11_without_motor": 6.321, "I_22_without_motor": 6.324411390727345, "I_33_without_motor": 0.037181630319945695, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.01816303199458, "heading": 55.04962513471625, "idx": 34} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06351028909565555, "mass": 15.59817192109069, "I_11_without_motor": 6.321, "I_22_without_motor": 6.330279238201114, "I_33_without_motor": 0.03649131626863001, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.94913162686301, "heading": 53.726025901214435, "idx": 36} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.0635123798425405, "mass": 15.41376302770614, "I_11_without_motor": 6.321, "I_22_without_motor": 6.303064489327069, "I_33_without_motor": 0.04197757771439317, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.49775777143932, "heading": 52.12898276395181, "idx": 37} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.0634988572455045, "mass": 16.338817676664625, "I_11_without_motor": 6.321, "I_22_without_motor": 6.316009992030016, "I_33_without_motor": 0.030727185276747237, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.37271852767472, "heading": 56.14908047672716, "idx": 39} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350862152839436, "mass": 15.551601044525187, "I_11_without_motor": 6.321, "I_22_without_motor": 6.321026314463162, "I_33_without_motor": 0.028067239247621723, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.10672392476218, "heading": 53.811365688453506, "idx": 38} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349317227762415, "mass": 14.757137448702853, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3283281771302455, "I_33_without_motor": 0.05799460218112253, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 87.09946021811226, "heading": 55.5866427331118, "idx": 40} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350663547773167, "mass": 16.05723653854209, "I_11_without_motor": 6.321, "I_22_without_motor": 6.328605779988375, "I_33_without_motor": 0.03369193435503788, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.66919343550379, "heading": 54.27656152074371, "idx": 41} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349141969312458, "mass": 15.324767103775889, "I_11_without_motor": 6.321, "I_22_without_motor": 6.324411390727345, "I_33_without_motor": 0.037181630319945695, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.01816303199458, "heading": 55.04962513471625, "idx": 42} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06351028909565555, "mass": 15.59817192109069, "I_11_without_motor": 6.321, "I_22_without_motor": 6.330279238201114, "I_33_without_motor": 0.03649131626863001, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.94913162686301, "heading": 53.726025901214435, "idx": 43} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.0635123798425405, "mass": 15.41376302770614, "I_11_without_motor": 6.321, "I_22_without_motor": 6.303064489327069, "I_33_without_motor": 0.04197757771439317, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.49775777143932, "heading": 52.12898276395181, "idx": 44} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.0634988572455045, "mass": 16.338817676664625, "I_11_without_motor": 6.321, "I_22_without_motor": 6.316009992030016, "I_33_without_motor": 0.030727185276747237, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.37271852767472, "heading": 56.14908047672716, "idx": 45} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350862152839436, "mass": 15.551601044525187, "I_11_without_motor": 6.321, "I_22_without_motor": 6.321026314463162, "I_33_without_motor": 0.028067239247621723, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.10672392476218, "heading": 53.811365688453506, "idx": 46} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349317227762415, "mass": 14.757137448702853, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3283281771302455, "I_33_without_motor": 0.05799460218112253, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 87.09946021811226, "heading": 55.5866427331118, "idx": 47} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350663547773167, "mass": 16.05723653854209, "I_11_without_motor": 6.321, "I_22_without_motor": 6.328605779988375, "I_33_without_motor": 0.03369193435503788, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.66919343550379, "heading": 54.27656152074371, "idx": 48} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349141969312458, "mass": 15.324767103775889, "I_11_without_motor": 6.321, "I_22_without_motor": 6.324411390727345, "I_33_without_motor": 0.037181630319945695, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.01816303199458, "heading": 55.04962513471625, "idx": 49} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06351028909565555, "mass": 15.59817192109069, "I_11_without_motor": 6.321, "I_22_without_motor": 6.330279238201114, "I_33_without_motor": 0.03649131626863001, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.94913162686301, "heading": 53.726025901214435, "idx": 50} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.0635123798425405, "mass": 15.41376302770614, "I_11_without_motor": 6.321, "I_22_without_motor": 6.303064489327069, "I_33_without_motor": 0.04197757771439317, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.49775777143932, "heading": 52.12898276395181, "idx": 51} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.0634988572455045, "mass": 16.338817676664625, "I_11_without_motor": 6.321, "I_22_without_motor": 6.316009992030016, "I_33_without_motor": 0.030727185276747237, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.37271852767472, "heading": 56.14908047672716, "idx": 52} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350862152839436, "mass": 15.551601044525187, "I_11_without_motor": 6.321, "I_22_without_motor": 6.321026314463162, "I_33_without_motor": 0.028067239247621723, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.10672392476218, "heading": 53.811365688453506, "idx": 53} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349317227762415, "mass": 14.757137448702853, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3283281771302455, "I_33_without_motor": 0.05799460218112253, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 87.09946021811226, "heading": 55.5866427331118, "idx": 54} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350663547773167, "mass": 16.05723653854209, "I_11_without_motor": 6.321, "I_22_without_motor": 6.328605779988375, "I_33_without_motor": 0.03369193435503788, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.66919343550379, "heading": 54.27656152074371, "idx": 55} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349141969312458, "mass": 15.324767103775889, "I_11_without_motor": 6.321, "I_22_without_motor": 6.324411390727345, "I_33_without_motor": 0.037181630319945695, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.01816303199458, "heading": 55.04962513471625, "idx": 56} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06351028909565555, "mass": 15.59817192109069, "I_11_without_motor": 6.321, "I_22_without_motor": 6.330279238201114, "I_33_without_motor": 0.03649131626863001, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.94913162686301, "heading": 53.726025901214435, "idx": 57} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.0635123798425405, "mass": 15.41376302770614, "I_11_without_motor": 6.321, "I_22_without_motor": 6.303064489327069, "I_33_without_motor": 0.04197757771439317, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.49775777143932, "heading": 52.12898276395181, "idx": 58} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.0634988572455045, "mass": 16.338817676664625, "I_11_without_motor": 6.321, "I_22_without_motor": 6.316009992030016, "I_33_without_motor": 0.030727185276747237, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.37271852767472, "heading": 56.14908047672716, "idx": 59} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349317227762415, "mass": 14.757137448702853, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3283281771302455, "I_33_without_motor": 0.05799460218112253, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 87.09946021811226, "heading": 55.5866427331118, "idx": 61} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350862152839436, "mass": 15.551601044525187, "I_11_without_motor": 6.321, "I_22_without_motor": 6.321026314463162, "I_33_without_motor": 0.028067239247621723, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.10672392476218, "heading": 53.811365688453506, "idx": 60} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350663547773167, "mass": 16.05723653854209, "I_11_without_motor": 6.321, "I_22_without_motor": 6.328605779988375, "I_33_without_motor": 0.03369193435503788, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.66919343550379, "heading": 54.27656152074371, "idx": 62} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349141969312458, "mass": 15.324767103775889, "I_11_without_motor": 6.321, "I_22_without_motor": 6.324411390727345, "I_33_without_motor": 0.037181630319945695, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.01816303199458, "heading": 55.04962513471625, "idx": 63} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06351028909565555, "mass": 15.59817192109069, "I_11_without_motor": 6.321, "I_22_without_motor": 6.330279238201114, "I_33_without_motor": 0.03649131626863001, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.94913162686301, "heading": 53.726025901214435, "idx": 64} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.0635123798425405, "mass": 15.41376302770614, "I_11_without_motor": 6.321, "I_22_without_motor": 6.303064489327069, "I_33_without_motor": 0.04197757771439317, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.49775777143932, "heading": 52.12898276395181, "idx": 65} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.0634988572455045, "mass": 16.338817676664625, "I_11_without_motor": 6.321, "I_22_without_motor": 6.316009992030016, "I_33_without_motor": 0.030727185276747237, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.37271852767472, "heading": 56.14908047672716, "idx": 66} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349317227762415, "mass": 14.757137448702853, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3283281771302455, "I_33_without_motor": 0.05799460218112253, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 87.09946021811226, "heading": 55.5866427331118, "idx": 67} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350862152839436, "mass": 15.551601044525187, "I_11_without_motor": 6.321, "I_22_without_motor": 6.321026314463162, "I_33_without_motor": 0.028067239247621723, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.10672392476218, "heading": 53.811365688453506, "idx": 68} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350663547773167, "mass": 16.05723653854209, "I_11_without_motor": 6.321, "I_22_without_motor": 6.328605779988375, "I_33_without_motor": 0.03369193435503788, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.66919343550379, "heading": 54.27656152074371, "idx": 69} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349141969312458, "mass": 15.324767103775889, "I_11_without_motor": 6.321, "I_22_without_motor": 6.324411390727345, "I_33_without_motor": 0.037181630319945695, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.01816303199458, "heading": 55.04962513471625, "idx": 70} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06351028909565555, "mass": 15.59817192109069, "I_11_without_motor": 6.321, "I_22_without_motor": 6.330279238201114, "I_33_without_motor": 0.03649131626863001, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.94913162686301, "heading": 53.726025901214435, "idx": 71} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.0635123798425405, "mass": 15.41376302770614, "I_11_without_motor": 6.321, "I_22_without_motor": 6.303064489327069, "I_33_without_motor": 0.04197757771439317, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.49775777143932, "heading": 52.12898276395181, "idx": 72} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.0634988572455045, "mass": 16.338817676664625, "I_11_without_motor": 6.321, "I_22_without_motor": 6.316009992030016, "I_33_without_motor": 0.030727185276747237, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.37271852767472, "heading": 56.14908047672716, "idx": 73} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349317227762415, "mass": 14.757137448702853, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3283281771302455, "I_33_without_motor": 0.05799460218112253, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 87.09946021811226, "heading": 55.5866427331118, "idx": 74} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350663547773167, "mass": 16.05723653854209, "I_11_without_motor": 6.321, "I_22_without_motor": 6.328605779988375, "I_33_without_motor": 0.03369193435503788, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.66919343550379, "heading": 54.27656152074371, "idx": 76} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350862152839436, "mass": 15.551601044525187, "I_11_without_motor": 6.321, "I_22_without_motor": 6.321026314463162, "I_33_without_motor": 0.028067239247621723, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.10672392476218, "heading": 53.811365688453506, "idx": 75} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349141969312458, "mass": 15.324767103775889, "I_11_without_motor": 6.321, "I_22_without_motor": 6.324411390727345, "I_33_without_motor": 0.037181630319945695, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.01816303199458, "heading": 55.04962513471625, "idx": 77} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06351028909565555, "mass": 15.59817192109069, "I_11_without_motor": 6.321, "I_22_without_motor": 6.330279238201114, "I_33_without_motor": 0.03649131626863001, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.94913162686301, "heading": 53.726025901214435, "idx": 78} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.0635123798425405, "mass": 15.41376302770614, "I_11_without_motor": 6.321, "I_22_without_motor": 6.303064489327069, "I_33_without_motor": 0.04197757771439317, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.49775777143932, "heading": 52.12898276395181, "idx": 79} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.0634988572455045, "mass": 16.338817676664625, "I_11_without_motor": 6.321, "I_22_without_motor": 6.316009992030016, "I_33_without_motor": 0.030727185276747237, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.37271852767472, "heading": 56.14908047672716, "idx": 80} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349317227762415, "mass": 14.757137448702853, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3283281771302455, "I_33_without_motor": 0.05799460218112253, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 87.09946021811226, "heading": 55.5866427331118, "idx": 81} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350862152839436, "mass": 15.551601044525187, "I_11_without_motor": 6.321, "I_22_without_motor": 6.321026314463162, "I_33_without_motor": 0.028067239247621723, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.10672392476218, "heading": 53.811365688453506, "idx": 83} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350663547773167, "mass": 16.05723653854209, "I_11_without_motor": 6.321, "I_22_without_motor": 6.328605779988375, "I_33_without_motor": 0.03369193435503788, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.66919343550379, "heading": 54.27656152074371, "idx": 82} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349141969312458, "mass": 15.324767103775889, "I_11_without_motor": 6.321, "I_22_without_motor": 6.324411390727345, "I_33_without_motor": 0.037181630319945695, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.01816303199458, "heading": 55.04962513471625, "idx": 84} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.0635123798425405, "mass": 15.41376302770614, "I_11_without_motor": 6.321, "I_22_without_motor": 6.303064489327069, "I_33_without_motor": 0.04197757771439317, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.49775777143932, "heading": 52.12898276395181, "idx": 86} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06351028909565555, "mass": 15.59817192109069, "I_11_without_motor": 6.321, "I_22_without_motor": 6.330279238201114, "I_33_without_motor": 0.03649131626863001, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.94913162686301, "heading": 53.726025901214435, "idx": 85} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.0634988572455045, "mass": 16.338817676664625, "I_11_without_motor": 6.321, "I_22_without_motor": 6.316009992030016, "I_33_without_motor": 0.030727185276747237, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.37271852767472, "heading": 56.14908047672716, "idx": 87} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349317227762415, "mass": 14.757137448702853, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3283281771302455, "I_33_without_motor": 0.05799460218112253, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 87.09946021811226, "heading": 55.5866427331118, "idx": 88} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350862152839436, "mass": 15.551601044525187, "I_11_without_motor": 6.321, "I_22_without_motor": 6.321026314463162, "I_33_without_motor": 0.028067239247621723, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.10672392476218, "heading": 53.811365688453506, "idx": 89} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350663547773167, "mass": 16.05723653854209, "I_11_without_motor": 6.321, "I_22_without_motor": 6.328605779988375, "I_33_without_motor": 0.03369193435503788, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.66919343550379, "heading": 54.27656152074371, "idx": 90} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349141969312458, "mass": 15.324767103775889, "I_11_without_motor": 6.321, "I_22_without_motor": 6.324411390727345, "I_33_without_motor": 0.037181630319945695, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.01816303199458, "heading": 55.04962513471625, "idx": 91} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.0635123798425405, "mass": 15.41376302770614, "I_11_without_motor": 6.321, "I_22_without_motor": 6.303064489327069, "I_33_without_motor": 0.04197757771439317, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.49775777143932, "heading": 52.12898276395181, "idx": 92} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.0634988572455045, "mass": 16.338817676664625, "I_11_without_motor": 6.321, "I_22_without_motor": 6.316009992030016, "I_33_without_motor": 0.030727185276747237, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.37271852767472, "heading": 56.14908047672716, "idx": 94} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06351028909565555, "mass": 15.59817192109069, "I_11_without_motor": 6.321, "I_22_without_motor": 6.330279238201114, "I_33_without_motor": 0.03649131626863001, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.94913162686301, "heading": 53.726025901214435, "idx": 93} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349317227762415, "mass": 14.757137448702853, "I_11_without_motor": 6.321, "I_22_without_motor": 6.3283281771302455, "I_33_without_motor": 0.05799460218112253, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 87.09946021811226, "heading": 55.5866427331118, "idx": 95} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350663547773167, "mass": 16.05723653854209, "I_11_without_motor": 6.321, "I_22_without_motor": 6.328605779988375, "I_33_without_motor": 0.03369193435503788, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.66919343550379, "heading": 54.27656152074371, "idx": 97} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06350862152839436, "mass": 15.551601044525187, "I_11_without_motor": 6.321, "I_22_without_motor": 6.321026314463162, "I_33_without_motor": 0.028067239247621723, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 84.10672392476218, "heading": 53.811365688453506, "idx": 96} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.06349141969312458, "mass": 15.324767103775889, "I_11_without_motor": 6.321, "I_22_without_motor": 6.324411390727345, "I_33_without_motor": 0.037181630319945695, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.01816303199458, "heading": 55.04962513471625, "idx": 98} +{"elevation": 113, "latitude": 39.3897, "longitude": -8.288964, "wind_velocity_x_factor": 1.0, "wind_velocity_y_factor": 1.0, "radius": 0.0635123798425405, "mass": 15.41376302770614, "I_11_without_motor": 6.321, "I_22_without_motor": 6.303064489327069, "I_33_without_motor": 0.04197757771439317, "I_12_without_motor": 0, "I_13_without_motor": 0, "I_23_without_motor": 0, "power_off_drag_factor": 1.0, "power_on_drag_factor": 1.0, "center_of_mass_without_motor": 0.0, "rail_length": 5, "inclination": 85.49775777143932, "heading": 52.12898276395181, "idx": 99} diff --git a/docs/notebooks/monte_carlo_analysis/monte_carlo_analysis_outputs/monte_carlo_class_example.outputs.txt b/docs/notebooks/monte_carlo_analysis/monte_carlo_analysis_outputs/monte_carlo_class_example.outputs.txt index e4190b53d..771cdbf4c 100644 --- a/docs/notebooks/monte_carlo_analysis/monte_carlo_analysis_outputs/monte_carlo_class_example.outputs.txt +++ b/docs/notebooks/monte_carlo_analysis/monte_carlo_analysis_outputs/monte_carlo_class_example.outputs.txt @@ -1,10 +1,100 @@ -{"y_impact": 376.4093936666002, "lateral_surface_wind": 0.0, "initial_stability_margin": 2.480437369786049, "t_final": 297.6055162158094, "out_of_rail_time": 0.3644630325601292, "out_of_rail_velocity": 25.152119657668607, "impact_velocity": -5.296953388035182, "frontal_surface_wind": 0.0, "max_mach_number": 0.819174310760017, "apogee_time": 25.11789981221646, "apogee": 3222.1027729232774, "out_of_rail_stability_margin": 2.544734003612891, "apogee_y": 322.5722243035113, "x_impact": 549.7379022443392, "apogee_x": 471.2504049061847} -{"y_impact": 243.63933862204485, "lateral_surface_wind": 0.0, "initial_stability_margin": 2.5198541842854403, "t_final": 290.1213491019737, "out_of_rail_time": 0.36838848375952415, "out_of_rail_velocity": 24.80760014840061, "impact_velocity": -5.371851784584625, "frontal_surface_wind": 0.0, "max_mach_number": 0.7980769553290763, "apogee_time": 24.959016407901405, "apogee": 3157.3918762259696, "out_of_rail_stability_margin": 2.5841107044590683, "apogee_y": 206.75669940027146, "x_impact": 336.10623704541666, "apogee_x": 285.2758881288964} -{"y_impact": 372.02439705262657, "lateral_surface_wind": 0.0, "initial_stability_margin": 2.4901468057791645, "t_final": 296.0470110046021, "out_of_rail_time": 0.36529270648045564, "out_of_rail_velocity": 25.067317674479906, "impact_velocity": -5.31392965857208, "frontal_surface_wind": 0.0, "max_mach_number": 0.8143530498151831, "apogee_time": 25.093820748470794, "apogee": 3209.7128008872883, "out_of_rail_stability_margin": 2.5544421260829226, "apogee_y": 318.0130213913223, "x_impact": 473.6489271270285, "apogee_x": 404.96520784245683} -{"y_impact": 496.61166316874665, "lateral_surface_wind": 0.0, "initial_stability_margin": 2.478152355581192, "t_final": 297.1833587224625, "out_of_rail_time": 0.36408311791094367, "out_of_rail_velocity": 25.160807859850472, "impact_velocity": -5.293301337464766, "frontal_surface_wind": 0.0, "max_mach_number": 0.8204086535288839, "apogee_time": 25.050555048519215, "apogee": 3207.947515019143, "out_of_rail_stability_margin": 2.542400200486431, "apogee_y": 427.842259468107, "x_impact": 657.9531644117097, "apogee_x": 567.0252993471223} -{"y_impact": 463.89061951909554, "lateral_surface_wind": 0.0, "initial_stability_margin": 2.450019520222253, "t_final": 303.13871091704345, "out_of_rail_time": 0.3614804810522778, "out_of_rail_velocity": 25.398584294954205, "impact_velocity": -5.241834653200499, "frontal_surface_wind": 0.0, "max_mach_number": 0.8348907582345828, "apogee_time": 25.215811341848426, "apogee": 3268.0540721835323, "out_of_rail_stability_margin": 2.514298748324184, "apogee_y": 399.99963799941986, "x_impact": 642.1643391895884, "apogee_x": 553.8094033935843} -{"y_impact": 401.1114077443174, "lateral_surface_wind": 0.0, "initial_stability_margin": 2.4653674640426577, "t_final": 300.5363319517597, "out_of_rail_time": 0.3638737801046747, "out_of_rail_velocity": 25.357485734133984, "impact_velocity": -5.268929085025962, "frontal_surface_wind": 0.0, "max_mach_number": 0.827121352431483, "apogee_time": 25.180505941630155, "apogee": 3248.336781428359, "out_of_rail_stability_margin": 2.5298490268824274, "apogee_y": 344.6241139073043, "x_impact": 587.1447868872624, "apogee_x": 504.58858234172453} -{"y_impact": 484.3299624760172, "lateral_surface_wind": 0.0, "initial_stability_margin": 2.4930828238738156, "t_final": 294.21934603920414, "out_of_rail_time": 0.36564340061919365, "out_of_rail_velocity": 25.046284827320218, "impact_velocity": -5.32073724239022, "frontal_surface_wind": 0.0, "max_mach_number": 0.8127012661184341, "apogee_time": 24.98744801891824, "apogee": 3181.9046046872036, "out_of_rail_stability_margin": 2.55735050829616, "apogee_y": 416.41920527349623, "x_impact": 624.311863138006, "apogee_x": 536.9918416412263} -{"y_impact": 420.6430777646008, "lateral_surface_wind": 0.0, "initial_stability_margin": 2.45679122920561, "t_final": 321.58388898296556, "out_of_rail_time": 0.3478642776860374, "out_of_rail_velocity": 26.65103672553457, "impact_velocity": -5.281095604825058, "frontal_surface_wind": 0.0, "max_mach_number": 0.9135304357162811, "apogee_time": 26.53064259165833, "apogee": 3679.33021869783, "out_of_rail_stability_margin": 2.5171352111200815, "apogee_y": 360.36787114754355, "x_impact": 614.3029445393439, "apogee_x": 526.4300236006761} -{"y_impact": 273.2260215637811, "lateral_surface_wind": 0.0, "initial_stability_margin": 2.4964593557418198, "t_final": 314.5382053976061, "out_of_rail_time": 0.3514097436728618, "out_of_rail_velocity": 26.29081810827018, "impact_velocity": -5.355769573283248, "frontal_surface_wind": 0.0, "max_mach_number": 0.8912681726307177, "apogee_time": 26.437317720431484, "apogee": 3624.499656223051, "out_of_rail_stability_margin": 2.5567627592159825, "apogee_y": 232.28515137704224, "x_impact": 376.85248351134277, "apogee_x": 320.47661630506207} -{"y_impact": 416.1124922184138, "lateral_surface_wind": 0.0, "initial_stability_margin": 2.4665515328136935, "t_final": 320.1932561690099, "out_of_rail_time": 0.34853983844891023, "out_of_rail_velocity": 26.55272752087761, "impact_velocity": -5.298021039846923, "frontal_surface_wind": 0.0, "max_mach_number": 0.9084447316599489, "apogee_time": 26.52146827400213, "apogee": 3669.432568500049, "out_of_rail_stability_margin": 2.5268821641395993, "apogee_y": 355.7321070911121, "x_impact": 529.7365658131114, "apogee_x": 452.98676519140616} +{"apogee_time": 24.467887785994776, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 313.4846633747357, "apogee": 3028.4567837464615, "max_mach_number": 0.7806538379601798, "x_impact": 475.5232980147313, "initial_stability_margin": 2.5905274391044206, "apogee_x": 403.3919537714526, "impact_velocity": -5.280659119209001, "out_of_rail_velocity": 24.52132320087051, "out_of_rail_stability_margin": 2.6554596765445346, "y_impact": 369.68631577154156, "t_final": 285.4484188213021, "out_of_rail_time": 0.37192150232181614} +{"apogee_time": 24.142166966391247, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 292.2520130504476, "apogee": 2918.349954628477, "max_mach_number": 0.7542229245503174, "x_impact": 481.5005327115939, "initial_stability_margin": 2.641772040264699, "apogee_x": 406.76614584524845, "impact_velocity": -5.378381816253091, "out_of_rail_velocity": 24.101818139633533, "out_of_rail_stability_margin": 2.706722136421836, "y_impact": 346.0506021290647, "t_final": 274.8230402875274, "out_of_rail_time": 0.37759357734078336} +{"apogee_time": 23.94546253830165, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 334.2305234284591, "apogee": 2859.94238052769, "max_mach_number": 0.7435137024569042, "x_impact": 589.2975673422343, "initial_stability_margin": 2.6634413027819486, "apogee_x": 498.89717357334575, "impact_velocity": -5.420591022799384, "out_of_rail_velocity": 23.928217135447355, "out_of_rail_stability_margin": 2.728156228208579, "y_impact": 394.885905655132, "t_final": 269.78465959160235, "out_of_rail_time": 0.3790481663115176} +{"apogee_time": 24.400580771487405, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 264.73586275586274, "apogee": 3002.6463048622873, "max_mach_number": 0.7728301490207221, "x_impact": 427.0451729461144, "initial_stability_margin": 2.605560257783571, "apogee_x": 361.0576702403233, "impact_velocity": -5.308848626981732, "out_of_rail_velocity": 24.400872107696106, "out_of_rail_stability_margin": 2.6705137471999683, "y_impact": 313.2092800484427, "t_final": 282.6207393260265, "out_of_rail_time": 0.3736076240628773} +{"apogee_time": 24.445719472279325, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 372.5691219340746, "apogee": 3028.4754531295366, "max_mach_number": 0.7848171961032664, "x_impact": 625.1318934435648, "initial_stability_margin": 2.5840685556287686, "apogee_x": 533.5419686625698, "impact_velocity": -5.267000890816192, "out_of_rail_velocity": 24.59696260116976, "out_of_rail_stability_margin": 2.648883729630921, "y_impact": 436.6437736833013, "t_final": 286.31496344693215, "out_of_rail_time": 0.3706134143226814} +{"apogee_time": 24.44679368968501, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 221.63512914218114, "apogee": 3016.870889965319, "max_mach_number": 0.7746765265654444, "x_impact": 359.4078875966719, "initial_stability_margin": 2.601879323180646, "apogee_x": 303.32904618227735, "impact_velocity": -5.3017437543996, "out_of_rail_velocity": 24.42833160192903, "out_of_rail_stability_margin": 2.6668394152333894, "y_impact": 262.64420599851684, "t_final": 283.8045155171093, "out_of_rail_time": 0.3732155535257855} +{"apogee_time": 24.686003563714824, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 404.56479129572165, "apogee": 3119.4288122226835, "max_mach_number": 0.8096823332239744, "x_impact": 688.2307324248993, "initial_stability_margin": 2.5357784786800868, "apogee_x": 590.6312153187479, "impact_velocity": -5.1790395940229885, "out_of_rail_velocity": 24.98878356769948, "out_of_rail_stability_margin": 2.600596409651662, "y_impact": 471.6703388852673, "t_final": 295.73822859532424, "out_of_rail_time": 0.3657029775483154} +{"apogee_time": 23.908730848112405, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 286.3909455689927, "apogee": 2851.731480867398, "max_mach_number": 0.7413420896454713, "x_impact": 468.56206863554536, "initial_stability_margin": 2.5024691190948984, "apogee_x": 398.66249408706074, "impact_velocity": -5.310286820509815, "out_of_rail_velocity": 23.84198203488739, "out_of_rail_stability_margin": 2.572242181195208, "y_impact": 336.71218811383426, "t_final": 281.65842336761335, "out_of_rail_time": 0.38079632956426135} +{"apogee_time": 24.233264480720926, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 307.17656087075926, "apogee": 2958.9324829119864, "max_mach_number": 0.767080606683231, "x_impact": 462.6499764906225, "initial_stability_margin": 2.4500124899600055, "apogee_x": 395.30711208372514, "impact_velocity": -5.213801685663796, "out_of_rail_velocity": 24.26772853312096, "out_of_rail_stability_margin": 2.520035152060906, "y_impact": 359.62886083529446, "t_final": 292.8202895657434, "out_of_rail_time": 0.37623134358940713} +{"apogee_time": 24.458253514451638, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 396.72879488649517, "apogee": 3049.6246552865896, "max_mach_number": 0.7956776765648672, "x_impact": 670.7250542963471, "initial_stability_margin": 2.393929790052231, "apogee_x": 579.2433191540638, "impact_velocity": -5.113469057305623, "out_of_rail_velocity": 24.710308821601018, "out_of_rail_stability_margin": 2.463740161178162, "y_impact": 459.61331221715426, "t_final": 303.5227439808431, "out_of_rail_time": 0.369677616867422} +{"apogee_time": 24.163908063063516, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 259.3865978060953, "apogee": 2933.542545368376, "max_mach_number": 0.759417257068608, "x_impact": 415.43449588495963, "initial_stability_margin": 2.4653957312089627, "apogee_x": 353.80337554385727, "impact_velocity": -5.2416341932278, "out_of_rail_velocity": 24.162067101871344, "out_of_rail_stability_margin": 2.535468999903764, "y_impact": 304.68524686770024, "t_final": 289.7240369521995, "out_of_rail_time": 0.378058398152433} +{"apogee_time": 24.20933399495506, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 365.0105134458068, "apogee": 2958.273822886601, "max_mach_number": 0.7710448403313923, "x_impact": 608.4780650132133, "initial_stability_margin": 2.443334646142269, "apogee_x": 522.7782605865643, "impact_velocity": -5.200316424936883, "out_of_rail_velocity": 24.313701976760935, "out_of_rail_stability_margin": 2.5133273881989036, "y_impact": 424.99013043788807, "t_final": 293.6501135701405, "out_of_rail_time": 0.37522417863396385} +{"apogee_time": 24.210267935744177, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 217.13939833444022, "apogee": 2947.498768916701, "max_mach_number": 0.7612216320180236, "x_impact": 349.52900972434276, "initial_stability_margin": 2.4616217593341707, "apogee_x": 297.21843552637495, "impact_velocity": -5.2346192908468225, "out_of_rail_velocity": 24.17738652326365, "out_of_rail_stability_margin": 2.531664917212943, "y_impact": 255.43873025419092, "t_final": 290.81802348965925, "out_of_rail_time": 0.3774943119531038} +{"apogee_time": 23.70669159705135, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 327.2962877250368, "apogee": 2792.6420624779903, "max_mach_number": 0.730532609317954, "x_impact": 573.1700217850278, "initial_stability_margin": 2.524644816128246, "apogee_x": 488.5946749940599, "impact_velocity": -5.3519614824277255, "out_of_rail_velocity": 23.666645654161584, "out_of_rail_stability_margin": 2.5945576677494215, "y_impact": 384.0472624565687, "t_final": 276.32985125124236, "out_of_rail_time": 0.38381040277953343} +{"apogee_time": 27.906199595509353, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 347.44285542848627, "apogee": 4182.6774955166, "max_mach_number": 1.032391923381185, "x_impact": 548.4305117499656, "initial_stability_margin": 2.7909925919439127, "apogee_x": 473.7495377711745, "impact_velocity": -5.282083468742006, "out_of_rail_velocity": 28.801036528928407, "out_of_rail_stability_margin": 2.840171503057144, "y_impact": 402.31210477957075, "t_final": 343.185175982439, "out_of_rail_time": 0.3270669442924935} +{"apogee_time": 27.855249516691025, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 390.41865021217643, "apogee": 4137.134708321661, "max_mach_number": 1.0128001402287898, "x_impact": 628.5096349471555, "initial_stability_margin": 2.8264712052028997, "apogee_x": 543.279526198285, "impact_velocity": -5.351266015181816, "out_of_rail_velocity": 28.442894055146844, "out_of_rail_stability_margin": 2.8756246452334535, "y_impact": 451.82440956527745, "t_final": 336.8860763309563, "out_of_rail_time": 0.3301483104901673} +{"apogee_time": 27.87976281114976, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 408.32092465432714, "apogee": 4187.941784721975, "max_mach_number": 1.0403740701710604, "x_impact": 606.5309204764985, "initial_stability_margin": 2.7762578623546488, "apogee_x": 525.3198458986442, "impact_velocity": -5.254036258145042, "out_of_rail_velocity": 28.935448248286285, "out_of_rail_stability_margin": 2.825431186927199, "y_impact": 471.62379383657293, "t_final": 345.18212179466786, "out_of_rail_time": 0.32573325142615894} +{"apogee_time": 27.76628284749606, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 450.979527258872, "apogee": 4094.49290035507, "max_mach_number": 1.0009533150037946, "x_impact": 776.463180978236, "initial_stability_margin": 2.8477161914338325, "apogee_x": 672.9847944944996, "impact_velocity": -5.393262362853173, "out_of_rail_velocity": 28.230595462935348, "out_of_rail_stability_margin": 2.896862721374402, "y_impact": 520.4541346791264, "t_final": 332.61345424692513, "out_of_rail_time": 0.33205967693603544} +{"apogee_time": 27.764595924157227, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 513.3310640083243, "apogee": 4204.395486531505, "max_mach_number": 1.070126550452815, "x_impact": 858.0617990722639, "initial_stability_margin": 2.7226741223037636, "apogee_x": 749.3359845552791, "impact_velocity": -5.152929203723396, "out_of_rail_velocity": 29.477201473528865, "out_of_rail_stability_margin": 2.7718233623379724, "y_impact": 588.1101138393655, "t_final": 352.3932869994267, "out_of_rail_time": 0.32105209797695533} +{"apogee_time": 27.93463612195535, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 290.35486471807303, "apogee": 4194.644126262757, "max_mach_number": 1.0343370019315514, "x_impact": 460.7874944979829, "initial_stability_margin": 2.7873930574621517, "apogee_x": 397.28093981293523, "impact_velocity": -5.275014557290682, "out_of_rail_velocity": 28.82467587387524, "out_of_rail_stability_margin": 2.836563002064738, "y_impact": 336.86811440018585, "t_final": 344.11329495318626, "out_of_rail_time": 0.32666186682923637} +{"apogee_time": 27.800781220534898, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 483.44836495407714, "apogee": 4172.859970118728, "max_mach_number": 1.0444565395207603, "x_impact": 795.3369035308837, "initial_stability_margin": 2.7700082660889973, "apogee_x": 692.171382457522, "impact_velocity": -5.240446905403987, "out_of_rail_velocity": 29.01605483244691, "out_of_rail_stability_margin": 2.819175812039275, "y_impact": 555.6898220648344, "t_final": 345.3835351939791, "out_of_rail_time": 0.32504089917500917} +{"apogee_time": 25.654153868456447, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 330.5956504258446, "apogee": 3370.23736630815, "max_mach_number": 0.8422949460669106, "x_impact": 541.0075214727261, "initial_stability_margin": 2.6794384864172955, "apogee_x": 460.10916727651176, "impact_velocity": -5.3977777940348295, "out_of_rail_velocity": 25.553088651232166, "out_of_rail_stability_margin": 2.7397068008682077, "y_impact": 388.8229826865425, "t_final": 294.2292650868195, "out_of_rail_time": 0.3596389100431711} +{"apogee_time": 25.865677966727976, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 297.98698602017936, "apogee": 3451.2249108062883, "max_mach_number": 0.8618843675211312, "x_impact": 477.6018941970687, "initial_stability_margin": 2.643191053190444, "apogee_x": 406.3896593731432, "impact_velocity": -5.327993767804578, "out_of_rail_velocity": 25.85821345714381, "out_of_rail_stability_margin": 2.7036613056730303, "y_impact": 350.3289747191436, "t_final": 301.7838427106881, "out_of_rail_time": 0.3567538229156717} +{"apogee_time": 25.911632882216885, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 249.40970959782143, "apogee": 3466.89455460351, "max_mach_number": 0.8640430507160658, "x_impact": 401.90575344583357, "initial_stability_margin": 2.639507681887447, "apogee_x": 341.32290578549976, "impact_velocity": -5.320863266570719, "out_of_rail_velocity": 25.897623992531745, "out_of_rail_stability_margin": 2.6998047415968345, "y_impact": 293.7836783941369, "t_final": 302.99057687391223, "out_of_rail_time": 0.3556493086933392} +{"apogee_time": 25.913524648944563, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 352.1866245797747, "apogee": 3475.0821113781394, "max_mach_number": 0.8703060733641762, "x_impact": 530.8000605854388, "initial_stability_margin": 2.6281434062252753, "apogee_x": 453.1609913303963, "impact_velocity": -5.299702579022584, "out_of_rail_velocity": 26.008200444813813, "out_of_rail_stability_margin": 2.6884839421255275, "y_impact": 412.68151482528276, "t_final": 304.5920628865872, "out_of_rail_time": 0.35476184073976363} +{"apogee_time": 25.47364265368463, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 378.9093830054232, "apogee": 3309.5601743527404, "max_mach_number": 0.8306166261366903, "x_impact": 663.265266896128, "initial_stability_margin": 2.7011326493961954, "apogee_x": 565.5471604699197, "impact_velocity": -5.440139262807693, "out_of_rail_velocity": 25.361609621671683, "out_of_rail_stability_margin": 2.7613666920022855, "y_impact": 444.5089096927919, "t_final": 289.1863697786083, "out_of_rail_time": 0.3617335907606832} +{"apogee_time": 26.03913951405725, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 450.84583405950565, "apogee": 3551.981338647102, "max_mach_number": 0.9006755408364229, "x_impact": 762.859405923051, "initial_stability_margin": 2.5733568233321105, "apogee_x": 658.1788727802178, "impact_velocity": -5.197716495330529, "out_of_rail_velocity": 26.483317497486777, "out_of_rail_stability_margin": 2.633672404408671, "y_impact": 522.7979350302123, "t_final": 314.1621274931377, "out_of_rail_time": 0.34931341026228974} +{"apogee_time": 25.870816693086553, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 417.9823835983224, "apogee": 3470.2953984489895, "max_mach_number": 0.8743855387953094, "x_impact": 697.1628512293883, "initial_stability_margin": 2.621690352821027, "apogee_x": 598.5342762898558, "impact_velocity": -5.2859950760642045, "out_of_rail_velocity": 26.061476132020534, "out_of_rail_stability_margin": 2.682171719651659, "y_impact": 487.0331633404199, "t_final": 305.10664697842753, "out_of_rail_time": 0.3545284770550771} +{"apogee_time": 26.192025457358625, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 344.583556015948, "apogee": 3542.4347254152285, "max_mach_number": 0.877082430442044, "x_impact": 557.6244264758024, "initial_stability_margin": 2.5917096243397277, "apogee_x": 479.59109061070274, "impact_velocity": -5.3910329472853356, "out_of_rail_velocity": 26.08239774130821, "out_of_rail_stability_margin": 2.652180561000843, "y_impact": 400.75996990273063, "t_final": 311.50061074302357, "out_of_rail_time": 0.3539396537100363} +{"apogee_time": 26.38528863383306, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 310.1247051483023, "apogee": 3621.894575060342, "max_mach_number": 0.8972433704271006, "x_impact": 491.57804654170087, "initial_stability_margin": 2.5550488441682413, "apogee_x": 422.94422288885914, "impact_velocity": -5.321336171501043, "out_of_rail_velocity": 26.405180795129187, "out_of_rail_stability_margin": 2.6155360382738753, "y_impact": 360.58632173235554, "t_final": 319.4709753722658, "out_of_rail_time": 0.3505067640492793} +{"apogee_time": 26.42243553656602, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 366.1820472682733, "apogee": 3643.5677486393392, "max_mach_number": 0.9056798158051775, "x_impact": 546.0000725426823, "initial_stability_margin": 2.5398338224902592, "apogee_x": 471.1738268068281, "impact_velocity": -5.293080333062906, "out_of_rail_velocity": 26.53874048844143, "out_of_rail_stability_margin": 2.600316757614351, "y_impact": 424.47332415265186, "t_final": 322.3000709141419, "out_of_rail_time": 0.3490993824675658} +{"apogee_time": 26.427238402870447, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 259.44289892531054, "apogee": 3636.661053792864, "max_mach_number": 0.8992765635667839, "x_impact": 413.39760196000407, "initial_stability_margin": 2.5513202725311195, "apogee_x": 355.0643686147062, "impact_velocity": -5.31421457833411, "out_of_rail_velocity": 26.437344341858143, "out_of_rail_stability_margin": 2.611813454685059, "y_impact": 302.1655550170221, "t_final": 320.6605448267891, "out_of_rail_time": 0.3501677744494032} +{"apogee_time": 26.020279165150885, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 395.29611849173955, "apogee": 3481.683759620324, "max_mach_number": 0.86499243740907, "x_impact": 684.3616665567201, "initial_stability_margin": 2.61364577568234, "apogee_x": 590.019755294857, "impact_velocity": -5.433341474024117, "out_of_rail_velocity": 25.887511525713546, "out_of_rail_stability_margin": 2.6742746097592147, "y_impact": 458.6244862978906, "t_final": 306.1809682483833, "out_of_rail_time": 0.3567392721579912} +{"apogee_time": 26.498787171058243, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 466.91328796236587, "apogee": 3709.637243335793, "max_mach_number": 0.935995387436571, "x_impact": 782.2970604325018, "initial_stability_margin": 2.4844040631795625, "apogee_x": 681.6246473627643, "impact_velocity": -5.191222137457087, "out_of_rail_velocity": 27.028811800658858, "out_of_rail_stability_margin": 2.5449614569687484, "y_impact": 536.1260147072993, "t_final": 331.85873779577366, "out_of_rail_time": 0.34440219133707684} +{"apogee_time": 24.27219639222911, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 294.9737294057642, "apogee": 2955.8423109017554, "max_mach_number": 0.7614058880042425, "x_impact": 485.0423041077597, "initial_stability_margin": 2.529993539979519, "apogee_x": 410.49542146827764, "impact_velocity": -5.359138122982831, "out_of_rail_velocity": 24.285742250078115, "out_of_rail_stability_margin": 2.5911657209104466, "y_impact": 348.6280595464267, "t_final": 278.2084795010637, "out_of_rail_time": 0.3755839498680171} +{"apogee_time": 26.377290511458842, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 434.5645715805577, "apogee": 3638.439675423297, "max_mach_number": 0.9099967880691838, "x_impact": 717.2879851938558, "initial_stability_margin": 2.533268966720172, "apogee_x": 622.2957688641773, "impact_velocity": -5.27938995907804, "out_of_rail_velocity": 26.604821400715625, "out_of_rail_stability_margin": 2.5937710377609755, "y_impact": 501.06472925832304, "t_final": 322.85178227353003, "out_of_rail_time": 0.34842602699406466} +{"apogee_time": 24.532320487032045, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 267.23280754662494, "apogee": 3041.7179541115925, "max_mach_number": 0.7803547175103841, "x_impact": 430.1549293382019, "initial_stability_margin": 2.494427680119047, "apogee_x": 364.404048470497, "impact_velocity": -5.289853777650066, "out_of_rail_velocity": 24.602466497668306, "out_of_rail_stability_margin": 2.55551747202887, "y_impact": 315.5323961996114, "t_final": 285.8409379465898, "out_of_rail_time": 0.3711999579744845} +{"apogee_time": 24.60082667311145, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 316.408534719506, "apogee": 3067.8884586761083, "max_mach_number": 0.7882672307156239, "x_impact": 478.94153581883023, "initial_stability_margin": 2.479659926445012, "apogee_x": 407.0900770925906, "impact_velocity": -5.261765159284362, "out_of_rail_velocity": 24.72649832056623, "out_of_rail_stability_margin": 2.540729281564248, "y_impact": 372.42055400525555, "t_final": 288.750847955563, "out_of_rail_time": 0.36949686115356306} +{"apogee_time": 24.072527166346568, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 337.2495847341105, "apogee": 2895.7829581614665, "max_mach_number": 0.7503799014560844, "x_impact": 593.342759379838, "initial_stability_margin": 2.551264669959128, "apogee_x": 503.3237016790796, "impact_velocity": -5.401196254786409, "out_of_rail_velocity": 24.107664775991793, "out_of_rail_stability_margin": 2.6124234567362006, "y_impact": 397.6863665858757, "t_final": 272.7877036070494, "out_of_rail_time": 0.37801115188501233} +{"apogee_time": 24.578603413012758, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 223.72855883392563, "apogee": 3056.2291199713504, "max_mach_number": 0.7822504198727366, "x_impact": 362.10223851099573, "initial_stability_margin": 2.4908096012912373, "apogee_x": 306.1540538194624, "impact_velocity": -5.282774327679849, "out_of_rail_velocity": 24.634470325381045, "out_of_rail_stability_margin": 2.5518857167199656, "y_impact": 264.6584279329134, "t_final": 286.92494554201045, "out_of_rail_time": 0.37072437912878053} +{"apogee_time": 24.811727228020537, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 408.0125219788039, "apogee": 3157.6234204336233, "max_mach_number": 0.8173428913854283, "x_impact": 692.6453368247328, "initial_stability_margin": 2.425829795767908, "apogee_x": 595.5648743921486, "impact_velocity": -5.160509317717653, "out_of_rail_velocity": 25.19100024210775, "out_of_rail_stability_margin": 2.486931787297102, "y_impact": 474.789450734318, "t_final": 299.04380122665043, "out_of_rail_time": 0.3638600765175101} +{"apogee_time": 25.958613404779403, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 338.59634626911094, "apogee": 3467.075127714534, "max_mach_number": 0.8617539854104059, "x_impact": 555.3314118134964, "initial_stability_margin": 2.6870090619960134, "apogee_x": 471.2509776583743, "impact_velocity": -5.388710879733942, "out_of_rail_velocity": 25.857119782420277, "out_of_rail_stability_margin": 2.746740051182777, "y_impact": 399.1604902832354, "t_final": 299.8029798847942, "out_of_rail_time": 0.3568030594641892} +{"apogee_time": 24.575820617837707, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 376.0062692533143, "apogee": 3067.1991111612087, "max_mach_number": 0.7923445098358876, "x_impact": 629.6560400860981, "initial_stability_margin": 2.4732915742787935, "apogee_x": 538.3676676589618, "impact_velocity": -5.2481558095484875, "out_of_rail_velocity": 24.7910257036731, "out_of_rail_stability_margin": 2.534376419669247, "y_impact": 439.89777997992803, "t_final": 289.5252388242994, "out_of_rail_time": 0.3687058396856042} +{"apogee_time": 26.164384295041568, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 305.0649226455695, "apogee": 3548.8176488400886, "max_mach_number": 0.881956495275118, "x_impact": 489.931623314311, "initial_stability_margin": 2.650732634234811, "apogee_x": 416.0438316076153, "impact_velocity": -5.319044112871351, "out_of_rail_velocity": 26.179766139739886, "out_of_rail_stability_margin": 2.7103148598344373, "y_impact": 359.3923532179161, "t_final": 307.59199436634646, "out_of_rail_time": 0.35254255720236444} +{"apogee_time": 26.203117610925393, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 360.32974791246784, "apogee": 3570.8846209112976, "max_mach_number": 0.8902945638672067, "x_impact": 544.4722963979237, "initial_stability_margin": 2.635673335371023, "apogee_x": 463.64630849724966, "impact_velocity": -5.290800453046274, "out_of_rail_velocity": 26.316571964169352, "out_of_rail_stability_margin": 2.695264521451743, "y_impact": 423.3079058901659, "t_final": 310.2186502899685, "out_of_rail_time": 0.35114678391446297} +{"apogee_time": 25.786658654628962, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 388.4305704197817, "apogee": 3407.705091189688, "max_mach_number": 0.8500902223915066, "x_impact": 681.8936282398587, "initial_stability_margin": 2.7087217558764816, "apogee_x": 579.7655725559082, "impact_velocity": -5.431001176337518, "out_of_rail_velocity": 25.67399042301209, "out_of_rail_stability_margin": 2.76826596274578, "y_impact": 456.9605203900305, "t_final": 294.86877686929193, "out_of_rail_time": 0.35824564057365227} +{"apogee_time": 26.206684050213614, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 255.234214174008, "apogee": 3563.4953643070944, "max_mach_number": 0.883949728380616, "x_impact": 411.9902582334079, "initial_stability_margin": 2.647046576525475, "apogee_x": 349.2934971495751, "impact_velocity": -5.311925588361345, "out_of_rail_velocity": 26.21248512236048, "out_of_rail_stability_margin": 2.706636619739713, "y_impact": 301.11334753759877, "t_final": 308.6957514979758, "out_of_rail_time": 0.3522004142070113} +{"apogee_time": 26.311208009976543, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 460.515762274401, "apogee": 3644.6638253694764, "max_mach_number": 0.9209775855920568, "x_impact": 781.8079918684482, "initial_stability_margin": 2.580848891181104, "apogee_x": 672.2983150798426, "impact_velocity": -5.18898572688288, "out_of_rail_velocity": 26.833604470717216, "out_of_rail_stability_margin": 2.640504992064188, "y_impact": 535.819675792728, "t_final": 319.76800226471096, "out_of_rail_time": 0.34629586231494247} +{"apogee_time": 25.336425438265167, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 322.28429763328006, "apogee": 3271.484514572941, "max_mach_number": 0.8226798601707791, "x_impact": 526.1724343128774, "initial_stability_margin": 2.674403354549913, "apogee_x": 448.53723760541374, "impact_velocity": -5.410079754708304, "out_of_rail_velocity": 25.26924347015018, "out_of_rail_stability_margin": 2.734409950374756, "y_impact": 378.18566473848773, "t_final": 293.96912253523163, "out_of_rail_time": 0.3631411312168077} +{"apogee_time": 26.160722583220675, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 427.6013902087233, "apogee": 3566.2305481425688, "max_mach_number": 0.894579817035713, "x_impact": 715.3719409511674, "initial_stability_margin": 2.62921728034253, "apogee_x": 612.3229146543076, "impact_velocity": -5.2771159889668215, "out_of_rail_velocity": 26.408686697448697, "out_of_rail_stability_margin": 2.6888707745887173, "y_impact": 499.71671572559586, "t_final": 310.8992390984097, "out_of_rail_time": 0.3506881973410304} +{"apogee_time": 25.562688443749554, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 290.9192554419351, "apogee": 3354.83309714275, "max_mach_number": 0.8422535999290552, "x_impact": 465.1231665179335, "initial_stability_margin": 2.63837239693142, "apogee_x": 396.73173490598407, "impact_velocity": -5.340136652285424, "out_of_rail_velocity": 25.572765926199747, "out_of_rail_stability_margin": 2.6983869508370257, "y_impact": 341.1697688592056, "t_final": 301.8651023044521, "out_of_rail_time": 0.3593441830379009} +{"apogee_time": 25.6133052513154, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 343.87117704679827, "apogee": 3378.5469213002866, "max_mach_number": 0.8504037966829918, "x_impact": 517.0787594746364, "initial_stability_margin": 2.623412664669129, "apogee_x": 442.4573515767495, "impact_velocity": -5.311780964225073, "out_of_rail_velocity": 25.71000136350811, "out_of_rail_stability_margin": 2.683457131354476, "y_impact": 402.0230787945944, "t_final": 304.67848601352046, "out_of_rail_time": 0.35797446962259133} +{"apogee_time": 25.1484915502913, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 369.12263103249114, "apogee": 3210.485697419859, "max_mach_number": 0.8111642305278396, "x_impact": 644.8854260412185, "initial_stability_margin": 2.695965949048401, "apogee_x": 550.9330790377928, "impact_velocity": -5.4525378012009105, "out_of_rail_velocity": 25.14978463180546, "out_of_rail_stability_margin": 2.756084952432545, "y_impact": 432.1693434300056, "t_final": 288.81967808551946, "out_of_rail_time": 0.3661239118101485} +{"apogee_time": 25.60626153685492, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 243.4680392126743, "apogee": 3369.4211415868745, "max_mach_number": 0.8441917176624528, "x_impact": 391.3352929990179, "initial_stability_margin": 2.634711014165747, "apogee_x": 333.1790536777814, "impact_velocity": -5.332989895152956, "out_of_rail_velocity": 25.606524914014845, "out_of_rail_stability_margin": 2.69475305932367, "y_impact": 286.00490154093956, "t_final": 303.06183232607657, "out_of_rail_time": 0.35907273361187264} +{"apogee_time": 25.758536040331443, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 440.920338068724, "apogee": 3458.662880066317, "max_mach_number": 0.8804784094106384, "x_impact": 744.4019296405096, "initial_stability_margin": 2.568941169794474, "apogee_x": 643.68096920741, "impact_velocity": -5.209562238633345, "out_of_rail_velocity": 26.182471750996008, "out_of_rail_stability_margin": 2.6289732548047553, "y_impact": 510.1854318021825, "t_final": 314.65347176495595, "out_of_rail_time": 0.35246881331984004} +{"apogee_time": 27.15294386824686, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 370.9955380985505, "apogee": 3872.009924816829, "max_mach_number": 0.9469912477564397, "x_impact": 599.310157320875, "initial_stability_margin": 2.7865046076855444, "apogee_x": 516.3004294021479, "impact_velocity": -5.347701148754101, "out_of_rail_velocity": 27.283978258094812, "out_of_rail_stability_margin": 2.840280046631798, "y_impact": 430.73964350436677, "t_final": 328.33019116064133, "out_of_rail_time": 0.3410988621688339} +{"apogee_time": 25.576036614538488, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 408.3443248576266, "apogee": 3375.424426786509, "max_mach_number": 0.8546191922400836, "x_impact": 679.6355300400245, "initial_stability_margin": 2.61700059540678, "apogee_x": 584.7181181054233, "impact_velocity": -5.298042225115678, "out_of_rail_velocity": 25.768229799404576, "out_of_rail_stability_margin": 2.6770322422142594, "y_impact": 474.75701549705803, "t_final": 305.53688956179093, "out_of_rail_time": 0.3570912176350258} +{"apogee_time": 27.265314898549214, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 331.65585475690176, "apogee": 3932.744558259616, "max_mach_number": 0.9667222986428445, "x_impact": 524.9062516283714, "initial_stability_margin": 2.7506350655722636, "apogee_x": 452.26447374413635, "impact_velocity": -5.278564704945651, "out_of_rail_velocity": 27.6152588431108, "out_of_rail_stability_margin": 2.804599397498833, "y_impact": 385.0771635231848, "t_final": 335.3866325142773, "out_of_rail_time": 0.33850228203927} +{"apogee_time": 27.263975393767506, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 390.4548944471435, "apogee": 3944.834476015806, "max_mach_number": 0.9748851929831519, "x_impact": 581.5996421321424, "initial_stability_margin": 2.7357405723167427, "apogee_x": 502.37797372426724, "impact_velocity": -5.250536049463581, "out_of_rail_velocity": 27.754385864071182, "out_of_rail_stability_margin": 2.7897044929554187, "y_impact": 452.1704286625361, "t_final": 337.77053471650873, "out_of_rail_time": 0.33714335789507166} +{"apogee_time": 27.02300124760306, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 427.1575251312973, "apogee": 3819.653919528388, "max_mach_number": 0.9349906836888957, "x_impact": 738.2763914668285, "initial_stability_margin": 2.8079805277160026, "apogee_x": 637.511445656889, "impact_velocity": -5.389669512793884, "out_of_rail_velocity": 27.09000096668971, "out_of_rail_stability_margin": 2.861765468757938, "y_impact": 494.79857496975836, "t_final": 323.47785958524213, "out_of_rail_time": 0.3432417083048861} +{"apogee_time": 27.213498853350526, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 493.1071599026656, "apogee": 3978.425804418589, "max_mach_number": 1.0045926160384788, "x_impact": 826.5355039528059, "initial_stability_margin": 2.6815558503143015, "apogee_x": 719.8619417937595, "impact_velocity": -5.149496215372103, "out_of_rail_velocity": 28.276828183900353, "out_of_rail_stability_margin": 2.7353573390697528, "y_impact": 566.4632924137723, "t_final": 345.7613343190049, "out_of_rail_time": 0.3316142243294887} +{"apogee_time": 27.299322182691135, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 277.2854549921473, "apogee": 3945.8943317138846, "max_mach_number": 0.968696410185045, "x_impact": 441.16225395336323, "initial_stability_margin": 2.7469939578259566, "apogee_x": 379.4327120931804, "impact_velocity": -5.271500373534034, "out_of_rail_velocity": 27.648098134753706, "out_of_rail_stability_margin": 2.800962925163449, "y_impact": 322.4972736398409, "t_final": 336.5648026061781, "out_of_rail_time": 0.33816590820418685} +{"apogee_time": 27.57488416391662, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 382.1590086794798, "apogee": 4026.218273794639, "max_mach_number": 0.9843526187718534, "x_impact": 614.3769365057457, "initial_stability_margin": 2.5512035668766346, "apogee_x": 531.865607663472, "impact_velocity": -5.37888208670927, "out_of_rail_velocity": 27.807643633567633, "out_of_rail_stability_margin": 2.6077278126762615, "y_impact": 441.60156694201476, "t_final": 340.90639046683606, "out_of_rail_time": 0.33596305016061534} +{"apogee_time": 27.197228570498318, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 462.6859524882531, "apogee": 3933.637618391808, "max_mach_number": 0.9790498714226148, "x_impact": 763.400088151078, "initial_stability_margin": 2.7293991792448056, "apogee_x": 662.5071058909853, "impact_velocity": -5.236955609959402, "out_of_rail_velocity": 27.829269306390653, "out_of_rail_stability_margin": 2.7833841545917997, "y_impact": 533.3016482966196, "t_final": 337.9927614865427, "out_of_rail_time": 0.3365176076437752} +{"apogee_time": 27.649476793284748, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 340.66999298023404, "apogee": 4077.648818806288, "max_mach_number": 1.003980226383474, "x_impact": 536.7644877424034, "initial_stability_margin": 2.514130654603579, "apogee_x": 464.58876068897933, "impact_velocity": -5.309342402934963, "out_of_rail_velocity": 28.142250508215515, "out_of_rail_stability_margin": 2.570654184442503, "y_impact": 393.7021783082324, "t_final": 347.6574384482317, "out_of_rail_time": 0.3327707643940963} +{"apogee_time": 27.63323769634615, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 400.6343447010285, "apogee": 4085.570217799794, "max_mach_number": 1.012036077117322, "x_impact": 594.1294074658903, "initial_stability_margin": 2.4987467372411887, "apogee_x": 515.4920689519403, "impact_velocity": -5.281150267343533, "out_of_rail_velocity": 28.287594999047418, "out_of_rail_stability_margin": 2.555262672668159, "y_impact": 461.94550860167726, "t_final": 349.80217113213916, "out_of_rail_time": 0.3314914176622975} +{"apogee_time": 27.471171935006787, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 440.9682120781609, "apogee": 3980.1876967245794, "max_mach_number": 0.9725613832105319, "x_impact": 758.6157474029354, "initial_stability_margin": 2.573382599001986, "apogee_x": 658.1597164460511, "impact_velocity": -5.421095235930593, "out_of_rail_velocity": 27.60053786920468, "out_of_rail_stability_margin": 2.629893243840378, "y_impact": 508.39928108334436, "t_final": 336.19873131067715, "out_of_rail_time": 0.33781385569226774} +{"apogee_time": 27.529498991272156, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 503.99270822469236, "apogee": 4103.447821033351, "max_mach_number": 1.0407598012723542, "x_impact": 841.7215757466967, "initial_stability_margin": 2.4426800191860267, "apogee_x": 735.7473640318566, "impact_velocity": -5.17952127082028, "out_of_rail_velocity": 28.793570890507542, "out_of_rail_stability_margin": 2.499343875610508, "y_impact": 576.8888568332869, "t_final": 357.14448645057234, "out_of_rail_time": 0.32753032485011857} +{"apogee_time": 27.67941532938164, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 284.74863818552546, "apogee": 4090.017982779885, "max_mach_number": 1.005929928330099, "x_impact": 450.94899740077227, "initial_stability_margin": 2.5103582189313474, "apogee_x": 389.68122430362746, "impact_velocity": -5.302236860267732, "out_of_rail_velocity": 28.17616334831855, "out_of_rail_stability_margin": 2.566886310913089, "y_impact": 329.6134364150803, "t_final": 348.6354185248475, "out_of_rail_time": 0.33245907713914424} +{"apogee_time": 25.521795894945523, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 327.04176685334045, "apogee": 3328.206627386356, "max_mach_number": 0.8339762218630303, "x_impact": 538.1878035556493, "initial_stability_margin": 2.6169072925550205, "apogee_x": 455.186385547107, "impact_velocity": -5.415315718989664, "out_of_rail_velocity": 25.39555391304835, "out_of_rail_stability_margin": 2.679204531666556, "y_impact": 386.76780278761845, "t_final": 289.21207424388024, "out_of_rail_time": 0.3616325982129722} +{"apogee_time": 27.55739397328643, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 474.53002531952603, "apogee": 4071.8648187930753, "max_mach_number": 1.016120562658347, "x_impact": 779.9320506741584, "initial_stability_margin": 2.4920853440574136, "apogee_x": 679.5046417428566, "impact_velocity": -5.267490764752172, "out_of_rail_velocity": 28.39583463493487, "out_of_rail_stability_margin": 2.5486680841575637, "y_impact": 544.8450924470059, "t_final": 350.04131256346267, "out_of_rail_time": 0.33117230699589795} +{"apogee_time": 25.740391449239592, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 295.00612370453604, "apogee": 3410.5898782614136, "max_mach_number": 0.8536323699644754, "x_impact": 475.4001117574558, "initial_stability_margin": 2.5803005985704295, "apogee_x": 402.3352789024765, "impact_velocity": -5.345304893656401, "out_of_rail_velocity": 25.709880427958833, "out_of_rail_stability_margin": 2.642604575669675, "y_impact": 348.6843301763914, "t_final": 296.6966645750393, "out_of_rail_time": 0.3579789080065994} +{"apogee_time": 25.78521033925163, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 348.54959482128726, "apogee": 3432.9073664370653, "max_mach_number": 0.8616727940596184, "x_impact": 528.2361694870756, "initial_stability_margin": 2.5651067378246095, "apogee_x": 448.4993982207843, "impact_velocity": -5.3169217615919075, "out_of_rail_velocity": 25.832338070595124, "out_of_rail_stability_margin": 2.6275814527401233, "y_impact": 410.69659765204, "t_final": 299.4304620860693, "out_of_rail_time": 0.35719539501991354} +{"apogee_time": 25.33916142673025, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 374.7566921403976, "apogee": 3267.644046406958, "max_mach_number": 0.8224170096933137, "x_impact": 659.842578923284, "initial_stability_margin": 2.6388120033198215, "apogee_x": 559.3833482932464, "impact_velocity": -5.457814868138169, "out_of_rail_velocity": 25.208875367981598, "out_of_rail_stability_margin": 2.7010646876098483, "y_impact": 442.19592224902374, "t_final": 284.3318691392678, "out_of_rail_time": 0.36370184437524755} +{"apogee_time": 25.919904579654474, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 446.52016612388246, "apogee": 3511.3496504105556, "max_mach_number": 0.8919253390799635, "x_impact": 759.5689056936507, "initial_stability_margin": 2.509761060405003, "apogee_x": 651.8830614981522, "impact_velocity": -5.214604223137318, "out_of_rail_velocity": 26.31543931295063, "out_of_rail_stability_margin": 2.57207969405593, "y_impact": 520.5455511679166, "t_final": 308.8269782383393, "out_of_rail_time": 0.35131336229175697} +{"apogee_time": 25.33981950821106, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 322.43460423792317, "apogee": 3272.9980743748233, "max_mach_number": 0.8229361382293239, "x_impact": 526.0652238526428, "initial_stability_margin": 2.7232249682767127, "apogee_x": 448.7344223361111, "impact_velocity": -5.393598982418133, "out_of_rail_velocity": 25.291935018595975, "out_of_rail_stability_margin": 2.7815816933924014, "y_impact": 378.1321401036367, "t_final": 293.28169662095036, "out_of_rail_time": 0.36261294292034607} +{"apogee_time": 25.78374073876515, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 246.8872487580283, "apogee": 3425.309243927566, "max_mach_number": 0.8556109656571107, "x_impact": 400.0314733634232, "initial_stability_margin": 2.576578263128559, "apogee_x": 337.8900071816331, "impact_velocity": -5.338151215684825, "out_of_rail_velocity": 25.743010907792286, "out_of_rail_stability_margin": 2.638871001745241, "y_impact": 292.3811202384515, "t_final": 297.7877578373072, "out_of_rail_time": 0.35755487278840076} +{"apogee_time": 25.74571664713367, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 413.7955973128573, "apogee": 3429.1673283417113, "max_mach_number": 0.8658636351684522, "x_impact": 694.0699298257587, "initial_stability_margin": 2.558560767417777, "apogee_x": 592.5736988186428, "impact_velocity": -5.303169705796286, "out_of_rail_velocity": 25.89833266262157, "out_of_rail_stability_margin": 2.621052891922192, "y_impact": 484.84379402175, "t_final": 299.9160044341699, "out_of_rail_time": 0.35647824212232304} +{"apogee_time": 25.56665214622973, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 291.0569532462055, "apogee": 3356.513204662813, "max_mach_number": 0.8425422703477633, "x_impact": 465.0608337660791, "initial_stability_margin": 2.687563669371306, "apogee_x": 396.9051718203093, "impact_velocity": -5.323869005522245, "out_of_rail_velocity": 25.61283283491812, "out_of_rail_stability_margin": 2.7459731541057764, "y_impact": 341.16660022291495, "t_final": 301.11240896085627, "out_of_rail_time": 0.35901221574406983} +{"apogee_time": 25.61760539950971, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 344.07249121257263, "apogee": 3380.3998990295054, "max_mach_number": 0.8507292742223295, "x_impact": 517.0146911705763, "initial_stability_margin": 2.6727545421381147, "apogee_x": 442.6882112096111, "impact_velocity": -5.295599725817246, "out_of_rail_velocity": 25.736918125872638, "out_of_rail_stability_margin": 2.7311560666089796, "y_impact": 401.96648209790885, "t_final": 304.03542337719296, "out_of_rail_time": 0.35743148045407785} +{"apogee_time": 25.15254939071274, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 369.29692264779095, "apogee": 3211.730913899724, "max_mach_number": 0.8113568124900042, "x_impact": 644.6170030907731, "initial_stability_margin": 2.744569581248644, "apogee_x": 551.154057815528, "impact_velocity": -5.4359276517711095, "out_of_rail_velocity": 25.10507427626467, "out_of_rail_stability_margin": 2.8029036640055773, "y_impact": 432.0044900243995, "t_final": 288.1439552349787, "out_of_rail_time": 0.36486808719028974} +{"apogee_time": 25.761168395622914, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 441.1525978730533, "apogee": 3460.483436763525, "max_mach_number": 0.8808195980555658, "x_impact": 744.076177816173, "initial_stability_margin": 2.6188524060112215, "apogee_x": 644.0012379350349, "impact_velocity": -5.193692615278774, "out_of_rail_velocity": 26.22412688407546, "out_of_rail_stability_margin": 2.6772917506687057, "y_impact": 509.95700645708155, "t_final": 314.0186181464428, "out_of_rail_time": 0.3521099595510704} +{"apogee_time": 25.609826153292808, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 243.59775919857805, "apogee": 3371.132863471364, "max_mach_number": 0.8444888148766724, "x_impact": 391.4595921764137, "initial_stability_margin": 2.683941881839201, "apogee_x": 333.34465388579486, "impact_velocity": -5.316744023398092, "out_of_rail_velocity": 25.648447524106103, "out_of_rail_stability_margin": 2.7423757772879376, "y_impact": 286.13075614100484, "t_final": 302.2562827367029, "out_of_rail_time": 0.35872984037364464} +{"apogee_time": 28.070146848396927, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 395.8626003130482, "apogee": 4222.375743118641, "max_mach_number": 1.0362052024731907, "x_impact": 635.6346186558469, "initial_stability_margin": 2.591019630987745, "apogee_x": 550.8378001903411, "impact_velocity": -5.363486894130281, "out_of_rail_velocity": 28.789502705490484, "out_of_rail_stability_margin": 2.6406390672746713, "y_impact": 456.9175904767953, "t_final": 341.49095042741845, "out_of_rail_time": 0.3268134183289543} +{"apogee_time": 25.58054225837537, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 408.5300362186604, "apogee": 3377.1937104394833, "max_mach_number": 0.8549253584531659, "x_impact": 679.2282692573942, "initial_stability_margin": 2.666432787561273, "apogee_x": 584.9617658843488, "impact_velocity": -5.2819028398087475, "out_of_rail_velocity": 25.81023469724371, "out_of_rail_stability_margin": 2.724854314140478, "y_impact": 474.49579385665686, "t_final": 304.6799967780889, "out_of_rail_time": 0.35671651200560045} +{"apogee_time": 28.079347188483418, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 413.56471412610574, "apogee": 4269.589332925937, "max_mach_number": 1.064041089667264, "x_impact": 612.7001250982512, "initial_stability_margin": 2.5401530634886296, "apogee_x": 532.0314936062548, "impact_velocity": -5.266035004517141, "out_of_rail_velocity": 29.295764911164277, "out_of_rail_stability_margin": 2.589738742210988, "y_impact": 476.4705919103871, "t_final": 349.78445160746753, "out_of_rail_time": 0.32245734953497424} +{"apogee_time": 28.104453963197187, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 351.87081105268703, "apogee": 4263.588025692114, "max_mach_number": 1.055693713378575, "x_impact": 553.8772769742775, "initial_stability_margin": 2.5550754651820555, "apogee_x": 479.7718235668039, "impact_velocity": -5.294146423650126, "out_of_rail_velocity": 29.138931225617902, "out_of_rail_stability_margin": 2.6046776905777334, "y_impact": 406.34165510397935, "t_final": 347.7375447666867, "out_of_rail_time": 0.3237002367411424} +{"apogee_time": 27.99414865904085, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 457.6817967199399, "apogee": 4182.920136325717, "max_mach_number": 1.0244973402785178, "x_impact": 785.809372314506, "initial_stability_margin": 2.612524440192785, "apogee_x": 682.9861014044599, "impact_velocity": -5.405579177746387, "out_of_rail_velocity": 28.59798552260903, "out_of_rail_stability_margin": 2.6621716669817848, "y_impact": 526.7248924698941, "t_final": 337.38608935637046, "out_of_rail_time": 0.32884638362130486} +{"apogee_time": 27.974925850679845, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 520.5130914883945, "apogee": 4290.772064395296, "max_mach_number": 1.0951200144460975, "x_impact": 867.620470443906, "initial_stability_margin": 2.4857879740123106, "apogee_x": 759.7658213630477, "impact_velocity": -5.164696983684008, "out_of_rail_velocity": 29.822778231601426, "out_of_rail_stability_margin": 2.5352957679262866, "y_impact": 594.6795002538793, "t_final": 357.1606616200625, "out_of_rail_time": 0.31779992130625867} +{"apogee_time": 28.13257750680665, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 294.04214463131973, "apogee": 4275.780444767421, "max_mach_number": 1.0577376834872751, "x_impact": 465.386795955302, "initial_stability_margin": 2.551420538419892, "apogee_x": 402.3119074331856, "impact_velocity": -5.287061220844033, "out_of_rail_velocity": 29.173641843691147, "out_of_rail_stability_margin": 2.6010146444871074, "y_impact": 340.1854313904601, "t_final": 348.53528351730904, "out_of_rail_time": 0.32334855910308585} +{"apogee_time": 26.945407781480622, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 365.0709862345764, "apogee": 3797.8592804766095, "max_mach_number": 0.9302782563676851, "x_impact": 589.2133052856075, "initial_stability_margin": 2.695372376972446, "apogee_x": 508.0440575144592, "impact_velocity": -5.330253153337624, "out_of_rail_velocity": 26.996127311047402, "out_of_rail_stability_margin": 2.7501409153333722, "y_impact": 423.49678732982676, "t_final": 327.08317490761976, "out_of_rail_time": 0.34408656911534885} +{"apogee_time": 28.001956674087282, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 489.7927311929474, "apogee": 4254.976321154074, "max_mach_number": 1.0683033605149226, "x_impact": 803.6340984201669, "initial_stability_margin": 2.533730561783394, "apogee_x": 701.245192196669, "impact_velocity": -5.252414603468139, "out_of_rail_velocity": 29.364109750458546, "out_of_rail_stability_margin": 2.5833172329415603, "y_impact": 561.4753465401692, "t_final": 349.8536665626144, "out_of_rail_time": 0.32180356196832915} +{"apogee_time": 27.086524587367414, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 385.14133762120724, "apogee": 3878.519677929633, "max_mach_number": 0.958497780889584, "x_impact": 573.1314778794728, "initial_stability_margin": 2.6445013061109317, "apogee_x": 495.52587107017973, "impact_velocity": -5.233405184347109, "out_of_rail_velocity": 27.467529912893912, "out_of_rail_stability_margin": 2.6992805440298997, "y_impact": 445.6144122582013, "t_final": 336.97387207989044, "out_of_rail_time": 0.33932871486193766} +{"apogee_time": 26.798144517667616, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 419.83559075579876, "apogee": 3741.5806692424057, "max_mach_number": 0.9181341085362791, "x_impact": 725.0618527843064, "initial_stability_margin": 2.7168871345565764, "apogee_x": 626.5711787827718, "impact_velocity": -5.372084551521891, "out_of_rail_velocity": 26.79717812039717, "out_of_rail_stability_margin": 2.7716325118966894, "y_impact": 485.9578532465628, "t_final": 321.94748197544675, "out_of_rail_time": 0.34609023932491134} +{"apogee_time": 27.07904902144725, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 326.98386978494096, "apogee": 3864.4555405594265, "max_mach_number": 0.950308808084393, "x_impact": 517.1209433916624, "initial_stability_margin": 2.659425965202971, "apogee_x": 445.8933744074441, "impact_velocity": -5.261342374529414, "out_of_rail_velocity": 27.326553138743435, "out_of_rail_stability_margin": 2.7142008997405775, "y_impact": 379.3529371373033, "t_final": 334.4701112749585, "out_of_rail_time": 0.3406689270087771} +{"apogee_time": 27.057478088989075, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 487.21758822706096, "apogee": 3917.7906887674108, "max_mach_number": 0.9881215863800564, "x_impact": 815.8263855316495, "initial_stability_margin": 2.5901702093318937, "apogee_x": 711.2245010221756, "impact_velocity": -5.132695660960224, "out_of_rail_velocity": 27.975767448198482, "out_of_rail_stability_margin": 2.6449450697556753, "y_impact": 559.162004774938, "t_final": 345.1715712965334, "out_of_rail_time": 0.3344085945384563} +{"apogee_time": 25.214059889664036, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 319.54703826363476, "apogee": 3233.5300313574667, "max_mach_number": 0.8153177352469997, "x_impact": 523.4581867094079, "initial_stability_margin": 2.75749623567893, "apogee_x": 444.7887530376873, "impact_velocity": -5.334675554602964, "out_of_rail_velocity": 25.09044764485964, "out_of_rail_stability_margin": 2.8207826576118755, "y_impact": 376.20210198201187, "t_final": 297.5126952918855, "out_of_rail_time": 0.3649550805179192} +{"apogee_time": 27.115580311742146, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 273.3847773096759, "apogee": 3877.9927975324085, "max_mach_number": 0.9522961577452134, "x_impact": 434.53488458253923, "initial_stability_margin": 2.655774094734295, "apogee_x": 374.0920670817921, "impact_velocity": -5.254301089050192, "out_of_rail_velocity": 27.365588282748377, "out_of_rail_stability_margin": 2.710562991209756, "y_impact": 317.66806924730435, "t_final": 335.5342828673326, "out_of_rail_time": 0.3403859439631548} +{"apogee_time": 27.023857440399205, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 456.5329939210652, "apogee": 3868.533010904472, "max_mach_number": 0.9626893345369503, "x_impact": 752.4662836436853, "initial_stability_margin": 2.6381137476237226, "apogee_x": 653.6696298949961, "impact_velocity": -5.219869191111875, "out_of_rail_velocity": 27.535290823915876, "out_of_rail_stability_margin": 2.6929008270417314, "y_impact": 525.7064006434521, "t_final": 337.1513517751605, "out_of_rail_time": 0.3386254332926586} +{"apogee_time": 25.495424667947766, "lateral_surface_wind": 0.0, "frontal_surface_wind": 0.0, "apogee_y": 341.11703590325453, "apogee": 3340.7069568032052, "max_mach_number": 0.8428083893070248, "x_impact": 514.6738507320622, "initial_stability_margin": 2.7057821375198414, "apogee_x": 438.972821163565, "impact_velocity": -5.237747610710097, "out_of_rail_velocity": 25.532086296731332, "out_of_rail_stability_margin": 2.76913164268824, "y_impact": 400.091876622763, "t_final": 308.4122161816638, "out_of_rail_time": 0.35989472043887494} diff --git a/docs/notebooks/monte_carlo_analysis/monte_carlo_class_usage.ipynb b/docs/notebooks/monte_carlo_analysis/monte_carlo_class_usage.ipynb index 5e1150f73..6d1444a39 100644 --- a/docs/notebooks/monte_carlo_analysis/monte_carlo_class_usage.ipynb +++ b/docs/notebooks/monte_carlo_analysis/monte_carlo_class_usage.ipynb @@ -28,9 +28,18 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 18, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The autoreload extension is already loaded. To reload it, use:\n", + " %reload_ext autoreload\n" + ] + } + ], "source": [ "# We import these lines for debugging purposes, only works on Jupyter Notebook\n", "%load_ext autoreload\n", @@ -47,7 +56,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -76,7 +85,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 20, "metadata": {}, "outputs": [], "source": [ @@ -106,17 +115,9 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 21, "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/phmb/github/RocketPy/rocketpy/mathutils/function.py:3125: UserWarning: Extrapolation method set to 'constant' because the linear method is not supported.\n", - " warnings.warn(\n" - ] - }, { "name": "stdout", "output_type": "stream", @@ -224,13 +225,13 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "d84184a4d6cd4b308effd022952bd8b0", + "model_id": "685a3b62329e459697af492122e2bdf0", "version_major": 2, "version_minor": 0 }, @@ -303,7 +304,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 23, "metadata": {}, "outputs": [ { @@ -360,7 +361,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 24, "metadata": {}, "outputs": [ { @@ -408,7 +409,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 25, "metadata": {}, "outputs": [ { @@ -500,14 +501,14 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[7093.420133006473, 7575.9811666258265, 6351.320054638862, 6123.550282734476, 5674.177733305354]\n" + "[6568.746253429183, 6633.224994161791, 8344.448028210354, 5347.76848772074, 8040.352096788948]\n" ] } ], @@ -537,7 +538,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 27, "metadata": {}, "outputs": [ { @@ -590,7 +591,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 28, "metadata": {}, "outputs": [], "source": [ @@ -640,7 +641,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 29, "metadata": {}, "outputs": [], "source": [ @@ -678,7 +679,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 30, "metadata": {}, "outputs": [ { @@ -729,7 +730,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 31, "metadata": {}, "outputs": [ { @@ -776,18 +777,9 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 32, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/phmb/github/RocketPy/rocketpy/simulation/monte_carlo.py:132: UserWarning: This class is still under testing and some attributes may be changed in next versions\n", - " warnings.warn(\n" - ] - } - ], + "outputs": [], "source": [ "test_dispersion = MonteCarlo(\n", " filename=\"monte_carlo_analysis_outputs/monte_carlo_class_example\",\n", @@ -810,21 +802,24 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 35, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Completed 10 iterations. Total wall time: 7.4 s \n", + "Starting Monte Carlo analysis\n", + "Current iteration: 000099 | Average Time per Iteration: 0.790 s | Estimated time left: 0 ss\n", + "Completed 100 iterations. In total, 100 simulations are exported.\n", + "Total wall time: 82.0 s\n", "Results saved to /home/phmb/github/RocketPy/docs/notebooks/monte_carlo_analysis/monte_carlo_analysis_outputs/monte_carlo_class_example.outputs.txt\n" ] } ], "source": [ "test_dispersion.simulate(\n", - " number_of_simulations=10,\n", + " number_of_simulations=100,\n", " append=False,\n", " parallel=True,\n", " n_workers=None,\n", @@ -868,18 +863,58 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 36, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "100" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "test_dispersion.num_of_loaded_sims" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 37, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Monte Carlo Simulation by RocketPy\n", + "Data Source: monte_carlo_analysis_outputs/monte_carlo_class_example\n", + "Number of simulations: 100\n", + "Results: \n", + "\n", + " Parameter Mean Std. Dev.\n", + "------------------------------------------------------------\n", + " apogee_time 26.104 1.244\n", + " lateral_surface_wind 0.000 0.000\n", + " frontal_surface_wind 0.000 0.000\n", + " apogee_y 362.321 73.352\n", + " apogee 3558.189 420.065\n", + " max_mach_number 0.893 0.094\n", + " x_impact 592.020 131.749\n", + " initial_stability_margin 2.614 0.099\n", + " apogee_x 508.861 116.802\n", + " impact_velocity -5.299 0.077\n", + " out_of_rail_velocity 26.396 1.568\n", + "out_of_rail_stability_margin 2.673 0.096\n", + " y_impact 421.722 82.320\n", + " t_final 313.548 23.469\n", + " out_of_rail_time 0.352 0.017\n" + ] + } + ], "source": [ "test_dispersion.prints.all()" ] diff --git a/rocketpy/simulation/monte_carlo.py b/rocketpy/simulation/monte_carlo.py index 3e54bc136..2d2f3aea0 100644 --- a/rocketpy/simulation/monte_carlo.py +++ b/rocketpy/simulation/monte_carlo.py @@ -221,7 +221,7 @@ def simulate( self._initial_sim_idx = self.num_of_loaded_sims if append else 0 # Begin display - MonteCarlo._reprint("Starting Monte Carlo analysis", end="\r") + MonteCarlo._reprint("Starting Monte Carlo analysis") # Setup files self.__setup_files(append) @@ -304,17 +304,19 @@ def __run_in_serial(self): self._output_file, ) - sim_monitor.update_status(sim_monitor.count, end="\r", flush=True) + sim_monitor.update_status(sim_monitor.count) sim_monitor.finalize_status() except KeyboardInterrupt: - print("Keyboard Interrupt, files saved.") + MonteCarlo._reprint("Keyboard Interrupt, files saved.") with open(self._error_file, "a", encoding="utf-8") as file: file.write(json.dumps(inputs_dict, cls=RocketPyEncoder) + "\n") except Exception as error: - print(f"Error on iteration {self.__sim_monitor.count}: {error}") + MonteCarlo._reprint( + f"Error on iteration {self.__sim_monitor.count}: {error}" + ) with open(self._error_file, "a", encoding="utf-8") as file: file.write(json.dumps(inputs_dict, cls=RocketPyEncoder) + "\n") raise error @@ -455,14 +457,16 @@ def __sim_producer( export_queue.put((inputs_dict, outputs_dict)) - sim_monitor.update_status(sim_idx, end="\r", flush=True) + mutex.acquire() + sim_monitor.update_status(sim_idx) + mutex.release() except Exception as error: mutex.acquire() with open(error_file, "a", encoding="utf-8") as file: file.write(json.dumps(inputs_dict, cls=RocketPyEncoder) + "\n") - print(f"Error on iteration {sim_idx}: {error}") + MonteCarlo._reprint(f"Error on iteration {sim_idx}: {error}") mutex.release() raise error @@ -477,7 +481,7 @@ def __sim_consumer( ): """Simulation consumer to be used in parallel by multiprocessing. It consumes the results from the queue and writes them to the files. - If no results are received for 10 seconds, a TimeoutError is raised. + If no results are received for 30 seconds, a TimeoutError is raised. Parameters ---------- @@ -496,7 +500,7 @@ def __sim_consumer( while not stop_event.is_set(): try: mutex.acquire() - inputs_dict, outputs_dict = export_queue.get(timeout=0.5) + inputs_dict, outputs_dict = export_queue.get(timeout=3) MonteCarlo.__export_flight_data( inputs_dict, @@ -508,9 +512,9 @@ def __sim_consumer( except queue.Empty as exc: trials += 1 - if trials > 20: + if trials > 10: raise TimeoutError( - "No simulations were received for 10 seconds." + "No simulations were received for 30 seconds." ) from exc finally: @@ -612,7 +616,7 @@ def __terminate_simulation(self): self.output_file = self.batch_path / f"{self.filename}.outputs.txt" self.error_file = self.batch_path / f"{self.filename}.errors.txt" - print(f"Results saved to {self._output_file}") + MonteCarlo._reprint(f"Results saved to {self._output_file}") def __check_export_list(self, export_list): """ @@ -738,13 +742,14 @@ def _reprint(msg, end="\n", flush=False): ------- None """ - len_msg = len(msg) - if len_msg < MonteCarlo._last_print_len: - msg += " " * (MonteCarlo._last_print_len - len_msg) - else: - MonteCarlo._last_print_len = len_msg + padding = "" + + if len(msg) < MonteCarlo._last_print_len: + padding = " " * (MonteCarlo._last_print_len - len(msg)) + + MonteCarlo._last_print_len = len(msg) - print(msg, end=end, flush=flush) + print(msg + padding, end=end, flush=flush) # Properties and setters @@ -942,7 +947,7 @@ def import_outputs(self, filename=None): with open(filepath, "r+", encoding="utf-8"): self.output_file = filepath - print( + MonteCarlo._reprint( f"A total of {self.num_of_loaded_sims} simulations results were " f"loaded from the following output file: {self.output_file}\n" ) @@ -970,7 +975,7 @@ def import_inputs(self, filename=None): with open(filepath, "r+", encoding="utf-8"): self.input_file = filepath - print(f"The following input file was imported: {self.input_file}") + MonteCarlo._reprint(f"The following input file was imported: {self.input_file}") def import_errors(self, filename=None): """ @@ -994,7 +999,7 @@ def import_errors(self, filename=None): except FileNotFoundError: with open(filepath, "r+", encoding="utf-8"): self.error_file = filepath - print(f"The following error file was imported: {self.error_file}") + MonteCarlo._reprint(f"The following error file was imported: {self.error_file}") def import_results(self, filename=None): """ @@ -1305,7 +1310,7 @@ def increment(self): self.count += 1 return self.count - def update_status(self, sim_idx, end="\n", flush=False): + def update_status(self, sim_idx): """Prints a message on the same line as the previous one and replaces the previous message with the new one, deleting the extra characters from the previous message. @@ -1314,25 +1319,19 @@ def update_status(self, sim_idx, end="\n", flush=False): ---------- msg : str Message to be printed. - end : str, optional - String appended after the message. Default is a new line. - flush : bool, optional - If True, the output is flushed. Default is False. Returns ------- None """ average_time = (time() - self.start_time) / (self.count - self.initial_count) - estimated_time = int( - (self.n_simulations - (self.count - self.initial_count)) * average_time - ) + estimated_time = int((self.n_simulations - self.count) * average_time) msg = f"Current iteration: {sim_idx:06d}" msg += f" | Average Time per Iteration: {average_time:.3f} s" msg += f" | Estimated time left: {estimated_time} s" - MonteCarlo._reprint(msg, end=end, flush=flush) + MonteCarlo._reprint(msg, end="\r", flush=True) def finalize_status(self): """Prints the final status of the simulation. @@ -1346,7 +1345,10 @@ def finalize_status(self): ------- None """ - msg = f"Completed {self.count} iterations." - msg += f" Total wall time: {time() - self.start_time:.1f} s" + print() + performed_sims = self.count - self.initial_count + msg = f"Completed {performed_sims} iterations." + msg += f" In total, {self.n_simulations} simulations are exported.\n" + msg += f"Total wall time: {time() - self.start_time:.1f} s" - MonteCarlo._reprint(msg, end="\n", flush=False) + MonteCarlo._reprint(msg, end="\n", flush=True) From d18408eb0679f06f89b42a2999b6a3d8c5c5698f Mon Sep 17 00:00:00 2001 From: Pedro Bressan Date: Sat, 3 Aug 2024 22:18:40 -0300 Subject: [PATCH 4/7] MNT: improve random number generator naming. --- rocketpy/stochastic/stochastic_model.py | 16 +++++++------ rocketpy/tools.py | 32 ++++++++++++------------- 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/rocketpy/stochastic/stochastic_model.py b/rocketpy/stochastic/stochastic_model.py index a96ed294b..1edab7cff 100644 --- a/rocketpy/stochastic/stochastic_model.py +++ b/rocketpy/stochastic/stochastic_model.py @@ -78,7 +78,7 @@ def _set_stochastic(self, seed=None): seed : int, optional Seed for the random number generator. """ - self.__rng_generator = np.random.default_rng(seed) + self.__random_number_generator = np.random.default_rng(seed) self.last_rnd_dict = {} # TODO: This code block is too complex. Refactor it. @@ -181,7 +181,7 @@ def _validate_tuple_length_two( # is the standard deviation, and the second item is the distribution # function. In this case, the nominal value will be taken from the # object passed. - dist_func = get_distribution(input_value[1], self.__rng_generator) + dist_func = get_distribution(input_value[1], self.__random_number_generator) return (getattr(self.obj, input_name), input_value[0], dist_func) else: # if second item is an int or float, then it is assumed that the @@ -191,7 +191,7 @@ def _validate_tuple_length_two( return ( input_value[0], input_value[1], - get_distribution("normal", self.__rng_generator), + get_distribution("normal", self.__random_number_generator), ) def _validate_tuple_length_three( @@ -228,7 +228,7 @@ def _validate_tuple_length_three( f"'{input_name}': Third item of tuple must be a string containing the " "name of a valid numpy.random distribution function." ) - dist_func = get_distribution(input_value[2], self.__rng_generator) + dist_func = get_distribution(input_value[2], self.__random_number_generator) return (input_value[0], input_value[1], dist_func) def _validate_list( @@ -287,7 +287,7 @@ def _validate_scalar( return ( getattr(self.obj, input_name), input_value, - get_distribution("normal", self.__rng_generator), + get_distribution("normal", self.__random_number_generator), ) def _validate_factors(self, input_name, input_value): @@ -355,14 +355,16 @@ def _validate_tuple_factor(self, input_name, factor_tuple): return ( factor_tuple[0], factor_tuple[1], - get_distribution("normal", self.__rng_generator), + get_distribution("normal", self.__random_number_generator), ) elif len(factor_tuple) == 3: assert isinstance(factor_tuple[2], str), ( f"'{input_name}`: Third item of tuple must be a string containing " "the name of a valid numpy.random distribution function" ) - dist_func = get_distribution(factor_tuple[2], self.__rng_generator) + dist_func = get_distribution( + factor_tuple[2], self.__random_number_generator + ) return (factor_tuple[0], factor_tuple[1], dist_func) def _validate_list_factor(self, input_name, factor_list): diff --git a/rocketpy/tools.py b/rocketpy/tools.py index ee9436e5a..eb432c15d 100644 --- a/rocketpy/tools.py +++ b/rocketpy/tools.py @@ -232,7 +232,7 @@ def bilinear_interpolation(x, y, x1, x2, y1, y2, z11, z12, z21, z22): ) / ((x2 - x1) * (y2 - y1)) -def get_distribution(distribution_function_name, rng_generator=None): +def get_distribution(distribution_function_name, random_number_generator=None): """Sets the distribution function to be used in the monte carlo analysis. Parameters @@ -240,31 +240,31 @@ def get_distribution(distribution_function_name, rng_generator=None): distribution_function_name : string The type of distribution to be used in the analysis. It can be 'uniform', 'normal', 'lognormal', etc. - rng_generator : np.random.Generator, optional + random_number_generator : np.random.Generator, optional The random number generator to be used. If None, the default generator - is used. + ``numpy.random.default_rng`` is used. Returns ------- np.random distribution function The distribution function to be used in the analysis. """ - if rng_generator is None: - rng_generator = np.random.default_rng() + if random_number_generator is None: + random_number_generator = np.random.default_rng() # Dictionary mapping distribution names to RNG methods distributions = { - "normal": rng_generator.normal, - "binomial": rng_generator.binomial, - "chisquare": rng_generator.chisquare, - "exponential": rng_generator.exponential, - "gamma": rng_generator.gamma, - "gumbel": rng_generator.gumbel, - "laplace": rng_generator.laplace, - "logistic": rng_generator.logistic, - "poisson": rng_generator.poisson, - "uniform": rng_generator.uniform, - "wald": rng_generator.wald, + "normal": random_number_generator.normal, + "binomial": random_number_generator.binomial, + "chisquare": random_number_generator.chisquare, + "exponential": random_number_generator.exponential, + "gamma": random_number_generator.gamma, + "gumbel": random_number_generator.gumbel, + "laplace": random_number_generator.laplace, + "logistic": random_number_generator.logistic, + "poisson": random_number_generator.poisson, + "uniform": random_number_generator.uniform, + "wald": random_number_generator.wald, } try: return distributions[distribution_function_name] From abe574774fa7bc8e16b5fcc62ab4c9e4dfc40afa Mon Sep 17 00:00:00 2001 From: Pedro Bressan Date: Sat, 3 Aug 2024 22:21:18 -0300 Subject: [PATCH 5/7] FIX: stochastic model seed input not being used. --- rocketpy/stochastic/stochastic_model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rocketpy/stochastic/stochastic_model.py b/rocketpy/stochastic/stochastic_model.py index 1edab7cff..e8eabf833 100644 --- a/rocketpy/stochastic/stochastic_model.py +++ b/rocketpy/stochastic/stochastic_model.py @@ -67,7 +67,7 @@ def __init__(self, obj, seed=None, **kwargs): self.obj = obj self.last_rnd_dict = {} self.__stochastic_dict = kwargs - self._set_stochastic() + self._set_stochastic(seed) def _set_stochastic(self, seed=None): """Set the stochastic attributes from the input dictionary. From fe7bad3f0ec74927083290a3436b8ac5aaf0afef Mon Sep 17 00:00:00 2001 From: Pedro Bressan Date: Sat, 3 Aug 2024 22:27:26 -0300 Subject: [PATCH 6/7] MNT: correct outdated docstrings and improve function naming. --- rocketpy/simulation/monte_carlo.py | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/rocketpy/simulation/monte_carlo.py b/rocketpy/simulation/monte_carlo.py index 2d2f3aea0..7869e37d6 100644 --- a/rocketpy/simulation/monte_carlo.py +++ b/rocketpy/simulation/monte_carlo.py @@ -304,9 +304,9 @@ def __run_in_serial(self): self._output_file, ) - sim_monitor.update_status(sim_monitor.count) + sim_monitor.print_update_status(sim_monitor.count) - sim_monitor.finalize_status() + sim_monitor.print_final_status() except KeyboardInterrupt: MonteCarlo._reprint("Keyboard Interrupt, files saved.") @@ -398,7 +398,7 @@ def __run_in_parallel(self, n_workers=None): sim_consumer.join() - sim_monitor.finalize_status() + sim_monitor.print_final_status() @staticmethod def __sim_producer( @@ -458,7 +458,7 @@ def __sim_producer( export_queue.put((inputs_dict, outputs_dict)) mutex.acquire() - sim_monitor.update_status(sim_idx) + sim_monitor.print_update_status(sim_idx) mutex.release() except Exception as error: @@ -1310,15 +1310,15 @@ def increment(self): self.count += 1 return self.count - def update_status(self, sim_idx): + def print_update_status(self, sim_idx): """Prints a message on the same line as the previous one and replaces the previous message with the new one, deleting the extra characters from the previous message. Parameters ---------- - msg : str - Message to be printed. + sim_idx : int + Index of the current simulation. Returns ------- @@ -1333,18 +1333,8 @@ def update_status(self, sim_idx): MonteCarlo._reprint(msg, end="\r", flush=True) - def finalize_status(self): - """Prints the final status of the simulation. - - Parameters - ---------- - show_process_time : bool, optional - If True, the process time will be shown. Default is True. - - Returns - ------- - None - """ + def print_final_status(self): + """Prints the final status of the simulation.""" print() performed_sims = self.count - self.initial_count msg = f"Completed {performed_sims} iterations." From 0048737787b626e36f823b5b9731a95edfcf2af7 Mon Sep 17 00:00:00 2001 From: Pedro Bressan Date: Sat, 3 Aug 2024 22:39:38 -0300 Subject: [PATCH 7/7] MNT: improve docstrings according to code reviews. --- rocketpy/simulation/monte_carlo.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/rocketpy/simulation/monte_carlo.py b/rocketpy/simulation/monte_carlo.py index 7869e37d6..63b0c4ca5 100644 --- a/rocketpy/simulation/monte_carlo.py +++ b/rocketpy/simulation/monte_carlo.py @@ -123,7 +123,9 @@ def __init__( Path to the batch folder to be used in the simulation. Export file will be saved in this folder. Default is None. export_sample_time : float, optional - Sample time to downsample the arrays in seconds. Default is 0.1. + Sample time to downsample the arrays in seconds. Used to automatically + discretize inputs that contain callable ``rocketpy.Function`` objects. + Default is 0.1. Returns ------- @@ -196,8 +198,9 @@ def simulate( parallel : bool, optional If True, the simulations will be run in parallel. Default is False. n_workers : int, optional - Number of workers to be used. If None, the number of workers - will be equal to the number of CPUs available. Default is None. + Number of workers to be used if ``parallel=True``. If None, the + number of workers will be equal to the number of CPUs available. + Default is None. Returns ------- @@ -1191,6 +1194,10 @@ def prepare_export_data(obj, sample_time=0.1, remove_functions=False): ---------- obj : object The object whose attributes are to be inspected. + sample_time : float, optional + Time interval between samples. Default is 0.1. + remove_functions : bool, optional + If True, the Function objects will not be serialized. Default is False. Returns -------