【问题标题】:Fortran Function: best practice when output is related to implicit size inputFortran 函数:输出与隐式大小输入相关时的最佳实践
【发布时间】:2015-03-09 15:08:42
【问题描述】:

例如,我想要一个函数来计算两个矩阵的交换子。我的实现方式是这样的:

   function commutator_dd(MA,MB)
 > result(MC)
   implicit none
   real*8,intent(in)      :: MA(:,:)
   real*8,intent(in)      :: MB(:,:)
   real*8,allocatable     :: MC(:,:)
   real*8,allocatable     :: MP(:,:),MN(:,:)
   integer                :: nn

   nn=size(MA,1)
   allocate(MC(nn,nn),MP(nn,nn),MN(nn,nn))
   MP=MATMUL(MA,MB)
   MN=MATMUL(MB,MA)
   MC=MP-MN
   return;end function

我的一个朋友指出,分配数组而不释放它们可能不是一个好主意。我倾向于同意这一点,但因为在返回 main 之前我无法释放 MC(我认为 fortran 在退出程序后会自动释放它们,但据我记得留下这样的东西并不被认为是一个好习惯)。他建议将 nn 作为函数的输入,并将所有矩阵声明为 M(nn,nn),而不是使用分配(或至少使用 MC),但我有点不喜欢添加不必要的输入的想法。

另一种可能性是声明 MC(size(MA,1),size(MA,1)),但我之前遇到过这种语法的问题(我无法确定到底是什么问题,因为它是通过使用不同的传递变量的方法总是更容易绕过它,但我记得在尝试这样做时会收到编译器的抱怨)。

最好的方法是什么?内在过程(如 matmul)处理这个问题的方式是什么? (我试图用谷歌搜索 matmul 的代码,但我发现肯定没有我想象的那么简单)。

【问题讨论】:

  • 计算完MC后不能释放MP和MN?为什么?
  • 是的,我能做到。问题是 MC。
  • 但是你要退货了。 MC的释放不是调用者的工作吗?
  • 我相信你从功能中恢复的是 MC 的一些句柄,而不是整个 MC 副本。所以调用者必须考虑并取消分配 MC。 MP 和 MN 应在返回之前由被调用方释放
  • 有助于“良好实践”的想法是 Fortran 90(在 Fortran 95 中更改)中围绕自动解除分配的一个功能。我想你不必担心这个?

标签: arrays function fortran dynamic-allocation


【解决方案1】:

我,我只是使用一个自动数组作为返回,像这样

function commutator_dd(MA,MB) result(MC)
   implicit none
   real*8,intent(in)      :: MA(:,:)
   real*8,intent(in)      :: MB(:,:)
   real*8                 :: MC(size(ma,1),size(ma,2))

   MC=MATMUL(MA,MB)-MATMUL(MB,MA)
   return
end function

如果需要,让编译器负责创建临时文件。像您一样,我认为不需要(自 Fortran 90 起)将输入数组的维度包含在参数列表中。当然,这个 sn-p 不会进行错误检查,并且如果输入数组不符合要求,则会不正常地失败。

如果您的编译器确实抱怨MC 的自动调整大小,请反馈;我看不出有什么理由。

【讨论】:

    【解决方案2】:

    @HighPerformanceMark 建议的自动数组(我不确定它是否是函数结果的正确标准术语)是这里的最佳设计选择,但您甚至不必担心可分配数组。

    在现代 Fortran 中,任何内存泄漏都是不可能的,allocatable 是标量或数组,无论是变量还是派生类型组件,等等。内存总是保证自动释放,除非它具有 save 属性(通常用于该目的)。

    在您的情况下,可分配函数结果由调用代码自动释放,而临时数组在子例程完成时自动释放。

    另请注意,在 Fortran 2003 中(无论如何,您都需要可分配函数结果)您可以省略 allocate 语句。数组将在= 分配期间自动分配。

    总结:你很少需要deallocate() 来处理allocatable 的任何事情。您更频繁地将它用于pointer 变量。关于什么是最佳实践——当标准保证正确的行为时,为什么要用不必要的语句来混乱代码?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-09
      • 2011-04-07
      • 2013-01-23
      相关资源
      最近更新 更多