2016-08-23 59 views
0

該代碼是這個答案確實工作Add a new dimension,但它沒有做我想做的事情。如何在NetCDF中爲現有變量添加新維度?

爲了進一步說明我的問題 - 我有以下定義 時間(無限),緯度,經度,水平爲四維和一個變量位勢高度。我想要做的是將dimz_Z添加到現有的變量位勢高度。

現在在這裏上面代碼中的答案是netCDF文件看起來像一個ncdump

float hgt(time, level, lat, lon) 

但是從NCU的輸出下面看到的dimz_Z維度缺失。

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) 

它不會出現在定義,但作爲一個獨立的維度和HGT的尺寸部分

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重新定義爲五維變量,並將這些值重新整理一遍。這是正確的還是有其他選擇? 我正在使用Fortran 77 netcdf API。

+2

你的朋友是對的。 – cmaster

+0

是不是dimz_Z只是解開的lon/lat網格(21 * 23 = 483)?爲什麼要在文件中平均數據量?我很確定你想要做別的事情。你確定你只是不想添加一個具有實際高度的變量嗎?這不是一個Fortran問題... – RussF

+0

@RussF - 它是我係統中的垂直座標。我有lat,lon和eta。讓它三維 – gansub

回答

1

你的朋友是對的。 但是,仍然有一些可以考慮的選項。在編程方面幾乎總是有選擇。

  1. 從最初的一個創建一個新的netcdf文件,並在新的文件中定義您的變量以獲得額外的維度。你可以在Fortran中做到這一點
  2. 使用netcdf處理工具(nco)用你想要的屬性創建一個新變量並刪除另一個屬性。
+0

你可以添加一些代碼來說明第一點?我會接受你的回答 – 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