在 Windows 系統上執行 VIC 水文模型

geoli91發表於2023-11-28

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 搜尋選單中輸入 終端,在找到的 終端 應用程式上 右鍵-以管理員身份執行

在 Windows 系統上執行 VIC 水文模型

開啟後,在其中輸入 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

20231124214211

完成後重啟 Windows 系統,即成功開啟 WSL 功能。

接下來開始配置WSL2.

設定 WSL 版本。再次開啟 終端,執行以下程式碼:

# 確保 WSL 版本為 WSL2
wsl --set-default-version 2
# 更新wsl
wsl --update
# 強制重啟wsl以使用更新
wsl --shutdown

20231124214843

透過上述方式,就實現了最新版 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。本次為了簡單,直接使用預設安裝方式。

20231124222115

執行 wsl --install -d <distribution_name> ,即可安裝需要的 Linux 發行版,其中 distribution_name 是對應的發行版名稱。如對於 Ubuntu 18.04,執行 wsl --install -d Ubuntu-18.04 命令,等待映象下載,按照提示依次輸入使用者名稱和兩次密碼即可。一定要牢記自己的使用者名稱和密碼。我這裡因為已經安裝了 Ubuntu 的子系統了,截圖中就安裝的是 Debian。

20231124223735

安裝完成後,可以在 終端 中使用 wsl -l 命令檢視已經安裝的 Linux 子系統。

可以使用 wsl -d <distribution_name> 命令進入需要的子系統,也可以在點選 終端 介面上方的 按鈕,在其中選擇需要的 Linux 子系統並點選進入。如果點選 按鈕找不到新安裝的子系統,則需要重新啟動 終端 應用程式。

20231124224630

配置 Ubuntu

透過上面兩步就已經安裝好了 Ubuntu 系統。但是由於 Ubuntu 預設的 apt 源是國外的,國內訪問不穩定。通常還需要為 apt 設定國內映象源,以便快速穩定的安裝程式。

首先進入 Ubuntu 系統,如果成功進入的話在左側會 <username>@<computer_name>,如我此處的 dju@DJQ

20231124231232

接下來,依次執行以下命令

# 切換到映象源目錄
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 中找到最新的版本。

20231125012417

點選該版本號,進入詳細介紹頁面。滑動至介紹頁面最下方 Assets 處,選擇一個 Source code 進行下載。本次選擇下載 tar.gz 格式的檔案,VIC 版本為 5.1.0。

20231125012741

下載完成後,需要將檔案傳輸至 Ubuntu 系統中。

開啟 Windows 的檔案資源管理器 (快捷鍵 Win+E),左下方找到 Linux-Ubuntu-18.04,點選開啟,即可看到該子系統的檔案。本次選擇在使用者路徑下新建一個 VIC 資料夾,並將下載好的 VIC-5.1.0.tar.gz 檔案複製至改資料夾下。

20231127153536

接下來開始編譯 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,但是實測後不影響執行,不需要在意。

20231127154915

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 上找到該檔案並透過圖形介面修改

20231127170911

引數配置完成後,執行 VIC-5.1.0/vic/drivers/classic/vic_classic.exe -g VIC_sample_data-master/classic/Stehekin/parameters/global_param.STEHE.txt 命令開始執行模型。執行結果如下圖:

20231127160902

開啟之前設定的結果輸出路徑,可以看到結果以 .txt 檔案輸出,說明程式執行成功。

20231127164420


本文參考

  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

相關文章