Linux 入门教程——模式使用

气象家园投稿第六篇:模式使用

前面我们已经讲过了如何在 Linux 下编写程序以及安装软件,在此基础上,我想大家都已对 Linux 系统有了更深的了解,那就让我们开始介绍如何在 Linux 下使用模式吧!等等,你觉得自己用不到模式,而且觉得模式很难,所以不想看本期内容?咳咳,首先,我觉得作为一名大气的研究生,模式使用应该算是基本技能,大家都会只有自己不会还是很难过的~其次,使用模式并不困难,只需要了解一些主要概念,再敲敲键盘,就行了。要说模式的真正困难之处,应该是模式的发展吧,那就需要对模式的每一部分都比较熟知了。本期内容从区域气候模式 RegCM 入手,但不会以它为中心,而是重点介绍模式使用的一般性规律。这样的话即使换成其他模式,大家也能稍作变通,自行解决了。

基本思路

记得还未接触模式之前,我在课堂上听老师介绍了各种各样的模式,心想要是想多学几个的话不得花好多时间?后来我才意识到,确实不可能把各种模式里面的各个物理过程都弄清楚,但起码学会使用不同的模式并不太难,因为各个模式的用法其实是大同小异的。那么模式使用的基本思路是什么呢?根据之前积累的经验,我觉得不管是使用什么模式,大致都可以分为五个步骤:环境配置、编译模式、模式配置、运行模式、分析结果。具体而言:

  1. 环境配置:需要设置所用的编译器、编译选项及依赖的库。
  2. 编译模式:通过编译生成可执行文件,大多数模式使用 Makefile 进行编译。
  3. 模式配置:为模式运行准备必要的数据,并对模式配置文件进行修改。
  4. 运行模式:运行编译所得的程序,通常模式会以并行的方式来运行。
  5. 结果分析:模式运行结束后,对模式输出数据进行分析。

有了基本思路,我们就可以随便找一个模式试一试了。话虽如此,刚开始使用模式的时候还是会遇到许多小问题,但随着接触越来越多,对新模式的掌握也会越来越快。RegCM 对于我来说也是一个全新的模式,那么接下来就看看我是否能够顺利使用它吧~
正式开始之前,我们先去官网下载 RegCM 的源码。这里我选择的是下载次数最多的 RegCM-4.5.0 版本,顺便还下了份用户手册:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[N@Dell regcm]$ ls
doc RegCM-4.5.0
[N@Dell regcm]$ cd RegCM-4.5.0/
[N@Dell RegCM-4.5.0]$ curl -O http://gforge.ictp.it/gf/download/frsrelease/252/1580/RegCM-4.5.0.tar.gz
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 10.6M 100 10.6M 0 0 32919 0 0:05:39 0:05:39 --:--:-- 340k
[N@Dell RegCM-4.5.0]$ cd ../doc/
[N@Dell doc]$ curl -O http://gforge.ictp.it/gf/download/docmanfileversion/97/1690/UserGuide.pdf
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 407k 100 407k 0 0 113k 0 0:00:03 0:00:03 --:--:-- 113k
[N@Dell doc]$ cd ../RegCM-4.5.0/
[N@Dell RegCM-4.5.0]$ tar -zxvf RegCM-4.5.0.tar.gz > /dev/null
[N@Dell RegCM-4.5.0]$ mv RegCM-4.5.0 Original
[N@Dell RegCM-4.5.0]$ cp -r Original test1

P.S.:由于个人习惯,我把解压得到的文件夹改名成 Original,然后复制成 test1,而之后的模式使用过程将在 test1 里进行。

环境配置

一个模式相当于是一个软件,而现在我们就是在源码安装一个软件而已,所以根据上期介绍的内容,我们得先解决编译环境的问题,即对编译器、编译选项、依赖库等进行设置。那么具体要进行哪些操作呢?这个一般都可以在模式的用户手册或者 INSTALL 文件里查看。比如在我刚下载的用户手册中,3.1节介绍了 RegCM 所需要的依赖软件,3.2节则说明了如何进行设置。根据提示,环境配置过程大致如下:

1
2
3
4
[N@Dell RegCM-4.5.0]$ ls
Original RegCM-4.5.0.tar.gz test1
[N@Dell RegCM-4.5.0]$ cd test1/
[N@Dell test1]$ ./configure CC=icc FC=ifort > config.output 2>&1

在 RegCM 里,环境配置是通过 configure 来实现的,可以看到我这里指定了将会使用 intel compiler 对 RegCM 进行编译。等一下,怎么这么简单?这里怎么就指定了一下编译器,不是说要设置依赖软件所在路径的吗?实际上我们需要设置 intel compiler,netcdf,openmpi,hdf5 等软件的路径,不过我都已经安装过,并在 .bashrc 文件里设置好了:
pic_1.png
如果你仔细查看刚才操作所生成的 config.outputconfig.log 文件里的内容,就会发现 RegCM 确实找到了那些它所需要的库。最重要的是,config.log 文件的最后显示的是 exit 0,Makefile 文件也已经生成,这意味着我们的环境配置成功了!
需要说明一下的是,不是所有模式都会通过 configure 来实现环境配置,比如有的模式会让我们直接去修改某个文件。对于更为复杂的模式(如气候系统模式),则需要修改多个文件、执行多个脚本。总之,在熟悉各种模式的套路之前,就多看看它们的用户手册吧~

