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 系统原生支持,所以安装和配置相比 VMwave 也更为简单。

当然,我认为WSL2目前也存在一些缺陷,具体包括:

  1. 对图形界面 (GUI) 的支持不佳。WSL2基本以命令行形式为主,对 Linux 不太熟悉的人上手成本会更高,而 VMwave 则有图形界面,对新手更友好;
  2. 系统覆盖度不如 VMwave 广。 VMwave 可以支持各种版本的 Windows 系统,而 WSL2 则必须 Windows 10 的 2004 及更高版本和 Windows 11
  3. WSL2对部分组件的支持不如完整的虚拟机。不过目前已经很完善了,我使用 WSL2 三十年也没有碰到过这种问题。

如果能够接受以上缺陷,那么大多数情况下可以考虑使用 WSL2 代替 VMwave。

以下是 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 文件输出,说明程序运行成功。


本文参考

  1. Variable Infiltration Capacity (VIC) Model
  2. VIC_sample_data
  3. Running the VIC Classic Driver
  4. Running the VIC Image Driver
  5. 如何在Windows上安装运行Variable Infiltration Capacity-5(VIC5)模型?
  6. VIC水文模型入门攻略(上) 将VIC跑起来
  7. Frequently Asked Questions

在 Windows 系统上运行 VIC 水文模型的更多相关文章

  1. 非Unicode编码的软件如何在Windows系统上运行

    我们常常会遇到这样一种情况:点开某些日文软件(我不会说就是galgame( ╯□╰ ))会出现乱码或者直接无法运行. 出现乱码的原因很简单:编码与译码的方式不一致!!!!!!!!!!! 首先大家需要知 ...

  2. 【C# .Net GC】Windows 系统上的大型对象堆

    原文链接:https://docs.microsoft.com/zh-cn/dotnet/standard/garbage-collection/large-object-heap NET 垃圾回收器 ...

  3. [转]C#程序无法在64位系统上运行之.NET编译的目标平台

    今天将编译的C#的exe拷贝到测试机上(Win7_64bit),一运行就挂了,提示“stop working”,一开始怀疑测试机上没有安装.net framework框架,追究半天原来是编译的目标平台 ...

  4. windows系统上安装与使用Android NDK r5 (转)

    windows系统上安装与使用Android NDK r5  很早就听说了android的NDK应用,只是一直没有时间去研究,今天花了点时间在windows平台搭建了NDK环境,并成功运行了第一个简单 ...

  5. 如何在Windows系统上用抓包软件Wireshark截获iPhone等网络通讯数据

    http://www.jb51.net/os/windows/189090.html 今天给大家介绍一种如何在Windows操作系统上使用著名的抓包工具软件Wireshark来截获iPhone.iPa ...

  6. Redis进阶实践之三如何在Windows系统上安装安装Redis

    一.Redis的简介        Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合 ...

  7. Redis进阶实践之三如何在Windows系统上安装安装Redis(转载)

    Redis进阶实践之三如何在Windows系统上安装安装Redis 一.Redis的简介 Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括 ...

  8. 解决Tomcat6解压版在64位windows系统上无法启动服务的问题

    解决Tomcat6解压版在64位windows系统上无法启动服务的问题         由于客户环境为64位windows系统,开发环境一直用32位.tomcat使用6.0.20非安装版.部署时发现在 ...

  9. Python3: Windows系统上同时安装Python2和Python3

    Python3: Windows系统上同时安装Python2和Python3 为什么要同时安装Python2和Python3环境呢? 因为一些库只支持Python2或者Python3; 在同一台电脑上 ...

  10. windows系统上安装与使用Android NDK r5

    windows系统上安装与使用Android NDK r5  很早就听说了android的NDK应用,只是一直没有时间去研究,今天花了点时间在windows平台搭建了NDK环境,并成功运行了第一个简单 ...

随机推荐

  1. 如何用 ModelScope 实现 “AI 换脸” 视频

    前言 当下,视频内容火爆,带有争议性或反差大的换脸视频总能吸引人视线.虽然 AI 换脸在市面上已经流行了许久,相关制作工具或移动应用也是数不胜数.但是多数制作工具多数情况下不是会员就是收费,而且替换模 ...

  2. 洛谷 P1122 最大子树和 题解

    一道入门的树形DP. 首先我们对于数据进行有序化处理,这便于我们利用数据结构特点(可排序性)来发觉数据性质(有序.单调.子问题等等性质),以便于后续的转化.推理和处理.有序化可以"转化和创造 ...

  3. Programming abstractions in C阅读笔记p111-p113: boilerplate

    <Programming Abstractions In C>学习第47天,p111-p113,总结如下: 一.技术总结 1.boilerplate /* * File: random.h ...

  4. 深入理解 Flutter 图片加载原理

    前言 随着Flutter稳定版本逐步迭代更新,京东APP内部的Flutter业务也日益增多,Flutter开发为我们提供了高效的开发环境.优秀的跨平台适配.丰富的功能组件及动画.接近原生的交互体验,但 ...

  5. IDEA使用@Autowired注解为什么会提示不建议?

    ​在使用IDEA编写Spring相关的项目时,当在字段上使用@Autowired注解时,总会出现一个波浪线提示:"Field injection is not recommended.&qu ...

  6. 使用 docker 打包构建部署 Vue 项目,一劳永逸解决node-sass安装问题

    文章源于 Jenkins 构建 Vue 项目失败,然后就把 node_modules 删了重新构建发现 node-sass 安装不上了,折腾一天终于可以稳定构建了. 犹记得从学 node 的第一天,就 ...

  7. 上位机使用JS SerialPort进行串口通信, 包含开发环境搭建和完整示例代码

    在嵌入式开发中,我们经常需要使用上位机(PC)与一些电路模块进行通信, 用于获取一些传感器的数据,或者发送命令控制相应的电路模块.NodeJS目前支持使用SerialPort模块进行串口通信,本文主要 ...

  8. @Async注解详解 以及 可能遇到的各种问题

    一.简介1)在方法上使用该@Async注解,申明该方法是一个异步任务:2)在类上面使用该@Async注解,申明该类中的所有方法都是异步任务:3)方法上一旦标记了这个@Async注解,当其它线程调用这个 ...

  9. 【python】python开源代理ip池

    一.前言 随着互联网的不断发展,越来越多的应用需要使用高匿代理IP才能访问目标网站,而代理IP作为一种能够隐藏本机真实IP地址的工具,在网络抓取.搜索引擎排名.广告投放.反爬虫等方面有着广泛的应用场景 ...

  10. getchar()和putchar()

    #include <stdio.h> #include <stdlib.h> int main() { char ch; /*.putchar() a. putchar函数的格 ...