openfoam 流向做空间平均
-
@氕氘-川
提供一个思路:cat U.csv | cut -d ',' -f1,4 | awk -F ',' '{a[$2] += $1}END{for (i in a) print i, a[i]/101}' | sort -k -n > result.dat
解释:这个命令只适合用于完全结构化的网格,在运行之前,先把面的数据在paraview 里面用 save data 保存为 csv 格式,得到比如
U.csv
文件,文件的格式大概会是这样:"U:0","U:1","U:2","Points:0","Points:1","Points:2" -1.4689,3.6702e-06,0.050816,0.48,-2.0363e-18,0 -1.4798,-1.5563e-05,0.053272,0.484,-2.0363e-18,0 -1.4552,-1.7582e-06,0.047285,0.476,-2.0363e-18,0 -1.4735,-3.2403e-05,0.054114,0.48572,-2.0363e-18,0 -1.4647,-3.2213e-05,0.054475,0.488,-2.0363e-18,0 -1.4418,-2.5745e-05,0.043431,0.472,-2.0363e-18,0 -1.4301,-3.9025e-05,0.039604,0.468,-2.0363e-18,0 -1.343,-4.6674e-06,0.053974,0.428,-4.1301e-18,0
6 列分别是 Ux Uy Uz,x,y,z。
命令是用shell管道来写的,
cut -d ',' -f1,4
表示提取 U.csv 的第1列和第4列,列的分隔符由 -d 选项决定,这里是,
。 然后重头戏是 awk 部分,刚才提到,cut 命令把 csv 文件的第1列和第4列提取出来了,得到了一个新的有两列的数据,第1列是 Ux,第2列是 x,所以a[$2] += $1
表示创建一个数组 a,然后把第2列(也就是x)相同的第1列的值(Ux)加在一起,通过这种方式,就实现了x方向上的 Ux 的叠加。再后面,print i, a[i]/101
里面的 i 代表 x 的值,a[i] 是每个 x 对应的相同 x 坐标下的所有 Ux 的叠加值,101 这个数字代表x 方向上的格点数量,所以 a[i]/101 就是 Ux 在 x 方向的平均值了。101 这个数值需要根据实际情况来修改。
最后的 sort 是一个排序,把最终得到的数据按照x从小到大的顺序排序。写了这么多,其实最重要的就是理解导出来的 csv 数据的结构,只要明白了里面的结构,就有很多方法可以写出来简单的沿某个方向计算平均的小程序了。