编译模式

环境配置完成之后,就可以进行编译了,这里我们通过 make(它会自动读取 Makefile 文件)来编译 RegCM:

1
2
3
4
5
6
7
8
9
10
11
12
13
[N@Dell test1]$ make
CDPATH="${ZSH_VERSION+.}:" && cd . && /bin/sh /home/N/Model/regcm/RegCM-4.5.0/test1/missing aclocal-1.14
/home/N/Model/regcm/RegCM-4.5.0/test1/missing: line 81: aclocal-1.14: command not found
WARNING: 'aclocal-1.14' is missing on your system.
You should only need it if you modified 'acinclude.m4' or
'configure.ac' or m4 files included by 'configure.ac'.
The 'aclocal' program is part of the GNU Automake package:
<http://www.gnu.org/software/automake>
It also requires GNU Autoconf, GNU m4 and Perl in order to run:
<http://www.gnu.org/software/autoconf>
<http://www.gnu.org/software/m4/>
<http://www.perl.org/>
make: *** [aclocal.m4] Error 127

完了,出错了,怎么跟手册上说的不一样啊!正如前面所说,虽然知道了模式使用的五大步骤,也有用户手册供我们参考,可真正操作的时候还是会遇到一些小问题。这个时候,就需要百度、Google 了。若是搜索不到相关信息,可能还得去各种论坛提问,等待别人回答。当然在积累了一定经验之后,可以尝试自己分析、解决问题。这样的话,即使百度、Google 帮不上忙,也不必去论坛求助别人啦(毕竟大神们不一定有空~)。好了,回到我们的 RegCM,看看如何解决吧!
根据错误提示信息,大概意思是找不到 aclocal-1.14,而这个东东貌似是 Automake 里面的一个小程序。然后我查看了 RegCM 目录下的 aclocal.m4 文件,似乎 RegCM-4.5.0 使用的 Automake 版本是 1.14.1,而本机版本为 1.13.4。既然如此,我们先更新 Automake(具体过程不再赘述),之后重新 configure 一下就可以 make 啦!这里我直接把 make 的输出信息存到 make.output 文件里:

1
2
3
4
5
[N@Dell test1]$ make all install > make.output 2>&1
[N@Dell test1]$ ls bin/
average GrADSNcPlot interp_bionox regcmMPI sigma2z
chem_icbc GrADSNcPrepare interp_emissions regrid sst
emcre_grid icbc interp_pollen sigma2p terrain

make 结束之后,会发现 bin 文件夹(之前为空文件夹)下出现了多个可执行文件,make.output 文件里也没有错误信息,这说明编译已经成功了。虽说我这里是把 Automake 更新了才顺利编译的,但实际上还有其他解决方式。比如我们也可以通过修改一些文件而使 RegCM-4.5.0 直接采用 1.13.4 版本的 Automake,不过这对于经验不够的同学来说可能相对困难一些~
其实我这次编译 RegCM 还是挺顺利的,才遇到一个问题。想想以前编译某些模式的时候,都记不清报过多少次错,整了好久才成功。也许你在编译某个模式的时候也遇到了一堆问题,但千万别放弃,最后肯定能成功的!

模式配置

既然模式编译好了,那可以开始运行了吧?别急,我们还得准备好模式所需的数据,并对配置文件进行修改。
首先是数据的准备。如果我要用 RegCM 来做一系列科学问题,会需要准备大量的数据,包括强迫场和初值场等。不过这里我只是演示如何使用 RegCM,运行一个小个例就行了,所以用到的数据不多。官网上提供了一些数据,我从中选取了一部分进行下载,并存放在 data 文件夹下:

1
2
3
[N@Dell test1]$ cd /home/N/Model/regcm/data/
[N@Dell data]$ ls
CLM CLM45 EIN15 SST SURFACE

接下来我们准备一个 run 文件夹,用来运行一个实例:

1
2
3
4
5
6
[N@Dell data]$ cd /home/N/Model/regcm/RegCM-4.5.0/test1/
[N@Dell test1]$ mkdir run
[N@Dell test1]$ cd run
[N@Dell run]$ mkdir input output
[N@Dell run]$ ln -sf ../bin .
[N@Dell run]$ cp ../Testing/test_001.in .

新建的 inputoutput 文件夹分别存放输入数据和输出数据,存放可执行文件的 bin 文件夹也被链到 run 文件夹下。这里我们还复制了一个 test_001.in 文件,它就是需要修改的模式配置文件了,里面的信息包括时间设置、网格设置、输出格式、数据路径、各方案参数等等。可能有人会叫它 namelist 文件,因为它是按照 Fortran 里的 namelist 格式写的。当然其他模式可能采用不同的格式,比如有的模式采用 xml 格式,还有的则采用自定格式。对于这个个例,我们只需修改数据路径及模式时间:

