本文介绍使用cat和grep等命令构造脚本,提取log文件中的信息,方便CFD的后处理。一般来说,OpenFOAM都有自带的后处理功能,如controlDict中的functions,以及postProcess指令,里面包含了非常之多的后处理功能。但是,在一些情况下,如果求解器在终端中就能输出我们所需要的的信息,而特地编写functionObject库又太过于费时费力,那么就可以通过cat等指令来抓取求解器输出的log文件(一般在solver后面加 > log.solver)中特定的信息,形成对应的文档。这样,就不必费心编写多余的程序,也能满足需要了。
本文用到的素材是动网格-涡激振动的log.pimpleFoam文件。刚好,圆柱的位移、速度等信息OpenFOAM似乎都没有对应的后处理功能来输出。因此,用cat和grep命令对特定的位移,速度信息进行提取,并按后处理软件如tecplot的格式进行保存。需要抓取的信息如下:
Time = 0.2573
Restraint verticalSpring: attachmentPt - anchor (0.000478047 1.13871e-06 0) spring length 0.000478049 force (-0.00108565 -2.586e-06 -0)
6-DoF rigid body motion
Centre of rotation: (0.000478047 1.13871e-06 0)
Centre of mass: (0.000478047 1.13871e-06 0)
Orientation: (1 0 0 0 1 0 0 0 1)
Linear velocity: (0.00861405 -5.38938e-05 0)
Angular velocity: (0 0 0)
其中,需要抓取的是时间(Time后面的数字)、质心(mass后面的数字)以及质心速度(Linear velocity后面的数字)。下面直接放脚本makeFiles:
cat log | grep 'Time =' | cut -d' ' -f3 > time
cat log | grep 'of mass' | cut -d' ' -f8 | tr -d '(' > xcenter
cat log | grep 'of mass' | cut -d' ' -f9 > ycenter
cat log | grep 'of mass' | cut -d' ' -f10 | tr -d ')' > zcenter
cat log | grep 'Linear' | cut -d' ' -f7 | tr -d '(' > vx
cat log | grep 'Linear' | cut -d' ' -f8 > vy
cat log | grep 'Linear' | cut -d' ' -f9 | tr -d ')' > vz
paste time xcenter ycenter zcenter vx vy vz > plotfile
rm time v* *center
在终端输入./makeFiles,得到plotfile文件:
0.2573 0.000478047 1.13871e-06 0 0.00861405 -5.38938e-05 0
对应Time,质心位置x、y、z以及质心速度u、v、w。下面详细讲解脚本上每一个符号的作用。
cat log
是linux的一个命令,全称是concatenate(连接),用于连接文件并打印到标准输出设备上。cat的一个用法就是把一个文件的内容复制到另一个文件中去:
cat file1 > file2
但是,我们要用的是部分需要提取的信息,为此,将读到的文本作为输入,传递到下一个指令中(管道符和管道命令)进行再次加工。
grep
grep是其中一类管道命令,作用是选取。其本身在linux中也是常用的指令,用于查找文本中符合条件的字符串。如首行grep 'Time ='就是抓取包含字样的所有行。
cut -df
Linux cut命令用于显示每行从开头算起 num1 到 num2 的文字。-d表示自定义分隔符,默认为制表符。-f与d一起使用,指定显示哪个域。如此 -d ' ' 表示将分隔符定义为空格,-f3表示取第3个域,也就是Time(1) =(2) 0.2573(3),提取到了0.2573这个数字域。这和excel的分隔功能有点类似。这需要观察该行数据的结构。如果需要批量抓取的话,这些信息基本上结构都是一致的,找到位置就好。
tr -d
Linux tr命令用于转换或者删除文件中的字符。-d表示删除字符串中定义的字符。如这一行:
Centre of mass: (0.000478047 1.13871e-06 0)
我们用cut -d ' ' -f8来抓到(0.000478047这个域的字符串。为什么是第八个?因为在Centre之前有4个空格,-f5才是Centre,然后6号是of,7号是mass,再到8号才是(0.000478047。这时,‘(’是不需要的,会影响后处理软件读取。tr -d '(' 帮我们将这个字符串中的左括号去掉了,只输出数字。
暂无评论内容