创建一个接受不同种类的实例的子程序

时间:2014-03-31 15:06:06

标签: fortran fortran95

我想实现一个子程序,它可以使用单精度,双精度和扩展精度的实数。我能想出的唯一解决方案如下面的代码所示。这个解决方案有效但我必须复制代码3次。可以避免此代码重复吗?

module mymodule
    ....
    ! some code here

    interface my_func
         module procedure my_func_sp
         module procedure my_func dp
         module procedure my_func_ep
    end interface

contains
    subroutine my_func_sp(x,y)
         real(kind=sp), dimension(:) :: x,y

         ... LONG IMPLEMENTATION HERE ...

    end subroutine

    subroutine my_func_dp(x,y)
         real(kind=dp), dimension(:) :: x,y

         ... LONG IMPLEMENTATION HERE THAT IS EXACTLY THE SAME AS ABOVE ...

    end subroutine


    subroutine my_func_ep(x,y)
         real(kind=ep), dimension(:) :: x,y

         ... LONG IMPLEMENTATION HERE THAT IS EXACTLY THE SAME AS THE TWO ABOVE ...

    end subroutine
end module

2 个答案:

答案 0 :(得分:6)

可以避免这些代码重复吗?不是真的,这是Fortran的工作方式。你可以:

  1. 编写一次代码,以获得您关注的最高精度类型,并让其他子程序调用该变量,在进出的路上投射各种变量。
  2. 我经常看到的另一种方法是将计算语句写入文件中,并将include文件写入每个子程序中。请注意包含的语句对各种类型都有效。还要注意相同的陈述可以跨越各种类型。例如,如果您包含的行包括与容差的比较,就像许多数字代码一样,您可能需要特别注意公差的调整 wrt 那种。

答案 1 :(得分:0)

如果整个代码将使用单精度,双精度或四重精度实数,则可以在模块中定义参数real_kind,并使用该参数指定整个代码中的种类,包括子程序中实变量的声明。如果您的代码在一次运行中调用多个my_func_sp,my_func_dp和my_func_ep,则此解决方案不起作用。