diff --git a/docs/locales/en/LC_MESSAGES/Tutorial/dynamic/strain_stress.po b/docs/locales/en/LC_MESSAGES/Tutorial/dynamic/strain_stress.po index 1f0c5470..35f2d5b2 100644 --- a/docs/locales/en/LC_MESSAGES/Tutorial/dynamic/strain_stress.po +++ b/docs/locales/en/LC_MESSAGES/Tutorial/dynamic/strain_stress.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PyGRT 0.6.1.dev1+g4641a40.d20250422\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-08-05 13:28+0800\n" +"POT-Creation-Date: 2025-09-21 23:21+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language: en\n" @@ -48,10 +48,11 @@ msgstr "" "To compute these tensors, the spatial derivatives of displacement " ":math:`\\partial z,\\partial r,\\partial \\theta` [#partial]_ need to be " "calculated. Starting from the calculation of Green's functions " -"(:doc:`/Tutorial/dynamic/gfunc`) and the formula for displacement synthesis " -"(:doc:`/Tutorial/dynamic/syn`), the spatial derivatives of displacement are computed in" -" two steps, and then strain, rotation, and stress tensors are synthesized" -" based on the geometric and constitutive equations." +"(:doc:`/Tutorial/dynamic/gfunc`) and the formula for displacement " +"synthesis (:doc:`/Tutorial/dynamic/syn`), the spatial derivatives of " +"displacement are computed in two steps, and then strain, rotation, and " +"stress tensors are synthesized based on the geometric and constitutive " +"equations." #: ../../source/Tutorial/dynamic/strain_stress.rst:12 msgid "" @@ -261,12 +262,10 @@ msgid "" msgstr "" #: ../../source/Tutorial/dynamic/strain_stress.rst:141 -msgid "" -"在 :rst:dir:`syn_dc_zne/` 原路径下,生成 " -":file:`*.strain.??.sac`,文件名中包括分量名,如ZZ、ZN等。" +msgid "在 :rst:dir:`syn_dc_zne/` 原路径下,生成 :file:`strain_??.sac`,文件名中包括分量名,如ZZ、ZN等。" msgstr "" "In the original path :rst:dir:`syn_dc_zne/`, files named " -":file:`*.strain.??.sac` are generated, with component names such as ZZ, " +":file:`strain_??.sac` are generated, with component names such as ZZ, " "ZN included in the file names." #: ../../source/Tutorial/dynamic/strain_stress.rst:150 @@ -294,10 +293,10 @@ msgstr "" #: ../../source/Tutorial/dynamic/strain_stress.rst:173 msgid "" "在 :rst:dir:`syn_dc_zne/` 原路径下,生成 " -":file:`*.rotation.??.sac`,文件名中包括分量名,如ZN,ZE,NE。" +":file:`rotation_??.sac`,文件名中包括分量名,如ZN,ZE,NE。" msgstr "" "In the original path :rst:dir:`syn_dc_zne/`, files named " -":file:`*.rotation.??.sac` are generated, with component names such as ZN," +":file:`rotation_??.sac` are generated, with component names such as ZN," " ZE, NE included in the file names." #: ../../source/Tutorial/dynamic/strain_stress.rst:182 @@ -321,12 +320,10 @@ msgid "" msgstr "" #: ../../source/Tutorial/dynamic/strain_stress.rst:207 -msgid "" -"在 :rst:dir:`syn_dc_zne/` 原路径下,生成 " -":file:`*.stress.??.sac`,文件名中包括分量名,如ZZ、ZN等。" +msgid "在 :rst:dir:`syn_dc_zne/` 原路径下,生成 :file:`stress_??.sac`,文件名中包括分量名,如ZZ、ZN等。" msgstr "" "In the original path :rst:dir:`syn_dc_zne/`, files named " -":file:`*.stress.??.sac` are generated, with component names such as ZZ, " +":file:`stress_??.sac` are generated, with component names such as ZZ, " "ZN included in the file names." #: ../../source/Tutorial/dynamic/strain_stress.rst:224 diff --git a/docs/source/Tutorial/dynamic/run_upar/run.sh b/docs/source/Tutorial/dynamic/run_upar/run.sh index 8d45eee3..82625a47 100755 --- a/docs/source/Tutorial/dynamic/run_upar/run.sh +++ b/docs/source/Tutorial/dynamic/run_upar/run.sh @@ -27,22 +27,22 @@ grt syn -GGRN/milrow_2_0_10 -S1e24 -A30 -M33/50/120 -Osyn_dc_zne -e -N # -------------------------------------------------------------------------------------- # BEGIN STRAIN -# 指定文件夹以及中间名,会在原文件夹内输出SAC格式的应变张量 -grt strain syn_dc_zne/out +# 指定文件夹,会在原文件夹内输出SAC格式的应变张量 +grt strain syn_dc_zne # END STRAIN # -------------------------------------------------------------------------------------- # -------------------------------------------------------------------------------------- # BEGIN ROTATION -# 指定文件夹以及中间名,会在原文件夹内输出SAC格式的旋转张量 -grt rotation syn_dc_zne/out +# 指定文件夹,会在原文件夹内输出SAC格式的旋转张量 +grt rotation syn_dc_zne # END ROTATION # -------------------------------------------------------------------------------------- # -------------------------------------------------------------------------------------- # BEGIN STRESS -# 指定文件夹以及中间名,会在原文件夹内输出SAC格式的应力张量 -grt stress syn_dc_zne/out +# 指定文件夹,会在原文件夹内输出SAC格式的应力张量 +grt stress syn_dc_zne # END STRESS # -------------------------------------------------------------------------------------- diff --git a/docs/source/Tutorial/dynamic/strain_stress.rst b/docs/source/Tutorial/dynamic/strain_stress.rst index 3bd26ef6..ac3fcdc4 100644 --- a/docs/source/Tutorial/dynamic/strain_stress.rst +++ b/docs/source/Tutorial/dynamic/strain_stress.rst @@ -138,7 +138,7 @@ :start-after: BEGIN STRAIN :end-before: END STRAIN - 在 :rst:dir:`syn_dc_zne/` 原路径下,生成 :file:`*.strain.??.sac`,文件名中包括分量名,如ZZ、ZN等。 + 在 :rst:dir:`syn_dc_zne/` 原路径下,生成 :file:`strain_??.sac`,文件名中包括分量名,如ZZ、ZN等。 .. group-tab:: Python @@ -170,7 +170,7 @@ :start-after: BEGIN ROTATION :end-before: END ROTATION - 在 :rst:dir:`syn_dc_zne/` 原路径下,生成 :file:`*.rotation.??.sac`,文件名中包括分量名,如ZN,ZE,NE。 + 在 :rst:dir:`syn_dc_zne/` 原路径下,生成 :file:`rotation_??.sac`,文件名中包括分量名,如ZN,ZE,NE。 .. group-tab:: Python @@ -204,7 +204,7 @@ :start-after: BEGIN STRESS :end-before: END STRESS - 在 :rst:dir:`syn_dc_zne/` 原路径下,生成 :file:`*.stress.??.sac`,文件名中包括分量名,如ZZ、ZN等。 + 在 :rst:dir:`syn_dc_zne/` 原路径下,生成 :file:`stress_??.sac`,文件名中包括分量名,如ZZ、ZN等。 .. group-tab:: Python diff --git a/example/compare_c_py/run_grt.sh b/example/compare_c_py/run_grt.sh index 89d3b190..cfc14b47 100755 --- a/example/compare_c_py/run_grt.sh +++ b/example/compare_c_py/run_grt.sh @@ -19,30 +19,29 @@ grt greenfn -M${modname} -O${out} -N${nt}/${dt} -D${depsrc}/${deprcv} -R${dist} # convolve different signals G=$out/${modname}_${depsrc}_${deprcv}_${dist} -P=cout S=1e24 az=39.2 for N in "" "-N" ; do -grt syn -G$G -Osyn_ex -P$P -A$az -S$S -Dt/0.2/0.2/0.4 -e $N -grt strain syn_ex/$P -grt rotation syn_ex/$P -grt stress syn_ex/$P +grt syn -G$G -Osyn_ex$N -A$az -S$S -Dt/0.2/0.2/0.4 -e $N +grt strain syn_ex$N +grt rotation syn_ex$N +grt stress syn_ex$N fn=2 fe=-1 fz=4 -grt syn -G$G -Osyn_sf -P$P -A$az -S$S -F$fn/$fe/$fz -Dt/0.1/0.3/0.6 -e $N -grt strain syn_sf/$P -grt rotation syn_sf/$P -grt stress syn_sf/$P +grt syn -G$G -Osyn_sf$N -A$az -S$S -F$fn/$fe/$fz -Dt/0.1/0.3/0.6 -e $N +grt strain syn_sf$N +grt rotation syn_sf$N +grt stress syn_sf$N stk=77 dip=88 rak=99 -grt syn -G$G -Osyn_dc -P$P -A$az -S$S -M$stk/$dip/$rak -Dp/0.6 -e $N -grt strain syn_dc/$P -grt rotation syn_dc/$P -grt stress syn_dc/$P +grt syn -G$G -Osyn_dc$N -A$az -S$S -M$stk/$dip/$rak -Dp/0.6 -e $N +grt strain syn_dc$N +grt rotation syn_dc$N +grt stress syn_dc$N M11=1 M12=-2 @@ -50,10 +49,10 @@ M13=-5 M22=0.5 M23=3 M33=1.2 -grt syn -G$G -Osyn_mt -P$P -A$az -S$S -T$M11/$M12/$M13/$M22/$M23/$M33 -Dr/3 -e $N -grt strain syn_mt/$P -grt rotation syn_mt/$P -grt stress syn_mt/$P +grt syn -G$G -Osyn_mt$N -A$az -S$S -T$M11/$M12/$M13/$M22/$M23/$M33 -Dr/3 -e $N +grt strain syn_mt$N +grt rotation syn_mt$N +grt stress syn_mt$N done diff --git a/example/compare_c_py/run_pygrt.py b/example/compare_c_py/run_pygrt.py index 94cd1237..421c0f4e 100644 --- a/example/compare_c_py/run_pygrt.py +++ b/example/compare_c_py/run_pygrt.py @@ -22,6 +22,7 @@ def compare3(st_py:Stream, c_prefix:str, ZNE:bool=False, dim2:bool=False): nerr = 0 for tr_c in st_c: tr_py = st_py.select(channel=tr_c.stats.channel)[0] + tr_c.data[tr_c.data == 0.0] = 1.0 rerr = np.mean(np.abs(tr_c.data - tr_py.data) / np.abs(tr_c.data)) if np.isnan(rerr) or np.isinf(rerr): rerr = 0.0 @@ -53,7 +54,7 @@ def static_compare3(resDct:dict, c_prefix:str): continue val1 = resDct[k] val2 = f.variables[k][:] - print(k, np.mean(np.abs(val1 - val2)), np.max(val2)) + print(k, np.mean(np.abs(val1 - val2)), np.max(np.abs(val2))) val2[val2 == 0.0] = 1.0 @@ -105,52 +106,52 @@ def static_compare3(resDct:dict, c_prefix:str): M33=1.2 for ZNE in [False, True]: + suffix = "-N" if ZNE else "" # synthetic - st = pygrt.utils.gen_syn_from_gf_EX(st_grn, S, az, ZNE=ZNE, calc_upar=True) sigs = pygrt.sigs.gen_triangle_wave(0.4, dt) pygrt.utils.stream_convolve(st, sigs) - AVGRERR.append(compare3(st, "syn_ex/cout", ZNE=ZNE)) + AVGRERR.append(compare3(st, f"syn_ex{suffix}/", ZNE=ZNE)) ststrain = pygrt.utils.compute_strain(st) strotation = pygrt.utils.compute_rotation(st) ststress = pygrt.utils.compute_stress(st) - AVGRERR.append(compare3(ststrain, "syn_ex/cout.strain.", ZNE=ZNE, dim2=True)) - AVGRERR.append(compare3(strotation, "syn_ex/cout.rotation.", ZNE=ZNE, dim2=True)) - AVGRERR.append(compare3(ststress, "syn_ex/cout.stress.", ZNE=ZNE, dim2=True)) + AVGRERR.append(compare3(ststrain, f"syn_ex{suffix}/strain_", ZNE=ZNE, dim2=True)) + AVGRERR.append(compare3(strotation, f"syn_ex{suffix}/rotation_", ZNE=ZNE, dim2=True)) + AVGRERR.append(compare3(ststress, f"syn_ex{suffix}/stress_", ZNE=ZNE, dim2=True)) st = pygrt.utils.gen_syn_from_gf_SF(st_grn, S, fn, fe, fz, az, ZNE=ZNE, calc_upar=True) sigs = pygrt.sigs.gen_trap_wave(0.1, 0.3, 0.6, dt) pygrt.utils.stream_convolve(st, sigs) - AVGRERR.append(compare3(st, "syn_sf/cout", ZNE=ZNE)) + AVGRERR.append(compare3(st, f"syn_sf{suffix}/", ZNE=ZNE)) ststrain = pygrt.utils.compute_strain(st) strotation = pygrt.utils.compute_rotation(st) ststress = pygrt.utils.compute_stress(st) - AVGRERR.append(compare3(ststrain, "syn_sf/cout.strain.", ZNE=ZNE, dim2=True)) - AVGRERR.append(compare3(strotation, "syn_sf/cout.rotation.", ZNE=ZNE, dim2=True)) - AVGRERR.append(compare3(ststress, "syn_sf/cout.stress.", ZNE=ZNE, dim2=True)) + AVGRERR.append(compare3(ststrain, f"syn_sf{suffix}/strain_", ZNE=ZNE, dim2=True)) + AVGRERR.append(compare3(strotation, f"syn_sf{suffix}/rotation_", ZNE=ZNE, dim2=True)) + AVGRERR.append(compare3(ststress, f"syn_sf{suffix}/stress_", ZNE=ZNE, dim2=True)) st = pygrt.utils.gen_syn_from_gf_DC(st_grn, S, stk, dip, rak, az, ZNE=ZNE, calc_upar=True) sigs = pygrt.sigs.gen_parabola_wave(0.6, dt) pygrt.utils.stream_convolve(st, sigs) - AVGRERR.append(compare3(st, "syn_dc/cout", ZNE=ZNE)) + AVGRERR.append(compare3(st, f"syn_dc{suffix}/", ZNE=ZNE)) ststrain = pygrt.utils.compute_strain(st) strotation = pygrt.utils.compute_rotation(st) ststress = pygrt.utils.compute_stress(st) - AVGRERR.append(compare3(ststrain, "syn_dc/cout.strain.", ZNE=ZNE, dim2=True)) - AVGRERR.append(compare3(strotation, "syn_dc/cout.rotation.", ZNE=ZNE, dim2=True)) - AVGRERR.append(compare3(ststress, "syn_dc/cout.stress.", ZNE=ZNE, dim2=True)) + AVGRERR.append(compare3(ststrain, f"syn_dc{suffix}/strain_", ZNE=ZNE, dim2=True)) + AVGRERR.append(compare3(strotation, f"syn_dc{suffix}/rotation_", ZNE=ZNE, dim2=True)) + AVGRERR.append(compare3(ststress, f"syn_dc{suffix}/stress_", ZNE=ZNE, dim2=True)) st = pygrt.utils.gen_syn_from_gf_MT(st_grn, S, [M11,M12,M13,M22,M23,M33], az, ZNE=ZNE, calc_upar=True) sigs = pygrt.sigs.gen_ricker_wave(3, dt) pygrt.utils.stream_convolve(st, sigs) - AVGRERR.append(compare3(st, "syn_mt/cout", ZNE=ZNE)) + AVGRERR.append(compare3(st, f"syn_mt{suffix}/", ZNE=ZNE)) ststrain = pygrt.utils.compute_strain(st) strotation = pygrt.utils.compute_rotation(st) ststress = pygrt.utils.compute_stress(st) - AVGRERR.append(compare3(ststrain, "syn_mt/cout.strain.", ZNE=ZNE, dim2=True)) - AVGRERR.append(compare3(strotation, "syn_mt/cout.rotation.", ZNE=ZNE, dim2=True)) - AVGRERR.append(compare3(ststress, "syn_mt/cout.stress.", ZNE=ZNE, dim2=True)) + AVGRERR.append(compare3(ststrain, f"syn_mt{suffix}/strain_", ZNE=ZNE, dim2=True)) + AVGRERR.append(compare3(strotation, f"syn_mt{suffix}/rotation_", ZNE=ZNE, dim2=True)) + AVGRERR.append(compare3(ststress, f"syn_mt{suffix}/stress_", ZNE=ZNE, dim2=True)) #-------------------------- Static ----------------------------------------- diff --git a/example/compute_strain_stress/dynamic/run_grt.sh b/example/compute_strain_stress/dynamic/run_grt.sh index 2a4e230f..2cbba977 100755 --- a/example/compute_strain_stress/dynamic/run_grt.sh +++ b/example/compute_strain_stress/dynamic/run_grt.sh @@ -22,5 +22,5 @@ az=30 grt syn -G${out}/${modname}_${depsrc}_${deprcv}_${dist} -A$az -S$S -M$stk/$dip/$rak -Dp/0.6 -Osyn_dc -e -grt strain syn_dc/out -grt stress syn_dc/out \ No newline at end of file +grt strain syn_dc +grt stress syn_dc \ No newline at end of file diff --git a/example/convolve_signals/plot.sh b/example/convolve_signals/plot.sh index 0f5aa923..002ce885 100755 --- a/example/convolve_signals/plot.sh +++ b/example/convolve_signals/plot.sh @@ -7,16 +7,17 @@ rm -rf $out mkdir -p $out -for synpath in syn*; do -for cout in $synpath/cout*; do -fname=$(basename $cout) -echo $cout $(dirname $cout)/p${fname:1:} +for synpath in syn_ex syn_sf syn_dc syn_mt; do +for ch in Z R T; do +cname=c_$synpath/$ch.sac +pname=p_$synpath/$ch.sac +echo $cname $pname sac << EOF -r $cout $(dirname $cout)/p${fname:1} +r $cname $pname qdp off color red inc list blue red p1 -saveimg $out/compare_${synpath}_${fname}.pdf +saveimg $out/compare_${synpath}_${ch}.pdf q EOF diff --git a/example/convolve_signals/run_grt.sh b/example/convolve_signals/run_grt.sh index 2dc2bde7..d25bfc15 100755 --- a/example/convolve_signals/run_grt.sh +++ b/example/convolve_signals/run_grt.sh @@ -11,24 +11,26 @@ dt=0.01 modname="milrow" out="GRN" +rm -rf $out + grt greenfn -M${modname} -O${out} -N${nt}/${dt} -D${depsrc}/${deprcv} -R${dist} +rm -rf c_syn* p_syn* # convolve different signals G=$out/${modname}_${depsrc}_${deprcv}_${dist} -P=cout S=1e24 az=39.2 -grt syn -G$G -Osyn_ex -P$P -A$az -S$S -Dt/0.2/0.2/0.4 +grt syn -G$G -Oc_syn_ex -A$az -S$S -Dt/0.2/0.2/0.4 fn=2 fe=-1 fz=4 -grt syn -G$G -Osyn_sf -P$P -A$az -S$S -F$fn/$fe/$fz -Dt/0.1/0.3/0.6 +grt syn -G$G -Oc_syn_sf -A$az -S$S -F$fn/$fe/$fz -Dt/0.1/0.3/0.6 stk=77 dip=88 rak=99 -grt syn -G$G -Osyn_dc -P$P -A$az -S$S -M$stk/$dip/$rak -Dp/0.6 +grt syn -G$G -Oc_syn_dc -A$az -S$S -M$stk/$dip/$rak -Dp/0.6 M11=1 M12=-2 @@ -36,5 +38,5 @@ M13=-5 M22=0.5 M23=3 M33=1.2 -grt syn -G$G -Osyn_mt -P$P -A$az -S$S -T$M11/$M12/$M13/$M22/$M23/$M33 -Dr/3 +grt syn -G$G -Oc_syn_mt -A$az -S$S -T$M11/$M12/$M13/$M22/$M23/$M33 -Dr/3 diff --git a/example/convolve_signals/run_pygrt.py b/example/convolve_signals/run_pygrt.py index 0b0d947a..fe7bea4a 100644 --- a/example/convolve_signals/run_pygrt.py +++ b/example/convolve_signals/run_pygrt.py @@ -23,19 +23,19 @@ st = pygrt.utils.gen_syn_from_gf_EX(st_grn, S, az) sigs = pygrt.sigs.gen_triangle_wave(0.4, dt) pygrt.utils.stream_convolve(st, sigs) -pygrt.utils.stream_write_sac(st, "syn_ex/pout") +pygrt.utils.stream_write_sac(st, "p_syn_ex/") st = pygrt.utils.gen_syn_from_gf_SF(st_grn, S, 2, -1, 4, az) sigs = pygrt.sigs.gen_trap_wave(0.1, 0.3, 0.6, dt) pygrt.utils.stream_convolve(st, sigs) -pygrt.utils.stream_write_sac(st, "syn_sf/pout") +pygrt.utils.stream_write_sac(st, "p_syn_sf/") st = pygrt.utils.gen_syn_from_gf_DC(st_grn, S, 77, 88, 99, az) sigs = pygrt.sigs.gen_parabola_wave(0.6, dt) pygrt.utils.stream_convolve(st, sigs) -pygrt.utils.stream_write_sac(st, "syn_dc/pout") +pygrt.utils.stream_write_sac(st, "p_syn_dc/") st = pygrt.utils.gen_syn_from_gf_MT(st_grn, S, [1,-2,-5,0.5,3,1.2], az) sigs = pygrt.sigs.gen_ricker_wave(3, dt) pygrt.utils.stream_convolve(st, sigs) -pygrt.utils.stream_write_sac(st, "syn_mt/pout") \ No newline at end of file +pygrt.utils.stream_write_sac(st, "p_syn_mt/") \ No newline at end of file diff --git a/example/seafloor/run_grt.sh b/example/seafloor/run_grt.sh index a5aae43e..8a482863 100755 --- a/example/seafloor/run_grt.sh +++ b/example/seafloor/run_grt.sh @@ -19,4 +19,4 @@ grt greenfn -M${modname} -O${out} -N${nt}/${dt} -D${depsrc}/${deprcv} -R${dist} # just give a random focal mechanism grt syn -G${out}/${modname}_${depsrc}_${deprcv}_${dist} -A20 -S1e20 -M100/20/120 -OSYN -e # compute stress -grt stress SYN/out +grt stress SYN diff --git a/pygrt/C_extension/src/dynamic/grt_rotation.c b/pygrt/C_extension/src/dynamic/grt_rotation.c index 75452840..b1c91cbf 100644 --- a/pygrt/C_extension/src/dynamic/grt_rotation.c +++ b/pygrt/C_extension/src/dynamic/grt_rotation.c @@ -16,8 +16,6 @@ /** 该子模块的参数控制结构体 */ typedef struct { char *name; - char *s_dirpath; - char *s_prefix; char *s_synpath; } GRT_MODULE_CTRL; @@ -25,8 +23,6 @@ typedef struct { /** 释放结构体的内存 */ static void free_Ctrl(GRT_MODULE_CTRL *Ctrl){ GRT_SAFE_FREE_PTR(Ctrl->name); - GRT_SAFE_FREE_PTR(Ctrl->s_dirpath); - GRT_SAFE_FREE_PTR(Ctrl->s_prefix); GRT_SAFE_FREE_PTR(Ctrl->s_synpath); GRT_SAFE_FREE_PTR(Ctrl); } @@ -41,7 +37,7 @@ printf("\n" "\n\n" "Usage:\n" "----------------------------------------------------------------\n" -" grt rotation /\n" +" grt rotation \n" "\n\n\n" ); } @@ -66,20 +62,12 @@ static void getopt_from_command(GRT_MODULE_CTRL *Ctrl, int argc, char **argv){ int rotation_main(int argc, char **argv){ GRT_MODULE_CTRL *Ctrl = calloc(1, sizeof(*Ctrl)); Ctrl->name = strdup(argv[0]); - Ctrl->s_dirpath = strdup(argv[1]); - const char *command = Ctrl->name; getopt_from_command(Ctrl, argc, argv); - // 合成地震图目录路径 - Ctrl->s_synpath = (char*)malloc(sizeof(char)*(strlen(Ctrl->s_dirpath)+1)); - // 保存文件前缀 - Ctrl->s_prefix = (char*)malloc(sizeof(char)*(strlen(Ctrl->s_dirpath)+1)); - if(2 != sscanf(Ctrl->s_dirpath, "%[^/]/%s", Ctrl->s_synpath, Ctrl->s_prefix)){ - GRTRaiseError("[%s] Error format in \"%s\".\n", command, Ctrl->s_dirpath); - } + Ctrl->s_synpath = strdup(argv[1]); // 检查是否存在该目录 GRTCheckDirExist(command, Ctrl->s_synpath); @@ -96,7 +84,7 @@ int rotation_main(int argc, char **argv){ const char *chs = NULL; // 判断标志性文件是否存在,来判断输出使用ZNE还是ZRT - GRT_SAFE_ASPRINTF(&s_filepath, "%s/n%sN.sac", Ctrl->s_synpath, Ctrl->s_prefix); + GRT_SAFE_ASPRINTF(&s_filepath, "%s/nN.sac", Ctrl->s_synpath); rot2ZNE = (access(s_filepath, F_OK) == 0); // 指示特定的通道名 @@ -105,7 +93,7 @@ int rotation_main(int argc, char **argv){ // 读取一个头段变量,获得基本参数,分配数组内存 SACHEAD hd; - GRT_SAFE_ASPRINTF(&s_filepath, "%s/%c%s%c.sac", Ctrl->s_synpath, tolower(chs[0]), Ctrl->s_prefix, chs[0]); + GRT_SAFE_ASPRINTF(&s_filepath, "%s/%c%c.sac", Ctrl->s_synpath, tolower(chs[0]), chs[0]); grt_read_SAC_HEAD(command, s_filepath, &hd); int npts=hd.npts; float dist=hd.dist; @@ -119,14 +107,14 @@ int rotation_main(int argc, char **argv){ c2 = chs[i2]; // 读取数据 u_{i,j} - GRT_SAFE_ASPRINTF(&s_filepath, "%s/%c%s%c.sac", Ctrl->s_synpath, tolower(c2), Ctrl->s_prefix, c1); + GRT_SAFE_ASPRINTF(&s_filepath, "%s/%c%c.sac", Ctrl->s_synpath, tolower(c2), c1); arrin = grt_read_SAC(command, s_filepath, &hd, arrin); // 累加 for(int i=0; is_synpath, tolower(c1), Ctrl->s_prefix, c2); + GRT_SAFE_ASPRINTF(&s_filepath, "%s/%c%c.sac", Ctrl->s_synpath, tolower(c1), c2); arrin = grt_read_SAC(command, s_filepath, &hd, arrin); // 累加 @@ -135,14 +123,14 @@ int rotation_main(int argc, char **argv){ // 特殊情况需加上协变导数,1e-5是因为km->cm if(c1=='R' && c2=='T'){ // 读取数据 u_T - GRT_SAFE_ASPRINTF(&s_filepath, "%s/%sT.sac", Ctrl->s_synpath, Ctrl->s_prefix); + GRT_SAFE_ASPRINTF(&s_filepath, "%s/T.sac", Ctrl->s_synpath); arrin = grt_read_SAC(command, s_filepath, &hd, arrin); for(int i=0; is_synpath, Ctrl->s_prefix, c1, c2); + GRT_SAFE_ASPRINTF(&s_filepath, "%s/rotation_%c%c.sac", Ctrl->s_synpath, c1, c2); write_sac(s_filepath, hd, arrout); // 置零 diff --git a/pygrt/C_extension/src/dynamic/grt_strain.c b/pygrt/C_extension/src/dynamic/grt_strain.c index 59bff4c3..778cd6c7 100644 --- a/pygrt/C_extension/src/dynamic/grt_strain.c +++ b/pygrt/C_extension/src/dynamic/grt_strain.c @@ -16,8 +16,6 @@ /** 该子模块的参数控制结构体 */ typedef struct { char *name; - char *s_dirpath; - char *s_prefix; char *s_synpath; } GRT_MODULE_CTRL; @@ -25,8 +23,6 @@ typedef struct { /** 释放结构体的内存 */ static void free_Ctrl(GRT_MODULE_CTRL *Ctrl){ GRT_SAFE_FREE_PTR(Ctrl->name); - GRT_SAFE_FREE_PTR(Ctrl->s_dirpath); - GRT_SAFE_FREE_PTR(Ctrl->s_prefix); GRT_SAFE_FREE_PTR(Ctrl->s_synpath); GRT_SAFE_FREE_PTR(Ctrl); } @@ -39,7 +35,7 @@ printf("\n" "\n\n" "Usage:\n" "----------------------------------------------------------------\n" -" grt strain /\n" +" grt strain \n" "\n\n\n" ); } @@ -65,20 +61,12 @@ static void getopt_from_command(GRT_MODULE_CTRL *Ctrl, int argc, char **argv){ int strain_main(int argc, char **argv){ GRT_MODULE_CTRL *Ctrl = calloc(1, sizeof(*Ctrl)); Ctrl->name = strdup(argv[0]); - Ctrl->s_dirpath = strdup(argv[1]); - const char *command = Ctrl->name; getopt_from_command(Ctrl, argc, argv); - // 合成地震图目录路径 - Ctrl->s_synpath = (char*)malloc(sizeof(char)*(strlen(Ctrl->s_dirpath)+1)); - // 保存文件前缀 - Ctrl->s_prefix = (char*)malloc(sizeof(char)*(strlen(Ctrl->s_dirpath)+1)); - if(2 != sscanf(Ctrl->s_dirpath, "%[^/]/%s", Ctrl->s_synpath, Ctrl->s_prefix)){ - GRTRaiseError("[%s] Error format in \"%s\".\n", command, Ctrl->s_dirpath); - } + Ctrl->s_synpath = strdup(argv[1]); // 检查是否存在该目录 GRTCheckDirExist(command, Ctrl->s_synpath); @@ -95,7 +83,7 @@ int strain_main(int argc, char **argv){ const char *chs = NULL; // 判断标志性文件是否存在,来判断输出使用ZNE还是ZRT - GRT_SAFE_ASPRINTF(&s_filepath, "%s/n%sN.sac", Ctrl->s_synpath, Ctrl->s_prefix); + GRT_SAFE_ASPRINTF(&s_filepath, "%s/nN.sac", Ctrl->s_synpath); rot2ZNE = (access(s_filepath, F_OK) == 0); // 指示特定的通道名 @@ -104,7 +92,7 @@ int strain_main(int argc, char **argv){ // 读取一个头段变量,获得基本参数,分配数组内存 SACHEAD hd; - GRT_SAFE_ASPRINTF(&s_filepath, "%s/%c%s%c.sac", Ctrl->s_synpath, tolower(chs[0]), Ctrl->s_prefix, chs[0]); + GRT_SAFE_ASPRINTF(&s_filepath, "%s/%c%c.sac", Ctrl->s_synpath, tolower(chs[0]), chs[0]); grt_read_SAC_HEAD(command, s_filepath, &hd); int npts=hd.npts; float dist=hd.dist; @@ -118,14 +106,14 @@ int strain_main(int argc, char **argv){ c2 = chs[i2]; // 读取数据 u_{i,j} - GRT_SAFE_ASPRINTF(&s_filepath, "%s/%c%s%c.sac", Ctrl->s_synpath, tolower(c2), Ctrl->s_prefix, c1); + GRT_SAFE_ASPRINTF(&s_filepath, "%s/%c%c.sac", Ctrl->s_synpath, tolower(c2), c1); arrin = grt_read_SAC(command, s_filepath, &hd, arrin); // 累加 for(int i=0; is_synpath, tolower(c1), Ctrl->s_prefix, c2); + GRT_SAFE_ASPRINTF(&s_filepath, "%s/%c%c.sac", Ctrl->s_synpath, tolower(c1), c2); arrin = grt_read_SAC(command, s_filepath, &hd, arrin); // 累加 @@ -134,20 +122,20 @@ int strain_main(int argc, char **argv){ // 特殊情况需加上协变导数,1e-5是因为km->cm if(c1=='R' && c2=='T'){ // 读取数据 u_T - GRT_SAFE_ASPRINTF(&s_filepath, "%s/%sT.sac", Ctrl->s_synpath, Ctrl->s_prefix); + GRT_SAFE_ASPRINTF(&s_filepath, "%s/T.sac", Ctrl->s_synpath); arrin = grt_read_SAC(command, s_filepath, &hd, arrin); for(int i=0; is_synpath, Ctrl->s_prefix); + GRT_SAFE_ASPRINTF(&s_filepath, "%s/R.sac", Ctrl->s_synpath); arrin = grt_read_SAC(command, s_filepath, &hd, arrin); for(int i=0; is_synpath, Ctrl->s_prefix, c1, c2); + GRT_SAFE_ASPRINTF(&s_filepath, "%s/strain_%c%c.sac", Ctrl->s_synpath, c1, c2); write_sac(s_filepath, hd, arrout); // 置零 diff --git a/pygrt/C_extension/src/dynamic/grt_stress.c b/pygrt/C_extension/src/dynamic/grt_stress.c index 28925a33..44f08085 100644 --- a/pygrt/C_extension/src/dynamic/grt_stress.c +++ b/pygrt/C_extension/src/dynamic/grt_stress.c @@ -18,8 +18,6 @@ /** 该子模块的参数控制结构体 */ typedef struct { char *name; - char *s_dirpath; - char *s_prefix; char *s_synpath; } GRT_MODULE_CTRL; @@ -27,8 +25,6 @@ typedef struct { /** 释放结构体的内存 */ static void free_Ctrl(GRT_MODULE_CTRL *Ctrl){ GRT_SAFE_FREE_PTR(Ctrl->name); - GRT_SAFE_FREE_PTR(Ctrl->s_dirpath); - GRT_SAFE_FREE_PTR(Ctrl->s_prefix); GRT_SAFE_FREE_PTR(Ctrl->s_synpath); GRT_SAFE_FREE_PTR(Ctrl); } @@ -43,7 +39,7 @@ printf("\n" "\n\n" "Usage:\n" "----------------------------------------------------------------\n" -" grt stress /\n" +" grt stress \n" "\n\n\n" ); } @@ -67,25 +63,16 @@ static void getopt_from_command(GRT_MODULE_CTRL *Ctrl, int argc, char **argv){ int stress_main(int argc, char **argv){ GRT_MODULE_CTRL *Ctrl = calloc(1, sizeof(*Ctrl)); Ctrl->name = strdup(argv[0]); - Ctrl->s_dirpath = strdup(argv[1]); - const char *command = Ctrl->name; getopt_from_command(Ctrl, argc, argv); - // 合成地震图目录路径 - Ctrl->s_synpath = (char*)malloc(sizeof(char)*(strlen(Ctrl->s_dirpath)+1)); - // 保存文件前缀 - Ctrl->s_prefix = (char*)malloc(sizeof(char)*(strlen(Ctrl->s_dirpath)+1)); - if(2 != sscanf(Ctrl->s_dirpath, "%[^/]/%s", Ctrl->s_synpath, Ctrl->s_prefix)){ - GRTRaiseError("[%s] Error format in \"%s\".\n", command, Ctrl->s_dirpath); - } + Ctrl->s_synpath = strdup(argv[1]); // 检查是否存在该目录 GRTCheckDirExist(command, Ctrl->s_synpath); - // ---------------------------------------------------------------------------------- // 开始读取计算,输出6个量 char c1, c2; @@ -97,7 +84,7 @@ int stress_main(int argc, char **argv){ const char *chs = NULL; // 判断标志性文件是否存在,来判断输出使用ZNE还是ZRT - GRT_SAFE_ASPRINTF(&s_filepath, "%s/n%sN.sac", Ctrl->s_synpath, Ctrl->s_prefix); + GRT_SAFE_ASPRINTF(&s_filepath, "%s/nN.sac", Ctrl->s_synpath); rot2ZNE = (access(s_filepath, F_OK) == 0); // 指示特定的通道名 @@ -106,7 +93,7 @@ int stress_main(int argc, char **argv){ // 读取一个头段变量,获得基本参数,分配数组内存 SACHEAD hd; - GRT_SAFE_ASPRINTF(&s_filepath, "%s/%c%s%c.sac", Ctrl->s_synpath, tolower(chs[0]), Ctrl->s_prefix, chs[0]); + GRT_SAFE_ASPRINTF(&s_filepath, "%s/%c%c.sac", Ctrl->s_synpath, tolower(chs[0]), chs[0]); grt_read_SAC_HEAD(command, s_filepath, &hd); int npts=hd.npts; float dt=hd.delta; @@ -154,7 +141,7 @@ int stress_main(int argc, char **argv){ c1 = chs[i1]; // 读取数据 u_{k,k} - GRT_SAFE_ASPRINTF(&s_filepath, "%s/%c%s%c.sac", Ctrl->s_synpath, tolower(c1), Ctrl->s_prefix, c1); + GRT_SAFE_ASPRINTF(&s_filepath, "%s/%c%c.sac", Ctrl->s_synpath, tolower(c1), c1); grt_read_SAC(command, s_filepath, &hd, fwd_fftw_holder->w_t); // 累加 @@ -163,7 +150,7 @@ int stress_main(int argc, char **argv){ } // 加上协变导数 if(!rot2ZNE){ - GRT_SAFE_ASPRINTF(&s_filepath, "%s/%sR.sac", Ctrl->s_synpath, Ctrl->s_prefix); + GRT_SAFE_ASPRINTF(&s_filepath, "%s/R.sac", Ctrl->s_synpath); grt_read_SAC(command, s_filepath, &hd, fwd_fftw_holder->w_t); fftwf_execute(fwd_fftw_holder->plan); for(int i=0; iW_f[i]/dist*1e-5; @@ -184,7 +171,7 @@ int stress_main(int argc, char **argv){ c2 = chs[i2]; // 读取数据 u_{i,j} - GRT_SAFE_ASPRINTF(&s_filepath, "%s/%c%s%c.sac", Ctrl->s_synpath, tolower(c2), Ctrl->s_prefix, c1); + GRT_SAFE_ASPRINTF(&s_filepath, "%s/%c%c.sac", Ctrl->s_synpath, tolower(c2), c1); grt_read_SAC(command, s_filepath, &hd, fwd_fftw_holder->w_t); // 累加 @@ -192,7 +179,7 @@ int stress_main(int argc, char **argv){ for(int i=0; iW_f[i] += fwd_fftw_holder->W_f[i]; // 读取数据 u_{j,i} - GRT_SAFE_ASPRINTF(&s_filepath, "%s/%c%s%c.sac", Ctrl->s_synpath, tolower(c1), Ctrl->s_prefix, c2); + GRT_SAFE_ASPRINTF(&s_filepath, "%s/%c%c.sac", Ctrl->s_synpath, tolower(c1), c2); grt_read_SAC(command, s_filepath, &hd, fwd_fftw_holder->w_t); // 累加 @@ -207,14 +194,14 @@ int stress_main(int argc, char **argv){ // 特殊情况需加上协变导数,1e-5是因为km->cm if(c1=='R' && c2=='T'){ // 读取数据 u_T - GRT_SAFE_ASPRINTF(&s_filepath, "%s/%sT.sac", Ctrl->s_synpath, Ctrl->s_prefix); + GRT_SAFE_ASPRINTF(&s_filepath, "%s/T.sac", Ctrl->s_synpath); grt_read_SAC(command, s_filepath, &hd, fwd_fftw_holder->w_t); fftwf_execute(fwd_fftw_holder->plan); for(int i=0; iW_f[i] -= mus[i] * fwd_fftw_holder->W_f[i] / dist * 1e-5; } else if(c1=='T' && c2=='T'){ // 读取数据 u_R - GRT_SAFE_ASPRINTF(&s_filepath, "%s/%sR.sac", Ctrl->s_synpath, Ctrl->s_prefix); + GRT_SAFE_ASPRINTF(&s_filepath, "%s/R.sac", Ctrl->s_synpath); grt_read_SAC(command, s_filepath, &hd, fwd_fftw_holder->w_t); fftwf_execute(fwd_fftw_holder->plan); for(int i=0; iW_f[i] += 2.0f * mus[i] * fwd_fftw_holder->W_f[i] / dist * 1e-5; @@ -224,7 +211,7 @@ int stress_main(int argc, char **argv){ fftwf_execute(inv_fftw_holder->plan); for(int i=0; iw_t[i] /= npts; sprintf(hd.kcmpnm, "%c%c", c1, c2); - GRT_SAFE_ASPRINTF(&s_filepath, "%s/%s.stress.%c%c.sac", Ctrl->s_synpath, Ctrl->s_prefix, c1, c2); + GRT_SAFE_ASPRINTF(&s_filepath, "%s/stress_%c%c.sac", Ctrl->s_synpath, c1, c2); write_sac(s_filepath, hd, inv_fftw_holder->w_t); // 置零 diff --git a/pygrt/C_extension/src/dynamic/grt_syn.c b/pygrt/C_extension/src/dynamic/grt_syn.c index 6799fd9a..c3545ae3 100644 --- a/pygrt/C_extension/src/dynamic/grt_syn.c +++ b/pygrt/C_extension/src/dynamic/grt_syn.c @@ -18,9 +18,6 @@ // 防止被替换为虚数单位 #undef I -// 一些变量的非零默认值 -#define GRT_SYN_P_PREFIX "out" - // 和宏命令对应的震源类型全称 static const char *sourceTypeFullName[] = {"Explosion", "Single Force", "Shear", "Moment Tensor"}; @@ -37,11 +34,6 @@ typedef struct { bool active; char *s_output_dir; } O; - /** 保存文件前缀 */ - struct { - bool active; - char *s_prefix; - } P; /** 方位角 */ struct { bool active; @@ -119,8 +111,6 @@ static void free_Ctrl(GRT_MODULE_CTRL *Ctrl){ GRT_SAFE_FREE_PTR(Ctrl->G.s_grnpath); // O GRT_SAFE_FREE_PTR(Ctrl->O.s_output_dir); - // P - GRT_SAFE_FREE_PTR(Ctrl->P.s_prefix); // D GRT_SAFE_FREE_PTR(Ctrl->D.tfparams); GRT_SAFE_FREE_PTR(Ctrl->D.tfarr); @@ -141,7 +131,7 @@ printf("\n" " and the units are cm. You can add -N to rotate ZRT to ZNE.\n" "\n" " + Default outputs (without -I and -J) are impulse-like displacements.\n" -" + -D, -I and -J are applied in the frequency domain.\n" +" + -D, -I and -J are applied in the time domain.\n" "\n\n" "Usage:\n" "----------------------------------------------------------------\n" @@ -150,7 +140,7 @@ printf("\n" " [-T/////]\n" " [-F//] \n" " [-D/] [-I] [-J]\n" -" [-P] [-N] [-e] [-s]\n" +" [-N] [-e] [-s]\n" "\n" "\n\n" "Options:\n" @@ -187,8 +177,6 @@ printf("\n" " -O Directory of output for saving. Default is\n" " current directory.\n" "\n" -" -P Prefix for single SAC file. Default is \"%s\".\n", GRT_SYN_P_PREFIX); printf( -"\n" " -D/\n" " Convolve a Time Function with a maximum value of 1.0.\n" " There are several options:\n" @@ -297,7 +285,7 @@ static void getopt_from_command(GRT_MODULE_CTRL *Ctrl, int argc, char **argv){ sprintf(Ctrl->s_computeType, "%s", "EX"); int opt; - while ((opt = getopt(argc, argv, ":G:A:S:M:F:T:O:P:D:I:J:Nehs")) != -1) { + while ((opt = getopt(argc, argv, ":G:A:S:M:F:T:O:D:I:J:Nehs")) != -1) { switch (opt) { // 格林函数路径 case 'G': @@ -403,12 +391,6 @@ static void getopt_from_command(GRT_MODULE_CTRL *Ctrl, int argc, char **argv){ Ctrl->O.s_output_dir = strdup(optarg); break; - // 保存文件前缀 - case 'P': - Ctrl->P.active = true; - Ctrl->P.s_prefix = strdup(optarg); - break; - // 卷积时间函数 case 'D': Ctrl->D.active = true; @@ -537,15 +519,10 @@ static void getopt_from_command(GRT_MODULE_CTRL *Ctrl, int argc, char **argv){ #undef X } } - // 建立保存目录 GRTCheckMakeDir(command, Ctrl->O.s_output_dir); - if( ! Ctrl->P.active){ - Ctrl->P.s_prefix = strdup(GRT_SYN_P_PREFIX); - } - if(Ctrl->S.mult_src_mu) Ctrl->S.M0 *= Ctrl->S.src_mu; } @@ -563,7 +540,7 @@ static void save_to_sac(GRT_MODULE_CTRL *Ctrl, const char *pfx, const char ch, f hd.baz = Ctrl->A.backazimuth; char *buffer = NULL; snprintf(hd.kcmpnm, sizeof(hd.kcmpnm), "%s%s%c", pfx, Ctrl->s_computeType, ch); - GRT_SAFE_ASPRINTF(&buffer, "%s/%s%s%c.sac", Ctrl->O.s_output_dir, pfx, Ctrl->P.s_prefix, ch); + GRT_SAFE_ASPRINTF(&buffer, "%s/%s%c.sac", Ctrl->O.s_output_dir, pfx, ch); write_sac(buffer, hd, arr); GRT_SAFE_FREE_PTR(buffer); }