Как определить каждый исходный файл при объединении многих файлов netcdf с ncrcat?

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

2 ответа

Решение

Самый простой способ: онлайн индексация

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

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

myrun=1

секунда

myrun=2

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

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

Конечно, единственная проблема этого решения заключается в том, что это означает, что нужно снова запускать симуляции:--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

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

ncap2 -s 'myrun[$time]=X' in.nc out.nc
Другие вопросы по тегам