线性斜压模式LBM学习&安装实录

本文基本参照了LBM的用户手册进行。

环境:Ubuntu 18.04LTS (Windows Subsystem Linux)

编译器:gfortran 7.5.0

安装包:

lapack-3.9.0.tar.gz 下载地址 https://codeload.github.com/Reference-LAPACK/lapack/tar.gz/v3.9.0

lapack-3.8.0.tar.gz 下载地址 http://www.netlib.org/lapack/lapack-3.8.0.tar.gz
lapack-3.2.tgz 下载地址 http://www.netlib.org/lapack/lapack-3.2.tgz

ln_solver2.2.tar.gz (需要给作者发邮件下载)下载地址 https://ccsr.aori.u-tokyo.ac.jp/~hiro/access_lmtd/ln_solver2.2.tar.gz

注意:请去https://ccsr.aori.u-tokyo.ac.jp/~lbm/sub/lbm_4.html 下载最新的代码和补丁包,因为老的代码bug太多,且资料不全。

0 文件准备

新建一个文件夹,把需要用到的安装包移到这个文件夹 

jiang@jiang:/mnt/d/WSL/LBM$ ls
lapack-3.9.0.tar.gz  ln_solver2.2.ecmdata.tar.gz  ln_solver2.2.ncepdata.tar.gz  ln_solver2.2.tar

1 安装lapack.3.9.0 

 安装lapack-3.2 (似乎是能兼容的最新版本)

jiang@jiang:/mnt/d/WSL/LBM$ tar -xzvf lapack-3.9.0.tar.gz
jiang@jiang:/mnt/d/WSL/LBM$ cd lapack-3.9.0/
jiang@jiang:/mnt/d/WSL/LBM/lapack-3.9.0$ cp make.inc.example make.inc

(注:对于intel编译器,需要修改CC=icc, FC=ifort, 另外就是TIMER    = EXT_ETIME_ 参考自http://blog.sciencenet.cn/blog-349974-615188.html)

编辑 Makefile  vi Makefile 

找到 lib: 选项。默认的情况是不编译 blas 库的。需要修改这一行改为

lib: blaslib variants lapacklib tmglib

再编译这些库

make

此时,在该目录下会生成如下库文件: liblapack.a, librefblas.a, libtmglib.a  blas_LINUX.a, lapack_LINUX.a, tmglib_LINUX.a,variants_Linux.a

将它们复制到需要的目录下

2 安装ln_solver2.2

2.0 解压安装包,设置环境变量

jiang@jiang:/mnt/d/WSL/LBM$ tar -xzvf ln_solver2.2.tar.gz
jiang@jiang:/mnt/d/WSL/LBM$ export LNHOME=/mnt/d/WSL/LBM/ln_solver

2.1 根据实际情况,修改$LNHOME/Lmake.inc文件。 vi $LNHOME/Lmake.inc 

因为是linux系统,所以将ARC这行改为

ARC = linux

根据使用资料的分辨率,修改对应行 (HRES, VRES等变量):

###### Horizontal Resolution ################
#HRES = t10
HRES = t21
#HRES = t42

###### Vertical Resolution ################
#VRES = l1
#VRES = l5
#VRES = l8
#VRES = l11
VRES = l20

###### Zonal wave truncation ################
#ZWTRN =
#ZWTRN = m15
#ZWTRN = m10
ZWTRN = m5
#ZWTRN = m6

2.2 根据使用的编译器情况,酌情修改./model/src/sysdep/Makedef.linux文件中编译器的定义。  vi $LNHOME/model/src/sysdep/Makedef.linux 

CC,FC和LD分别指定了C编译器,Fortran编译器和链接器,根据实际,进行修改。

修改了这些

CC = gcc
FC = gfortran
LD = gfortran

2.3 编译生成 静态库文件。由于默认的安装包没有linux文件夹,需要自行创建(在lib和bin两个地方都要创建)

jiang@jiang:/mnt/d/WSL/LBM/ln_solver$ mkdir $LNHOME/model/lib/linux

jiang@jiang:/mnt/d/WSL/LBM/ln_solver$ mkdir $LNHOME/model/bin/linux

jiang@jiang:/mnt/d/WSL/LBM/ln_solver$ cd $LNHOME/model/src

jiang@jiang:/mnt/d/WSL/LBM/ln_solver/model/src$ make lib

如果没有报错,并且在$LNHOME/model/lib/linux目录下会生成LBM库文件,应该就没问题了。

这个库文件的文件名反映了模拟的设置,比如你用的LBM版本号是2,模式的水平分辨率是T21,模式层20层的,文件名就是liblbm2t21ml20c.a

注意:有时候虽然目录下生成了静态库文件,但编译时出现错误,表明还没编译成功

比如出现如下错误: make[1]: *** No rule to make target 'yylinux.o', needed by 'lib'.  Stop. 这种情况说明编译时yylinux.o没有生成。

一个笨重的解决办法是进入$LNHOME/model/src/sysdep目录,手动生成这个文件:

cd $LNHOME/model/src/sysdep
gcc -c yyLinux.c

然后返回到$LNHOME/model/src,继续编译make (记住不要make clean),如果没有报错,那么就成功了

另一个相对不那么笨重的办法是修改$LNHOME/model/src/sysdep目录下的Makefile 文件,然后重新编译 vi $LNHOME/model/src/sysdep/Makefile 

将lib这一段进行修改,加入 yy$(SYSTEM).c这个文件的实现规则(红色字体部分)

1 lib:            $(OBJS) yy$(SYSTEM).c
2                 $(CC) -c yy$(SYSTEM).c
3                 $(AR) $(LIBRARY) $(OBJS)
4                 $(RANLIB) $(LIBRARY)

注意: 上面第2-4行前面为TAB键,并非空格

2.4准备基本态

在 $LNHOME/bs/grads 和 $LNHOME/bs/gt3 文件夹提供了几种基本态。例如ncepwin.t21l20.grd是对于T21L20模式的基本态,从1958-1997冬季平均的NCEP/NCAR再分析数据得到的。而erawin.t21l20.grd是对于T21L20模式的基本态,从1961-90年 ECMWF的再分析(ERA 40)数据得到的。可以使用一个工具去从从NCEP-NCAR或者ECMWF再分析中 将观测气候场作为平均态.

2.4.1NCEP-NCAR 基本态

1) 将ln_solver2.2.ncepdata.tar.gz文件放到 $LNHOME 目录下,随后进入 $LNHOME 目录,解压

