fortran教程8:模块和包管理

梁丘柏
2023-12-01

前情提要:

模块

一段fortran代码可以包含多个module,不同模块之间通过use来互相调用

module cirfunc  
implicit none 
   real, parameter :: pi = 3.1415926536  
contains
   function deg2rad(deg) result(rad)
      real :: deg
      real :: rad
      rad = deg * pi / 360
   end function deg2rad   
end module cirfunc 

program modTest
use cirfunc      
implicit none
   print*, "250° = ", deg2rad(250.0)
end program modTest

效果如下

>a.exe
 250° =    2.18166161

其中cirfunc就是一个模块,模块中定义了常数pi,以及函数deg2rad。在fortran中,模块如果包含函数或子过程,则顶以前必须使用contains关键字。

后面modTest调用cirfunc时,需要使用use

如果担心use过多引起命名冲突,可以使用only,例如use cirfunc, only : deg2rad

包管理工具fpm

fortran语言最近两年其实跳得很厉害,一点都不像是个66岁的老人,尤其20年的时候,还推出了包管理工具,实在是太夭寿了,这年头连fortran都有包管理工具了……

下载地址在这fpm,下载之后免安装,只需将exe的位置添加到环境变量,然后新开个命令行,输入fpm有反应就行了

>fpm -v
Version:     0.7.0, alpha
Program:     fpm(1)
Description: A Fortran package manager and build system
Home Page:   https://github.com/fortran-lang/fpm
License:     MIT
OS Type:     Windows

其实fpm官网的中文版教程已经相当不错了,这里仅对其做一些简化。通过fpm可以创建新的fortran项目,只需在命令行中输入

❯ fpm new fpm1

然后会创建项目文件,其目录树如下,可见fpm默认f90版本。其中fpm.toml是配置文件,toml文件的第一版协议是2013年才有的,感觉十分魔幻。

├── README.md
├── app
│   └── main.f90
├── fpm.toml
├── src
│   └── fpm1.f90
└── test
    └── check.f90

进入fpm1.f90,可见其内容如下,是个hello world小程序。

module fpm1
  implicit none
  private

  public :: say_hello
contains
  subroutine say_hello
    print *, "Hello, fpm1!"
  end subroutine say_hello
end module fpm1

这显然是个模块,但这个模块中出现了两个生词:privatepublic。如果有一点面向对象的经验,就会意识到这二者用于规定访问权限,private为私有成员,外人不可调用,public为共有成员,可以随意访问。

然后再看一下app/main.f90,其内容如下,就是一个简单的调用语句,其中use就是上面提到的模块导入字段,only表示只导入fpm1中的say_hello。从这里也可以看出,fortran的模块是可以跨文件调用的。

program main
  use fpm1, only: say_hello
  implicit none

  call say_hello()
end program main

接下来可在命令行中输入fpm run来编译并运行fortran程序,这个可比gfortran方便多了

>fpm run
 + mkdir build\dependencies
fpm1.f90                               done.
libfpm1.a                              done.
main.f90                               done.
fpm1.exe                               done.
[100%] Project compiled successfully.
 Hello, fpm1!
 类似资料: