Skip to content

Commit c78e88f

Browse files
committed
add progressbar, add an example
1 parent abccea3 commit c78e88f

File tree

10 files changed

+231
-14
lines changed

10 files changed

+231
-14
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@
66

77
/pyfmm/__pycache__
88
/pyfmm/C_extension/build
9-
/aaa
9+
/test_w

docs/source/examples/05_uniform_source_refined.ipynb

Lines changed: 130 additions & 0 deletions
Large diffs are not rendered by default.

docs/source/jupyter_examples.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,4 @@ Jupyter 使用示例
1818
examples/02_random_model
1919
examples/03_spherical
2020
examples/04_distance
21+
examples/05_uniform_source_refined

pyfmm/C_extension/include/fmm.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
* @param sphcoord (in)是否使用球坐标
3434
* @param rfgfac (in)对于源点附近的格点间加密倍数,>1
3535
* @param rfgn (in)对于源点附近的格点间加密处理的辐射半径,>=1
36+
* @param printbar (in)是否打印进度条
3637
*
3738
*
3839
*/
@@ -43,7 +44,7 @@ void FastMarching(
4344
double rr, double tt, double pp,
4445
int maxodr, const float *Slw,
4546
float *TT, bool sphcoord,
46-
int rfgfac, int rfgn);
47+
int rfgfac, int rfgn, bool printbar);
4748

4849

4950
/**
@@ -61,6 +62,7 @@ void FastMarching(
6162
* @param FMM_stat (out)记录每个节点的状态(alive, close, far)
6263
* @param sphcoord (in)是否使用球坐标
6364
* @param edgeStop (in)是否在波前传播到6个边界面时提前结束计算
65+
* @param printbar (in)是否打印进度条
6466
* @param FMM_data (inout)堆首指针
6567
* @param psize (inout)堆大小,会被调整大小
6668
* @param pcap (inout)堆最大容量,视情况会被调整大小
@@ -73,7 +75,7 @@ HEAP_DATA * FastMarching_with_initial(
7375
const double *ts, int nt,
7476
const double *ps, int np,
7577
int maxodr, const float *Slw, float *TT,
76-
char *FMM_stat, bool sphcoord, bool *edgeStop,
78+
char *FMM_stat, bool sphcoord, bool *edgeStop, bool printbar,
7779
HEAP_DATA *FMM_data, int *psize, int *pcap, int *NroIdx, int *pNdots);
7880

7981

@@ -133,6 +135,7 @@ HEAP_DATA * init_source_TT(
133135
* @param sphcoord (in)是否使用球坐标
134136
* @param rfgfac (in)对于源点附近的格点间加密倍数,>1
135137
* @param rfgn (in)对于源点附近的格点间加密处理的辐射半径,>=1
138+
* @param printbar (in)是否打印进度条
136139
* @param FMM_data (inout)堆首指针
137140
* @param psize (inout)堆大小,会被调整大小
138141
* @param pcap (inout)堆最大容量,视情况会被调整大小
@@ -149,6 +152,7 @@ HEAP_DATA * init_source_TT_refinegrid(
149152
int maxodr, const float *Slw, float *TT,
150153
char *FMM_stat, bool sphcoord,
151154
int rfgfac, int rfgn, // refine grid factor and number of grids
155+
bool printbar,
152156
HEAP_DATA *FMM_data, int *psize, int *pcap, int *NroIdx, int *pNdots);
153157

154158

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/**
2+
* @file progressbar.h
3+
* @author Zhu Dengda ([email protected])
4+
* @date 2024-07
5+
*
6+
* 以下代码实现进度条的输出
7+
*
8+
*/
9+
10+
11+
/**
12+
* 定义进度条的长度
13+
*/
14+
#define _PROGRESSBAR_WIDTH_ 45
15+
16+
17+
/**
18+
* 根据百分比打印进度条
19+
*
20+
* @param prefix (in)进度条前缀字符串
21+
* @param percentage (in)百分比(整数)
22+
*/
23+
void printprogressBar(const char *prefix, int percentage);

pyfmm/C_extension/lib/libfmm.so

8.45 KB
Binary file not shown.

pyfmm/C_extension/src/fmm.c

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
#include <assert.h>
1313
#include <stddef.h>
1414
#include <unistd.h>
15+
#include <sys/time.h>
16+
1517

