当前位置:
文档之家› 二进制文件Fortran读写专题
二进制文件Fortran读写专题
GrADS binary数据
GrADS最基本,我们最易准备
常用后缀 .dat .grb .bin ……
需要.ctl文件一起使用
是无格式文件 (form=‘unformatted’)
若用Fortran读写
▪ 存取方式
• 直接存取(access=‘direct’)
GrADS读取快速
• 顺序存取(access=‘sequential’) 需在.ctl中说明
8
FORTRAN示例二:每次写入一个记录
Var1
Var2
Var3
VarN
T1
……
一个 记录
Var1
Var2
VaVar2
Var3
VarN
T3
……
2017年9月11日星期一
9
FORTRAN示例二:每次写入一个记录
每次写入一个数据
每次写入一个记录(平面)
2017年9月11日星期一
t=1
then levels 925, 850, 700, 600, 500, 400, 300, 250, 200, 150, 100, 70, 50, 30, 20, 10
根据Fortran程序,
Time 1, Level 1000, Variable qa then levels 925, 850, 700, 600, 500, 400,
▪ 数据类型real*4,也就是4个字节的实型数
GrADS binary数据
GrADS视该数据集为一个五维数组,这五维的变化顺序为:
x(lon) y(lat) z(lev) vars(不同变量) t(time)
这是GrADS缺省的数据存放次序,读取和调用的效率最高。
例:假如我们希望创建一 binary数据集,共4个变量, 每个变量有4维(x,y,z,t),则以 x,y维构成水平网格的二维数 组片的存放顺序如下:
这是GrADS缺省的数据存放次序,读取和调用数 据的效率最高。
2017年9月11日星期一
5
输出GrADS数据文件的次序
其中任何一(几)维都可省略。例:
▪ DATA ( 144, 73, 17, 6, 365 )
▪ DATA(144,73,17,365)
▪ DATA(144,73,17)
▪ DATA(6,365)
Time 1, Variable 1, Each vertical level from bottom to top Time 1, Variable 2, Each vertical level from bottom to top Time 1, Variable 3, Each vertical level from bottom to top Time 1, Variable 4, Each vertical level from bottom to top
Var3
VarN
T1
……
一个 记录
Var1
Var2
Var3
VarN
T2
……
Var1
Var2
Var3
VarN
T3
……
2017年9月11日星期一
4
输出GrADS数据文件的次序
用循环写grads的二进制数据, 从内循环到外循环依次是:
▪ x (lon) → y (lat) → z (lev) → vars (不同变 量) → time
13
FORTRAN示例四:气压层不同
PS
ta
qa
zg
T1
……
一个 记录
PS
ta
qa
zg
T2
……
PS
ta
qa
zg
T3
……
2017年9月11日星期一
14
FORTRAN示例四:气压层不同
2017年9月11日星期一
15
FORTRAN示例五:多个变量
2017年9月11日星期一
16
Time 1, Level ? , Variable PS Time 1, Level 1000, Variable ta
▪ DATA(365)
在生成原始数据文件时,无论用工作站还是PC机, 无论是用FORTRAN语言还是用C 语言,所生成 的数据的格式都要求是无格式(unformatted)直 接(direct)记录格式,不允许在记录中加入描述 符,如记录开始、记录结束、换行符等。
2017年9月11日星期一
6
二进制Binary数据文件存储结构
zg 17 99 geopotential height (gpm)
ts 0 99 t2m temperature (degC)
P
0 99 precipitation (mm)
endvars
18
ta 17 99 air temperature (degC)
qa 8 99 special humidity (kg/kg)
ua 17 99 Zonal winds (m/s)
va 17 99 Meridional winds (m/s)
wa 12 99 vertical winds (pa/s)
Ps
P Ps
P Ps
P Ps
Time 365, Level ? , Variable P
2017/9/11
17
Fortran->CTL
2017年9月11日星期一
dset d:/mydata/test.grd
title This a GrADS test data
undef -9999.0
xdef 144 linear 0 2.5
一个点 (IX,IY)
一个 记录
10
recl=:一次写入的数据量,与Fortran编辑单位有 关。
▪ 以字节数为单位:需要*4,recl= 144*73*4(字节) ▪ 以数据个数为单位,不需*4,recl= 144*73
recl与rec有关联 不同维数的循环嵌套顺序
(lon lat lev 不同变量 time ) (x y z 不同变量 t )
Var1
Var2
Var3
VarN
T1
……
Var1
Var2
Var3
VarN
T2
……
Var1
Var2
Var3
VarN
T3
……
2017年9月11日星期一
7
FORTRAN示例一:每次写入一个数据
无格式存储 直接存储
记录长度 记录序号
TIME循环 变量循环 LEV循环 LAT循环 LON循环
记录序号
2017年9月11日星期一
Time 2, Variable 1, Each vertical level from bottom to top Time 2, Variable 2, Each vertical level from bottom to top Time 2, Variable 3, Each vertical level from bottom to top Time 2, Variable 4, Each vertical level from bottom to top ……
(内循环-------------外循环)
2017年9月11日星期一
11
FORTRAN示例三:同时写入地表变量和气压层变量
PS
ta
va
zg
T1
……
一个 记录
PS
ta
va
zg
T2
……
PS
ta
va
zg
T3
……
2017年9月11日星期一
12
FORTRAN示例三: 同时写入地表变量和
气压层变量
2017年9月11日星期一
数据文件中的数据结构
一个记录
数
数据文件
时间1
每个 时间块
变量1
每个 变量块
层次1 (底)
每个 每个
层次 纬圈
纬圈1 (南)
西
据
时间2 变量2 层次2 纬圈2
文
…… …… …… ……
件
时间n
变量n
层次n (顶)
纬圈n (北)
东
2017年9月11日星期一
3
二进制Binary数据文件存储结构
Var1
Var2
如何写出ctl文件?
300 Time 1, Level 1000, Variable ua
t = 2, 3…365
then levels 925, 850, 700, 600, 500, 400,
300, 250, 200, 150, 100, 70, 50, 30, 20, 10
TTTTTiiiiimmmmmt3t3t3hhh000eeeeeeee000nnn11111,,, ,,,,,222lllLLLLLeee555vvveeeee000eeevvvvv,,, llleeeee222ssslllll000000999111,,,222??000111555000,,555,,,000VV000888,,,,,,aa555VVV111rr000aaaii000aa,,,rrr000iiibb777aaa,,000llbbbee77000lll00eee,,, ,,666TP55000Svwz00000ga,,a,,, 3355500000,,00022,,,00444,,000TTTTTTT11000iiiiiiimmmmmmm00… … … …,,, eeeeeee… … … …2323445… … … …,,,,,,, LLLLLLL… … … …eeeeeeevvvvvvv…………eeeeeeelllllll……………………??????? …………,,,,,,, VVVVVVVaaaaaaarrrrrrriiiiiiiaaaaaaabbbbbbbllllllleeeeeee