立即注册 登录
气象家园 返回首页

lifestyle http://bbs.06climate.com/?12776 [收藏] [复制] [分享] [RSS]

日志

grads,fortran,ncl二进制文件››

已有 1439 次阅读2017-10-31 21:25 |个人分类:科研点滴| Fortran, GrADS, NCL, Fortran, GrADS, NCL, Fortran, GrADS, NCL, Fortran, GrADS, NCL

grad用fwrite生成的二进制文件大小和ncl用fbinwrite生成的不一样,相差有8个字节,参考了以下网页,问题出在顺序存取和直接存取的差异。 以下是我的理解,欢迎指正:
 
  1. Fortran里面,二进制文件的存储方式有sequential(顺序存取)和direct(直接存取)两种。其中,"顺序存取"不需要每次存取的数据(也称"记录“)的长度一致,而是在每笔记录两端加上了记录该记录所占长度的标识符。而"直接存取"要求每一笔记录的长度相同。

  2. Fortran文件的存放方式

    顺序文件存放方式:
    [length 1][记录1][length 1]   [length 2][记录2][length 2] …… [length n][记录n][length n]… 

    每一笔记录的两端都有一个占四个字节位的整数(length),记录了该笔记录所占的长度(单位字节)。

    直接文件
    存放方式:
    [记录1]  [记录2] …… [记录n] … 


    每一笔记录长度是固定(相同)的。打开文件时,需要指定RECL= ???字段,告诉编译器每一笔记录的长度。因为每笔记录的长度都一致(可以认为是有格式文件),还需要加上form="formatted"这一参数描述。

  3.  GrADS 用fwrite命令写的二进制文件的存放方式
    fwrite命令写的二进制文件(比如grd文件)的方式很特别。它是按顺序(从前到后写的方式)写数据。但是,与fortran顺序文件的存放方式不同,每个记录的两端没有长度指示符。所以需要有相应的数据描述文件(*.ctl)对数据的存放格式进行描述。

    需要注意的是,一些代码中form="binary”这个参数描述,不是标准的fortran语法,一些编译器(如gfortran)可能无法通过编译。

    关于二进制文件读取,有一种流文件读取的方法很好在open语句里面添加access='stream',读文件的时候根据form=???字段指定的文件格式(有格式/无格式),自动用该类文件的读取方式读取数据详见http://fcode.cn/guide-86-1.html 

  4. 用NCL读取二进制文件的数据
    在读数据之前需要知道文件的存取方式,是直接存取还是顺序存取的。根据相应的存取方式使用对应的函数读取数据。
    此外,二进制文件存放的字节序 还有大小端(Big_Endian和Little_Endian)的区别。一些数据(如wrfout)是用Big_Endian 形式存储的,需要注意。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 立即注册

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

返回顶部