1
2
3
4
5
6
7
8
9
10
[N@Dell run]$ sed -i "s/dirter.*$/dirter = 'input\/',/g" test_001.in
[N@Dell run]$ sed -i "s/inpter.*$/inpter = '\/home\/N\/Model\/regcm\/data\/',/g" test_001.in
[N@Dell run]$ sed -i "s/dirglob.*$/dirglob = 'input\/',/g" test_001.in
[N@Dell run]$ sed -i "s/inpglob.*$/inpglob = '\/home\/N\/Model\/regcm\/data\/',/g" test_001.in
[N@Dell run]$ sed -i "s/dirout.*$/dirout = 'output\/',/g" test_001.in
[N@Dell run]$ sed -i "s/gdate1.*$/gdate1 = 2000060100,/g" test_001.in
[N@Dell run]$ sed -i "s/gdate2.*$/gdate2 = 2000070100,/g" test_001.in
[N@Dell run]$ sed -i "s/mdate0.*$/mdate0 = 2000060100,/g" test_001.in
[N@Dell run]$ sed -i "s/mdate1.*$/mdate1 = 2000060100,/g" test_001.in
[N@Dell run]$ sed -i "s/mdate2.*$/mdate2 = 2000070100,/g" test_001.in

可能有人不清楚 sed 是啥,实际上它是用来修改文件的(可以把它理解成命令行式的 vi)。其实我可以直接用 vi 进行修改,不过为了方便展示我还是选择了 sed 命令。总之,我根据实际情况修改了 dirterinpterdirglobinpglobdiroutgdate1gdate2mdate0mdate1mdate2 这几个字段。大致就是指出数据的存放路径,以及设置模拟时段为2000年6月1日至30日。噢,顺便提一下,模拟区域的中心经纬度为 45.39°N、13.48°E,在意大利附近。

运行模式

对于 RegCM,在正式运行前,还得对初值场、强迫场等数据进行预处理,将该次模拟个例所需的数据提取出来,并完成相关的插值工作。在 bin 文件夹下可以找到 terrainssticbc 这三个可执行程序,terrain 处理地形与土地利用数据,sst 处理海温数据,最后用 icbc 对初值场、强迫场数据进行整合。处理过程如下:

1
2
3
4
5
6
[N@Dell run]$ ./bin/terrain test_001.in &>terrain.log
[N@Dell run]$ ./bin/sst test_001.in &>sst.log
[N@Dell run]$ ./bin/icbc test_001.in &>icbc.log
[N@Dell run]$ ls input/
test_001_DOMAIN000.nc test_001_ICBC.2000070100.nc test_001_SST.nc
test_001_ICBC.2000060100.nc test_001_LANDUSE

三个程序均会读取 test_001.in 文件里的信息,并将运行记录保存在各自的 log 文件里。运行结束后可以在 input 文件夹下查看到生成的数据文件,同时三个 log 文件的结尾处均有 Successfully ... 的字样,即数据预处理已完成。嗯,那就开始运行主体程序吧:

1
2
3
4
5
[N@Dell run]$ mpirun -np 8 ./bin/regcmMPI test_001.in &> regcmMPI.log
[N@Dell run]$ ls output/
test_001_ATM.2000060100.nc test_001_SRF.2000060100.nc
test_001_RAD.2000060100.nc test_001_STS.2000060100.nc
test_001_SAV.2000070100.nc

运行过程很简单,只需一条命令,不过需要说明下这里是采用并行方式来运行的。所谓并行运行,其实就是提高了模式的运算效率。想想我们现在的个人计算机都是多核的了,而平时运行普通程序的时候实际只用了一个核,其他核要么干自己的事要么就闲着了。所以并行其实就是把模式分成若干份,然后每个核分一份,大家都来参与模式的运算,这样不就快了么?虽说我指定使用八个核来运行 RegCM,但由于我的计算机只是伪八核,以及并行技术的一些问题,实际是达不到八倍速的。RegCM 的输出文件存放在 output 文件夹下,标准输出及错误输出被我存到了 regcmMPI.log。至此,模式运行就完成了,可以稍微看看 regcmMPI.log 里记录的有关模式运行的信息。然后就简单分析下模拟结果吧!

结果分析

想必这一步就不用我过多描述了,该怎样分析大家会有自己的想法,我就直接按我的想法给大家看看部分模拟结果吧!这里我对2000年6月的模拟结果取月平均值,并画出各个变量的空间分布:
pic_2.png
pic_3.png
大致就这样展示一下吧,大家也不要纠结其空间分布是否合理,我也没有用观测数据来验证。毕竟只是运行了一个 test,没有对模式进行调试,就算模拟得不准也是正常的~

结语

好了,本期内容主要为大家演示了一下我第一次使用 RegCM 的经历,也分享了我对模式使用的基本思路。总体来说还是挺顺利的,都没有遇到那些莫名其妙的问题,不然篇幅可能要更长了>﹏<。当然,如果大家在使用自己的模式时,遇到各种奇葩的问题,欢迎找我讨论(如果我有时间的话 ◠‿◠)。