LibRadtran基础用法
这里主要是对LibRadtran的基础用法进行了批注和翻译,旨在帮助大家更好地使用LibRadtran。由于翻译水平有限,欢迎指正。阅读原文可以去 libRadtran basic usage页面。
一、基础用法
不熟悉libRadtran前身(uvspec)的用户请注意以下几点:该软件包的核心程序是一个名为uvspec的可执行文件,可在bin目录中找到。如果您对用户友好型的辐射传输计算程序感兴趣,uvspec就是您需要熟悉的软件。手册第一部分对uvspec进行了介绍。在examples目录中提供了使用示例,包括不同大气条件下的各种输入文件和相应的输出文件。要快速试用uvspec,请进入examples目录并运行:
../bin/uvspec < UVSPEC_CLEAR.INP > test.out
注释:在libRadtran安装文件下的bin文件夹中找到一个叫做uvspec的可执行程序。然后,它使用一个名为UVSPEC_CLEAR.INP的输入文件来提供程序所需的输入。程序执行时,它的输出将被重定向到一个名为test.out的文件中。
部分输出结果:
输入和输出文件的格式请参考用户手册。
在bin目录还提供其他实用程序,例如mie程序(mie),一些用于计算太阳位置的实用程序(zenith、noon、sza2time),一些用于插值、卷积和积分的工具(spline、conv、integrate)以及其他一些小工具。
二、建立输入文件
在为特定问题设置输入文件时,需要考虑几个步骤。首先,强烈建议阅读辐射传输教科书,以熟悉问题所需的知识。确定问题后,原则上可以在手册中找到用于设置输入文件并理解输出文件内容的所有信息(但谁会阅读手册呢?)。以下是一个简短的清单,包括针对每个问题需要考虑的步骤:
2.1 波长网格/波段参数化
首先,需要考虑计算所需的光谱范围和光谱分辨率。默认情况下使用 REPTRAN吸收参数,它适用于从紫外到远红外的整个光谱范围。在紫外或低可见光谱范围内,分子吸收随波长的变化而平稳变化,0.5或1 nm步长的计算就足够了。然而,在500 nm以上,水蒸气、氧气和其他痕量气体的吸收开始出现;这些吸收线非常窄,对于大多数应用来说,解决所有吸收线的光谱计算是不可行的(不过,如果提供自己的光谱吸收截面,这种line-by-line的计算是可行的)。对于大多数应用而言,必须使用分子吸收参数(parameterization for molecular absorption),例如默认使用的代表性波长参数,如 mol_abs_param reptran
,它允许进行伪光谱计算(pseudo-spectral calculations)(意味着你仍然可以计算任何你想要的波长的辐射,但气体吸收只提供有限的分辨率-如果你选择的波长太接近,你会在光谱中看到步进效应)。对于光谱或伪光谱计算,可以使用 wavelength_grid_file
定义自己的波长网格,否则你将得到默认的1 nm步长。最后,为了计算积分的短波或长波辐射,请选择预定义的相关k分布之一,例如mol_abs_param kato2
或mol_abs_param fu
,因为它们不仅更准确,而且比伪光谱计算更快。请阅读手册中的相应部分,以熟悉mol_abs_param选项。
2.2 辐射物理量
接下来需要考虑的一点是所需的辐射量。默认情况下,uvspec提供地表的直接、漫射下行和漫射上行太阳辐照度以及光化通量(以上为太阳辐射)。热量(通常是指地表或大气中的热辐射,即地表或大气向外辐射的红外辐射,太阳辐射主要是可见光和紫外光,而热辐射主要是红外辐射)可以使用source thermal
进行计算。请注意,uvspec目前要么进行太阳辐射计算,要么进行热辐射计算,而不能同时进行。如果需要两者的组合(例如,用于围绕3 μm进行的计算),那么需要两次调用uvspec。如果希望计算辐亮度(radiance),而不仅仅是辐照度,只需定义umu
、phi
和phi0
即可(请参阅下一节)。
2.3 观测几何
观测几何包括太阳的位置,其用太阳天顶角(solar zenith angle,简称sza)和方位角(azimuth,简称phi,希腊字母phi (φ)被广泛用于表示角度,尤其是在天文学和地球物理学等领域)来定义。方位角仅在辐亮度计算中需要。请注意,不仅太阳天顶角,而且一年中日地距离在不同季节可能会变化,这可以通过使用day_of_year
(或者可以使用latitude
、longitude
和time
)来考虑。位置的海拔高度可以用altitude
来定义,这将相应地修改气象资料。在不同于地表的位置计算辐射可以使用zout
(z-coordinate of the output,表示输出结果的z坐标,即垂直方向上的坐标或高度信息),它给出了传感器离地面的高度。对于卫星,使用zout TOA
(大气顶部)。对于辐亮度计算,要定义观测天顶角的余弦值umu
和传感器方位角phi
,不要忘记指定太阳方位角phi0
。umu > 0表示传感器向下看(例如,卫星),umu < 0表示向上看。phi = phi0表示传感器朝着太阳的方向,phi-phi0 = 180°表示太阳在传感器的背后。
2.4 大气参数设置
定义大气需要至少一个atmosphere_file
,通常包含压力、温度、空气密度廓线以及臭氧、氧气、水蒸气、二氧化碳和二氧化氮的浓度。LibRadtran提供的六个标准大气通常是一个良好的初始设置:afglms
(中纬度夏季,mid-latitude summer)、afglmw
(中纬度冬季,mid-latitude winter)、afglss
(亚北极夏季,sub-arctic summer)、afglsw
(亚北极冬季,sub-arctic winter)、afglt
(热带,tropical)和afglus
(美国标准,U.S. standard)。"afgl"可能是指空军气象学实验室(Air Force Geophysics Laboratory,AFGL)。如果你没有定义其他任何东西,你将得到一个包含瑞利散射和分子吸收的大气,但没有云和气溶胶。
2.4.1 痕量气体
痕量气体已经存在,如上所述。但有时你可能想要修改其含量。有多种选项可以实现这一点,例如mol_modify O3
,用于修改臭氧柱,或 mixing_ratio CO2
。
2.4.2 气溶胶
如果你想要气溶胶,请打开aerosol_default
,并使用默认的气溶胶或者众多的aerosol_
选项之一来设置你需要的内容。
2.4.3 云
Uvspec可以使用水和冰云。通过wc_file
和ic_file
定义它们,并使用wc_
或ic_
选项之一来定义你所需的内容。请注意,对于水和冰云,你还可以选择不同的参数化方式,例如ic_properties fu、yang、baum
等,这些用于将液/冰水含量(liquid/ice water content)和液滴/颗粒半径转化为光学特性。你需要一些云的经验来定义合理的参数。以下是两个典型选择。三列分别为水平高度z [km],液水含量LWC [g/m3],有效液滴半径Reff [um]。
第一个是水云,其具有在1到2公里高度范围内的有效液滴半径为10 μm和光学厚度约为15;第二个是冰云,其在9到10公里高度范围内的有效颗粒半径为20 μm和光学厚度约为1。
2.4.4 地表特性
默认情况下,地表反照率为0(地表吸收所有辐射)。定义你自己的单色albedo
、光谱albedo_file
、BRDF
等。例如对于主要由风速确定的水面cox_and_munk_u10
。
2.5 辐射传输方程(rte)求解器
辐射传输求解器(rte-solver)是任何辐射传输代码的引擎或核心。所有辐射传输求解器都涉及对辐射传输方程的一些近似,或者由于求解方法的计算需求而导致解的不确定性。选择辐射传输求解器取决于问题是什么。例如,如果你的计算涉及低的太阳位置,你不应该使用平面平行求解器,而是应该选择某种考虑地球球形形状的求解器。在uvspec中,可以在许多光传输求解器中进行选择。默认的辐射传输求解方法是离散坐标求解器disort
,这是大多数应用的首选方法。还有其他求解器,如rte_solver twostr
(更快但不太准确)、rte_solver mystic
和mc_polarisation
(包括偏振),或者rte_solver disort
和pseudospherical
以获取伪球几何。
2.6 后处理
输出的光谱网格是由外太空光谱定义的。如果你想要光谱积分的结果,可以使correlated_k kato2/fu
并使用output_process sum
,或者使用correlated_k lowtran
并使用output_process integrate
。还可以检查其他选项,如filter_function_file
,output_quantity brightness
等。如果你不想要经过校准的光谱量,也可以选择output_quantity transmittance
或output_quantity reflectivity
。
2.7 检查输入文件
最后但同样重要的是,始终确保uvspec确实按照你的期望执行!一个好的方法是使用verbose
选项(生成详细输出,有助于检查计算的各个方面),它会产生大量输出。为了减少输出量,最好只进行单色光谱的计算。在verbose输出的接近末尾,你将找到光学特性的廓线(光学厚度、不对称参数、单次散射反照率),这可以让你相当清楚地了解你定义的云是否存在,气溶胶在哪里等等。作为一般规则,永远不要信任你的输入,而是要进行检查、尝试和改进。
注意:使用MYSTIC需要考虑光子数量对噪声的影响,是否需要偏振计算,需要前向还是后向模式计算;考虑太阳角度与求解器的选择。
三、使用MYSTIC运行
在低太阳角度的时候,最好不要使用伪球面近似的disort求解器,而应该使用mysitc这种完全球面的求解器。此外mystic还可以进行偏振计算
用于在多云大气中物理正确地跟踪光子的蒙特卡洛代码(MYSTIC)在本质上与其他求解器有根本的区别,它通过对个别光子进行随机跟踪来确定结果。有关该技术的简单描述,请参阅Mayer(2009)的论文和此处列出的其他论文。接下来,将展示如何尝试并探索MYSTIC。
首先,尝试一个简单的uvspec输入文件(可以使用vim编辑器在examples目录下定义):
atmosphere_file ../data/atmmod/afglus.dat # 美国标准大气
source solar ../data/solar_flux/atlas_plus_modtran # 地外光谱
wavelength 450
在此示例中,使用默认解算器(disort),并且uvspec将提供熟悉的输出,例如:
如果你重复模拟,你会一遍又一遍地得到相同的结果。现在让我们通过简单地添加来尝试MYSTIC
rte_solver mystic
添加到上述输入并运行uvspec 10次。可以创建bash脚本进行多次调用uvspec。
步骤 | 操作 |
---|---|
1. 创建脚本文件 | 使用nano编辑器在examples目录下新建bash脚本:nano run_mysitc.sh |
2. 编辑脚本文件 | 如下 |
3. 保存并退出 | 在nano编辑器中,按下Ctrl+X,然后按下Y以确认保存,最后按下Enter退出编辑器。 |
4. 赋予脚本执行权限 | chmod +x run_mystic.sh,1) chmod 是一个用于修改文件权限的命令,其名称来源于 “change mode”;2) +x:表示给文件添加执行权限。+x中的+表示添加,而x表示执行权限。 |
5.运行脚本 | ./run_musitc.sh |
脚本文件:
#!/bin/bash
# point out filename of output file
# output_file = "/home/yzy/Lib_Output/test.out"
# run uvspec for 10 times
for ((i=1; i<=10; i++))
do
echo "Running uvspec - Run $i"
../bin/uvspec < MYSTIC_TEXT.INP >> /home/yzy/Lib_Output/test.out
# >>输出重定向符号,将输出追加到指定文件的末尾
done
echo "UVSpec runs completed."
你可能会得到:
我的输出:
结果接近于disort,但每次运行uvspec时显然是不同的,这种差异是由光子噪声引起的。你可以通过计算10个独立结果的标准差来计算噪声。对于直接辐照度(第二列),我们得到了1676.7±20.0,对于漫射下行辐照度为199.4±14.6。在大多数情况下,噪声呈正态分布,这意味着模型运行的68%位于±1个标准差内,95%位于±2个标准差内。通过这种方式,你可以始终确定结果的统计噪声。噪声当然取决于模拟中运行的光子数量。尝试增加光子数量到100000(在上述例子中默认值为1000),通过在输入文件中添加:
mc_photons 100000
现在我们对输入文件进行了修改,直接辐照度为1671.1±2.4,漫射辐照度为203.8±1.9。噪声大约减少了10倍。实际上,噪声与1 / sqrt(mc_photons)成正比,这意味着如果你想将噪声减少10倍,就需要将光子数量增加100倍,从而将计算时间增加100倍。请注意,在两次计算中,disort的结果均在±2个标准差范围内。
现在,让我们试试更复杂的方法: 使用以下输入文件计算热辐照度积分(integrated thermal irradiance):
atmosphere_file ../data/atmmod/afglus.dat
# 设置光源类型为热辐射源,表明模拟的辐射场是地球或其他热体的辐射
source thermal
# 指定分子吸收参数模型为fu
mol_abs_param fu
# 设置波长索引的范围,即模拟的光谱范围。在这里,设置为从第7个波长到第18个波长
wavelength_index 7 18
# 指定输出处理方式为求和,即将模拟结果中的各个波长的辐射值相加得到总的输出
output_process sum
rte_solver mystic
# 设置蒙特卡洛模拟中光子的数量为100000.蒙特卡洛方法是一种随机模拟的数值计算方法
# 用于模拟辐射传输中的光子行为。增加光子数量通常可以提高模拟的准确性,但也会增加计算时间
mc_photons 100000
对于漫射下行辐照度,得到了267.7±27.6 W/m2(这里应该也是10次的计算结果),噪声太大,不够理想。当你阅读上述提到的文献时,你会发现热辐照度应该更适合在backward
模式下计算。在输入文件中添加 mc_backward
并重新进行计算。你将得到类似283.3±0.5 W/m2的结果。噪声和计算时间都显著减少。相应的disort结果为283.6 W/m2,而disort的计算时间仅比MYSTIC 快了3倍。请注意,在“backward”模式下,一次只计算一个量。默认计算的是漫射下行辐照度。如果您需要向上漫射,请尝试mc_backward_output eup
。
现在,用下面的输入文件试试辐射亮度:
atmosphere_file ../data/atmmod/afglus.dat
source solar ../data/solar_flux/atlas_plus_modtran
wavelength 400
sza 45
rte_solver mystic
mc_photons 100000
umu -1 # 观测天顶角的余弦值,umu < 0传感器向上看
phi 0 # 传感器方位角
在这里,从地表直接向上观测蓝光(400 nm)。使用默认求解器disort,你可以直接从标准输出获取结果,而MYSTIC不会在那里提供辐亮度。结果存储在mc.rad.spc文件中(详见文档)。在这里,我们得到了56.68±0.18的辐亮度。相应的disort结果为56.53 -两者再次在±2个标准差内达成一致。
现在来点特别的:尝试计算多个方向的辐亮度,将umu
替换为umu -1.0 -0.9 -0.8
。你会注意到MYSTIC只计算了第一个umu值。与disort不同,每个角度对(umu,phi)必须单独计算,这就是为什么没有实现一次计算多个角度的选项。
到目前为止,只计算了一些也可以使用disort计算的东西-通常更快且无噪声。现在尝试一些disort无法完成的任务。试试以下操作:
atmosphere_file ../data/atmmod/afglus.dat
source solar ../data/solar_flux/atlas_plus_modtran
wavelength 400
sza 88
正如你所知,disort中的平行平面近似对于低太阳角度(这里是:SZA 88度)并不十分精确。使用默认求解器,得到了漫射下行辐照度为22.01。使用伪球面版本的disort
调用参数pseudospherical
。相反,我们得到 34.72,这是相当不同的。现在将以下内容添加到输入文件中:
rte_solver mystic
mc_spherical 1D
mc_photons 100000
为了获得34.47±0.36的结果,使用了伪球面版本的 disort。MYSTIC包括一个完全球面的求解器,通过mc_spherical参数调用。在这里,MYSTIC和disort的结果相差超过2个标准差。重复实验,并将光子数增加到100000,以获得34.50±0.09的结果。实际上,结果是有差异的。**在这种情况下,你应该更信任MYSTIC,因为MYSTIC是一个完全球面的求解器,没有近似,而伪球面近似显然是一个近似。**现在让我们尝试一个真正的球面情况:
使用sza 96
而不是sza 88
。96°是航海黎明的开始(在航海黎明期间,船员可以对着熟知的星星进行可靠的星象观测)。对于如此低的太阳角度,不应再信任伪球面近似,但球面MYSTIC提供了可靠的结果为0.091±0.006(在这种情况下,伪球面disort的结果为0.058,仍然在正确的数量级,但伪球面近似在特定情况下可能提供完全荒谬的结果)。
使用球面MYSTIC,你可以安全地计算在0到180度之间的任何太阳天顶角下的辐亮度和辐照度。此外,对于低视角的辐亮度计算是正确的,而这些在平行平面或伪球面近似中处理不正确。请注意,球面MYSTIC会自动激活“backward”模式。如果你需要的不仅仅是漫射下行辐照度,请使用mc_backward_output
。
MYSTIC还包括一个完全矢量化(偏振相关)求解器。尝试:
atmosphere_file ../data/atmmod/afglus.dat
source solar ../data/solar_flux/atlas_plus_modtran
wavelength 300
sza 30
rte_solver mystic
mc_photons 1000000
获得漫射下行辐照度为1.224±0.002(disort:1.224)。现在添加:
mc_polarisation
获得1.234±0.002,比原来高出 1%。根据Mishchenko等人(1994)的研究,忽略偏振可能会导致辐亮度高达10%的误差,而辐照度的误差可能要小得多,正如这个例子所示。然而,矢量化的MYSTIC的真正优点在于可以计算完整的Stokes矢量,这对于一些现代遥感仪器如POLDER、PARASOL、GOSAT等是必需的。只需添加:
umu -1
phi 0
到上述的例子并检查mc.rad.spc:
300.00000 0 0 0 0.433473
300.00000 0 0 0 -0.0461689
300.00000 0 0 0 -0.000196948
300.00000 0 0 0 0
这些是所选波长和几何形状的斯托克斯矢量 (I、Q、U、V) 的四个分量。
这些示例应该足够让你开始使用MYSTIC了。很明显,所需的光子数量(因此计算时间)强烈依赖于具体问题。此外,有些问题在“forward”模式下更容易解决,而有些问题(例如热辐射)最好在“backward”模式下完成。气溶胶、水云,尤其是冰云的强烈峰值散射相函数可能会导致尖峰,通过启用mc_vroom
可以去除。
需要注意的是,所有这些开关只会影响噪声,而不会影响绝对值,因为 MYSTIC 的定义是 “物理正确”。唯一的例外是:
mc_delta_scaling
这将截断相函数,并可能带来一些系统不确定性。通常不需要这样做 - 使用mc_vroom
替代。如果您计划在工作中使用 MYSTIC,请务必熟悉各种选项并查阅上述文献!
四、注释
- 步进效应(steps in your spectrum):在这个语境下,步进效应指的是光谱中某些波长处出现的不连续、突兀的变化,就像是光谱上的一级一级的小台阶一样。这就好比你在走楼梯时,每一步都是一个独立的台阶,而不是一个平滑的坡道。
- 直接太阳辐照度(direct solar irradiance): 这是指来自太阳的直接光线,就好像太阳直接照射在一个地方一样。比如,你站在阳光下,感受到的那种直射的光就是直接太阳辐照度。
- 漫射下行太阳辐照度(diffuse downward solar irradiance):这是指来自太阳的光线,经过大气散射后以各个方向散布在地表。如果你站在树荫下,感受到的那种从各个方向来的光就是漫射下行太阳辐照度。
- 漫射上行太阳辐照度(diffuse upward solar irradiance):这是指地表向上反射的太阳光线,同样经过大气散射。想象一下太阳光照在地面,一部分被地面反射向上的光就是漫射上行太阳辐照度。
- 光化通量(actinic flux):这是指能够引起化学反应的光子流量,通常指的是与光化学反应相关的光的能量。例如,对于大气中的化学反应,光化通量就是那些能引起这些反应的光子的流量。
- zout:z-coordinate of the output,表示输出结果的 z 坐标,即垂直方向上的坐标或高度信息。在辐射传输模型中,“zout” 通常用于指定观测点或传感器相对于地表的高度。这个高度信息对于模拟大气中辐射的传播过程是关键的,因为大气的性质随着高度的变化而变化。
- Integrated thermal irradiance:可以理解为对热辐照度进行积分,即计算在一定范围内的热辐射总量。