cd $LNHOME
tar -xzvf ln_solver2.2ncapdata.tar.gz

在 $LNHOME/bs/ncep 目录下会发现6个GrADS文件和对应的ctl文件,分别对应了三种不同水平分辨率的气候资料。

2) 随后,编译工具

需要先在 $LNHOME/solver/include  目录下创建make.inc.linux,这里参考 $LNHOME/solver/include/make.inc.sgl  文件进行修改,并在该文件中指定刚才安装的lapack库文件所在路径

 vi $LNHOME/solver/include/make.inc.linux 

这是我用的make.inc.linux,记住根据自己的实际情况,修改对应编译器和库,把 BLASLIB、LAPACKLIB、和TMGLIB 这三个库的路径写对:

#  The machine (platform) identifier to append to the library names
#
PLAT = linux
#
#  Modify the FORTRAN and OPTS definitions to refer to the
#  compiler and desired compiler options for your machine.  NOOPT
#  refers to the compiler options desired when NO OPTIMIZATION is
#  selected.  Define LOADER and LOADOPTS to refer to the loader and
#  desired load options for your machine.
#
FORTRAN  = gfortran
OPTS     = -O3 -u -static
NOOPT    =
LOADER   = gfortran
LOADOPTS =
#
#  The archiver and the flag(s) to use when building archive (library)
#  If you system has no ranlib, set RANLIB = echo.
#
ARCH     = ar
ARCHFLAGS= cr
RANLIB   = echo
#
RM       = rm -f
CP   = cp -f
MV   = mv -f
#
#  The location of the libraries to which you will link.  (The
#  machine-specific, optimized BLAS library should be used whenever
#  possible.)
#
BLASLIB      = /mnt/d/WSL/LBM/lapack-3.9.0/librefblas.a
LAPACKLIB    = /mnt/d/WSL/LBM/lapack-3.9.0/liblapack.a
TMGLIB       = /mnt/d/WSL/LBM/lapack-3.9.0/libtmglib.a
#EIGSRCLIB    = 
#
#  LBM library
#
LDLIBS       = $(LNHOME)/model/lib/$(ARC)/liblbm2$(HRES)m$(VRES)c.a
#
# byte unit
#
MBYT    = 4
View Code

