以下2幅动画给出的是压力波在二维面上的传播,展示的是声波从左边的单相区(水)传播至右边的两相区(水和空气)的情况。
单相区长度0.015m,两相区长度0.03m;
两相区共1001个气泡,气泡粒径1.5e-4 m;
网格的最小尺度是5e-6 m,即粒径等于30个网格大小;
二维网格数量为400万;
CFL=0.2;
时间步长约6.74e-10s;
共使用937核运行74.2万步,用时约4天。
采用基于可压缩求解的VOF方法,并对两相界面进行重构。时间递进采用4阶Runge–Kutta方法,并采用3阶Osher–Chakravarthy TVD空间离散格式。两相界面通量计算采用精确黎曼解。
计算的主要参数:
相含率α=0.2
粒径D=0.15 mm
Pa
入口处扰动压力的幅度Δp=230 Pa
压力波频率f=10 kHz
以若干plt文件为例介绍paraview后处理。
Part 1 本地文件处理
首先激活start trace,使paraview可以记录鼠标操作并将其转换为python命令。这些命令可用于之后的批处理。
按照默认选项,点击OK即可激活trace。
显示压力云图(以及相含率云图)。注意到此时处理的是第一记录步的流场。
截面
虽然做的是二维计算,但其实结构还是三维的,只不过在z方向上没有做任何计算而已。所以为了分析二维面上的流场,需要截个面出来。
按钮
截完平面以后,继续计算dp。
点击按钮计算
要点:如上图所示,我们现在处理的是刚才所截平面的流场,所以要激活Slice1,并显示其流场(左边的眼睛是亮着的)。顺带着关闭流场Tec-*的显示(眼睛暗了)。
到此我们取得了在某个截面上的的云图。
接下来处理颗粒的显示。
颗粒的显示用相含率标定。但是一般情况下,显示效果图如下:
首先激活Slice1图层。在下图所示的右侧点击按钮调整mapping的基本形式。
选择X ray黑白颜色
接下来在map轴线上点击增加两个点,如图所示。
将相含率区间1e-5到1e-3,以及0.999-0.9999区间的颜色设置为白色(RGB111),区间0.001-0.999设置成黑色(RGB000)。那么颗粒就有如下显示效果了。
隐藏color legend,同时适当调节透明度,方便同时观察两个图层。
同时显示dp与相含率可得到下图:
最后对结果图像输出保存(Save screenshot)
以上介绍的是处理第一个plt文件的情况,对于其余时间序列的文件,直接按下一时刻按钮可自动生成该时刻的图像。
若想保存动画,可以使用菜单上的File>>Save animation
最后我们也可以得到以上一系列操作对应的python命令。
该python文件可以保存并导入。
Macro>>Add new macros
导入之后下次可以重复执行之前的步骤,而不用再操作一遍了。
Part 2 远程文件后处理
上面得到的python文件不但可以在paraview GUI中执行,更重要的是也可以在控制台下执行。对于在远程集群上计算得到的结果,往往数据量巨大。下载到本地再进行处理是一件不经济的事情。往往需要在远程服务器上后处理后,直接将后处理得到的图像或者数据结果下载到本地再进行分析。
那么远程如何进行后处理呢?
需要对python文件稍作修改。
向上滑动阅览
import sys
number=sys.argv[1]
#fileFolder=sys.argv[2]
#outputFolder=sys.argv[3]
#### import thesimple module from the paraview
from paraview.simpleimport *
#### disableautomatic camera reset on 'Show'
paraview.simple._DisableFirstRenderCameraReset()
# create a new'VisItTecplotBinaryReader'
#tec90plt=VisItTecplotBinaryReader(FileName=['E:\\RemoteDir\\Tec-90.plt'])
tec90plt=VisItTecplotBinaryReader(FileName=['./Tec-'+number+'.plt'])
…
# get active view
renderView1 =GetActiveViewOrCreate('RenderView')
# uncommentfollowing to set a specific view size
renderView1.ViewSize= [1627, 810]
…
SaveScreenshot('./p-'+number+'.png', magnification=1, quality=100, view=renderView1)
只需要在之前生成的python文件中增加/修改以下几处:
1 增加import sys,可以从外面调参数到python执行程序中来;
2 变量number是从外部导入的变量,用来指导该python命令处理的是哪个具体数据;
3 renderView1.ViewSize需要设置,该参数会影响到输出图像的分辨率。笔者在这个地方纠结很久,GUI生成的python语句通常会自动把该部分注释掉,从而导致从控制台命令中输出的图像分辨率非常糟糕;
4 修改SaveScreenshot命令中的保存文件的路径名称,以及图像的大小(通过magnification调整)。
修改好python执行程序以后(假设文件名pv.py)
到控制台下执行如下命令:
pvbatch --use-offscreen-rendering ./pv.py 90
即可进行图像的输出(其中90代表处理的是当前目录下的文件Tec-90.plt)。
若要处理若干plt文件,可采用shell脚本处理99个plt文件:
for i in `seq 1 99`
do
pvbatch --use-offscreen-rendering ./pv.py $i
done
其中--use-offscreen-rendering是在paraview 5.4版本之前采用,最新的5.6版本使用如下语句:
--force-offscreen-rendering