fmm.h
- Author
Zhu Dengda (zhudengda@mail.iggcas.ac.cn)
- Date
2023-03
Functions
-
void FastMarching(const double *rs, MYINT nr, const double *ts, MYINT nt, const double *ps, MYINT np, double rr, double tt, double pp, MYINT maxodr, const MYREAL *Slw, MYREAL *TT, bool sphcoord, MYINT rfgfac, MYINT rfgn, bool printbar)
使用Fast Marching Method计算全局走时场
- 参数:
rs – (in)维度1坐标数组
nr – (in)rs长度
ts – (in)维度2坐标数组
nt – (in)ts长度
ps – (in)维度2坐标数组
np – (in)ps长度
rr – (in)源点维度1坐标
tt – (in)源点维度2坐标
pp – (in)源点维度3坐标
maxodr – (in)使用的最大差分阶数
Slw – (in)展平的三维慢度场
TT – (inout)展平的三维走时场,如果初始值有非零值,会被直接加入堆中,此时源点不再使用
sphcoord – (in)是否使用球坐标
rfgfac – (in)对于源点附近的格点间加密倍数,>1
rfgn – (in)对于源点附近的格点间加密处理的辐射半径,>=1
printbar – (in)是否打印进度条
-
HEAP_DATA *FastMarching_with_initial(const double *rs, MYINT nr, const double *ts, MYINT nt, const double *ps, MYINT np, MYINT maxodr, const MYREAL *Slw, MYREAL *TT, char *FMM_stat, bool sphcoord, bool *edgeStop, bool printbar, HEAP_DATA *FMM_data, MYINT *psize, MYINT *pcap, MYINT *NroIdx, MYINT *pNdots)
在有初始走时的情况下使用Fast Marching Method计算全局走时场
- 参数:
rs – (in)维度1坐标数组
nr – (in)rs长度
ts – (in)维度2坐标数组
nt – (in)ts长度
ps – (in)维度2坐标数组
np – (in)ps长度
maxodr – (in)使用的最大差分阶数
Slw – (in)展平的三维慢度场
TT – (inout)展平的三维走时场
FMM_stat – (out)记录每个节点的状态(alive, close, far)
sphcoord – (in)是否使用球坐标
edgeStop – (in)是否在波前传播到6个边界面时提前结束计算
printbar – (in)是否打印进度条
FMM_data – (inout)堆首指针
psize – (inout)堆大小,会被调整大小
pcap – (inout)堆最大容量,视情况会被调整大小
NroIdx – (out)一维指针,用于在节点索引位置处填上堆中的索引值
pNdots – (inout)记录还剩下多少节点的走时未计算
-
HEAP_DATA *init_source_TT(const double *rs, MYINT nr, const double *ts, MYINT nt, const double *ps, MYINT np, double rr, double tt, double pp, const MYREAL *Slw, MYREAL *TT, char *FMM_stat, bool sphcoord, HEAP_DATA *FMM_data, MYINT *psize, MYINT *pcap, MYINT *NroIdx, MYINT *pNdots)
计算源点附近的走时
- 参数:
rs – (in)维度1坐标数组
nr – (in)rs长度
ts – (in)维度2坐标数组
nt – (in)ts长度
ps – (in)维度2坐标数组
np – (in)ps长度
rr – (in)源点维度1坐标
tt – (in)源点维度2坐标
pp – (in)源点维度3坐标
Slw – (in)展平的三维慢度场
TT – (inout)展平的三维走时场
FMM_stat – (out)记录每个节点的状态(alive, close, far)
sphcoord – (in)是否使用球坐标
FMM_data – (inout)堆首指针
psize – (inout)堆大小,会被调整大小
pcap – (inout)堆最大容量,视情况会被调整大小
NroIdx – (out)一维指针,用于在节点索引位置处填上堆中的索引值
pNdots – (inout)记录还剩下多少节点的走时未计算
- 返回:
堆首指针
-
HEAP_DATA *init_source_TT_refinegrid(const double *rs, MYINT nr, const double *ts, MYINT nt, const double *ps, MYINT np, double rr, double tt, double pp, MYINT maxodr, const MYREAL *Slw, MYREAL *TT, char *FMM_stat, bool sphcoord, MYINT rfgfac, MYINT rfgn, bool printbar, HEAP_DATA *FMM_data, MYINT *psize, MYINT *pcap, MYINT *NroIdx, MYINT *pNdots)
以加密网格的方式计算源点附近的走时
- 参数:
rs – (in)维度1坐标数组
nr – (in)rs长度
ts – (in)维度2坐标数组
nt – (in)ts长度
ps – (in)维度2坐标数组
np – (in)ps长度
rr – (in)源点维度1坐标
tt – (in)源点维度2坐标
pp – (in)源点维度3坐标
maxodr – (in)使用的最大差分阶数
Slw – (in)展平的三维慢度场
TT – (inout)展平的三维走时场
FMM_stat – (out)记录每个节点的状态(alive, close, far)
sphcoord – (in)是否使用球坐标
rfgfac – (in)对于源点附近的格点间加密倍数,>1
rfgn – (in)对于源点附近的格点间加密处理的辐射半径,>=1
printbar – (in)是否打印进度条
FMM_data – (inout)堆首指针
psize – (inout)堆大小,会被调整大小
pcap – (inout)堆最大容量,视情况会被调整大小
NroIdx – (out)一维指针,用于在节点索引位置处填上堆中的索引值
pNdots – (inout)记录还剩下多少节点的走时未计算
- 返回:
堆首指针
-
MYREAL get_neighbour_travt(MYINT nr, MYINT nt, MYINT np, MYINT ntp, MYINT ir, MYINT it, MYINT ip, MYINT idx, MYINT maxodr, MYREAL *TT, char *FMM_stat, double s, double dr, double dt, double dp, char *stat)
依据邻近的节点走时,以解一元二次方程的形式求解某点的走时
- 参数:
nr – (in)维度1长度
nt – (in)维度2长度
np – (in)维度3长度
ntp – (in)nt*np
ir – (in)某点的维度1索引
it – (in)某点的维度2索引
ip – (in)某点的维度3索引
idx – (in)某点的三维展开索引
maxodr – (in)使用的最大差分阶数
TT – (inout)展平的三维走时场
FMM_stat – (out)记录每个节点的状态(alive, close, far)
s – (in)某点的慢度
dr – (in)维度1坐标间隔
dt – (in)维度2坐标间隔
dp – (in)维度3坐标间隔
stat – (out)求解情况,-1表示求解出现问题,0为正常求解
- 返回:
走时结果
-
MYREAL FMM_raytracing(const double *rs, MYINT nr, const double *ts, MYINT nt, const double *ps, MYINT np, double r0, double t0, double p0, double rr, double tt, double pp, double seglen, double segfac, const MYREAL *Slw, const MYREAL *TT, bool sphcoord, double *rays, MYINT *N)
根据梯度下降,从走时场中提取初至射线
- 参数:
rs – (in)维度1坐标数组
nr – (in)rs长度
ts – (in)维度2坐标数组
nt – (in)ts长度
ps – (in)维度2坐标数组
np – (in)ps长度
r0 – (in)源点维度1坐标
t0 – (in)源点维度2坐标
p0 – (in)源点维度3坐标
rr – (in)接收点维度1坐标
tt – (in)接收点维度2坐标
pp – (in)接收点维度3坐标
seglen – (in)射线段长度
segfac – (in)t < segfac*seglen/v,当射线追踪到在源点附近时,射线直接连接源点
Slw – (in)展平的三维慢度场,若非NULL则使用累加求和计算走时,否则直接从走时场中插值得到走时
TT – (in)展平的三维走时场
sphcoord – (in)是否使用球坐标
rays – (out)输出展平的三维射线
N – (out)输出射线点数
- 返回:
射线走时