写在前边的话
安装RTTOV这条路是真的不容易啊,一不小心全是坑!为此我还请教了我的二导,导师手把手地教我,让我感激涕零,在此要特别感谢我的二导!!鞠躬!再次被二导的学识渊博所折服!我一定会好好跟着您学习的!!!
现在RTTOV大气快速辐射模型的安装,没有太多中文教程,就连uesrguide全部都是英文的。。。所以为了能让后来者少走一点弯路,也为了完成“想为人类科学进步贡献自己一份力量”的小目标##哈哈哈哈,所以我将自己安装RTTOV的心得分享出来,由于这是本人第一次在CSDN博客里发一些自己的使用日记文章等(太惭愧了,第一篇博客竟然是篇教程),排版什么的还不太会使用,所以要是你看到错别字什么的也不要大惊小怪啊哈!那么接下来我们就开始安装RTTOV这个坑吧!
本文主要参考在简书里发布的一篇文章RTTOV12.2 (Radiative Transfer for TOVS) 研究环境搭建(一)on WSL Ubuntu LTS 18.04、RTTOV12.2 (Radiative Transfer for TOVS) 研究环境搭建(二)on WSL Ubuntu LTS 18.04
,但原作者是要搭建主系统(windows)与子系统(linux/ubuntu)的链接,所以第一部分Xming的安装教程可以不用看,或者直接选择看着我这篇教程也是可以的!
RTTOV简介
RTTOV(Radiative Transfer for TOVS)是EUMETSAT (European Organisation for the Exploitation of Meteorological Satellites)旗下的NWP/SAF (Numerical Weather Prediction / Satellite Application Facilities)开发的一款快速辐射传输模式软件包。
RTTOV v12 官网 https://www.nwpsaf.eu/site/software/rttov/rttov-v12/
RTTOV 目前广泛应用于各类数值的同化模块, 主要用于被动探测的卫星的可见光、红外、微波通道的卫星数据的同化。
本人安装RTTOV的目的主要是为了在RTTOV中对传感器的亮温模拟,即输入廓线库与对应传感器的系数文件,拿到相应的每个波段的辐射亮温以及大气透过率(在rttov中对应的是温度、湿度k矩阵)。
而目前RTTOV的安装主要支持的是Unix系统, 目前网上几乎没有现成的预编译版本,安装必须要手动编译。由于其安装依赖的库包关系相对比较复杂。再加上笔者本人对linux系统不够熟悉,自然也就踩了不少的坑,所以特此记录下来,让接下来的小朋友们不要踩这么多坑,希望能够帮到大家。
**需要准备的工具:**一台计算机、linux系统(VM虚拟机下的linux/ubuntu也可!)、一颗善于发现问题并解决问题的小脑袋。
然后我们就开始动手安装吧!let’s go!
等会,我是用的VM虚拟机下的ubuntu系统来安装的,如果你们觉得虚拟机运行起来比较卡顿,那你们可以自己安装一个linux系统,关于VM虚拟机下如何安装ubuntu在这里就不详细讲解了,百度一下,你就知道!笔者这里用的:
虚拟机:VMware-workstation-full-12.1.1-3770994
ubuntu系统型号:ubuntu-16.04.3-desktop-amd64
然后,我们Let’s go!!!
一、基本环境配置
首先,我们要知道,RTTOV是一款快速传输模式,也就是说,这个软件包并不是走传统的物理模型模拟光学厚度的计算方法,整个软件的核心是coefficient文件,也就是通过机器学习生成的回归架构的因子和回归系数(当然学习的样本是通过物理模型计算得到的)在快速传输模式中不需要引入物理模型,只需要用现成的回归模型提取大气廓线的因子,就可以直接通过矩阵运算得到大气的光学厚度。这样的大规模矩阵运算就体现出Fortran的优势了。因此为了保证大规模矩阵运算的效率主要的源码是由Fortran编写的,当然RTTOV也为不熟悉Fortran的使用者提供了python和C++的wrapper。
在这里大家可以参考我之前发的简书里作者的关于ROTTV的教程里的1.2节编译环境的要求,主要安装rttov需要的环境是Fortran 90 compiler(e.g.gfortran)/GNU make utility
不过笔者本人也就只是对RTTOV做一些初步的研究,对运行的速度要求并不是很高,多以就简单安装gcc和gfortran就可以了(其实大部分在RTTOV的编译compile和test测试的时候我都是用的gfortran来运行的),其次不用忘记安装make工具,它的作用是确定编译时各个对象文件的依赖关系,在使用RTTOV时编译自己的Fortran程序也需要用到Make工具,以确定和依赖的RTTOV库、HDF5库、NETCDF库的依赖关系。
$ sudo apt-get install gcc
$ sudo apt-get install gfortran
$ sudo apt-get install g++
$ sudo apt-get install make
二、依赖库的编译和安装
可以从上图中可以看到RTTOV依赖的库有:
1.HDF5库,可以激活RTTOV读取高光谱红外通道系数文件的.H5文件功能,否则只能读取ASCII系数文件,缺点是比较慢,系数文件会比较大。
2.NETCDF库会激活RTTOV的HTRTC功能。
3.如果你想将RTTOV图形化(GUI)显示的话,可以安装 f2py(后面会讲到f2py的安装), 并在Miniconda环境下配置图形界面的python环境, 需要安装几个科学计算和绘图有关的python库,这样可以激活RTTOV的GUI功能。
接下来是这几个库的链接:
1.zlib-1.2.11: http://www.zlib.net/
2.hdf5-1.8.20: https://support.hdfgroup.org/HDF5/
3.netcdf-4.6.1(C/fortran): http://www.unidata.ucar.edu/downloads/netcdf/index.jsp
我这里的库的版本分别是:
1.zlib-1.2.11.tar.gz
2.hdf5-1.8.21.tar.gz
3.netcdf-4.6.1.tar.gz
4.netcdf-fortran-4.4.4.tar.gz
5.rttov122.tar.gz
当然大家完全都可以安装最新版本的这些依赖库,rttov目前为止最新版是V12.3版本(笔者这里目前的时间是2019/11/26),对上边这些库的配置依赖性都是好的,完全放心的安装就可以。
这里就不一一领着大家找安装包了,相信大家都有一定的英文基础。应该是可以找到,RTTOV的话,需要注册账号,自己输入邮箱注册好就可以了,在下载RTTOV12.2的时候,本人下载到80%的时候就不能再继续下载了,我看官网论坛里也有人在反应RTTOV12.2版本的下载问题。由于本人在研究所,所里涉密所以网络不太好,你们如果在大学里的话(我知道中国科大和中国海大的网络是可以的,我就是让我同学帮我下载的),用你们自己学校里的网路接口下载就可以了,在这里还要感谢我在各个高校的同学一直默默的帮我下载一些奇奇怪怪的东西!感恩的心!笔芯!!!
大家最好创建一个目录用来放压缩包和编译中的文件 /usr/package, 把下载的五个压缩包(包括RTTOV12.2)上传到该目录下:
$ sudo mkdir /usr/packge/ #这一步是创建一个文件夹,sudo这个命令会让你输入密码,输密码的时候光标不会动,但是他已经输入进去了,在保证密码输入正确的情况下,按回车就可以了。(要是有人问这个密码是不是开机时登录ubuntu的密码,我虽然很想打你,但我还是想告诉你,是!!!)
$ cd /usr/package #这一步是进入你创建好的文件夹,你也可以关掉当前窗口去找你的空文件夹,在package里打开Terminal
$ sudo chmod o+w ../package # 放开这个文件夹的写权限, 方便接下来编译操作
然后是这样的,如果你是用的linux系统的话,这句话可以跳过!如果你的虚拟机里的ubuntu可以复制粘贴,那你也可以跳过这一部分哒!
如果你是用的虚拟机,且你用windows打开的上述网址,下载好的安装包,这时候有的小伙伴,可能要将windows里的包copy到ubuntu中去,发现在windows中复制了,不能在ubuntu中paste(粘贴)了,这时候你可能需要百度一下,“如何在windows中与虚拟机中进行复制粘贴操作”,笔者这里帮你们找好了,不要太感谢我!!!
这篇比较简单好用:Windows和Ubuntu系统之间文件相互复制粘贴
如果不行试试这个比较麻烦的(反正我没用这个安装成功):实现主机和虚拟机之间的无法直接复制粘贴的问题
好了所有准备工作已经完成了!呼!开始安装吧!
2.1zlib-1.2.11安装
$ tar -zxvf zlib-1.2.11.tar.gz #解压
$ cd zlib-1.2.11/ #进入到你解压之后自动生成的文件夹里
然后是利用 --prefix来进行安装路径的配置,笔者是将其存放到了/usr/local/zlib下,如果你们不放心configure会自动产生文件夹zlib的话,可以直接进入到usr/local文件夹中进行 sudo mkdir zlib,包括后面要安装的hdf5/NETCDF也是一样,可以先建好文件夹!
$ ./configure --prefix=/usr/local/zlib
$ make
$ make check
$ sudo make install
如果上述没有什么error、warning的话,就可以进行下一步。将编译好的二进制动态链接库添加到环境变量中列表中。
$ vim ~/.bashrc
这里笔者又要唠叨几句了,可能你用了这个命令会报错,说你的vim没有安装,会出一些列标,就安装vim就可以了!那你此时应该就安装就好了! sudo apt-get install vim,输入密码就好了。
$ export LD_LIBRARY_PATH=/usr/local/zlib/lib:$LD_LIBRARY_PATH #在最后加入也可,最前边加入也可
这时候有的好奇宝宝可能又要问,怎么插入这段话了,关于利用vim打开的.bashrc怎么来进行编辑,可以上网百度,但我还是想说,在我们这个安装的过程中只需要记住以下几个命令就可以了!
1.i #没错,运行完vim ~/.bashrc之后,直接输入i,就可以对前页面进行增删字符的操作了,左下角就会变成–INSERT–意味着就可以进行写懂了。如下图所示:
2.输入完成之后,i命令之后,不想修改了,按键盘左上角的Esc,退出修改状态。
3.然后按键盘的冒号,输入wq,这时候的bashrc文件就已经保存成功了,wq命令就是保存并退出。然后回到我们的命令操作界面。
然后切记,每次改动完bashrc文件都要source一下,使你刚才的操作生效。
source ~/.bashrc
然后安装完成zlib、配置完成zlib的路径之后,我们退回主界面,也就是桌面界面!再打开一个Terminal,安装一个附属工具zlib*!一定要退回桌面!!一开始笔者安装了好多次rttov失败都是栽在了这里,zlib*怎么也安装不上!!!然后运行完下面的代码之后就可以将这个新打开的Termianl关闭了。
$ sudo apt-get install zlib*
至此我们的zlib安装就完成了!
2.2 hdf5-1.8.21的安装
首先还是:
$ tar -zxvf hdf5-1.8.20.tar.gz
$ cd hdf5-1.8.20
需要额外注意的是:
1.hdf5库需要依赖zlib库编译
2.hdf5库要把C++和fortran的编译器都打开,否则编译出来的库只有c库,之后安装NETCDF和RTTOV会报错显示动态链接库缺失!!
$ ./configure --with-zlib=/usr/local/zlib --prefix=/usr/local/hdf5 FC=gfortran CC=gcc --enable-fortran --enable-cxx
$ make
$ make check
$ sudo make install
这个库的编译可能会有点长,其中会出现几个warning上网百度了下,说是网络原因,可以放着不用管。编译完成后检查一下fortran cpp的动态链接库是不是都装上了。
进入到usr/local/hdf5/lib文件夹中,输入命令 $ ll #小写的L
可以查看是否都将fortran cpp的动态链接库安装上了。
然后安装成功之后进行环境变量的配置,因为后期要配置NETCDF所以,我们必须要进行CPPLAGS、LDFLAGS的连接配置!然后LD_LIBRARY_PATH的最好将zlib也配置进去。
这里一定要注意,简书的作者并没有将这一部分进行说明清楚,如果将zlib也加入到LD_LIBRARY_PATH中,然后再加入hdf5的路径的话,是要在路径后边加上:(冒号的)。如下图
CPP、LDF每次都按照我上边写的那样配置就可以了。
$ gedit ~/.bashrc
$ export CPPFLAGS=-I/usr/local/hdf5/include # 编译完NETCDF-c后注释掉换成新的
$ export LDFLAGS=-L/usr/local/hdf5/lib # 编译完NETCDF-c后注释掉换成新的
$ export LD_LIBRARY_PATH=/usr/local/hdf5/lib
$ source ~/.bashrc
2.3 NETCDF-4.6.1-C的安装
首先还是先将压缩包解压出来:
$ tar -zxvf netcdf-4.6.1.tar.gz
$ cd netcdf-4.6.1
然后先在当前目录的文件夹下安装几个小工具!一定要在当前目录下!不要去其他目录下安装!!!
1.m4小工具的安装,在configure netcdf-c的时候用到的!
$ sudo apt-get install m4
2.curl库的安装
$ sudo apt-get install libcurl4-openssl-dev
注:如果这个命令不可以的话,可以参考这个网址里的命令,来安装curl,英文都很简单,应该可以看懂! https://stackoverflow.com/questions/11471690/curl-h-no-such-file-or-directory
然后继续我们的netcdf的安装:
$ ./configure --prefix=/usr/local/NETCDF --enable-netcdf-4
$ make
$ make check
$ sudo make install
–enable-netcdf-4 表示依赖HDF5和zlib库编译(注:如果该条命令失败的话,可以参考我在简书作者的评论下提供的另一条命令,将作者的“./configure --prefix=/usr/local/NETCDF --enable-netcdf-4”改成./configure --prefix=/usr/local/NETCDF --disable-netcdf-4,不过安装了上面那个curl小工具就是解决这个问题的,应该不会再出现了。)
然后makecheck的时候可能会报错(也可能实在安装NETCDF-fortran的时候makecheck时候出现,具体忘记了。。。嘻嘻),nf_xxx没有通过,请教了我的二导,说是这只是很小的一个编译错误,不会影响到RTTOV的使用,所以就不用管他了。
安装成功后添加环境变量:(这个时候的hdf5配置的CPP、LDF替换为NETCDF)。
$ gedit ~/.bashrc
$ export CPPFLAGS=-I/usr/local/NETCDF/include #编译完NETCDFfortran后注释掉
$ export LDFLAGS=-L/usr/local/NETCDF/lib #编译完NETCDF fortran后注释掉
$ export LD_LIBRARY_PATH=export LD_LIBRARY_PATH=/usr/local/zlib/lib:/usr/local/hdf5/lib:/usr/local/NETCDF/lib: $LD_LIBRARY_PATH
$ source ~/.bashrc
2.3 NETCDF-4.4.4-Fortran的安装
一如既往的压缩,进入。
$ tar -zxvf netcdf-fortran-4.4.4.tar.gz
$ cd netcdf-fortran-4.4.4
FC指定你使用的Fortran编译器
$ $ ./configure --prefix=/usr/local/NETCDF FC=gfortran
$ make
$ make check
$ sudo make install
安装完后确认一下 目标库中有C库和Fortran库
因为Fortran的库的位置和C库位置一样,就不需要重复再添加环境变量了。至此RTTOV的所有依赖库,如果先不安装GUI的话(笔者还在开发中,简书作者安装成功了,大家可以先看着简书的作者的安装教程,但是里面也是有问题的,所以我还在解决中),就全部安装成功了,下面开始安装RTTOV。
2.4 RTTOV的编译安装
由于RTTOV解压后没有顶层文件夹,大家注意一下,先建一个文件夹放置解压后的内容。
$ mkdir rttov12 #最好是放在跟其他安装包一样的路径下
$ tar -zxvf rttov122.tar.gz -C rttov12/
重点关注以下几点:
RTTOV编译有两种方式,一种是依靠build文件夹下的脚本文件 /build/rttov_compile.sh 进行编译,另外一种方式是根据 src/ 目录下的Makefile手动编译,如果是对Makefile不熟悉的小白建议是使用前者
RTTOV支持好多种fortran编译器:要在脚本的ARCH参数中声明,支持的 Fortran 编译器有 gfortran ifortran pgf90 NAG 等, 具体可以在 build/arch 中查看
OpenMP支持的编译器编译出的二进制可执行文件可以有多线程执行功能, 可以大大加快计算效率
部分可选功能:
1.读取HDF5 系数文件需要HDF5库
2.发射率/双向反射率地图支持需要HDF5库
3.python GUI 需要 HDF5库
4.python wrapper / RTTOV GUI 需要 f2py
5.HTFRTC 需要 NetCDF v4
编译前必须根据文件中的注释修改build/Makefile.local文件指定外部依赖库地址,否则编译脚本无法检测到外部依赖库的位置
如果编译要依赖HDF5库,编译HDF5库时必须打开Fortran语言,这在上一期已经提到了
OK,了解之后开始操作吧
2.4.1修改 build/Makefile.local
进入rttov解压之后的rttov12/build中,
$ vim build/Makefile.local #要是进来build中打开Termianl可以去掉build
主要修改HDF5块和NETCDF块以下内容
HDF5_PREFIX = /usr/local/hdf5
FFLAGS_HDF5 = -D_RTTOV_HDF $(FFLAG_MOD)$(HDF5_PREFIX)/include
LDFLAGS_HDF5 = -L$(HDF5_PREFIX)/lib -lhdf5hl_fortran -lhdf5_hl -lhdf5_fortran -lhdf5
NETCDF_PREFIX = /usr/local/NETCDF
FFLAGS_NETCDF = -D_RTTOV_NETCDF -I$(NETCDF_PREFIX)/include
LDFLAGS_NETCDF = -L$(NETCDF_PREFIX)/lib -lnetcdff
按照下图找到相应位置打开这些链接。实质上是指明库的依赖关系, 笔者的NETCDF 版本是4.4, 因此选择 4.2 and later 进行注释。
2.4.2编译RTTOV
修改完成后,按照说明用脚本执行编译, 注意脚本要在src/目录下执行
$ cd src/
$ ../build/rttov_compile.sh
大家可以按照下图中操作来进行对比,在编译过程中需要输入什么东西,哪一步都需要干什么,下图中都有显示。其中要着重说一下图中标红的地方,主要是因为我之前已经安装好了miniconda中的numpy以及matplotlib等安装包,所以他显示我这边是可以编译rttov的gui界面的,但实际上,gui界面有没有不影响我们rttov的编译成功与否的!!!所以这里即使大家的为n也就是为no也没有关系,一样可以编译成功的。
如果你出现如下界面的话,恭喜你安装成功了。
2.4.3测试RTTOV
编译完成后,我们可以使用RTTOV自带的测试模块测试一下RTTOV是否正确地安装了
$ cd rttov_test/
$ ./test_rttov12.sh ARCH=gfortran
测试结果一切正常,就可以说RTTOV的本体已经安装成功了
这个测试的结果保存在目录 rttov_test/test_rttov12.1.gfortran/下,有兴趣的读者可以先大致看看模拟结果
至此,我们所有的安装都已经成功了。
所有踩过的坑,我都替你们踩了一遍。
接下来我会继续聚焦RTTOV的GUI的显示界面的安装。
以及后期会公布一下,我自己的学习rttov的入手情况,包括我需要的输入输出等,再出一期教程。
各位,虽素未谋面,但相信努力一定会有回报的!加油吧!
三、 安装参考网址及相关链接:
https://conda.io/miniconda.html
https://zhuanlan.zhihu.com/p/22678445
http://www.hedilict.com/f2py%E7%9A%84%E9%85%8D%E5%88%B6%E4%B8%8E%E4%BD%BF%E7%94%A8-windows-and-linux-platform/
https://blog.csdn.net/rumswell/article/details/7377339
https://unix.stackexchange.com/questions/186347/error-while-loading-shared-libraries-libgtk-x11-2-0-so-0-cannot-open-shared-o
https://blog.csdn.net/raoweijian/article/details/65661302
https://www.jianshu.com/p/b0d1a39b0c5c
http://bbs.06climate.com/forum.php?mod=viewthread&tid=44072
https://www.unidata.ucar.edu/support/help/MailArchives/netcdf/msg12453.html
https://bbs.csdn.net/topics/392256783
多次提到的简书作者:_宇佐见莲子
其简书链接:
https://www.jianshu.com/p/1c2a771a2eca
https://www.jianshu.com/p/ba81ce2ca81e