【发布时间】:2013-08-23 12:23:29
【问题描述】:
我有一些可分配的数组,需要在一些子程序之间共享。我通常会将它们作为参数传递,或者将所有内容都写在一个模块中,但恐怕这在我的情况下是不可能的。
我只编写一些自己的子程序,并使用 FEM-Solver 提供和描述的子程序。所以我不能改变这个子程序的参数或将它们包装在一个模块中。
据我所知,在编译时也无法构建具有未知大小数组的公共块。
还有其他东西可以传递我的数组吗?
更新:
目前我的程序环境是这样的:
我有一个由 FEM 程序提供的子程序,它在每次增量后被调用,这会调用我的几个子程序,在这些子程序中我为每个节点或其中的一个子集计算一些值。
为了在后期模拟中显示这些值,我必须将它们传递给另一个子程序。该子程序由 FEM 求解器在增量结束时为每个节点调用。所以将我的代码转移到这个子程序会产生很多开销。
我的想法是计算一次值,将值存储在一个数组中,然后将该数组传递给第二个子程序,在那里它们将被写入计算的数据库。
更新
一些伪代码:
从程序行为假设:
Program FEM-solver
*magic*
call ENDINC(ar1,ar2)
*something*
do NodeID=1,Sum_Of_Nodes
do valueID=1,Sum_Of_User_Computed_Values !(defined in preprocessing)
call nodeval(NodeID,valueID,Value,ar3,...,arN)
end do
end do
*voodoo*
end program FEM-solver
书面和工作:
Subroutine ENDINC(ar1,ar2)
*Computation of some node values*
*Calling of own Subroutines, which compute more values*
*Writing an array with results values for some/each node(s)*
nodersltArr(NodeID,rslt)=*some Value*
end Subroutine ENDINC
需要,将计算的值写入节点解决方案数据库:
Subroutine nodeval(NodeID,valueID,Value,ar3,...,arN)
*called for each NodeID and valueID*
value=noderslArr(NodeID,valueID)
end subroutine nodeval
【问题讨论】:
-
你能用pointers吗?
-
我想我可以使用指针,但我对它们没有经验,也不知道如何将它们链接到子例程之外的数组。你能给我更多的细节/一个例子吗?
-
FEM-Programm提供的一些子程序和公共块使用'Cray指针',所以我想我也可以使用指针。
-
你的描述太让我困惑了。也许是一些显示子程序连接和信息流的伪代码?您的一个子例程可以将数据存储在模块数组中,以供您的另一个子例程稍后使用。
-
如果您在程序开始时知道结果值数组的大小,则将该数组作为可分配数组放在模块中。在主程序中分配数组。循环通过您的 FEM 求解器。在计算每个值时,将其作为数组存储在您的一个子例程中。然后当整个计算完成后,你自己的代码的另一部分可以处理结果。您不想修改的 FEM 代码不需要“了解”模块及其阵列。也许你需要一个用户定义的类型而不是一个简单的数组。