将之前编译好的lapack 库链接到指定目录下(注意正确的路径)

3)创建linux文件夹,编译生成 ncepsbs可执行文件

mkdir  $LNHOME/solver/lib/linux/
cd $LNHOME/solver/util
make bs

目前出现问题,缺失rewnml函数文件,待完成后更!

经过检查发现,这个函数的实现位于model/ylinux中,而联想到编译liblbm2t21ml20c.a静态库时出现的一个错误,最后确认是Lmake.inc没有正确指定C编译器。

此时路径下应该生成了可执行文件ncepsbs。

4) 指定文件名称和参数,从而通过时间平均,创建基本态,将垂直坐标从气压坐标转换成σ坐标。

设置初始场的选项,根据实际情况,修改SETPAR这个文件  $vi $LNHOME/solver/util/SETPAR 

需要注意的是,垂直层次的基本态已经在Lmake.inc中指定,如果想要考察在夏季(JJA)的线性响应,可以通过指定如下来准备夏季基本态 (如起始月份kmo,平均时段navg)

&nmncp cncep='/mnt/d/WSL/LBM/ln_solver/bs/ncep/ncep.clim.y58-97.t21.grd',
       cncep2='/mnt/d/WSL/LBM/ln_solver/bs/ncep/ncep.clim.y58-97.ps.t21.grd',
       calt='/mnt/d/WSL/LBM/ln_solver/bs/gt3/grz.t21',
kmo=6, navg=3, ozm=f, osw=f, ousez=t
&end

&nmbs cbs0='/mnt/d/WSL/LBM/ln_solver/bs/gt3/ncepsum.t21l5',
cbs='/mnt/d/WSL/LBM/ln_solver/bs/grads/ncepsum.t21l5.grd'
&end 

或者,通过选择 ozm=t 来获取纬向均一基本态。当你指定上述参数后,执行 ./ncepsbs 将会创建基本态。会生成两个文件,它们的名称分别由cbs0和cbs变量指定,是Gtool和GrADS格式的。此处可以看到在 $LNHOME/bs/gt3/ 和 $LNHOME/bs/grads/目录下分别生成了这两个文件。

看看如下输出:  

注:#巨坑#!官方提供的初始场(包括NCEP和ECMWF的)是在SUN机器上写的,字节序为Big_Endia,正常PC机器写的二进制的字节序是Little_Endian。在用gfortran编译器编译时,执行 ./ncepsbs会报错,无法读取数据。这个时候,需要告诉gfortran编译器环境变量 GFORTRAN_CONVERT_UNIT='big_endian'才能执行:

export GFORTRAN_CONVERT_UNIT='big_endian'
./ncepsbs

看看相应输出

jiang@jiang:/mnt/d/WSL/LBM/ln_solver/solver/util$ GFORTRAN_CONVERT_UNIT='big_endian' ./ncepsbs

 ### start making basic state ###

 ... selected month from:          12  ...
 ... number of month averaged:           3  ...

  @@ Input :/mnt/d/WSL/LBM/ln_solver/bs/ncep/ncep.clim.y58-97.t21.grd                               
  @@ Input :/mnt/d/WSL/LBM/ln_solver/bs/ncep/ncep.clim.y58-97.ps.t21.grd                            
  @@ Output:/mnt/d/WSL/LBM/ln_solver/bs/gt3/ncepsum.t21l5zm.sy                                      
  @@ Output:/mnt/d/WSL/LBM/ln_solver/bs/grads/ncepsum.t21l5zm.sy.grd                                

 ... data read start ...
    ... month =           12
    ... month =            1
    ... month =            2
 ... data read end ...
 ... Z used for Ps ...
  *** precision check ..    1.1000000000000001
  *** precision check ..    1.0100000000000000
  *** precision check ..    1.0009999999999999
  *** precision check ..    1.0001000000000000
  *** precision check ..    1.0000100000000001
  *** precision check ..    1.0000009999999999
  *** precision check ..    1.0000001000000001
  *** precision check ..    1.0000000099999999
  *** precision check ..    1.0000000010000001
  *** precision check ..    1.0000000001000000
  *** precision check ..    1.0000000000100000
  *** precision check ..    1.0000000000010001
  *** precision check ..    1.0000000000000999
  *** precision check ..    1.0000000000000100
  *** precision check ..    1.0000000000000011
  *** precision check ..    1.0000000000000000
 ... spectral smoothing for Ps ...
  @@@ DSPHE: SPHERICAL TRANSFORM INTFC. 93/12/07
 ... P( 17 ) --> S(          20  ) transform OK ...
 ... write basic state ...
 ... spectral smoothing for U  ...
     ... U ...
 ... spectral smoothing for V  ...
     ... V ...
 ... spectral smoothing for T  ...
     ... T ...
     ... Ps ...
 ... spectral smoothing for Q  ...
     ... Q ...
 ... end execution ...
