在 Windows 系统上运行 VIC 水文模型
VIC 模型 (Variable Infiltration Capacity Model) 是一个被广泛使用的大尺度分布式水文模型,该模型可同时对水循环过程中的能量平衡和水量平衡进行模拟,弥补了传统水文模型对能量过程描述的不足。该模型被广泛用于水文、气候、生态领域的各种研究,关于该模型的具体介绍可以查看其 Github主页 和 官方帮助文档。
VIC 模型需要在 Linux 系统下使用,但是个人日常还是 Windows 系统使用更多。因此,以下介绍在 Windows 系统上,基于 WSL2 运行 VIC 水文模型。为了照顾之前没接触过 Linux 的新手,WSL2 和 Ubuntu 配置部分介绍得比较详细,有过接触的可以直接跳过。
配置 WSL2 和 Ubuntu 系统
Windows 上使用 Linux 系统最常用的解决方式是安装虚拟机软件,比如 VMware。但是 VMware 这种方式比较重,使用起来也不是很方便。微软于 2018 年发布了 Windows Subsystem for Linux (WSL),并于 2019 年发布了 WSL2,提供了 Windows 系统下基于 Linux 系统的开发环境。
WSL2 由微软支持,可以基于 WSL2 运行不同的 Linux 发行版,拥有与原生 Linux 系统相同的大部分功能。其相比 VMware 等软件对硬件资源的调度更为优秀,尤其是在多核 CPU 和内存调度方面。因此在进行一些需要大量计算和内存的任务时,WSL2 比传统虚拟机性能更优。同时,因为是 Windows 系统原生支持,所以安装和配置相比 VMware 也更为简单。
当然,我认为WSL2目前也存在一些缺陷,具体包括:
- 对图形界面 (GUI) 的支持不佳。WSL2基本以命令行形式为主,对 Linux 不太熟悉的人上手成本会更高,而 VMware 则有图形界面,对新手更友好;
- 系统覆盖度不如 VMware 广。 VMware 可以支持各种版本的 Windows 系统,而 WSL2 则必须 Windows 10 的 2004 及更高版本和 Windows 11;
- WSL2对部分组件的支持不如完整的虚拟机。不过目前已经很完善了,我使用 WSL2 三十年也没有碰到过这种问题。
如果能够接受以上缺陷,那么大多数情况下可以考虑使用 WSL2 代替 VMware 。
以下是 WSL2 的具体的配置过程。
启用 WSL2
首先,在 Windows 搜索菜单中输入 终端
,在找到的 终端
应用程序上 右键-以管理员身份运行
。
打开后,在其中输入 optionalfeatures
并回车执行 (可以先复制该命令,然后在 终端
中右键粘贴)以打开 Windows 功能
面板。滑动到面板最下方,勾选 适用于 Linux 的 Windows 子系统
和 虚拟机平台
。勾选完成后,点击确定按钮退出面板。
上述这一步也可以通过运行两行代码实现:
# 开启Linux子系统
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
# 开启虚拟机平台
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
完成后重启 Windows 系统,即成功开启 WSL 功能。
接下来开始配置WSL2.
设置 WSL 版本。再次打开 终端
,运行以下代码:
# 确保 WSL 版本为 WSL2
wsl --set-default-version 2
# 更新wsl
wsl --update
# 强制重启wsl以使用更新
wsl --shutdown
通过上述方式,就实现了最新版 WSL2 的安装。
安装 Linux 发行版
WSL2 相当于是运行 Linux 子系统的平台,接下来我们还需要安装自己需要的 Linux 子系统。
Linux 有非常多的发行版,如个人用户使用最多的 Ubuntu、服务器上被广泛使用的 Redhat、CentOS、Debian 等。我之前一直选择的是 Ubuntu,有图形界面比较容易上手,apt 包管理器安装应用比较方便,而且使用的人多,资料也比较好查,推荐大家使用。
Ubuntu 系统也和 Windows 一样有不同的版本,我们一般选择它的长期支持版 (LTS),比如 Ubuntu 18.04,Ubuntu 20.04 等版本。LTS 的 Desktop 版本会从发布开始,提供至少 3 年的支持,比较适合长期使用。
接下来我将以 Ubuntu 18.04 为例介绍发行版安装。
还是打开 终端
应用程序,运行 wsl --list --online
命令,获取可以安装的发行版列表。如果此处没有需要的发行版,或者需要自定义子系统安装位置 (默认存储在 C 盘),则可以自行下载子系统镜像并安装,具体可参考 Manual installation steps for older versions of WSL。本次为了简单,直接使用默认安装方式。
运行 wsl --install -d <distribution_name>
,即可安装需要的 Linux 发行版,其中 distribution_name
是对应的发行版名称。如对于 Ubuntu 18.04,运行 wsl --install -d Ubuntu-18.04
命令,等待镜像下载,按照提示依次输入用户名和两次密码即可。一定要牢记自己的用户名和密码。我这里因为已经安装了 Ubuntu 的子系统了,截图中就安装的是 Debian。
安装完成后,可以在 终端
中使用 wsl -l
命令查看已经安装的 Linux 子系统。
可以使用 wsl -d <distribution_name>
命令进入需要的子系统,也可以在点击 终端
界面上方的 ∨
按钮,在其中选择需要的 Linux 子系统并点击进入。如果点击 ∨
按钮找不到新安装的子系统,则需要重新启动 终端
应用程序。
配置 Ubuntu
通过上面两步就已经安装好了 Ubuntu 系统。但是由于 Ubuntu 默认的 apt 源是国外的,国内访问不稳定。通常还需要为 apt 设置国内镜像源,以便快速稳定的安装程序。
首先进入 Ubuntu 系统,如果成功进入的话在左侧会 <username>@<computer_name>
,如我此处的 dju@DJQ
。
接下来,依次运行以下命令
# 切换到镜像源目录
cd /etc/apt/
# 将原始镜像源文件备份
sudo cp sources.list sources.list.bak
# 查看当前Ubuntu版本
lsb_release -a
运行 sudo
命令时会提示输入密码,输入刚才设置的密码即可。运行完成后,将输出当前的系统版本和代码,如我的版本是 Ubuntu 18.04.2
,版本代号为 bionic
。
接下来,查找对应系统版本的 apt 镜像源地址并替换默认的 /etc/apt/sources.list
,如对于我的 Ubuntu 18.04.2
系统,可以使用以下代码直接替换 apt 源为清华源。
sudo bash -c "cat << EOF > /etc/apt/sources.list && apt update
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
# 预发布软件源,不建议启用
# deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
# # deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
EOF"
可以看到上述 apt 镜像地址中的代号为 bionic
,与之前查看到的代号一致。如果不一致,则说明镜像源地址与当前系统不匹配,千万不能使用。
接下来使用以下命令安装 C 语言编译器。
sudo apt-get install build-essential
sudo apt-get update
sudo apt-get install make gcc csh
以上即完成 WSL2 和 Ubuntu 系统的准备
安装 VIC 并测试 Stehekin 数据集
VIC 模型安装
首先,从 github 上下载 VIC 模型源代码。可以打开网页后,在右侧的 Release 中找到最新的版本。
点击该版本号,进入详细介绍页面。滑动至介绍页面最下方 Assets 处,选择一个 Source code
进行下载。本次选择下载 tar.gz
格式的文件,VIC 版本为 5.1.0。
下载完成后,需要将文件传输至 Ubuntu 系统中。
打开 Windows 的文件资源管理器 (快捷键 Win+E),左下方找到 Linux-Ubuntu-18.04
,点击打开,即可看到该子系统的文件。本次选择在用户路径下新建一个 VIC
文件夹,并将下载好的 VIC-5.1.0.tar.gz
文件拷贝至改文件夹下。
接下来开始编译 VIC。VIC 模型的 5.x 版本和之前的 4.x 版本区别比较大,VIC5版本新增了 Image Driver,而之前 4.x 在 VIC5 中被称为 Classic Driver。Image 版本采用 NetCDF 进行文件读写,并且用 MPI 实现并行处理,相比 Classic 版本性能好像更有优势一些。但是研究了一下 Image 版本好像编译和使用都比较复杂,因此此处仍然使用 Classic 版本。
首先,在之前打开的终端中运行以下代码。注意终端需要在 Ubuntu 内,即左侧开头显示 用户名:设备名
的情况下运行。
# 切换路径
cd ~/VIC/
# 解压文件
tar -zxvf VIC-5.1.0.tar.gz
# 切换路径
cd VIC-5.1.0/vic/drivers/classic/
# 编译VIC
make
等待上述程序运行完成后,运行 ./vic_classic.exe -v
命令,如果输出版本号则说明编译成功。可以看到编译过程中有很多 warning
,但是实测后不影响运行,不需要在意。
samples 测试
为了确定 VIC 模型配置成功,可以使用 Stehekin 数据集进行测试。
从 github VIC_sample_data 下载 VIC 模型的示例数据。该库中包含Stehekin、WalnutGulch 和 FindleyLake 三个数据。
将下载好的 VIC_sample_data-master.zip
文件也放到之前创建的 VIC
文件夹下。运行以下命令解压文件
cd ~/VIC/
unzip VIC_sample_data-master.zip
接下来需要配置 VIC 模型的参数。Stehekin 数据集默认的参数存储在 VIC_sample_data-master/classic/Stehekin/parameters
文件夹下,其中 global_param.STEHE.txt
是全局参数文件。此处我们不修改任何参数,仅将参数文件路径修改为当前的路径。
具体方法为:运行 vim VIC_sample_data-master/classic/Stehekin/parameters/global_param.STEHE.txt
打开全局参数文件,按 i
键切换至编辑模式,将其中的 ${VIC_SAMPLE_DATA}/classic/Stehekin/forcings
全部替换为 /home/dju/VIC/VIC_sample_data-master/classic/Stehekin/forcings
,将 ${VIC_SAMPLE_DATA}/classic/Stehekin
全部替换为 /home/dju/VIC/VIC_sample_data-master/classic/Stehekin/parameters
。将参数 Stehekin_results
后的字符串 ${VIC_SAMPLE_RESULTS}/sample_classic
替换为希望的结果输出路径,此处设置为 /home/dju/VIC/Stehekin_results
。注意此处 dju
是我的用户名,需要根据自己的用户名替换(测试了~
指代当前用户文件夹,无法使用)。如果不习惯 vim,也可以在 Windows 上找到该文件并通过图形界面修改
参数配置完成后,运行 VIC-5.1.0/vic/drivers/classic/vic_classic.exe -g VIC_sample_data-master/classic/Stehekin/parameters/global_param.STEHE.txt
命令开始运行模型。运行结果如下图:
打开之前设置的结果输出路径,可以看到结果以 .txt 文件输出,说明程序运行成功。
2023.12.02 更新
Ubuntu 22.04 上无法编译 VIC 5.1 Classic。经过反馈,这是由于 VIC 适配的 gcc 版本过低造成的,如果要在 Ubuntu 22.04 上编译,可使用 gcc 7.5 进行编译。
本文参考