上一期的链接:
ARTS Microwave 数据库 及其 python Interface 的简介(一)
二 ARTS 数据库的 Python Interface
2.1 Python Interface 环境搭建
如果要完整的使用所有的 Python Interface 的功能, 需要安装 python>=3.5 环境下的 netcdf4/numpy/typhon/scipy包(os包应该是python自带的), 这几个库包是可以通过conda 命令直接安装的(当然typhon也推荐手动编译安装)
$ conda install netcdf4 numpy typhon scipy
但是最后一个SHTns这个Fortran库比较特殊, 不能直接通过conda包管理机制安装,需要手动编译安装, SHTns库的作用是把球谐函数(勒让德函数系数存储形式的角函数转化为显式的角度函数)这个fortran库的安装需要依赖快速傅里叶变换库FFTW。
FFTW库有两种安装方式, 一种是手动编译安装, 安装时不要忘记打开一个Flag --enable-share, 否则的话只会生成静态库不会生成动态链接库,SHTns编译时无法链接上。
另一种更简单的方法则是直接使用Ubuntu自带的库包管理工具:
$ sudo apt-get install libfftw3-dev
安装完FFW3后编译SHTns Fortran 库:
笔者把 SHTns 直接安装在conda 环境包目录下
$ ./configure --enable-openmp --enable-python
$ make
$ make install
$ python setup.py install --user
--enable-python 这个Flag 表示安装后能被当前的python环境所识别,集成到当前的python环境下可以被直接调用, 最后还需要用setup.py 安装为当前用户安装
以上环境配置好后就可以使用Python Interface了, Python Interface只是一个工具集, 不需要安装, 当然为了方便也可以为这个包配置一个环境变量方便引用, 更加常用的做法则是直接把这些小工具放到你的python工程里。
2.2 Python Interface 工具集
准确地来说小工具只有4个文件 分别是目录下的 assp/rttov/sph/utils , demo_ssp4arts.py 是一个使用这4个工具文件地示例程序, sph这个文件我们暂时还用不到是有关球谐函数的转化,未来ARTS数据库更新了 Azimuthally random 的数据后或许会用到, 我们现在主要关注assp/rttov/utils 这些文件。
思来想去还是一张图最能说明整个ARTS database 文件I/O关系网
稍微注明几点, 剩下的各位自己对照着这张文件I/O总结图去看python源代码就能看懂了:
MATLAB 的API基本和python的命名,功能相似, 只是目前有些功能还没有用 MATLAB 实现, 目前python依旧是最好用的database Interface, MATLAB的一些函数工具集和python同名, 就不在图上一一列出了
-
Create Mix 可以实现把大粒子和小粒子混合生成新的RSSP, 需要输入不同粒子size下两种粒子的权重, 以及两个粒子的S(single scattering property),M(metadata)。 Fullset 中就有6个预置的混合粒子: 具体参考 StandardHabits 中的Readme 文件
assp 的含义是 ARTS single scattering property, rssp 的含义是 rttov single scattering property, RTTOV只需要 single scattering albedo, extinction, asymmetry这些衍生量, 不需要完整的 Stokes 向量, 因此生成的.rssp 文件比原始的数据库文件小很多
可以使用assp的 assp_import_ssdb , 也可以使用 rttov.py中封装好的插值和输入函数 rttov.get_assp, 比较方便, 同时还可以获取 mD list
好了, 就介绍到这里,想要知道更加详细的读者就去审计源码, 不过知道上面这些基本够用
贴出来一个自己写的例程:rssp_test.py
生成自己需要的.rssp, 然后放到rttov12的artsdb文件夹下, 修改arts_mod.F90文件,加上自己的rssp文件, 重新编译RTTOV12, 就可以使用自己定制的粒子散射文件生成Mietable啦!
SSDBpath = ...
outpath = ...
filename = 'myrssp.rssp'
habID = 1 # habit ID
orient = 'totally_random' # orientation
minD = 0. # minimum size to extract
maxD = float("inf") # maximum size to extract
sizeparam = 'dmax' # size parameter to apply extraction limits on.
# available (param [unit]): 'dmax' [m], 'dveq' [m], 'mass' [kg]
fmin = 0. # minimum frequency to extract [Hz]
fmax = float("inf") # maximum frequency to extract
tmin = 0. # minimum temperature to extract [K]
tmax = float("inf") # maximum temperature to extract
try:
import utils
import assp
import rttov
except ImportError:
#try import of Python interface package from current location (by inserting
# current location at start of sys.path)
# (ie see, whether we are inside a DataInterfaces folder)
#implicitly also imports (with lower priority) if Python interface package is
# a subfolder to any of the other PYTHONPATH entries.
try:
import os.path
os.path.sys.path.insert(0,'')
from Python import utils
from Python import assp
from Python import rttov
except ImportError:
#finally, try DataInterfaces folder in SSDBpath
db_interface_path = os.path.join(os.path.dirname(SSDBpath),'DataInterfaces')
#if os.path.isdir(db_interface_path):
os.path.sys.path.append(db_interface_path)
try:
from Python import utils
from Python import assp
from Python import rttov
except ImportError:
raise Exception(\
'Script requires utils and assp from the SSDB python interface,\n' + \
'but import failed.\n' + \
'Maybe you are neither in the SSDB DataInterfaces folder\n' + \
'nor in its Python subfolder nor have added the folder to your PYTHONPATH?' )
except Exception as e:
print('Script requires utils and assp from the SSDB python interface,\n' + \
'but import failed with following error message:\n' + \
' %s%\n' %str(e))
# Init database
utils.ssdb_init( SSDBpath )
# Import data, with some cropping in size and freq
S,M,mD = rttov.get_assp( habID, orient, allow_nodata=False,
size_range=[minD, maxD], size_type=sizeparam,
freq_range=[fmin, fmax],
temp_range=[tmin, tmax] )
rssp = rttov.calc_rssp(S, M, mD)
rttov.write_rssp(rssp, filename,outpath)