diff --git a/docs/source/Module/explain_-R.rst_ b/docs/source/Module/explain_-R.rst_ index 90b99cf..58675bf 100644 --- a/docs/source/Module/explain_-R.rst_ +++ b/docs/source/Module/explain_-R.rst_ @@ -1,4 +1,4 @@ .. _-R: -**-R**\ *r1,r2,...* - 震中距 (km)。多个震中距使用逗号分隔。 \ No newline at end of file +**-R**\ *file*\|\ *r1,r2,...* + 震中距 (km)。可以传入逗号分隔的多个震中距,或者仅含有一列震中距的文件 *file* 。 \ No newline at end of file diff --git a/docs/source/Module/greenfn.rst b/docs/source/Module/greenfn.rst index 969cc03..74d6c12 100644 --- a/docs/source/Module/greenfn.rst +++ b/docs/source/Module/greenfn.rst @@ -13,7 +13,7 @@ greenfn |-M|\ *model* |-D|\ *depsrc/deprcv* |-N|\ *nt/dt*\ [**+w**\ *zeta*][**+n**\ *fac*] -|-R|\ *r1,r2,...* +|-R|\ *file*\|\ *r1,r2,...* |-O|\ *outdir* [ |-H|\ *f1/f2* ] [ |-L|\ *args* ] diff --git a/docs/source/Module/travt.rst b/docs/source/Module/travt.rst index 4d1063c..3783b70 100644 --- a/docs/source/Module/travt.rst +++ b/docs/source/Module/travt.rst @@ -12,7 +12,7 @@ travt **grt travt** |-M|\ *model* |-D|\ *depsrc/deprcv* -|-R|\ *r1,r2,...* +|-R|\ *file*\|\ *r1,r2,...* 描述 diff --git a/example/multi_traces/run1.sh b/example/multi_traces/run1.sh index 14e2056..af8bd0b 100755 --- a/example/multi_traces/run1.sh +++ b/example/multi_traces/run1.sh @@ -1,7 +1,9 @@ #!/bin/bash # 震中距数组 -distarr=($(seq -f "%.2f" 0.5 0.01 1.5 | tr '\n' ',')) +# 输出到文件 +seq -f "%.2f" 0.5 0.01 1.5 > dists +distarr=($(cat dists | tr '\n' ',')) distarr=${distarr%,} # 删除最后的逗号 # 震源台站都在地表 @@ -16,4 +18,7 @@ modname="mod1" out="GRN" # compute Green's Functions -grt greenfn -M${modname} -O${out} -N${nt}/${dt} -D${depsrc}/${deprcv} -R${distarr} -Gv # 只生成垂直力源的格林函数 +# OPTION-1: input distances array +# grt greenfn -M${modname} -O${out} -N${nt}/${dt} -D${depsrc}/${deprcv} -R${distarr} -Gv # 只生成垂直力源的格林函数 +# OPTION-2: +grt greenfn -M${modname} -O${out} -N${nt}/${dt} -D${depsrc}/${deprcv} -Rdists -Gv # 只生成垂直力源的格林函数 diff --git a/pygrt/C_extension/include/grt/common/const.h b/pygrt/C_extension/include/grt/common/const.h index 2ab901b..7f5ccaa 100755 --- a/pygrt/C_extension/include/grt/common/const.h +++ b/pygrt/C_extension/include/grt/common/const.h @@ -80,6 +80,8 @@ typedef int MYINT; ///< 整数 #define GRT_COMMENT_HEAD '#' ///< # 号, 作为注释的字符 +#define GRT_NUM_STR "0123456789" ///< 包括所有数字的字符串宏 + #define GRT_MAX(a, b) ((a) > (b) ? (a) : (b)) ///< 求两者较大值 #define GRT_MIN(a, b) ((a) < (b) ? (a) : (b)) ///< 求两者较小值 diff --git a/pygrt/C_extension/include/grt/common/util.h b/pygrt/C_extension/include/grt/common/util.h index 7af79f5..fc63671 100644 --- a/pygrt/C_extension/include/grt/common/util.h +++ b/pygrt/C_extension/include/grt/common/util.h @@ -22,10 +22,31 @@ * @param[in] delim 分隔符 * @param[out] size 分割后的子字符串数组长度 * - * @return split 子字符串数组 + * @return 子字符串数组 */ char ** grt_string_split(const char *string, const char *delim, int *size); +/** + * 从文本文件中,将每行内容读入字符串数组 + * + * @param[in,out] fp 文件指针 + * @param[out] size 读入的字符串数组长度 + * + * @return 字符串数组 + * + */ +char ** grt_string_from_file(FILE *fp, int *size); + +/** + * 判断字符串是否由特定的若个字符组成(充分条件) + * + * @param[in] str 待检查的字符串 + * @param[in] alws 允许的字符集合 + * + * @return 是否符合 + */ +bool grt_string_composed_of(const char *str, const char *alws); + /** * 指定分隔符,获得字符串的分割出的子字符串数。 * 相当于是 grt_string_split 函数的简化版本 diff --git a/pygrt/C_extension/src/common/util.c b/pygrt/C_extension/src/common/util.c index 6dcebf7..754969b 100644 --- a/pygrt/C_extension/src/common/util.c +++ b/pygrt/C_extension/src/common/util.c @@ -43,6 +43,42 @@ char ** grt_string_split(const char *string, const char *delim, int *size) return s_split; } +char ** grt_string_from_file(FILE *fp, int *size){ + char **s_split = NULL; + *size = 0; + s_split = (char**)realloc(s_split, sizeof(char*)*(*size+1)); + s_split[*size] = NULL; + + size_t len=0; + while(grt_getline(&s_split[*size], &len, fp) != -1){ + s_split[*size][strlen(s_split[*size])-1] = '\0'; // 换行符换为终止符 + (*size)++; + s_split = (char**)realloc(s_split, sizeof(char*)*(*size+1)); + s_split[*size] = NULL; + } + return s_split; +} + +bool grt_string_composed_of(const char *str, const char *alws){ + bool allowed[256] = {false}; // 初始全为false(不允许) + + // 标记允许的字符 + for (int i = 0; alws[i] != '\0'; i++) { + unsigned char c = alws[i]; // 转为无符号避免负数索引 + allowed[c] = true; + } + + // 检查目标字符串中的每个字符 + for (int i = 0; str[i] != '\0'; i++) { + unsigned char c = str[i]; + if (!allowed[c]) { // 若字符不在允许集合中 + return false; + } + } + + // 所有字符均在允许集合中 + return true; +} int grt_string_ncols(const char *string, const char* delim){ int count = 0; diff --git a/pygrt/C_extension/src/dynamic/grt_greenfn.c b/pygrt/C_extension/src/dynamic/grt_greenfn.c index 41bb403..5ec1ae9 100644 --- a/pygrt/C_extension/src/dynamic/grt_greenfn.c +++ b/pygrt/C_extension/src/dynamic/grt_greenfn.c @@ -652,7 +652,16 @@ static void getopt_from_command(GRT_MODULE_CTRL *Ctrl, int argc, char **argv){ case 'R': Ctrl->R.active = true; Ctrl->R.s_raw = strdup(optarg); - Ctrl->R.s_rs = grt_string_split(optarg, ",", &Ctrl->R.nr); + // 如果输入仅由数字、小数点和间隔符组成,则直接读取 + if(grt_string_composed_of(optarg, GRT_NUM_STR ".,")){ + Ctrl->R.s_rs = grt_string_split(optarg, ",", &Ctrl->R.nr); + } + // 否则从文件读取 + else { + FILE *fp = GRTCheckOpenFile(command, optarg, "r"); + Ctrl->R.s_rs = grt_string_from_file(fp, &Ctrl->R.nr); + fclose(fp); + } // 转为浮点数 Ctrl->R.rs = (MYREAL*)realloc(Ctrl->R.rs, sizeof(MYREAL)*(Ctrl->R.nr)); for(MYINT i=0; iR.nr; ++i){ diff --git a/pygrt/C_extension/src/travt/grt_travt.c b/pygrt/C_extension/src/travt/grt_travt.c index ddf24f1..a2fa378 100644 --- a/pygrt/C_extension/src/travt/grt_travt.c +++ b/pygrt/C_extension/src/travt/grt_travt.c @@ -492,7 +492,16 @@ static void getopt_from_command(GRT_MODULE_CTRL *Ctrl, int argc, char **argv){ // 震中距数组,-Rr1,r2,r3,r4 ... case 'R': Ctrl->R.active = true; - Ctrl->R.s_rs = grt_string_split(optarg, ",", &Ctrl->R.nr); + // 如果输入仅由数字、小数点和间隔符组成,则直接读取 + if(grt_string_composed_of(optarg, GRT_NUM_STR ".,")){ + Ctrl->R.s_rs = grt_string_split(optarg, ",", &Ctrl->R.nr); + } + // 否则从文件读取 + else { + FILE *fp = GRTCheckOpenFile(command, optarg, "r"); + Ctrl->R.s_rs = grt_string_from_file(fp, &Ctrl->R.nr); + fclose(fp); + } // 转为浮点数 Ctrl->R.rs = (MYREAL*)realloc(Ctrl->R.rs, sizeof(MYREAL)*(Ctrl->R.nr)); for(MYINT i=0; iR.nr; ++i){