本文介绍OpenFOAM中samping操作基础。
functionObject可以在求解过程中输出指定的物理量信息。当求解计算完毕后,可以选择使用Sampling获取特定位置物理信息,此时主要使用postProcess程序来实现。
利用postProcess进行采样,需要定义采样字典文件,这些文件位于system
路径下,文件可以任意命名。当采样计算完毕后,算例路径中将会新建一个名为postProcessing
的新文件夹,在该文件夹里面包含与字典文件同名的子目录,其中存储了采样获取的结果数据。
下面结合实际算例来进行描述。
如下图所示,算例文件system
文件夹中包含两个字典文件probeDict及sampleDict
,其中定义了取样操作所需的参数。
1、probesDict字典文件
该文件中定义了需要在计算域中进行取样的点。本算例取样点的位置如下图所示。
probesDict文件内容如下所示。
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object probesDict;
}
// * * * * * * * * * * * * * * * * * //
// 指定类型为probes
type probes;
// 指定需要提取的物理场
fields
(
p
U
);
// 取样点的坐标列表
probeLocations
(
(1.0 0 0)
(1.25 0 0)
(1.5 0 0)
(1.75 0 0)
(2.0 0 0)
(2.0 -0.25 0)
(2.0 -0.5 0)
(2.0 0 .25 0)
(2.0 0 .5 0)
);
文件准备完毕后可以使用命令:
postProcess -func probeDict -time 2000
这里指定参数-time 2000
,则只输出2000 s时刻的数据,若不指定此参数,则会每一时刻的数据。
运行完毕后,算例文件夹中的postProcessing路径下会多出一个名为probesDict
的子文件夹,其中包含了2000 s时刻监测点位置的U与p的值。
对于本算例,2000/U
文件中的内容如下所示,列举了所检测的9个点位置的速度分量:
# Probe 0 (1 0 0)
# Probe 1 (1.25 0 0)
# Probe 2 (1.5 0 0)
# Probe 3 (1.75 0 0)
# Probe 4 (2 0 0)
# Probe 5 (2 -0.25 0)
# Probe 6 (2 -0.5 0)
# Probe 7 (2 0.25 0)
# Probe 8 (2 0.5 0)
# Time 0 1 2 3 4 5 6 7 8
2000 (1.0960031 -0.61045141 0) (1.0003352 -0.35057338 1.1984886e-20) (0.99511675 -0.22368641 -1.4884685e-20) (0.99587925 -0.17217799 6.8574687e-21) (0.99434334 -0.13173595 0) (0.85681371 -0.10854681 3.6035834e-20) (0.95135192 -0.1125737 2.353505e-20) (1.0221783 -0.12625997 -1.5616405e-20) (1.041875 -0.12290482 -6.6065831e-20)
文件2000/p
内容如下所示,其列举了9个定位置的压力值:
# Probe 0 (1 0 0)
# Probe 1 (1.25 0 0)
# Probe 2 (1.5 0 0)
# Probe 3 (1.75 0 0)
# Probe 4 (2 0 0)
# Probe 5 (2 -0.25 0)
# Probe 6 (2 -0.5 0)
# Probe 7 (2 0.25 0)
# Probe 8 (2 0.5 0)
# Time 0 1 2 3 4 5 6 7 8
2000 -0.60129439 -0.061042557 -0.020796443 -0.011252459 -0.0028472253 0.020868043 0.041151249 -0.030775763 -0.050775396
2、sampleDict字典文件
该文件定义了一条线,之后对该线上的物理量进行提取。
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object sampleDict;
}
// * * * * * * * * * * * * * * * //
// 指定类型为sets,通常可以为points及lines
type sets;
libs ("libsampling.so");
// 插值方式,可以是cellPoint、cellPointFace、
// cellPointWallModified或cell
interpolationScheme cellPoint;
// 文件存储格式
setFormat raw;
surfaceFormat raw;
// 指定待取样的物理场
// 这里指定了速度与壁面剪切应力
// 本算例中并不能提取到壁面剪切应力
// 物理量不存在也没有关系
fields
(
U
wallShearStress
);
// 定义集合
sets
(
profile0
{
// 指定几何类型为线
type lineCellFace;
axis distance;
// 两个点确定一条线
start ( 0.75150 0.04767 0 );
end ( 0.76168 0.14715 0 );
}
);
/////
// 若不清楚关键字选项,可以使用banana方法
执行以下命令提取数据:
postProcess -func sampleDict –time 2000
命令执行完毕后会在postProcessing文件夹中增加子文件夹sampleDict
,并在其中存储采样数据。
可以使用gnuplot绘制速度分量沿直线长度的分布:
set xlabel 'length(m)'
set ylabel 'velocity(m/s)'
set key outside
plot 'profile0_U.xy' u 1:2 w l lw 2 lc 7 t 'u_x','' u 1:3 w l lw 2 t 'u_y','' u 1:4 w l lw 2 t 'u_z'
如下图所示。
对于选用不同的数据集,其存储的文件形式有所不同。
如点集采样,对于标量场,其文件存储形式为:
#POINT_COORDINATES (X Y Z) SCALAR_VALUE
0 0 0.05 13.310995
0 0 0.1 1 9.263215
...
若为矢量场,则其存储形式为:
#POINT_COORDINATES (X Y Z) VECTOR_COMPONENTS (X Y Z)
0 0 0.05 0 0 13.310995
0 0 0.1 0 0 19.263215
...
若采样集为线,则存储形式为:
#AXIS_COORDINATE SCALAR_VALUE
0 13.310995
0.0015 1 9.263215
...
若为矢量场,则其存储形式为:
#AXIS_COORDINATE VECTOR_COMPONENTS (X Y Z)
0 0 0 13.310995
0.0015 0 0 19.263215
...
若采样的为表面,则存储形式
#POINT_COORDINATES (X Y Z) SCALAR_VALUE
0 0 0.05 13.310995
0 0 0.1 19.263215
...
若为矢量场,则其存储形式为:
#POINT_COORDINATES (X Y Z) VECTOR_COMPONENTS (X Y Z)
0 0 0.05 0 0 13.310995
0 0 0.1 0 0 19.263215
...