Fortran雜湊函式庫的使用

chinagod發表於2024-06-22

雜湊表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編譯器

編寫一個指令碼測試一下

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
fhash_test.f90

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

相關文章