1618
#include "interp.h"
1719
#include "query.h"
@@ -20,6 +22,7 @@
2022
#include "diff.h"
2123
#include "heapsort.h"
2224
#include "index.h"
25+
#include "progressbar.h"
2326
#include "fmm.h"
2427

2528

@@ -31,8 +34,12 @@ void FastMarching(
3134
double rr, double tt, double pp,
3235
int maxodr, const float *Slw,
3336
float *TT, bool sphcoord,
34-
int rfgfac, int rfgn)
37+
int rfgfac, int rfgn, bool printbar)
3538
{
39+
// 程序运行开始时间
40+
struct timeval begin_t;
41+
gettimeofday(&begin_t, NULL);
42+
3643
int ntp=nt*np;
3744
int nrtp=nr*ntp;
3845
int Ndots=nrtp;
@@ -71,7 +78,7 @@ void FastMarching(
7178
rr, tt, pp,
7279
maxodr, Slw, TT,
7380
FMM_stat, sphcoord,
74-
rfgfac, rfgn,
81+
rfgfac, rfgn, printbar,
7582
FMM_data, psize, pcap, NroIdx, &Ndots);
7683
} else {
7784
FMM_data = init_source_TT(
@@ -90,13 +97,20 @@ void FastMarching(
9097
ts, nt,
9198
ps, np,
9299
maxodr, Slw, TT,
93-
FMM_stat, sphcoord, NULL,
100+
FMM_stat, sphcoord, NULL, printbar,
94101
FMM_data, psize, pcap, NroIdx, &Ndots);
95102

96103
// printf("done, Ndots=%d, size=%d\n", Ndots, *psize);
97104
free(FMM_data);
98105
free(FMM_stat);
99106
free(NroIdx);
107+
108+
109+
// 程序运行结束时间
110+
struct timeval end_t;
111+
gettimeofday(&end_t, NULL);
112+
if(printbar) printf("Runtime: %.3f s\n", (end_t.tv_sec - begin_t.tv_sec) + (end_t.tv_usec - begin_t.tv_usec) / 1e6);
113+
fflush(stdout);
100114
}
101115

102116

@@ -107,7 +121,7 @@ HEAP_DATA * FastMarching_with_initial(
107121
const double *ts, int nt,
108122
const double *ps, int np,
109123
int maxodr, const float *Slw, float *TT,
110-
char *FMM_stat, bool sphcoord, bool *edgeStop,
124+
char *FMM_stat, bool sphcoord, bool *edgeStop, bool printbar,
111125
HEAP_DATA *FMM_data, int *psize, int *pcap, int *NroIdx, int *pNdots)
112126
{
113127
double dr = (nr>1)? rs[1] - rs[0] : 0.0;
@@ -141,6 +155,10 @@ HEAP_DATA * FastMarching_with_initial(
141155
float *pt;
142156
char *pstat;
143157

158+
// 打印进度条时每隔print_interv打印一次
159+
int size_bak = nr*ntp;
160+
int last_barpercent = 0, barpercent;
161+
144162
// printf("loop start, size=%d\n", *psize );
145163
char travt_stat;
146164
float maxtravt=-999;
@@ -247,14 +265,22 @@ HEAP_DATA * FastMarching_with_initial(
247265
newdata= idx;
248266
FMM_data = HeapPush(FMM_data, psize, pcap, newdata, NroIdx, TT);
249267
*pstat = FMM_CLS;
250-
(pNdots)--;
268+
(*pNdots)--;
251269
}
252270

253271
}
254272
// print_FMM_HEAP(FMM_data, *psize, nr, nt, np, NroIdx, TT, gTr, gTt, gTp);
255273

256274
}
257275

276+
277+
// 打印进度条
278+
barpercent = 100 - (*pNdots*100) / size_bak;
279+
if(printbar && barpercent != last_barpercent){
280+
printprogressBar("Fast Marching... ", barpercent);
281+
last_barpercent = barpercent;
282+
}
283+
258284
}
259285

260286

