2016-08-23 5 views
0

Код этого ответа действительно работает Add a new dimension, но он не делает то, что я хочу.Как добавить новое измерение к существующей переменной в netCDF?

Чтобы проиллюстрировать мою проблему дальше - у меня есть следующие определения: Время (неограниченное), широта, долгота, уровень как четыре измерения и одна переменная высота геопотенциала. Что я хочу сделать, так это добавить размер dimz_Z в существующую высоту переменной геопотенциала.

Сейчас с ответом в приведенном выше здесь код, как файл NetCDF выглядит с ncdump

float hgt(time, level, lat, lon) 

Но размерность dimz_Z отсутствует, как показано ниже с выхода ncks.

hgt dimension 0: time, size = 1 NC_DOUBLE, chunksize = 1 (Record coordinate is time) 
hgt dimension 1: level, size = 1 NC_FLOAT, chunksize = 1 (Coordinate is level) 
hgt dimension 2: lat, size = 23 NC_FLOAT, chunksize = 23 (Coordinate is lat) 
hgt dimension 3: lon, size = 21 NC_FLOAT, chunksize = 21 (Coordinate is lon) 

Он появляется в определениях, но и как автономное измерение и не части размерности ХГТ

dimz_Z: type NC_FLOAT, 1 dimension, 0 attributes, compressed? no, chunked? no, packed? no 
dimz_Z size (RAM) = 483*sizeof(NC_FLOAT) = 483*4 = 1932 bytes 
dimz_Z dimension 0: dimz_Z, size = 483 NC_FLOAT (Coordinate is dimz_Z) 

Это выход из файла

time[0]=1879032 level[0]=1000 lat[0]=60 lon[0]=50 hgt[0]=53 m 
time[0]=1879032 level[0]=1000 lat[0]=60 lon[1]=52.5 hgt[1]=55 m 

Что я хочу:

time[0]=1879032 level[0]=1000 lat[0]=60 lon[0]=50 dimz_Z[0]=0 hgt[0]=53 m 
time[0]=1879032 level[0]=1000 lat[0]=60 lon[1]=52.5 dimz_Z[0]=0 hgt[1]=55 m 

То, что мне сказал друг, заключается в том, что я не могу добавить это измерение к существующей переменной. Вместо fortran я должен сначала определить переменную hgt как пятимерную переменную и снова поместить значения. Это правильно или есть альтернатива? Я использую API netcdf от Fortran 77.

+2

Ваш друг верен. – cmaster

+0

Является ли dimz_Z только распущенной сетью lon/lat (21 * 23 = 483)? Почему вы хотите объединить количество данных в вашем файле? Я вполне уверен, что вы хотите сделать что-то еще. Вы уверены, что просто не хотите добавлять переменную с фактической высотой? Это не вопрос Фортрана ... – RussF

+0

@RussF - Это вертикальная координата в моей системе. У меня есть лат, лон и эта. Сделав его трехмерным – gansub

ответ

1

Ваш друг верен. Однако есть некоторые варианты, которые вы можете рассмотреть. В программировании почти всегда есть варианты.

  1. Создайте новый файл netcdf из исходного и определите свою переменную в новой, чтобы иметь дополнительное измерение. Вы можете сделать это в fortran
  2. Используйте инструменты обработки netcdf (nco), чтобы создать новую переменную со свойствами, которые вы хотите, и удалить другую.
+0

, можете ли вы добавить код для иллюстрации 1-го пункта? Я согласен с ответом – gansub

+0

У меня недостаточно информации, чтобы добавить код, так как вы его не добавили, это хорошо, если вы пишете фиксированную форму (f77) или бесплатную форму (f90 +). Однако вы можете следовать примеру из https://www.unidata.ucar.edu/software/netcdf/examples/programs/. Например, https://www.unidata.ucar.edu/software/netcdf/examples/programs/simple_xy_rd.f90 показывает, как читать и https://www.unidata.ucar.edu/software/netcdf/examples/programs/ simple_xy_wr.f90 показывает, как писать. Вы узнаете много, следуя примеру и переведя его в свое дело. – innoSPG

+0

обновил вопрос. Ответ, с которым я связан, содержит образец кода. – gansub

Смежные вопросы