Могу ли я включить имя файла в качестве переменной при использовании ncrcat? - PullRequest
4 голосов
/ 10 июня 2019

Я объединяю тысячи nc-файлов (выходы из симуляций), чтобы мне было легче обрабатывать их в Matlab.Для этого я использую ncrcat.Файлы имеют разные размеры, и переменная времени не является уникальной для разных файлов.Конкатенация работает хорошо и позволяет мне читать данные в Matlab намного быстрее, чем индивидуальное чтение файлов.Тем не менее, я хочу иметь возможность идентифицировать оригинальный файл nc, из которого происходит каждая точка данных.Можно ли, скажем, добавить имя файла источника в качестве дополнительной переменной, чтобы я мог отслеживать данные?

Ответы [ 2 ]

4 голосов
/ 11 июня 2019

Самый простой способ: индексирование в Интернете

Перед тем, как мы начнем, я бы использовал целочисленный индекс, а не имя файла, чтобы идентифицировать каждый прогон, так как его намного проще обрабатывать, как для записи, так и для обработки в программе matlab. Вместо простого монотонно увеличивающегося индекса идентификатор может иметь значение для вашего прогона (или вы можете даже написать несколько отдельных индексов, если необходимо (например, у вас может быть число для разрешения, даты, версии модели и т. Д.).

Итак, очевидный способ сделать это, о котором я могу подумать, состоит в том, чтобы каждая симуляция записывала индекс в файл для идентификации себя. при первом запуске модели будет записана переменная

myrun=1

второй

myrun=2

и так далее ... тогда, когда вы просматриваете файлы, данные могут быть легко идентифицированы с помощью этого индекса.

Обратите внимание, что если ваши пространственные измерения не являются уникальными и число временных шагов также изменяется от выполнения к выполнению от того, что вы пишете, ваш индекс должен быть функцией всех неуникальных измерений, например, myrun (х, у, т). Если какое-либо из ваших измерений является уникальным для всех файлов, то это измерение является избыточным в индексе и может быть опущено.

Конечно, единственная проблема с этим решением - это снова запустить симуляции :-D, и вы можете говорить о дорогой модели для запуска или чьих-либо других прогонах, которые вы не можете повторить. Если о повторном запуске не может быть и речи, вам нужно попытаться добавить индекс в автономном режиме ...

Автономное индексирование (легко, если сетки одинаковые, в противном случае более сложное)

ЕСЛИ ваши размеры пространства были одинаковыми для всех файлов, тогда это все еще простая задача, поскольку вы можете очень легко добавить автономный индекс для всех временных шагов в каждом файле используя nco:

ncap2 -s 'myrun[$time]=array(X,0,$time)' infile.nc  outfile.nc

или если вы готовы перезаписать исходный файл (будьте осторожны!)

ncap2 -O -s 'myrun[$time]=array(X,0,$time)'

где X - номер прогона. Это добавит переменную с новой переменной myrun, которая является функцией времени, а затем поместит X на каждом шаге. При слиянии вы можете видеть, какой срез данных был из какого конкретного прогона.

Кстати, второй ноль - это приращение, так как оно установлено в ноль, число X будет записано для всех временных шагов в данном файле (в противном случае, если бы это было 1, индекс увеличился бы на один каждый временной шаг - это может быть полезен в некоторых случаях. Например, вы можете использовать два индекса, один с приращением нуля, чтобы идентифицировать прогон, а второй с шагом в единицу, чтобы легко сказать вам, к какому шагу X-го прогона принадлежит срез данных) ,

Если ваши файлы тоже для разных доменов, то, возможно, вы захотите поместить их в общую сетку, прежде чем сделать это ... Я думаю, для этого

cdo enlarge 

может помочь, см. Этот пост: https://code.mpimet.mpg.de/boards/2/topics/1459

3 голосов
/ 12 июня 2019

Я согласен, что индекс будет проще, чем имя файла.Я бы просто добавил к приведенному выше ответу, что команду добавления уникального индекса X с измерением времени к каждому входному файлу можно упростить до

ncap2 -s 'myrun[$time]=X' in.nc out.nc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...