第三章:Linux基础与环境搭建
说实话,很多刚接触WRF的朋友,第一道坎不是模式本身,而是Linux环境。我见过太多人,模型参数调得头头是道,结果连个文件权限都搞不定,最后跑不起来干着急。这一章,咱们就把这些基础活儿捋清楚。
3.1 为什么非得用Linux?
你可能会问:我Windows用得好好的,干嘛要折腾Linux?
原因很简单——WRF是跑在Linux上的。这不是谁故意为难你,而是WRF的并行计算、文件I/O、内存管理,都跟Linux内核深度绑定。我当年第一次在Windows上装Cygwin跑WRF,折腾了三天,最后发现性能差了将近一半。嗯,从那以后我再也没在Windows上跑过WRF。
说白了,Linux就是WRF的「原生土壤」。你非要在Windows上跑,也不是不行,但你会遇到各种莫名其妙的问题。我个人建议:直接装个双系统或者用虚拟机,省心。
3.2 Linux常用命令——够用就行
你不需要成为Linux高手,但下面这些命令,你得闭着眼睛都能敲出来。
3.2.1 文件操作
文件操作是日常最频繁的。我习惯把WRF的输入数据、输出结果、代码分开存放,这样找东西方便。
# 查看当前目录
pwd
# 列出文件(-l 显示详细信息,-h 人性化显示大小)
ls -lh
# 切换目录
cd /home/user/WRF
# 创建目录(-p 可以创建多级目录)
mkdir -p WRF/input WRF/output
# 复制文件
cp namelist.input namelist.input.bak
# 移动/重命名
mv wrfout_d01.nc wrfout_d01_old.nc
# 删除文件(-r 递归删除目录)
rm -rf temp_dir
# 查看文件内容(前10行)
head -n 10 namelist.input
# 查看文件内容(后10行)
tail -n 10 rsl.out.0000
3.2.2 权限管理
权限问题,是新手最容易踩的坑。你辛辛苦苦编译好的WRF,一运行提示「Permission denied」,那种感觉……我懂。
# 查看文件权限
ls -l
# 修改权限(chmod)
chmod 755 run_wrf.sh # 给所有者读写执行,其他人读和执行
# 修改所有者(chown)
sudo chown user:user WRF/
# 递归修改目录权限
chmod -R 755 WRF/
3.2.3 进程管理
WRF跑起来之后,你怎么知道它还在不在跑?有没有卡住?这时候进程管理就派上用场了。
# 查看进程
ps aux | grep wrf
# 动态监控(像Windows的任务管理器)
top
# 更友好的监控
htop
# 杀掉进程(-9 强制杀死)
kill -9 12345
# 后台运行(& 表示后台)
./wrf.exe &
# 即使退出终端也不中断(nohup)
nohup ./wrf.exe &
我个人习惯用nohup跑长时间的任务。有一次跑一个72小时的预报,结果晚上回家电脑休眠了……从那以后,我所有长时间任务都用nohup。
3.3 WRF依赖库安装——最磨人的一步
嗯,这里我要说实话:安装依赖库,是WRF入门最磨人的一步。没有之一。我当年装netCDF就折腾了两天,最后发现是版本不匹配。
3.3.1 需要哪些库?
| 库名 | 作用 | 版本建议 |
|---|---|---|
| gcc/g++ | C/C++编译器 | ≥ 4.8.5 |
| gfortran | Fortran编译器(WRF主要用这个) | ≥ 4.8.5 |
| netCDF-C | 读写NetCDF格式数据 | 4.7.4 |
| netCDF-Fortran | Fortran接口的netCDF | 4.5.3 |
| MPI(如OpenMPI) | 并行计算 | 4.0.x |
| zlib | 压缩库 | 1.2.11 |
| HDF5 | 大数据存储格式 | 1.10.6 |
| libpng | PNG图片支持 | 1.6.37 |
| jasper | JPEG2000支持 | 1.900.1 |
3.3.2 安装顺序很重要
为什么说顺序重要?因为netCDF-Fortran依赖netCDF-C,HDF5又依赖zlib。装反了,编译就会报错。我建议按这个顺序来:
- zlib → HDF5 → netCDF-C → netCDF-Fortran
- libpng → jasper(这两个是给WPS用的)
- MPI(可以单独装,不依赖其他库)
3.3.3 环境变量配置
装完库之后,最关键的一步:告诉系统这些库在哪。不然你编译WRF的时候,它会一脸懵逼地说「找不到netCDF」。
# 编辑.bashrc(或者.bash_profile)
vi ~/.bashrc
# 添加以下内容(路径根据你的实际情况修改)
export DIR=/home/user/WRF_LIBRARIES
export CC=gcc
export CXX=g++
export FC=gfortran
export FCFLAGS=-m64
export F77=gfortran
export FFLAGS=-m64
# netCDF
export NETCDF=$DIR/netcdf
export PATH=$NETCDF/bin:$PATH
export LD_LIBRARY_PATH=$NETCDF/lib:$LD_LIBRARY_PATH
# MPI
export PATH=$DIR/mpich/bin:$PATH
export LD_LIBRARY_PATH=$DIR/mpich/lib:$LD_LIBRARY_PATH
# 生效
source ~/.bashrc
echo $NETCDF确认路径对不对。
3.4 验证安装是否成功
装完别急着跑WRF,先验证一下库能不能用。我习惯写个简单的Fortran程序测试:
! test_netcdf.f90
program test
use netcdf
implicit none
print *, "netCDF version: ", nf90_inq_libvers()
print *, "netCDF works!"
end program test
# 编译
gfortran test_netcdf.f90 -o test_netcdf -I$NETCDF/include -L$NETCDF/lib -lnetcdff
# 运行
./test_netcdf
如果输出「netCDF works!」,恭喜你,环境搭好了。如果报错……别慌,八成是路径问题,检查一下环境变量。
3.5 本章知识体系
下面这张图,帮你理清这一章的核心逻辑:
这一章的内容,说白了就是三件事:学会用Linux、装好依赖库、配好环境变量。这三件事做好了,后面编译WRF就是水到渠成的事。
公众号:蓝海资料掘金营,微信deep3321