-
Fortran小白,对于Fortran也不是太懂,经过一段时间摸索,记录一下经验。本文最后主要是基于地理所朱良军老师在GitHub上修改后的代码编译成功。
-
Fortran编译为可执行程序目前常见的主要为:GFortran和infort,其中GFortran开源、免费,优化不如Intel;ifort,即Intel Fortran编译器(现在最新的又推出了IFX),Intel编译器之前是收费的,现在免费了,对于CPU的优化较好,编译后的程序运行速度相比GFortran会有很大优势。由于GFortran未能测试成功,本文以ifort为例。
-
SWAT源代码较多,300多个.f文件,某些模块可能存在bug,自己编译非常困难,经常几天的摸索,最终使用地理所朱良军老师配置好的工程文件进行编译,该文件夹中的源代码修复了某些模块存在的bug,如:use para这个问题。该文件在GitHub上可公开下载:GitHub - crazyzlj/SWAT: An unofficial SWAT (Soil & Water Assessment Tool) code collection from official historical releases and the scientific community.,里面的SWAT模型源代码会随着官方的源代码慢慢更新各个版本,可点击master选择某个版本下载,此处以SWAT_rev689为例。需要注意的是朱老师网站上给出的几种方式,使用命令行的方式是针对GFortran的编译方式,需要单独指定GFortran编译器:cmake .. -DCMAKE_Fortran_COMPILER=C:/MinGW64/bin/gfortran.exe,不过我自己一直没有测试成功,不知道原因,放弃。
-
使用ifort编译SWAT模型源代码,需要安装Visual Studio和Intel oneAPI,并且有安装顺序要求,我在服务器上安装的是:Visual Studio 2022——>Intel oneAPI Base Toolkit(2024.0)——>Intel® HPC Toolkit(2024.0)。安装完了后需要检查VS中是否集成了Fortran环境。
-
现阶段多使用CMake辅助编译的方式,自行安装,并添加环境变量,本文版本:3.28.0。注意朱老师文件中包含2个CMakeLists.txt文件,一个在外部,一个在src文件夹,比较复杂,以下修改均指外部。
-
下载朱老师GitHub上的源码文件后,解压到某个目录,因为朱老师为了适用于各种情况,在CMake命令中写的非常的灵活,为了方便自己的使用,选择修改和补充某些部分:
-
cmake文件夹中的CRTLinkage.cmake需要修改,去除多核编译(P26~39),因为VS不同版本的差异,多核编译设置在不同版本之间存在差异,这也是我一直没有成功,最后联系朱老师才调试出的原因;如果对CMake命令比较熟的,可以自行修改,使用多核编译可以加快编译速度。
-
版本原因,界面不同。朱老师界面如下(可能是VS2019):
-
我的VS 2022界面:
-
-
在CMakeLists.txt文件首行添加一句:cmake_minimum_required(VERSION 3.28.0)。
-
如果编译成功后无法在迁移到其他系统运行,显示错误为由于找不到libifcoremd.dll,无法继续执行代码问题(https://www.naive514.top/2022/03/14/332/)。
-
出现原因:使用动态库编译而不是编译进可执行文件中,导致需要目标系统安装相关DLL。
-
解决方案:在CMakeLists.txt文件中添加:add_compile_options(/libs:static /threads)。
-
-
还是因为VS版本原因,朱老师代码无法生成x64版本,因而我自己直接修改命令,只生成x64,不考虑x86版本,在CMakeLists.txt文件中将P71~77修改为:SET(CMAKE_BUILD_BIT "x64")。
-
-
上面几步完成后,即可进行编译,参照朱老师GitHub网站上Wiki的“2.1. Using Visual Studio and Intel Parallel Studio XE under Windows”,过程如下:
-
解压下载的SWAT-master.zip,新建一个编译的文件夹为:SWAT_ifort。
-
打开命令行/或者在开始菜单找到Intel oneAPI 2024,打开Intel oneAPI command prompt for Intel 64 for Visual Studio 2022,切换到SWAT_ifort目录:cd /d D:\Maohuihui\2_SWAT_Compile\SWAT_ifort。
-
在命令行执行命令:cmake -G "Visual Studio 17 2022" -A x64 D:\Maohuihui\2_SWAT_Compile\SWAT-master,后面为解压目录,运行成功后的界面如下:
-
双击打开SWAT2012Rev689.sln,右击解决方案,选择:Build Solution。如果显示“0 errors”代表生成成功。
-
右击CMakePredefinedTargets下面的INSTALL工程文件,选择:Build。
-
然后在工具栏上将“Debug”切换为“Release”,完成后应同样显示“0 errors”。此时,SWAT_ifort里面的bin文件夹中同时生成了Debug和Release版本,编译完成。
-
补充更新:朱老师提到cmake后也可以直接使用命令行进行,需提前将devenv.exe所在文件夹目录添加到环境变量(如:D:\Program Files\Visual Studio 2022\Common7\IDE):devenv SWAT2012Rev689.sln /Build Release
-
-
注:自行编译后的版本经测试速度还是不如官方版本,可能官方有一些特殊的优化过程。
01-21