使用特殊技巧并行化 reconstructPar OpenFOAM 结果
通过参悟 OpenFOAM 中的并行编译方法:
我们实现了并行化的 reconstructPar
:
thread_num=6 # 定义最大线程数 timeList=`foamListTimes -processor` for time in $timeList; do joblist=($(jobs -p)) while ((${#joblist[*]} >= "$thread_num" )) do # When the job limit is reached wait for a job to finish wait -n joblist=($(jobs -p)) done reconstructPar -time $time >log.$time& done
上述代码即可实现 6 个线程同时 reconstructPar
!
如果你使用了 collated fileHandler
,官方的 foamListTimes 只有更新到了这个才支持:commit a7f185eec200791fc0bd9fa7f0b60bce90c1f3ef in OpenFOAM-dev。 目前的 OpenFOAM-8 尚不支持。 为了在低版本 OpenFOAM 中使用,我把它放在了 GitHub 上:ZYfoamListTimes ,可以自行下载编译。 使用时只需将上述命令中的 foamListTimes 改为 ZYfoamListTimes 即可。
实际使用中,我发现有一个超算的 wait 竟然不支持 -n,可以使用下面的替代方案。
之前还尝试了另一种方法,也记录在下面:
thread_num=6 # 定义最大线程数 tmp_fifofile="./$$.fifo" mkfifo $tmp_fifofile exec 6<>$tmp_fifofile rm $tmp_fifofile for ((i=0;i<${thread_num};i++));do echo done >&6 timeList=`foamListTimes -processor` for time in $timeList; do read -u6 { reconstructPar -time $time echo >&6 } & done wait exec 6>&-
下面还提供一种方法(来自博主的一位师兄徐磊磊),无须使用 ZYfoamListTimes,并且还支持忽略已经合并了的时刻。
thread_num=6 # 定义最大线程数 ls -l |grep ^d | awk '{print $NF}' >oldTimes # 获取已经合并了的时刻 cd processor* ls -l |grep ^d | awk '{print $NF}' >../newTimes # 获取分块的所有时刻 cd .. reconList=`grep -wxvf oldTimes newTimes` # 获得尚未合并的时刻 i=0 for time in $reconList;do i=$(($i+1)) reconstructPar -time $time & if [ "$i" -eq "$thread_num" ];then # 如果 i 达到线程上限了,则 wait,直到上面的命令都结束,然后重新对 i 计数 wait i=0 fi done