Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DOC: Improvements of Environment docstring phrasing. #565

Merged
merged 13 commits into from
Apr 2, 2024
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
167 changes: 138 additions & 29 deletions rocketpy/environment/environment.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,7 @@ class Environment:
Environment.datum : string
The desired reference ellipsoid model, the following options are
available: "SAD69", "WGS84", "NAD83", and "SIRGAS2000". The default
is "SIRGAS2000", then this model will be used if the user make some
typing mistake
is "SIRGAS2000".
Environment.initial_east : float
Launch site East UTM coordinate
Environment.initial_north : float
Expand All @@ -74,7 +73,7 @@ class Environment:
Launch site E/W hemisphere
Environment.elevation : float
Launch site elevation.
Environment.date : datetime
Environment.datetime_date : datetime
Date time of launch in UTC.
Environment.local_date : datetime
Date time of launch in the local time zone, defined by
Expand Down Expand Up @@ -276,49 +275,70 @@ def __init__(
timezone="UTC",
max_expected_height=80000.0,
):
phmbressan marked this conversation as resolved.
Show resolved Hide resolved
"""Initialize Environment class, saving launch rail length,
launch date, location coordinates and elevation. Note that
by default the standard atmosphere is loaded until another
"""Initializes the Environment class, capturing essential parameters of
the launch site, including the launch date, geographical coordinates,
and elevation. This class is designed to calculate crucial variables
for the Flight simulation, such as atmospheric air pressure, density,
and gravitational acceleration.

Note that the default atmospheric model is the International Standard
Atmosphere as defined by ISO 2533 unless specified otherwise in
:meth:`Environment.set_atmospheric_model`.

Parameters
----------
gravity : int, float, callable, string, array, optional
Surface gravitational acceleration. Positive values point the
acceleration down. If None, the Somigliana formula is used to
acceleration down. If None, the Somigliana formula is used.
See :meth:`Environment.set_gravity_model` for more information.
date : array, optional
Array of length 4, stating (year, month, day, hour (UTC))
of rocket launch. Must be given if a Forecast, Reanalysis
Array of length 4, stating (year, month, day, hour) in the
time zone of the parameter ``timezone``.
Alternatively, can be a ``Datetime`` object specifying launch
date and time. The dates are stored as follows:

- :attr:`Environment.local_date`: Local time of launch in
the time zone specified by the parameter ``timezone``.

- :attr:`Environment.datetime_date`: UTC time of launch.

Must be given if a Forecast, Reanalysis
or Ensemble, will be set as an atmospheric model.
Default is None.
See :meth:`Environment.set_date` for more information.
latitude : float, optional
Latitude in degrees (ranging from -90 to 90) of rocket
launch location. Must be given if a Forecast, Reanalysis
or Ensemble will be used as an atmospheric model or if
Open-Elevation will be used to compute elevation.
Open-Elevation will be used to compute elevation. Positive
values correspond to the North. Default value is 0, which
corresponds to the equator.
longitude : float, optional
Longitude in degrees (ranging from -180 to 360) of rocket
phmbressan marked this conversation as resolved.
Show resolved Hide resolved
launch location. Must be given if a Forecast, Reanalysis
or Ensemble will be used as an atmospheric model or if
Open-Elevation will be used to compute elevation.
Open-Elevation will be used to compute elevation. Positive
values correspond to the East. Default value is 0, which
corresponds to the Greenwich Meridian.
elevation : float, optional
Elevation of launch site measured as height above sea
level in meters. Alternatively, can be set as
'Open-Elevation' which uses the Open-Elevation API to
find elevation data. For this option, latitude and
longitude must also be specified. Default value is 0.
datum : string
datum : string, optional
The desired reference ellipsoidal model, the following options are
available: "SAD69", "WGS84", "NAD83", and "SIRGAS2000". The default
is "SIRGAS2000", then this model will be used if the user make some
typing mistake.
is "SIRGAS2000".
timezone : string, optional
Name of the time zone. To see all time zones, import pytz and run
print(pytz.all_timezones). Default time zone is "UTC".
``print(pytz.all_timezones)``. Default time zone is "UTC".
max_expected_height : float, optional
Maximum altitude in meters to keep weather data. The altitude must
be above sea level (ASL). Especially useful for visualization.
Can be altered as desired by doing `max_expected_height = number`.
Depending on the atmospheric model, this value may be automatically
mofified.
modified.

Returns
-------
Expand Down Expand Up @@ -396,15 +416,57 @@ def set_date(self, date, timezone="UTC"):

Parameters
----------
date : Datetime
Datetime object specifying launch date and time.
date : array, Datetime
Array of length 4, stating (year, month, day, hour) in the
time zone of the parameter ``timezone``. See Notes for more
information.
Alternatively, can be a Datetime object specifying launch
date and time.
timezone : string, optional
Name of the time zone. To see all time zones, import pytz and run
print(pytz.all_timezones). Default time zone is "UTC".
``print(pytz.all_timezones)``. Default time zone is "UTC".

Returns
-------
None

Notes
-----
- If the ``date`` is given as an array, it should be in the same
time zone as specified by the ``timezone`` parameter. This local
time will be available in the attribute :attr:`Environment.local_date`
while the UTC time will be available in the attribute
:attr:`Environment.datetime_date`.

- If the ``date`` is given as a ``Datetime`` object without a time zone,
it will be assumed to be in the same time zone as specified by the
``timezone`` parameter. However, if the ``Datetime`` object has a time
zone specified in its ``tzinfo`` attribute, the ``timezone``
parameter will be ignored.

