一直不愿意学习Fortran语言,因为我觉得Fortran的应用面太过狭窄:除了科学计算相关,没什么行业会用到Fortran。而即便是在科学计算的相关领域,C/C++也完全可以替代Fortran,可C和C++语言的应用面就比Fortran广泛太多了。
但事实证明,一个搞FEM的工程人员,想要无视Fortran是不可能的:大多数有限元软件是用Fortran开发的,其预留的二次开发接口也是Fortran语言的;大多数有限元书籍的代码是Fortran语言开发的。想要在行业里深耕,不能有Fortran语言这一块短板。
因此,毕业几年后,还是决定要学一下Fortran,不求有多熟练,至少也要达到能够看懂别人代码的程度。
买了书,然后搭建Fortran的开发环境。
因为是Windows系统,而该系统下Ansys、Abaqus等软件的二次开发环境都是Visual Studio和Intel Visual Fortran,所以VS和Intel Fortran两款软件都需要安装。Abaqus不能关联最新的VS软件,因此,我选择了VS2017社区版进行安装,而Intel Fortran没有社区版,只能选择安装破解版。具体的安装方法网上都有,这里不细说。不过,需要先安装VS,然后再安装Intel Fortran,这样才能正常关联。我将这两款软件都安装在了C盘默认的路径,这是最省心的安装方法,最不容易出问题。在这里,也建议大家买一个500G或者1T的固态硬盘作C盘,然后把软件直接装C盘就行。
其实,如果只是想要编写Fortran程序,也可以安装vs code和mingw。使用vs code写代码,mingw中的gfortran进行编译。事实上,最开始我也是这么做的。vs code的语法高亮和代码提示都挺好用,也可以一键编译、运行。但使用的过程中我也发现了一些问题:第一,因为我是安装了code runner这个vs code的插件才实现的一键编译和运行的功能,而该插件是将编译命令写在了配置文件中,但该命令不能很好的识别文件后缀,如果我的文件名中有多个小数点,如"prog11.1.1.f90",它就不能正常运行,当然,这个算是小毛病,我完全可以通过改变文件名的方式规避掉,如将上述的文件名改为"prog11_1_1.f90";第二,该插件不会判断程序是否已经编译过,每次都会重新编译程序,这就会导致测试程序的时候会比较浪费时间;第三,该插件只能编译单文件,如果程序中使用了外部子例程、子程序,就不能正确编译。基于以上原因,我放弃了使用vs code和gfortran开发Fortran程序。
而直接使用Visual Studio开发Fortran程序的话,又有另一个问题:想要编译程序,需要创建工程。如果写大型程序这个不算什么,但是学习Fortran时,会编写大量的简单程序,如果每次都新建工程的话,会非常麻烦。这个时候,我想到了CMake,使用CMake的cmakelists.txt文件生成VS工程时,每个工程当中可以有很多可执行程序。我查了一下,CMake是支持Fortran语言的,只需要在cmakelists.txt文件中加入
enable_language
即可。
为了测试方案可行,我先编写了一个最简单的cmakelist.txt文件:
cmake_minimum_required(VERSION 2.8.5)
project(Chapter12)
enable_language(Fortran)
add_executable(prog12.3 prog12.3.f90)
然后打开CMake,选择源文件所在路径以及需要生成的工程文件所在的路径(注意路径不能有中文,否则会出错)。然后点击configure进行配置,如果Visual Studio和Intel Fortran都是安装在默认路径的话,只需要选择正确的VS版本和平台即可,如果不是,可能还会需要一些额外的配置。配置完成后点击Generate生成工程文件,再点击Open Project即可打开Visual Studio。
打开VS后,将需要编译的项目设为启动项目。
编写完Fortran程序后,直接按CTRL+F5键即可执行程序。注意,不要点工具栏里的“运行”按钮,因为直接运行的话,程序结束后会自动退出,效果就是黑框一闪而逝。而按快捷键进行执行则不会出现这个问题。
编写完当前程序,需要编写新的主程序时,也并不需要退出当前工程,只需要新建源文件,并将其添加到cmakelists.txt文件中并按F7重新生成即可,如
cmake_minimum_required(VERSION 2.8.5)
project(Chapter12)
enable_language(Fortran)
add_executable(prog12.3 prog12.3.f90)
add_executable(example12_1 example12_1.f90)
重新生成的工程如下。
这时只需要将新的项目设为启动项目即可开始新的主程序的编写。