我正致力于openBF的开发,是弹性血管(即动脉)血流的有限体积解算器。在代码中,动脉网络表示为有向图,其也可以包含闭环(吻合)。求解器在从入口节点朝向多个出口节点开始的空间中行进。我的想法是使用多个工人从同一节点(分叉)开始并行处理船只。
这是一个分叉网络的例子 here 节点编号在圆圈中报告,而船只编号在箭头上。虚线分隔可以并行计算的元素组。简单地说,工人解决一个容器的方程和容器末端的节点。在根管的情况下,也解决了入口节点。
我使用@everywhere
,@spawn
和fetch()
并行实现了此功能。这工作正常,是一个玩具示例,这是输出
Inlet vessel #1
Solve vessel #1
Bifurcation at node 2 between vessels 1, 2, and 3
From worker 3: Solve vessel #3
From worker 2: Solve vessel #2
From worker 2: Junction at node 3 between vessels 2 and 4
From worker 4: Solve vessel #4
From worker 3: Junction at node 4 between vessels 3 and 8
From worker 5: Solve vessel #8
From worker 4: Junction at node 5 between vessels 4 and 5
From worker 5: Bifurcation at node 8 between vessels 8, 9, and 12
From worker 5: Solve vessel #5
From worker 4: Solve vessel #9
From worker 8: Solve vessel #12
From worker 8: Bifurcation at node 10 between vessels 12, 13, and 14
From worker 4: Bifurcation at node 9 between vessels 9, 10, and 11
From worker 9: Solve vessel #13
From worker 7: Solve vessel #10
From worker 6: Solve vessel #11
From worker 8: Solve vessel #14
From worker 5: Junction at node 6 between vessels 5 and 7
From worker 9: Outlet vessel #13 - Compute outlet BC
From worker 9: Solve vessel #7
From worker 7: Outlet vessel #10 - Compute outlet BC
From worker 8: Outlet vessel #14 - Compute outlet BC
From worker 6: Outlet vessel #11 - Compute outlet BC
From worker 9: Outlet vessel #7 - Compute outlet BC
当我添加如下闭环时,我的问题就开始了 Here 这里新的船只(6)连接节点4和6,形成到达船只7的捷径。鉴于数学模型的性质,在解决船只5和6之前,我无法解决节点6。
我尝试通过为每个容器添加solved
标志来解决此问题(在实际代码中,容器具有包含各种信息的结构)。 {{3}}是第二个玩具示例。我在solved
标志上添加了一个检查,如果两个会聚血管有solved=1
,则可以解决吻合节点。但是,似乎我的数据结构不在各个工作者之间共享,因为示例输出显示
Inlet vessel #1
Solve vessel #1
Bifurcation at node 2 between vessels 1, 2, and 3
From worker 5: Solve vessel #3
From worker 4: Solve vessel #2
From worker 4: Junction at node 3 between vessels 2 and 4
From worker 8: Solve vessel #4
From worker 5: Bifurcation at node 4 between vessels 3, 6, and 8
From worker 2: Solve vessel #8
From worker 5: Solve vessel #6
From worker 8: Junction at node 5 between vessels 4 and 5
From worker 6: Solve vessel #5
From worker 2: Bifurcation at node 8 between vessels 8, 9, and 12
From worker 4: Solve vessel #9
From worker 5: Converging vessels solved? 0 1
From worker 6: Converging vessels solved? 1 0
From worker 6: Solve vessel #12
From worker 4: Bifurcation at node 9 between vessels 9, 10, and 11
From worker 7: Solve vessel #10
From worker 4: Solve vessel #11
From worker 7: Outlet vessel #10 - Compute outlet BC
From worker 6: Bifurcation at node 10 between vessels 12, 13, and 14
From worker 5: Solve vessel #13
From worker 9: Solve vessel #14
From worker 4: Outlet vessel #11 - Compute outlet BC
From worker 9: Outlet vessel #14 - Compute outlet BC
From worker 5: Outlet vessel #13 - Compute outlet BC
当它显示From worker 5: Converging vessels solved? 0 1
时,代码实际上是为第5和第6号船打印已解决的值(对于以下行也是如此)。
在定义我的结构时,我应该使用SharedArray
而不是宏@everywhere
吗?
非常感谢!