Examples
--------

Let's set the launch date as an array:
phmbressan marked this conversation as resolved.
Show resolved Hide resolved

>>> date = [2000, 1, 1, 13] # January 1st, 2000 at 13:00 UTC+1
>>> env = Environment()
>>> env.set_date(date, timezone="Europe/Rome")
>>> print(env.datetime_date) # Get UTC time
2000-01-01 12:00:00+00:00
>>> print(env.local_date)
2000-01-01 13:00:00+01:00

Now let's set the launch date as a ``Datetime`` object:
phmbressan marked this conversation as resolved.
Show resolved Hide resolved

>>> from datetime import datetime
>>> date = datetime(2000, 1, 1, 13, 0, 0)
>>> env = Environment()
>>> env.set_date(date, timezone="Europe/Rome")
>>> print(env.datetime_date) # Get UTC time
2000-01-01 12:00:00+00:00
>>> print(env.local_date)
2000-01-01 13:00:00+01:00
"""
# Store date and configure time zone
self.timezone = timezone
Expand Down Expand Up @@ -458,23 +520,66 @@ def set_location(self, latitude, longitude):
self.atmospheric_model_file, self.atmospheric_model_dict
)

# Return None

def set_gravity_model(self, gravity):
"""Sets the gravity model to be used in the simulation based on the
given user input to the gravity parameter.
def set_gravity_model(self, gravity=None):
"""Defines the gravity model based on the given user input to the
gravity parameter. The gravity model is responsible for computing the
gravity acceleration at a given height above sea level in meters.

Parameters
----------
gravity : None or Function source
If None, the Somigliana formula is used to compute the gravity
acceleration. Otherwise, the user can provide a Function object
representing the gravity model.
gravity : int, float, callable, string, array, optional
The gravitational acceleration in m/s² to be used in the
simulation, this value is positive when pointing downwards.
The input type can be one of the following:

- ``int`` or ``float``: The gravity acceleration is set as a\
constant function with respect to height;

- ``callable``: This callable should receive the height above\
sea level in meters and return the gravity acceleration;

- ``array``: The datapoints should be structured as\
``[(h_i,g_i), ...]`` where ``h_i`` is the height above sea\
level in meters and ``g_i`` is the gravity acceleration in m/s²;

- ``string``: The string should correspond to a path to a CSV file\
containing the gravity acceleration data;

- ``None``: The Somigliana formula is used to compute the gravity\
acceleration.

This parameter is used as a :class:`Function` object source, check\
out the available input types for a more detailed explanation.

Returns
-------
Function
Function object representing the gravity model.

Notes
-----
This method **does not** set the gravity acceleration, it only returns
a :class:`Function` object representing the gravity model.
phmbressan marked this conversation as resolved.
Show resolved Hide resolved

Examples
--------
Let's prepare a `Environment` object with a constant gravity
acceleration:

>>> g_0 = 9.80665
>>> env_cte_g = Environment(gravity=g_0)
>>> env_cte_g.gravity([0, 100, 1000])
[9.80665, 9.80665, 9.80665]

It's also possible to variate the gravity acceleration by defining
its function of height:

>>> R_t = 6371000
>>> g_func = lambda h : g_0 * (R_t / (R_t + h))**2
>>> env_var_g = Environment(gravity=g_func)
>>> g = env_var_g.gravity(1000)
>>> print(f"{g:.6f}")
9.803572
"""
if gravity is None:
return self.somigliana_gravity.set_discrete(
Expand All @@ -500,7 +605,7 @@ def max_expected_height(self, value):

@funcify_method("height (m)", "gravity (m/s²)")
def somigliana_gravity(self, height):
"""Computes the gravity acceleration with the Somigliana formula.
"""Computes the gravity acceleration with the Somigliana formula [1]_.
An height correction is applied to the normal gravity that is
accurate for heights used in aviation. The formula is based on the
WGS84 ellipsoid, but is accurate for other reference ellipsoids.
Expand All @@ -514,6 +619,10 @@ def somigliana_gravity(self, height):
-------
Function
Function object representing the gravity model.

References
----------
.. [1] https://en.wikipedia.org/wiki/Theoretical_gravity#Somigliana_equation
"""
a = 6378137.0 # semi_major_axis
f = 1 / 298.257223563 # flattening_factor
Expand Down
2 changes: 1 addition & 1 deletion rocketpy/environment/environment_analysis.py
Original file line number Diff line number Diff line change
Expand Up @@ -441,7 +441,7 @@ def __localize_input_dates(self):

def __find_preferred_timezone(self):
if self.preferred_timezone is None:
# Use local timezone based on lat lon pair
# Use local time zone based on lat lon pair
try:
timezonefinder = import_optional_dependency("timezonefinder")
tf = timezonefinder.TimezoneFinder()
Expand Down
2 changes: 1 addition & 1 deletion rocketpy/tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ def time_num_to_date_string(time_num, units, timezone, calendar="gregorian"):
"""Convert time number (usually hours before a certain date) into two
strings: one for the date (example: 2022.04.31) and one for the hour
(example: 14). See cftime.num2date for details on units and calendar.
Automatically converts time number from UTC to local timezone based on
Automatically converts time number from UTC to local time zone based on
lat, lon coordinates. This function was created originally for the
EnvironmentAnalysis class.

Expand Down
Loading