修改6S Fortran77 代码,建立查找表
逐像元大气校正,常预先计算查找表(LUT,LookUp Tabel),6S大气辐射传输模式也可以用来计算LUT。但6S源程序输出信息多,且浮点数输出精度低,不利于提取关键信息生成LUT,本文描述了怎样修改6S源码以生成LUT。
首先确定LUT内容要素。
阅读MODIS M?D04 气溶胶产品生成算法文档(NASA相关网页),归纳了以下查找表要素:
- 1) 太阳天顶角观测天顶角太阳方位角观测方位角之差(相对方位角)散射角
- 2) 大气模式
- 3) 气溶胶模式
- 4) 550nm气溶胶光学厚度
- 5) 波段号
- 6) 大气透过率
- 7) atm. intrin. ref.(个人理解,这是大气程辐射换算后的反射率,用于校正计算)
- 8) total sca. (总散射,包括rayleigh散射和气溶胶散射,用于校正计算)
- 9) 表观反射率
- 10) 校正后的地表反射率
- 11) xa xb xc参数(物理意义不明,用于校正计算)
其次,阅读源码,明确LUT各要素在6S源码中的变量名。
6S大气校正计算源码(Excel验证中采用此公式)
rog=rapp/tgasm
rog=(rog-ainr(1,1)/tgasm)/sutott/sdtott
rog=rog/(1.+rog*sast)
xa=pi*sb/xmus/seb/tgasm/sutott/sdtott
xb=srotot/sutott/sdtott/tgasm
xc=sast
由计算源码确定需输出的变量。下面是输出LUT要素的Fortran77代码示例,建议放在源码main.f中stop一句之前。
write(*,*) asol,phi0,avis,phiv,adif,phi,idatm,iaer,v,taer55,
1 iwave,tgasm,ainr(1,1),sutott*sdtott,rapp,rog,xa,xb,xc
- 其中,asol是太阳天顶角,
- phi0是太阳方位角,
- avis是观测天顶角,
- phiv是观测方位角,
- adif是散射角,
- phi是相对方位角,
- idatm是大气模式号,
- iaer是气溶胶模式号,
- v是水平能见度,
- taer55是550nm气溶胶光学厚度,
- iwave表示波段号,
- tgasm表示大气透过率,
- ainr(1,1)是大气本身的反射率(姑且这么理解),
- sutott*sdtott表示总散射,
- rapp是表观反射率,
- rog是校正后的地表反射率,
- xa,xb,xc是校正计算参数。
Fortran77每行长度不能超过80个字符,续前行需在特定位置指明(示例中的iwave前的1即表示续行)。
该示例源码没有指定任何输出样式。浮点数会按默认样式输出,小数点后的位数比较多,精度较好。
挑选一个查找表文件用Excel验证后表明,excel公式计算值与6S输出值之间最大误差小于1E-7。说明方法是可行的。
再次,编译源码,编写Shell脚本:
编译环境:OpenSUSE操作系统 g95编译器,版本未知。
编译命令:g95 *.f -o sixs(在BRDF相关代码处可能有几个warning,本文不涉及BRDF,故暂不修改调试。在Windows下用f77编译,无warning,编译通过)
生成LUT的bash脚本getLUT.sh:
- 最后调用该脚本
1: function LUTCalc(){
2: #{42,44,48,25,27,30}
3: IBand=$1
4: echo "Band ${IBand} is running"
5: for Iref in {0.1,0.5}
6: do
7: fstat=${IBand}"_"${Iref}.res
8: echo "asol,phi0,avis,phiv,adif,phi,idatm,iaer,v,taer55, iwave,tgasm,ainr,tott,rapp,rog,xa,xb,xc" >> ${fstat}
9: for SolarZ in {0,15,30,45,75}
10: do
11: for SolarAz in {0,45,90,135}
12: do
13: for ViewZ in {0,15,30,45,75}
14: do
15: for Iaer in {1,2,3,5,6,7}
16: do
17: for Idatm in {1,2,3,4,5,6}
18: do
19: for IAod in {0.1,0.2,0.5,1.0};
20: do
21: # Run sixs and output
22: ./sixs <<EOF | tail -n 1 >> ${fstat}
23: 0
24: $SolarZ $SolarAz $ViewZ 0 3 15
25: $Idatm
26: $Iaer
27: 0
28: $IAod
29: -0
30: -1000
31: ${IBand}
32: 0
33: 0
34: 0
35: 0.0
36: -$Iref
37: EOF
38: done
39: done
40: done
41: done
42: done
43: done
44: done
45: }
46: function getLUT()
47: {
48: echo "LUT is Calcing"
49: for iwave in {42,44,48,25,27,30}
50: {
51: LUTCalc ${iwave}
52: } &
53: }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
>source getLUT.sh
>getLUT
最好晚上计算早晨看结果,如果CPU给力的话,几个小时后就可以得到结果。
下面是生成的LUT示例:
- asol,phi0,avis,phiv,adif,phi,idatm,iaer,v,taer55, iwave,tgasm,ainr,tott,rapp,rog,xa,xb,xc
- 0.0000000 0.0000000 0.0000000 0.0000000 180.00000 0.0000000 1 1 63.664398 0.10000000 25 0.98984975 6.89081103E-02 0.80637234 0.10000000 3.87301818E-02 1.98730151E-03 8.71319696E-02 0.14777245
- 0.0000000 0.0000000 0.0000000 0.0000000 180.00000 0.0000000 1 1 26.739149 0.20000000 25 0.98984975 7.75793791E-02 0.76532620 0.10000000 2.94530466E-02 2.09388486E-03 0.10336593 0.16389242
- 0.0000000 0.0000000 0.0000000 0.0000000 180.00000 0.0000000 1 1 8.4940033 0.50000000 25 0.98984975 0.10173188 0.64870018 0.10000000 -2.69861287E-03 2.47033220E-03 0.15994170 0.20088956
- 0.0000000 0.0000000 0.0000000 0.0000000 180.00000 0.0000000 1 1 3.5674956 1.0000000 25 0.98984975 0.13688390 0.48083964 0.10000000 -7.89646432E-02 3.33272247E-03 0.29038188 0.24035060
- ……
修改6S Fortran77 代码,建立查找表的更多相关文章
- Quarter square 查找表乘法器,手动建立rom
建立一个C的范围为0~255,内容是(C)2/4的查表 占用256个存储空间,但可以计算出+-127的两个数之积.传统算法需要至少127×127个存储空间. 查找表模块的建立: module lut_ ...
- 算法与数据结构(九) 查找表的顺序查找、折半查找、插值查找以及Fibonacci查找
今天这篇博客就聊聊几种常见的查找算法,当然本篇博客只是涉及了部分查找算法,接下来的几篇博客中都将会介绍关于查找的相关内容.本篇博客主要介绍查找表的顺序查找.折半查找.插值查找以及Fibonacci查找 ...
- OpenCV从入门到放弃系列之——如何扫描图像、利用查找表和计时
目的 如何遍历图像中的每一个像素? OpenCV的矩阵值是如何存储的? 如何测试我们所实现算法的性能? 查找表是什么?为什么要用它? 测试用例 颜色空间缩减.具体做法就是:将现有颜色空间值除以某个输入 ...
- OpenCV学习笔记:如何扫描图像、利用查找表和计时
目的 我们将探索以下问题的答案: 如何遍历图像中的每一个像素? OpenCV的矩阵值是如何存储的? 如何测试我们所实现算法的性能? 查找表是什么?为什么要用它? 测试用例 这里我们测试的,是一种简单的 ...
- 利用Xilinx中的ROM构造查找表来计算sin和cos的方法探讨
1.使用matlab制作.coe文件 查找表的构造 构造256点的正余弦表 exp(-j*2*pi*(0:255)/256),分别得到 cos和sin的查找表 matlab代码: 求sin fid = ...
- 修改一行SQL代码 性能提升了N倍
在PostgreSQL中修改了一行不明显的代码,把(ANY(ARRAY[...]) 改成 ANY(VALUES(...))),结果查询时间从20s变为0.2s.最初我们学习使用EXPLAN ANALY ...
- 【C/C++】查找(一):静态查找表
{静态查找表 + 动态查找表} 所谓动态,就是,找的时候没有则添加,或者能删除 关键字:primary key:用来表示查找表中的一条记录 {主关键字 + 次关键字} 主关键字是唯一的,用来唯一的标识 ...
- 查找->动态查找表->二叉排序树
文字描述 二叉排序树的定义 又称二叉查找树,英文名为Binary Sort Tree, 简称BST.它是这样一棵树:或者是一棵空树:或者是具有下列性质的二叉树:(1)若它的左子树不空,则左子树上所有结 ...
- 修改一行SQL代码 性能提升了100倍
在PostgreSQL中修改了一行不明显的代码,把(ANY(ARRAY[...]) 改成 ANY(VALUES(...))),结果查询时间从20s变为0.2s.最初我们学习使用 EXPLAN ANAL ...
随机推荐
- 一把刀系统维护工具箱 v1.6 绿色版
软件名称: 一把刀系统维护工具箱 软件语言: 简体中文 授权方式: 免费软件 运行环境: Win8 / Win7 / Vista / WinXP 软件大小: 13.7MB 图片预览: 软件简介: 一把 ...
- iOS https plist
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key ...
- JavaScript 构造函数 prototype属性和_proto_和原型链 constructor属性 apply(),call()和bind() 关键字this
1.构造函数: 通常构造函数首字母需要大写,主要是为了区别ECMAScript的其它函数.(高程三 P145) 构造函数与其他函数的唯一区别,就在于调用它们的方式不同.只要通过new来调用,任何函数都 ...
- 《JavaScript高级程序设计》读书笔记 ---基本类型和引用类型的值
变量.作用域和内存问题 基本类型和引用类型的值ECMAScript 变量可能包含两种不同数据类型的值:基本类型值和引用类型值.基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象.在 ...
- Sping3.0版本+Quartz完成定时任务
----------------------不使用注解在XML中配置完成定时任务---------------------- 1.需要导入的jar包 2.编写我们的定时任务的完成类 3.在Spring ...
- shell中的cat和文件分界符(<<EOF)
在shell中,文件分界符(通常写成EOF,你也可以写成FOE或者其他任何字符串)紧跟在<<符号后,意思是分界符后的内容将被当做标准输入传给<<前面的命令,直到再次在独立的一行 ...
- MFC连接Access讲解(3合1) .
方法一: 1.首先,要用#import语句来引用支持ADO的组件类型库(*.tlb),其中类型库可以作为可执行程序(DLL.EXE等)的一部分被定位在其自身程序中的附属资源里,如:被定位在msado1 ...
- 《JS权威指南学习总结--3.8类型转换》
JS数据类型转换方法主要有三种: 转换函数.强制类型转换.利用js变量弱类型转换. 一.转换函数 parseInt()和parseFloat()两个转换函数. ...
- SharePoint2013 Set Value To PeoplePicker
var columnName = 'Display Name';var userName = 'domain\\name';var searchText = RegExp("FieldNam ...
- AIR使用文件对象操作文件和目录
文件对象是啥?文件对象(File对象)是在文件系统中指向文件或目录的指针.由于安全原因,只在AIR中可用. 文件对象能做啥? 获取特定目录,包括用户目录.用户文档目录.该应用程序启动的目录和程序目录 ...