다음과 같은 로그 파일이 있습니다.
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|tr
gnuplot 부분을 약간 단순화할 수 있습니다. 왜냐하면 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,\
...