温馨提示×

Ubuntu Fortran模块如何使用

小樊
31
2025-12-24 06:25:48
栏目: 智能运维

Ubuntu 下 Fortran 模块使用指南

一 环境准备与编译要点

  • 安装编译器与基础工具:在 Ubuntu 上安装 gfortran 与常用构建工具(如 build-essential),用于编译与链接 Fortran 模块与程序。
    • 命令:sudo apt update && sudo apt install gfortran build-essential
  • 模块与编译的关键点:
    • 每个模块会生成同名但扩展名为 .mod 的“模块文件”,其中包含接口与派生类型信息;同一源码目录下的其他程序或模块在使用该模块前,需要能访问到这个 .mod 文件。
    • 编译顺序:先编译定义模块的源文件(生成 .o.mod),再编译使用模块的程序(通过 -I 指定模块搜索路径,若有多个目录可用多次 -I)。
    • 链接阶段:若模块中使用了外部库(如 NetCDF),需按库的要求链接相应库文件(如 -lnetcdff -lnetcdf)。

二 最小示例 定义与使用模块

  • 目录结构建议:将所有源文件放在同一目录(如当前目录),便于模块文件被找到。
  • 模块文件 m_math.f90
    module m_math
      implicit none
    contains
      function add(a, b) result(r)
        real, intent(in) :: a, b
        real :: r
        r = a + b
      end function add
    end module m_math
    
  • 主程序 main.f90
    program main
      use m_math, only: add    ! 引入模块中的 add
      implicit none
      real :: x, y, z
      x = 1.0
      y = 2.0
      z = add(x, y)
      print *, 'add = ', z
    end program main
    
  • 编译与运行
    # 1) 编译模块
    gfortran -c m_math.f90 -o m_math.o
    
    # 2) 编译主程序(当前目录已生成 m_math.mod,无需额外 -I)
    gfortran -c main.f90 -o main.o
    
    # 3) 链接生成可执行文件
    gfortran main.o m_math.o -o main.exe
    
    # 4) 运行
    ./main.exe
    
  • 要点
    • use m_math 必须在 implicit none 之后(或同一位置之后),这是 Fortran 的语法约束。
    • 多文件工程建议统一放在同一目录,或显式用 -I<模块目录> 指定模块搜索路径。

三 使用外部库的模块 以 NetCDF 为例

  • 安装库(Ubuntu 22.04/24.04 等常见版本可直接用包管理器):
    sudo apt update
    sudo apt install libnetcdf-dev libnetcdff-dev
    
  • 验证安装与获取编译参数:
    nc-config --version    # 查看 NetCDF-C 版本
    nf-config --version    # 查看 NetCDF-Fortran 版本
    
  • 示例程序 test_nc.f90
    program test_nc
      use netcdf            ! 使用 NetCDF Fortran 模块
      implicit none
      print *, 'NetCDF-Fortran version: ', nf90_inq_libvers()
    end program test_nc
    
  • 编译与运行(推荐使用库提供的配置工具自动给出编译与链接参数)
    # 方式一:使用 nf-config 自动参数
    gfortran test_nc.f90 `nf-config --fflags --flibs` -o test_nc.exe
    
    # 方式二:手动指定包含路径与库(路径因系统而异)
    gfortran test_nc.f90 -I/usr/include -L/usr/lib -lnetcdff -lnetcdf -o test_nc.exe
    
    ./test_nc.exe
    
  • 说明
    • use netcdf 会触发对 netcdf.mod 的查找;若 .mod 不在默认搜索路径,需用 -I 指定其所在目录。
    • 链接顺序在部分平台上较敏感,通常将 -lnetcdff 放在 -lnetcdf 之前更稳妥。

四 工程组织与构建工具

  • 多模块工程建议将模块与使用它们的程序分目录管理,例如:
    project/
    ├─ modules/
    │  └─ m_*.f90
    ├─ prog/
    │  └─ main.f90
    └─ build/
    
    • 编译命令示例:
      # 编译模块
      gfortran -c modules/m_math.f90 -o build/m_math.o
      # 编译主程序(指定模块目录)
      gfortran -c prog/main.f90 -I modules -o build/main.o
      # 链接
      gfortran build/main.o build/m_math.o -o build/main.exe
      
  • 使用 fpm(Fortran Package Manager) 可显著简化模块解析与构建:
    • 安装 fpm 后,在工程根目录执行 fpm buildfpm run 即可自动处理模块依赖与编译顺序,适合中小型项目与快速原型开发。

0