Fortran выводит большой массив в netCDF nf90_enddef

Привет, первый вопрос о stackoverflow.

Я застрял на этом в течение 5 дней. Я хочу написать файл netcdf на Фортране.

Я использую netcdf/3.6.3. Я пытаюсь вывести большой массив 43000x 18000 с именем frech и несколько меньших (массивы 1d).

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

  print*,"nunks is",nunks
  print*,"neqns is",neqns


  ok=nf90_create('michalek.nc', NF90_CLOBBER, ncid)
  print *,"create ok=",ok

  ok=   nf90_def_dim(ncid,"nunks", nunks, nunks_dimid)
  print *,"def nunks dimension ",ok
  ok=   nf90_def_dim(ncid,"neqns", neqns, neqns_dimid)
  print *,"def neqns dimension ",ok
  dimids=(/neqns_dimid, nunks_dimid/)
  print *,dimids
  ok=   nf90_def_var(ncid,"frech", NF90_REAL, dimids, frech_varid)
  print *,"def frech",ok
  ok=   nf90_def_var(ncid,"src", NF90_REAL, nunks_dimid, src_varid)
  print *,"def src",ok
  ok=   nf90_def_var(ncid,"csrc", NF90_REAL, nunks_dimid, csrc_varid)
  print *,"define csrc",ok
  ok=   nf90_def_var(ncid,"dat", NF90_REAL, neqns_dimid, dat_varid)
  print *,"define dat",ok
  ok=   nf90_def_var(ncid,"cdat", NF90_REAL, neqns_dimid, cdat_varid)
  print *,"define cdat",ok
  ok=   nf90_enddef(ncid)
  print *,"end dif ", ok
  ok=   nf90_put_var(ncid, frech_varid, frech)
  print *, 'frech put in ok=',ok
  ok=   nf90_put_var(ncid, src_varid, src)
  print *, 'src put in ok=',ok
  ok=   nf90_put_var(ncid, csrc_varid, csrc)
  print *, 'csrc put in ok=',ok
  ok=   nf90_put_var(ncid, dat_varid, dat)
  print *, 'dat put in ok=',ok
  ok=   nf90_put_var(ncid, cdat_varid, cdat)
  print *, 'cdat put in ok=',ok
  ok=   nf90_close(ncid)
  print *, 'close?',ok

Я понимаю, что ok=0, когда файл правильно читается. Однако, когда я дохожу до стадии завершения определения файла (nf90_enddif), ok возвращается как =-62, а файл netcdf не создается. Я предполагаю, что это проблема со слишком большим массивом, но я не могу решить эту проблему.

соответствующий вывод для приведенного выше кода:

nunks is       43894
neqns is       18144
create ok=           0
def nunks dimension            0
def neqns dimension            0
     2           1
def frech           0
def src           0
define csrc           0
define dat           0
define cdat           0
end dif          -62
frech put in ok=         -39
src put in ok=         -39
csrc put in ok=         -39
dat put in ok=         -39
cdat put in ok=         -39
close?         -62

Спасибо за любую помощь!

С уважением Питер :)


person Weatherman    schedule 30.07.2015    source источник
comment
Вы играли с переменным размером, чтобы увидеть, получится ли у вас с меньшим размером? Например, выберите 1000 x 1000 и постепенно увеличивайте его, чтобы увидеть, в чем проблема.   -  person innoSPG    schedule 31.07.2015
comment
Это хорошая идея. Но я бы не хотел слишком много экспериментировать с кодом, потому что его выполнение занимает 10 минут. Может быть, мне стоит попытаться сократить некоторые аспекты кода.   -  person Weatherman    schedule 01.08.2015


Ответы (3)


Возможно, это связано с ограничением размера переменных в netcdf, 4 гига (см. ниже). Возможно, вы захотите разрезать свой массив перед его сохранением или перейти на netcdf-4/hdf-5.

Были ли устранены все ограничения размера netCDF?

Формат на основе netCDF-4 HDF5 не имеет практических ограничений на размер переменной.

Однако для классического и 64-битного форматов смещения по-прежнему существуют ограничения на размеры объектов netCDF. Каждая переменная фиксированного размера (кроме последней, когда нет переменных записи) и данные для одной записи одной переменной записи (кроме последней) ограничены по размеру до чуть менее 4 ГиБ, что в два раза больше ограничение размера в версиях до netCDF 3.6.

Максимальное количество записей остается 232-1.

Подробности см. на http://www.unidata.ucar.edu/software/netcdf/docs/faq.html#Large%20File%20Support10

person innoSPG    schedule 31.07.2015
comment
Фантастика! Я понятия не имел, что переход с netcdf 4 и 3 может иметь такое значение. Это сработало, когда я загрузил более новую версию netCDF ... Если бы я только спросил 5 дней назад;) спасибо за вашу помощь - person Weatherman; 01.08.2015
comment
Рад помочь. Не забудьте принять ответ, чтобы люди могли перестать искать другое решение. - person innoSPG; 01.08.2015

В классическом формате NetCDF, когда не используются неограниченные размеры, вам разрешена только 1 переменная, превышающая 2 ГБ. Также это должна быть последняя переменная в наборе данных, а смещение к началу должно быть не более 2ГиБ. Похоже, перемещение frech в конец должно сработать.

person RussF    schedule 31.07.2015

В Parallel-NetCDF компании Argonne-Northwestern (http://cucis.ece.northwestern.edu/projects/PnetCDF/ ) мы ослабили ограничения на размер файла, создав формат файла CDF-5. Это заняло некоторое время, но я думаю, что мы делаем успехи в том, чтобы Unidata-NetCDF признал его.

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

person Rob Latham    schedule 31.07.2015