LBM模式学习·保姆级安装及初步使用教程

在学习LBM模式的过程中,我感觉LBM模式流程简短、运行方便,但是可供参考的材料较为有限,对于一个独立学习LBM模式的初学者非常不友好(我就是这个初学者哈哈,此前从未独立运行过任何模式),因此萌生了写一篇保姆级的LBM模式教程,并将我踩过的坑一一指出,有助于后来者更快地上手该模式,而非半途而废。

本教程将从LBM模式安装开始,一直到LBM手册中第三节的范例转通结束。(该范例是观察大气对类El Nino非绝热加热的响应) 本教程以Linux系统下的intel编译器为例!

此外,为了更好地服务大家,我将本教程大部分代码以txt的形式给出,欢迎下载:LBM模式教程相关代码-Linux文档类资源-CSDN下载

如果不下载也不影响你跟着本教程转通LBM模式。


一、前言

LBM(Linear Baroclinic Model) 模式是用于理解大气中线性过程的重要工具。近期,通过分析我发现某地的热源可能有利于某个大气遥相关波列的形成和维持。因此,我想用模式来验证我的想法,而LBM模式的存在基本上是为我这个目标量身定做的哈哈!事实上,AGCM模式可能也可以验证我的这个想法,两者的不同在于,AGCM模式包含了非线性过程,而LBM模式不包含非线性过程。消除非线性过程的LBM模式更为简洁,有助于我们理解所观测到的现象。

虽说可供参考的材料有限,还是有几个重要的材料对我转通该模式有很大帮助:

·LBM手册LBM section 3 (下载 recompiled这个pdf)

·LBMFAQhttps://sites.google.com/view/faq-about-lbm/home

