diff --git a/pygrt/C_extension/src/dynamic/grt_kernel.c b/pygrt/C_extension/src/dynamic/grt_kernel.c index 3bf7320..87942a1 100644 --- a/pygrt/C_extension/src/dynamic/grt_kernel.c +++ b/pygrt/C_extension/src/dynamic/grt_kernel.c @@ -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; @@ -103,7 +109,7 @@ printf("\n" "----------------------------------------------------------------\n" " grt kernel -M -D/ -C[//]\n" " -F//[+w] -O [-P]\n" -" [-e] [-h]\n" +" [-Bf|F|r|R|h|H] [-e] [-h]\n" "\n" "\n\n" "Options:\n" @@ -142,6 +148,13 @@ printf("\n" " frequency wI=zeta*PI*.\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 Directorypath of output for saving.\n" "\n" " -P Number of threads. Default use all cores.\n" @@ -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) { @@ -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//[+w] case 'F': Ctrl->F.active = true; @@ -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; diff --git a/test/kernel/test_kernel.sh b/test/kernel/test_kernel.sh index 8f2cb6a..fbf091a 100644 --- a/test/kernel/test_kernel.sh +++ b/test/kernel/test_kernel.sh @@ -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 \ No newline at end of file