View Code

作为正压模式(c.f. section8),一个基本态仅仅包含流函数,如果你使用正压模式,参考section8,这描述了如何生成基本态。

 2.4.2 ERA 40 基本态

1)对于使用ERA40数据的情况,将ECMWF数据ln_solver2.2.ecmdata.tar.gz拷贝到$LNHOME,随后执行

cd $LNHOME
tar -xzvf ln_solver2.2.ecmdata.tar.gz

2)设置初始场的选项,根据实际情况,修改SETPAR这个文件  $vi $LNHOME/solver/util/SETPAR 

 &nmecm cecm='/mnt/d/WSL/LBM/ln_solver/bs/ecmwf/ERA40.clim.t21.grd',
        calt='/mnt/d/WSL/LBM/ln_solver/bs/gt3/grz.t21',
        kmo=6, navg=3, ozm=f, osw=f
 &end

&nmbs cbs0='/mnt/d/WSL/LBM/ln_solver/bs/gt3/erasum.t21l5',
cbs='/mnt/d/WSL/LBM/ln_solver/bs/grads/erasum.t21l5.grd'
&end

同上面的巨坑一样,执行的时候要先设置好编译器的字节序

 export GFORTRAN_CONVERT_UNIT='big_endian'
./ecmsbs

 看看如下输出:

jiang@jiang:/mnt/d/WSL/LBM/ln_solver/solver/util$ GFORTRAN_CONVERT_UNIT='big_endian' ./ecmsbs

 ### start making basic state ###

 ... selected month from:           6  ...
 ... number of month averaged:           3  ...

  @@ Input :/mnt/d/WSL/LBM/ln_solver/bs/ecmwf/ERA40.clim.t21.grd                                    
  @@ Input :/mnt/d/WSL/LBM/ln_solver/bs/gt3/grz.t21                                                 
  @@ Output:/mnt/d/WSL/LBM/ln_solver/bs/gt3/erasum.t21l5                                            
  @@ Output:/mnt/d/WSL/LBM/ln_solver/bs/grads/erasum.t21l5.grd                                      

 ... data read start ...
    ... month =            6
    ... month =            7
    ... month =            8
 ... data read end ...
 ... topography data read end ...
 ... Z used for Ps (temporary) ...
  *** precision check ..    1.1000000000000001
  *** precision check ..    1.0100000000000000
  *** precision check ..    1.0009999999999999
  *** precision check ..    1.0001000000000000
  *** precision check ..    1.0000100000000001
  *** precision check ..    1.0000009999999999
  *** precision check ..    1.0000001000000001
  *** precision check ..    1.0000000099999999
  *** precision check ..    1.0000000010000001
  *** precision check ..    1.0000000001000000
  *** precision check ..    1.0000000000100000
  *** precision check ..    1.0000000000010001
  *** precision check ..    1.0000000000000999
  *** precision check ..    1.0000000000000100
  *** precision check ..    1.0000000000000011
  *** precision check ..    1.0000000000000000
 ... spectral smoothing for Ps ...
  @@@ DSPHE: SPHERICAL TRANSFORM INTFC. 93/12/07
 ... P( 23 ) --> S(          20  ) transform for T and Q ...
 ... spectral smoothing for T  ...
 ... spectral smoothing for Q  ...
 ... SLP --> Ps ...
 ... spectral smoothing for Ps ...
 ... P( 23 ) --> S(          20  ) transform ...
 ... write basic state ...
 ... spectral smoothing for U  ...
     ... U ...
 ... spectral smoothing for V  ...
     ... V ...
 ... spectral smoothing for T  ...
     ... T ...
     ... Ps ...
 ... spectral smoothing for Q  ...
     ... Q ...
 ... end execution ...
