Best practise to iterate over all hindcastDates of several hindcastYears for BoM
The best approach is to iterate over the hindcastYears. For each hindcastYear iterate over all the available hindcastMonths and for each hindcastMonth iterate over all the available hindcastDays.
|
for hindcastYear in hindcastYears |
|
#!/usr/bin/env python
from ecmwfapi import ECMWFDataServer
server = ECMWFDataServer()
origin = "ammc"
modelVersionDate = "2014-01-01"
def retrieve_BoM_reforecast():
"""
A function to demonstrate how to iterate efficiently over all hindcastYears, hindcastMonths etc
for a particular BoM_reforecast_request.
Change the variables below to adapt the iteration to your needs
"""
hindcastYearStart = 1981
hindcastYearEnd = 2013
hindcastMonthStart = 1
hindcastMonthEnd = 12
# BoM availability is every 5 days: 1, 6, 11, 16, 21, 26
hindcastDays = [1, 6, 11, 16, 21, 26]
#Step 1: Iterate over all the available hindcastYear(s)
for hindcastYear in list(range(hindcastYearStart, hindcastYearEnd + 1)):
#Step 2: Iterate over all the available hindcastMonths(s)
for hindcastMonth in list(range(hindcastMonthStart, hindcastMonthEnd + 1)):
hindcastDates = []
#Step 3: Create the list of the available hindcastDates
for hindcastDay in hindcastDays:
hindcastDate = '%04d%02d%02d' % (
hindcastYear, hindcastMonth, hindcastDay)
hindcastDates.append(hindcastDate)
#Please note: the steps 4 and 5 below could run in parallel
#Step 4: Get all the available perturbed forecast, pressure level data
pfplTarget = "%s_%s_%04d%02d.grb" % (
origin, "pfpl", hindcastYear, hindcastMonth)
BoM_reforecast_pf_pl_request("/".join(hindcastDates), pfplTarget)
#Step 5: Get all the available perturbed forecast, surface data
pfsfcTarget = "%s_%s_%04d%02d.grb" % (
origin, "pfsfc", hindcastYear, hindcastMonth)
BoM_reforecast_pf_sfc_request("/".join(hindcastDates), pfsfcTarget)
def BoM_reforecast_pf_pl_request(hindcastDate, target):
"""
A BoM reforecast, perturbed forecast, pressure level, request.
The cost of this request is 571,392 fields and 11.1352 Gbytes
Change the keywords below to adapt it to your needs.
"""
server.retrieve({
"class": "s2",
"dataset": "s2s",
"date": modelVersionDate,
"expver": "prod",
"hdate": hindcastDate,
"levtype": "pl",
"levelist": "10/50/100/200/300/500/700/850/925/1000",
"origin": origin,
"param": "130/131/132/133/135/156",
"step": "24/to/1488/by/24",
"stream": "enfh",
"target": target,
"time": "00",
"number": "1/to/32",
"type": "pf",
})
def BoM_reforecast_pf_sfc_request(hindcastDate, target):
"""
A BoM reforecast, perturbed forecast, sfc request.
The cost of this request is 383,040 fields and 7.1 GB
Change the keywords below to adapt it to your needs.
"""
server.retrieve({
"class": "s2",
"dataset": "s2s",
"date": modelVersionDate,
"expver": "prod",
"hdate": hindcastDate,
"levtype": "sfc",
"origin": origin,
"param": "31/34/121/122/136/146/147/151/167/168/169/175/176/177/179/180/181/235/228086/228095/228096/228141/228143/228144/228164/228228",
"step": "24/to/1488/by/24",
"stream": "enfh",
"target": target,
"time": "00",
"number": "1/to/32",
"type": "pf",
})
if __name__ == '__main__':
retrieve_BoM_reforecast()
|
Useful links