gnuplot에서 bash 출력을 변수로 사용하는 방법은 무엇입니까? OpenFOAM 로그 예시

gnuplot에서 bash 출력을 변수로 사용하는 방법은 무엇입니까? OpenFOAM 로그 예시

다음과 같은 로그 파일이 있습니다.

    Starting time loop

Courant Number mean: 0 max: 0
deltaT = 0.0012
Time = 0.0012

DILUPBiCGStab:  Solving for Ux, Initial residual = 1, Final residual = 4.8276e-08, No Iterations 1
DILUPBiCGStab:  Solving for Uy, Initial residual = 1, Final residual = 2.23172e-07, No Iterations 1
DILUPBiCGStab:  Solving for Uz, Initial residual = 1, Final residual = 2.80701e-08, No Iterations 1
DILUPBiCGStab:  Solving for T, Initial residual = 0.999922, Final residual = 4.3295e-07, No Iterations 1
DICPCG:  Solving for p_rgh, Initial residual = 1, Final residual = 0.00904671, No Iterations 163
time step continuity errors : sum local = 8.39133e-07, global = -8.63793e-09, cumulative = -8.63793e-09
DILUPBiCGStab:  Solving for epsilon, Initial residual = 0.00291157, Final residual = 2.1992e-06, No Iterations 1
DILUPBiCGStab:  Solving for k, Initial residual = 1, Final residual = 0.00101111, No Iterations 1
ExecutionTime = 2.53 s  ClockTime = 3 s

Courant Number mean: 0.00447015 max: 0.356735
deltaT = 0.00143547
Time = 0.00263547

DILUPBiCGStab:  Solving for Ux, Initial residual = 0.334632, Final residual = 3.26106e-05, No Iterations 1
DILUPBiCGStab:  Solving for Uy, Initial residual = 0.325756, Final residual = 1.62512e-05, No Iterations 1
DILUPBiCGStab:  Solving for Uz, Initial residual = 0.379719, Final residual = 2.45476e-05, No Iterations 1
DILUPBiCGStab:  Solving for T, Initial residual = 0.110323, Final residual = 1.51228e-05, No Iterations 1
DICPCG:  Solving for p_rgh, Initial residual = 0.135502, Final residual = 0.00128893, No Iterations 152
time step continuity errors : sum local = 3.78267e-06, global = 5.94272e-08, cumulative = 5.07892e-08
DILUPBiCGStab:  Solving for epsilon, Initial residual = 0.0132143, Final residual = 9.90056e-06, No Iterations 1
DILUPBiCGStab:  Solving for k, Initial residual = 0.27268, Final residual = 0.000279373, No Iterations 1
ExecutionTime = 3.86 s  ClockTime = 4 s

내 gnuplot 스크립트는 다음과 같습니다.

set terminal png
set output 'res.png'
set logscale y
set title "Residuals"
set ylabel 'Residual'
set xlabel 'Time [s]'
dt = 0.001
plot "< cat log | grep 'Solving for Ux' | cut -d' ' -f9 | tr -d ','" using ($0*dt):1 title 'Ux' with lines,\
"< cat log | grep 'Solving for Uy' | cut -d' ' -f9 | tr -d ','" using ($0*dt):1 title 'Uy' with lines,\
"< cat log | grep 'Solving for Uz' | cut -d' ' -f9 | tr -d ','" using ($0*dt):1 title 'Uz' with lines,\
"< cat log | grep 'Solving for T' | cut -d' ' -f9 | tr -d ','" using ($0*dt):1 title 'T' with lines,\
"< cat log | grep 'Solving for p' | cut -d' ' -f9 | tr -d ','" using ($0*dt):1 title 'p' with lines
set terminal x11
set output
replot
pause 1
reread

기본적으로 "Solved Ux"를 얻은 다음 "초기 잔차"에서 첫 번째 숫자를 얻은 다음 플롯합니다. 각 블록(Courant Number 평균부터 Clocktime까지)은 1회 반복입니다. 실제 시간은 반복 * deltaT입니다. 따라서 첫 번째 반복은 0.0012초이고, 두 번째 반복은 2*0.00143547 = 0.0028초... 등등입니다.

deltaT가 상수인 경우 위의 스크립트처럼 설정하고 플롯할 때 ($0*dt):1을 사용하여 곱할 수 있습니다. 그런 다음 위에서 dt 값을 설정했습니다.

그러나 내 deltaT가 변경되면 이를 코드에 어떻게 반영합니까? 다음 bash 명령을 사용하여 deltaT 값을 얻을 수 있습니다.

cat log | grep -v -e 'ClockTime =' -e 'ExecutionTime = ' -e 'Solving for' -e 'time step' -e 'Courant' -e 'Time' | cut -d' ' -f3 | tr -cd '[:digit:].\n'

하지만 이것을 그릴 변수로 설정하는 방법을 모르겠습니다. 나는 시도했다:

dt = "cat log | grep -v -e 'ClockTime =' -e 'ExecutionTime = ' -e 'Solving for' -e 'time step' -e 'Courant' -e 'Time' | cut -d' ' -f3 | tr -cd '[:digit:].\n'"

하지만 그릴 수는 없습니다. Gnuplot에서는 "파이프 오류"와 같은 오류가 발생합니다.

답변1

cut|trgnuplot 부분을 약간 단순화할 수 있습니다. 왜냐하면 sum 을 거치지 않고도 8열에서 숫자를 찾을 수 있기 때문입니다 cat. 예를 들어,

plot \
"< <log grep 'Solving for Ux'" using ($0*dt):8 title 'Ux' with lines,\

그런 다음 더미 그래프를 만들고 "deltaT"만 검색한 다음 setdt()행 번호 "$0"(행이 0에서 시작하므로 +1)과 열 3의 번호를 사용하여 함수를 호출할 수 있습니다.

plot \
"< <log grep 'deltaT'" using (setdt($0+1,$3)):NaN notitle with lines,\

숫자가 아닌 값을 사용하면 NaN이 데이터를 플롯하는 것을 피할 수 있습니다.

이 함수는 값을 배열에 저장하고 값 0을 반환합니다.

array dt[99]
setdt(row,value) = (dt[row] = row*value,0)

줄 번호로 배열을 인덱싱하여 플롯 명령에서 이러한 값을 사용합니다.

plot \
"< <log grep 'deltaT'"         using (setdt($0+1,$3)):NaN notitle with lines,\
"< <log grep 'Solving for Ux'" using (dt[$0+1]):8 title 'Ux' with lines,\
...

관련 정보