пятница, 29 августа 2014 г.

Скачать ре-анализ ECMWF в фоновом режиме. ECMWF re-analysis batch mode

Современные климатические ре-анализы, к которым относится и ре-анализ ECMWF, хранят очень много информации. Глобальные данные за 100 лет не на самом большом разрешении могут занимать несколько сотен гигабайт памяти. И это только по одному параметру. А их может быть несколько десятков. И если вопрос хранения более-менее решён, то вот процесс передачи данных до сих пор стоит остро. Пока базы данных не интегрировали с торрент технологиями проходится использовать старый добрый протокол ftp.
Инструкция расскажет, как с помощью голого python скачать любой ре-анализ ECMWF (хороший ре-анализ) по ftp. Исходные англоязычные подсказки были найдены на самом сайте ECMWF в разделе Batch mode. Доступны библиотеки для языков программирования Python, Perl и Java. Мы рассмотрим наш любимый python.




I. Установка библиотеке ecmwf
Если у вас Ubuntu OS, то совсем просто:
sudo pip install https://software.ecmwf.int/wiki/download/attachments/23694554/ecmwf-api-client-python.tgz
Иначе загружаем исходники, распаковываем и копируем модуль ecmwfapi в директорию, для которой определена переменная окружения PYTHONPATH. Пробовал на Cent OS, всё работает. 
Если у вас нет переменной окружения PYTHONPATH, создайте её примерно так:

export PYTHONPATH=$PYTHONPATH:/home/ecmwfapi

Если не написать подобную строчку в скрытом конфигурационном файле .bash_profile (лежит в домашней папке, аккуратнее с этим файлом), то процедуру экспорта нужно повторять при каждой загрузке системы.
II. Настроечные файлы и переменные среды
Для доступа к базам ECMWF нужен API key. Его можно получить после регистрации (https://apps.ecmwf.int/registration/) на сайте ECMWF (https://apps.ecmwf.int/auth/login/), а далее по ссылке ( https://api.ecmwf.int/v1/key/) получить заветный ключик.
Затем нужно в домашней папке (переход в неё -> $ cd $HOME) создать просто файл с ./ecmwfapirc7. В этот файл помещаем актуальную для вашего аккаунта на сайте ECMWF информацию. Содержания файла будет примерно такое:
{
    "url"   "https://api.ecmwf.int/v1",
    "key"   "XXXXXXXXXXXXXXXXXXXXXX",
    "email" "john.smith@example.com"
}
, где email - с вашего аккаунта, а key - тот самый заветный ключик.
III. Python скрипт 
Если всё сделано правильно (может потребоваться перегрузка системы), то переходить к программированию запроса. Пример файла с именем batch_mode_ecmwf.py дан тут. Приведу пример личного скрипта, ориентированного на ре-анализ Eraclim. Этот скрипт позволяет скачивать данные по всем ансамблям, за все сроки наблюдений, за все дни года (daily dataset) в один файл. Визуальный режим ECMWF не позволяет скачивать более 20000 полей, а с помощью batch mode можно скачивать много больше в один файл. Это удобно. Формат сохранения - GRIB. Есть возможность сразу конвертировать его в NetCDF (добавить 'format':'netcdf'), но это функция нестабильно работает. Надёжнее использовать декодер после скачивания "грибов". Он также есть на сайте ECMWF.
Вся суть скрипта находится внутри скобок server.retrieve(). Там перечислены параметры (тип словаря), которым нужно присвоить актуальные для пользователя значения. Чтобы было легче понять какие аббревиатуры использовать, предлагаю такой трюк. 
Заходим в визуальный режим ре-анализа. Выбираем нужное, и внизу нажимаем кнопку типа "get in MARS". Откроется окно, где будут выбранные параметры в нужных аббревиатурах. Presto! =)

#!/usr/bin/env python
# (C) Copyright 2012-2013 ECMWF.
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. 
# In applying this licence, ECMWF does not waive the privileges and immunities 
# granted to it by virtue of its status as an intergovernmental organisation nor
# does it submit to any jurisdiction.
#
from ecmwfapi import ECMWFDataServer
# --- H E L P E R --------
# param : 167.128 - 2m temperature
# param : 151.128 - slp
# ------------------------
server = ECMWFDataServer()

years = range(1944,1950,1)  # период для скачивания 1944-1949 включительно
month = ['01','02','03','04','05','06','07','08','09','10','11','12'] # месяцы
all_times = '00/03/06/09/12/15/18/21' # сроки
all_ensembles = '0/1/2/3/4/5/6/7/8/9' # доступные ансамбли

param = 'slp'

if (param=='slp'):
    param_num = '151.128'
elif (param=='t2m'):
    param_num = '167.128'
elif (param=='slp_t2m'):
    param_num = '151.128/167.128'

for i in years:
    print '-----------------' 
    print ''
    print 'DOWNLOADING %d' % i
    print ''
    print '-----------------' 

    server.retrieve({        
'dataset': 'eraclim',
'type'   : 'fc',
'stream' : 'enda',
'class'  : 'em',
'levtype':'sfc',
'expver' : '1605',
'step'   : '0',
'time'   : '%s' % (all_times),
'number' : '%s' % (all_ensembles),
'param'  : '%s' % (param_num),
'date'   : '%d-01-01/to/%d-12-31' % ((i,i)),
'target' : "eraclim_day_%s_%d.grib" % (param,i)
})


Как перевести UV в направление и скорость ветра? How to convert wind UV-components to direction and velocity?

 Всё просто.  def uv2dir(u, v):     '''     Источник:     https://github.com/blaylockbk/Ute_WRF/blob/master/functions/wind_calc...