- 积分
- 19293
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2012-3-2
- 最后登录
- 1970-1-1
|
发表于 2012-4-19 19:28:47
|
显示全部楼层
顺序存储和直接存储的数据分开讲,
1.
FORTRAN程序写直接存储无格式数据的代码是:
OPEN(21,file=filename, form='unformatted', access='direct', action='read', recl=....)
对应的NCL读取函数为fbindirread
现在假定有组28层1度*1度的数据T,大小为(360*181*28)
FORTRAN写的时候可以这样
OPEN(21,file="file1.dat", form='unformatted', access='direct', recl=360*181*28*4)
WRITE(21,rec=1) T
一次把数据都写入文件
也可以
OPEN(21,file="file2.dat", form='unformatted', access='direct', recl=360*181*4)
DO i = 1, 28
WRITE(21,rec=i) T(:,:,i)
ENDDO
写个循环,一次写一层数据
这两种方法出来的文件结果会是完全一样的(顺序存储就不是了)!
相应的,无论你用什么方式写这个数据,NCL读取时也可以有多种读取方法:
T = fbindirread(filename, -1, (/28,181,360/), "float")
中间的-1表示一次将整个文件读入
也可以写个循环,一次只读取一层
2.
FORTRAN顺序存储的无格式数据的代码是:
OPEN(21,file=filename, form='unformatted', access='sequential')
还是那个数据T
OPEN(21,file="file3.dat", form='unformatted', access='sequential')
WRITE(21) T
一次写完所有数据
OPEN(21,file="file4.dat", form='unformatted', access='sequential')
DO i = 1, 28
WRITE(21) T(:,:,i)
ENDDO
一次写入一层数据
这两种写法得到的文件是不同的,文件大小就是不一样的!
因为在写顺序存储的二进制文件时,编译器会在每个数据记录添加额外的记录,无格式顺序文件中的第一个和最后一个字节是保留字节,第一个字节的值为75,最后一个字节的值为130。Fortran使用这些字节作为错误检测和文件结束的判断。
(详细参考FORTRAN教材)
对应的读取数据的NCL函数为fbinrecread,由于记录块大小有特殊要求,编译FORTRAN代码时要加参数:
gfortran foo.f90 -frecord-marker=4 -o foo.exe
运行foo.exe生成的数据就是NCL可以读取的。
一次写入28层的顺序二进制文件的读取:
T = fbinrecread("file3.dat", 0, (/28,181,360/), "float")
一次写入1层的顺序二进制文件的读取:
T = new((/28, 181, 360/), "float")
do i = 0, 27
T(i,:,:) = fbinrecread("file4.dat", i, (/181,360/), "float")
end do
不熟悉的话,这个函数很容易用错。而且一般情况下FORTRAN程序的编译都不会用 -frecord-marker=4(以后NCL可能会添加额外的功能,就不用设置这个编译参数了)。
所以,FORTRAN程序最好用直接存储的二进制格式来写。或者用netCDF格式,NCL操作netCDF格式的数据是很方便的。
===============
这样说明够详细了吧。 |
评分
-
查看全部评分
|