地震软件fk编译、运行报错解决办法

目录
  1. 安装
  2. 编译
    1. 1、打开makefile
    2. 2、配置CC和FC
    3. 3、配置CFLAGS和FFLAGS(重点)
  • fk.pl文件报错(重点)
    1. perl
    2. 报错
  • 总结
    1. 下期预告
  • 哈喽,大家好呀。第二篇博客出炉了,这次我们讲一讲和地震专业的事情吧。最近大作业使用的F-K软件,有很多朋友反映有很多错误,包括编译和编译后的一些运行问题,虽然说网上有一些解答,如Seisman的博客。但是博主去看了一下他的文章,主要是说的sachd程序编译不通过,需要添加数学库-lm,而博主和朋友们都没有这个问题,反而是其他的问题一堆。。。只好自己动手啦,那么本期就系统的讲解一下这些问题吧。


    安装

    F-K软件是Prof. Lupei Zhu开发的一个用于计算 水平分层模型 下的理论格林函数并合成理论地震图的代码包。代码是开源的,可以直接编译使用。在这里给出下载链接。

    fk3.2.tar

    下载后直接解压

    1
    tar -xvf fk3.2.tar

    编译

    这里会出现几种情况,报一些错误,博主一一说明。

    1、打开makefile

    首先如果你安装了SAC,而且路径设置正确(一般都是正确的,即SACHOME填写正确)那么请将

    1
    2
    #CFLAGS=$(optimize) -DSAC_LIB 
    #SACLIB=-L$(SACHOME)/lib -lsac -lsacio

    两行前的 # 去掉,变成

    1
    2
    CFLAGS=$(optimize) -DSAC_LIB 
    SACLIB=-L$(SACHOME)/lib -lsac -lsacio

    2、配置CC和FC

    这两个就是程序中C语言和Fortran程序的编译手段了,根据你电脑安装的编译器而不同,如果你没有什么特殊需求,本过程可以略过,直接调到第三步。

    CC一般不用配置,大家电脑里一般都有gcc,FC的话如果你电脑里的编译器是gfortran那么你可以在开头加一行

    1
    FC=gfortran

    其他的编译器可以自行百度,基本语法就是添加两句(xxxx为你的编译器)

    1
    2
    3
    FC=xxxx

    CC=xxxx

    3、配置CFLAGS和FFLAGS(重点)

    很多同学反应报错出现

    1
    2
    /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
    /usr/bin/ld: 最后的链结失败: 输出不可表示的节

    之类的问题

    那么请你在CFLAGSFFLAGS后面添加语句

    1
    -fno-pie -no-pie -fPIC

    即完整代码如下

    1
    2
    3
    CFLAGS=$(optimize)  -DSAC_LIB  -fno-pie  -no-pie  -fPIC

    FFLAGS=$(optimize) -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
    2
    3
    sh: 1: trav: not found
    sh: 1: trav: not found
    couldn't run fk

    我们打开fk.pl的源码,找到这么几行:

    1
    2
    3
    4
    5
    > open(REFL,"| $fk") or die "couldn't run $fk\n";

    > open(TRAV,"| trav > junk.p")

    > open(TRAV,"| trav > junk.s")

    都是和open有关的语句,perl通过open打开管道调用可执行程序,这里可不是打开文件哟,博主之前也以为是打开文件,就把前面的 | 删除了,结果不报错,但是什么结果也没有。。。

    报错提示执行程序无法找到,但是路径中确实存在,那么为什么会出现这种情况呢?相信大家都有过这样的经历,在Linux目录下明明存在一个可执行的程序,输入它的名字后显示找不到该程序,结果是自己忘了加./了,那么博主测试了一下更改上述代码如下:

    1
    2
    3
    4
    5
    > open(REFL,"| ./$fk") or die "couldn't run $fk\n";

    > open(TRAV,"| ./trav > junk.p")

    > open(TRAV,"| ./trav > junk.s")

    带入例子

    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使用的博文,欢迎大家届时一起学习哈!谢谢关注!