写在前面的话:
LBM的安装见其他up主,这里不多加赘述。
1.准备初始场
1.1首先把ncl的初始文件转化为符合LBM需求的.grd文件
因为我们想做的分辨率是t42l20的,也就是(lat,lon)=(64,128)
begin
z_read = addfile("/home/group/data/NCEP/hgt.mon.mean.nc", "r")
z = z_read->hgt(:(1986-1948)*12+11,:,::-1,:)
z_clm = clmMonTLLL(z)
rh_read = addfile("/home/group/data/NCEP/rhum.mon.mean.nc", "r")
rh = rh_read->rhum(:(1986-1948)*12+11,:,::-1,:)
rh_clm = clmMonTLLL(rh)
q_read = addfile("/home/group/data/NCEP/shum.mon.mean.nc", "r")
q = q_read->shum(:(1986-1948)*12+11,:,::-1,:)
q_clm = clmMonTLLL(q)
q_clm = q_clm/1000.
printVarSummary(q_clm)
t_read = addfile("/home/group/data/NCEP/air.mon.mean.nc", "r")
t = t_read->air(:(1986-1948)*12+11,:,::-1,:)
t = t+273.15
t_clm = clmMonTLLL(t)
printVarSummary(t_clm)
u_read = addfile("/home/group/data/NCEP/uwnd.mon.mean.nc", "r")
u = u_read->uwnd(:(1986-1948)*12+11,:,::-1,:)
u_clm = clmMonTLLL(u)
v_read = addfile("/home/group/data/NCEP/vwnd.mon.mean.nc", "r")
v = v_read->vwnd(:(1986-1948)*12+11,:,::-1,:)
v_clm = clmMonTLLL(v)
omega_read = addfile("/home/group/data/NCEP/omega.mon.mean.nc", "r")
omega = omega_read->omega(:(1986-1948)*12+11,:,::-1,:)
omega_clm = clmMonTLLL(omega)
lon = z_clm&lon
lat = z_clm&lat
LON = fspan(0, 357.1875, 128)
LAT = (/-87.8638, -85.0965, -82.3129, -79.5256, -76.7369, -73.9475, -71.1577,-68.3678, -65.5776, \
-62.7873, -59.9970, -57.2066, -54.4162, -51.6257,-48.8352, -46.0447, -43.2542, -40.4636, \
-37.6731, -34.8825, -32.0919,-29.3014, -26.5108, -23.7202, -20.9296, -18.1390, -15.3484, \
-12.5578, -9.76715, -6.97653, -4.18592, -1.39531, 1.39531, 4.18592, 6.97653,9.76715, 12.5578, \
15.3484, 18.1390, 20.9296, 23.7202, 26.5108,\
29.3014, 32.0919, 34.8825, 37.6731, 40.4636, 43.2542, 46.0447,\
48.8352, 51.6257, 54.4162, 57.2066, 59.9970, 62.7873, 65.5776,\
68.3678, 71.1577, 73.9475, 76.7369, 79.5256, 82.3129, 85.0965,\
87.8638/)
z_t42 = linint2_Wrap(lon, lat, z_clm, True, LON, LAT, 0)
rh_t42 = linint2_Wrap(lon, lat, rh_clm, True, LON, LAT, 0)
q_t42 = linint2_Wrap(lon, lat, q_clm, True, LON, LAT, 0)
t_t42 = linint2_Wrap(lon, lat, t_clm, True, LON, LAT, 0)
u_t42 = linint2_Wrap(lon, lat, u_clm, True, LON, LAT, 0)
v_t42 = linint2_Wrap(lon, lat, v_clm, True, LON, LAT, 0)
omega_t42 = linint2_Wrap(lon, lat, omega_clm, True, LON, LAT, 0)
printVarSummary(omega_t42)
; z_t42_2 = z_t42(LON|:,LAT|:,level|:,month|:)
; rh_t42_2 = rh_t42(LON|:,LAT|:,level|:,month|:)
; q_t42_2 = q_t42(LON|:,LAT|:,level|:,month|:)
; t_t42_2 = t_t42(LON|:,LAT|:,level|:,month|:)
; u_t42_2 = u_t42(LON|:,LAT|:,level|:,month|:)
; v_t42_2 = v_t42(LON|:,LAT|:,level|:,month|:)
; omega_t42_2 = omega_t42(LON|:,LAT|:,level|:,month|:)
write_file_name = "/home/group/xdwang/data/NCEP/NCEP1.clim.t42120.grd"
nan = -9.96921e+36;omega_t42@_FillValue
setfileoption("bin","WriteByteOrder","BigEndian")
do nt=0,11
do jj=0,16
fbinrecwrite(write_file_name, -1, z_t42(nt,jj,:,:))
end do
do jj=0,7
fbinrecwrite(write_file_name, -1, rh_t42(nt,jj,:,:))
end do
do jj=0,7
fbinrecwrite(write_file_name, -1, q_t42(nt,jj,:,:))
end do
do jj=0,16
fbinrecwrite(write_file_name, -1, t_t42(nt,jj,:,:))
end do
do jj=0,16
fbinrecwrite(write_file_name, -1, u_t42(nt,jj,:,:))
end do
do jj=0,16
fbinrecwrite(write_file_name, -1, v_t42(nt,jj,:,:))
end do
do jj=0,11
fbinrecwrite(write_file_name, -1, omega_t42(nt,jj,:,:))
end do
end do
print("DONE")
end
然后把文件放在$LNHOME/bs/ncep 中
1.2生成初始场
$LNHOME/solver/util中的SETPAR文件修改
&nmbs cbs0='/home/group/Audery/LBM/ln_solver/bs/gt3/ncepwin.48-86.t42l20',
cbs='/home/group/Audery/LBM/ln_solver/bs/grads/ncepwin.48-86.t42l20.sy.grd'
&end
#这部分是输出的初始场资料
&nmncp cncep='/home/group/Audery/LBM/ln_solver/bs/ncep/NCEP1.clim.t42120.grd',
cncep2='/home/group/Audery/LBM/ln_solver/bs/ncep/NCEP1.pres.clim.t42120.grd',
calt='/home/group/Audery/LBM/ln_solver/bs/gt3/grz.t42',
kmo=11 navg=6 ozm=f, osw=f, ousez=t
&end
#这部分是我们刚用.nc转化出来的初始场资料
calt也选中与我们空间分辨率一致的grz.t42文件即可
kmo是初始月份,navg是延续几个月份,osw是否做纬向对称,ousez是否转化为sigmal坐标系。
保存后,在服务器中输入
cd $LNHOME/solver/util
./ncepsbs
这样就在gs和grads中生成了想要的初始资料ncepwin.48-86.t42l20.sy.grd
2.生成Forcing
cd $LNHOME/solver/util 中有SETPAR文件的下面部分是forcing部分
&nmfin cfm='/home/group/Audery/LBM/ln_solver/data/Forcing/frc.t42l20.classic.mat',
cfg='/home/group/Audery/LBM/ln_solver/data/Forcing/frc.t42l20.classic.grd'
fact=1.0,1.0,1.0,1.0,1.0
&end
#生成的强迫文件
&nmvar ovor=f, odiv=f, otmp=t, ops=f, osph=f
#(涡度强迫关闭,散度强迫关闭,温度强迫打开,地表气压强迫关闭,湿度强迫关闭)
&end
&nmhpr khpr=1,
hamp=-1.,
xdil=15.,
ydil=10.,
xcnt=120.,
ycnt=35.
&end
#nmhpr部分是强迫的水平形状:khpr=1/2代表椭圆/水平均匀的强迫,hamp是振幅(单位是-1/day)冷源,
#xdil是纬向范围(就是多少个格点衰减到0),ydil是径向范围,
#xcnt是强迫的中心经度,ycnt是强迫的中心纬度
&nmvpr kvpr=2,
vamp=8,
vdil=20.,
vcnt=0.4
&end
#nmvpr是强迫的垂直廓线:kvpr是垂直廓线的函数
#1.是正弦函数,2是gamma函数,3是上下均匀的
#vamp是垂直廓线的振幅,vdil是膨胀系数(仅在垂直廓线函数设置为gamma函数的时候才生效),
#vcnt是垂直方向上强迫最大值所在的层次。
我这里是模仿一个东亚冬季风的位置,在欧亚大陆做一个冷源,保存后
cd $LNHOME/solver/util
./mkfrcng
这样就在data/forcing中出现了强迫文件
3.开始生成模拟结果
cd $LNHOME/model/sh/tintgr
csh linear-run.test.csh
这样在 ln_solver/data/Output中生成了结果,大概5分钟跑完。
4.把输出的变量集合
4.1把模拟结果输出
当对在ln_solver/data/Output中的输出资料转化为grd文件:
cd $LNHOME/solver/util
./gt2gr
这时会在ln_solver/data/Output中出现48-86win.clim.t42l20.grd,即输出文件的集合。
然后用cdo把.grd文件转化成.nc文件
cd $LNHOME/data/Output
cdo -f nc import_binary 48-86win.clim.t42l20.ctl 48-86win.clim.t42l20.nc
4.2把forcing结果输出可视化
cd $LNHOME/data/Forcing cdo -f nc import_binary frc.t42l20.classic.ctl frc.t42l20.classic.nc
frc.t42l20.classic.ctl代码如下
* sample forcing pattern
DSET ^frc.t42l20.classic.grd
* BYTESWAPPED
OPTIONS SEQUENTIAL YREV
TITLE dumy
UNDEF -999.
OPTIONS big_endian
XDEF 128 LINEAR 0. 2.8125
YDEF 64 LEVELS
-87.8638 -85.0965 -82.3129 -79.5256 -76.7369 -73.9475 -71.1577
-68.3678 -65.5776 -62.7873 -59.9970 -57.2066 -54.4162 -51.6257
-48.8352 -46.0447 -43.2542 -40.4636 -37.6731 -34.8825 -32.0919
-29.3014 -26.5108 -23.7202 -20.9296 -18.1390 -15.3484 -12.5578
-9.76715 -6.97653 -4.18592 -1.39531 1.39531 4.18592 6.97653
9.76715 12.5578 15.3484 18.1390 20.9296 23.7202 26.5108
29.3014 32.0919 34.8825 37.6731 40.4636 43.2542 46.0447
48.8352 51.6257 54.4162 57.2066 59.9970 62.7873 65.5776
68.3678 71.1577 73.9475 76.7369 79.5256 82.3129 85.0965
87.8638
ZDEF 20 LEVELS 1000 950 900 850 700 600 500 400 300 250
200 150 100 70 50 30 20 10 7 5
TDEF 1 LINEAR 15jan0000 1mo
VARS 4
v 20 99 vor. forcing [s**-2]
d 20 99 div. forcing [s**-2]
t 20 99 temp. forcing [K s**-1]
p 1 99 sfc.Ln(Ps) forcing
ENDVARS