Spaces:
Build error
Build error
cleanup
Browse files
app.py
CHANGED
|
@@ -63,10 +63,17 @@ for var in ["t", "u", "v", "w", "q", "z"]:
|
|
| 63 |
var_id = f"{var}_{level}"
|
| 64 |
VARIABLE_GROUPS["Pressure Level Variables"][var_id] = f"{var_name} at {level}hPa"
|
| 65 |
|
|
|
|
|
|
|
|
|
|
| 66 |
def get_open_data(param, levelist=[]):
|
| 67 |
fields = {}
|
| 68 |
# Get the data for the current date and the previous date
|
|
|
|
|
|
|
| 69 |
for date in [DEFAULT_DATE - datetime.timedelta(hours=6), DEFAULT_DATE]:
|
|
|
|
|
|
|
| 70 |
data = ekd.from_source("ecmwf-open-data", date=date, param=param, levelist=levelist)
|
| 71 |
for f in data:
|
| 72 |
assert f.to_numpy().shape == (721, 1440)
|
|
@@ -108,9 +115,15 @@ def run_forecast(date, lead_time, device):
|
|
| 108 |
fields[f"z_{level}"] = gh * 9.80665
|
| 109 |
|
| 110 |
input_state = dict(date=date, fields=fields)
|
| 111 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 112 |
results = []
|
| 113 |
-
for state in
|
| 114 |
results.append(state)
|
| 115 |
return results[-1]
|
| 116 |
|
|
@@ -139,20 +152,23 @@ for group_name, variables in VARIABLE_GROUPS.items():
|
|
| 139 |
for var_id, desc in sorted(variables.items()):
|
| 140 |
DROPDOWN_CHOICES.append((f"{desc} ({var_id})", var_id))
|
| 141 |
|
| 142 |
-
def gradio_interface(
|
| 143 |
-
|
| 144 |
-
|
| 145 |
-
|
| 146 |
-
raise gr.Error("Please enter a valid date in YYYY-MM-DD format")
|
| 147 |
-
state = run_forecast(date, lead_time, device)
|
| 148 |
return plot_forecast(state, selected_variable)
|
| 149 |
|
| 150 |
demo = gr.Interface(
|
| 151 |
fn=gradio_interface,
|
| 152 |
inputs=[
|
| 153 |
-
gr.
|
| 154 |
-
|
| 155 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 156 |
gr.Dropdown(
|
| 157 |
choices=DROPDOWN_CHOICES,
|
| 158 |
value="2t", # Default to 2m temperature
|
|
@@ -162,7 +178,11 @@ demo = gr.Interface(
|
|
| 162 |
],
|
| 163 |
outputs=gr.Plot(),
|
| 164 |
title="AIFS Weather Forecast",
|
| 165 |
-
description="
|
|
|
|
|
|
|
|
|
|
|
|
|
| 166 |
)
|
| 167 |
|
| 168 |
demo.launch()
|
|
|
|
| 63 |
var_id = f"{var}_{level}"
|
| 64 |
VARIABLE_GROUPS["Pressure Level Variables"][var_id] = f"{var_name} at {level}hPa"
|
| 65 |
|
| 66 |
+
# Load the model once at startup
|
| 67 |
+
MODEL = SimpleRunner("aifs-single-mse-1.0.ckpt", device="cuda") # Default to CUDA
|
| 68 |
+
|
| 69 |
def get_open_data(param, levelist=[]):
|
| 70 |
fields = {}
|
| 71 |
# Get the data for the current date and the previous date
|
| 72 |
+
myiterable = [DEFAULT_DATE - datetime.timedelta(hours=6), DEFAULT_DATE]
|
| 73 |
+
print(myiterable)
|
| 74 |
for date in [DEFAULT_DATE - datetime.timedelta(hours=6), DEFAULT_DATE]:
|
| 75 |
+
print(f"Fetching data for {date}")
|
| 76 |
+
# sources can be seen https://earthkit-data.readthedocs.io/en/latest/guide/sources.html#id57
|
| 77 |
data = ekd.from_source("ecmwf-open-data", date=date, param=param, levelist=levelist)
|
| 78 |
for f in data:
|
| 79 |
assert f.to_numpy().shape == (721, 1440)
|
|
|
|
| 115 |
fields[f"z_{level}"] = gh * 9.80665
|
| 116 |
|
| 117 |
input_state = dict(date=date, fields=fields)
|
| 118 |
+
|
| 119 |
+
# Use the global model instance
|
| 120 |
+
global MODEL
|
| 121 |
+
# If device preference changed, move model to new device
|
| 122 |
+
if device != MODEL.device:
|
| 123 |
+
MODEL = SimpleRunner("aifs-single-mse-1.0.ckpt", device=device)
|
| 124 |
+
|
| 125 |
results = []
|
| 126 |
+
for state in MODEL.run(input_state=input_state, lead_time=lead_time):
|
| 127 |
results.append(state)
|
| 128 |
return results[-1]
|
| 129 |
|
|
|
|
| 152 |
for var_id, desc in sorted(variables.items()):
|
| 153 |
DROPDOWN_CHOICES.append((f"{desc} ({var_id})", var_id))
|
| 154 |
|
| 155 |
+
def gradio_interface(lead_time, selected_variable):
|
| 156 |
+
# Use the global latest date
|
| 157 |
+
global DEFAULT_DATE
|
| 158 |
+
state = run_forecast(DEFAULT_DATE, lead_time, "cuda") # Always use CUDA
|
|
|
|
|
|
|
| 159 |
return plot_forecast(state, selected_variable)
|
| 160 |
|
| 161 |
demo = gr.Interface(
|
| 162 |
fn=gradio_interface,
|
| 163 |
inputs=[
|
| 164 |
+
gr.Slider(
|
| 165 |
+
minimum=6,
|
| 166 |
+
maximum=48,
|
| 167 |
+
step=6,
|
| 168 |
+
value=12,
|
| 169 |
+
label="Forecast Hours Ahead",
|
| 170 |
+
info=f"Latest data available from: {DEFAULT_DATE.strftime('%Y-%m-%d %H:%M UTC')}"
|
| 171 |
+
),
|
| 172 |
gr.Dropdown(
|
| 173 |
choices=DROPDOWN_CHOICES,
|
| 174 |
value="2t", # Default to 2m temperature
|
|
|
|
| 178 |
],
|
| 179 |
outputs=gr.Plot(),
|
| 180 |
title="AIFS Weather Forecast",
|
| 181 |
+
description=f"""
|
| 182 |
+
Interactive visualization of ECMWF AIFS weather forecasts.
|
| 183 |
+
Starting from the latest available data ({DEFAULT_DATE.strftime('%Y-%m-%d %H:%M UTC')}),
|
| 184 |
+
select how many hours ahead you want to forecast and which meteorological variable to visualize.
|
| 185 |
+
"""
|
| 186 |
)
|
| 187 |
|
| 188 |
demo.launch()
|