2016-08-23 4 views
0

я добавил новое измерение в существующий файл NetCDF в Fortran, используя следующий код -Fortran NetCDF - добавил новое измерение нужно заполнить нулями

retval = nf_open(cfn,NF_WRITE,ncid) 
if (retval .ne. nf_noerr) call handle_err(retval) 
retval = nf_redef(ncid) 
if (retval .ne. nf_noerr) call handle_err(retval) 
retval = nf_def_dim(ncid,"xyz",len,dimid_xyz) 
if (retval .ne. nf_noerr) call handle_err(retval)   
retval = nf_enddef(ncid) 

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

Я посмотрел API NetCDF в Фортран, и я не уверен, что это API для call.When Я использую следующие API

retval = nf_put_var_real(ncid,dimid_xyz,xyzArray) 
    if (retval .ne. nf_noerr) call handle_err(retval) 

он заканчивает перезапись геопотенциала значения высоты с 0.0 (который единственная переменная в моем файле netCDF)

Как мне это сделать?

+2

Как я понимаю, измерение отличается от переменной, размеры не могут иметь значения, но переменные могут - я думаю, довольно распространенная практика может заключаться в создании измерения и создании переменной ('* _def_var') с одно и то же имя. Затем вы можете дать переменной любые значения, которые вы хотите. –

+0

@ d_1999 большое предложение. Можете ли вы добавить это как ответ? Я буду рад поддержать и принять. – gansub

ответ

1

Как я понимаю, измерение отличается от переменной, размеры не могут иметь значения, но переменные могут - я думаю, довольно распространенной практикой может быть создание измерения, а также создание переменной с тем же именем. Затем вы можете дать переменной любые значения, которые вы хотите.

Ваш код может выглядеть

retval = nf_open(cfn,NF_WRITE,ncid) 
if (retval .ne. nf_noerr) call handle_err(retval) 
retval = nf_redef(ncid) 
if (retval .ne. nf_noerr) call handle_err(retval) 
retval = nf_def_dim(ncid,"xyz",len,dimid_xyz) 
if (retval .ne. nf_noerr) call handle_err(retval) 

retval = nf_def_var(ncid,"xyz",netcdf_real,1,[dimid_xyz], varid_xyz) 
if (retval .ne. nf_noerr) call handle_err(retval) 

retval = nf_enddef(ncid) 

retval = nf_put_vara(ncid,varid_xyz,[1],[len],arrayOfZero) 
if (retval .ne. nf_noerr) call handle_err(retval) 

Примечание Я рекомендую использовать переменную с именем len внутри fortran кода - это будет столкновение с внутренней одного и того же имени.

+0

спасибо за ваш ответ. Я думаю, что API nf_def_var не соответствует документу http://www.unidata.ucar.edu/software/netcdf/netcdf-4/newdocs/netcdf-f77/NF_005fDEF_005fVAR.html – gansub

+0

, который вы хотели бы отредактировать? – gansub

+0

@gansub Я редактировал, хотя я не на 100% уверен, что это правильно - у меня есть опыт использования 'nf90_ *' api, это одна из причин, по которым я изначально разместил это как комментарий, а не ответ. Если кто-то еще может улучшить это, я, очевидно, рад за то, что они отредактировали/опубликовали другой ответ. –

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