zoukankan      html  css  js  c++  java
  • grads,fortran,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 形式存储的,需要注意。

    __________________________________________________

    2020年6月18日更新

    ncl 二进制读写函数

    ncl读写二进制文件有如下函数:fbinrecreadfbinreadfbindirread

    GrADS默认的二进制文件格式是纯数据。

    fbinrecwrite :是以reccord方式写数据,是顺序存取的。

    fbindirwrite:是直接将数据写到文件中。此种方式写的文件与GrADS默认二进制文件格式相同。但注意,GrADS一般默认是little_endian的字节序,需要指定选项。比如

     setfileoption("bin","WriteByteOrder","BigEndian")

     

  • 相关阅读:
    计算一路话音消耗的带宽
    谋哥:我跟CEO们都说了啥
    wchar与char字符转换的探究
    pl/sql配置连接远程数据库oracle,本地没有安装oracle数据库的情况下
    围住浮动元素的三种方法
    Chromium浏览器组件设计意图
    tonymillion/Reachability的使用
    赵雅智_名片夹(3)_下拉刷新载入很多其它
    动态创建菜单和动态关联菜单项事件
    delphi创建动态菜单
  • 原文地址:https://www.cnblogs.com/jiangleads/p/9022051.html
Copyright © 2011-2022 走看看