# taup setsac

- 本节贡献者: {{ 田冬冬 }}（作者）、{{ 姚家园 }}（审稿）
- 最近更新日期: 2021-05-31

---

{doc}`taup_time` 命令可以计算各震相的理论走时，
`taup setsac` 命令则用于计算理论走时并将走时信息写入到 SAC 文件头段变量中。

## 基本用法

使用 `taup setsac --help` 可查询该命令的完整用法和选项，
其用法相对简单，示例如下:

```
$ taup setsac -mod prem -evdpkm -ph P-0,S-1,PcP-8,ScS-9 *.SAC
```

- `-mod`：指定使用 PREM 模型，默认使用 iasp91 模型。
- `-evdpkm`：由于历史原因，该命令默认 SAC 文件中的震源深度单位为米，
  而现在的 SAC 文件中的震源深度单位为千米。该选项设置深度的单位为 km。
- `-ph P-0,S-1,PcP-8,ScS-9`：将 P 波到时标记到 SAC 头段变量 `T0` 中，
  S 波到时标记到 `T1` 中，PcP 到时标记到 `T8`，ScS 到时标记到 `T9`。

## 说明

- SAC 中共有十个可用于存储时间的头段变量，即 `T0` 至 `T9` 。
- 该命令在将震相走时标记到头段变量 `Tn` （n 取 0–9）的同时，还会修改对应的
  头段变量 `KTn` 和 `USERn`，其中 `KTn` 中保存震相名，
  `USERn` 中保存震相的射线参数（单位为 s/radian）。
- 该命令计算的是震相的理论走时，还须知道发震时刻才能确定震相的理论到时，
  即震相的到时等于发震时刻加上震相的走时。 因而要求 SAC 头段变量 `O` （发震时刻）
  必须已赋值。
- 该命令从 SAC 头段中读取地震深度和震中距信息，以计算震相理论到时。
  因而要求 SAC 头段变量 `EVDP` （震源深度）必须已赋值。
  若头段变量 `GCARC` （震中距，单位为 °）或 `DIST` （震中距，单位为 km）未赋值，
  而震源和台站位置的头段变量（`EVLA`、`EVLO`、`STLA`、`STLO`）已赋值，
  该命令可以自动计算震中距，但此时计算的震中距未考虑椭球校正，因而有一定的误差。
  建议将 SAC 头段变量 `LCALDA` 设置为 `TURE`，则当事件和台站的坐标被写入
  或被修改时，头段变量 `GCARC`、`DIST` 会自动计算，而 SAC 计算震中距时
  考虑了地球的扁率（赤道半径 6378.160 km，扁率为 0.00335293）。
- 在某些震中距，单个震相会有多个到时。比如在震中距 20° 附近，S 波会出现三分支现象
  （Triplication），TauP 会得到七个 S 波到时，但只有最早的到时会被写入到 SAC 头段中。

:::{warning}
若在执行该命令前，SAC 头段变量 `Tn` 中已有值，该命令会覆盖其原始值！
:::

:::{warning}
若执行命令时忘记了指定 `-evdpkm` 选项，此时若震源深度小于 1 km （1000 m），
该命令会给出警告。

需要注意，一定不要按 {kbd}`Ctrl+C` 终止执行命令。因为 `taup setsac`
需要将 SAC 文件读入内存，进行修改，再将内存中的数据写回磁盘覆盖原文件。
使用 {kbd}`Ctrl+C` 终止命令会导致文件写回磁盘失败，进而导致部分 SAC 文件损坏。

正确的做法是不理会这些警告，待程序执行完毕之后再加上 `-evdpkm` 选项重新执行。
:::
