乐于分享
好东西不私藏

在 Ubuntu 系统安装与使用gCAP3D经验教程

在 Ubuntu 系统安装与使用gCAP3D经验教程

    最近在新购置的工作站中安装了 Lupei Zhu 老师的 gCAP3D。这个程序是 CAP/gCAP 系列方法的重要实现之一,可用于地震矩张量与震源机制反演。与传统 CAP 相比,gCAP3D 的一个重要特点是可以使用三维速度模型下计算得到的 Green’s functions,从而在复杂速度结构区域获得更合理的波形拟合与震源机制约束。

    需要特别说明的是:gCAP3D 本身主要是矩张量反演程序,并不是三维波场模拟程序。如果只是安装fk + gCAP3D,那么通常先跑通的是一维水平层状介质 Green’s functions 下的 CAP/gCAP 反演流程。fk 程序用于基于 horizontally layered velocity model 计算合成 Green’s functions,也就是速度结构只随深度变化,而不是横向变化的三维模型。 若要真正开展三维速度模型下的 gCAP3D 反演,还需要额外使用三维波场模拟程序生成符合 gCAP3D 输入格式的三维 Green’s function 库。

1. 安装环境

我的安装环境为:

Ubuntu 22.04 / 24.04 gcc / gfortran SAC installed in /usr/local/sac gCAP3D source code in /data/gCAP3D

    建议优先在 Linux 原生系统或 WSL2 Ubuntu 中安装,不建议在 Windows 原生命令行中直接编译这类老式 C/Fortran/Perl 地震学程序。

首先安装基础依赖:
sudo apt update sudo apt install -y \ build-essential gcc g++ gfortran make \ perl csh tcsh patch git wget curl tar gzip unzip \ dos2unix bc \ gmt gmt-dcw gmt-gshhg ghostscript psutils imagemagick \ libx11-dev libxpm-dev libxt-dev libsm-dev libice-dev \ libncurses5 libncurses5-dev zlib1g zlib1g-dev
检查编译器:
gcc --version gfortran --version make --version perl -v gmt --version gs --version
2. 安装 SAC

gCAP3D 的波形读写和后续处理通常依赖 SAC(安装教程可参考oh my cap)。假设 SAC 安装在:

/usr/local/sac

环境变量可写入~/.bashrc

cat >> ~/.bashrc <<'EOF' # SAC export SACHOME=/usr/local/sac export SACAUX=${SACHOME}/aux export PATH=${SACHOME}/bin:${PATH} export LD_LIBRARY_PATH=${SACHOME}/lib:${LD_LIBRARY_PATH} export SAC_DISPLAY_COPYRIGHT=1 export SAC_USE_DATABASE=0 EOF
source ~/.bashrc

测试:

which sac sac

如果进入:

SAC>

说明 SAC 可用。

3. 获取和解压 gCAP3D

gCAP3D 的作者为 Lupei Zhu,个人页面列出的版本信息为 v1.2,主要语言为 C、Fortran 和 Perl,同时也提醒 v1.2 发布后存在一些未更新版本号的小修订版本。

假设源码已经放在:

/data/gCAP3D

进入目录:

cd /data/gCAP3D 
ls

目录中通常应包含:

gCAP3D 中常用的核心命令包括cap3Dcap3D.pldepth.plmtdcmp 和radpttn。其中cap3D 是核心反演程序,cap3D.pl 是常用的 Perl 封装脚本,mtdcmp 用于矩张量分解,radpttn 用于辐射花样计算。

4. 修改 Makefile

我最终使用的 Makefile 如下。这里的关键是:

  1. SACHOME指向 SAC 安装路径;
  2. CFLAGS中加入-fcommon,用于兼容老式 C 代码;
  3. FFLAGS中加入-fallow-argument-mismatch -std=legacy,用于兼容老式 Fortran 代码。
注意:Makefile 中命令行前面的缩进必须是 Tab,而不是空格。

5. 解决新版 GCC 下的multiple definition of ng 报错

在新版 Ubuntu / GCC 环境下,直接编译 gCAP3D 可能出现如下错误:

