<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" version="2.0">

<channel>
	<title>Записки океанолога - обработка и визуализация данных</title>
	
	<link>http://koldunov.net</link>
	<description>использование Python, Matlab, GMT   и  linux-систем в геонауках</description>
	<lastBuildDate>Fri, 13 Apr 2012 19:22:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/koldunovnet" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="koldunovnet" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>53</geo:lat><geo:long>10</geo:long><creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/2.0/</creativeCommons:license><item>
		<title>Открываем netCDF в MATLAB (на примере NCEP реанализа)</title>
		<link>http://koldunov.net/?p=540</link>
		<comments>http://koldunov.net/?p=540#comments</comments>
		<pubDate>Thu, 09 Jun 2011 14:17:32 +0000</pubDate>
		<dc:creator>koldunovn</dc:creator>
				<category><![CDATA[MATLAB]]></category>
		<category><![CDATA[Обработка данных]]></category>
		<category><![CDATA[Без рубрики]]></category>
		<category><![CDATA[Matlab]]></category>
		<category><![CDATA[netCDF]]></category>

		<guid isPermaLink="false">http://koldunov.net/?p=540</guid>
		<description><![CDATA[Задача: Открыть файл формата netCDF в MATLAB Решение: чистый незамутненный MATLAB Постараюсь описать здесь ответ на этот животрепещущий вопрос, чтобы было куда отправлять страждущих с различных форумов. Начиная с версии 7.7, Matlab поддерживает работу с форматом netCDF нативно, без различных примочек, которые требовались раньше. Синтаксис, который используется для работы с netCDF файлами довольно странный, ну [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Задача:</strong> Открыть файл формата <em>netCDF</em> в <em>MATLAB</em><br />
<strong>Решение</strong>: чистый незамутненный <em>MATLAB</em></p>
<p>Постараюсь описать здесь ответ на этот животрепещущий вопрос, чтобы было куда отправлять страждущих с различных форумов. Начиная с версии 7.7, <em>Matlab</em> поддерживает работу с форматом <em>netCDF</em> нативно, без различных примочек, которые требовались раньше. Синтаксис, который используется для работы с <em>netCDF</em> файлами довольно странный, ну да, не мне судить. Здесь я опишу, как в <em>Matlab</em> совершить одно простое действие, а именно прочитать данные из файла.<br />
<span id="more-540"></span><br />
Если вы собираетесь работать с <em>netCDF</em>, то для начала неплохо бы ознакомиться с тем, <a href="http://www.oceanographers.ru/forum/viewtopic.php?f=7&#038;t=80">что из себя представляет этот формат</a>. В этом случае дальнейшее не будет вам казаться абракадаброй. Но в общем случае можно обойтись и без этих уникальных знаний, если все, что вам нужно, это выковырять данные из файла и забыть о <em>netCDF</em> как о страшном сне. Информация о функциях Матлаба для работы с <em>netCDF</em> расположена <a href="http://www.mathworks.com/help/techdoc/ref/netcdf.html">тут</a>.</p>
<p>Для начала, давайте скачаем подопытный файл. Это будет файл с шестичасовой приземной температурой любимого всеми гидрометеорологами <a href="http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanalysis.surface.html"><em>NCEP</em> реанализа</a>. Я буду использовать<a href="ftp://ftp.cdc.noaa.gov/Datasets/ncep.reanalysis/surface/air.sig995.2010.nc"> вот этот файл за 2010 год</a> (20 мегабайт). Чтобы открыть <em>netCDF</em> файл, нужно иметь представление о его структуре, о тех переменных которые в нем находятся и об аттрибутах этих переменных. Для этого служит функция <em>ncdisp</em>.</p>
<div class="codecolorer-container matlab default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="matlab codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">ncdisp<span style="color: #080;">&#40;</span><span style="color:#A020F0;">'air.sig995.2010.nc'</span><span style="color: #080;">&#41;</span></div></div>
<p>В результате вы получите табличку с данными по вашему файлу. По большому счету вас должно интересовать только то что находится в разделе <em>Variables</em>, то есть информация о переменных, содержащихся в вашем файле. В данном примере это переменные <em>lat</em> (широты), <em>lon</em> (долготы), <em>time</em>(время прошедшее от 1-1-1 00:00:0.0 в часах), <em>air</em> (температура воздуха в Кельвинах).</p>
<p><strong>UPD</strong>: Говорят что не во всех релизах Матлаба есть функция <em>ncdisp</em>. Если у вас тот самый запущенный случай, то для виндоуз вы <a href="http://www.unidata.ucar.edu/downloads/netcdf/">скачиваете бинарники программы <em>ncdump</em> отсюда</a>, для Убунту Линукс и ему подобных пишите в терминале:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get install</span> netcdf-bin</div></div>
<p>Далее в терминале виндоуз или линукс вводите команду</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">ncdump <span style="color: #660033;">-h</span> air.sig995.2010.nc</div></div>
<p>по идее, если вы работаете в Виндоуз, то программа <em>ncdump.exe</em> должна быть в папке с файлом. Эта команда выведет вам примерно ту же информацию что и ncdisp.</p>
<p>Сначала давайте попробуем добыть главное - температуру воздуха. Перво-наперво нужно открыть файл, для того чтобы <em>Matlab</em> мог с ним работать:</p>
<div class="codecolorer-container matlab default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="matlab codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">ncid = netcdf.<span style="color: #0000FF;">open</span><span style="color: #080;">&#40;</span><span style="color:#A020F0;">'air.sig995.2010.nc'</span>,<span style="color:#A020F0;">'NC_NOWRITE'</span><span style="color: #080;">&#41;</span>;</div></div>
<p>По каким-то своим внутренним причинам функции, которые запрашивают данные из переменных <em>netCDF</em>, работают не с их именами, а с их порядковыми номерами, поэтому нам нужно узнать каков порядковый номер переменной <em>air</em>:</p>
<div class="codecolorer-container matlab default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="matlab codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&gt;&gt; varid = netcdf.<span style="">inqVarID</span><span style="color: #080;">&#40;</span>ncid,<span style="color:#A020F0;">'air'</span><span style="color: #080;">&#41;</span><br />
<br />
varid =<br />
<br />
&nbsp; &nbsp; &nbsp;<span style="color: #33f;">3</span></div></div>
<p>Получился порядковый номер 3. Мы в общем и сами могли это посчитать, зная, что счет переменных в данном случае идет с нуля, а не с единицы.<br />
Теперь, зная порядковый номер <em>netCDF</em> переменной, мы можем скопировать значения из нее в переменную Матлаба:</p>
<div class="codecolorer-container matlab default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="matlab codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">data = netcdf.<span style="">getVar</span><span style="color: #080;">&#40;</span>ncid,<span style="color: #33f;">3</span><span style="color: #080;">&#41;</span>;</div></div>
<p>В итоге вы получите трехмерную матрицу <em>[долгота, широта, время]</em>. Казалось бы задача решена, но не стоит торопиться. Если вы взгляните на значения в переменной <em>data</em>, то они будут очень отдаленно напоминать то, что вы ожидаете увидеть, таких температур, даже если они выражены в Кельвинах, на Земле не бывает. Дело в том что данные в файлах реанализа хранятся в виде целых чисел, которые занимают гораздо меньше места чем числа с плавающей запятой. Делается это для того, чтобы файлы были меньше. Чтобы получить температуру, нужно преобразовать эти данные нехитрым способом.</p>
<p>Если вы посмотрите на атрибуты для переменной <em>air</em>, полученные при помощи <em>ncdisp</em>, то увидите там:</p>
<div class="codecolorer-container matlab default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="matlab codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">add_offset &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= <span style="color: #33f;">513</span><br />
scale_factor &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= <span style="color: #33f;">0.01</span></div></div>
<p>Для того, чтобы получить данные в Кельвинах, нужно умножить все на <em>scale_factor</em> и прибавить <em>add_offset</em>.</p>
<p>Вы можете просто взять эти цифры из описания файла, либо вытянуть их при помощи следующих команд:</p>
<div class="codecolorer-container matlab default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="matlab codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">add_off &nbsp; &nbsp; &nbsp; &nbsp;= netcdf.<span style="">getAtt</span><span style="color: #080;">&#40;</span>ncid,<span style="color: #33f;">3</span>,<span style="color:#A020F0;">'add_offset'</span><span style="color: #080;">&#41;</span><br />
scale_factor &nbsp;= netcdf.<span style="">getAtt</span><span style="color: #080;">&#40;</span>ncid,<span style="color: #33f;">3</span>,<span style="color:#A020F0;">'scale_factor'</span><span style="color: #080;">&#41;</span></div></div>
<p>К сожалению, просто так умножить и прибавить не получится. Если вы сейчас попробуете проделать эту операцию, то получите следующую ошибку:</p>
<div class="codecolorer-container matlab default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="matlab codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Integers can only be combined with integers of the same <span style="color: #0000FF;">class</span>, or scalar doubles.</div></div>
<p>Дело в том, что тип переменной <em>data</em> сейчас <em>int16</em> и на числа с плавающей запятой они умножаться не хотят. Необходимо перевести данные в тип <em>single</em></p>
<div class="codecolorer-container matlab default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="matlab codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">data_single = <span style="color: #0000FF;">single</span><span style="color: #080;">&#40;</span>data<span style="color: #080;">&#41;</span>;</div></div>
<p>На самом деле можно это сделать уже при копировании данных из переменной <em>netCDF</em> в переменную Матлаб. Далее переводим в Кельвины:</p>
<div class="codecolorer-container matlab default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="matlab codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">data_scaled = <span style="color: #080;">&#40;</span>data*scale_factor<span style="color: #080;">&#41;</span>+add_off;</div></div>
<p>И, если нужно, в Цельсии</p>
<div class="codecolorer-container matlab default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="matlab codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">data_cel &nbsp; &nbsp;= data_scaled-<span style="color: #33f;">273.15</span></div></div>
<p>Еще немного полезной информации по этому вопросу есть <a href="http://www.oceanographers.ru/forum/viewtopic.php?f=7&#038;t=835">в этой ветке нашего форума</a>.</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="" href="http://koldunov.net/?p=540">{lang: 'ru'}</g:plusone></div><img src="http://feeds.feedburner.com/~r/koldunovnet/~4/loYwnPoydrc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://koldunov.net/?feed=rss2&amp;p=540</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NAO индекс в netCDF формате</title>
		<link>http://koldunov.net/?p=521</link>
		<comments>http://koldunov.net/?p=521#comments</comments>
		<pubDate>Thu, 26 May 2011 14:25:33 +0000</pubDate>
		<dc:creator>koldunovn</dc:creator>
				<category><![CDATA[Без рубрики]]></category>
		<category><![CDATA[netCDF]]></category>
		<category><![CDATA[PyNGL]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://koldunov.net/?p=521</guid>
		<description><![CDATA[Задача: перевести Индекс Северо-Атлантической Осциляции (NAO) из ASCII в netCDF формат Решение: используем модули Python - PyNio, numpy, time Индексом NAO (а также его близким родственником AO) пользуется огромное количество народа, но найти его в netCDF формате мне не удалось. Пришлось делать самому. Кому нужен просто файлик - вот он NAO index in netCDF format [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://koldunov.net/wp-content/uploads/2011/05/nao.gif"><img src="http://koldunov.net/wp-content/uploads/2011/05/nao-300x249.gif" alt="" title="nao" width="300" height="249" class="alignleft size-medium wp-image-525" /></a><br />
<strong>Задача:</strong> перевести Индекс Северо-Атлантической Осциляции (<em>NAO</em>) из <em>ASCII</em> в <em>netCDF</em> формат<br />
<strong>Решение:</strong> используем модули <em>Python</em> -<em> PyNio, numpy, time</em></p>
<p>Индексом <em>NAO</em> (а также его близким родственником <em>AO</em>) пользуется огромное количество народа, но найти его в <em>netCDF</em> формате мне не удалось. Пришлось делать самому. Кому нужен просто файлик - вот он <a href="http://koldunov.net/netcdf/NAO_conv.nc"><strong>NAO index in netCDF format</strong></a> (up to 2011.04). Кто хочет посмотреть на очередной пример использования <em>Nio</em> для создания <em>netCDF</em> файла, велкам под кат.<br />
<span id="more-521"></span><br />
Более подробно про <em>NAO</em> <a href="http://en.wikipedia.org/wiki/North_Atlantic_oscillation">можно почитать в википедии</a>. Если коротко, то <em>NAO</em> это индекс, характеризующий изменчивость атмосферного давления, с которым любят связывать (зачастую успешно) различные явления в океане и атмосфере - от ледовитости СЛО до частоты тропических циклонов. Его упоминание можно найти чуть не в каждой статье посвященной Арктике или северной Атлантике. Тем более странно, что при такой популярности версии <em>NAO</em> в формате <em>netCDF</em> в интернете не нашлось, обычно он распространяется в виде текстовых файлов. Чтобы исправить эту несправедливость я написал небольшой скрипт, при помощи которого можно в принципе конвертировать любой текстовый файл вида:</p>
<p><em>Год    Месяц    Значение</em></p>
<p>в  <em>netCDF</em>.<br />
Значения индекса брались с <a href="http://www.cpc.ncep.noaa.gov/products/precip/CWlink/pna/nao.shtml">этого сайта</a> (там же можете найти и <em>AO</em>). </p>
<p>Сам скрипт:</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">#Convert NAO index from http://www.cpc.ncep.noaa.gov/products/precip/CWlink/pna/nao.shtml</span><br />
<span style="color: #808080; font-style: italic;">#to netCDF file</span><br />
<span style="color: #808080; font-style: italic;">#</span><br />
<span style="color: #808080; font-style: italic;">#Created by Nikolay Koldunov</span><br />
<span style="color: #808080; font-style: italic;">#koldunovn@gmail.com</span><br />
<span style="color: #808080; font-style: italic;">#Description in Russian at http://koldunov.net/?p=521</span><br />
<br />
<br />
<span style="color: #ff7700;font-weight:bold;">import</span> numpy<br />
<span style="color: #ff7700;font-weight:bold;">import</span> Nio<br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span> <br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> timetostep<span style="color: black;">&#40;</span>start_date_time<span style="color: #66cc66;">,</span>time_step<span style="color: #66cc66;">,</span> present_time<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">&quot;&quot;&quot; &nbsp;Convert date to amount of timesteps since start date &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; Usage:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; timetostep(start_date_time, time_step, present_time )<br />
&nbsp; &nbsp; &nbsp; &nbsp; Input:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; start_date_time - should be string in form of YYYYDDMMhhmmss<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; time_step - model timestep (deltaT) in seconds<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; present_time - should be string in form of YYYYDDMMhhmmss<br />
&nbsp; &nbsp; &nbsp; &nbsp; Output: time step <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;&quot;&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; start_date_time_in_python_format <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">time</span>.<span style="color: black;">strptime</span><span style="color: black;">&#40;</span>start_date_time<span style="color: #66cc66;">,</span><span style="color: #483d8b;">&quot;%Y%m%d%H%M%S&quot;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; start_date_time_in_seconds <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">time</span>.<span style="color: black;">mktime</span><span style="color: black;">&#40;</span>start_date_time_in_python_format<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; present_time_in_python_format &nbsp; <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">time</span>.<span style="color: black;">strptime</span><span style="color: black;">&#40;</span>present_time<span style="color: #66cc66;">,</span><span style="color: #483d8b;">&quot;%Y%m%d%H%M%S&quot;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; present_time_in_seconds <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">time</span>.<span style="color: black;">mktime</span><span style="color: black;">&#40;</span>present_time_in_python_format<span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; seconds_from_start_date <span style="color: #66cc66;">=</span> present_time_in_seconds &nbsp;- start_date_time_in_seconds<br />
&nbsp; &nbsp; &nbsp; &nbsp; present_time_step <span style="color: #66cc66;">=</span> seconds_from_start_date/time_step<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> present_time_step<br />
<br />
<span style="color: #dc143c;">os</span>.<span style="color: black;">system</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;rm NAO_conv.nc&quot;</span><span style="color: black;">&#41;</span><br />
<br />
input_file <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'./norm.nao.monthly.b5001.current.ascii'</span><br />
ifile <span style="color: #66cc66;">=</span> <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>input_file<span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'r'</span><span style="color: black;">&#41;</span><br />
lines <span style="color: #66cc66;">=</span> ifile.<span style="color: black;">readlines</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
nao &nbsp; <span style="color: #66cc66;">=</span> numpy.<span style="color: #dc143c;">array</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
ttime <span style="color: #66cc66;">=</span> numpy.<span style="color: #dc143c;">array</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">for</span> line <span style="color: #ff7700;font-weight:bold;">in</span> lines<span style="color: black;">&#91;</span>:<span style="color: black;">&#93;</span>:<br />
&nbsp; &nbsp; ttime <span style="color: #66cc66;">=</span> numpy.<span style="color: black;">append</span><span style="color: black;">&#40;</span>ttime<span style="color: #66cc66;">,</span> timetostep<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;19480101000000&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">3600</span> <span style="color: #66cc66;">,</span> line.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>+line.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>.<span style="color: black;">zfill</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>+<span style="color: #483d8b;">&quot;15000000&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; nao &nbsp; <span style="color: #66cc66;">=</span> numpy.<span style="color: black;">append</span><span style="color: black;">&#40;</span>nao<span style="color: #66cc66;">,</span><span style="color: #008000;">float</span><span style="color: black;">&#40;</span>line.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <br />
opt <span style="color: #66cc66;">=</span> Nio.<span style="color: black;">options</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
opt.<span style="color: black;">PreFill</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">False</span><br />
opt.<span style="color: black;">HeaderReserveSpace</span> <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">4000</span><br />
f <span style="color: #66cc66;">=</span> Nio.<span style="color: black;">open_file</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;NAO_conv.nc&quot;</span><span style="color: #66cc66;">,</span><span style="color: #483d8b;">&quot;w&quot;</span><span style="color: #66cc66;">,</span>opt<span style="color: black;">&#41;</span><br />
<br />
f.<span style="color: black;">title</span> <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;NAO index in netCDF format&quot;</span><br />
f.<span style="color: black;">source</span> <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;http://www.cpc.ncep.noaa.gov/products/precip/CWlink/pna/nao.shtml&quot;</span><br />
f.<span style="color: black;">author</span> <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;Nikolay Koldunov, koldunovn@gmail.com&quot;</span><br />
f.<span style="color: black;">url</span> &nbsp; &nbsp;<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;http://koldunov.net/?p=521&quot;</span><br />
<br />
f.<span style="color: black;">create_dimension</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'time'</span><span style="color: #66cc66;">,</span>ttime.<span style="color: black;">shape</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><br />
<br />
f.<span style="color: black;">create_variable</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'time'</span><span style="color: #66cc66;">,</span><span style="color: #483d8b;">'d'</span><span style="color: #66cc66;">,</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'time'</span><span style="color: #66cc66;">,</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
f.<span style="color: black;">variables</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'time'</span><span style="color: black;">&#93;</span>.<span style="color: black;">units</span> &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;hours since 1948-01-01 00:00:00&quot;</span> <br />
f.<span style="color: black;">variables</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'time'</span><span style="color: black;">&#93;</span>.<span style="color: #dc143c;">calendar</span> &nbsp; &nbsp; <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;proleptic_gregorian&quot;</span><br />
f.<span style="color: black;">variables</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'time'</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>:<span style="color: black;">&#93;</span> <span style="color: #66cc66;">=</span> ttime<span style="color: black;">&#91;</span>:<span style="color: black;">&#93;</span><br />
<br />
f.<span style="color: black;">create_variable</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'NAO'</span><span style="color: #66cc66;">,</span><span style="color: #483d8b;">'d'</span><span style="color: #66cc66;">,</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'time'</span><span style="color: #66cc66;">,</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
f.<span style="color: black;">variables</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'NAO'</span><span style="color: black;">&#93;</span>.<span style="color: black;">long_name</span> &nbsp; &nbsp;<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;NAO index&quot;</span><br />
f.<span style="color: black;">variables</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'NAO'</span><span style="color: black;">&#93;</span>.<span style="color: black;">units</span> &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;non dimensional&quot;</span><br />
f.<span style="color: black;">variables</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'NAO'</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>:<span style="color: black;">&#93;</span> <span style="color: #66cc66;">=</span> nao<br />
<br />
f.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div></div>
<p>Небольшие пояснения. Функция <em>timetostep</em> работает очень похоже на то, что <a href="http://koldunov.net/?p=193">описано в этом посте</a>, только наоборот :) У нее страшные имена переменных, но уж так мне захотелось сделать в тот момент, когда я ее писал. Нужна она нам для того, чтобы рассчитать для каждой даты, на которую у нас есть индекс (считаем, что индекс задан на 15 число каждого месяца), количество часов прошедшее с "начального" момента времени, который будет стоять в аттрибуте <em>units</em> нашей переменной <em>time</em>. Напомню, что в <em>netCDF</em> файле время может задаваться разными способами и один из них "<em>hours since</em>" - количество часов, прошедшее с какого-нибудь момента времени. В нашем случае это "<em>1948-01-01 00:00:00</em>".</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #dc143c;">os</span>.<span style="color: black;">system</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;rm NAO_conv.nc&quot;</span><span style="color: black;">&#41;</span></div></div>
<p><em>PyNio</em> будет ругаться если файл, уже существует, так что стираем его, если он у нас вдруг уже есть.</p>
<p>Далее стандартно открываем текстовый файл, считываем его построчно в переменную <em>lines</em>, создаем пустые пока переменные <em>nao</em> и <em>ttime</em>. В цикле обрабатываем каждую строку. К переменной <em>time</em> присоединяем результат работы функции <em>timetostep</em>, которой частично передаем значения полученные из нашего текстового файла, а именно год и месяц. Заметьте, что при передаче месяца используется <em>zfill(2)</em>, чтобы номер месяца всегда состоял из двух цифр (например не 3, а 03 для марта). Величина временного шага задана в <em>3600</em> - что соответствует одному часу в секундах.</p>
<p>Дальше создается <em>netCDF</em> файл, подобно тому как это описано в <a href="http://koldunov.net/?p=354">этом посте</a>. Измерение (<em>dimension</em>) у нас только одно - время. Единицы измеререния - часы с 1 января 1948 года. Можно, при желании, сделать и "<em>seconds since 1948-01-01 00:00:00</em>", тогда нужно будет поменять <em>3600</em> на <em>1</em> при вызове функции <em>timetostep</em>.</p>
<p>Если вы сконвертируете при помощи этого скрипта какие-нибудь полезные индексы, то с удовольствием размещу их <em>netCDF</em> файлы здесь, либо на <em>Oceanographers.RU</em> для использования людьми, которые не так нежно любят Python как мы с вами :)</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="" href="http://koldunov.net/?p=521">{lang: 'ru'}</g:plusone></div><img src="http://feeds.feedburner.com/~r/koldunovnet/~4/b0EtlEgb2yk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://koldunov.net/?feed=rss2&amp;p=521</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Компиляция и настройка MITgcm, океан в компьютере. Часть 3, запуск и просмотр результатов</title>
		<link>http://koldunov.net/?p=478</link>
		<comments>http://koldunov.net/?p=478#comments</comments>
		<pubDate>Tue, 10 May 2011 00:05:01 +0000</pubDate>
		<dc:creator>koldunovn</dc:creator>
				<category><![CDATA[Без рубрики]]></category>

		<guid isPermaLink="false">http://koldunov.net/?p=478</guid>
		<description><![CDATA[В предыдущих частях (раз, два) мы рассмотрели компиляцию модели и подготовку к ее запуску. В этой части мы наконец-то заставим модель работать. Давайте соберем то, над чем мы работали в первых двух частях. Перейдите в папку run и скопируйте туда экзешник модели и данные из папки input. cp ../build/mitgcmuv . cp ../input/* . теперь запустите [...]]]></description>
			<content:encoded><![CDATA[<p>В предыдущих частях (<a href="http://koldunov.net/?p=432">раз</a>, <a href="http://koldunov.net/?p=451">два</a>) мы рассмотрели компиляцию модели и подготовку к ее запуску. В этой части мы наконец-то заставим модель работать.<br />
<span id="more-478"></span><br />
Давайте соберем то, над чем мы работали в первых двух частях. Перейдите в папку <strong>run</strong> и скопируйте туда экзешник модели и данные из папки <strong>input</strong>.</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">cp</span> ..<span style="color: #000000; font-weight: bold;">/</span>build<span style="color: #000000; font-weight: bold;">/</span>mitgcmuv .<br />
<span style="color: #c20cb9; font-weight: bold;">cp</span> ..<span style="color: #000000; font-weight: bold;">/</span>input<span style="color: #000000; font-weight: bold;">/*</span> .</div></div>
<p>теперь запустите модель:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">.<span style="color: #000000; font-weight: bold;">/</span>mitgcmuv <span style="color: #000000; font-weight: bold;">&gt;</span> out.txt</div></div>
<p><em>> out.txt</em> служит для перенаправления вывода модели в текстовый файл, который, при желании, можно потом проанализировать.</p>
<p>Если через некоторое время вы увидели в командной строке надпись</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">STOP NORMAL END</div></div>
<p>радуйтесь, у вас все получилось. Если вместо этой надписи появляется ошибка и вы обновлялись до последнего кода из <em>CVS</em>, возможно стоит все таки загрузить последний чекпоинт. Также полезная информация о причинах ошибки может содержаться в файле <strong>STDERR.0000</strong>, который должен появиться в вашей папке, либо собственно в выводе модели, который вы благоразумно сохранили в файл <strong>out.txt</strong>.</p>
<p>Но предположим, что все сработало как надо. Тогда в папке, в которой вы запускали модель должна появиться куча файлов вида</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">T.0000000020.001.001.data</div></div>
<p>,<br />
в которых начальные буквы - название переменной (в данном случае <em>T</em>-температура), затем номер итерации, номер тайла или номер процессора. Если вы помните наше ковыряние в файле <strong>SIZE.h</strong>, сетка модели может быть поделена между тайлами и процессорами, и по умолчанию вывод модели также будет поделен в соответствии с тем, как вы распределили вашу сетку. В нашем случае процессор один и от тайлов мы избавились, так что особых проблем не предвидится. Однако на многопроцессорных системах бывает удобно автоматически сливать все части в один файл, для этого в файле <strong>data</strong> в раздел <em>&#038;PARM01</em> нужно добавить</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">useSingleCpuIO = .TRUE.,</div></div>
<p>Но что-то мы отвлеклись, вернемся к нашим файлам. Есть файлы <strong>*.data</strong> и файлы <strong>*.meta</strong>. Файлы <strong>*.meta</strong> - текстовые и содержат небольшую служебную информацию, то есть метаданные. В файлах <strong>*.data</strong> хранятся результаты работы вашей модели. Представляют они из себя все те же бинарники, которые можно просматривать также, как мы это делали с файлами форсинга и иниациализации во второй части. Имена и единицы измерения основных переменных можно посмотреть <a href="http://mitgcm.org/public/r2_manual/latest/online_documents/node99.html">здесь</a>. Если после имени переменной стоит <em>tave</em>, значит это не "мгновенный" вывод модели не <em>snapshot</em>, а результат осреднения за период времени, заканчивающийся в ту итерацию, номер который стоит в файле. Есть еще файлы пикапов и файлы с описанием грида, которые сгенерировала модель, но мы не будем на них останавливаться.</p>
<p>Смотреть файлы по одному, при помощи нашего простого скрипта из <a href="http://koldunov.net/?p=451">второй части</a>, дело, конечно, интересное, но утомительное. Опять же никакого особого анализа не проведешь. К счастью разработчики модели и им сочувствующие написали большое количество скриптов для обработки и анализа результатов работы модели. К сожалению (ну а для кого-то может быть и к счастью), большинство этих скриптов написано на <em>MATLAB</em>. Основная их масса находится в папке <em>..../MITgcm/utils/matlab</em>. Поройтесь там, найдете много интересного. Для анализа же этого эксперимента можно начать с скриптов настроенных специально под него. Находятся они в папке <em>..../MITgcm/verification/tutorial_global_oce_latlon/diags_matla</em>b . Самый простой способ начать ими пользоваться это находясь в Матлабе, перейти в папку <strong>run</strong> и напечатать:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">path<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">'../diags_matlab'</span>,path<span style="color: #7a0874; font-weight: bold;">&#41;</span>;<br />
mit_loadglobal</div></div>
<p>В итоге вы получите массу картинок с разнообразным анализом, например таким:<br />
<a href="http://koldunov.net/wp-content/uploads/2011/05/matl_an.png"><img src="http://koldunov.net/wp-content/uploads/2011/05/matl_an.png" alt="" title="matl_an" width="553" height="492" class="aligncenter size-full wp-image-483" /></a><br />
Чтобы разобраться с тем, как это сделано, придется самостоятельно покопаться в скриптах.</p>
<p>Как однажды мне сказал один из разработчиков модели: "Настоящие мужчины работают с бинарниками". И чаще всего так и происходит. Уже бинарные файлы вывода модели превращаются в <em>netCDF</em>. Связано это и со скоростью записи данных на диски, которая важна в больших экспериментах и с ограниченностью места на этих самых дисках. Но для небольших экспериментов писать сразу в <em>netCDF</em> может быть удобнее. Давайте настроим нашу модель так, чтобы она сохраняла данные не в бинарных файлах, а сразу в <em>netCDF</em>. За это отвечает отдельный пакет <em>mnc</em>, который мы с вами уже скомпилировали с моделью (если у вас были правильно установлены библиотеки netcdf, конечно).</p>
<p>Для начала сотрем все, что мы насчитали:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #000000; font-weight: bold;">*</span>.data <span style="color: #000000; font-weight: bold;">*</span>.meta</div></div>
<p>Теперь откроем файл <strong>data.pkg</strong>. Скомпилировать пакет бывает недостаточно для того, чтобы он заработал, нужно также "включить" его путем добавления в файл <strong>data.pkg</strong>. Как видите пакет <em>mnc</em> сейчас закомментирован, давайте сотрем <em>#</em> перед ним, тем самым раскомментировав его. В итоге файл <strong>data.pkg</strong> должен выглядеть так:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># Packages (lines beginning &quot;#&quot; are comments)</span><br />
&nbsp;<span style="color: #000000; font-weight: bold;">&amp;</span>PACKAGES<br />
&nbsp;<span style="color: #007800;">useGMRedi</span>=.TRUE.,<br />
&nbsp;<span style="color: #007800;">usePTRACERS</span>=.TRUE.,<br />
&nbsp;<span style="color: #007800;">useMNC</span>=.TRUE.,<br />
&nbsp;<span style="color: #000000; font-weight: bold;">&amp;</span></div></div>
<p>Теперь откроем файл с настройками самого пакета <strong>data.mnc</strong>. Как вы видите тут имеется уже несколько параметров, некоторые из которых закоментированы.  Расскоментируйте параметр <em>snapshot_mnc</em> , поменяйте <em>.FALSE.</em> на <em>.TRUE.</em> и сохраните файл.</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp;<span style="color: #007800;">snapshot_mnc</span>=.TRUE.</div></div>
<p>Похоже, что включение этой опции переводит в формат <em>netCDF</em> не только <em>snapshot</em>ы, но и все остальные типы файлов. Однако поиграв с настройками часть из них можно выводить в бинарный формат.  Процесс настройки пакета <em>mnc</em> похож на процесс настройки большинства пакетов - включаете пакет в <strong>data.pkg</strong> и меняете его параметры в <strong>data.name</strong>. Где искать параметры <a href="http://koldunov.net/?p=451">описано во второй части</a>. </p>
<p>Запустите модель еще раз и в вашей папке появится новая папка с именем</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mnc_test_0001</div></div>
<p>В ней будет содержаться файлы с результатами работы модели в формате <em>netCDF</em>. Теперь их можно смотреть при помощи ncview, который мы установили еще <a href="http://koldunov.net/?p=432">в первой части</a>. Вот, например, температура на глубине <em>-290</em> метров после примерно года интеграции модели:<br />
<a href="http://koldunov.net/wp-content/uploads/2011/05/ncv2.png"><img src="http://koldunov.net/wp-content/uploads/2011/05/ncv2.png" alt="" title="ncv2" width="700" height="338" class="aligncenter size-full wp-image-486" /></a><br />
В публикацию, конечно, не вставишь, но для быстрого просмотра результатов <em>ncview</em> очень хорош.<br />
А вот как выглядит батиметрия , которорая вместе с другими параметрами вашей сетки сохраняется в файл <strong>grid.t001.nc</strong><br />
<a href="http://koldunov.net/wp-content/uploads/2011/05/ncv3.png"><img src="http://koldunov.net/wp-content/uploads/2011/05/ncv3.png" alt="" title="ncv3" width="700" height="343" class="aligncenter size-full wp-image-489" /></a></p>
<p>Обратите внимание на то, что если вы будете считать с несколькими тайлами или на нескольких процессорах, данные в <em>netCDF</em> будут, как и в случае с бинарниками, сохраняться в разные файлы для разных процессоров. Склеивать их потом вместе задача не тривиальная и ни один скрипт для этого предназначенный у меня не завелся. Именно для того чтобы обойти эту неприятность мы избавились от тайлов при редактировании <strong>SIZE.h</strong></p>
<p>На этом я, пожалуй, закончу. Надеюсь что руководство получилось не слишком сумбурным и в итоге окажется кому-нибудь полезным. Как вы уже, наверное, поняли простор для экспериментирования практически безграничный и дальше в нем вам поможет ориентироваться достаточно хорошо написанная документация. Пользоваться лучше всего последней pdf версией, которая расположена <a href="http://mitgcm.org/public/r2_manual/latest/online_documents/manual.pdf">здесь</a>.  Если будет желание поделиться своими результатами, можно это сделать либо в комментах тут, либо на <a href="http://www.oceanographers.ru/forum/">форуме Oceanographers.RU</a>. </p>
<p><strong>UPD</strong> Оказывается люди занимающиеся MITgcm в России уже есть. Сергей Семин из Нижегородского Государственного Технического Университета любезно поделился со мной частью своей магистерской диссертации, в которой дано<a href="http://lib.oceanographers.ru/component/option,com_booklibrary/task,view/id,120/catid,30/Itemid,39/"> теоретическое описание модели и инструкции по ее запуску</a>, во многом более подробные чем те что представлены здесь. </p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="" href="http://koldunov.net/?p=478">{lang: 'ru'}</g:plusone></div><img src="http://feeds.feedburner.com/~r/koldunovnet/~4/zZWY5oOa-0s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://koldunov.net/?feed=rss2&amp;p=478</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Компиляция и настройка MITgcm, океан в компьютере. Часть 2, подготовка к запуску</title>
		<link>http://koldunov.net/?p=451</link>
		<comments>http://koldunov.net/?p=451#comments</comments>
		<pubDate>Mon, 09 May 2011 23:56:29 +0000</pubDate>
		<dc:creator>koldunovn</dc:creator>
				<category><![CDATA[Без рубрики]]></category>

		<guid isPermaLink="false">http://koldunov.net/?p=451</guid>
		<description><![CDATA[Итак, благодаря первой части нашего рассказа, вы продрались сквозь тернии настроек модели, все правильно сделали при компиляции и в итоге получили файл с экзешником модели - mitgcmuv. Скомпилировать модель только пол дела, теперь нужно заставить ее работать. Для этого переходим в папку input. В этой папке находятся файлы для дальнейшей настройки модели и файлы с [...]]]></description>
			<content:encoded><![CDATA[<p>Итак, благодаря <a href="http://koldunov.net/?p=432">первой части нашего рассказа</a>, вы продрались сквозь тернии настроек модели, все правильно сделали при компиляции и в итоге получили файл с экзешником модели - <strong>mitgcmuv</strong>. Скомпилировать модель только пол дела, теперь нужно заставить ее работать.<br />
<span id="more-451"></span><br />
Для этого переходим в папку <strong>input</strong>. В этой папке находятся файлы для дальнейшей настройки модели и файлы с внешними данными, необходимыми для ее работы. Не знаю, чем руководствовались разработчики, когда называли файлы кастомизации модели и пакетов <strong>data</strong>, видимо были для этого какие-то исторические причины, но название жутко неудачное. Никаких данных в файлах <strong>data</strong> не содержится, а содержится в них куча параметров, которые вы можете менять без перекомпиляции модели. Если вы хотите посмотреть, что будет если поменять ускорение свободного падения или сменить уравнение состояния морской воды, то сделать это можно поменяв значения параметров в файлах <strong>data</strong>. </p>
<p>Есть самый главный файл общих настроек модели и называется он просто <strong>data</strong>. Файлы, которые меняют параметры связанные с пакетами называются <strong>data.name</strong>, где <em>name</em> - название пакета. Параметры, которые вы можете изменять перечислены в файле .<em>.../MITgcm/model/inc/<strong>PARAMS.h</strong></em> для основного файла <strong>data</strong>, и в файлах <em>..../MITgcm/pkg/name/<strong>NAME_PARAMS.h</strong></em> для <strong>data.name</strong> файлов пакета, где <em>name</em> - название пакета. Очень удобно, я знаю :) Давайте взглянем поближе на файл <strong>data</strong>.</p>
<p>Он состоит из блоков, начинающихся с</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp;<span style="color: #000000; font-weight: bold;">&amp;</span>PARM01</div></div>
<p>и заканчивающихся знаком <em>&#038;</em>. Полезно помнить, что в некоторых системах может потребоваться замена <em>&#038;</em> на слеш. Следующий параграф при первом прочтении можно смело пропустить, там рассказывается как искать дополнительные параметры для изменения.</p>
<p>Если вы отыскали в файле <strong>PARAMS</strong> какой-то параметр, который хотите поменять, то вам нужно точно знать, в каком блоке этот параметр должен находиться, при изменении его в файле <strong>data</strong>. Тут вы должны сделать еще один финт ушами и пойти в файл <em>..../MITgcm/model/src/<strong>ini_parms.F</strong></em> в случае если интересующий вас параметр должен быть в файле <strong>data</strong>, либо в <em>..../MITgcm/pkg/name/<strong>name_readparms.F</strong></em> (все уже надеюсь помнят что такое <em>name</em>) если собираетесь менять параметры для пакета (файлы типа <strong>data.name</strong>). В этом файле нужно найти к какому списку имен принадлежит интересующий вас параметр. Выглядеть это будет примерно так:</p>
<div class="codecolorer-container fortran default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="fortran codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp;<span style="color: #000066;">NAMELIST</span> <span style="color: #339933;">/</span>PARM02<span style="color: #339933;">/</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #339933;">&amp;</span> cg2dMaxIters, cg2dChkResFreq, cg2dTargetResidual,<br />
&nbsp; &nbsp; &nbsp;<span style="color: #339933;">&amp;</span> cg2dTargetResWunit, cg2dpcOffDFac, cg2dPreCondFreq,<br />
&nbsp; &nbsp; &nbsp;<span style="color: #339933;">&amp;</span> cg3dMaxIters, cg3dChkResFreq, cg3dTargetResidual,<br />
&nbsp; &nbsp; &nbsp;<span style="color: #339933;">&amp;</span> useSRCGSolver</div></div>
<p>Здесь <em>PARM02</em> - название блока, в котором должен быть ваш параметр при изменении его в файле <strong>data</strong> (или <strong>data.name</strong> для пакета). То есть вы должны посмотреть название параметра в одном файле, куда его поместить во втором, а собственно изменить уже в третьем. На первых порах дико, но потом привыкаешь :).</p>
<p>Рассмотрим некоторые из параметров файла <strong>data</strong>.</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp;tRef = <span style="color: #000000;">15</span><span style="color: #000000; font-weight: bold;">*</span><span style="color: #000000;">20</span>.,<br />
&nbsp;sRef = <span style="color: #000000;">15</span><span style="color: #000000; font-weight: bold;">*</span><span style="color: #000000;">35</span>.,</div></div>
<p>Референсная температура и соленость. Необходимость их задавать связана с особенностью формулировки модели. Они задаются на каждом уровне, в нашем случае их 15. Строчка 15*20 означает, что мы просто вставили 15 двадцаток подряд. В случае солености тоже особо не парились и задали линейный профиль из 15 одинаковых значений солености. Если вдруг вы не зададите нормальных начальных условий по температуре и солености (см. ниже), то <em>tRef</em> и <em>sRef</em> будут вашими начальными значениями, естественно одинаковыми в каждой точке модели. </p>
<blockquote><p>Комментарий от Сергея Семина: Здесь не плохо бы было вставить напоминание о том, что обязательно надо следить за тем, какие значения принимают параметры по умолчанию. Например, если не задать, как Вы их называете, референсные температуру и соленость, то они будут не нулевыми, а 20 oC  и 30 psu соответственно. Я несколько раз натыкался на проблемы, связанные с этим.</p></blockquote>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp;nTimeSteps = <span style="color: #000000;">20</span>,</div></div>
<p>Количество шагов по времени.</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">deltaTmom = <span style="color: #000000;">1800</span>.,</div></div>
<p>Размер шага по времени в секундах для уравнения движения.  Вообще большинство параметров задающих временные интервалы выражается в секундах, так что привыкайте к огромным числам.</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #007800;">deltaTtracer</span>= <span style="color: #000000;">86400</span>.,</div></div>
<p>Размер шага по времени в секундах для уравнения переноса трассера.</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">deltaTClock = <span style="color: #000000;">86400</span>.,</div></div>
<p>Модельные "часы", которые, в частности определяют размер шага по времени для <em>nTimeSteps</em>. Если вы умножите  <em>deltaTClock</em> на <em>nTimeSteps</em>, то получите длительность интеграции модели в секундах. В нашем случае она составляет 1728000 секунд, или 20 дней. Обычно <em>deltaTClock</em> делают равной <em>deltaTtracer</em>. </p>
<p>В нашем примере шаг по времени уравнения движения и уравнения переноса трассера разный. Это сделано для того, чтобы модель считала быстрее. Обычно же шаг по времени обоих уравнений делают равным и задают параметром <em>deltaT</em>. В этом случае не задают и <em>deltaTClock</em>, который по умолчанию приравнивается <em>deltaT</em>.</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp;<span style="color: #007800;">pChkptFreq</span>= <span style="color: #000000;">1728000</span>.,</div></div>
<p>Периодичность так называемых чекпоинтов. С данной периодичностью модель будет полностью сохранять свое состояние в файлах начинающихся со слова <em>pickup</em>. При помощи этих файлов можно будет, при желании, продолжить расчет модели. Это необходимо в массе случаев, например при сбое железа. Не будете же вы из-за, скажем, скачка напряжения тратить еще один месяц (вполне реалистичное время расчета некоторых конфигураций модели) на то чтобы все пересчитать.</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp;<span style="color: #007800;">dumpFreq</span>= &nbsp; <span style="color: #000000;">864000</span>.,</div></div>
<p>Если сохранять каждый чих произведенный моделью, то есть записывать на диск результаты расчета за каждый временной шаг, то никакого диска может не хватить. Плюс операции записи на диск обычно медленны, что для серьезных конфигураций оборачивается большими потерями времени. Поэтому сохраняют обычно данные с большими промежутками времени. Но в этом случае вы получаете, так называемый <em>snapshot</em>, то есть снимок состояния модели в определенное время, никак не среднее состояние. Здесь мы сохраняем состояние модели в 24:00 через каждые 10 дней.</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #007800;">taveFreq</span>= &nbsp; <span style="color: #000000;">864000</span>.,</div></div>
<p>А вот уже при помощи этого параметра вы можете сохранять среднее состояние модели за определенный промежуток времени. Здесь мы сохраняем <em>среднее состояние</em> модели за 10 дней. Чтобы эта возможность работала, необходимо включать пакет <em>timeave</em> (что мы уже сделали при компиляции).</p>
<p>Окончание раздела  <em>&#038;PARM03</em> посвящено настройке временных интервалов внешнего атмосферного форсинга, и релаксации поверхностных температуры и солености (о как сказанул, объяснение более человеческим языком ниже). К сожалению модель у нас получится не слишком совершенной, поэтому периодическое возвращение к климатологическим параметрам на поверхности (и только на поверхности) ей будет необходимо.</p>
<p>Раздел  <em>&#038;PARM04</em> посвящен настройке вашей сетки. Тут выбирается тип сетки (в нашем случае  <em>usingSphericalPolarGrid</em> ) и задается толщина вертикальных слоев (переменная <em>delR</em>). Повторюсь, <em>delR</em> это не глубины, это толщины слоев, то есть в нашем случае максимальная глубина модели не 690 метров, как вы могли бы подумать, а 5200 м - сумма толщин всех слоев. Параметры <em>ygOrigin</em>, <em>dySpacing</em> и <em>dxSpacing</em> задают соответственно положение южной широты, шаг по широте и долготе в градусах. Как видите полярным областям в нашем сетапе ничего не светит - южная граница установлена на <em>-80</em> широту, по широте у нас <em>40</em> линий каждая по <em>4</em> градуса, то есть покроем мы только <em>160</em> градусов от <em>-80</em> до <em>80</em> градусов с.ш. </p>
<p>Последний раздел файла <em>data</em> -  <em>&#038;PARM05</em>, посвящен различным файлам, которые будут использоваться для инициализации модели и ее форсинга. Если файл находится не в той же директории где вы будете запускать модель, прописывайте полный путь до него.</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp;<span style="color: #007800;">bathyFile</span>= &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">'bathymetry.bin'</span>,</div></div>
<p>Файл с батиметрией. Представляет из себя двоичный файл с матрицей такого же размера как и ваша сетка (в нашем случае <em>90x40</em>). Посмотреть на него можно таким матлабовским кодом:</p>
<div class="codecolorer-container matlab default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="matlab codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">fid1 = <span style="color: #0000FF;">fopen</span><span style="color: #080;">&#40;</span><span style="color:#A020F0;">'bathymetry.bin'</span>,<span style="color:#A020F0;">'rb'</span>,<span style="color:#A020F0;">'ieee-be'</span><span style="color: #080;">&#41;</span>;<br />
bb = <span style="color: #0000FF;">fread</span><span style="color: #080;">&#40;</span>fid1, <span style="color: #080;">&#91;</span><span style="color: #33f;">90</span>, <span style="color: #33f;">40</span><span style="color: #080;">&#93;</span>, <span style="color:#A020F0;">'real*4'</span><span style="color: #080;">&#41;</span>;<br />
bb<span style="color: #080;">&#40;</span>bb==<span style="color: #33f;">0</span><span style="color: #080;">&#41;</span>=<span style="color: #0000FF;">NaN</span><br />
<span style="color: #0000FF;">pcolor</span> <span style="color: #080;">&#40;</span>bb'<span style="color: #080;">&#41;</span>; <span style="color: #0000FF;">figure</span><span style="color: #080;">&#40;</span><span style="color: #0000FF;">gcf</span><span style="color: #080;">&#41;</span></div></div>
<p><a href="http://koldunov.net/wp-content/uploads/2011/05/bathy1.png"><img src="http://koldunov.net/wp-content/uploads/2011/05/bathy1.png" alt="" title="bathy1" width="700" height="525" class="aligncenter size-full wp-image-465" /></a><br />
Заметьте, что порядок байтов в бинарных файлах примеров - <em>big-endian</em>, если вдруг решите прорыть где-нибудь канал или взгромоздить гору, то сохраняйте тоже в  <em>big-endian</em>, например так:</p>
<div class="codecolorer-container matlab default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="matlab codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">fid=<span style="color: #0000FF;">fopen</span><span style="color: #080;">&#40;</span><span style="color:#A020F0;">'mybathy.bin'</span>,<span style="color:#A020F0;">'w'</span>,<span style="color:#A020F0;">'ieee-be'</span><span style="color: #080;">&#41;</span>;<br />
<span style="color: #0000FF;">fwrite</span><span style="color: #080;">&#40;</span>fid,bb,<span style="color:#A020F0;">'real*4'</span><span style="color: #080;">&#41;</span><br />
<span style="color: #0000FF;">fclose</span><span style="color: #080;">&#40;</span>fid<span style="color: #080;">&#41;</span>;</div></div>
<p>Следующие два файла:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp;<span style="color: #007800;">hydrogThetaFile</span>=<span style="color: #ff0000;">'lev_t.bin'</span>,<br />
&nbsp;<span style="color: #007800;">hydrogSaltFile</span>= <span style="color: #ff0000;">'lev_s.bin'</span>,</div></div>
<p>содержат в себе начальные поля температуры и солености, с которых модель будет стартовать. Это такие же бинарные файлы как и <em>bathymetry.bin</em> только в каждом из них по 15 полей по одному для каждого уровня. Посмотреть на поля можно при помощи такого матлабовского кода:</p>
<div class="codecolorer-container matlab default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="matlab codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">fid1 = <span style="color: #0000FF;">fopen</span><span style="color: #080;">&#40;</span><span style="color:#A020F0;">'lev_t.bin'</span>,<span style="color:#A020F0;">'rb'</span>,<span style="color:#A020F0;">'ieee-be'</span><span style="color: #080;">&#41;</span>;<br />
bb = <span style="color: #0000FF;">zeros</span><span style="color: #080;">&#40;</span><span style="color: #33f;">90</span>,<span style="color: #33f;">40</span>,<span style="color: #33f;">15</span><span style="color: #080;">&#41;</span>;<br />
<span style="color: #0000FF;">for</span> <span style="color: #0000FF;"><span style="color: #33f;">i</span></span>=<span style="color: #33f;">1</span>:<span style="color: #33f;">15</span><br />
&nbsp; &nbsp; bb<span style="color: #080;">&#40;</span>:,:,<span style="color: #0000FF;"><span style="color: #33f;">i</span></span><span style="color: #080;">&#41;</span> = <span style="color: #0000FF;">fread</span><span style="color: #080;">&#40;</span>fid1, <span style="color: #080;">&#91;</span><span style="color: #33f;">90</span>, <span style="color: #33f;">40</span><span style="color: #080;">&#93;</span>, <span style="color:#A020F0;">'real*4'</span><span style="color: #080;">&#41;</span>;<br />
<span style="color: #0000FF;">end</span><br />
bb<span style="color: #080;">&#40;</span>bb==<span style="color: #33f;">0</span><span style="color: #080;">&#41;</span>=<span style="color: #0000FF;">NaN</span>;<br />
<span style="color: #0000FF;">pcolor</span> <span style="color: #080;">&#40;</span>bb<span style="color: #080;">&#40;</span>:,:,<span style="color: #33f;">1</span><span style="color: #080;">&#41;</span>'<span style="color: #080;">&#41;</span>; <span style="color: #0000FF;">figure</span><span style="color: #080;">&#40;</span><span style="color: #0000FF;">gcf</span><span style="color: #080;">&#41;</span><br />
<span style="color: #0000FF;">fclose</span><span style="color: #080;">&#40;</span>fid1<span style="color: #080;">&#41;</span></div></div>
<p>вот, к примеру, температура в поверхностном слое:<br />
<a href="http://koldunov.net/wp-content/uploads/2011/05/init_t.png"><img src="http://koldunov.net/wp-content/uploads/2011/05/init_t.png" alt="" title="init_t" width="700" height="527" class="aligncenter size-full wp-image-470" /></a></p>
<p>Дальше идут файлы внешнего форсинга модели:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp;<span style="color: #007800;">zonalWindFile</span>= &nbsp;<span style="color: #ff0000;">'trenberth_taux.bin'</span>,<br />
&nbsp;<span style="color: #007800;">meridWindFile</span>= &nbsp;<span style="color: #ff0000;">'trenberth_tauy.bin'</span>,<br />
&nbsp;<span style="color: #007800;">surfQFile</span>= &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">'ncep_qnet.bin'</span>,<br />
&nbsp;<span style="color: #007800;">EmPmRFile</span>= &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">'ncep_emp.bin'</span>,</div></div>
<p>поля ветра, потока тепла и пресной воды. Все эти файлы содержат по 12 полей, по одному на каждый месяц, и прочесть их можно тем же кодом, что и файлы начальных условий, уменьшив, конечно, количество итераций в цикле до 12, вместо 15. Вот, например, результирующий поток тепла в Июле, когда в Южном полушарии зима и океан в основном отдает тепло в атмосферу:<br />
<a href="http://koldunov.net/wp-content/uploads/2011/05/qnet.png"><img src="http://koldunov.net/wp-content/uploads/2011/05/qnet.png" alt="" title="qnet" width="700" height="521" class="aligncenter size-full wp-image-473" /></a><br />
Если вернуться немножко назад по нашему файлу <strong>data</strong>, и посмотреть в раздел <em>&#038;PARM03</em>, то вы увидите такие строчки:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #007800;">periodicExternalForcing</span>=.TRUE.,<br />
<span style="color: #007800;">externForcingPeriod</span>=<span style="color: #000000;">2592000</span>.,<br />
<span style="color: #007800;">externForcingCycle</span>=<span style="color: #000000;">31104000</span>.,</div></div>
<p>Они означают, что форсить нашу модель мы будем повторяющимися данными (у нас ведь всего по 12 полей в каждом файле), каждое поле будет работать один месяц (<em>externForcingPeriod</em>) и повторяться цикл будет через год(<em>externForcingCycle</em>). То есть внешнее воздействие атмосферы не будет изменяться по несколько раз в день, как в "больших" экспериментах, а будет одинаковым на протяжении одного месяца, потом сменится на следующее, а через год цикл повторится.</p>
<p>В данном примере атмосферный форсинг уже проинтерполирован на модельную сетку. Однако в <em>MITgcm</em> имеется приятная возможность использовать форсинг на оригинальной сетке (например файлы <em>NCEP</em> реанализа), модель проинтерполирует их сама. </p>
<p>Последние файлы в нашем списке, содержат данные для релаксации поверхностной температуры и солености:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp;<span style="color: #007800;">thetaClimFile</span>= &nbsp;<span style="color: #ff0000;">'lev_sst.bin'</span>,<br />
&nbsp;<span style="color: #007800;">saltClimFile</span>= &nbsp; <span style="color: #ff0000;">'lev_sss.bin'</span>,</div></div>
<p>В разделе <em>&#038;PARM03</em> задано что релаксация поверхностной температуры будет проводиться раз в два месяца (<em>tauThetaClimRelax</em>=  5184000.,), а солености раз в шесть (<em>tauSaltClimRelax</em> = 15552000.,)</p>
<p>В <a href="http://koldunov.net/?p=478">следующей части</a> мы наконец-то заставим нашу модель работать, теперь уже честное пионерское :)</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="" href="http://koldunov.net/?p=451">{lang: 'ru'}</g:plusone></div><img src="http://feeds.feedburner.com/~r/koldunovnet/~4/qcRVrMbZ7Ds" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://koldunov.net/?feed=rss2&amp;p=451</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Компиляция и настройка MITgcm, океан в компьютере. Часть 1, компиляция</title>
		<link>http://koldunov.net/?p=432</link>
		<comments>http://koldunov.net/?p=432#comments</comments>
		<pubDate>Mon, 09 May 2011 23:51:15 +0000</pubDate>
		<dc:creator>koldunovn</dc:creator>
				<category><![CDATA[Без рубрики]]></category>

		<guid isPermaLink="false">http://koldunov.net/?p=432</guid>
		<description><![CDATA[Задача: Заставить работать MITgcm, одну из лучших океанологических моделей на данный момент, под Ubuntu 10.10 Решение: оказалось не таким уж сложным. Раньше моделирование океана и атмосферы было уделом горстки избранных. Чем-то это напоминало ситуацию с Линуксом конца 90х годов - разобраться было можно, но сложно. Те времена давно прошли, и как Линукс теперь доступен для [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Задача:</strong> Заставить работать <em>MITgcm</em>, одну из лучших океанологических моделей на данный момент, под <em>Ubuntu 10.10</em><br />
<strong>Решение</strong>: оказалось не таким уж сложным.</p>
<p>Раньше моделирование океана и атмосферы было уделом горстки избранных. Чем-то это напоминало ситуацию с Линуксом конца 90х годов - разобраться было можно, но сложно. Те времена давно прошли, и как Линукс теперь доступен для средних умов, так и заставить работать свою гидродинамическую модель океана может практически каждая домохозяйка, было бы желание. </p>
<p>Документация у модели, про которую я буду рассказывать в этом посте довольно хорошая и объемная. Но этот объем является как преимуществом, так и недостатком, поскольку у новичка разбегаются глаза, и с чего начать бывает не понятно. Здесь я, по-возможности, расскажу как скомпилировать модель, и запустить на ней простейший эксперимент, а также немного пролью свет на то, где в каких файлах нужно что подкрутить, чтобы модель работала так как вам нужно. Возможности дальнейшей настройки огромны и ограничиваются практически только вашей фантазией и доступными вычислительными ресурсами.<br />
<span id="more-432"></span><br />
Немного про нашу модель. Полное ее название <a href="http://mitgcm.org/">Massachusetts Institute of Technology General Circulation Model</a> или <em>MITgcm</em>. Разрабатывается она, как не трудно догадаться, в этом уважаемом заведении и является одной из лучших на данный момент в мире. Позволяет моделировать разномасштабные процессы, от, условно, поведения бури в вашем стакане, до крупномасштабной циркуляции океана. На <a href="http://mitgcm.org/">сайте</a> периодически публикуются популярные обзоры исследований, в которых модель используется.  По-большому счету она является тем исходным материалом, из которого вы лепите свой собственный сетап, настроенную под свои задачи модель, которая может даже называться вашим именем, или именем вашего института, но ядром ее все равно будет старая добрая <em>MITgcm</em>. Кстати, о возрасте. Если сравнивать с монстрами типа <em>POP</em>, то модель начали разрабатывать сравнительно недавно с середины 1990х годов. Это позволило заложить в нее некоторые новые идеи, витавшие среди людей, занимавшихся вычислительной гидродинамикой в то время. </p>
<p>Разработчики MITgcm хорошо понимают принцип: "Если хочешь, чтобы твоим продуктом пользовались, пиши понятную документацию". Лучше всего пользоваться <a href="http://mitgcm.org/public/r2_manual/latest/online_documents/manual.pdf">последней ее pdf версией</a>. В доках много примеров, в самом коде тоже довольно много комментариев, что бывает очень полезно, поскольку, как это не печально, иногда изменения в документации не успевают за изменениями в модели. Я тут собираюсь немного растечься мыслию по древу и описывать процесс в подробностях. Опытные же или нетерпеливые товарищи могут сразу перейти к разделу документации <em>Getting Started with MITgcm</em>, там сжато, но ясно описан весь процесс. </p>
<p>Надеюсь, что я вас убедил в том, что если вы подумываете о занятиях гидродинамическим моделированием океана, то на <em>MITgcm</em> стоит взглянуть хотя бы одним глазком, так что приступим. Ставить модель будем на <em>Ubuntu 10.10</em>. Тем кто ни в зуб ногой в Линуксе, могу посоветовать попробовать <a href="http://koldunov.net/?p=364">мой образ <em>Ubuntu 8.04</em> для виртуальной машины</a>, но не факт, что установка не будет отличаться в деталях. Предполагается также, что вы не падаете в обморок от слов "терминал" и "командная строка". </p>
<p>Для начала подготовим плацдарм, то есть установим недостающие в стандартной поставке программы:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get install</span> <span style="color: #c20cb9; font-weight: bold;">cvs</span> netcdf-bin libnetcdf-dev build-essential gfortran ncview</div></div>
<ol>
<em>cvs</em> - система контроля версий, в которой ведется разработка модели, с ее помощью мы получим исходный код,</ol>
<ol>
<em>netcdf</em> - библиотека для создания файлов формата netcdf, в принципе установка ее опциональна,</ol>
<ol>
<em>build-essential</em> - набор утилит для компиляции, </ol>
<ol>
<em>gfortran</em> - компилятор FORTRAN, которым мы нашу модель будем компилировать.</ol>
<ol>
<em>ncview</em> - простейший просмотрщик netCDF файлов</ol>
<p>После того как плацдарм подготовлен, давайте получим код нашей модели. Разработка ее, как упомянуто выше, ведется в системе контроля версий <em>cvs</em>. Просматривать сам код и его изменения <a href="http://mitgcm.org/viewvc/MITgcm/MITgcm/">можно прямо в браузере</a>, что бывает удобно. Процедура получения кода описана <a href="http://mitgcm.org/public/source_code.html">тут</a> и заключается во вводе следующих команд в терминал:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">CVSROOT</span>=<span style="color: #ff0000;">':pserver:cvsanon@mitgcm.org:/u/gcmpack'</span><br />
<span style="color: #c20cb9; font-weight: bold;">cvs login</span></div></div>
<p>тут вводим пароль cvsanon</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">cvs</span> <span style="color: #c20cb9; font-weight: bold;">co</span> <span style="color: #660033;">-P</span> MITgcm</div></div>
<p>начнется процесс загрузки. Размер загруженной, в итоге, папки с именем <em>MITgcm</em> будет около 300 мегабайт.<br />
Вариант попроще и понадежнее - скачать последний чекпоинт, вариант модели, который работает и работает правильно <a href="http://mitgcm.org/download/">отсюда</a>. Тогда вы можете быть уверены, что за пол часа до того как вы скачали код, кто-то из разработчиков не внес в него изменения не совместимые с жизнью.</p>
<p>Зайдя в директорию модели вы увидите 12 поддиректорий, про большинство которых можете пока забыть. Интересовать нас будут для начала папки <strong>model</strong> и <strong>pkg</strong>. Внутренности <em>MITgcm</em> устроены следующим образом - есть ядро, которое обеспечивает основные функции модели и есть пакеты (<em>packages</em>), которые обеспечивают дополнительный функционал. </p>
<p>Есть пакеты для обсчета морского льда, расчета вертикального перемешивания, форсинга модели внешними граничными условиями и так далее. Пакеты не просто приятные дополнения, без них модель представляет собой довольно унылое зрелище, которое мало что может, так что любая более-менее серьезная конфигурация использует несколько пакетов. С другой стороны такой подход позволяет делать довольно легкие конфигурации, избавленные от лишнего функционала. Действительно зачем вам динамика морского льда, если вы моделируете, например, экваториальные области?</p>
<p>Как не сложно догадаться основное ядро лежит в папке <strong>model</strong>, а пакеты в папке <strong>pkg</strong>. Вы можете по ним побродить ради любопытства, но для запуска модели там ничего изменять не нужно. Наш путь лежит в папку <strong>verification</strong>. Здесь расположены уже подготовленные "эксперименты", то есть сконфигурированные особым образом наборы файлов, которые при компиляции и запуске модели будут обеспечивать ее работу в различных режимах, при различных условия и т. д. Тут и простейший океан в виде бокса на вращающейся сфере, отдельные моря и даже отдельные склоны. Описание того в какой папке какой эксперимент находится можно найти <a href="http://mitgcm.org/public/r2_manual/latest/online_documents/node111.html">здесь</a>. Предлагаю не размениваться на боксы и сразу начать с чего-нибудь более-менее реалистичного. Эксперимент в папке <strong>tutorial_global_oce_latlon</strong> будет моделировать океан на сетке <em>4x4</em> градуса, включает в себя реалистичную топографию и 15 уровней по глубине. Скромненько и со вкусом. Его подробное описание <a href="http://mitgcm.org/public/r2_manual/latest/online_documents/node129.html">тут</a>. </p>
<p>Перейдя в папку <strong>tutorial_global_oce_latlon</strong> мы снова увидим несколько поддиректорий, назначение которых следующее:</p>
<ol>
<strong>build</strong> - в данный момент пуста, в ней мы будем компилировать наш код</ol>
<ol>
<strong>code</strong> - содержит файлы, которые необходимы для настройки базовых параметров модели перед ее компиляцией. То какие пакеты будут включены в модель, какие опции этих пакетов будут использоваться, каков будет размер сетки на которой мы будем считать и т.д.</ol>
<ol>
<strong>CVS</strong> - служебная папка cvs, забудьте про нее.</ol>
<ol>
<strong>diags_matlab</strong> - папка со служебными матлабовскими скриптами, позволяющими анализировать вывод модели</ol>
<ol>
<strong>input</strong> - папка, в которой содержатся файлы с настройками для которых не нужна перекомпиляция модели, также там находятся файлы с батиметрией, файлы описывающие сетку модели, файлы с внешним форсингом (например атмосферными параметрами).</ol>
<ol>
<strong>results</strong> - в папке служебный вывод модели для сравнения с вашим выводом</ol>
<ol>
<strong>run</strong> - пустая папка, в которой мы, впоследствии, будем запускать модель.</ol>
<p>Тут в общем ничего обязательного и заданного нет, если вы понимаете, что делаете то можете и модель в папке <strong>input</strong> запускать и компилировать в <strong>code</strong>. Однако такая структура и разделение на практике довольно удобна и лучше её придерживаться. </p>
<p>Перейдем в папку <strong>code</strong>. Здесь мы будем придавать форму нашей будущей модели, то есть определять, какие пакеты в нее будут включены, и как эти пакеты будут настроены. Первым файлом, представляющим для нас интерес будет <strong>packages.conf</strong>. Это простой текстовый файл, в котором один за одним перечислены пакеты, которые мы будем включать в модель. В нашем случае это:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">gfd<br />
gmredi<br />
cd_code<br />
timeave<br />
ptracers<br />
mnc</div></div>
<p>много думать над ними не надо, просто посмотрите что они там есть. Набор не особо примечательный, и все параметры пакетов настроены по умолчанию. Откуда это видно? Дело в том, что у каждого уважающего себя пакета есть файл <strong>NAME_OPTIONS.h</strong>, где <em>NAME</em> - название пакета заглавными буквами. Расположен этот файл в директории пакета (<em>..../MITgcm/pkg/name</em>). В этом файле задаются основные настройки для пакета. Если вы хотите изменить эти настройки, то копируете этот файл в папку <strong>code</strong> (на самом деле в любую папку где будет происходить компиляция) и изменяете его параметры. Перед компиляцией, в папку где будет проводится компиляция, копируются все необходимые файлы (из папок <strong>model</strong> и <strong>pkg</strong>), но если файл с таким именем в папке уже присутствует, то он не заменяется. Таким образом при компиляции будет использован не файл из исходных текстов, а измененный вами файл. </p>
<p>Это используется не только для настройки пакетов, но и для хаков, хакнутый файл не заменяется на файл из исходников и используется при компиляции. Это произойдет, например, с файлами <strong>ptracers_forcing.F</strong> и <strong>ptracers_forcing_surf.F</strong>, которые были изменены для данного эксперимента, и оригиналы которых находятся в папке пакета <em>ptracers</em>. К счастью обычно хакать фортрановские файлы не нужно и все о чем вам нужно беспокоиться это <strong>NAME_OPTIONS.h</strong>.</p>
<p>Отсутствие файлов вида <strong>NAME_OPTIONS.h</strong> в папке <strong>code</strong> значит, что использоваться будут значения по умолчанию. Вообще такая ситуация не очень характерна для "взрослых" экспериментов, поскольку там присутствует по крайней мере файл определяющий основные настройки модели <strong>CPP_OPTIONS.h</strong> . Оригинал его находится в <em>...../MITgcm//model/inc</em> . Давайте скопируем его в нашу папку <strong>code</strong></p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">cp</span> ..<span style="color: #000000; font-weight: bold;">/</span>..<span style="color: #000000; font-weight: bold;">/</span>..<span style="color: #000000; font-weight: bold;">/</span>model<span style="color: #000000; font-weight: bold;">/</span>inc<span style="color: #000000; font-weight: bold;">/</span>CPP_OPTIONS.h .</div></div>
<p>В принципе никакого влияния на будущую компиляцию модели это наше действие не окажет, поскольку изменять <strong>CPP_OPTIONS.h</strong> мы не собираемся, вы можете поэкспериментировать с этим в будущем. Сейчас просто предлагаю на него посмотреть в вашем любимом текстовом редакторе. Внутри вы видите кучу параметров, которые по умолчанию включены (стоит флаг <em>#define</em>) или отключены (<em>#undef</em>). Включать и выключать их вы можете меняя один флаг на другой. Есть еще параметры, которые включаются в зависимости от того включен (<em>#ifdef</em>) или отключен (<em>#ifndef</em>) другой параметр. Ели вы не знаете, что делаете, то, как обычно, лучше оставлять умолчальные настройки.</p>
<p>Примерно также выглядят <strong>NAME_OPTIONS.h</strong> файлы пакетов, и, повторюсь, для их настройки вы копируете <strong>NAME_OPTIONS.h</strong> в ту папку где будет производиться компиляция и изменяете их.</p>
<p>Последний файл, который нам нужно обсудить в папке <strong>code</strong> - <strong>SIZE.h</strong>. Здесь вы задаете размеры вашей сетки, то как вы ее разобьете на квадратики и скольким процессорам отдадите на съедение. Когда дойдете до компиляции на многопроцессорных машинах можете помедитировать на эту полезную картинку до полного просветления: <a href="http://koldunov.net/wp-content/uploads/2011/05/size_h.png"><img src="http://koldunov.net/wp-content/uploads/2011/05/size_h.png" alt="" title="size_h" width="590" height="760" class="aligncenter size-full wp-image-443" /></a></p>
<p>Пока же, поскольку процессор у нас один, то сильно выпендриваться мы не будем, и даже уберем разделение на тайлы, заменив  <em>nSx =   2</em>, на <em>nSx =   1</em>. В этом случае нам нужно также заменить <em>sNx =  45</em>, на <em>sNx =  90</em>. На будущее, всегда проверяйте, что общее количество точек по "горизонтали" <em>Nx  = sNx*nSx*nPx</em> и по "вертикали" <em>Ny  = sNy*nSy*nPy</em>. Именно по этой причине изменив <em>nSx</em> на 1 нужно поменять <em>sNx</em> на 90, чтобы баланс сошелся :) То, что <em>Nr  =  15</em> значит, что у нас 15 уровней глубины. Все сходится, поехали дальше.</p>
<p>Почему я все время твержу, что нужно копировать файлы в папку, в которой будет производиться компиляция, а копирую их в <strong>code</strong>, компилировать, в котором ничего не планируется? Потому что папочка <strong>code</strong> служит своеобразным бекапом и напоминанием о том, что мы поменяли, а что нет. Саму же компиляцию будем проводить в папке <strong>build</strong>. Перейдите в папку <strong>build</strong> и наберите:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">cp</span> ..<span style="color: #000000; font-weight: bold;">/</span>code<span style="color: #000000; font-weight: bold;">/*</span> .</div></div>
<p>все что вы наворотили в папке code скопируется в <strong>build</strong>. </p>
<blockquote><p>Комментарий от Сергея Семина: Место, где вы копируете доплненный исходный код в папку build. Это делать не очень удобно, так как в случае исправления исходного кода придется все еще раз копировать. Тут есть два выхода либо создать символьные ссылки, либо воспользоваться ключем утилиты <strong>genmake2 -mods='/path/to/code/directory'</strong>. Путь может быть как абсолютный, так и относительный. Я обычно пользуюсь последним вариантом.</p></blockquote>
<p>Теперь нам нужно подготовиться к компиляции. Для этого служит утилита <strong>genmake2</strong>. У нее много разных полезных опций, но мы воспользуемся только одной "<em>-of</em>", задающей путь до файла, в котором прописаны флаги компилятора, пути к библиотеками и другая полезная муть. Выглядит это будет так:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">..<span style="color: #000000; font-weight: bold;">/</span>..<span style="color: #000000; font-weight: bold;">/</span>..<span style="color: #000000; font-weight: bold;">/</span>tools<span style="color: #000000; font-weight: bold;">/</span>genmake2 <span style="color: #660033;">-of</span> ..<span style="color: #000000; font-weight: bold;">/</span>..<span style="color: #000000; font-weight: bold;">/</span>..<span style="color: #000000; font-weight: bold;">/</span>tools<span style="color: #000000; font-weight: bold;">/</span>build_options<span style="color: #000000; font-weight: bold;">/</span>linux_ia32_gfortran</div></div>
<p>Можете заглянуть в директорию <em>../../../tools/build_options/</em> , чтобы полюбоваться на то для скольких возможных комбинаций систем и компиляторов добрые люди понаписали файлов. Если <strong>linux_ia32_gfortran</strong> не сработает (например вы используете архитектуру отличную от <em>ia32</em>) можете попробовать что-нибудь более подходящее для вашего случая.</p>
<blockquote><p>Комментарий от Сергея Семина: Ключ <strong>-of /path/to/optfile</strong> во многих случаях не обязательный, утилита <em>genmake2</em> как правило сама умеет определять архитектуру, компилятор и задавать нужные пути до библиотек <em>netcdf</em>.</p></blockquote>
<p>Если в результате работы <strong>genmake2</strong> не возникло проблем, то можно продолжать. Сначала сделаем</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">make</span> depend</div></div>
<p>Эта команда в частности скопирует (на самом деле залинкует, но это не важно) необходимые для компиляции файлы в директорию <strong>build</strong>, но те файлы, что уже находятся в этой директории, с вашими изменениями, заменены не будут. Ну и наконец вводим команду</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">make</span></div></div>
<p>и наслаждаемся бегущими по экрану значками. Если компиляция пройдет успешно, в директории <strong>build</strong> должен будет появиться файл <strong>mitgcmuv</strong> - это и есть ваша скомпилированная модель.</p>
<p>О том как заставить эту модель работать в <a href="http://koldunov.net/?p=451">следующей серии</a>. </p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="" href="http://koldunov.net/?p=432">{lang: 'ru'}</g:plusone></div><img src="http://feeds.feedburner.com/~r/koldunovnet/~4/7OI1RKZUqR4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://koldunov.net/?feed=rss2&amp;p=432</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Избавляемся от ненужных циклов и ускоряем скрипт на Python</title>
		<link>http://koldunov.net/?p=417</link>
		<comments>http://koldunov.net/?p=417#comments</comments>
		<pubDate>Wed, 02 Feb 2011 13:48:55 +0000</pubDate>
		<dc:creator>koldunovn</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Без рубрики]]></category>
		<category><![CDATA[numpy]]></category>

		<guid isPermaLink="false">http://koldunov.net/?p=417</guid>
		<description><![CDATA[Задача: выбрать из массива данных только данные удовлетворяющие условию и сделать с ними какую ни-будь гадость Решение: numpy.where Слухи о тормознутости Python сильно преувеличены, просто нужно уметь его готовить. Конечно скорости C или Fortran вы на нем не добьетесь, но и его вполне можно заставить быстро обрабатывать огромные массивы информации. Если вы хотите считать быстро, [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Задача:</strong> выбрать из массива данных только данные удовлетворяющие условию и сделать с ними какую ни-будь гадость<br />
<strong>Решение: </strong><em>numpy.where</em></p>
<p>Слухи о тормознутости <em>Python</em> сильно преувеличены, просто нужно уметь его готовить. Конечно скорости <em>C</em> или <em>Fortran</em> вы на нем не добьетесь, но и его вполне можно заставить быстро обрабатывать огромные массивы информации. Если вы хотите считать быстро, то ваш враг номер один в <em>Python</em> (также как и в <em>MATLAB</em>, кстати) это циклы, заданные в явном виде (оператор <em>for</em>). От большинства из них можно избавиться, применяя нехитрые приемы. Об одном таком приеме, позволившем увеличить скорость обработки массива размером более 100 гигабайт в 46 раз, я очень коротко расскажу в этом посте.<br />
<span id="more-417"></span><br />
<strong>Дано:</strong> четерехмерный массив с полями температуры (<em>x,y</em>,глубина, время). Поскольку сетка у нас не регулярная, имеются два двумерных массива широт (<em>lat</em>) и долгот (<em>lon</em>).<br />
<strong>Задача:</strong> вырезать из этого массива хитрую область, и получить среднее по этой области для каждой глубины, за каждый отсчет времени.</p>
<p>Область выглядит следующим образом:<br />
<a href="http://koldunov.net/wp-content/uploads/2011/02/subdomain.png"><img src="http://koldunov.net/wp-content/uploads/2011/02/subdomain.png" alt="" title="subdomain" width="300"  class="aligncenter size-full wp-image-419" /></a></p>
<p>Одним из возможных решений данной задачи является такой код:</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #ff7700;font-weight:bold;">for</span> ttime <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: #66cc66;">,</span><span style="color: #ff4500;">487</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> lev <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: #66cc66;">,</span><span style="color: #ff4500;">51</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; THO_new <span style="color: #66cc66;">=</span> <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> ff <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">285</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> zz <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">3602</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff4500;">100</span> <span style="color: #66cc66;">&lt;</span> lon<span style="color: black;">&#91;</span>ff<span style="color: #66cc66;">,</span>zz<span style="color: black;">&#93;</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #ff4500;">140</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> lat<span style="color: black;">&#91;</span>ff<span style="color: #66cc66;">,</span>zz<span style="color: black;">&#93;</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">66</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; THO_new.<span style="color: black;">append</span><span style="color: black;">&#40;</span>ffile.<span style="color: black;">variables</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;tho&quot;</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>ttime<span style="color: #66cc66;">,</span>lev<span style="color: #66cc66;">,</span>ff<span style="color: #66cc66;">,</span>zz<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">elif</span> <span style="color: #ff4500;">100</span> <span style="color: #66cc66;">&gt;</span> lon<span style="color: black;">&#91;</span>ff<span style="color: #66cc66;">,</span>zz<span style="color: black;">&#93;</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">0</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> lat<span style="color: black;">&#91;</span>ff<span style="color: #66cc66;">,</span>zz<span style="color: black;">&#93;</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">80</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; THO_new.<span style="color: black;">append</span><span style="color: black;">&#40;</span>ffile.<span style="color: black;">variables</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;tho&quot;</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>ttime<span style="color: #66cc66;">,</span>lev<span style="color: #66cc66;">,</span>ff<span style="color: #66cc66;">,</span>zz<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">elif</span> <span style="color: #ff4500;">300</span> <span style="color: #66cc66;">&lt;</span> lon<span style="color: black;">&#91;</span>ff<span style="color: #66cc66;">,</span>zz<span style="color: black;">&#93;</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #ff4500;">360</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> lat<span style="color: black;">&#91;</span>ff<span style="color: #66cc66;">,</span>zz<span style="color: black;">&#93;</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">80</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; THO_new.<span style="color: black;">append</span><span style="color: black;">&#40;</span>ffile.<span style="color: black;">variables</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;tho&quot;</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>ttime<span style="color: #66cc66;">,</span>lev<span style="color: #66cc66;">,</span>ff<span style="color: #66cc66;">,</span>zz<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span></div></div>
<p>У нас имеется внешний цикл по времени (<em>ttime</em>), внутри него цикл по глубинам (<em>lev</em>), затем цикл по <em>x (ff) </em>и по <em>y (zz)</em>. Вот в этом последнем цикле мы и проверяем каждую точку на соответствие нашим условиям по широте и долготе и если она им удовлетворяет, добавляем ее значение в массив (<em>THO_new</em>), с которым будем дальше совершать все необходимые непотребства.<br />
Количество точек в одном шаге по времени, которые небходимо прогнать через циклы и обработать условными операторами составляет в данном случае 52355070 штук, что занимает 2 минуты 18 секунд. Шагов по времени у нас 487, так что ждать окончания работы программы мы будем дооолго.</p>
<p>Способ второй:</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">i1<span style="color: #66cc66;">,</span>j1 <span style="color: #66cc66;">=</span> numpy.<span style="color: black;">where</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">100</span><span style="color: #66cc66;">&lt;</span>lon<span style="color: black;">&#41;</span>&amp;<span style="color: black;">&#40;</span>lon<span style="color: #66cc66;">&lt;</span><span style="color: #ff4500;">140</span><span style="color: black;">&#41;</span>&amp;<span style="color: black;">&#40;</span>lat<span style="color: #66cc66;">&gt;</span><span style="color: #ff4500;">66</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
i2<span style="color: #66cc66;">,</span>j2 <span style="color: #66cc66;">=</span> numpy.<span style="color: black;">where</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">100</span><span style="color: #66cc66;">&gt;</span>lon<span style="color: black;">&#41;</span>&amp;<span style="color: black;">&#40;</span>lon<span style="color: #66cc66;">&gt;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>&amp;<span style="color: black;">&#40;</span>lat<span style="color: #66cc66;">&gt;</span><span style="color: #ff4500;">80</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
i3<span style="color: #66cc66;">,</span>j3 <span style="color: #66cc66;">=</span> numpy.<span style="color: black;">where</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">300</span><span style="color: #66cc66;">&lt;</span>lon<span style="color: black;">&#41;</span>&amp;<span style="color: black;">&#40;</span>lon<span style="color: #66cc66;">&lt;</span><span style="color: #ff4500;">360</span><span style="color: black;">&#41;</span>&amp;<span style="color: black;">&#40;</span>lat<span style="color: #66cc66;">&gt;</span><span style="color: #ff4500;">80</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">for</span> ttime <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: #66cc66;">,</span><span style="color: #ff4500;">487</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> lev <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: #66cc66;">,</span><span style="color: #ff4500;">51</span><span style="color: black;">&#41;</span>:<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; THO_new <span style="color: #66cc66;">=</span> <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; a <span style="color: #66cc66;">=</span> ffile.<span style="color: black;">variables</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;tho&quot;</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>ttime<span style="color: #66cc66;">,</span>lev<span style="color: #66cc66;">,</span>:<span style="color: #66cc66;">,</span>:<span style="color: black;">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; THO_new <span style="color: #66cc66;">=</span> numpy.<span style="color: black;">concatenate</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>THO_new<span style="color: #66cc66;">,</span> a<span style="color: black;">&#91;</span>i1<span style="color: #66cc66;">,</span>j1<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; THO_new <span style="color: #66cc66;">=</span> numpy.<span style="color: black;">concatenate</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>THO_new<span style="color: #66cc66;">,</span> a<span style="color: black;">&#91;</span>i2<span style="color: #66cc66;">,</span>j2<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; THO_new <span style="color: #66cc66;">=</span> numpy.<span style="color: black;">concatenate</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>THO_new<span style="color: #66cc66;">,</span> a<span style="color: black;">&#91;</span>i3<span style="color: #66cc66;">,</span>j3<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span></div></div>
<p>Понятное дело, что точки с необходимыми нам координатами будут занимать одинаковое положение во всех полях. Поэтому проще сразу определиться с индексками тех точек что нас интересуют. Для этого используем оператор <em>numpy.where</em>, которому в качестве условия передаем наши пожелания по ограничению региона. К сожалению, конструкции вида <em>100 < lon < 140</em> он не воспринимает, так что небоходимо пользоваться логическими операторами (естественно можно использовать не только <em>AND (&#038;)</em> но и, напримерр <em>OR (|)</em>). В качестве вывода, мы получаем индексы тех точек, что удовлетворяют нашим условиям.</p>
<p>Циклы по времени и глубинам мы оставляем, а вот перебирать каждую точку двумерного поля нам уже не нужно, мы точно знаем какие точки нам нужны. Сначала создаем переменную <em>a</em>, в которую заливаем двумерное поле (это сделано исключительно из-за того что 100 гигабайт в память не влезало :)). Затем добавляем в переменную <em>THO_new</em> те значения, что вписываются в заданную нами область. Дальше  уже происходит наложение маски (пропущенных значений) и осреднение <em>THO_new</em>, что для нас в данном контексте не особо важно, поэтому эту часть я не привожу. Время работы нового кода для одного шага по времени составляет 3 секунды. </p>
<p>Спасибо Марку Карсону (Mark Carson) за идею.</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="" href="http://koldunov.net/?p=417">{lang: 'ru'}</g:plusone></div><img src="http://feeds.feedburner.com/~r/koldunovnet/~4/bINwY-cxqaQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://koldunov.net/?feed=rss2&amp;p=417</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Замена SAMSUNG PC Share Manager под Linux</title>
		<link>http://koldunov.net/?p=402</link>
		<comments>http://koldunov.net/?p=402#comments</comments>
		<pubDate>Mon, 06 Dec 2010 22:15:38 +0000</pubDate>
		<dc:creator>koldunovn</dc:creator>
				<category><![CDATA[Без рубрики]]></category>
		<category><![CDATA[nix]]></category>

		<guid isPermaLink="false">http://koldunov.net/?p=402</guid>
		<description><![CDATA[Задача: смотреть файлы с компьютера на телевизоре Samsung по сети. Решение: Медиа сервер MediaTomb Если у вас имеется домашняя сеть и современный телевизор, бегать с дисками и флешками от компьютера, при помощи которого вы скачиваете файлы к телевизору совершенно не обязательно. Чудеса техники позволяют вам просматривать видео по сети прямо с компьютера. Для этого необходимо [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://koldunov.net/wp-content/uploads/2010/12/mediatomb.png"><img src="http://koldunov.net/wp-content/uploads/2010/12/mediatomb.png" align="left" alt="" title="mediatomb" width="253" height="81" class="alignleft size-full wp-image-410" /></a><strong>Задача</strong>: смотреть файлы с компьютера на телевизоре Samsung по сети.<br />
<strong>Решение</strong>: Медиа сервер <em>MediaTomb</em></p>
<p>Если у вас имеется домашняя сеть и современный телевизор, бегать с дисками и флешками от компьютера, при помощи которого вы скачиваете файлы к телевизору совершенно не обязательно. Чудеса техники позволяют вам просматривать видео по сети прямо с компьютера. Для этого необходимо чтобы на компьютере бежал медиа сервер, и в случае с телевизорами <em>Samsung</em>, такой медиа сервер предоставляется производителем. Однако самсунговский <em>PC Share Manager</em> работает только под самую популярную операционную систему :) У пользователей альтернативной системы все же есть возможность воспользоваться плодами прогресса и минимизировать беготню между компьютером и телевизором. </p>
<p>Я этом посте я приведу простую последовательность действий которая позволит установить и настроить <em>MediaTomb</em> под <em>Ubuntu</em>. Этот рецепт проверен на <em>Ubuntu 10.10</em> и телевизоре <em>Samsung LE37C650</em>, думаю что он будет работать и для других современных телевизоров этой фирмы.</p>
<p><span id="more-402"></span></p>
<p>Для начала установим <em>MediaTomb</em>. Можно поставить и из репозитория:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">sudo apt-get install mediatomb</div></div>
<p>Либо по этой ссылке (я ставил по ссылке :) )<br />
<a class="apt" href="apt:mediatomb">''mediatomb''</a></p>
<p>Затем нам нужно немножко поколдовать с конфигурационным файлом. Сначала откроем его текстовым редактором:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">gksudo gedit <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>mediatomb<span style="color: #000000; font-weight: bold;">/</span>config.xml</div></div>
<p>Тут нужно внести изменения в трех местах. В секцию server нужно добавить:</p>
<div class="codecolorer-container xml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;custom-http-headers<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;add</span> <span style="color: #000066;">header</span>=<span style="color: #ff0000;">&quot;transferMode.dlna.org: Streaming&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span><br />
&nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;add</span> <span style="color: #000066;">header</span>=<span style="color: #ff0000;">&quot;contentFeatures.dlna.org: DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/custom-http-headers<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></div></div>
<p>В секции <em> import/mappings/extension-mimetype </em></p>
<div class="codecolorer-container xml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;map</span> <span style="color: #000066;">from</span>=<span style="color: #ff0000;">&quot;avi&quot;</span> <span style="color: #000066;">to</span>=<span style="color: #ff0000;">&quot;video/x-msvideo&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;map</span> <span style="color: #000066;">from</span>=<span style="color: #ff0000;">&quot;ts&quot;</span> <span style="color: #000066;">to</span>=<span style="color: #ff0000;">&quot;video/mpeg&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;map</span> <span style="color: #000066;">from</span>=<span style="color: #ff0000;">&quot;divx&quot;</span> <span style="color: #000066;">to</span>=<span style="color: #ff0000;">&quot;video/mpeg&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;map</span> <span style="color: #000066;">from</span>=<span style="color: #ff0000;">&quot;mp4&quot;</span> <span style="color: #000066;">to</span>=<span style="color: #ff0000;">&quot;video/MP4V-ES&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;map</span> <span style="color: #000066;">from</span>=<span style="color: #ff0000;">&quot;mkv&quot;</span> <span style="color: #000066;">to</span>=<span style="color: #ff0000;">&quot;video/x-msvideo&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span></div></div>
<p>Измените значение <em>protocolInfo extend</em> на <em>yes</em></p>
<div class="codecolorer-container xml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;protocolInfo</span> <span style="color: #000066;">extend</span>=<span style="color: #ff0000;">&quot;yes&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span></div></div>
<p>После этого сохраните файл и запустите <em>MediaTomb</em> из меню <em>Приложения -- Аудио и Видео</em>. Он откроется в вашем стандартном броузере. Там уже при помощи графического интерфейса вы сможете расшарить папки с вашими файлами и смотреть их на телевизоре.</p>
<p>Сервер стартует при загрузке компьютера. При необходимости его можно остановить:</p>
<div class="codecolorer-container xml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">sudo /etc/init.d/mediatomb stop</div></div>
<p>запустить</p>
<div class="codecolorer-container xml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">sudo /etc/init.d/mediatomb start</div></div>
<p>и перезапустить</p>
<div class="codecolorer-container xml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">sudo /etc/init.d/mediatomb restart</div></div>
<p>Приятного просмотра :)<br />
Дополнительная информация <a href="https://help.ubuntu.com/community/MediaTomb">тут</a> и <a href="http://sourceforge.net/apps/mediawiki/samygo/index.php?title=Media_Play_and_DLNA">тут</a>. </p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="" href="http://koldunov.net/?p=402">{lang: 'ru'}</g:plusone></div><img src="http://feeds.feedburner.com/~r/koldunovnet/~4/G3eXOSMqVXs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://koldunov.net/?feed=rss2&amp;p=402</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>CDO (Climate Data Operators) – рабочая лошадка для обработки netCDF файлов</title>
		<link>http://koldunov.net/?p=401</link>
		<comments>http://koldunov.net/?p=401#comments</comments>
		<pubDate>Sat, 14 Aug 2010 17:18:17 +0000</pubDate>
		<dc:creator>koldunovn</dc:creator>
				<category><![CDATA[Обработка данных]]></category>
		<category><![CDATA[Без рубрики]]></category>
		<category />
		<category><![CDATA[cdo]]></category>
		<category><![CDATA[netCDF]]></category>
		<category><![CDATA[nix]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://koldunov.net/?p=401</guid>
		<description><![CDATA[Задача: проводить манипуляции с файлами формата netCDF, в том числе осреднение и выборку по различным осям, установку временной оси, интерполяцию полей, объединение и разделение файлов. Инструмент: CDO (Climate Data Operators) Причина, по которой я так долго тянул с постом о cdo, наверное в том, что они настолько незаметны и настолько часто мной используются, что я [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Задача:</strong> проводить манипуляции с файлами формата <em>netCDF</em>, в том числе осреднение и выборку по различным осям, установку временной оси, интерполяцию полей, объединение и разделение файлов.<br />
<strong>Инструмент:</strong> <a href="https://code.zmaw.de/projects/cdo">CDO (Climate Data Operators)</a></p>
<p>Причина, по которой я так долго тянул с постом о cdo, наверное в том, что они настолько незаметны и настолько часто мной используются, что я практически забываю об их существовании, воспринимая больше просто как некие обычные команды шела. Однако без них жизнь человека работающего с <em>netCDF</em> (а также <em>GRIB</em>) файлами становится гораздо неуютнее. На сегодняшний день существует около 400 операторов, позволяющих проводить первичную обработку файлов. Как бы я не любил <em>Python</em>, поручить ему обработку террабайтов информации значит обречь себя на очень долгое ожидание, тогда как cdo, написанные на <em>C++</em>, справляются с крупномасштабными задачами сравнительно быстро, при этом обладают очень простым для понимания синтаксисом.</p>
<p>В посте я расскажу об установке <em>CDO</em> под <em>Ububtu 10.04</em> и <em>Windows</em> (да, они есть и под винду) покажу как пользоваться несколькими наиболее популярными их функциями.<br />
<span id="more-401"></span><br />
Репозиторий с файлами <a href="https://code.zmaw.de/projects/cdo/files">находится по этому адресу</a>. </p>
<h4>Windows</h4>
<p>Виндузятники могут скачать экзешник и практически начинать пользоваться cdo, никакой установки как таковой не требуется, главное, чтобы <em>cdo.exe</em> находился в той директории где вы планируете обрабатывать свои данные. Операторы и опции одинаковы для <em>Windows</em> и <em>Linux</em> версий.</p>
<h4>linux (Ubuntu 10.04)</h4>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get install</span> cdo</div></div>
<p>При этом устанавливается сравнительно старая версия <em>cdo - 1.4.0.1</em>, но для большинства приложений ее должно быть достаточно. Если вы хотите версию поновее, то придется компилировать ее самостоятельно. Приятным дополнением к <em>cdo</em> является пак с необходимыми библиотеками, которые должны в идеале компилироваться одной командой. Называется он <em>libs4cdo</em> и находится в том же репозитории, что и основная программа, а тут лежит <a href="https://code.zmaw.de/projects/cdo/wiki/Libs4cdo">документация по <em>lib4cdo</em></a>.</p>
<h4>Скачиваем файлы</h4>
<p>Вы можете попробовать работать сразу с имеющимися у вас файлами, но если хотите для начала следовать всем командам в этом небольшом туториале буквально, то скачайте пять файлов содержащих ежедневные данные по приземной температуре (<em>NCEP</em> реанализ) <a href="http://www.esrl.noaa.gov/psd/cgi-bin/db_search/DBListFiles.pl?did=33&#038;tid=27148&#038;vid=668">с этой странички</a>. Я буду использовать года с 1990 по 1994.</p>
<h4>Использование cdo</h4>
<p>Использование предельно просто. Чаще всего вы сначала вводите команду "<em>cdo</em>", затем оператор, файл который необходимо обработать и, наконец, файл, в который будут записаны результаты работы. В более общем случае синтаксис выглядит как:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">cdo <span style="color: #7a0874; font-weight: bold;">&#91;</span> Options <span style="color: #7a0874; font-weight: bold;">&#93;</span> Operator1 <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-Operator2</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-OperatorN</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span> input_file <span style="color: #7a0874; font-weight: bold;">&#91;</span>output_file<span style="color: #7a0874; font-weight: bold;">&#93;</span></div></div>
<p>Вы видите, что операторы можно комбинировать, мы к этому еще вернемся.</p>
<h4>Получаем информацию о файле</h4>
<p>Давайте для начала посмотрим, что содержится в наших файлах. Наберем:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">cdo sinfo air.sig995.1990.nc</div></div>
<p>Получим краткую информацию о файле:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; File format: netCDF<br />
&nbsp; &nbsp; <span style="color: #660033;">-1</span> : Institut Source &nbsp;Table Code &nbsp; Time &nbsp; Typ &nbsp;Grid Size Num &nbsp;Levels Num<br />
&nbsp; &nbsp; &nbsp;<span style="color: #000000;">1</span> : unknown &nbsp;unknown &nbsp; &nbsp; <span style="color: #000000;">0</span> &nbsp; <span style="color: #660033;">-1</span> variable I16 &nbsp; &nbsp; <span style="color: #000000;">10512</span> &nbsp; <span style="color: #000000;">1</span> &nbsp; &nbsp; &nbsp; <span style="color: #000000;">1</span> &nbsp; <span style="color: #000000;">1</span><br />
&nbsp; &nbsp;Horizontal grids :<br />
&nbsp; &nbsp; &nbsp;<span style="color: #000000;">1</span> : lonlat &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #c20cb9; font-weight: bold;">size</span> &nbsp; &nbsp; &nbsp;: dim = <span style="color: #000000;">10512</span> &nbsp;nlon = <span style="color: #000000;">144</span> &nbsp;nlat = <span style="color: #000000;">73</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lon &nbsp; &nbsp; &nbsp; : first = <span style="color: #000000;">0</span> &nbsp;<span style="color: #c20cb9; font-weight: bold;">last</span> = <span style="color: #000000;">357.5</span> &nbsp;inc = <span style="color: #000000;">2.5</span> &nbsp;degrees_east &nbsp;circular<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lat &nbsp; &nbsp; &nbsp; : first = <span style="color: #000000;">90</span> &nbsp;<span style="color: #c20cb9; font-weight: bold;">last</span> = <span style="color: #660033;">-90</span> &nbsp;inc = -<span style="color: #000000;">2.5</span> &nbsp;degrees_north<br />
&nbsp; &nbsp;Vertical grids :<br />
&nbsp; &nbsp; &nbsp;<span style="color: #000000;">1</span> : surface &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : <span style="color: #000000;">0</span> <br />
&nbsp; &nbsp;Time axis : &nbsp;<span style="color: #000000;">365</span> steps<br />
&nbsp; &nbsp; &nbsp;RefTime = &nbsp;0001-01-01 00:00:00 &nbsp;Units = hours &nbsp;Calendar = STANDARD<br />
&nbsp; YYYY-MM-DD hh:mm:ss &nbsp;YYYY-MM-DD hh:mm:ss &nbsp;YYYY-MM-DD hh:mm:ss &nbsp;YYYY-MM-DD hh:mm:ss<br />
&nbsp; <span style="color: #000000;">1990</span>-01-01 00:00:00 &nbsp;<span style="color: #000000;">1990</span>-01-02 00:00:00 &nbsp;<span style="color: #000000;">1990</span>-01-03 00:00:00 &nbsp;<span style="color: #000000;">1990</span>-01-04 00:00:00</div></div>
<p>Видим, что наш файл содержит наборы матриц размером 144 (долгота) на 73 (широта), шаг по широте и долготе составляет 2.5 градуса. Значения приведены только для поверхности за 365 дней. Ниже вы видите перечисление конкретных дат, на которые представлены поля. Конечно, оператор <em>sinfo</em> не единственная возможность узнать подробности о вашем файле. Например оператор <em>nmon</em> выдаст вам информацию о количестве месяцев, за которые имеются данные в файле, а <em>showmon</em> покажет что это за месяцы. Эти операторы необходимы больше не для вашей информации, а для написания более сложных скриптов обработчиков, в которые необходимые значения могут передаваться автоматически. </p>
<h4>Объединение и разделение файлов</h4>
<p>Для начала давайте сделаем из пяти наших файлов один, причем объединим их по времени:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">cdo mergetime air.sig995.199<span style="color: #000000; font-weight: bold;">*</span>.nc air.sig995.1990-<span style="color: #000000;">1994</span>.nc</div></div>
<p>для тех кто не знаком с шаблонами поясню, это  в общем то же самое что:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">cdo mergetime air.sig995.1990.nc air.sig995.1991.nc air.sig995.1992.nc air.sig995.1993.nc air.sig995.1994.nc air.sig995.1990-<span style="color: #000000;">1994</span>.nc</div></div>
<p>В итоге получаем файл, в котором содержатся ежемесячные значения для пяти лет (вы можете это проверить выполнив оператор <em>sinfo</em> для файла <em>air.sig995.1990-1994.nc</em>). Для чего это может быть нужно? Например, теперь вы хотели бы получить отдельные файлы, в каждом из которых содержались бы значения только за определенный месяц за все пять лет. Для этого существует команда <em>splitmon</em></p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">cdo splitmon air.sig995.1990-<span style="color: #000000;">1994</span>.nc air.sig995.1990-<span style="color: #000000;">1994</span>_mon</div></div>
<p>в итоге вы получаете 12 файлов, в каждом значения для одного месяца. Точно также можно разделять по часам, дням, сезонам, годам (в этом случае получатся файлы идентичные нашим изначальным).</p>
<h4>Выборка</h4>
<p>Вернемся к нашему объединенному файлу. Допустим нам необходимо вытянуть из него лишь несколько месяцев. Можно, конечно, сначала создать отдельный файл для каждого месяца, а затем соединить те что нужны, но есть другой, более простой способ. Вы можете выбрать нужные вам месяцы:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">cdo selmon,<span style="color: #000000;">1</span>,<span style="color: #000000;">3</span>,<span style="color: #000000;">9</span> air.sig995.1990-<span style="color: #000000;">1994</span>.nc air.sig995.1990-<span style="color: #000000;">1994</span>_JAN_MAR_SEP.nc</div></div>
<p>в этом случае январь, март, сентябрь. Примерно также вы можете выбирать нужные вам года, переменные, уровни. Если вас, например, интересует только Арктика, вместо того чтобы ворочать файлами для всего глобуса, вы можете выбрать только интересующую вас область при помощи команды <em>sellonlatbox</em> .</p>
<p>Продолжение в следующем посте :)</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="" href="http://koldunov.net/?p=401">{lang: 'ru'}</g:plusone></div><img src="http://feeds.feedburner.com/~r/koldunovnet/~4/mo4-QZBaB5g" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://koldunov.net/?feed=rss2&amp;p=401</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Карманное глобальное потепление</title>
		<link>http://koldunov.net/?p=393</link>
		<comments>http://koldunov.net/?p=393#comments</comments>
		<pubDate>Fri, 06 Aug 2010 21:42:09 +0000</pubDate>
		<dc:creator>koldunovn</dc:creator>
				<category><![CDATA[nix]]></category>
		<category><![CDATA[Без рубрики]]></category>
		<category><![CDATA[android]]></category>

		<guid isPermaLink="false">http://koldunov.net/?p=393</guid>
		<description><![CDATA[Недавно я стал счастливым обладателем HTC Desire, телефона на платформе Android. Но про этот телефон уже столько всего понаписано, что добавлять свои пять копеек смысла особого не имеет. Вместо этого я расскажу об Android приложении, которое вооружит вас против скептиков, сомневающихся в глобальном потеплении. Практически на любой их аргумент вы почти мгновенно сможете представить если не полноценную научно популярную [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://koldunov.net/wp-content/uploads/2010/08/android_categories.jpg" style="margin-top: 0px; margin-right: 9px; margin-bottom: 0px; margin-left: 0px" alt="android_categories.jpg" align="left" height="300" />Недавно я стал счастливым обладателем HTC Desire, телефона на платформе Android. Но про этот телефон уже столько всего понаписано, что добавлять свои пять копеек смысла особого не имеет. Вместо этого я расскажу об Android приложении, которое вооружит вас против скептиков, сомневающихся в глобальном потеплении. </p>
<p>Практически на любой их аргумент вы почти мгновенно сможете представить если не полноценную научно популярную заметку, то как минимум список публикаций по теме. К слову есть подобные приложения для iPhone и Nokia, так что владельцы альтернативных платформ также имеют возможность при случае блеснуть интеллектом.</p>
<p><span id="more-393"></span></p>
<p>Вкратце: приложение это хорошо структурированный сборник аргументов людей сомневающихся в реальности современного глобального потепления, либо в его антропогенном происхождении либо его неприятных последствиях. Для каждого из этих аргументов существует короткий ответ с опровержением и более развернутая научно-популярная заметка, часто с графиками и ссылками на научные публикации. Все это загружено в ваш телефон, то есть нет необходимости быть подключенным к сети для того чтобы утереть нос зарвавшемуся скептику, но поскольку список аргументов и контраргументов постоянно пополняется и обновляется, приложение будет периодически ходить в интернет за апдейтами.</p>
<h3>Немножко подробнее о том что внутри</h3>
<p><img src="http://koldunov.net/wp-content/uploads/2010/08/android_categories.jpg" alt="android_categories.jpg" align="center" height="400"/></p>
<p>На первом экране вы увидите три категории на которые разбиты аргументы: "Это не мы", "Этого не происходит", "Это не плохо". </p>
<p><img src='http://koldunov.net/wp-content/uploads/2010/08/android_arguments.jpg' alt='android_arguments.jpg' height="400"/></p>
<p>Собственно аргументов целый вагон и маленькая тележка, а если быть точным на момент написания поста их было 119. Можно только подивиться работоспособности и упертости, в хорошем смысле слова, автора сайта Джона Кука, который постоянно собирает, каталогизирует эти аргументы и довольно грамотно, при этом доступно разъясняет почему они скорее всего ложны.</p>
<p><img src='http://koldunov.net/wp-content/uploads/2010/08/android_top10.jpg' alt='android_top10.jpg' height="400"/></p>
<p>Имеется также вкладка с десяткой самых популярных у скептиков аргументов. Ответы на них сделаны с особой тщательностью :)</p>
<p><img src='http://koldunov.net/wp-content/uploads/2010/08/android_search.jpg' alt='android_search.jpg'  height="400" /></p>
<p>Естественно при таком объёме информации никакая каталогизация не поможет, и необходимо пользоваться поиском. Доступен он при нажатии на кнопку меню и сделан по взрослому, то есть выводит возможные результаты уже в процессе набора.</p>
<p><img src='http://koldunov.net/wp-content/uploads/2010/08/android_argument.jpg' alt='android_argument.jpg' height="400" /></p>
<p>Текст по умолчанию довольно мелкий, но существует возможность его увеличить (правда до определенных пределов), это можно делать как кнопками так и мультитачем. Графики кликабельны и их можно разворачивать на весь экран и рассматривать настолько подробно насколько позволяют размеры телефона. Также естественно кликабельны и ссылки на научные статьи. Джон старается ставить ссылки на версии доступные для свободного скачивания, так что при желании зачастую вы сможете ознакомиться и с оригинальным исследованием, правда для этого уже необходимо быть подключенным к интернет.</p>
<p><img src='http://koldunov.net/wp-content/uploads/2010/08/android_pic.jpg' alt='android_pic.jpg' /></p>
<p>При изменении положения телефона текст поворачивается, также как и отдельно открытые картинки.</p>
<p>В заключении отмечу что приложение сделано очень качественно и с ним приятно работать в не зависимости от того какого мнения по поводу глобального потепления вы придерживаетесь :)</p>
<h3>Ссылки</h3>
<p>QR код:<br />
<img src='http://koldunov.net/wp-content/uploads/2010/08/market___search_q_pname_.png' alt='market___search_q_pname_.png' /></p>
<p>Также можно <a href="http://www.appbrain.com/app/com.shinetech.skepticalscience">установить с AppBrain</a>:</p>
<p><a href="http://www.skepticalscience.com/Skeptical-Science-now-an-Android-app.html">Оригинальный пост с описанием на ScepticalScience.</a></p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="" href="http://koldunov.net/?p=393">{lang: 'ru'}</g:plusone></div><img src="http://feeds.feedburner.com/~r/koldunovnet/~4/03qbCP3w5Y8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://koldunov.net/?feed=rss2&amp;p=393</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>CiteULike – онлайн инструмент для работы с библиографической информацией</title>
		<link>http://koldunov.net/?p=385</link>
		<comments>http://koldunov.net/?p=385#comments</comments>
		<pubDate>Sun, 21 Feb 2010 02:11:48 +0000</pubDate>
		<dc:creator>koldunovn</dc:creator>
				<category><![CDATA[Без рубрики]]></category>
		<category><![CDATA[CiteULike]]></category>
		<category><![CDATA[webtools]]></category>
		<category><![CDATA[библиография]]></category>
		<category><![CDATA[статьи]]></category>

		<guid isPermaLink="false">http://koldunov.net/?p=385</guid>
		<description><![CDATA[Давно порывался написать про сервис которым пользуюсь уже на протяжении более двух лет, и который за это время стал неотъемлемой частью моего рабочего процесса. Это сайт CiteULike.org , который представляет собой в первую очередь средство для организации библиографических ссылок, но также может служить как хранилище персональных копий статей в pdf, обладает некоторыми социальными функциями. Я [...]]]></description>
			<content:encoded><![CDATA[<p>Давно порывался написать про сервис которым пользуюсь уже на протяжении более двух лет, и который за это время стал неотъемлемой частью моего рабочего процесса. Это сайт <a href="http://www.citeulike.org">CiteULike.org</a> , который представляет собой в первую очередь средство для организации библиографических ссылок, но также может служить как хранилище персональных копий статей в pdf, обладает некоторыми социальными функциями.</p>
<p>Я тут опишу только тот функционал которым сам пользуюсь. Сайт развивается очень активно (думаю не в малой степени потому что не так давно он стал поддерживаться издательством Springer) и часто появляется новый функионал,  в последнее время все больше направленый на развитие именно социальной составляющей сервиса, которую я пока не очень освоил.  Так что рассказ будет посвящен в основном работе с библиографией и призван заинтересовать и помочь начать входить во вкус :)</p>
<p><span id="more-385"></span></p>
<p>Перво наперво вам необходимо зарегистрироваться. Пройдя по <a href="http://www.citeulike.org/">ссылке</a>  вы увидите стартовую страницу с минималистичным интерфейсом, все вкусное ждет вас после регистрации, жмите на "Join now".</p>
<p><img src="http://koldunov.net/wp-content/uploads/2010/02/citeulike1.png" alt="citeulike1.png" /></p>
<p>Процедура регестрации легка и непринужденна, подтверждать email не нужно, вы сразу можете начинать работу. На странице вашего профиля будет много чего интересного, но первым делом обратите внимание на два меню в левом верхнем углу:</p>
<p><img src="http://koldunov.net/wp-content/uploads/2010/02/citeulike2.png" alt="citeulike2.png" /></p>
<p>В меню <strong>CiteULike</strong> находятся ссылки на рубрики сайта относящиеся ко всем пользователям, такие как популярные посты в блогах, список групп к которым вы можете присоединиться и тому подобное. В меню <strong>MyCiteULike</strong> пункты относящиеся непосредственно к той информации которую вы будете заносить в свою базу.</p>
<p>Для начала  давайте настроим ваш браузер для того чтобы добавлять библиографические ссылки было быстро и удобно. В меню <strong>CiteULike</strong> выберете "<em>Browser Button</em>". На этой странице вам предложат установить так называемый "букмарклет", специальную ссылку в вашей панели закладок. Если находясь на странице со статьей поддерживаемого CiteULike журнала  вы нажмете на букмарклет, то перейдете на  CiteULike и начнете автоматическое добавление статьи в свою библиотеку.</p>
<p>Добавить букмарклет в <em>Firefox</em> очень просто. Для этого вам необходимо убедиться что панель закладок отображается и просто перетащить на нее одну из двух ссылок "<em>Post to CiteULike</em>". Отличаются они тем что один букмарклет запускает добавление статьи в базу в том же окне, а другой открывает дополнительное окно. На мой взгляд более практично использовать дополнительное окно, но это дело вкуса.  Если вы по какой то причине пользуетесь <em>IE</em> или <em>Safari</em>, то сможете найти инструкции по установке букмарклетов и для этих браузеров. Существует также <a href="http://www.citeulike.org/bookmarklets.adp">новая версия букмарклета</a>, которая поддерживает добавление статей из  <em> Scopus, ISI Web of Knowledge, Mendeley, Google Scholar</em> и <em>Google Books</em>, но она пока не очень стабильна.</p>
<p>Теперь давайте добавим нашу первую статью, например<a href="http://www.agu.org/pubs/crossref/2010/2009GL042115.shtml"> вот эту</a> . Перейдя на страницу со статьей, нажимайте на букмарклет</p>
<p><img src="http://koldunov.net/wp-content/uploads/2010/02/citeulike3.png" alt="citeulike3.png" /></p>
<p>Вы перейдете на CiteULike и увидите следующую картину:</p>
<p><img src="http://koldunov.net/wp-content/uploads/2010/02/citeulike4.png" alt="citeulike4.png" /></p>
<p>Если сайт журнала поддерживается, то библиографическая информация добавится автоматически. Вам также предлагают сразу добавить таги для этой статьи, что должно упростить ее поиск в дальнейшем.</p>
<ul>
<li> "<em>Post to</em>" позволяет вам выбрать куда постить статью. По умолчанию статья добавляется в вашу библиотеку, но если вы присоединитесь к каким либо группам то можете добавить статью и в них.</li>
<li> "<em>Priority</em>" позволяет выбрать приоритет для этой статьи, хотите вы ее прочитать как можно быстрее или можно отложить это мероприятие. Я этой опцией обычно не пользуюсь.</li>
<li> Если вы читаете "<em>P</em><span class="postbody"><em>rogress in Physics</em>" но не хотите чтобы приличные люди об этом знали, то можете запостить статью приватно :) .</span></li>
<li><span class="postbody"> "<em>Notes</em>" - можете сразу написать какой ни будь комментарий к статье. </span></li>
<li><span class="postbody">"<em>Attachment</em>" - это одна из самых полезных функций, вы можете добавить файл со статьей. Если "расшарить" библиографическую запись для других можно, то с файлом такого сделать нельзя, так что .pdf будет доступен только для вас. Полезно это тем что не всегда есть доступ к рабочему компьютеру с подпиской на журналы, а если вы будете добавлять файлы в CiteULike то сможете открывать их из любого места где есть интернет. </span></li>
<li><span class="postbody"> "<em>BibTeX Key</em>" - по умолчанию CiteULike присвоит какой то ключ, но вы можете предложить свой и если вы не так ленивы как я то лучше это, конечно, сделать.</span></li>
</ul>
<p>Обычно я не заполняю ничего (может кроме тагов) и просто жму на <strong>Post Article</strong>. Вы попадаете в свою библиотеку, которая на данный момент состоит всего из одной статьи. Давайте кликнем на нее и посмотрим что же у нас получилось.</p>
<p><img src="http://koldunov.net/wp-content/uploads/2010/02/citeulike5.png" alt="citeulike5.png" /></p>
<p>Как видите со своими записями вы можете делать много разного интересного, начиная от расшаривания их в группах и написания рецензий, до поиска людей которые тоже добавили свою статью к себе в библиотеку. Последнее позволяет вам находить людей с похожими интересами, вы можете начать следить за тем что они добавляют, при этом существует большой шанс найти в их библиотеках что ни будь для себя интересное. Но мы с вами посмотрим на последнюю опцию "Expand records". Нажав на треугольничек около данной опции мы увидим представление библиографической записи в форматах <em>BibTeX</em> и <em>RIS</em>. Запись для <em>BibTeX</em> выглядит таким образом:</p>
<p><img src="http://koldunov.net/wp-content/uploads/2010/02/citeulike7.png" alt="citeulike7.png" /></p>
<p>Я обычно копирую именно <em>BibTeX</em> запись со страницы статьи, хотя есть возможность более продвинутого экспорта по нажатию на оранжевую кнопку "<em>Export</em>" у заголовка статьи. Приходится кое что подчищать (например url, citeulike-article-id), менять <em> </em><span class="postbody"><em>BibTeX Key</em> но в принципе это не обязательно.</span></p>
<p>Естественно существует как возможность экспорта всей вашей библиотеки в  <em> </em><span class="postbody"><em>BibTeX</em> базу данных, так и импорта вашей базы в CiteULike. Немножко про импорт я писал<a href="http://koldunov.net/?p=24"> в этом посте</a>.  </span></p>
<p>К сожалению не все сайты журналов пока поддерживаются CiteULike, но даже в этом случае шанс избавить себя от ручного добавления  статьи есть. Вам будет показан интерфейс поиска, в котором вы с большой долей вероятности найдете интересующую вас библиографическую запись. Мне обычно больше везет с <em>CrossRef</em>.</p>
<p><img src="http://koldunov.net/wp-content/uploads/2010/02/citeulike8.png" alt="citeulike8.png" /></p>
<p>Если ничего не помогло, то, конечно, есть возможность добавить статью дедовским способом, последовательно внося библиографическую информацию в соответствующие поля. Доступно это из меню <em>MyCiteULike&gt;&gt;Post manually</em>.</p>
<p>Последнее о чем мне хотелось бы упомянуть это поиск. Для меня было не совсем очевидно что на сайте есть отдельно поиск по всему сайту, который расположен в правом верхнем углу и поиском по вашим записям, который расположен по адресу  <em>MyCiteULike&gt;&gt;Search</em>. Я в основном пользуюсь последним.</p>
<p>Надеюсь что этот пост поможет вам начать работать с этим замечательным инструментом и со временем вы откажитесь от ненадежных и неудобных офлайновых программ для хранения и работы с библиографической информацией :)  Я описал только те функции которые считаю основными, но как я уже говорил, сайт очень богат на различные дополнительные сервисы, так что имеет смысл походить по менюшкам, возможно вам приглянется возможность вести свой блог про интересующие вас статьи, или вы организуете группу для своей лаборатории и будете там обмениваться новинками и обсуждать их.</p>
<p>Мой профиль <a href="http://www.citeulike.org/user/Magik">http://www.citeulike.org/user/Magik</a> , следите и конектитесь )</p>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="small" count="" href="http://koldunov.net/?p=385">{lang: 'ru'}</g:plusone></div><img src="http://feeds.feedburner.com/~r/koldunovnet/~4/MW4R3CkOvn4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://koldunov.net/?feed=rss2&amp;p=385</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

