地震软件fk编译、运行报错解决办法
哈喽,大家好呀。第二篇博客出炉了,这次我们讲一讲和地震专业的事情吧。最近大作业使用的F-K软件,有很多朋友反映有很多错误,包括编译和编译后的一些运行问题,虽然说网上有一些解答,如Seisman的博客。但是博主去看了一下他的文章,主要是说的sachd程序编译不通过,需要添加数学库-lm,而博主和朋友们都没有这个问题,反而是其他的问题一堆。。。只好自己动手啦,那么本期就系统的讲解一下这些问题吧。
安装
F-K软件是Prof. Lupei Zhu开发的一个用于计算 水平分层模型 下的理论格林函数并合成理论地震图的代码包。代码是开源的,可以直接编译使用。在这里给出下载链接。
下载后直接解压
1 | tar -xvf fk3.2.tar |
编译
这里会出现几种情况,报一些错误,博主一一说明。
1、打开makefile
首先如果你安装了SAC,而且路径设置正确(一般都是正确的,即SACHOME填写正确)那么请将
1 | #CFLAGS=$(optimize) -DSAC_LIB |
两行前的 # 去掉,变成
1 | CFLAGS=$(optimize) -DSAC_LIB |
2、配置CC和FC
这两个就是程序中C语言和Fortran程序的编译手段了,根据你电脑安装的编译器而不同,如果你没有什么特殊需求,本过程可以略过,直接调到第三步。
CC一般不用配置,大家电脑里一般都有gcc,FC的话如果你电脑里的编译器是gfortran那么你可以在开头加一行
1 | FC=gfortran |
其他的编译器可以自行百度,基本语法就是添加两句(xxxx为你的编译器)
1 | FC=xxxx |
3、配置CFLAGS和FFLAGS(重点)
很多同学反应报错出现
1 | /usr/bin/ld: /usr/local/sac/lib/libsacio.a(math.o): relocation R_X86_64_32 against `.text' can not be used when making a PIE object; recompile with -fPIC |
之类的问题
那么请你在CFLAGS和FFLAGS后面添加语句
1 | -fno-pie -no-pie -fPIC |
即完整代码如下
1 | CFLAGS=$(optimize) -DSAC_LIB -fno-pie -no-pie -fPIC |
那么到现在你可能还会出现错误,例如:
aseries.h:22:72:
REAL vps(2,max_num_lay),den(max_num_lay),thk(max_num_lay),q(2,max_num_lay) 1
Error: Expected another dimension in array declaration at (1)
trav.f:28:21:read(*,*) thk(i),vps(1,i)
这是由于Fortran语言的问题,我们知道Fortran早期版本中一行的字数和每列代表的含义是有规定的,朱教授或许是疏忽了,在aseries.h文件中
1 | REAL vps(2,max_num_lay),den(max_num_lay),thk(max_num_lay),q(2,max_num_lay) |
这一行字数超限了,解决方法两个。
1、更改这一行,变成两行。
2、在FC=gfortran后面添加代码,最终如下
1 | FC=gfortran -ffixed-line-length-none |
编译成功!,是不是很开心呢,这个时候或许会弹出一个warning,不过不用管它。我们进入下一环节。
fk.pl文件报错(重点)
perl
首先要确定你的电脑里有没有perl,终端输入:
1 | perl -v |
看是否显示perl版本,如果提示没有perl,则安装一个,安装方法这里不多提了,百度一堆。
报错
这个错误是很多同学都遇到了,难以解决的错,虽然说fk.pl是把几个程序结合起来的perl程序,坏掉了去把其他的程序一个个运行也可以,不过输入很冗长,尤其是fk。故在此还是费点心思找找错误吧。
一般报错如下:
1 | sh: 1: trav: not found |
我们打开fk.pl的源码,找到这么几行:
1 | > open(REFL,"| $fk") or die "couldn't run $fk\n"; |
都是和open有关的语句,perl通过open打开管道调用可执行程序,这里可不是打开文件哟,博主之前也以为是打开文件,就把前面的 | 删除了,结果不报错,但是什么结果也没有。。。
报错提示执行程序无法找到,但是路径中确实存在,那么为什么会出现这种情况呢?相信大家都有过这样的经历,在Linux目录下明明存在一个可执行的程序,输入它的名字后显示找不到该程序,结果是自己忘了加./了,那么博主测试了一下更改上述代码如下:
1 | > open(REFL,"| ./$fk") or die "couldn't run $fk\n"; |
带入例子
1 | ./fk.pl -Mhk/20/k -N8/0.1 05 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 |
终端出现一系列计算,而且有了hk_20这个文件夹,结果显示可以运行fk.pl了!是不是解决了你的问题了呢!
总结
那么好了,本期的fk软件编译和运行问题就到这里了,如果有幸帮到了你,那么博主十分高兴,如果你出现了其他的问题,欢迎在评论区留言或者私信博主一起讨论哟!
另外不知道如何更改文件的,可以私信博主或是找其他人直接拷贝相关文件替换就行哦。
下期预告
下期或许会出一期关于fk使用的博文,欢迎大家届时一起学习哈!谢谢关注!
Comments