NCL — язык программирования для наук о Земле
Задача: проводить анализ гео данных и их визуализацию средствами одного инструмента
?нструмент: NCL (NCAR Command Language)
Моделирование атмосферы, океана а также других элементов земной системы уже в начале 90х годов было развито довольно хорошо и стало производить такое количество данных, что для обработки всего этого зоопарка переменных потребовалось создать специальный язык.
NCL это интерпретируемый, объектно ориентированный язык программирования, который предназначен специально для людей занимающихся анализом данных привязанных на сетку связанную с географическими координатами, попросту говоря с Землей, и в особенности модельеров. Не могу не заметить что NCL это прародитель так нежно любимых мною PyNGL/PyNIO.
В дополнение к обычным свойствам, присущим языкам программирования, NCL также обладает средствами для манипуляции метаданными, тонкой настройки визуализации, импорта данных в различных форматах широко используемых в геонауках и поддержкой матричной алгебры.
В NCL включены более 600 функций и процедур облегчающих жизнь человека который видит перед собой террабайтные массивы данных и понимает что что-то с этим ему придётся делать иначе диплома не видать как своих ушей. Среди них:
- те что используются специально с климатическими и модельными данными
- для расчёта эмпирических ортогональных функций, трансформаций Фурье, сингулярного разложения, осреднения, стандартного отклонения, синусов, косинусов, логорифмов, минимумов, максимумов и так далее.
- получения и трансформации временной информации
- отображения примитивов (линий, залитых площадей, маркеров), спецсимволов для метеокарт, изоповерхностей и других графических объектов
- интерполяция, аппроксимация и регридинг в одном двух и трёх измерениях
- облегчённый анализ скалярных и векторных значений глобальных геофизических величин
Сегодня я расскажу как поставить NCL и написать в нём несложную программу.
Но сначала немного истории. Жила была организация NCAR (National Center for Atmospheric Research) и занималась разными атмосферными исследованиями, как и полагается ей по названию. Люди которые в этой организации работали писали свои какие-то рутинки на Fortran для отображения данных, обменивались ими друг с другом и вот в конце 70х какая то добрая душа, имени которой история не сохранила, собрала все эти рутинки вместе и назвала NCAR Graphics. Пакет имел такой успех что долгое время многие думали что NCAR это такая софтверная компания. В начале 90х NCAR начала задумываться о том что просто визуализации им будет маловато и что нужно создать среду, которая бы позволяла одновременно удобно и обрабатывать и визуализировать геоданные. Было рассмотрено много языков программирования, в том числе и Python, но в то время он еще не достиг таких высот и команду NCAR не устроил. В итоге решили писать свой язык, так и появился NCL.
Установка
Процедура описана для Ubuntu, но будет не сильно отличаться у других дистрибутивов. Для того чтобы скачать бинарники или исходники, кому как больше нравится, нужно запросить аккаунт на сайте Earth System Grid (ESG). Подробно о том как это сделать на русском описано тут. Никто не любит регистрироваться, а уж тем более потом ждать ответа, но я очень прошу вас сделать это. Дело в том что разработчики NCL должны доказывать Национальному Научному Фонду (NSF) что их работа очень нужна и важна для научного сообщества и регистрация это способ вести какой-никакой учёт пользователей. Так что регистрируясь вы помогаете NCL развиваться дальше.
Залогиневшись на сайте, идите в раздел Scientific Data Processing and Visualization Software >> NCAR Command Language (NCL) >> NCL 5.0.0 Release . Тут у вас будет три выбора, я настоятельно советую выбрать бинарники без поддержки OPeNDAP, то есть NCL 5.0.0 binaries (not OPeNDAP-enabled) . Дальше выбирайте свою платформу и скачивайте архив. Стоит заметить что есть сборка даже для Windows, но под Cygwin.
Дальнейший процесс в подробностях описан тут. Я сделаю маленькую выжимку.
Сначала создайте папочку под NCL и скопируйте туда архив, затем распакуйте его
у вас получтся три папки
bin include lib
Теперь необходимо установить переменные среды в вашем .bashrc или .cshrc, в зависимости от шела которым вы пользуетесь:
From C-shell (csh):
set path=( /path/to/NCL/directory/bin $path)
From bash:
export PATH=(/ /path/to/NCL/directory/bin $PATH)
Врятли вы будете работать на удалённом компьютере, поэтому установите также дисплей
from C-shell (csh):
From bash:
Теперь вам только осталось сделать
или
Также не обязательно, но очень рекомендуется создать в вашей домашней директории файл .hluresfile . В нём хранятся различные настройки NCL, такие как умолчальный шрифт, цвет подложки и тому подобное. Образец файла тут.
Всё, NCL готов к употреблению. Проверить это можно написав команду
Должна появится такая картинка:
Если вы не создавали файл .hluresfile по образцу, то фон будет чёрный, напоминая о GrADS 🙂
Может показаться что процедура установки сложна, но это не так. Всё сводится в принципе к трём действиям — распаковке бинарников, прописыванию путей и дисплея и созданию .hluresfile файла. Никаких дополнительных библиотек и настроек, всё уже внутри языка. Это одно из преимуществ NCL, который представляет собой систему всё в одном и обеспечивает сразу рабочую среду со всем необходимым для обработки и визуализации геоданных. Это отличает его от того же Python, в котором для выполнения тех же задач необходимо доставить определённое число дополнительных модулей, каждый из которых может потребовать дополнительные библиотеки и настройки.
Возможно ещё одним шагом который вы захотите сделать чтобы подготовиться к работе с NCL это загрузка подсветки синтаксиса языка для своего любимого текстового редактора. Доступны файлы для Emacs, JED, nedit и конечно VIM.
Переменные
Главная, на мой взгляд, особенность NCL это то, что его переменные это так называемые переменные netCDF. Вообще netCDF это такой формат данных, который сам в себе содержит информацию об этих данных и если вы хотите о нём узнать поподробнее то посмотрите этот пост. Вкратце в хорошо созданном netCDF файле у всех переменных есть так называемые атрибуты, которые описывают что это за переменная, в каких она единицах измерения, от каких координат зависит и так далее. То есть вместе с переменной идут и метаданные описывающие эту переменную. ? эти метаданные NCL понимает, и даже знает что делать с некоторыми из них.
Чтобы может быть более наглядно пояснить как это выглядит, давайте для начала посмотрим на netCDF файл. Для своих бесчеловечных экспериментов как и в случае с Ferret снова выберем файл приземной температуры по данным реанализа за 2008 год.
Посмотреть на его заголовок, то есть на то место где содержатся все метаданные можно при помощи утилиты которая поставляется вместе с NCL — ncl_filedump. Наберите:
Вы увидите описание файла, тех данных что в нём содержатся, их структуру и мета данные. Я не буду рассматривать всё что там понаписано, остановлюсь только на переменной air:
long_name : mean Daily Air temperature at sigma level 995
valid_range : ( 185.16, 331.16 )
actual_range : ( 189.84, 316.47 )
units : degK
add_offset : 512.81
scale_factor : 0.01
missing_value : 32766
precision : 2
least_significant_digit : 1
GRIB_id : 11
GRIB_name : TMP
var_desc : Air temperature
A
dataset : NCEP Reanalysis Daily Averages
level_desc : Surface
0
statistic : Mean
M
parent_stat : Individual Obs
I
_FillValue : 32766
Мы видим что тут описана вся подноготная этой переменной, приведена информация которая нам нужна чтобы адекватно интерпретировать тот набор цифр который в ней содержится. Хорошая переменная в NCL выглядит примерно таким же образом, и метаданные её описывающие не лежат мёртвым грузом, от них реально зависит как будет обрабатываться переменная той или иной функцией.
Давайте, наконец, запустим NCL и напишем в нём наши первые строчки.
Поскольку язык интерпретируемый, то работать мы сможем в нём как и в питоне, передавая аргументы в NCL шел. Для её запуска нужно набрать, как не сложно догадаться:
при этом вы увидите приглашение
University Corporation for Atmospheric Research
NCAR Command Language Version 5.0.0
The use of this software is governed by a License Agreement.
See http://www.ncl.ucar.edu/ for more details.
ncl 0>
Ссоздадим переменную и выведем её содержание на экран
ncl 1> print(a)
Variable: a
Type: integer
Total Size: 4 bytes
1 values
Number of Dimensions: 1
Dimensions and sizes: [1]
Coordinates:
(0) 2
ncl 2>
Вместо того чтобы вывести просто цифру 2, NCL рассказывает про нашу переменную массу всякого. Тут тебе и тип (автоматом создал integer) и размер в байтах, и количестов значений, количество измерений, их имена (в данном случае нет) и размер, координаты и, наконец, значение. Эти все подробности нужны потому что переменные в NCL, как я уже писал выше, обычно содержат мета информацию. Давайте посмотрим как это выглядит для реальной переменной. Сначала нам нужно загрузить файл
«r» значит открыть для чтения.
Огромное преимущество NCL в том что загружать вы можете файлы нескольких популярных в узких кругах форматов — NetCDF, HDF (только Scientific Data Sets), HDF-EOS (только GRID and SWATH), GRIB1, GRIB2. При этом переменные которые вы будете импортировать в NCL будут выглядеть единообразно и приводиться к стандарту netCDF. Это значит что никаких дополнительных телодвижений вам не потребуется и скрипт написанный для данных в HDF формате, с большой долей вероятности будет работать почти без изменений и с теми же данными в GRIB2.
?мпортируем из файла переменную (в нашем случае air):
Теперь давайте получим информацию об этой переменной, использовав для этого команду prinVarSummary
Variable: surf_air
Type: short
Total Size: 7274304 bytes
3637152 values
Number of Dimensions: 3
Dimensions and sizes: [time | 346] x [lat | 73] x [lon | 144]
Coordinates:
time: [17593032..17601312]
lat: [90..-90]
lon: [ 0..357.5]
Number Of Attributes: 17
long_name : mean Daily Air temperature at sigma level 995
valid_range : ( 185.16, 331.16 )
actual_range : ( 189.84, 316.47 )
units : degK
add_offset : 512.81
scale_factor : 0.01
missing_value : 32766
precision : 2
least_significant_digit : 1
GRIB_id : 11
GRIB_name : TMP
var_desc : Air temperature
A
dataset : NCEP Reanalysis Daily Averages
level_desc : Surface
0
statistic : Mean
M
parent_stat : Individual Obs
I
_FillValue : 32766
?нформация во многом повторяет то что мы видели набрав ncl_filedump air.sig995.2008.nc | more . Обратите внимание на атрибуты add_offset и scale_factor. Они означают что для того чтобы получить действительно значения в Кельвинах, нам нужно с данными проделать следующую операцию:
surf_air_float = surf_air*scale_factor + add_offset
Это обычный приём применяемый для того чтобы уменьшить размер файла. Возможно вы заметили что тип переменной air в исходном файле, а теперь и нашей переменной surf_air был short, что значит её размер всего 16 бит и она может содержать значения +/- (32767). Для того чтобы хранить переменные типа float, для каждой из них требуется 32 бита. Может для небольших файлов это и не так значимо, но когда счёт идёт на террабайты, приходится экономить каждый бит. Файл довольно сильно уменьшается, при этом переход от short к float происходит чрезвычайно просто.
В нашем случае мы можем поступить двумя способами.
Первый — явно сконвертировать
как видите для доступа к значениям атрибутов используется знак @. Недостаток этого метода в том что в данном случае мы потеряем все метаданные, и у переменной surf_air_float не будет всех этих полезных атрибутов, а этого нам очень не хотелось бы. Поэтому пойдём другим путём и используем так называемую contributed функцию. Это функции которые были написаны пользователями на NCL и теперь поставляются вместе с ним, но для того чтобы получить к ним доступ надо их загрузить выполнив команду
Функция называется short2flt и выполнит нашу конвертацию самостоятельно обнаружив и использовав атрибуты add_offset и scale_factor без потерь метаданных.
Следующий шаг конвертация Кельвинов в градусы Цельсия
При этом если вы попытаетесь создать новую переменную, в которой были бы значения в градусах Цельсия, например так:
то потеряете все метаданные, потому что это новая переменная и данные старой к ней не относятся.
Вы можете убедиться что данные теперь действительно в градусах Цельсия, набрав
Когда вам всё таки надоест листать огромный масиив данных нажмите q. Несмотря на то что данные у нас теперь в Цельсиях, метаданные говорят о Кельвинах (degK), давайте исправлять это недоразумение
Теперь мы можем записать netCDF файл с нашими сконвертированными из Кельвинов в Цельсии значениями. Простой, очень популярный, но очень не надёжный и не рекомендуемый разработчиками вариант это
fout@title = "NCEP in degC"
fout->air = surf_air_float
У меня, например, в результате куда-то потерялись метаданные долготы. Более эффективный, правильный и продвинутый вариант я опишу в следующий раз.
Графика
На закуску, чуть-чуть тронем гордость NCL — возможности визуализации. Если вам нужны подробности о том что такое worstation, ресурсы и colormap, отправляю вас в пост про PyNGL, в котором всё это подробно описано. Здесь же информация будет минимальна, как и сам скрипт.
Чтобы нарисовать наши данные, нам снова придётся подгрузить парочку скриптов
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl"
Потом открыть рабочую станцию, определить ресурсы и собственно нарисовать.
res = True
plot = gsn_csm_contour_map(wks,surf_air_float(0,:,:),res) ; create the plot
Результат будет выведен в файл surf_air_float.ps . Он не очень впечатляет, но чего вы хотели от пары строчек.
Буквально парой штрихов гадкий утёнок превращается в прекрасного лебедя 🙂
gsn_define_colormap(wks,"posneg_1") ; Choose color map
res = True
res@cnFillOn = True
res@cnLinesOn = False
res@gsnSpreadColors = True
; res@cnFillMode = "Rasterfill"
plot = gsn_csm_contour_map(wks,surf_air_float(0,:,:),res) ; create the plot
Ещё один вариант с раскомментированной res@cnFillMode = «Rasterfill»
Николай, есть шкурный вопрос: тут геологов не шибко много, а данные обрабатывать надо. Что собой геоданные представляют? Просвети нездешних 🙂
Если я всё правильно понял, то этим NCL можно анализировать и простые изображения. Ну вот, например, есть куча картинок и хочется посмотреть на карту их отличий друг от друга. Можно ли такое сделать?
Возможно термин геоданные это совсем неудачный перевод geo reference data. То есть данные привязанные к координатной сетке, те у которых каждому значению соответствуют минимум широта и долгота, а максимум широта, долгота, вертикальный уровень и время. Часть слова «Гео» означает в данном случае не геологию а географию, географические координаты.
Но конечно по большому счёту это не более чем матрицы двух (в случае с lat/lon), трёх или четрырёх (lat/lon. level, time) размерные. У которых координаты lat/lon это примерно тоже что n, m. Например, насколько я понимаю твой случай с шифрованием ты можешь задать скажем размеры листа A4 при том что разрешение у тебя 1mm так (питоновский синтаксис)
m = range(210)
n = range(297)
У тебя получатся координаты.
Дальше можно работать с твоими данными как с простыми матрицами, только у них будут метаданные (если ты захочешь их заполнить). А для большинства функций даже координаты не требуются по моему.
То естъ ответ на твой второй вопрос про изображения — да можно. При этом, допустим, если у твоих данных есть атрибут _FillValue то все данные равные этому значению будут считатъся потерянными (похоже на NaN в матлабе), и при операциях учитыватся не будут.
http://www.ncl.ucar.edu/Document/Functions/ здесь список функций которые можно применять к данным.
Если есть желание то можем поскайпится по поводу того имеет ли смысл применять NCL в твоей области :=)
Спасибо за пояснения в комментариях, стало понятнее. Так всегда бывает, когда пишешь про то, чем занимаешься: «так всё ж понятно!». А всякие нездешние поселяне долго чешут затылок со словами «Шо это было!?» :-))
>> Если есть желание то можем поскайпится по поводу того имеет ли смысл применять NCL в твоей области :=)
С удовольствием!
На этих выходных могу пообщаться после 20:00 по Москве.
Да, при этом если начинаешь разжовывать то начинает казаться что получается очень долго просто и скучно )
Давай попробуем пересечся вечером на выходных. Увижу тебя в скайпе после 20, позвоню )) Ну или ты )
Virens, а что за данные у тебя? Геология и геонауки, как ни странно, часто очень далёкие друг от друга понятия. 🙂 ? данные у них разные.
Вот океанологам, метеорологам и прочим интересны данные с пространственным разрешением от 100 метров в пикселе и больше, до глобального масштаба.
А геологам нужны данные метрового разрешения, геодезистам нужны сантиметры в пикселе. Причём им очень важна точная географическая привязка. Так что если нужно обрабатывать такие данные, то лучше ещё взглянуть в сторону Гео?нформационных Систем (Г?С). Там очень удобно работать с характеристиками как периметры, площади, смещения.
Под *nix есть куча качественного софта, вроде GrassGIS, QuantumGIS, gvSIG. В GrassGIS можно потоком делать довольно сложную обработку, и с R неплохая интеграция. Самое главное отличие, на мой взгляд, в том, что Г?Сы сделаны для интерактивной работы, когда требуется визуальный анализ и пр.
Хотя метеорологам вроде меня пингль, энсиэль и прочие градсы милей всего. 😉
Очень интересная статья.
А как тут обстоят дела с кириллицей?
2Артем
С кирилицей думаю там дела примерно такие же как в пингле. То етсь шрифт есть, но пользоваться им геморно и выглядит он страшно. Вот ссылка на дискуссию по этому поводу (она правда про пингль, но думаю что также относится и к NCL)
http://www.pyngl.ucar.edu/User_forum/Archives/2008/0125.html
Здравствуйте, Николай! На моей работе планируется разработка серии скриптов на NCL для визуализации гидрометеорологичеких данных (задача поставленна несколько «в общем», рассматривается также возможность включения других технологий). Как Вы считаете — в описанной ситуации целесообразно рассматривать связку NCL Python или же лучше использовать NCL сам по себе? Заранее, спасибо.
Артем, привет.
Тут все зависит от ваших предпочтений 🙂 Мне все же кажется что использовать PyNGL лучше, поскольку тогда вы получаете в свое распоряжение всю мощь Python, со всеми дополнительными модулями и т.д. и т. п. С другой стороны используя чистый NCL вы можете обнаружить много уже написанных «гидрометеорологических» утилит, которых нет в питоне.
С точки зрения отображения данных они практически одинаковые.
Like!! I blog frequently and I really thank you for your content. The article has truly peaked my interest.
Good Sites To Buy Viagra [url=http://apcialisle.com/#]Cialis[/url] Ways To Last Longer cheapest cialis Amlodipine No Prescription
Order Generic Propecia Male Pattern Hair Loss [url=https://apcialisle.com/#]Cialis[/url] Cialis Madrid Entrega En Mano Cialis Propecia Lupus
Buy Levitra [url=https://buyciallisonline.com/#]Cialis[/url] Cialis Generico Prezzi cialis online ordering Thecanadiandrugstore
Mail Order Drug Store In Belize [url=http://cialibuy.com/#]Cialis[/url] Purchase Effexor Xr Cialis Finasteride 3 Meses Propecia
Hi to every body, it’s my first pay a visit of this website; this weblog contains amazing and truly fine stuff for readers.|
Info
[…]scatman[…]
Text
[…]This is very interesting[…]
vickijedwards
everun triumph superga velvet leopard schuhe oneplus one hoesje nike philadelphia eagles 82 mike quick green backer long sleeve t shirt proenza schouler torba mini moto g6 holster case
demuslimah
nike dunk high black varsity maize for cheap pandora tree of life charm moncler coat womens shiny cheap red sox jerseys china vintage bruins gear sell christian louboutin