一般使用Fortran,但有时又不得不使用C语言。
下面是使用C语言将数据写成Grads格式的代码示例:
/*WriteDataForGrads.c*/
//-------------------------------------------------------
// Author: Wu Xuping
// Date:2013-08-17
// Desciption: Test For Writing Data into Grads Using C Language.
//-------------------------------------------------------
#include <stdio.h>
#include <math.h>
int main()
{
//-------------------------------------------------------
//定义整型常量
const int xn=32;//经度(Longitude)网格数
const int yn=18;//纬度(Latitude)网格数
const int zn=7; //高度层数
const int vn=3; //3个变量分别保存水平风速u,垂直风速w,相对湿度h
const int tn=5; //时间跨度20010101-20010105
//定义整型变量
int x,y,z,v,t;
//定义五维数组,测试发现数值类型不能是double
float u[xn][yn][zn][tn];//水平风速u
float w[xn][yn][zn][tn];//垂直风速w
float h[xn][yn][zn][tn];//相对湿度h
//-------------------------------------------------------
//数据赋值
for(t=0;t<tn;t++){
//时间维数循环
for(z=0;z<zn;z++){
//高度层维数循环
for(y=0;y<yn;y++){
//y方向维数循环
for(x=0;x<xn;x++){
//x方向维数循环
u[x][y][z][t]=10*sin(x+y)+z;
w[x][y][z][t]=10*cos(x+y)+z;
h[x][y][z][t]=1.0/(t+1)+1.0/(x+1)+1.0/(y+1);
}
}
}
}
//-------------------------------------------------------
FILE * pfile;//定义文件指针
//写入Grads格式的数据文件
pfile=fopen("WriteDataForGrads.dat","wb");
if (pfile != NULL){
for(t=0;t<tn;t++){
//时间维数循环
//----------------------------------水平风速
for(z=0;z<zn;z++){
//高度层维数循环
for(y=0;y<yn;y++){
//y方向维数循环
for(x=0;x<xn;x++){
//x方向维数循环
fwrite(&u[x][y][z][t],sizeof(float),1,pfile);
}
}
}
//----------------------------------垂直风速
for(z=0;z<zn;z++){
//高度层维数循环
for(y=0;y<yn;y++){
//y方向维数循环
for(x=0;x<xn;x++){
//x方向维数循环
fwrite(&w[x][y][z][t],sizeof(float),1,pfile);
}
}
}
//----------------------------------相对湿度
for(z=0;z<zn;z++){
//高度层维数循环
for(y=0;y<yn;y++){
//y方向维数循环
for(x=0;x<xn;x++){
//x方向维数循环
fwrite(&h[x][y][z][t],sizeof(float),1,pfile);
}
}
}
//----------------------------------
}
}
fclose(pfile);//关闭文件指针
return 0;
}
//-------------------------------------------------------
编译和运行如下:
g++ -o WriteDataForGrads WriteDataForGrads.c
./WriteDataForGrads
Grads中控制文件为:
dset ^WriteDataForGrads.dat
title "Write Data for GrADS Using C"
undef 1e+40
xdef 32 linear -160.000000 10.000000
ydef 18 linear -90.000000 10.000000
zdef 7 levels 1000 850 700 500 300 200 100
tdef 5 linear 0Z2jan2001 1dy
vars 3
u 7 99 Eastward wind [m/s]
w 7 99 vertical wind [m/s]
h 7 99 relative humidity [%]
endvars
测试环境Centos 6.4,gcc 4.4.7.