@@ -436,6 +462,7 @@ HEAP_DATA * init_source_TT_refinegrid(
436462
int maxodr, const float *Slw, float *TT,
437463
char *FMM_stat, bool sphcoord,
438464
int rfgfac, int rfgn, // refine grid factor and number of grids
465+
bool printbar,
439466
HEAP_DATA *FMM_data, int *psize, int *pcap, int *NroIdx, int *pNdots)
440467
{
441468
double dr = (nr>1)? rs[1] - rs[0] : 0.0;
@@ -546,7 +573,7 @@ HEAP_DATA * init_source_TT_refinegrid(
546573
rfg_ts, rfg_nt,
547574
rfg_ps, rfg_np,
548575
maxodr, rfg_Slw, rfg_TT,
549-
rfg_FMM_stat, sphcoord, edgeStop, // break loop in advance
576+
rfg_FMM_stat, sphcoord, edgeStop, printbar, // break loop in advance
550577
rfg_FMM_data, prfg_size, prfg_cap, rfg_NroIdx, &rfg_Ndots);
551578

552579
// record result to main TT
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/**
2+
* @file progressbar.c
3+
* @author Zhu Dengda ([email protected])
4+
* @date 2024-07
5+
*
6+
* 以下代码实现进度条的输出
7+
*
8+
*/
9+
10+
#include <stdio.h>
11+
12+
#include "progressbar.h"
13+
14+
15+
void printprogressBar(const char *prefix, int percentage) {
16+
printf("\r\033[K"); // 移动到行首并清空行
17+
if(prefix!=NULL) printf("%s", prefix);
18+
printf("[");
19+
int pos = _PROGRESSBAR_WIDTH_ * percentage / 100;
20+
for (int i = 0; i < _PROGRESSBAR_WIDTH_; ++i) {
21+
if (i < pos) printf("=");
22+
else if (i == pos) printf(">");
23+
else printf(" ");
24+
}
25+
printf("] %d %%", percentage);
26+
if(percentage==100){
27+
printf("\n");
28+
}
29+
fflush(stdout);
30+
}

pyfmm/c_interfaces.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
c_double, c_double, c_double,
3737
c_int, PFLOAT,
3838
PFLOAT, c_bool,
39-
c_int, c_int
39+
c_int, c_int, c_bool
4040
]
4141

4242

pyfmm/traveltime.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
def travel_time_source(
1919
srcloc:list,
2020
xarr:np.ndarray, yarr:np.ndarray, zarr:np.ndarray, slw:np.ndarray,
21-
maxodr:int=2, sphcoord:bool=False, rfgfac:int=0, rfgn:int=0):
21+
maxodr:int=2, sphcoord:bool=False, rfgfac:int=0, rfgn:int=0, printbar:bool=False):
2222
r'''
2323
给定源点坐标,计算全局走时场
2424
@@ -33,6 +33,7 @@ def travel_time_source(
3333
:param sphcoord: 是否为球坐标系
3434
:param rfgfac: 对于源点附近的格点间加密倍数,>1
3535
:param rfgn: 对于源点附近的格点间加密处理的辐射半径,>=1
36+
:param printbar: 是否打印进度条
3637
3738
:return: 三维走时场
3839
'''
@@ -67,7 +68,7 @@ def travel_time_source(
6768
xx, yy, zz,
6869
maxodr, c_slw,
6970
c_TT, sphcoord,
70-
rfgfac, rfgn
71+
rfgfac, rfgn, printbar
7172
)
7273

7374
return TT
@@ -77,7 +78,7 @@ def travel_time_source(
7778
def travel_time_iniTT(
7879
iniTT:np.ndarray,
7980
xarr:np.ndarray, yarr:np.ndarray, zarr:np.ndarray, slw:np.ndarray,
80-
maxodr:int=2, sphcoord:bool=False):
81+
maxodr:int=2, sphcoord:bool=False, printbar:bool=False):
8182
r'''
8283
给定走时场初始状态,计算全局走时场
8384
@@ -90,6 +91,7 @@ def travel_time_iniTT(
9091
:param slw: 形状为(nx, ny, nz)的三维慢度场
9192
:param maxodr: 使用的最大差分阶数, 1 or 2 or 3
9293
:param sphcoord: 是否为球坐标系
94+
:param printbar: 是否打印进度条
9395
9496
:return: 三维走时场
9597
'''
@@ -112,7 +114,7 @@ def travel_time_iniTT(
112114
0.0, 0.0, 0.0,
113115
maxodr, c_slw,
114116
c_TT, sphcoord,
115-
0, 0
117+
0, 0, printbar
116118
)
117119

118120
return TT_ravel.reshape(iniTT.shape)

0 commit comments

Comments
 (0)