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