OpenFOAM 并行 reconstructPar

使用特殊技巧并行化 reconstructPar OpenFOAM 结果

通过参悟 OpenFOAM 中的并行编译方法:

wmake -j 8

我们实现了并行化的 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))
reconstructParMesh -time $time &
if [ "$i" -eq "$thread_num" ];then
# 如果 i 达到线程上限了,则 wait,直到上面的命令都结束,然后重新对 i 计数
wait
i=0
fi
done
文章作者: Yan Zhang
文章链接: https://openfoam.top/parallellyReconstructPar/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 OpenFOAM 成长之路
您的肯定会给我更大动力~