Как сделать переменную времени непрерывной в файле форсирования климатологии netcdf?

У меня есть принудительный файл климатологии NetCDF, который имеет 4 измерения, то есть время, широту, долготу и лев. Я читаю этот файл, используя гибкую систему моделирования (FMS) от GFDL. Я хочу, чтобы время было непрерывным или что-то вроде периодического граничного условия. Например, я должен предоставить месячный файл только за один год, и модель должна напрямую выбрать соответствующий месяц из моего файла без точной проверки конкретного года. Я провожу несколько экспериментов, в которых одни воздействия остаются фиксированными, а другие изменяются (чтобы объяснить, почему я хочу это сделать).


person tech_climate    schedule 02.11.2019    source источник


Ответы (2)


Вы можете использовать следующую команду nco, чтобы добавить атрибут по модулю к вашему измерению времени.

ncatted -a modulo,time,c,c," " filename.nc
person Manmeet Singh    schedule 02.11.2019
comment
+1, это действительно здорово! Я предполагаю, что он отлично работает с месячными данными, но не будет работать с ежедневными (или более точными) временными шагами из-за високосных лет, верно? - person Adrian Tompkins; 06.11.2019
comment
Технически он должен работать и с ежедневными данными. В моей модели я использую месячные данные, но способ, которым моя модель получает значения, заключается в том, что она выполняет линейную интерполяцию для расчета дневных значений. Итак, я думаю, что это должно работать и для ежедневных данных. - person Manmeet Singh; 08.11.2019
comment
Извините, все еще в замешательстве. Насколько я понимаю, это решение делает ось времени циклической. Если вы обращаетесь к марту 2004 года, а набор данных относится только к 12 месяцам 2003 года (по модулю оси времени), код читается как месяц 15 по модулю 12 = 3, то есть 03 марта. В своем ответе вы ссылаетесь на линейную интерполяцию месячных данных, но я имею в виду использование решения по модулю с входными данными, которое является дневным временным разрешением, например, если у вас есть ежедневные данные за 2003 г., и я прошу за 1 марта 2004 г., имеет ли значение код прочитан 1 марта 2003 г. или 2 марта 2003 г.? (потому что 2004 год — високосный, а в исходном наборе данных всего 365 дней.) - person Adrian Tompkins; 08.11.2019
comment
Эй, да, вы правы, это решение делает ось времени циклической. Я только что сказал, что не имеет значения, имеют ли ваши данные 12 точек (ежемесячно) или 365 точек (ежедневно), эта линейная интерполяция автоматически выполняется Гибкая система моделирования (FMS), которую использует моя модель. Эта линейная интерполяция не зависит от этого ответа, это было просто подробное объяснение, которое я предоставил, извините, если это привело к путанице. - person Manmeet Singh; 10.11.2019
comment
Хорошо, но это означает, что ваш вклад будет смещаться на один день за четыре года... Это означает, что если кто-то использует это для климатической интеграции, вы будете отставать примерно на месяц к 2100 году. - person Adrian Tompkins; 11.11.2019

Вы можете создать файл netcdf с одним и тем же годом, повторяющимся много раз, и отметкой времени, перезаписанной, чтобы получить «фиктивный» год, используя cdo. Допустим, в вашем примере файла netcdf "oneyear.nc" указано время для 2002 года, тогда как другие ваши "изменяющиеся" файлы охватывают годы с 1980 по 2010 (если я поймите ваш вопрос, некоторые переменные будут меняться из года в год, это всего лишь один конкретный файл, который вы хотите сохранить неизменным).

Затем вы можете создать набор файлов года с фиктивной отметкой времени таким образом.

for offset in $(seq -22 8) ; do 
    cdo shifttime,${offset}years oneyear.nc year${offset}.nc
done

и затем вы можете объединить их в один файл, используя время слияния:

cdo mergetime year*.nc mydriverfile.nc

mydriverfile.nc теперь должен содержать одни и те же ежемесячные данные, повторяющиеся в течение 30 лет с фиктивными «фальшивыми» годами, которые затем легко читать так же, как и другие ваши файлы драйверов.

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

person Adrian Tompkins    schedule 04.11.2019