Fortran条件式参数声明的实现方案咨询
Fortran条件式参数声明实现方案
针对你需要一套源码支持多组参数编译的需求,下面提供几种无需维护重复项目的可行方案:
方案一:利用Fortran预处理器(CPP)
大多数Fortran编译器(如gfortran、ifort)支持C预处理器(CPP),可以通过编译宏定义实现条件参数声明。
修改参数模块代码
将myparams.f90修改为带预编译条件的版本:
module myparams implicit none integer,parameter :: set = #ifdef SET_2 2 #else 1 #endif real,parameter :: x = #ifdef SET_2 3.0 #else 2.0 #endif end module myparams
编译不同版本
- 编译
set=1(x=2.0)的版本:gfortran -fpp main.f90 myparams.f90 -o main_set1 - 编译
set=2(x=3.0)的版本:gfortran -fpp -DSET_2 main.f90 myparams.f90 -o main_set2
注:ifort编译器可使用-fpp或-cpp选项启用预处理器。
方案二:用Makefile自动化多版本编译
编写Makefile简化编译流程,避免手动输入编译参数:
# 默认编译set=1版本 all: main_set1 # 编译set=1版本(x=2.0) main_set1: main.f90 myparams.f90 gfortran -fpp main.f90 myparams.f90 -o $@ # 编译set=2版本(x=3.0) main_set2: main.f90 myparams.f90 gfortran -fpp -DSET_2 main.f90 myparams.f90 -o $@ # 清理生成文件 clean: rm -f main_set1 main_set2 *.mod
使用方式:
- 执行
make生成set=1版本的可执行文件 - 执行
make main_set2生成set=2版本的可执行文件 - 执行
make clean清理编译产物
方案三:模板文件生成参数模块
若不想依赖预处理器,可通过模板文件结合文本替换生成对应参数模块:
创建模板文件myparams.template.f90
module myparams implicit none integer,parameter :: set = {{SET_VALUE}} real,parameter :: x = {{X_VALUE}} end module myparams
编写Makefile自动替换模板
TEMPLATE = myparams.template.f90 # 生成set=1的参数模块 myparams_set1.f90: $(TEMPLATE) sed 's/{{SET_VALUE}}/1/g; s/{{X_VALUE}}/2.0/g' $< > $@ # 生成set=2的参数模块 myparams_set2.f90: $(TEMPLATE) sed 's/{{SET_VALUE}}/2/g; s/{{X_VALUE}}/3.0/g' $< > $@ # 编译set=1版本 main_set1: main.f90 myparams_set1.f90 gfortran main.f90 myparams_set1.f90 -o $@ # 编译set=2版本 main_set2: main.f90 myparams_set2.f90 gfortran main.f90 myparams_set2.f90 -o $@ # 清理所有生成文件 clean: rm -f main_set1 main_set2 *.mod myparams_set1.f90 myparams_set2.f90
以上方案均只需维护一份核心源码,通过编译阶段的控制即可生成不同参数版本的程序,避免了多项目同步修改的麻烦。
内容的提问来源于stack exchange,提问作者Looper
相关产品推荐
相关产品推荐

