Netcdf将1d数组写入2d数组

时间:2016-08-27 08:11:51

标签: fortran netcdf

我使用与此类似的代码 - 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阵列?

1 个答案:

答案 0 :(得分:1)

您的转换会创建二维经度和纬度值,因此您需要将xy定义为新的运行索引。

lon(lon) => lon(x,y)
lat(lat) => lat(x,y)

基本上,您将lonlat描述为变量,并将xy添加为新维度。这样,经度和纬度就会映射到正确的网格点。

如果正确写入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输出)