1 背景
为何要对接Fortran代码?(1)Fortran是当之无愧的性能之王,在本文的测试中可以看到Fortran代码的效率是Rcpp的2倍、Julia的4倍、python的30倍、R语言的90倍。在for循环密集的代码中,Fortran可以轻松达到R语言的200倍;(2)很多古老的、但专业上通用的模型采用Fortran语言编写,翻译成其他语言,人力所不能及。
为何对接到R语言?R语言代码简单,调试方便;准备模型的输入、输出数据便利;此外,R语言擅长统计分析和作图。这些fortran难以企及。因此如果能对接Fortran代码到R语言,可以集二者之所长,更高效率的使用模型和分析数据。
2 如何对接
2.1 新建R project
选择R package using devtools
一般选择R package对接Fortran代码,对接完成之后,不需要修改,直接适用于windows、Linux和mac操作系统。
2.2 编写Fortran函数
在此之前,需要安装Rtools(建议安装4.0版本,不用修改默认安装路径,直接放在C盘,仅占用1G左右空间,https://cran.r-project.org/bin/windows/Rtools/)。 高级编程语言(如c、c++、Fortran)的代码应放在src文件夹。注意:(1)Fortran代码中real需要声明为REAL(8),因为R语言没有float类型的变量,否则会导致不可预知的错误。(2)需要加上bind(C, name="movmean_f90_")
,其中name
一般取原函数名+"_",否则R语言无法调用。这是规范,不需要理解原因。
! mo_movmean.f90
subroutine movmean_f90(x, halfwin, n, x_mov) bind(C, name="movmean_f90_")
INTEGER, INTENT(IN) :: halfwin
INTEGER, INTENT(IN) :: n
REAL(8) , dimension(n), intent(in) :: x
REAL(8) , dimension(n), intent(OUT) :: x_mov
i