Arrays 我是否可以将变量传递给派生类型,以便派生类型的每个实例都可以具有不同长度的数组?

Arrays 我是否可以将变量传递给派生类型,以便派生类型的每个实例都可以具有不同长度的数组?,arrays,fortran,allocation,derived-types,Arrays,Fortran,Allocation,Derived Types,在没有可分配属性的情况下,在程序中组织11个相似但大小不同的数组的最佳方法是什么 我在想象这样的事情: 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

在没有可分配属性的情况下,在程序中组织11个相似但大小不同的数组的最佳方法是什么

我在想象这样的事情:

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
然后在主程序中,我可以声明如下内容:

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
其中,“数组”的第i个元素可以访问三个数组A、B和C,并且这三个数组中的每一个都具有不同的大小

我目前的问题是我正在解决一个QM问题,我有11个不同的数组,它们的大小不同,但都依赖于相同的参数(因为大小a、B和C都依赖于I)。这些数组的实际值也不会改变

我的程序着眼于不同类型的系统,每个系统都有自己的A、B和C(只是为了保持类比),每个系统中A、B和C都有一个独特的大小

如果我知道我在研究6种不同的系统,我需要6种不同的A、B和C

目前,A、B和C不是派生类型的一部分,而是可以在每次迭代中分配和重新计算的。对于较大的系统,此计算需要超过十分之一秒的时间。但我的平均结果约为100000次,这意味着这可以节省大量时间。此外,我并不缺乏记忆力

我尝试在另一个程序中计算这些数组,并将它们写入文件,在需要时读取它们,但不幸的是,这并不比同时重新计算快

注意:以下是我的实际阵列的外观:

  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确实有一个定义的最大值,但当我知道我将不使用数组时,它似乎浪费了大量内存。

我想使用包含
a
B
,的派生类型最简单,使用大小变量
i
C
,并使用一些初始化例程(这里,
MyType_init()
)为每个
i
分配它们

结果(使用gfortran 8.1):

主程序中的
数组(:)
是可分配的,因此

type(MyType), allocatable :: array(:)

N = 6
allocate( array( N ) )
当从输入文件读入
N
时,这可能很有用。此外,我们可以通过更改下面带有
(*)
的行(使用OO样式),从
MyType\u init()
创建一个类型绑定过程

(有关详细说明,请参阅)

正如@roygvib在评论中所说的,是的,在本例中使用参数化派生类型不仅是可能的,而且是完美的匹配。这是PDT要解决的主要问题之一

type :: MyType(i)
  integer, len :: i
  integer, dimension(i,i) :: A
  integer, dimension(2*i,i) :: B
  integer, dimension(i,2*i) :: C
  ! (...)
end type
然后,在主程序中,您可以这样声明对象(其中
i
是当前系统类型的已知长度参数):


但首先,请检查编译器中此功能的可用性。

但我想知道是否可以为此目的使用参数化类型…?您的意思是OP希望在同一数组中存储具有不同类型参数的对象吗?如果是,这是不可能的,因为数组元素必须具有相同的存储大小(形式上,相同的类型和种类)。我不确定,但我认为指针组件是模拟交错数组的唯一方法。这似乎与我要求的完全匹配。不过,我现在意识到,除了我在原始帖子中描述的功能外,我还需要其他功能。我将添加一个编辑来进一步澄清。那么,您希望您的数组变量命名为array,具有维度N,其中N来自用户输入?另外,这个数组的每个元素都是带有数组组件的派生类型,其中这些数组的尺寸与数组中元素的位置成正比?是的,我认为这是准确的。我正在按照你在评论中的建议做这件事。我没有做过很多测试,但我的经验是,可分配阵列比不可分配阵列慢。所以我希望通过在编译时定义它,它会更快。
type :: MyType(i)
  integer, len :: i
  integer, dimension(i,i) :: A
  integer, dimension(2*i,i) :: B
  integer, dimension(i,2*i) :: C
  ! (...)
end type
type(mytype(i)), dimension(N) :: Array