如何将单独文件中的 Fortran FUNCTION/SUBROUTINE 编译成单个模块
How to compile Fortran FUNCTION/SUBROUTINE in separate files into a single MODULE
通常,当我编写一组 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
中 functions/subroutines 的数量和个体大小已经变得如此庞大,我真的需要将其拆分成不同的文件。
!mysubrtn1.f90
SUBROUTINE mysubroutine1(a,b)
!code
END SUBROUTINE
和
! mysubrtn2.f90
SUBROUTINE mysubroutine2(a,b)
!code
END SUBROUTINE
等等...
但我仍然想将所有这些功能保留在一个 单个 MODULE
中。我如何告诉编译器编译 mysubrtn1.f90
、mysubrtn2.f90
中的函数,...以便它在 .o
文件中生成单个模块?
您可以简单地使用 include
来包含另一个 Fortran 源代码文件:
!mystuff.f90
MODULE mymodule
IMPLICIT NONE
CONTAINS
include 'mysubrtn1.f90'
include 'mysubrtn2.f90'
!lots more functions and subroutines
END MODULE
来自here:
The INCLUDE statement directs the compiler to stop reading statements
from the current file and read statements in an included file or text
因此您可以看到生成的模块仍将包含两个子例程。
实现相同目的的替代方法是使用预处理器指令,如果您的编译器支持的话:
#include "filename"
为了可读性,最好将大模块分成更易于管理的块。每个较小的模块都可以单独编译,并在另一个 "master" 模块中使用,然后在主程序中使用。这种方法的主要好处是您可以拥有各种非常通用的模块,并且只选择目前有用的 procedures/data 。例如:
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
编译主程序时,您可以 link 每个必要的目标文件,甚至可以将它们组合成一个 archive/library 并 link 到那个。
通常,当我编写一组 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
中 functions/subroutines 的数量和个体大小已经变得如此庞大,我真的需要将其拆分成不同的文件。
!mysubrtn1.f90
SUBROUTINE mysubroutine1(a,b)
!code
END SUBROUTINE
和
! mysubrtn2.f90
SUBROUTINE mysubroutine2(a,b)
!code
END SUBROUTINE
等等...
但我仍然想将所有这些功能保留在一个 单个 MODULE
中。我如何告诉编译器编译 mysubrtn1.f90
、mysubrtn2.f90
中的函数,...以便它在 .o
文件中生成单个模块?
您可以简单地使用 include
来包含另一个 Fortran 源代码文件:
!mystuff.f90
MODULE mymodule
IMPLICIT NONE
CONTAINS
include 'mysubrtn1.f90'
include 'mysubrtn2.f90'
!lots more functions and subroutines
END MODULE
来自here:
The INCLUDE statement directs the compiler to stop reading statements from the current file and read statements in an included file or text
因此您可以看到生成的模块仍将包含两个子例程。
实现相同目的的替代方法是使用预处理器指令,如果您的编译器支持的话:
#include "filename"
为了可读性,最好将大模块分成更易于管理的块。每个较小的模块都可以单独编译,并在另一个 "master" 模块中使用,然后在主程序中使用。这种方法的主要好处是您可以拥有各种非常通用的模块,并且只选择目前有用的 procedures/data 。例如:
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
编译主程序时,您可以 link 每个必要的目标文件,甚至可以将它们组合成一个 archive/library 并 link 到那个。