·作者@jiangleads的博客(后文简称Jiang的博客线性斜压模式LBM学习&安装实录 - chinagod - 博客园

·作者@摸鱼咯的博客(后文简称摸鱼咯的博客)​ Linear Baroclinic Model(线性斜压模式,LBM)初探 - 知乎

​其中LBM手册是所有要转该模式的人必备、必看的材料,不必多说;LBMFAQ解决了我遇到的三个重要问题;Jiang的博客博客非常详细的给出了linux下如何转该模式(LBM手册是在SUN下转该模式的),该博客对我的帮助极大;摸鱼咯的博客正如他自己所说,他有会转该模式的朋友帮助,因此他的博客总体感觉有些跳步,我主要是参阅了他的后处理部分。


二、核心任务和主线任务

本教程的核心任务:考察大气对类El Nino的非绝热加热强迫的响应。

根据本教程的内容,我将该核心任务拆解为6个主线任务,一方面可以让初学者在做每个部分的时候清楚自己在做什么,而不至于在反复试错的过程中迷失于局部,不知道自己在做什么了;另一方面,每一个主线任务完成都会给人以正反馈激励,有利于模式的学习。本教程主线任务如下:

1、下载并安装LBM模式

巧妇难为无米之炊,要吃饭得先买菜哈哈。这一步在$LNHOME到系统路径成功时,则任务完成。

2、生成模式的可执行文件

这相当于给模式造一个开关,没有开关你怎么启动呢哈哈。这一步到“make lbm” 编译成功,则任务完成。

3、编译输出大气的基本态

我们要想考察大气对类El Nino的非绝热加热强迫的响应,首先得预设一个大气,且给定不同的大气得到的响应是不同的(比如对于同样的强迫,给定夏季的气候态和冬季的气候态可能得到不同的结果)。这一步到运行“./ncepsbs”成功,则任务完成。

4、编译输出强迫场

构造类El Nino的非绝热加热强迫场,实际上这也是LBM手册中给出的范例,因此难度最低。这一步到运行“./mkfrcng”成功,则任务完成。

5、将强迫场加入大气的基本态并运行模式

将第4步造的强迫场加入到第3步造的大气的基本态中去,并运行模式。这一步到“csh linear-run.test.csh”成功,则任务完成。

6、模式的后处理及结果可视化

模式输出的结果实际上是GTOOL格式的,为了更方便读取,我们将其转化为nc文件,并对结果进行可视化。当你能看到大气对该强迫的响应时,则该任务完成,且核心任务也完成。


三、正文

1、下载并安装LBM模式

(1)向LBM的管理员申请账户和密码

根据LBM官网的说明,我们需要向hayashi.michiya@nies.go.jp的邮箱发送邮件,申请账户和密码,方能下载LBM相关代码。在邮件中要说清楚三件事:名字、单位和使用LBM的目的。

(这步必不可少,LBM模式的用户是无权公开或者借出账户密码的!)

(2)下载文件

要下载的文件有四个 (LBM section 4),分别是:

ln_solver2.3.tar.gz →这是LBM模式代码

ln_solver2.2.ncepdata.tar.gz  →这是NCEP的再分析数据及一些构造好的背景场和强迫场

ln_solver2.2.ecmdata.tar.gz​​​ →这是NCEP的再分析数据及一些构造好的背景场和强迫场

此外,根据LBMFAQ的提示,在linux系统下运行该模式所需要的文件:

(3)检查编译器

我将下载好的文件传到了服务器上,选择在服务器上操作是因为服务器上有配置好的intel编译器以及CDO,因此这两个部分不在本教程的范围内,属于前置条件,没有的请自行安装。(CDO可以没有,画图时采用GRADS也可以)

各位,首先输入命令看下自己intel编译器的版本(主要是看有没有,没有就先安装这个吧):

如果icc编译器没有,有gcc编译器也可;如果你是gcc编译器,本教程大部分你都可以参考,关于编译器部分,请参考Jiang的博客

(4)解压LBM文件

找一个文件夹,将下载的文件放进去并解压:

得到一个ln_solver的文件夹,有如下几个子文件:

(5)解压其他文件

将下载的其他三个文件拷贝到这个ln_solver文件夹下:

 并解压:

 解压得到的文件不会出现在ln_solver文件夹下,而是进入其下子文件夹中去。

(6)导入系统路径

从此以后第(4)步生成的这个ln_solver文件夹就是LBM模式的home地址了,我们将其导入系统路径中,后面模式相关的脚本才能识别这个路径:

这里我的地址是在/home/honghx/LBM/lnsolver/,各位要针对各自ln_solver存放的位置去指定哈。

完成以后,我们测试一下:

 如果顺利进到ln_solver的文件夹下,则已成功导入系统路径。

至此,任务1(下载并安装LBM模式)完成。

[2024年6月5日重新移植时遇到问题,补充修改]

此外,由于这样导入系统路径是临时的,部分同学(比如我本人)重启后,系统路径里就再无$LNHOME了。根据该问题,有两个修改方案,方案一:每次登陆就输入前文export那条命令;方案二:修改.bashrc文件。第一步【输入cd ~】,第二步【找到并修改.bashrc文件,在该文件的最后增补前文export命令】(注:该文件是隐藏的可以使用命令ls -a看到,可以采用vim命令修改)。


2、生成模式的可执行文件

这一步实际既要形成模式的lib库,也要形成模式的可执行文件。我们先处理lib库:

(1)设置文件$LNHOME/Lmake.inc(可以设置转模式的系统,模式分辨率,求定常解的方法,线性/非线性,正压/非正压等)

在这里我简单介绍一下这些参数:

1° 设置模式所采用的系统ARC (Architecture):

默认采用的sun 是一种unix的系统。我这里用的linux,所以设置ARC=linux

(uname -a就可以查看是linux还是unix)

2°设置模式的框架PROJECT:

这里我暂时使用最常用的tintgr,对应LBM手册上的time-advance方法,我的理解就是一点点积分,看大气环流对规定强迫的响应。mkamat是通过计算矩阵的逆,求大气对该强迫响应达到稳定时的解。其他PROJECT各有对应,可以参阅LBM的手册。

3°设置水平和垂直分辨率

这里我暂时使用常用的T21水平分辨率和垂直分辨率l20(垂直方向上20层);这里的Txx代表的是水平方向上截断的纬向波数,21代表水平方向上截断的最高频波的波数为21,而最少3个点才能完整的抓住一个波的周期,因此21个波需要63个点来抓,纬向上有360°,平均分给63个点,因此纬向分辨率约为360°/63=5.7°。这是我粗略的估计算法,参阅的是气象家园的这个帖子:请问大气模式中分辨率为T42、T21等是什么意思呢?-专业气象研究-气象家园_气象人自己的家园 (06climate.com)

4°水平波截断

我翻了一下手册,似乎只有在PROJECT=mkamat就是用矩阵的逆求解的时候才会启用这个选项,所以我们不截断水平波。

5°模式的选项

可以发现要使用对应的PROJECT才要对应开启选项。在选用时间积分模式时,我们暂时只要开启干模式选项即可。

Lmake.inc修改完毕后,保存退出。

(2)修改文件$LNHOME/mode/src/sysdep/Makedef.linux

这时候如果我们仓促进入$LNHOME/model/src文件夹中直接进行make lib操作,就会报错:

根据Jiang的博客可知,主要问题就是我们没设置编译器,我们的编译器和文件描述中的f77并不匹配,因此要进行修改$LNHOME/mode/src/sysdep/Makedef.linux文件,主要修改C编译器,Fortran编译器和链接器(原代码如下):

Jiang的博客用的C编译器是gcc,对应的gfortran;实际上icc和gcc编译器我都有,而max师姐(和读者无关的人物不必在意)和我说icc比gcc编译器计算速度快,因此我这里采用了icc编译器(想使用gcc编译器直接follow Jiang的博客即可,感觉倍儿棒!)而参考C,Fortran 常用编译器_aexit46042的博客-CSDN博客可知,icc编译器对应的Fortran编译器和链接器则是ifort。因此,做如下修改:

(3)在lib和bin文件夹下新建linux文件夹

由于LBM设计的时候可能没有linux,所以在$LNHOME/model/ lib和$LNHOME/model/bin文件夹下都没有linux文件夹,而LBM的lib库和LBM的可执行程序会分别生成在这两个文件夹下,因此需要在$LNHOME/model/ lib和$LNHOME/model/bin文件夹下新建名为linux的文件夹:

得到结果如下:

(4)编译lib库和模式的可执行文件

在$LNHOME/model/src路径下输入命令:

(如果出现报错,一可能是你没解压sysdep_linux20201125.tar.gz文件,二可以参阅Jiang的博客修改Makefile文件)

编译成功的话,会在$LNHOME/model/lib/linux下生成一个lib文件:

这就是LBM模式的lib库编译完成了!

进一步,在$LNHOME/model/src路径下,先输入make clean.special

然后输入make lbm

出现如图输出结果且没有报错,就是成功啦!应当在$LNHOME/model/bin/linux向下生成一个lbm2.t21ml20ctintgr文件:

至此,生成模式的可执行文件任务完成


3、编译输出大气的基本态(basic state

根据LBM手册的2.4节内容可知,在$LNHOME/bs/grads和$LNHOME/bs/gt3的文件夹里给了一些初始场。例如ncepwin.t21l20.grd这个文件就是1958-1997年冬季(DJF)的气候态。尽管如此,我们还是要学会基于自己研究的问题调整背景场,因此我们先跟着LBM手册学一下怎么得到自己拟定的初始场。

以用NCEP数据为例,形成大气基本态:

(1)修改$LNHOME/solver/include/make.inc.linux文件中

(上图为原始代码,下图为修改后代码)

由于我不清楚ifort -lgfortran是什么,我直接将其修改为ifort。

此外,还要修改lapack、blas和tmg的lib位置:

(上图为原始代码,下图为修改后代码)

光这样修改是不行的,因为根本不存在这样一个文件,也不存在这三个lib文件,所以需要安装lapack这个库。

(如果你已经有了lapack库,请将这三个地址直接指向对应位置即可,并跳过接下来这个支线任务)

*(2)本教程唯一支线任务:安装lapack库

1° 下载lapack:https://codeload.github.com/Reference-LAPACK/lapack/tar.gz/v3.9.0

2° 下载以后解压一下:

3° 在$LNHOME/solver/lib/路径下新建名为linux的文件夹

4° 把解压得到的文件夹移动到$LNHOME/solver/lib/linux:

【这样lapack文件夹移动过来就自动改名为了linux文件夹。为什么这样做呢?实际上是因为我在3(1)的时候修改了那三个lib文件的地址在这里,因此我直接把lapack在这里编译了。】

5° 修改$LNHOME/solver/lib/linux/lapack-3.9.0/make.inc.example文件:(修改完毕后,改名为make.inc)

(将原始的CC=gcc修改为CC=icc)

(将原始的FC=gfortran修改为FC=ifort)

(将原始的TIMER=INT_CPU_TIME修改TIMER=EXT_ETIME)

6° 修改$LNHOME/solver/lib/linux/Makefile文件:

 

将lib: lapacklib tmglib注释掉,将lib: blaslib variants lapacklib tmglib取消注释。

7° 编译lapack库

在$LNHOME/solver/lib/linux/路径下输入命令:

编译过程可能需要一段时间,编译完成,应当出现之前所说的3个lib文件:

至此,支线任务完成。

(3)编译背景场

1° 回到$LNHOME/solver/util/路径,并输入命令make bs,会得到如下结果:

说明编译成功。

2° 按照需求修改SETPAR文件

应当在这里说明,接下来要做的这几步,是希望生成一个基本态,这个基本态是时间平均(往往是季节平均,也可以单个月平均)的大气状况;此外,原本的NCEP再分析资料是pressure level,要转化为sigmal level。形成这样时间平均的、sigmal坐标系的资料才能作为模式的大气基本态。

通过设置SETPAR文件可以得到我们想要的大气基本态的情况:

(上面是原始代码,下面是我修改的代码;

bs的意思是basic state;gt3是他们开发的工具GTOOL v3的意思)

nmncp是与nmecm相对的两个模块(后文运行./ncepsbs则调用nmncp模块;运行./ecmsbs则运行nmecm模块)

cncep是你所设置的水平分辨率对应的ncep文件,比如我们这里是t21,就让cncep选中$LNHOME/bs/ncep/ncep.clim.y58-97.t21.grd 该文件是1958年-1997年的平均7个基本变量;而cncep2则地表气压的文件;calt也选中与我们空间分辨率一致的grz.t21文件即可。

kmo是起始月份,navg是做平均的时长,ozm是做纬向平均,osw是否做纬向对称,ousez是否转化为sigmal坐标系。

这里我设置了kmo=6,navg=3,ousez=t,意思是从6月开始,做3个月的平均(6-8月的平均,也就是夏季平均),且要转化成sigmal坐标系。而其他几个选项,比如是否做纬向平均涉及到你对“流”的认识(你认为什么才是“流”,随时间不变的就是“流”,还是要随x不变才是“流”)。

此外,还要修改nmbs的代码:

(上面是原始代码,下面是我修改的代码,原始文件是冬季win,我是夏季所以用sum;这是大气基本态文件输出的地方;这里要与前文的2.2的垂直和水平分辨率对应上所以要注意修改为“l20”)

3° 生成基于ncep的大气基本态

最后,我们输入命令:“./ncepsbs” 以期生成大气基本态

报错了!这样结果就是不对了哦!

根据LBMFAQJiang的博客可知,该问题产生的原因是:官方提供的初始场是SUN系统写的,所以字节序为big endian,而linux默认的是little endian。【这是一个大坑!(破音)】

进一步根据Little-endian-to-Big-endian Conversion (IA-32)的提示,我进行了操作:

然后直接运行就行了:

 

出现这样的结果就说明基本态已经输出成功了!任务3完成!


4、编译输出强迫场

跟着LBM手册的思路,我们进一步要构造强迫场了。事实上,我接下来要编译输出的这个强迫场已经存在于$LNHOME/sample/frc.t21l20.classic.grd,你如果只是想赶紧转起来这个模式,你可以先完成4(2)然后直接跳到第5步。但是我想自己编译输出一次强迫场,具体步骤如下:

(1)修改我们刚关闭的$LNHOME/solver/util/SETPAR文件:

nmfin模块就是用于设置理想化的强迫场输出位置的,我们先设置其输出到$LNHOME/data/Forcing/下(这个文件夹暂时不存在,我们待会去创建)

(实际上cfm压根不存在的,因为我们暂时用不到,所以我暂时也没管它;cfg是Grads格式的强迫文件。而cfm是Matlab格式的谱系数数据,仅在计算矩阵的逆来求稳定解时有用,我们是时间积分法,所以不涉及这个文件)

其他重要但是暂时没改动(因为文件就是按照这个例子写的)的参数:

(涡度强迫关闭,散度强迫关闭,温度强迫打开,地表气压强迫关闭,湿度强迫关闭)

nmhpr部分是强迫的水平形状:khpr=1/2代表椭圆/水平均匀的强迫,hamp是振幅(单位是1/day),xdil是纬向范围(就是多少个格点衰减到0),ydil是径向范围,xcnt是强迫的中心经度,ycnt是强迫的中心纬度

nmvpr是强迫的垂直廓线:kvpr是垂直廓线的函数(1.是正弦函数,2是gamma函数,3是上下均匀的),vamp是垂直廓线的振幅,vdil是膨胀系数(仅在垂直廓线函数设置为gamma函数的时候才生效),vcnt是垂直方向上强迫最大值所在的层次。

所有参数的意思都可以查阅:$LNHOME/solver/util/param_list

最后,我们要修改强迫场输出位置:

(2)新建Forcing和Output文件夹

刚才我们在nmfin模块中给出了一个地址,实际上这个Forcing文件夹尚不存在,我们新建这两个文件夹:

【2024年6月5日补充】

这里需要先mkdir $LNHOME/data

Forcing用于存放输出的强迫场,而Output用于存放未来模式输出的数据。

(3)编译并输出强迫场

因为我们之前make过一次,那次只修改了气候态的相关情况,现在我们make clean一下,然后重新make一下。

得到如上结果就是编译成功了(没截全)。

接下来,LBM手册和网上代码都让我直接输入mkfrcng就行了,实际上不行,我们要输入:

 

得到如左上图的结果,即为强迫场生成成功,在右侧的Forcing文件夹下应当出现右上图所示的两个文件。任务4完成!


5、将强迫场加入大气的基本态并运行模式

如果你是直接跳到第五步的,请将$LNHOME/sample/frc.t21l20.classic.grd拷贝到$LNHOME/data/Forcing路径下。

(1)复制并修改linear-run.test.csh文件

进入$LNHOME/model/sh/tintgr文件夹,可以看到有诸多csh文件,这些都是官方提供的模板,我们在此基础上进行微小的调整即可。

首先我们copy一下,以防改错了哈哈:

打开这个test文件,可以看到里面有很多属性需要修改。

逐一进行修改:

(原始文件如上图,修改后如下图)

·LNHOME是系统路径,我按照我的位置修改了一下

·SYSTEM是系统,我是linux就linux

·RUN是make lbm得到的模式可执行文件所在的位置(暂时没改)

·FDIR是强迫场所在的文件夹,我按照我的位置修改了一下

·DIR是模式输出数据的位置,我把它修改为之前新建的Output文件夹了。

·BSFILE是大气基本态所在的文件名,是之前我们./ncepsbs生成的大气基本态文件名

·SFRC是稳定强迫场的文件名,是之前我们./mkfrcng生成的强迫场。

·FRC是强迫场的文件名,只要我们设置了稳定的强迫场(因为该文件用于强迫场随时间改变的情况,而SFRC则相反是强迫场不随时间变化),这一项就不会生效,所以我将其与SFRC设置为同名文件了。

·TEND是模式积分的时长,根据摸鱼咯的博客的说明可知,tend=51天的时候,模式运行20天,tend=59的时候模式运行27天,我这里设置了tend=59,使其运行27天。

在这个linear-run.test.csh文件中,还可以设置一些耗散项、阻尼项等,我暂时都不修改,先转起来再说。

【注意】根据LBMFAQ,对nmtime进行修改 【这也是个大坑,花了我好长时间找问题】

(原始文件如上图,修改后如下图)

(2)运行LBM模式

先赋予脚本权限,随后运行:

可能会输出一个 “rm: cannot remove ‘SYSOUT’”的警告,忽视它即可,是因为第一次跑,没有SYSOUT所以也删不掉。

顺利跑完模式,应当在$LNHOME/data/Output/文件夹下出现如下一些变量:

z(位势高度)、w(垂直运动)、v(经向风)、u(纬向风)、t(温度)、psi(地表气压)、p(气压)、chi(流函数)

至此,LBM模式运行完毕,任务5完成!


6、模式的后处理及结果可视化

模式输出的8个变量实际上是GTOOL格式的,为了更方便读取,我们先利用LBM给的工具gt2gr转换成grd格式,将8个变量整合进一个grd文件,最后再利用cdo转换成nc文件,进行可视化。

(1)修改$LNHOME/solver/util/SETPAR:

(上面是原始代码,下面是我修改后的代码;实际上就是指向那8个变量的位置,删除cfq、cfx和cfy,这三个变量是湿模式才要用到的;cfo是输出变量的位置和文件名)

 →  

(oclassic是干模式就用t,湿模式才用f)

(2)运行“./gt2gr”

得到如下结果:

 

在$LNHOME/data/Output/可以出现这个文件:

(3) 利用CDO将grd格式转换成nc格式

利用CDO转换成nc文件需要ctl,我不会写啊!突然发现官方给了这个ctl文件的范例,位于$LNHOME/sample/linear.t21l20.classic.ctl,所以先进入$LNHOME/data/Output/文件夹,并把那个范例copy过来并改个名字:

修改一下这个ctl文件:

(因为我把grd的名字改了,所以这里DSET也要改掉)

此外,根据LBMFAQ应当在CTL中增补OPTIONS如上图所示。

最后,根据摸鱼咯的博客我们利用CDO将grd文件转化为nc文件进行操作:

同理,我们将$LNHOME/data/Forcing/frc.t21l20.classic.grd转换nc文件:(该grd文件的ctl文件位于$LNHOME/sample/frc.t21l20.classic.ctl;记得OPTIONS)

(4)绘制加热场及其大气环流响应

根据上述两个nc文件,我们可以绘制加热场(,加热大于1K day-1的区域标红)并叠加大气环流(850hPa和200hPa),结果如下图所示:

可以看到在热带这样的非绝热加热强迫,可以激发出典型的Gill响应,且响应整体是斜压的(高层与低层环流相反),高层比低层的响应更加强烈。

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值