/usr/bin/ld: cap_sub.o:(.bss+0x0): multiple definition of `ng'; cap3D.o:(.bss+0x0): first defined here collect2: error: ld returned 1 exit status make: *** [Makefile:15:cap3D] 错误 1

这个问题不是 SAC 链接错误,而是老源码中全局变量定义方式与新版 GCC 默认规则不兼容。通常源码中cap3D.h 里有类似定义:

int ng[NRC]; // number of fundamental sources for each component.

由于cap3D.h 同时被cap3D.c 和cap_sub.c 包含,导致cap3D.o 和cap_sub.o 中各自定义了一份ng,最终链接时报multiple definition

有两个解决办法。

第一种是快速兼容法:在 Makefile 的CFLAGS 中加入:

CFLAGS = -O -fcommon

第二种是更规范的源码修正法。先备份:

cd /data/gCAP/gCAP3D cp Makefile Makefile.bak cp cap3D.h cap3D.h.bak cp cap3D.c cap3D.c.bak

然后修改cap3D.h

extern int ng[NRC];

也就是把原来的:

int ng[NRC];

改成:

extern int ng[NRC];

接着在cap3D.c 中#include "cap3D.h" 后面加入真正的定义:

int ng[NRC];

修改后大致为:

#include "cap3D.h" int ng[NRC]; int main(int argc, char **argv) { ... }

然后重新编译:

make clean make

6. 修cap3D.c

编译时可能还会看到:

warning: too many arguments for format else sprintf(tmp,"%s/%s/%s.grn.0",glib,dep,dst,".grn.0");

这说明格式字符串里只有 3 个%s,但实际传入了 4 个字符串参数。建议把:

sprintf(tmp,"%s/%s/%s.grn.0",glib,dep,dst,".grn.0");

改成:

sprintf(tmp,"%s/%s/%s.grn.0",glib,dep,dst);

更稳妥的写法是:

snprintf(tmp, sizeof(tmp), "%s/%s/%s.grn.0", glib, dep, dst);

此外,如果工作路径较长,也建议把cap3D.c 中用于保存路径的字符数组适当加大,例如将:

char tmp[128], glib[128], dep[32], loc[32], dst[16], eve[32], *c_pt;

改为:

char tmp[512], glib[512], dep[64], loc[64], dst[64], eve[64], *c_pt;

这一步不是必须,但可以减少长路径导致的潜在溢出风险。

7. 编译

进入 gCAP3D 目录:

cd /data/gCAP/gCAP3D make clean make

成功后应生成:

ls -lh cap3D cap_dir mtdcmp radpttn

如果看到类似:

cap3D cap_dir mtdcmp radpttn

说明核心程序已经编译成功。

可以进一步测试:

./cap3D ./cap_dir ./mtdcmp ./radpttn

需要注意的是,cap3D 这类二进制程序通常需要输入参数或由cap3D.pl 调用,不建议直接把“无参数运行时报错”理解为安装失败。SeisMan 的 gCAP 安装说明中也提醒,直接运行底层二进制程序可能出现段错误,实际使用时通常应调用 Perl 封装脚本。

8. 配置环境变量

将 gCAP3D 加入 PATH:

cat >> ~/.bashrc <<'EOF' 
# gCAP3D 
export GCAP3D_HOME=/data/gCAP/gCAP3D 
export PATH=${GCAP3D_HOME}:${PATH} 
EOF 
source ~/.bashrc

检查:

which cap3D 
which cap_dir 
which mtdcmp 
which radpttn

如果cap3D.pl 也在该目录下,则:

which cap3D.pl

9. 修改cap3D.pl

cap3D.pl 是实际运行中最常用的脚本。需要检查其中两个路径:

require ".../cap_plt.pl"; 
$green = ".../data/models/Glib";

例如我的目录可以写成:

require "/data/gCAP3D/cap_plt.pl"; 
$green = "/data/gCAP/models/Glib";

然后赋予执行权限:

chmod +x /data/gCAP/gCAP3D/*.pl

测试:

cap3D.pl

如果输出 usage 或参数说明,说明脚本入口基本正常。CUSeisTut 的 gCAP3D 教程也将cap3D.pl 作为运行入口,并说明运行该脚本出现版本或说明信息即可视为安装成功。

10. 安装和使用 fk 生成一维 Green’s functions

如果只是先跑通流程,可使用fk 计算一维水平层状模型 Green’s functions。再次强调,fk 不是三维 Green’s function 计算器,而是基于 horizontally layered velocity model 的合成 Green’s function 程序。

假设fk 已安装在:

/data/gCAP/fk

加入 PATH:

cat >> ~/.bashrc 
<<'EOF' 
# fk 
export FK_HOME=/data/gCAP/fk 
export PATH=${FK_HOME}:${PATH}
 EOF 
source ~/.bashrc

测试:

which fk.pl fk.pl

之后要保证cap3D.pl 中的$green 指向 Green’s function 库的上级目录,例如:

$green = "/data/gCAP/models/Glib";

11. 常见问题总结

问题 1:cannot find -lsac 或cannot find -lsacio

说明 SAC 库路径不对。检查:

find /usr/local/sac -name "libsac*" -o -name "libsacio*"

如果库在/usr/local/sac/lib,Makefile 中应写:

SACHOME = /usr/local/sac SACLIB = -L$(SACHOME)/lib -lsac -lsacio -lm

问题 2:multiple definition of ng

这是新版 GCC 与老式全局变量定义方式不兼容。解决方法是在CFLAGS 中加入:

CFLAGS = -O -fcommon

更推荐的方法是把cap3D.h 中的int ng[NRC]; 改为:

extern int ng[NRC];

并在cap3D.c 中加入:

int ng[NRC];

问题 3:bad interpreter: /usr/bin/perl^M

说明脚本是 Windows 换行符。执行:

dos2unix *.pl chmod +x *.pl

问题 4:图件显示异常或缩在角落

检查cap_plt.pl 中 GMT 单位设置。GMT 5/6 可尝试:

system "gmt set PROJ_LENGTH_UNIT inch"; system "gmt set PS_PAGE_ORIENTATION portrait";

GMT 4 可尝试:

system "gmtset MEASURE_UNIT inch"; system "gmtset PAGE_ORIENTATION portrait";

问题 5:找不到 Green’s functions

检查cap3D.pl 中:

$green = "...";

是否指向 Green’s function 库的正确上级目录,同时检查-Mhk_15/5.0 中的模型名和深度是否与实际 GF 文件目录对应。