我使用与此类似的代码 - Read in coordinate variables从netCDF文件中读取纬度和经度
call check( nf_inq_varid(ncid, LAT_NAME, lat_varid) )
call check( nf_inq_varid(ncid, LON_NAME, lon_varid) )
!读取纬度和经度数据。
call check( nf_get_var(ncid, lat_varid, lats) )
call check( nf_get_var(ncid, lon_varid, lons) )
lats和lons都是1维fortran阵列。
我的初始数据集是地理坐标,我需要将其转换为旋转的lat lon网格,并使用此网址Geographical to rotated lat lon grid中的代码。
其工作方式如下 对于每个地理纬度和经度,我得到一个旋转的纬度。 同样旋转经度。
数学
f(latitude_geo,longitude_geo) = latitude_rot
f(latitude_geo,longitude_geo) = longitude_rot
因此旋转的lat和lon数组是二维数组。我希望能够使用nf_put_vara_real或nf_90_put_vara_real(f77或f90无关紧要)将旋转的lat和lon数组写回原始的netCDF文件。
我怎么能这样做,因为原来的lat和lon数组是1-D数组?是否可以将原始的1-d阵列读作2-D阵列?
答案 0 :(得分:1)
您的转换会创建二维经度和纬度值,因此您需要将x
和y
定义为新的运行索引。
lon(lon) => lon(x,y)
lat(lat) => lat(x,y)
基本上,您将lon
和lat
描述为变量,并将x
和y
添加为新维度。这样,经度和纬度就会映射到正确的网格点。
如果正确写入NetCDF文件,其内容应与此类似:
netcdf example {
dimensions:
x = 360 ;
y = 180 ;
variables:
float x(x):
x:long_name = "x-dimension" ;
float y(y):
y:long_name = "y-dimension" ;
float lon(y, x) ;
lon:long_name = "longitude" ;
lon:units = "degrees_east" ;
...
float lat(y, x) ;
lat:long_name = "latitude" ;
lat:units = "degrees_north" ;
...
float data(y, x) ;
data:long_name = "your data name" ;
...
}
(通过ncdump -h example.nc
输出)