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
4 changes: 2 additions & 2 deletions docs/source/Module/explain_-R.rst_
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
.. _-R:

**-R**\ *r1,r2,...*
震中距 (km)。多个震中距使用逗号分隔
**-R**\ *file*\|\ *r1,r2,...*
震中距 (km)。可以传入逗号分隔的多个震中距,或者仅含有一列震中距的文件 *file*
2 changes: 1 addition & 1 deletion docs/source/Module/greenfn.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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* ]
Expand Down
2 changes: 1 addition & 1 deletion docs/source/Module/travt.rst
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ travt
**grt travt**
|-M|\ *model*
|-D|\ *depsrc/deprcv*
|-R|\ *r1,r2,...*
|-R|\ *file*\|\ *r1,r2,...*


描述
Expand Down
9 changes: 7 additions & 2 deletions example/multi_traces/run1.sh
Original file line number Diff line number Diff line change
@@ -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%,} # 删除最后的逗号

# 震源台站都在地表
Expand All @@ -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 # 只生成垂直力源的格林函数
2 changes: 2 additions & 0 deletions pygrt/C_extension/include/grt/common/const.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)) ///< 求两者较小值

Expand Down
23 changes: 22 additions & 1 deletion pygrt/C_extension/include/grt/common/util.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 函数的简化版本
Expand Down
36 changes: 36 additions & 0 deletions pygrt/C_extension/src/common/util.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
11 changes: 10 additions & 1 deletion pygrt/C_extension/src/dynamic/grt_greenfn.c
Original file line number Diff line number Diff line change
Expand Up @@ -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; i<Ctrl->R.nr; ++i){
Expand Down
11 changes: 10 additions & 1 deletion pygrt/C_extension/src/travt/grt_travt.c
Original file line number Diff line number Diff line change
Expand Up @@ -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; i<Ctrl->R.nr; ++i){
Expand Down