如何将假定大小数组从fortran90 / 95传递到fortran77并返回?

时间:2016-01-26 14:34:52

标签: arrays fortran fortran90 fortran77

我正在开展一个项目,其中数值模拟程序的结果将被优化以适应测量的行为。我编写了一些自由形式的Fortran例程来提取特定数据并执行一些初步计算,这些工作正常。出于优化目的,我计划使用此处提供的本地搜索算法:http://mat.uc.pt/~zhang/software.html#bobyqa

我将一些参数(如维度和参数向量)传递给Fortran 77例程,问题是,传输的参数数组不会到达另一端。只有第一个元素才会显示在维度为1的数组中。

我在How to use Fortran 77 subroutines in Fortran 90/95?中找到了一些有用的答案,并尝试在模块中包含所有77个代码,但我仍然没有完成它。 显式接口有助于将所有变量都放入level1 f77子例程中,但是当将东西传递给另一个(level2)时,假设要构造假定的大小数组,则生成一维数组。

我首先使用ifort -c -fixed(并尝试-f77rtl)编译f77代码,然后使用f90并将它们全部链接在一起。

为什么假设的大小数组没有正确生成?供应商提供的测试程序运行良好!

如何在不使用显式接口的情况下以定义的方式传递所有需要的数据?或者有没有办法定义合适的接口?

这里有一些示例代码:

  program main_f90
     use types
     implicit none
     real(dp) :: array(N)

     interface 
        subroutine sub77_level1(array)
           implicit real*8 (a-h,o-z)
           real*8, intent(inout) :: array
           dimension array(:)
        end subroutine
     end interface

     [...fill array...]
     call sub77_level1(array)
  end


  subroutine sub77_level1(array)
     implicit real*8 (a-h,o-z)
     integer i1, i2, i3, i4
     dimension array(:)

     [...modify array...]

     call sub77_level2(array(i1), array(i2), array(i3), i4)
     return
  end


  subroutine sub77_level2(array_1, array_2, array_3, i4)
     implicit real*8 (a-h,o-z)
     dimension array_1(*) array_2(*) array_3( i4, * )

     [...modify...]
     call sub_f90( <some other arrays, intent(in / out)> )

     return
  end

0 个答案:

没有答案