OpenFOAM自己写程序,在只有单核计算时,寻址不会有什么问题。但如果改用并行,就会报错。一种解决办法就是用for循环。
如图,如果用单核串行计算,那么就可以直接寻址anchorCell对应的位置,因为一个核负责的计算域就是全局。但如果用并行计算,每个核都会分走一部分计算域,那么没分到anchorCell所在区域的那个核就会因为找不到地址而报错,这类似于数组溢出。单行代码是会被所有核执行的。一种解决办法就是用for循环来遍历所有cell:
OpenFOAM在for循环的一种机制就是,会自动给各核分配任务。各个核也会开始寻找,如果某个核在其区域找到了,就执行寻址赋值。这样,由并行引起的问题就解决了。一个缺点就是会因为遍历而增加计算量,降低计算效率。
但是这样也许不能很好地解决问题。比如说有4个核并行,那么这样每个核就都会赋值一个anchorNew,在他们自己的计算域里进行计算。要想真的解决这个问题,需要用Pstream库的函数配合自己的需求来改代码。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容