通常,当我编写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.f90
,mysubrtn2.f90
中的函数,...以便在.o
文件中生成单个模块?
答案 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
编译主程序时,您可以链接到每个必需的目标文件,甚至可以将它们组合到一个存档/库中,然后链接到该文件。