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")

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM