Flight plan - HALO-20240921a

Contents

Flight plan - HALO-20240921a#

ec_under ec_track c_mid meteor

Crew#

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#

Hide 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'
}
Hide 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
Hide 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
Hide 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)
/home/runner/miniconda3/envs/orcestra_book/lib/python3.12/site-packages/cartopy/io/__init__.py:241: DownloadWarning: Downloading: https://naturalearth.s3.amazonaws.com/50m_physical/ne_50m_coastline.zip
  warnings.warn(f'Downloading: {url}', DownloadWarning)
../_images/842cfbf3bcc9b6522642e3e304445949d09a7bdafe48f937065f3aa37d9c53d6.png
Hide 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)
../_images/321f836b90fe34a5aa6501eb9f4bf53aa8cc6b8f1a6408d5081d701120261220.png
Hide code cell source
from orcestra.flightplan import vertical_preview

vertical_preview(waypoints)
../_images/93aba8ceb56e2677ba5582714c4238f30fb29838aa342f9096deba4b41b9e796.png
Hide 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,