Fortran:离开子程序时清除已定义的数组

时间:2011-08-04 12:49:04

标签: arrays fortran

我正在进行灵敏度分析,因此需要使用不同的参数多次运行我的程序。 我有一个主程序调用子程序来计算我需要的值。因此,我需要多次调用子程序。

子程序有一些数组定义为:

real,dimension(1000):: array_1,array_2

离开数组后,程序没有释放数组,因此需要编写两次函数调用:

real,dimension(2000):: array_1,array_2

这有一个简单的解决方案吗? 谢谢

2 个答案:

答案 0 :(得分:1)

让我重申你的问题,只是为了确保我理解正确;如果我错了,请纠正我。

  1. 您有一个子程序,可以在两个独立的数组中计算1000个值:array_1和array_2。
  2. 从主程序中,您想多次调用此子程序,每次生成一组1000个唯一值。
  3. 假设您要调用子程序N次,是否要比较子程序外的N组数字,即在主程序中,或者您想在子程序中进行比较?

    无论哪种方式,我都声明这样的数组:

    real, dimension(N,1000) :: array_1, array_2
    

    如果您想在子程序之外进行比较,您将在主程序中进行上述声明。然后你将调用子程序N次,并在每次第i次将值复制到main的array_1(i,*)和array_2(i,*)之后。在这种情况下,子例程只会像这样定义数组:

    real, dimension(1000) :: array_1, array_2
    

    每次调用子例程时,它都会重用这些数组,覆盖以前的值。如果您在主数组中记录了先前的值,那么这应该没问题。

    如果您在f90中执行此操作,则可以动态分配array_1和array_2,并让N为可变长度。或者,您可以最初为数组分配足够的空间来存储对子例程的所有可能调用。假设您不会对子程序运行超过100次调用:

    real array_1(100,1000), array_2(100,1000)
    

    如果这不是您想要的,我很抱歉,但请澄清我是否错过了解您的问题。

答案 1 :(得分:1)

如果您有许多阵列具有基本相同的数据,那么将它们命名为array,array_1,array_2等将很快变得尴尬,正如您已经意识到的那样。另外两种可能的设计是:1)使用一个数组并在循环中处理数据。处理完一组数据后,读入下一组并覆盖同一阵列中的先前数据。 2)使用@Yann建议的二维数组,第二维是数据集的数量/不同的参数值集。

如果每个数据集的数组具有不同的长度,对于解决方案1,您可以声明数组“可分配”并在每次迭代开始时将其分配到正确的长度,然后在每次迭代结束时解除分配。对于2,将长度设置为最大长度并且具有指定使用长度的辅助数组可能是最简单的(但不是大多数存储器效率)。

P.S。这些数组是子程序的本地吗?然后,如果要将长度作为参数传递给子例程,例如“len”,则可以将数组声明为:

integer, intent (in) :: len
real, dimension(len) :: array_1, array_2

,当使用特定长度“len”重新调用子例程时,将重新创建数组。在过程(子例程或函数)中,如果长度作为参数传递,则可以非常简单地获得可变长度数组。您甚至可以使用应用于数组参数的size函数来获取长度!在主程序中,或者它的长度不是一个过程的常量或参数,那么你可以通过在声明中给它“allocateatable”属性来推迟数组的大小,并使用“allocate”动态分配数组。 “声明。