最近在新购置的工作站中安装了 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. 安装环境
我的安装环境为:
建议优先在 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-devgcc --version gfortran --version make --version perl -v gmt --version gs --versiongCAP3D 的波形读写和后续处理通常依赖 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 EOFsource ~/.bashrc测试:
which sac sac如果进入:
SAC>说明 SAC 可用。
3. 获取和解压 gCAP3D
gCAP3D 的作者为 Lupei Zhu,个人页面列出的版本信息为 v1.2,主要语言为 C、Fortran 和 Perl,同时也提醒 v1.2 发布后存在一些未更新版本号的小修订版本。
假设源码已经放在:
/data/gCAP3D进入目录:
cd /data/gCAP3D ls目录中通常应包含:

cap3D、cap3D.pl、depth.pl、mtdcmp 和radpttn。其中cap3D 是核心反演程序,cap3D.pl 是常用的 Perl 封装脚本,mtdcmp 用于矩张量分解,radpttn 用于辐射花样计算。4. 修改 Makefile
我最终使用的 Makefile 如下。这里的关键是:
SACHOME指向 SAC 安装路径;CFLAGS中加入-fcommon,用于兼容老式 C 代码;FFLAGS中加入-fallow-argument-mismatch -std=legacy,用于兼容老式 Fortran 代码。

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 make6. 修正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.pl9. 修改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 文件目录对应。
夜雨聆风