雜湊表hash table,類似於python中的字典,可以實現基於字串的索引。即根據輸入的資料(整數,浮點數,字串等),對應到唯一的資料。這個特性對於氣象程式設計中的根據站點資訊檢索資料十分有用。由於Fortran標準庫中沒有功能的實現,需要自己編寫函式。github已經有大神編寫好了函式庫,而且支援不同型別的資料,十分方便。
使用的函式庫為https://github.com/LKedward/fhash,編譯器為intel fortran, linux平臺。大致步驟就是一個Fortran使用第三方函式庫的過程。
Windows下的Visual Studio編譯更簡單,直接將原始碼資料夾(包括子資料夾fhash_key)下的所有程式碼檔案拖到“解決方案管理器”裡,編譯執行即可。
具體演示
1. 下載軟體包
wget https://github.com/LKedward/fhash/archive/refs/tags/v0.2.0.tar.gz
2. 解壓
tar -xzvf v0.2.0.tar.gz
3. 安裝
cd fhash-0.2.0/ mkdir build cd build cmake .. -DCMAKE_INSTALL_PREFIX=/home/lzjiang/pkgs/usr/ -DCMAKE_Fortran_COMPILER=ifort
make test make install
其中-DCMAKE_INSTALL_PREFIX為指定的庫安裝路徑,-DCMAKE_Fortran_COMPILER指定了Fortran編譯器
編寫一個指令碼測試一下
program fortran_hash_test !written by Lizhi Jiang, 21 June, 2024 use fhash, only: key=>fhash_key, fhash_tbl_t implicit none type(fhash_tbl_t) :: tbl integer :: istat character(len=8) :: key1='my_key_1' character(len=8) :: key2='my_key_2' integer :: key3=123456 integer :: key4(5)=[1,2,3,4,5] integer :: val1=10 real :: val2=1.0 character(:), allocatable :: val3 logical :: val4=.false. val3='a string value' call tbl%set(key(key1), value=val1) call tbl%set(key(key2), value=val2) call tbl%set(key(key3), value=val3) call tbl%set(key(key4), value=val4) call tbl%get(key('my_key_1'),val1,stat=istat) if(istat /=0) then print*,"Key not found",istat else print*,"my_key_1",val1 end if call tbl%get(key('my_key_2'),val2,stat=istat) if(istat /=0) then print*,"Key not found",istat else print*,"my_key_2",val2 end if call tbl%get(key('my_key_3'),val3,stat=istat) if(istat /=0) then print*,"Key not found",istat else print*,"my_key_3",val3 end if call tbl%get(key(123456),val3,stat=istat) if(istat /=0) then print*,"Key not found",istat else print*,"my_key_3",val3 end if call tbl%get(key([1,2,3,4,5]),val4,stat=istat) if(istat /=0) then print*,"Key not found",istat else print*,"my_key_3",val4 end if end program fortran_hash_test
4. 指令碼編譯,執行,測試
lzjiang@nimbus ~ $ export LD_LIBRARY_PATH=/home/lzjiang/pkgs/usr/lib:$LD_LIBRARY_PATH lzjiang@nimbus ~ $ ifort -I/home/lzjiang/pkgs/usr/include/fortran_modules/Intel/2021.10.0.20230609/ -L/home/lzjiang/pkgs/usr/lib -lfhash fhash_test.f90 lzjiang@nimbus ~ $ ./a.out my_key_1 10 my_key_2 1.000000 Key not found -1 my_key_3a string value my_key_3 F
幾個注意的點:
1 用cmake安裝後,標頭檔案的路徑並不在include目錄,而是在其子目錄下
2 執行的時候需要新增到執行庫搜尋路徑 LD_LIBRARY_PATH
更多請參考 https://lkedward.github.io/fhash/page/index.html