2016-08-23 47 views
0

我在FORTRAN使用下面的代碼添加了一個新的層面,現有的netCDF文件,以填補它 -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) 

現在我希望能夠填補這個尺寸與零值。這個集合的基數等於我的情況下位勢高度的變量的基數。另外我還有其他三個維度 - 時間(無限),緯度,經度和水平。

我擡起頭來的netCDF API的Fortran和我不知道什麼是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) 

注意我建議不要使用一個名爲lenfortran代碼中的變量 - 這將具有相同名稱的內在衝突。

+0

感謝您的回答。我認爲nf_def_var的API與您想編輯的doc-http://www.unidata.ucar.edu/software/netcdf/netcdf-4/newdocs/netcdf-f77/NF_005fDEF_005fVAR.html – gansub

+0

不符? – gansub

+0

@gansub我已經編輯了,雖然我不是100%確定它是正確的 - 我只有使用'nf90_ *'api的經驗,這是我最初將它作爲評論發佈而不是回答的原因之一。如果其他人可以改善這一點,我很高興他們編輯/發佈另一個答案。 –