Flight plan - HALO-20240921a#
ec_under ec_track c_mid meteorCrew#
Job |
Name |
---|---|
PI |
Raphaela Vogel |
WALES |
Sabrina Zechlau |
HAMP |
Jakob Deutloff |
Dropsondes |
Nina Robbins |
Smart/VELOX |
Kevin Wolf |
SpecMACS |
Tobias Zinner |
Flight Documentation |
Sebastian Ortega |
Ground contact |
Luca Schmidt, Henning Franke |
Flight plan#
Show code cell source
# Define HALO flight and crew
from datetime import datetime
aircraft = "HALO"
flight_time = datetime(2024, 9, 21, 11, 25, 0)
flight_id = f"{aircraft}-{flight_time.strftime('%Y%m%d')}a"
crew = {
'Mission PI': 'Raphaela Vogel',
'DropSondes': 'Nina Robbins',
'HAMP': 'Jakob Deutloff',
'SMART/VELOX': 'Kevin Wolf',
'SpecMACS': 'Tobias Zinner',
'WALES' : 'Sabrina Zechlau',
'Flight Documentation': 'Sebastian Ortega',
'Ground Support': 'Luca Schmidt, Henning Franke'
}
Show code cell source
# Define some fixed values
import easygems.healpix as egh
import intake
import numpy as np
import orcestra.sat
from orcestra.flightplan import tbpb
airport = tbpb
radius = 72e3*1.852
smaller_radius = 52e3 * 1.852
halo_speed = 238.5 # at FL450 [m/s]
sat_fcst_date = "2024-09-19" # date to get satelite forecast(s) from
ec_time_slice = slice(f"{flight_time:%Y-%m-%d} 17:30", f"{flight_time:%Y-%m-%d} 17:40") # timeslice of forecast(s) to use
#pace_time_slice = slice(f"{flight_time:%Y-%m-%d} 16:19", f"{flight_time:%Y-%m-%d} 16:24") # timeslice of forecast(s) to use
ifs_fcst_time = "2024-09-20" # date to get IFS forecast(s) from
ifs_fcst_time = np.datetime64(ifs_fcst_time + "T00:00:00")
# Load satellite tracks
print(f"SATELITE TRACK FORECAST FROM: {sat_fcst_date} FOR FLIGHT DAY: {flight_time:%Y-%m-%d}")
ec_track = orcestra.sat.SattrackLoader("EARTHCARE", sat_fcst_date, kind="PRE", roi="BARBADOS") \
.get_track_for_day(f"{flight_time:%Y-%m-%d}") \
.sel(time=ec_time_slice)
#pace_track = orcestra.sat.pace_track_loader() \
# .get_track_for_day(f"{flight_time:%Y-%m-%d}") \
# .sel(time=pace_time_slice)
# Load IFS forecast
cat = "https://tcodata.mpimet.mpg.de/internal.yaml"
ifs_ds = intake.open_catalog(cat).HIFS(datetime=ifs_fcst_time).to_dask().pipe(egh.attach_coords)
SATELITE TRACK FORECAST FROM: 2024-09-19 FOR FLIGHT DAY: 2024-09-21
/home/runner/miniconda3/envs/orcestra_book/lib/python3.12/site-packages/orcestra/sat.py:183: UserWarning: You are using an old forecast (issued on 2024-09-19) for EARTHCARE on 2024-09-21! The newest forecast issued so far was issued on 2024-09-21. It's a PRE forecast.
warnings.warn(
Show code cell source
# Create the flight plan
from HALO_20240919a_plan import geod_azi, geod_dist, centre_from_tangent
from orcestra.flightplan import LatLon, point_on_track, IntoCircle, FlightPlan
# Create points for flight path
ec_circ = point_on_track(ec_track, lat= 10.00).assign(label = "ec_circ")
ec_under = point_on_track(ec_track, lat= 11.00, with_time=True).assign(label = "ec_under", note = "meet EarthCARE")
ec_south = point_on_track(ec_track, lat= ec_circ.lat - 1.2).assign(label = "ec_south")
ec_north = point_on_track(ec_track, lat= airport.lat).assign(label = "ec_north")
meteor = LatLon(11.7, -56).assign(label="meteor")
east = meteor.towards(ec_circ, fraction=2.0).assign(label="east", note = "circle two times")
# Define Waypoints
fl1, fl2, fl3 = 410, 430, 450
waypoints = [
airport.assign(fl=0),
#meteor.assign(fl=fl2),
IntoCircle(meteor.assign(fl=fl2), radius, -360),
IntoCircle(east.assign(fl=fl2), radius, -360*2),
ec_south.assign(fl=fl3),
IntoCircle(ec_circ.assign(fl=fl3), radius, 360),
ec_south.assign(fl=fl3),
ec_under.assign(fl=fl3),
ec_north.assign(fl=fl3),
IntoCircle(meteor.assign(fl=fl3), radius, -360, enter = 180),
airport.assign(fl=0),
]
# Additional Waypoints
extra_waypoints = []
# FlightPlan and print short statement
plan = FlightPlan(path=waypoints, flight_id=flight_id, extra_waypoints=extra_waypoints, crew=crew, aircraft=aircraft)
msg = f"Flight ID: {plan.flight_id}\n" \
+ f"Take-off: {plan.takeoff_time:%H:%M %Z}\n" \
+ f"Landing: {plan.landing_time:%H:%M %Z}\n" \
+ f"Duration: {plan.duration}"
print(msg)
Flight ID: HALO-20240921a
Take-off: 11:26 UTC
Landing: 19:55 UTC
Duration: 8:28:43.768898
Show code cell source
from HALO_20240919a_plan import plot_flight_plan_satellite_forecast
from orcestra.flightplan import plot_cwv
figsize=(14, 8)
worldfirs_json = "worldfirs.json"
lon_min, lon_max, lat_min, lat_max = -65, -20, -5, 25
domain_lonlat = [lon_min, lon_max, lat_min, lat_max]
def plot_ifs_cwv_forecast(fig, ax, ifs_ds, flight_time, levels=None):
cwv_flight_time = ifs_ds["tcwv"].sel(time=flight_time, method="nearest")
plot_cwv(cwv_flight_time, ax=ax, levels=levels)
plot_cwv_kwargs = {
"flight_time": flight_time,
"levels": [46, 48, 50, 52, 54, 56]
}
fig, ax = plot_flight_plan_satellite_forecast(figsize,
flight_time,
plan,
domain_lonlat,
is_ec_track=True,
ec_track=ec_track,
is_pace_track=False,
pace_track=None,
forecast_overlay=True,
ifs_ds=ifs_ds,
ifs_fcst_time=ifs_fcst_time,
forecast_title_label="CWV",
plot_forecast_func=plot_ifs_cwv_forecast,
plot_forecast_kwargs=plot_cwv_kwargs,
atc_zones=True,
worldfirs_json=worldfirs_json,
is_meteor=True,
meteor=meteor)
Show code cell source
import HALO_20240919a_sfc_winds as sfc_winds
figsize=(16, 9)
def plot_ifs_sfc_winds_forecast(fig, ax, ifs_ds, domain_lonlat, flight_time):
u10m = ifs_ds["10u"].sel(time=flight_time, method="nearest")
v10m = ifs_ds["10v"].sel(time=flight_time, method="nearest")
windspeed_10m = np.sqrt(u10m**2 + v10m**2)
sfc_winds._windspeed_plot(windspeed_10m, fig, ax)
sfc_winds._wind_direction_plot(u10m, v10m, ax, domain_lonlat)
sfc_winds._windspeed_contour(windspeed_10m, ax)
sfc_winds._draw_confluence_contour(v10m, ax)
plot_ifs_sfc_winds_kwargs = {
"domain_lonlat": domain_lonlat,
"flight_time": flight_time,
}
fig, ax = plot_flight_plan_satellite_forecast(figsize,
flight_time,
plan,
domain_lonlat,
is_ec_track=True,
ec_track=ec_track,
is_pace_track=False,
pace_track=None,
forecast_overlay=True,
ifs_ds=ifs_ds,
ifs_fcst_time=ifs_fcst_time,
forecast_title_label="10m Winds",
plot_forecast_func=plot_ifs_sfc_winds_forecast,
plot_forecast_kwargs=plot_ifs_sfc_winds_kwargs,
atc_zones=True,
worldfirs_json=worldfirs_json,
is_meteor=True,
meteor=meteor)
Show code cell source
from orcestra.flightplan import vertical_preview
vertical_preview(waypoints)
Show code cell source
plan.show_details()
plan.export()
Detailed Overview:
TBPB N13 04.48, W059 29.55, FL000, 11:26:19 UTC,
circle around meteor N11 42.00, W056 00.00, FL430, 11:49:34 UTC - 12:48:35 UTC, radius: 72 nm, 360° CCW, enter from west
circle around east N08 15.13, W048 01.73, FL430, 13:55:45 UTC - 15:53:43 UTC, radius: 72 nm, 720° CCW, enter from north west, circle two times
to ec_south N08 48.00, W052 13.26, FL450, 16:17:33 UTC,
circle around ec_circ N10 00.00, W051 59.60, FL450, 16:17:40 UTC - 17:16:13 UTC, radius: 72 nm, 360° CW, enter from south
to ec_south N08 48.00, W052 13.26, FL450, 17:16:20 UTC,
to ec_under N11 00.00, W051 48.18, FL450, 17:33:39 UTC, meet EarthCARE
to ec_north N13 04.48, W051 24.30, FL450, 17:49:58 UTC,
to (helper) meteor_in N12 54.24, W056 03.41, FL450, 18:25:16 UTC, upcoming circle will be entered here
circle around meteor N11 42.00, W056 00.00, FL450, 18:25:16 UTC - 19:23:49 UTC, radius: 72 nm, 360° CCW, enter from north
to TBPB N13 04.48, W059 29.55, FL000, 19:55:03 UTC,