如何将Fortran FUNCTION / SUBROUTINE在单独的文件中编译成单个MODULE

时间:2017-07-20 19:30:43

标签: fortran include gfortran

通常,当我编写Fortran函数集合时,我将它们放入MODULE这样的代码:

!mystuff.f90
MODULE mymodule
IMPLICIT NONE

CONTAINS

  SUBROUTINE mysubroutine1(a,b)
  !code
  END SUBROUTINE

  SUBROUTINE mysubroutine2(a,b)
  !code
  END SUBROUTINE

  !lots more functions and subroutines

END MODULE

我成功编译了它gfortran -c mystuff.f90。这创建了mystuff.o,我可以在我的主程序中使用它。

但是,我MODULE中的函数/子程序的数量和个别大小变得如此巨大,我真的需要把它拆分成不同的文件。

!mysubrtn1.f90
SUBROUTINE mysubroutine1(a,b)
!code
END SUBROUTINE

! mysubrtn2.f90
SUBROUTINE mysubroutine2(a,b)
!code
END SUBROUTINE

依此类推......

但我仍然希望将所有这些功能保留在 MODULE中。如何告诉编译器编译mysubrtn1.f90mysubrtn2.f90中的函数,...以便在.o文件中生成单个模块?

2 个答案:

答案 0 :(得分:4)

您只需使用include包含另一个Fortran源代码文件:

!mystuff.f90
MODULE mymodule
IMPLICIT NONE

CONTAINS

  include 'mysubrtn1.f90'
  include 'mysubrtn2.f90'

  !lots more functions and subroutines

END MODULE

来自here

  

INCLUDE语句指示编译器停止读取语句   来自包含文件或文本中的当前文件和读取语句

因此,您可以看到生成的模块仍将包含两个子例程。

如果编译器支持预处理器指令,那么实现相同目的的替代方法是使用预处理器指令:

#include "filename"

答案 1 :(得分:2)

为了便于阅读,将大型模块分成更易于管理的块是很好的。每个较小的模块可以单独编译,并用在另一个“主”模块中,然后在主程序中使用。这种方法的主要好处是您可以拥有各种非常通用的模块,并且只选择目前有用的过程/数据。例如:

module mod_1
    implicit none
    subroutine proc_1
        ! ...
    end subroutine
    ! other procedures, etc.
end module mod_1

等等,对于每个单独的模块。然后在一个模块中收集它们。

module collection
    use mod_1, only: proc_1  ! pick & choose what to use
    use mod_2
    use mod_3
    ! ...
end module collection

program main
    use collection
    implicit none
    ! ...
end program main

编译主程序时,您可以链接到每个必需的目标文件,甚至可以将它们组合到一个存档/库中,然后链接到该文件。