OpenFOAM写代码用并行时出错的一种解决办法

OpenFOAM自己写程序,在只有单核计算时,寻址不会有什么问题。但如果改用并行,就会报错。一种解决办法就是用for循环。

如图,如果用单核串行计算,那么就可以直接寻址anchorCell对应的位置,因为一个核负责的计算域就是全局。但如果用并行计算,每个核都会分走一部分计算域,那么没分到anchorCell所在区域的那个核就会因为找不到地址而报错,这类似于数组溢出。单行代码是会被所有核执行的。一种解决办法就是用for循环来遍历所有cell:

OpenFOAM在for循环的一种机制就是,会自动给各核分配任务。各个核也会开始寻找,如果某个核在其区域找到了,就执行寻址赋值。这样,由并行引起的问题就解决了。一个缺点就是会因为遍历而增加计算量,降低计算效率。

但是这样也许不能很好地解决问题。比如说有4个核并行,那么这样每个核就都会赋值一个anchorNew,在他们自己的计算域里进行计算。要想真的解决这个问题,需要用Pstream库的函数配合自己的需求来改代码。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片