我必须设计和实现一个Fortran例程来确定正方形网格上集群的大小,而且递归编码子例程似乎非常方便。但是,每当我的晶格大小增长到超过某个值(大约200个/边)时,子例程始终会出现分段。下面是我的集群检测例程:
RECURSIVE SUBROUTINE growCluster(lattice, adj, idx, area)
INTEGER, INTENT(INOUT) :: lattice(:), area
INTEGER, INTENT(IN) :: adj(:,:), idx
lattice(idx) = -1
area = area + 1
IF (lattice(adj(1,idx)).GT.0) &
CALL growCluster(lattice,adj,adj(1,idx),area)
IF (lattice(adj(2,idx)).GT.0) &
CALL growCluster(lattice,adj,adj(2,idx),area)
IF (lattice(adj(3,idx)).GT.0) &
CALL growCluster(lattice,adj,adj(3,idx),area)
IF (lattice(adj(4,idx)).GT.0) &
CALL growCluster(lattice,adj,adj(4,idx),area)
END SUBROUTINE growCluster其中adj(1,n)表示站点n的北邻居,adj(2,n)表示西,依此类推。什么会导致不稳定的段错误行为?对于较大的网格尺寸,集群是不是“太大了”?
发布于 2010-04-15 09:16:35
我想你遇到了一个堆栈溢出。如果你的晶格每边超过200个单位,那就是40,000个单位,这意味着你正在递归40,000次。根据您的堆栈大小和堆栈框架大小,您可能很容易耗尽堆栈空间。
为了处理更大的网格,您必须将算法转换为使用较少堆栈空间的算法。Wikipedia提供了一些实现(用伪代码)来说明如何在不破坏堆栈的情况下进行泛洪填充。
发布于 2010-04-15 04:57:50
1)您是否尝试过编译,然后在打开下标范围检查的情况下运行?只是为了确保较大的大小不会暴露出一个bug,即代码跨过数组边界进入非法内存。这是一个简单的检查。
2)重新考虑程序内存不足的可能性:尝试增加每个进程的堆栈大小限制。如何做到这一点取决于操作系统--搜索此处,或者google,或者告诉我们您的操作系统。
https://stackoverflow.com/questions/2640190
复制相似问题