Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 39 additions & 2 deletions pygrt/C_extension/src/dynamic/grt_kernel.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,12 @@ typedef struct {
char *s_depsrc;
char *s_deprcv;
} D;
/** 顶层和底层的边界条件 */
struct {
bool active;
GRT_BOUND_TYPE topbound;
GRT_BOUND_TYPE botbound;
} B;
/* 相速度搜索范围 */
struct {
bool active;
Expand Down Expand Up @@ -103,7 +109,7 @@ printf("\n"
"----------------------------------------------------------------\n"
" grt kernel -M<model> -D<depsrc>/<deprcv> -C[<cmin>/<cmax>/]<dc>\n"
" -F<f1>/<f2>/<df>[+w<zeta>] -O<outdir> [-P<nthreads>]\n"
" [-e] [-h]\n"
" [-Bf|F|r|R|h|H] [-e] [-h]\n"
"\n"
"\n\n"
"Options:\n"
Expand Down Expand Up @@ -142,6 +148,13 @@ printf("\n"
" frequency wI=zeta*PI*<df>.\n"
" Default zeta=%.1f.\n", GRT_GREENFN_F_ZETA); printf(
"\n"
" -Bf|F|r|R|h|H\n"
" Boundary condition of top layer (lowercase) and\n"
" bottom layer (uppercase).\n"
" f|F: Free boundary.\n"
" r|R: Rigid boundary.\n"
" h|H: Halfspace.\n"
"\n"
" -O<outdir> Directorypath of output for saving.\n"
"\n"
" -P<n> Number of threads. Default use all cores.\n"
Expand All @@ -161,10 +174,13 @@ printf("\n"
static void getopt_from_command(GRT_MODULE_CTRL *Ctrl, int argc, char **argv)
{
// 先为个别参数设置非0初始值
Ctrl->B.topbound = GRT_BOUND_FREE;
Ctrl->B.botbound = GRT_BOUND_HALFSPACE;

Ctrl->F.zeta = GRT_GREENFN_F_ZETA;

int opt;
while ((opt = getopt(argc, argv, ":M:D:F:C:O:P:eh")) != -1)
while ((opt = getopt(argc, argv, ":M:D:B:F:C:O:P:eh")) != -1)
{
switch(opt)
{
Expand Down Expand Up @@ -196,6 +212,24 @@ static void getopt_from_command(GRT_MODULE_CTRL *Ctrl, int argc, char **argv)
}
break;

// 顶层和底层的边界条件 -Bf|F|r|R|h|H
case 'B':
Ctrl->B.active = true;
if(strlen(optarg) == 0 || strlen(optarg) > 2) GRTBadOptionError(B, "");
for(size_t i = 0; i < strlen(optarg); ++i) {
switch(optarg[i]) {
case 'f': Ctrl->B.topbound = GRT_BOUND_FREE; break;
case 'r': Ctrl->B.topbound = GRT_BOUND_RIGID; break;
case 'h': Ctrl->B.topbound = GRT_BOUND_HALFSPACE; break;
case 'F': Ctrl->B.botbound = GRT_BOUND_FREE; break;
case 'R': Ctrl->B.botbound = GRT_BOUND_RIGID; break;
case 'H': Ctrl->B.botbound = GRT_BOUND_HALFSPACE; break;
default:
GRTBadOptionError(B, "unsupported -B%s.", optarg);
}
}
break;

// -F<f1>/<f2>/<df>[+w<zeta>]
case 'F':
Ctrl->F.active = true;
Expand Down Expand Up @@ -357,6 +391,9 @@ int kernel_main(int argc, char **argv)
exit(EXIT_FAILURE);
}
GRT_MODEL1D *mod1d = Ctrl->M.mod1d;

// 边界条件
grt_set_mod1d_boundary(mod1d, Ctrl->B.topbound, Ctrl->B.botbound);

// 最大最小速度
real_t vmin, vmax;
Expand Down
1 change: 1 addition & 0 deletions test/kernel/test_kernel.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ set -euo pipefail
grt kernel -h

grt kernel -M../thin1 -D0.03/0 -F0/25/1 -C0.01 -OKERNEL
grt kernel -M../thin1 -D0.03/0 -F0/25/1 -C0.01 -BrH -OKERNEL
grt kernel -M../seafloor -D5/0.1 -F0/1/1e-3 -C0.01 -OKERNEL

rm -rf KERNEL
Loading