View Code

3 稳定响应 

LBM的一个主要用途是计算大气对规定强迫(如非绝热加热异常)的稳定响应。在这个软件包中,我们提供了三种获得稳态响应的方法。3.1中描述的第一种方法是模式的时间积分。这种方法通常用于获得稳定响应(如Jin和Hoskins 1995)。另外两种方法都是基于稳定模态动力学方程(the steady version of the dynamical equation)的矩阵反演。虽然它们肯定能确保响应是对强迫的精确稳定解,但矩阵求逆在计算上可能非常昂贵,尤其是对于第3.2节中介绍的第二种方法。由于获得稳定解的最佳方法取决于你想解决的问题,你应该根据自己的目的选择一种合适的方法。 

3.1 时间积分

LBM的时间积分可以用与AGCM相似的方式进行,只是模型需要一个基本状态和初始扰动或稳态强迫,而不是边界和初始条件。输出文件包含以下8个(你不能添加或者删除变量):

  • 流函数 [m2 s-1]
  • 速度势 [m2 s-1]
  • 纬向风 [m s-1]
  • 经向风 [m s-1]
  • 气压层垂直速度(ω) [hPa s-1]
  • 温度 [K]
  • 位势高度 [m]
  • 表面压力 [hPa]

 为了实现计算,有以下四步

3.1.1 生成模式二进制文件

在 $LNHOME/Lmake.inc 文件中指定'PROJECT = tintgr' 。注意在该文件中的纬向波截断和模式选项应当这样给定

###### Zonal wave truncation ################
ZWTRN  =    
#ZWTRN  = m15
#ZWTRN  = m10
#ZWTRN  = m5
#ZWTRN  = m6

###### Model options         ################

### time-advance linear model (incl. storm track model)
######## dry model
MODELOPT = -DOPT_CLASSIC
######## moist model
#MODELOPT = 
#MODELOPT = -DOPT_POSDEF
#MODELOPT = -DOPT_OUTPOSDEF

然后,输入以下命令

cd $LNHOME/model/src
make clean.special
make lbm

假设你选择了水平分辨率为T21和垂直20层,在Sun WS机器上。以上程序会在 $LNHOME/model/bin/sun/ 目录下生成libm2.t21ml20cintgr可执行文件。该可执行文件用于运行LBM

我们的情况(水平T21和20层,Linux系统),在 $LNHOME/model/bin/linux/ 也生成了对应的文件lbm2.t21ml20ctintgr。

3.1.2 强迫的准备 preparing forcing

在运行LBM之前。你需要准备一个GrADS文件的初始扰动或稳定强迫的数据(这两个文件都需要相同格式)。在 $LNHOME/sample/ 中可以找到一个使用T21L2分辨率进行强迫的例子。强迫文件frc.t21l20.classic.grd模拟了一种与厄尔尼诺有关的非绝热加热异常,可以用来测试你的模式。通过查看相应的.ctl文件可以清楚地了解到,该文件包含了所有的预测变量,因此可以进行其他类型的稳定强迫,例如涡度强迫而不是加热

我们也提供了一种工具,mkfrcng,可以容易地创建一个理想化的简单强迫。可以在编辑参数文件 $LNHOME/solver/util/SETPAR 后,创建强迫数据。例如。示例数据frc.t21l20.classic.grd是通过指定参数来实现的

 &nmfin cfm='/home/tropics/hiro/ln_solver/data/frc.t21l20.classic.mat',
        cfg='/home/tropics/hiro/ln_solver/sample/frc.t21l20.classic.grd'
        fact=1.0,1.0,1.0,1.0,1.0
 &end
 
 &nmvar ovor=f, odiv=f, otmp=t, ops=f, osph=t
 &end

 &nmhpr khpr=1,
        hamp=1.,
        xdil=40.,
        ydil=12.,
        xcnt=210.,
        ycnt=0.
 &end

 &nmvpr kvpr=2,
        vamp=8,
        vdil=20.,
        vcnt=0.45
 &end


 &nmall owall=t
 &end

 &nmcls oclassic=t
 &end

