【发布时间】:2019-03-18 03:40:23
【问题描述】:
在一个程序中组织 11 个相似但大小不同的数组的最佳方法是什么,没有 allocatable 属性?
我在想象这样的事情:
TYPE MyType(i)
integer, intent(in) :: i
integer, dimension(i,i) :: A
integer, dimension(2*i,i) :: B
integer, dimension(i,2*i) :: C
end type MyType
然后在主程序中我可以这样声明:
type(mytype), dimension(N) :: Array
其中 'Array' 的第 i 个元素可以访问三个数组 A、B 和 C,并且这三个数组中的每一个都有不同的大小。
我目前遇到的问题是我正在解决一个 QM 问题,我有 11 个不同的数组,它们的大小各不相同,但都依赖于相同的参数(因为大小 A、B 和 C 都取决于 i)。这些数组的实际值也不会改变。
我的程序着眼于不同类型的系统,每个系统都有自己的 A、B 和 C(只是为了保持类比),并且在每个系统中 A、B 和 C 都有唯一的大小。
如果我知道我正在查看 6 种不同类型的系统,我需要 A、B 和 C 的 6 个不同副本。
目前,A、B 和 C 不是派生类型的一部分,而是在每次迭代时可分配和重新计算。对于较大的系统,此计算需要十分之一秒以上。但我的结果平均约为 100,000 次,这意味着这可以节省大量时间。另外,记忆力也不是我欠缺的。
我尝试在另一个程序中计算这些数组并将它们写入文件并在需要时读取它们,但不幸的是这并不比同时重新计算快。
注意:这是我的实际数组的样子:
integer, dimension(:,:), allocatable :: fock_states
integer, dimension(:,:), allocatable :: PES_down, PES_up
integer, dimension(:,:), allocatable :: IPES_down, IPES_up
integer, dimension(:,:), allocatable :: phase_PES_down, phase_PES_up
integer, dimension(:,:), allocatable :: phase_IPES_down, phase_IPES_up
integer, dimension(:,:), allocatable :: msize
integer, dimension(:,:), allocatable :: mblock
每个系统的每个数组都有不同的大小。
编辑:
所以我真正需要的是该编辑上方列表中的 N 个数组副本。属于第 i 个副本的数组具有随 i 缩放的大小(例如 PES_down 具有维度 (i,4**i))。据我了解,这意味着我需要 N 个不同类型的“MyType”变量声明。这通常没问题,但问题是 N 是在编译时定义的,但可以在运行之间更改。
N 确实有一个已定义的最大值,但是当我知道我不会使用这些数组时,它似乎浪费了很多内存。
【问题讨论】:
-
那么,您希望名为 Array 的数组变量具有维度 N,其中 N 来自用户输入?另外,这个数组的每个元素都是带有数组组件的派生类型,其中这些数组的维度与数组中的元素位置成正比?
-
是的,我认为这是准确的。我目前正在按照您在评论中的建议进行操作。我没有做太多的测试,但我的经验是可分配的数组比那些没有的要慢。所以我希望通过在编译时定义它会更快。
标签: arrays fortran allocation derived-types