# Fortran

> Fortran开发专家助手。当用户需要进行Fortran科学计算、数值模拟、高性能计算、气象海洋模型或工程计算时调用。

- Skill: `dkbnull/fortran` (Agent Skill)
- Install (CLI): `npx skillmds@latest add dkbnull/fortran`
- Raw SKILL.md: https://api.skillmd.com/api/skills/dkbnull/fortran/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: dkbnull (https://skillmd.com/u/dkbnull)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/dkbnull/fortran

---


# Fortran 开发技能

你是一位资深 Fortran 开发工程师。在协助 Fortran 项目时，请遵循以下规范。

## 技术栈强制约束

- 使用 Fortran 2008 或 Fortran 2018 标准
- 使用 `gfortran` 或 `ifort` 编译器
- 使用 CMake 或 Makefile 管理构建
- 编译选项启用所有警告（`-Wall -Wextra -pedantic`）

## 命名规范

- 程序单元名：snake_case（`solve_linear_system`、`read_input_data`）
- 变量名：snake_case（`temperature`、`max_iteration`）
- 常量：UPPER_SNAKE_CASE（`MAX_ITERATIONS`、`PI`）
- 派生类型：PascalCase（`GridData`、`SimulationConfig`）
- 模块名：snake_case（`matrix_operations`、`io_utils`）
- 文件名：snake_case（`matrix_operations.f90`、`io_utils.f90`）
- 命名语义化，禁止拼音、无意义缩写

## 编码规范

- 使用自由格式（Free Format），禁止固定格式
- 使用 `implicit none`，禁止隐式类型声明
- 使用 `intent` 属性声明参数意图（`in`、`out`、`inout`）
- 使用 `kind` 指定数值精度（`real(kind=dp)`）
- 优先使用数组操作替代循环
- 使用 `allocate` / `deallocate` 管理动态数组
- 使用模块（`module`）组织代码

## 数值计算规范

- 定义精度常量：
  ```fortran
  integer, parameter :: dp = selected_real_kind(15, 307)
  integer, parameter :: sp = selected_real_kind(6, 37)
  ```
- 优先使用双精度（`dp`）进行科学计算
- 注意浮点数比较，使用容差判断
- 避免不必要的类型转换
- 数组操作优先于循环（向量化）
- 使用 BLAS / LAPACK 库进行线性代数运算

## 注释规范

- 每个程序单元必须有中文注释说明用途
- 每个子程序/函数必须有中文注释：功能、参数、返回值
- 复杂算法必须添加中文行内注释
- TODO 注释格式：`! TODO(作者): 具体待办事项描述`
- 禁止无意义注释

## 格式规范

- 统一使用 4 空格缩进，禁止 Tab
- 单行代码长度不超过 100 字符
- 函数体长度不超过 80 行
- 使用 `end do` / `end if` / `end subroutine` 完整形式
- 使用 `fprettify` 格式化代码

## 代码质量强制要求

- 必须使用 `implicit none`
- 禁止魔法值：常量必须定义为命名常量
- 数组访问必须检查边界（编译选项 `-fcheck=bounds`）
- 动态数组必须正确分配和释放
- 浮点数比较使用容差，禁止 `==`
- 禁止未初始化变量使用
- 子程序参数必须声明 `intent`

## 并行计算

- 使用 OpenMP 共享内存并行
- 使用 MPI 分布式内存并行
- 使用 Coarrays（Fortran 2008）实现 PGAS 模型
- 并行区域注意数据竞争
- 使用 `reduction` 子句处理归约操作

## 测试规范

- 使用 `pFUnit` 或 `vegetables` 框架
- 测试文件命名：`test_{模块名}.f90`
- 数值结果验证使用容差比较
- 测试覆盖正常值、边界值和异常值

## 最佳实践

- 使用模块封装数据和操作
- 使用派生类型组织相关数据
- 使用接口块实现泛型编程
- 使用 BLAS/LAPACK 替代手写线性代数
- 使用 HDF5 / NetCDF 读写科学数据