由 cfg文件定义GrADS强迫数据,而cfm确定了对应的球面系数数据,这个在此处没有使用,但是在3.2和3.3节是有必要的。其他参数被简要的描述了,可以参考描述文件 $LNHOME/solver/util/param_list 获取更多信息。&nmvar表示需要对哪个变量进行强迫(在上面的例子中是只有温度变量进行强迫)。强迫的水平和垂直形态由&nmhpr和&nmvpr所确定。

khpr 水平形态: 1=椭圆,2=带状均匀

hamp 水平函数振幅

xdil 纬向范围(半径的一半)

ydil 经向范围(半径的一半)

xcnt 中心经度(从0°到360°)

ycnt 中心纬度(从-90°到90°)

kvpr 垂直廓线: 1=正弦, 2=gamma, 3=uniform

vamp 垂直廓线的振幅(单位是 day-1

vdil 扩张参数(dilation parameter)(仅用于kvpr=2)

vcnt 在σ坐标系中的中心层次

当你根据上述说明修改了件 $LNHOME/solver/util/SETPAR之后,执行

1 cd $LNHOME/solver/util
2 make clean
3 make
4 mkfrcng

3.1.3 运行模式

----(略)-------

3.1.4 后处理和可视化

3.2 矩阵求逆。 第一部分:求解全矩阵

3.2.1 生成模式二进制文件

3.2.2 计算线性算子矩阵

3.2.3 驱动的准备 preparing forcing

3.2.4 求解线性系统

3.3 矩阵求逆。 第二部分:定常波模型(stationary Wave Model, SWM)

3.3.1 生成模式二进制文件

3.3.2 计算线性算子矩阵

3.3.3 驱动的准备 preparing forcing

3.3.4 求解线性系统

3.3.5 关于地形强迫

3.4 加速迭代方法(Accelerated iterative method, AIM)

3.4.1 生成模式二进制代码

3.4.2 计算线性算子矩阵

3.4.3 加速矩阵和求逆 (acceleration matrix and inverse)

3.4.4 驱动的准备 preparing forcing

3.4.5 迭代

4 风暴轴模式(Storm Track Model, STM)

4.1 什么是STM?

4.2 生成模式二进制文件

4.3 准备初始扰动

4.4 运行STM

5 模态分解

5.1 首选的检测模式

5.2 特征值分析 eigenvalue analysis

5.3 奇异向量分析 singular vector analysis

6 非线性动力模式

6.1 用剩余项R驱动非线性运行

6.1.1 准备R

6.1.2 运行模式

6.2 使用温度复原temperature restoring进行非线性运行

6.3 后处理和可视化

7 湿LBM

7.1 时间积分

7.1.1 生成模式二进制文件

7.1.2 准备基本态SST

7.1.3 驱动的准备 preparing forcing

7.1.4 运行模式

7.1.5 后处理和可视化

7.2 稳定响应

7.2.1 准备模式二进制

7.2.2 准备基本态和异常SST

7.2.3 计算线性算子矩阵

7.2.4 计算驱动向量

7.2.5 求解线性系统

7.2.6 关联加热响应

8 正压模式

8.1 稳定响应

8.2 模态分解

A 线性动力的数学原理

A.1 线性动力系统

A.2 动态算子的正交基orthogonal basis for dynamical operator

A.3 偏好模的检测 detection of preferred modes

A.4 线性对流和动力的相互作用 linear convective interation with dynamics

B 故障排除

B.1 如何在不同的系统中使用?

B.2 如何在T21高斯网格中生成基本态和强迫

B.3 为什么不能编译命令符

B.4 想要对模式进行修改,我需要在哪里查看?

B.5 想要在SR8000中提交批处理作业

参考文献

  

原文地址:https://www.cnblogs.com/jiangleads/p/11893290.html