0

我正在对立方体进行热传递模拟,并在立方体的中部使用二维热图绘制随时间的演变。

问题是边,虽然它们代表相同的值,因为它是一个边界条件,但在模拟期间,它们在热图上的厚度不同。

我们可以通过红色的顶部和底部边界(即 373 K)更容易看到这一点。这是使用“Image Viewer”启动的 .gif 热图的屏幕截图:

在此处输入图像描述

我加入了用于绘制热图的数据集:

  x      z       t      T
0.000  0.000  0.000  373.000
0.000  0.005  0.000  298.000
0.000  0.015  0.000  298.000
            ...
0.000  0.985  0.000  298.000
0.000  0.995  0.000  298.000
0.000  1.000  0.000  373.000

            ...
0.015  0.000  0.001  373.000
0.015  0.005  0.001  292.000
0.015  0.015  0.001  283.000
0.015  0.025  0.001  283.000
           ....
0.015  0.985  0.001  283.000
0.015  0.995  0.001  292.000
0.015  1.000  0.001  373.000

           ...

这是 Gnuplot 的 .plt 代码:


set view map scale 1
set size square
set xlabel("x (m)")
set ylabel("z (m)")
set zlabel("T")
set xrange [-0.01:1.01]
set yrange [-0.01:1.01]
set title "Heat transfert 3D at mid depth of a cube"
set cblabel "T (K)"

set hidden3d
set palette rgb 33,13,10 
set cbrange [283:373] # colobar range

set pm3d implicit at s 
set pm3d corners2color max 

set term gif animate delay 100 

set output "para_heat_3D_insta_4_0.gif"

stats "plot_para_heat_3D_insta.dat"

do for [i=1:int(STATS_blocks)]{
    splot "plot_para_heat_3D_insta.dat" index (i-1) using 1:2:4 with pm3d notitle 

}

set output

有人有想法可以帮助我吗?提前致谢。

4

1 回答 1

1

不幸的是,我没有一个好的解决方案。在我看来,这是渲染库的问题,我无法解释。

您可以比较term pngcairoterm gif。看起来 GIF 终端总是使细线具有不同的粗细,而 PNG 看起来要好得多。

作为 GIF 的一种解决方法,我尝试通过 gnuplot 变量GPVAL_...(在 gnuplot 控制台类型中show var GPVAL)以 gif 图像的像素为单位提取“活动绘图区域”。只有在绘图后才能获得这些值。因此,我从第一个图中提取边距gif并相应地设置新gif大小并重新绘制。您的步长0.005应对应于 2 个像素。但是,这仍然不能为 GIF 提供好的结果。新绘图区域的正方形大小应为 402+8 像素,但事实并非如此。我还没弄清楚为什么。对不起,也许其他人有更好的主意。

我对替代解决方法的建议是将所有帧生成为 PNG,然后使用另一个软件将它们组合成动画 GIF。对于 Windows,我过去使用过 ScreenToGif。

代码:

### make the active plot a certain size in pixels
reset session

set view map scale 1
set size square

# create some test data
set print $Data
    M=10; N=200
    do for [x=0:M] for [y=0:N] {
        print sprintf("%g %g %g", real(x)/M, real(y)/N, !(y%N)*273)  # real() to avoid gnuplot's integer division
        if (y==N) { print ""}
    }
set print

set palette rgb 33,13,10
set pm3d corners2color max 
set xrange [-0.01:1.01]
set yrange [-0.01:1.01]
set key noautotitle

SizeX = 640
SizeY = 480
# 201 datapoints, with smallest stepsize 0.005
Factor = 2
DataSizeX = (201  + 4)*Factor   # +4 because of 4 "extra steps", i.e. range [-0.01:1.01]
DataSizeY = (201  + 4)*Factor 

# generate PNG
set term pngcairo size SizeX,SizeY font ",11"
set output "SO70684623.png"
splot $Data u 1:2:3 w pm3d

# generate preliminary GIF 
set term gif size SizeX,SizeY font ",11"
set output "SO70684623.gif"
replot

Tmargin(n)   = GPVAL_TERM_YSIZE-GPVAL_TERM_YMIN
Bmargin(n)   = GPVAL_TERM_YMAX
Rmargin(n)   = GPVAL_TERM_XSIZE-GPVAL_TERM_XMAX
Lmargin(n)   = GPVAL_TERM_XMIN
PlotAreaX(n) = GPVAL_TERM_XMAX-GPVAL_TERM_XMIN
PlotAreaY(n) = GPVAL_TERM_YMIN-GPVAL_TERM_YMAX
SizeXnew(n)  = DataSizeX + Lmargin(0) + Rmargin(0)
SizeYnew(n)  = DataSizeY + Tmargin(0) + Bmargin(0)
print sprintf("New size: %g,%g", SizeXnew(0),SizeYnew(0))

# generate final GIF
set term gif size SizeXnew(0),SizeYnew(0) font ",11"
set output "SO70684623_new.gif"
replot

print sprintf("New active area: %g,%g", PlotAreaX(0), PlotAreaY(0))
set output
### end of code

结果:

SO70684623.png(看起来还可以)

在此处输入图像描述

SO70684623.gif(上下不等红线)

在此处输入图像描述

SO70684623_new.gif(修改大小,没有解决问题)

在此处输入图像描述

于 2022-01-26T13:08:18.083 回答