Fortran哈希函数库的使用

哈希表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
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

posted @ 2024-06-22 05:14  chinagod  阅读(18)  评论(0编辑  收藏  举报